You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2010/03/02 14:58:19 UTC

svn commit: r918041 - /spamassassin/trunk/spamd/spamd.raw

Author: mmartinec
Date: Tue Mar  2 13:58:19 2010
New Revision: 918041

URL: http://svn.apache.org/viewvc?rev=918041&view=rev
Log:
Bug 6340: Impossible to find user home directory of VPOPMAIL alias

Modified:
    spamassassin/trunk/spamd/spamd.raw

Modified: spamassassin/trunk/spamd/spamd.raw
URL: http://svn.apache.org/viewvc/spamassassin/trunk/spamd/spamd.raw?rev=918041&r1=918040&r2=918041&view=diff
==============================================================================
--- spamassassin/trunk/spamd/spamd.raw (original)
+++ spamassassin/trunk/spamd/spamd.raw Tue Mar  2 13:58:19 2010
@@ -2178,21 +2178,36 @@
 
   $vptimer->run(sub {
     my $vpopusername = $username;
-    local $1;
-    do {
-      my $vpopusername_tainted = `$vpopdir/bin/valias \Q$vpopusername\E`;
+    my @aliases = split(/\n/, `$vpopdir/bin/valias \Q$vpopusername\E`);
+    while (@aliases) {
+      my $vpopusername_tainted = shift(@aliases);
+      local $1;
       if ($vpopusername_tainted =~ /.+ -> &?(.+)/) {
         $vpopusername = untaint_var($1);
-      } else {
-        die "failed to resolve vpopmail user/alias '$username' using vuserinfo/valias";
+        if ($vpopusername =~ s{(/.+)/Maildir/}{$1}) {
+          # this is the path to a real mailbox
+          $userdir = $vpopusername;
+        } elsif ($vpopusername =~ /\@/) {
+          # this is a forward to another e-mail address
+          $vpopusername =~ s{.+ -> (.+)}{$1};
+          $vpopusername_tainted = `$vpopdir/bin/vuserinfo -d \Q$vpopusername\E`;
+          if ($? == 0 && $vpopusername_tainted ne '') {
+            $userdir = untaint_var($vpopusername_tainted);
+          } else {
+            unshift(@aliases,
+                    split(/\n/, `$vpopdir/bin/valias \Q$vpopusername\E`));
+          }
+        }
+        last if defined $userdir;
       }
-    } until (($userdir = `$vpopdir/bin/vuserinfo -d \Q$vpopusername\E`) && $? == 0);
-    $userdir =~ s{.+ -> (/.+)/Maildir/}{$1};
+    }
   });
 
   if ($vptimer->timed_out()) {
+    dbg("spamd: timed out resolving vpopmail user/alias '%s'", $username);
     undef $userdir;
-    die "failed to resolve vpopmail user/alias '$username' in time ($vpoptimeout seconds)";
+  } elsif (!defined($userdir)) {
+    dbg("spamd: failed to resolve vpopmail user/alias '%s'", $username);
   } else {
     chomp($userdir);
   }