Daniel,

> I'm tuning up my $sql_select_policy in order to improve functionality
> of amavis on my mail server and I'm struggling with something which
> I'd imagine would be simple.  I need to extend this query as follows:
>
> " ... OR alias.goto LIKE ('%RECIPIENT%')"
>
> where RECIPIENT is the individual recipient address for the message
> in question and the % signs are wrapping it in order to treat it as a
> needle in a haystack.  I need the same recipient address which
> appears in the first set of single quotes when the %k macro is
> expanded in the typical policy lookup query (per the various README
> examples)...

Here below is a patch to 2.5.1 to provide a placeholder %a, which
is much like the %k, except that it only expands to the exact mail address,
the same as the first entry provided by the %k expansion.

It will enable you to do what you want, for example:

$sql_select_policy =
"SELECT *,users.id FROM users LEFT JOIN policy ON users.policy_id=policy.id".
  " WHERE users.email IN (%k) OR alias.goto LIKE concat('%', %a, '%')".
  " ORDER BY users.priority DESC";

although I'm not sure if this is really what you want: letting a
world-provided string be interpreted as a SQL pattern looks
like asking for trouble.

Anyway, there may be other legitimate uses of LIKE,
perhaps a:   %a LIKE '[EMAIL PROTECTED]' , so her it is:


--- amavisd.orig        Thu May 31 14:10:01 2007
+++ amavisd     Mon Jun 18 16:07:31 2007
@@ -12088,6 +12088,9 @@
   my(@extras_tmp) = !ref $extra_args ? () : @$extra_args;
   local($1); my(@pos_args); my($sel_taint) = substr($sel,0,0); # taintedness
-  $sel =~ s{ ( %k | \? ) }  # substitute %k for keys and ? for each extra arg
-           { push(@pos_args, $1 eq '%k' ? @$keys_ref : shift @extras_tmp),
+  $sel =~ s{ ( %k | %a | \? ) }  # substitute %k for keys, %a for exact mail
+                                 # address, and ? for each extra arg
+           { push(@pos_args, $1 eq '%k' ? @$keys_ref
+                           : $1 eq '%a' ? $keys_ref->[0]  # same as first in %k
+                           : shift @extras_tmp),
              $1 eq '%k' ? join(',', ('?') x $n) : '?' }gxe;
   $sel = untaint($sel) . $sel_taint;  # keep original clause taintedness


Mark

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
AMaViS-user mailing list
AMaViS-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amavis-user
AMaViS-FAQ:http://www.amavis.org/amavis-faq.php3
AMaViS-HowTos:http://www.amavis.org/howto/

Reply via email to