Add support for Canonicalization option

This commit is contained in:
Scott Kitterman
2018-02-18 00:56:02 -05:00
parent 76f2a34fe4
commit 51464bd7f8
7 changed files with 23 additions and 11 deletions
+2
View File
@@ -10,3 +10,5 @@
0.9.2 UNRELEASED 0.9.2 UNRELEASED
- Improved package requirements definition - Improved package requirements definition
- Added systemd unit file and (untested) sysv init file - Added systemd unit file and (untested) sysv init file
- Added dkim-milter.8 (based on opendim.8)
- Implemented support for Canonicalization option
+3 -2
View File
@@ -19,11 +19,11 @@ DKIM 'a' in AR implemented verified
dkimpy-milter.service implemented verified dkimpy-milter.service implemented verified
sysv init implemented sysv init implemented
remove PidFile on stop implemented verified remove PidFile on stop implemented verified
dkimpy-milter.8 provided needs work
Canonicalization implementd verified
0.9.5 (Beta) 0.9.5 (Beta)
dkimpy-milter.8
AuthservID AuthservID
Canonicalization
Diagnostics Diagnostics
DiagnosticDirectory DiagnosticDirectory
InternalHosts InternalHosts
@@ -31,6 +31,7 @@ SyslogFacility
SyslogSuccess SyslogSuccess
1.0.0 1.0.0
Convert dkim-milter-python config
No additional features planned No additional features planned
Considered for near-term feature release Considered for near-term feature release
+12 -5
View File
@@ -173,17 +173,24 @@ class dkimMilter(Milter.Base):
return Milter.CONTINUE return Milter.CONTINUE
def sign_dkim(self,txt): def sign_dkim(self,txt):
conf = self.conf canon = milterconfig.get('Canonicalization')
if len(canon.split('/')) == 2:
canonicalize.append(canon.split('/')[0])
canonicalize.append(canon.split('/')[1])
else:
canonicalize.append(canon)
canonicalize.append(canon)
syslog.syslog('canonicalize: {0}'.format(canonicalize))
try: try:
d = dkim.DKIM(txt) d = dkim.DKIM(txt)
h = d.sign(milterconfig.get('Selector'),milterconfig.get('Domain'), privateRSA, h = d.sign(milterconfig.get('Selector'),milterconfig.get('Domain'), privateRSA,
canonicalize=('relaxed','simple')) canonicalize=(canonicalize[0], canonicalize[1]))
name,val = h.split(': ',1) name,val = h.split(': ',1)
self.addheader(name,val.strip().replace('\r\n','\n'),0) self.addheader(name,val.strip().replace('\r\n','\n'),0)
if privateEd25519: if privateEd25519:
d = dkim.DKIM(txt) d = dkim.DKIM(txt)
h = d.sign(milterconfig.get('SelectorEd25519'),milterconfig.get('Domain'), privateEd25519, h = d.sign(milterconfig.get('SelectorEd25519'),milterconfig.get('Domain'), privateEd25519,
canonicalize=('relaxed','simple'), signature_algorithm='ed25519-sha256') canonicalize=(canonicalize[0], canonicalize[1]), signature_algorithm='ed25519-sha256')
name,val = h.split(': ',1) name,val = h.split(': ',1)
self.addheader(name,val.strip().replace('\r\n','\n'),0) self.addheader(name,val.strip().replace('\r\n','\n'),0)
except dkim.DKIMException as x: except dkim.DKIMException as x:
@@ -254,14 +261,14 @@ def main():
if milterconfig.get('Syslog'): if milterconfig.get('Syslog'):
syslog.openlog(os.path.basename(sys.argv[0]), syslog.LOG_PID, syslog.LOG_MAIL) syslog.openlog(os.path.basename(sys.argv[0]), syslog.LOG_PID, syslog.LOG_MAIL)
setExceptHook() setExceptHook()
write_pid(milterconfig) pid = write_pid(milterconfig)
if milterconfig.get('KeyFile'): if milterconfig.get('KeyFile'):
privateRSA = read_keyfile(milterconfig, 'RSA') privateRSA = read_keyfile(milterconfig, 'RSA')
if milterconfig.get('KeyFileEd25519'): if milterconfig.get('KeyFileEd25519'):
privateEd25519 = read_keyfile(milterconfig, 'Ed25519') privateEd25519 = read_keyfile(milterconfig, 'Ed25519')
drop_privileges(milterconfig) drop_privileges(milterconfig)
if milterconfig.get('Syslog'): if milterconfig.get('Syslog'):
syslog.syslog('dkimpy-milter started. user: {0}'.format(milterconfig.get('UserID'))) syslog.syslog('dkimpy-milter started:{0} user:{1}'.format(pid,milterconfig.get('UserID')))
Milter.factory = dkimMilter Milter.factory = dkimMilter
Milter.set_flags(Milter.CHGHDRS + Milter.ADDHDRS) Milter.set_flags(Milter.CHGHDRS + Milter.ADDHDRS)
miltername = 'dkimpy-filter' miltername = 'dkimpy-filter'
+1 -2
View File
@@ -42,7 +42,7 @@ defaultConfigData = {
'Socket' : 'local:/var/run/dkimpy-milter/dkimpy-milter.sock', 'Socket' : 'local:/var/run/dkimpy-milter/dkimpy-milter.sock',
'PidFile' : '/var/run/dkimpy-milter/dkimpy-milter.pid', 'PidFile' : '/var/run/dkimpy-milter/dkimpy-milter.pid',
'UserID' : 'dkimpy-milter', 'UserID' : 'dkimpy-milter',
'Canonicalization' : 'simple' 'Canonicalization' : 'relaxed/simple'
} }
@@ -111,7 +111,6 @@ def _readConfigFile(path, configData = None, configGlobal = {}):
'Selector' : 'str', 'Selector' : 'str',
'SelectorEd25519': 'str', 'SelectorEd25519': 'str',
'Canonicalization' : 'str', 'Canonicalization' : 'str',
'CanonicalizationEd25519' : 'str'
} }
# check to see if it's a file # check to see if it's a file
+1
View File
@@ -92,6 +92,7 @@ def write_pid(milterconfig):
if milterconfig.get('Syslog'): if milterconfig.get('Syslog'):
syslog.syslog('Unable to write pidfle {0}. File exists.'.format(milterconfig.get('PidFile'))) syslog.syslog('Unable to write pidfle {0}. File exists.'.format(milterconfig.get('PidFile')))
raise RuntimeError('Unable to write pidfle {0}. File exists.'.format(milterconfig.get('PidFile'))) raise RuntimeError('Unable to write pidfle {0}. File exists.'.format(milterconfig.get('PidFile')))
return pid
#################### ####################
def read_keyfile(milterconfig, keytype): def read_keyfile(milterconfig, keytype):
+1 -1
View File
@@ -16,7 +16,7 @@ KeyFile /etc/mail/dkim.key
Selector default Selector default
# Commonly-used options; the commented-out versions show the defaults. # Commonly-used options; the commented-out versions show the defaults.
#Canonicalization simple #Canonicalization relaxed/simple
#Mode sv #Mode sv
# Socket local:/var/run/dkimpy-milter/dkimpy-milter.sock # Socket local:/var/run/dkimpy-milter/dkimpy-milter.sock
+3 -1
View File
@@ -133,7 +133,7 @@
dkimpy-milter \- Python milter for DKIM signing and validation dkimpy-milter \- Python milter for DKIM signing and validation
.SH "VERSION" .SH "VERSION"
.IX Header "VERSION" .IX Header "VERSION"
0\.9\.1 0\.9\.2
.SH "DESCRIPTION" .SH "DESCRIPTION"
.IX Header "DESCRIPTION" .IX Header "DESCRIPTION"
@@ -208,6 +208,8 @@ the canonicalization method. The recognized values are
and and
.I simple .I simple
as defined by the DKIM specification. The default is as defined by the DKIM specification. The default is
.I relaxed
/
.I simple. .I simple.
The value may include two different canonicalizations separated by a The value may include two different canonicalizations separated by a
slash ("/") character, in which case the first will be applied to the slash ("/") character, in which case the first will be applied to the