From 5349d1b3ae4b138658362a6a11c9189bb301eff1 Mon Sep 17 00:00:00 2001 From: Scott Kitterman Date: Tue, 22 Oct 2019 23:33:31 -0400 Subject: [PATCH] Refactor multi-line datasets so it works with single and multiline (both KeyTable and SigningTable) --- dkimpy_milter/config.py | 39 ++++++++++++++++++++++++++------------- dkimpy_milter/util.py | 13 ++++++------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/dkimpy_milter/config.py b/dkimpy_milter/config.py index 3fe147a..076ebf3 100644 --- a/dkimpy_milter/config.py +++ b/dkimpy_milter/config.py @@ -50,6 +50,8 @@ defaultConfigData = { 'MacroListVerify': '', 'DNSOverride': None, 'SubDomains': False, + 'SigningTable': None, + 'SigningTableEd25519': None, 'debugLevel': 0 # Undocumented config item for developer use } @@ -260,6 +262,22 @@ def _make_authserv_id(as_id): as_id = socket.gethostname() return as_id +def _dataset_multiline(dst, dataset): + """Convert one list element per line on multi-line datasets to a list of + lists""" + result = [] + for row in dataset: + rowl = row.split(',') + for element in rowl: + rowl[rowl.index(element)] = element.strip().strip(',') + if dst == 'KeyTable' and len(rowl) != 3: + raise dkim.ParameterError('Invalid {0} element (need three paramters per row): {1}' + .format(str(dst), str(rowl))) + if dst == 'SigningTable' and len(rowl) > 2: + raise dkim.ParameterError('Invalid {0} element (need one or two paramters per row): {1}' + .format(str(dst), str(rowl))) + result.append(rowl) + return result def _dataset_to_list(dataset): """Convert a dataset (as defined in dkimpymilter.8) and return a python @@ -288,18 +306,6 @@ def _dataset_to_list(dataset): else: for element in line.split(':'): ds.append(element.strip().strip(':')) - if ds[0] == 'KeyTable' or ds[0] == 'KeyTableEd25519' or ds[0] =='SigningTable' or ds[0] =='SigningTableEd25519': - # These are the only multi-line dataset types - for row in ds[1]: - rowl = row.split(',') - for element in rowl: - rowl[rowl.index(element)] = element.strip().strip(',') - if (ds[0] == 'KeyTable' or ds[0] == 'KeyTableEd25519') and len(rowl) != 3: - raise dkim.ParameterError('Invalid {0} element (need three paramters per row): {1}' - .format(str(ds[0]), str(rowl))) - if (ds[0] == 'SigningTable' or ds[0] == 'SigningTableEd25519') and len(rowl) > 2: - raise dkim.ParameterError('Invalid {0} element (need one or two paramters per row): {1}' - .format(str(ds[0]), str(rowl))) dsf.close() return ds # If it's a str and csl, it has one value and we return a list @@ -424,7 +430,14 @@ def _readConfigFile(path, configData=None, configGlobal={}): elif conversion == 'int': configData[name] = int(value) elif conversion == 'dataset': - configData[name] = _dataset_to_list(value) + interim_value = _dataset_to_list(value) + # These are the only multi-line dataset types + if name == 'KeyTable' or name == 'KeyTableEd25519': + configData[name] = _dataset_multiline('KeyTable', interim_value) + elif name == 'SigningTable' or name == 'SigningTableEd25519': + configData[name] = _dataset_multiline('SigningTable', interim_value) + else: + configData[name] = interim_value else: syslog.syslog(str('name: ' + name + ' value: ' + value + ' conversion: ' + conversion)) diff --git a/dkimpy_milter/util.py b/dkimpy_milter/util.py index d9b0b6f..114d894 100644 --- a/dkimpy_milter/util.py +++ b/dkimpy_milter/util.py @@ -198,14 +198,13 @@ def read_keytable(tablelist, milterconfig): import syslog keytabledata = {} for row in tablelist: - rowl = row.split(',') - for element in rowl: - rowl[rowl.index(element)] = element.strip().strip(',') - if len(rowl) != 3: + for element in row: + row[row.index(element)] = element.strip().strip(',') + if len(row) != 3: raise dkim.ParameterError('Invalid KeyTable element (need three paramters per row): {0}' - .format(str(rowl))) - key = read_keyfile(rowl[2], milterconfig) - keytabledata.update({rowl[0]:[rowl[1], key]}) + .format(str(row))) + key = read_keyfile(row[2], milterconfig) + keytabledata.update({row[0]:[row[1], key]}) return keytabledata def get_keys(milterconfig):