On Sun, 2007-02-11 at 15:49 -0500, Matt Kettler wrote:
> Raul Dias wrote:
> > There are some cases, that it is desired to match part a value from a
> > header, to another value somewhere else.
> >
> > Is there a way for SA to retain the value matched in a RE like $1/$2
> > matching parentheses, so that it might be used later (or at least in the
> > next rule)?
> >   
> No, that's where you need to write a plugin.

I am thinking something that a plugin can help but to be used outside
the plugin scope.

For example, lets pretend there is a header X-Remote-IP, that has the
incoming ip address.

>From a plugin point of view, this could be:

 header X_REMOTE_IP_RULE  eval:match_re(/X-Remote-IP: (.*)/, 'remoteIP')

This would create a local/global/lexical variable $remoteIP that could
be used like this:

 header MESSAGEID_WIP MESSAGEID =~ /<[EMAIL PROTECTED]>/
 describe MESSAGEID_WIP Message-Id has the remote IP of the connection

Of course, having a new variable for each match (even in local/lexical
context) is too polluted, a better way is to store it within a hash.
Then the rule to use it becomes:

 header MESSAGEID_WIP MESSAGEID =~ /<[EMAIL PROTECTED]>/

not so clear to non perl users, but still perl without too much
preprocessing.


Now, forgetting about plugin stuff, this can almost be done right now.
To declare a variable (?{  }) can be used.
So, now we have:

 header X_REMOTE_IP_RULE  /X-Remote-IP: (.*)(?{ $remoteIP = $1 })/

or better yet:

 header X_REMOTE_IP_RULE  /X-Remote-IP: (.*)(?{ $rule{remoteIP} = $1 })/


However, because of 'use strict', the variables have to be declared
first, and cant be done inside the RE.

A simple 'my %rule;' in the right place is probably enough.

What would make this really interesting is that a lot of the data is
already internal to SA and could be easily available to the rules
(instead of chasing it).

Of course, this example is really crude, but a lot more advanced rules
could be written straight in the cf files.

-Raul Dias








Reply via email to