Add KeyTable processing, fix SigningTable matching code
This commit is contained in:
+48
-11
@@ -228,6 +228,26 @@ class dkimMilter(Milter.Base):
|
|||||||
"""Determine d= and i= identiies for signature"""
|
"""Determine d= and i= identiies for signature"""
|
||||||
self.domain = []
|
self.domain = []
|
||||||
iequals = None
|
iequals = None
|
||||||
|
try:
|
||||||
|
self.privkeyRSA = self.conf.get('privateRSA')
|
||||||
|
except:
|
||||||
|
self.privkeyRSA = ''
|
||||||
|
try:
|
||||||
|
self.privkeyEd25519 = self.conf.get('privateEd25519')
|
||||||
|
except:
|
||||||
|
self.privkeyEd25519 = ''
|
||||||
|
try:
|
||||||
|
self.selectorRSA = self.conf.get('Selector')
|
||||||
|
except:
|
||||||
|
self.selectorRSA = ''
|
||||||
|
try:
|
||||||
|
self.selectorEd25519 = self.conf.get('SelectorEd25519')
|
||||||
|
except:
|
||||||
|
self.selectorEd25519 = ''
|
||||||
|
if not self.domain and self.conf.get('Domain'):
|
||||||
|
self.domain = self.conf.get('Domain')
|
||||||
|
if self.conf.get('SubDomains'):
|
||||||
|
self.fdomain = self.get_parent_domain(self.fdomain, self.domain)
|
||||||
if self.conf.get('SigningTable'):
|
if self.conf.get('SigningTable'):
|
||||||
match = False
|
match = False
|
||||||
for dictkey, dictvalues in self.conf.get('SigningTable').items():
|
for dictkey, dictvalues in self.conf.get('SigningTable').items():
|
||||||
@@ -240,7 +260,7 @@ class dkimMilter(Milter.Base):
|
|||||||
match = True
|
match = True
|
||||||
else:
|
else:
|
||||||
if len(dictkey.split('*')) == 2:
|
if len(dictkey.split('*')) == 2:
|
||||||
if dictkey.split('*')[1] == self.author[:-len(dictkey.split('*')[1])]:
|
if dictkey.split('*')[1] == self.author[-len(dictkey.split('*')[1]):]:
|
||||||
self.domain.append(self.fdomain)
|
self.domain.append(self.fdomain)
|
||||||
match = True
|
match = True
|
||||||
self.domain.append(self.fdomain)
|
self.domain.append(self.fdomain)
|
||||||
@@ -254,11 +274,28 @@ class dkimMilter(Milter.Base):
|
|||||||
pass
|
pass
|
||||||
if match:
|
if match:
|
||||||
#TODO add KeyTable stuffs here.
|
#TODO add KeyTable stuffs here.
|
||||||
|
keytablekey = dictvalues[-1] # Last value in the SigningTable row.
|
||||||
|
if self.conf.get('privateRSATable'):
|
||||||
|
# Table data is a list of [ signing domain, selector, key ]
|
||||||
|
keytabledata = self.conf.get('privateRSATable')[keytablekey]
|
||||||
|
try:
|
||||||
|
self.fdomain = keytabledata[0]
|
||||||
|
self.selectorRSA = keytabledata[1]
|
||||||
|
self.privkeyRSA = keytabledata[2]
|
||||||
|
except:
|
||||||
|
if (self.conf.get('Syslog')):
|
||||||
|
syslog.syslog('Error: Invalid KeyTable data {0}'.format(keytabledata))
|
||||||
|
if self.conf.get('privateEd25519Table'):
|
||||||
|
# Table data is a list of [ signing domain, selector, key ]
|
||||||
|
keytabledata = self.conf.get('privateEd25519Table')[keytablekey]
|
||||||
|
try:
|
||||||
|
self.fdomain = keytabledata[0]
|
||||||
|
self.selectorEd25519 = keytabledata[1]
|
||||||
|
self.privkeyEd25519 = keytabledata[2]
|
||||||
|
except:
|
||||||
|
if (self.conf.get('Syslog')):
|
||||||
|
syslog.syslog('Error: Invalid KeyTable data {0}'.format(keytabledata))
|
||||||
break
|
break
|
||||||
if not self.domain and self.conf.get('Domain'):
|
|
||||||
self.domain = self.conf.get('Domain')
|
|
||||||
if self.conf.get('SubDomains'):
|
|
||||||
self.fdomain = self.get_parent_domain(self.fdomain, self.domain)
|
|
||||||
|
|
||||||
def sign_dkim(self, txt):
|
def sign_dkim(self, txt):
|
||||||
canon = codecs.encode(self.conf.get('Canonicalization'), 'ascii')
|
canon = codecs.encode(self.conf.get('Canonicalization'), 'ascii')
|
||||||
@@ -277,10 +314,10 @@ class dkimMilter(Milter.Base):
|
|||||||
# None or empty. DKIM explicitly tests for None.
|
# None or empty. DKIM explicitly tests for None.
|
||||||
sign_headers = None
|
sign_headers = None
|
||||||
try:
|
try:
|
||||||
if self.conf.get('privateRSA'):
|
if self.privkeyRSA:
|
||||||
d = dkim.DKIM(txt)
|
d = dkim.DKIM(txt)
|
||||||
h = d.sign(codecs.encode(self.conf.get('Selector'), 'ascii'), codecs.encode(self.fdomain, 'ascii'),
|
h = d.sign(codecs.encode(self.selectorRSA, 'ascii'), codecs.encode(self.fdomain, 'ascii'),
|
||||||
codecs.encode(self.conf.get('privateRSA'), 'ascii'),
|
codecs.encode(self.privkeyRSA, 'ascii'),
|
||||||
canonicalize=(canonicalize[0], canonicalize[1]),
|
canonicalize=(canonicalize[0], canonicalize[1]),
|
||||||
identity=self.iequals, include_headers=sign_headers)
|
identity=self.iequals, include_headers=sign_headers)
|
||||||
name, val = h.split(b': ', 1)
|
name, val = h.split(b': ', 1)
|
||||||
@@ -293,10 +330,10 @@ class dkimMilter(Milter.Base):
|
|||||||
d.signature_fields.get(b'a').decode(),
|
d.signature_fields.get(b'a').decode(),
|
||||||
d.signature_fields.get(b's').decode(),
|
d.signature_fields.get(b's').decode(),
|
||||||
d.domain.decode().lower()))
|
d.domain.decode().lower()))
|
||||||
if self.conf.get('privateEd25519'):
|
if self.privkeyEd25519:
|
||||||
d = dkim.DKIM(txt)
|
d = dkim.DKIM(txt)
|
||||||
h = d.sign(codecs.encode(self.conf.get('SelectorEd25519'), 'ascii'), codecs.encode(self.fdomain, 'ascii'),
|
h = d.sign(codecs.encode(self.selectorEd25519, 'ascii'), codecs.encode(self.fdomain, 'ascii'),
|
||||||
self.conf.get('privateEd25519'),
|
self.privkeyEd25519,
|
||||||
canonicalize=(canonicalize[0], canonicalize[1]),
|
canonicalize=(canonicalize[0], canonicalize[1]),
|
||||||
identity=self.iequals, include_headers=sign_headers,
|
identity=self.iequals, include_headers=sign_headers,
|
||||||
signature_algorithm=b'ed25519-sha256')
|
signature_algorithm=b'ed25519-sha256')
|
||||||
|
|||||||
Reference in New Issue
Block a user