28 ago 2009

Preferencias de usuario en mysql para cuentas con alias

En el caso de tener varias cuentas redireccionadas o que sean alias de otra cuenta, podemos evitar cargar preferencias personales para cada una de ellas, ahorrando trabajando principalmente si tenemos alguna automatización que maneje black/whitelist personalizadas.

Si tuviésemos un encadenamiento de alias o redirecciones, el ahorro sería aún mayor. Por ejemplo:

account_3 es un alias de account_2, esta a su ves está redireccionada a account_1

Si account_1 ya tiene cargadas sus preferencias, al ser procesado un mail para cualquiera de las otras dos cuentas, estas preferencias no son tomadas en cuenta por SpamAssassin. Si agregamos la nueva preference ' alias_of ' a las cuentas account_2 y account_3, esta puede ser interpretada por un el procedure ' users_pref ' que le devolverá a SpamAssassin las preferencias de la cuenta en cuestión más las de la cuenta que le hayamos indicado.

username preference value

account_3 alias_of account_2
... ...
account_2 alias_of account_1
... ...
account_1 required_score 5.5
blaclist_from spam@spam.spam
... ...


En este caso hay un encadenamiento de 3 cuentas pero el número puede variar y el limite de recursión se puede establecer en user_scores_sql_custom_quer para evitar loops infinitos con cuentas que se definan como alias mutuamente.

local.cf


user_scores_sql_custom_query CALL spamassassin.users_pref(_USERNAME_ , _DOMAIN_ , 3)



Procedure users_pref


PROCEDURE `users_pref`(
IN `SPusername` varchar(128),
IN `SPdomain` varchar(68),
IN `SPdep` integer
)
BEGIN


IF (`SPdomain` <> 'noDomain' OR `SPdomain` is NULL ) THEN

SET max_sp_recursion_depth=`SPdep`;

create temporary table if not exists MyArray (
`prefid` integer,
`username` varchar(128),
`preference` varchar(64),
`value` varchar(128)
) engine = MEMORY;

END IF;

INSERT INTO MyArray (SELECT prefid, username, preference, value
FROM spamassassin.userpref
WHERE username = `SPusername`
OR (username = '@GLOBAL' AND `SPdomain` <> 'noDomain' )
OR username = CONCAT('@',`SPdomain`)
);

IF (EXISTS (SELECT value as `username`
FROM `spamassassin`.`userpref`
WHERE `username` = `SPusername`
and preference = 'alias_of')
AND `SPdep` > 0 )THEN

CALL spamassassin.users_pref((SELECT value as `username`
FROM `spamassassin`.`userpref`
WHERE `username` = `SPusername`
and preference = 'alias_of'),'noDomain',`SPdep`-1
);
ELSE

Select preference, value from MyArray
WHERE preference <> 'alias_of'
ORDER BY username DESC, prefid asc;

END IF ;

END $$



Tabla userpref


CREATE TABLE `spamassassin`.`userpref` (
`prefid` int(8) unsigned NOT NULL auto_increment,
`username` varchar(128) NOT NULL default '',
`preference` varchar(64) NOT NULL default '',
`value` varchar(128) default NULL,
`descript` varchar(128) default NULL,
`added` datetime NOT NULL default '2003-01-01 00:00:00',
`added_by` varchar(128) NOT NULL default '',
`modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `prefid` USING BTREE (`prefid`),
KEY `type` (`preference`),
KEY `added_by` (`added_by`),
KEY `preference` (`preference`),
KEY `username` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=1037 DEFAULT CHARSET=latin1 COMMENT='Spamassassin Preferences';


UsingSQL

http://wiki.apache.org/spamassassin/UsingSQL

WebUserPrefs by patrickbores

http://sourceforge.net/projects/webuserprefs/

6 ago 2009

Policyc:


Policyc trabaja en forma similar a un proxy para Postfix policy delegation protocol. En este caso ajustado para el funcionamiento de Policyd

master.cf

#################### Policyc #######################
#
policyc unix    -    n    n    -    150    spawn
        user=filter argv=/path/to/policyc.pl
#


main.cf

policyc_time_limit = 3600

...

smtpd_recipient_restrictions =
        check_policy_service unix:private/policyc,
        ...

...

smtpd_end_of_data_restrictions =
        check_policy_service unix:private/policyc,
        ...

Policyc.pl

http://mail.utn.edu.ar/spamassassin/policyc.pl



Santiago Liz