diff --git a/gestion/config_mail.py b/gestion/config_mail.py index 9d9d310b..afac5b39 100755 --- a/gestion/config_mail.py +++ b/gestion/config_mail.py @@ -30,10 +30,10 @@ """ Script permetant de gérer sa configuration mail -Usage : ConfigMail.py [--forward=(|)] [--spam=(accepte|marque|supprime)] +Usage : ConfigMail.py [--forward=(|)] [--spam=(accepte|marque|deplace|supprime)] Retourne : forward=(|) - spam=(accepte|marque|supprime) + spam=(accepte|marque|deplace|supprime) """ procmail_warning = """################################################################ @@ -46,6 +46,24 @@ procmail_warning = """########################################################## """ +# Pour éviter des crash +procmail_mark_old = """# Passage des mails dans spamassassin +:0 Whbf +* < 256000 +| spamc + +# Serveur blacklisté +:0 +* ^X-Reject: 554 +* !^X-Spam-Status: Yes +{ + :0 Whf + * ^Subject:\/.* + | formail -i "Subject: *****SPAM***** $MATCH" +} + +""" + procmail_mark = """# Passage des mails dans spamassassin :0 Whbf * < 256000 @@ -61,13 +79,37 @@ procmail_mark = """# Passage des mails dans spamassassin | formail -i "Subject: *****SPAM***** $MATCH" } +:0 +* ^X-Spam-Status: Yes +{ + :0 Whf + * ^Subject:\/.* +| formail -i "Subject: *****SPAM***** $MATCH" +} + """ procmail_delete_spam = """# Suppression des spams :0 Whf * ^Subject: *****SPAM***** /dev/null +""" +procmail_move = """#Déplacement des spams +:0 Whbf +* < 256000 +| spamc + +# Serveur blacklisté +:0 +* ^X-Reject: 554 +* !^X-Spam-Status: Yes +.%(spamdir)s + +# Mail de spam +:0 +* ^X-Spam-Status: Yes +.%(spamdir)s """ procmail_forward = """# Redirection des mails @@ -82,13 +124,20 @@ forward_procmail = '"|exec /usr/bin/procmail"\n' from commands import getstatusoutput -import os, sys, pwd, getopt +import os +import sys +import pwd +import getopt home = pwd.getpwuid(os.getuid())[5] import re class MailConfigError(ReferenceError): pass +def Log(content): + with open('/tmp/intranet.log', 'a') as log: + log.writelines(content+"\n") + ############################################################################ ## Fonctions utiles @@ -118,11 +167,11 @@ def _GetConfig(): raise MailConfigError, 'Fichier forward trop long' fic_forward = fic_forward[0] except IOError: - return {'forward':'', 'spam':'accepte'} + return {'forward':'', 'spam':'accepte', 'spamdir':None} # forward simple if _IsMail(fic_forward): - return {'forward':fic_forward, 'spam':'accepte'} + return {'forward':fic_forward, 'spam':'accepte', 'spamdir':None} # utilisation de procmail if fic_forward != _Clean(forward_procmail)[0]: @@ -140,27 +189,41 @@ def _GetConfig(): # forward simple dans le procmailrc if not fic_procmail: - return {'forward':forward, 'spam':'accepte'} - + return {'forward':forward, 'spam':'accepte', 'spamdir':None} + # marquage des spams tmp = _Clean( procmail_mark ) - if fic_procmail[:len(tmp)] != tmp: - raise MailConfigError, 'Fichier de procmail non compréhensible' - fic_procmail = fic_procmail[len(tmp):] + tmp2 = _Clean( procmail_move ) + tmp3 = _Clean( procmail_mark_old ) + mark = False + move = False + if fic_procmail[:len(tmp)] != tmp and fic_procmail[:len(tmp)] != tmp3: + if len(fic_procmail) != len(tmp2): + raise MailConfigError, 'Fichier de procmail non compréhensible' + else: + spamdir = fic_procmail[-1][1:] + fic_procmail = fic_procmail[len(tmp2):] + move = True + else: + fic_procmail = fic_procmail[len(tmp):] + spamdir = "" + mark = True # suppression des spams ? - if not fic_procmail: - return {'forward':forward, 'spam':'marque'} + if (not fic_procmail) and mark: + return {'forward':forward, 'spam':'marque', 'spamdir':None} + elif (not fic_procmail) and move: + return {'forward':forward, 'spam':'deplace', 'spamdir':spamdir} elif fic_procmail == _Clean(procmail_delete_spam): - return {'forward':forward, 'spam':'supprime'} + return {'forward':forward, 'spam':'supprime', 'spamdir':None} else: raise MailConfigError, 'Fichier de procmail non compréhensible' -def _SetConfig(forward = None, spam= None): +def _SetConfig(forward = None, spam= None, spamdir=None): """ Modifie la configuration de l'utilisateur courant """ # variable new_spam - if spam in ['accepte','supprime','marque']: + if spam in ['accepte', 'deplace', 'supprime','marque']: new_spam = spam elif spam == None: new_spam = _GetConfig()['spam'] @@ -175,6 +238,14 @@ def _SetConfig(forward = None, spam= None): else: raise ValueError, 'Adresse mail invalide' + if spamdir == None: + new_spamdir = _GetConfig()['spamdir'] + elif re.match('^[a-zA-Z0-9_-]+$', spamdir): + new_spamdir = spamdir + else: + raise ValueError, 'Nom de dossier invalide' + + # génération des fichiers if new_spam=='accepte': # suppression du .procmailrc @@ -189,16 +260,19 @@ def _SetConfig(forward = None, spam= None): os.remove('%s/.forward'%home) else: # écriture du .procmailc - txt = procmail_warning + procmail_mark + if new_spam == 'marque': + txt = procmail_warning + procmail_mark if new_spam=='supprime': - txt += procmail_delete_spam + txt = procmail_warning + procmail_mark + procmail_delete_spam + if new_spam == 'deplace': + txt = procmail_warning + procmail_move % ({'spamdir':new_spamdir}) if new_forward: txt += procmail_forward % new_forward open('%s/.procmailrc'%home,'w').write(txt) # écriture du .forward open('%s/.forward'%home,'w').write(forward_procmail) -def _Sudo(uid, forward=None, spam=None): +def _Sudo(uid, forward=None, spam=None, spamdir=None): """ Execute le script pour un autre utilisateur """ # construction de la ligne de commande if __file__[-4:]=='.pyc': @@ -210,6 +284,8 @@ def _Sudo(uid, forward=None, spam=None): c += " --forward=%s" % forward if spam!=None: c += " --spam=%s" % spam + if spamdir!=None: + c += " --spamdir=%s" %spamdir # execution de la commande status, output = getstatusoutput(c) @@ -231,21 +307,22 @@ def _Sudo(uid, forward=None, spam=None): ## ############################################################################ -def MailConfig(uid=None, forward=None, spam=None): +def MailConfig(uid=None, forward=None, spam=None, spamdir=None): """ Modifie ou retourne la configuration mail de l'utilisateur user = utilisateur à configurer, si None configure l'utilisateur courant forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection spam = action à effectuer sur les spams (accepte, supprime, marque) + spamdir = dossier où déplacer le spam. Pour les champs forward et spam, la valeur None ne touche pas au champ. - Retourne un dictionnaire { 'forward':'', 'spam':'' } + Retourne un dictionnaire { 'forward':'', 'spam':'', 'spamdir:''} """ ## demande pour un autre utilisateur if uid: - return _Sudo(uid=uid, forward=forward, spam=spam) + return _Sudo(uid=uid, forward=forward, spam=spam, spamdir=spamdir) ## nettoyage des variables cfg = _GetConfig() @@ -253,10 +330,14 @@ def MailConfig(uid=None, forward=None, spam=None): forward = None if spam == cfg['spam']: spam = None + if spamdir == cfg['spamdir']: + spamdir = None + if spamdir == "": + spamdir = None ## modifications - if forward!=None or spam!=None: - _SetConfig(forward=forward, spam=spam) + if forward != None or spam != None or spamdir != None: + _SetConfig(forward=forward, spam=spam, spamdir=spamdir) ## on renvoie la configuration return _GetConfig() @@ -265,15 +346,26 @@ if __name__=="__main__": ## parsage des arguments forward = None spam = None - opts, args = getopt.getopt(sys.argv[1:], "", ['forward=', 'spam=']) + spamdir = None + opts, args = getopt.getopt(sys.argv[1:], "", ['forward=', 'spam=', 'spamdir=']) + if ('--spam','deplace') in opts: + optgood = False + for o, v in opts: + if o == '--spamdir': + optgood = True + if not optgood: + raise ValueError, 'Il faut renseigner un dossier pour déplacer le spam' for o, v in opts: if o == "--forward": forward = v elif o == '--spam': spam = v + elif o == '--spamdir': + spamdir = v + ## execution de MailConfig - res = MailConfig(forward=forward, spam=spam) + res = MailConfig(forward=forward, spam=spam, spamdir=spamdir) ## affichage des résultats for i in res.items():