--- spamd.raw 2005-06-15 14:36:48.000000000 -0600 +++ spamd.raw.new 2005-06-15 14:36:30.000000000 -0600 @@ -163,6 +163,7 @@ 'port|p=s' => \$opt{'port'}, 'Q' => \$opt{'setuid-with-sql'}, 'q' => \$opt{'sql-config'}, + 'spamc-configs' => \$opt{'spamc_config_dir'}, 'server-cert=s' => \$opt{'server-cert'}, 'server-key=s' => \$opt{'server-key'}, 'setuid-with-ldap' => \$opt{'setuid-with-ldap'}, @@ -493,6 +494,7 @@ my $current_user; +my $spc_user_prefs; # used for prefs location passed from spamc my $client; # used for the client connection ... my $childlimit; # max number of kids allowed my $clients_per_child; # number of clients each child should process @@ -903,6 +905,7 @@ die "error returned from copy_config, no Storable module?\n"; } undef $current_user; + undef $spc_user_prefs; } @@ -1026,7 +1029,8 @@ $hdrs, $client, { 'Content-length' => \&got_clen_header, - 'User' => \&got_user_header + 'User' => \&got_user_header, + 'UserPrefs' => \&got_userprefs_header } ); @@ -1319,6 +1323,52 @@ return 0; } +# +# Handle a static user_prefs location that is passed +# to us from spamc for virtual directories that +# can't be guessed +# +sub got_userprefs_header { + my ( $client, $header, $value ) = @_; + + if ( $value !~ /^([\x20-\xFF]*)$/ ) { + protocol_error("(UserPrefs header contains control chars)"); + return 1; + } + $spc_user_prefs = $1; + if ( $opt{'spamc_config_dir'} ) { + my $safedir = $spc_user_prefs; + $safedir =~ s/\%\%/\%/g; + my $prefsfile = $safedir . '/user_prefs'; + + # Log that a static prefs file location is being used for the user + logmsg("Using static prefs file provided by spamc for $current_user: $prefsfile"); + + if ( -f $prefsfile ) { + # Found a config, Load it. + $spamtest->read_scoreonly_config($prefsfile); + } else { + my $cf_file = $prefsfile; + create_default_cf_if_needed( $cf_file, $current_user ); + $spamtest->read_scoreonly_config($prefsfile); + } + + # Assume that $safedir will be a writable directory we can + # use for AWL, Bayes dbs etc. + # we should sanitize $current_user into something else just + # in case + $spamtest->signal_user_changed( + { + username => $current_user, + userstate_dir => $safedir, + user_dir => $safedir, + } + ); + + } + return 0; +} + sub got_clen_header { my ( $hdrs, $header, $value ) = @_; if ( $value !~ /^(\d*)$/ ) { @@ -1426,7 +1476,7 @@ ); } - else { + elsif ( !$opt{'spamc_config_dir'} ) { create_default_cf_if_needed( $cf_file, $username ); $spamtest->read_scoreonly_config($cf_file); $spamtest->signal_user_changed(