On Thu, 2011-10-13 at 03:57 -0230, Lawrence @ Rogers wrote:
> On 13/10/2011 1:45 AM, Karsten Bräckelmann wrote:

> > In a related note, as per the M::SA::Conf docs for meta rules -- "The
> > value of a hit meta test is that of its arithmetic expression. The value
> > of a hit eval test is that returned by its method."
> >
> > The latter means, this style of adding "rules" is not necessarily safe,
> > since these are eval tests. However, in this case, I believe they all
> > should be set to 1 in case of a match.
> >
> > The former means, you could eliminate such issues due to inconsistencies
> > and code duplication, by using an additional meta level:
> >
> >    meta __VALUE  FOO + BAR
> >
> >    meta ONE  __VALUE == 1
> >    meta TWO  __VALUE == 2

> I don't know how I overlooked that omission in the first rule :)

In particular, since these rules are not exactly complex, and seeing
them side by side... ;)

Anyway, that's why I also included a way, to prevent this from ever
happening. Define once, don't duplicate code, simply by adding another
meta rule level.


> Thanks, it's working as expected now.
> 
> I designed the rules using the information available on 
> http://wiki.apache.org/spamassassin/WritingRules
> 
> Under "Meta rules"
> 
> It has this rule
> 
> meta LOCAL_MULTIPLE_TESTS (( __LOCAL_TEST1 + __LOCAL_TEST2 + 
> __LOCAL_TEST3) > 1)
> 
> "The value of the sub rule in an arithmetic meta rule is the true/false 
> (1/0) value for whether or not the rule hit. "
> 
> If this is incorrect, perhaps this documentation should be updated.

Well, incorrect... Put into easy terms, I'd say. It's intended as a
quick-start tutorial. After that, I seriously recommend having a look
into the full documentation.

There are two points here:

  "The value of a hit eval test is that returned by its method."

Which, I believe (without looking at the code) is generally the boolean
value as mentioned in the wiki. Including the URI DNSBL eval rules you
are using.

However, and that was mostly meant as a heads-up, it MAY NOT hold true
always, since eval rules MAY return something else.

  "The value of a hit meta test is that of its arithmetic expression."

This also most likely is generally the boolean value. Definitely in the
example given, since the (non-boolean!) sub-result of the arithmetic
expression then is compared against a number -- either true, of false.

The trick is, to keep the duplicated arithmetic sub-expression in a
single meta, and use that result for your comparison. Using the
supported, though generally not used feature for your benefit.


-- 
char *t="\10pse\0r\0dtu\0.@ghno\x4e\xc8\x79\xf4\xab\x51\x8a\x10\xf4\xf4\xc4";
main(){ char h,m=h=*t++,*x=t+2*h,c,i,l=*x,s=0; for (i=0;i<l;i++){ i%8? c<<=1:
(c=*++x); c&128 && (s+=h); if (!(h>>=1)||!t[s+h]){ putchar(t[s]);h=m;s=0; }}}

Reply via email to