Refactor util.read_keytable to work with multi-line dataset format from util._dataset_to_list

This commit is contained in:
Scott Kitterman
2019-10-21 14:05:58 -04:00
parent 43f6272b0d
commit ec55aac974
+22 -26
View File
@@ -170,7 +170,7 @@ def own_socketfile(milterconfig, sockname=None):
os.chown(sockname[offset:], user, group) os.chown(sockname[offset:], user, group)
def read_keyfile(keyfile): def read_keyfile(keyfile, milterconfig):
"""Read private key from file.""" """Read private key from file."""
import syslog import syslog
try: try:
@@ -187,33 +187,25 @@ def read_keyfile(keyfile):
key += line key += line
return key return key
def read_keytable(tablefile): def read_keytable(tablelist, milterconfig):
"""Read keytables into in memory configuration data so all keys are read """Read keytables into in memory configuration data so all keys are read
before priviledges are dropped. before priviledges are dropped.
KeyTable contains a filename of the table. tablelist contains a list of KeyTable rows (three elements, comma separated):
File contains comma separated rows of:
domain, selector, key file location domain, selector, key file location
When loaded, KeyTableData is a dict: When loaded, KeyTableData is a dict:
{domain: [selector, key]}""" {domain: [selector, key]}"""
import dkim
import syslog import syslog
if tabletype == "RSA": keytabledata = {}
tablefile = milterconfig.get('KeyTable') for row in tablelist:
if tabletype == "Ed25519": rowl = row.split(',')
tablefile = milterconfig.get('KeyTableEd25519') for element in rowl:
if milterconfig.get(tablefile): rowl[rowl.index(element)] = element.strip().strip(',')
keytabledata = {} if len(rowl) != 3:
try: raise dkim.ParameterError('Invalid KeyTable element (need three paramters per row): {0}'
f = open(milterconfig.get(tablefile)) .format(str(rowl)))
for row in f: key = read_keyfile(rowl[2], milterconfig)
key = read_keyfile(row[2]) keytabledata.update({rowl[0]:[rowl[1], key]})
keytabledata.update({row[0]:[row[1], key]})
f.close()
except IOError as e:
if milterconfig.get('Syslog'):
syslog.syslog('Unable to read keytable {0}. IOError: {1}'
.format(tablefile, e))
raise
return keytabledata return keytabledata
def get_keys(milterconfig): def get_keys(milterconfig):
@@ -223,11 +215,15 @@ def get_keys(milterconfig):
milterconfig['privateEd25519'] = False milterconfig['privateEd25519'] = False
milterconfig['privateEd25519Table'] = False milterconfig['privateEd25519Table'] = False
if milterconfig.get('KeyTable'): if milterconfig.get('KeyTable'):
milterconfig['privateRSATable'] = read_keytable(milterconfig.get('KeyTable')) milterconfig['privateRSATable'] = read_keytable(milterconfig.get('KeyTable'),
milterconfig)
elif milterconfig.get('KeyFile'): elif milterconfig.get('KeyFile'):
milterconfig['privateRSA'] = read_keyfile(milterconfig.get('KeyFile')) milterconfig['privateRSA'] = read_keyfile(milterconfig.get('KeyFile'),
milterconfig)
if milterconfig.get('KeyTableEd25519'): if milterconfig.get('KeyTableEd25519'):
milterconfig['privateEd25519Table'] = read_keytable(milterconfig.get('KeyTableEd25519')) milterconfig['privateEd25519Table'] = read_keytable(milterconfig.get('KeyTableEd25519'),
milterconfig)
elif milterconfig.get('KeyFileEd25519'): elif milterconfig.get('KeyFileEd25519'):
milterconfig['privateEd25519'] = read_keyfile(milterconfig.get('KeyFileEd25519')) milterconfig['privateEd25519'] = read_keyfile(milterconfig.get('KeyFileEd25519'),
milterconfig)
return milterconfig return milterconfig