# -*- mode: python -*-
import userdir_gpg, userdir_ldap, sys, traceback, time, ldap, os, getopt;
import pwd
+import email, email.parser
from userdir_gpg import *;
from userdir_ldap import *;
Debug = None;
# Try to extract a key fingerprint from a PGP siged message
-def TryGPG(Email):
+def TryGPG(mail):
# Try to get a pgp text
try:
- Msg = GetClearSig(Email);
+ Msg = GetClearSig(mail, lax_multipart=True);
except:
# Log an exception.. but continue. This is to deal with 'sort of'
# PGP-MIME things
if Msg[0].find("-----BEGIN PGP SIGNED MESSAGE-----") == -1:
return None;
- Res = GPGCheckSig(Msg[0]);
+ pgp = GPGCheckSig2(Msg[0]);
# Failed to find a matching sig
- if Res[0] != None:
- S = "%s: %s -> PGP Checking failed '%s': %s %s\n" %(Now,MsgID,Email.getheader("From"),str(Res[0]),str(Res[2]));
+ if not pgp.ok:
+ S = "%s: %s -> PGP Checking failed '%s': %s %s\n" %(Now,MsgID,mail["From"],str(pgp.why),str(pgp.key_info));
ErrLog.write(S);
return None;
# Search for the matching key fingerprint
- Attrs = l.search_s(BaseDn,ldap.SCOPE_ONELEVEL,"keyFingerPrint=" + Res[2][1]);
+ Attrs = l.search_s(BaseDn,ldap.SCOPE_ONELEVEL,"keyFingerPrint=" + pgp.key_fpr);
if len(Attrs) == 0:
return None;
if len(Attrs) != 1:
raise Error, "Oddly your key fingerprint is assigned to more than one account.."
- return (Attrs[0][1]["uid"][0],"PGP",FormatPGPKey(Res[2][1]));
+ return (Attrs[0][1]["uid"][0],"PGP",FormatPGPKey(pgp.key_fpr));
# Try to guess the name from the email address
-def TryMatcher(Email):
- Sender = Email.getheader("From");
+def TryMatcher(mail):
+ Sender = mail["From"];
if Sender == None:
return None;
# Get the email
ErrType = EX_PERMFAIL;
ErrMsg = "Failed to understand the email or find a signature:";
- Email = mimetools.Message(sys.stdin,0);
- MsgID = Email.getheader("Message-ID");
-
+ mail = email.parser.Parser().parse(sys.stdin);
+ MsgID = mail["Message-ID"]
+
# Connect to the ldap server
ErrType = EX_TEMPFAIL;
ErrMsg = "An error occured while performing the LDAP lookup";
global l;
- l = ldap.open(LDAPServer);
+ l = connectLDAP()
if Debug == None:
F = open(PassDir+"/pass-"+pwd.getpwuid(os.getuid())[0],"r");
AccessPass = F.readline().strip().split(" ")
# Try to decode
ErrType = EX_TEMPFAIL;
ErrMsg = "An error occured while trying GPG decoding";
- User = TryGPG(Email);
+ User = TryGPG(mail);
if User == None:
ErrMsg = "An error occured while trying Matcher decoding";
- User = TryMatcher(Email);
+ User = TryMatcher(mail);
# Get any mailing list information
- List = Email.getheader("X-Mailing-List");
- if List == None:
- List = "-";
+ List = mail['X-Mailing-List']
+ if not List: List = "-";
# Tada, write a log message
if User != None:
else:
print Rec;
else:
- User = ("-","UKN",Email.getheader("From"));
+ User = ("-","UKN",mail["From"]);
Msg = "[%s] \"%s\" \"%s\" \"%s\""%(Now,User[2],List,MsgID);
MainLog.write("%s %s %s\n"%(User[0],User[1],Msg));