Skip to content

Commit 4020536

Browse files
author
Loic Dachary
committed
securedrop-admin: when a journalist key is present, the email is required
1 parent b5319dc commit 4020536

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

admin/securedrop_admin/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class FingerprintException(Exception):
4343
pass
4444

4545

46+
class JournalistAlertEmailException(Exception):
47+
pass
48+
49+
4650
class SiteConfig(object):
4751

4852
class ValidateNotEmpty(Validator):
@@ -341,6 +345,7 @@ def update_config(self):
341345
self.config.update(self.user_prompt_config())
342346
self.save()
343347
self.validate_gpg_keys()
348+
self.validate_journalist_alert_email()
344349
return True
345350

346351
def user_prompt_config(self):
@@ -412,6 +417,23 @@ def validate_gpg_keys(self):
412417
"the public key {}".format(public_key))
413418
return True
414419

420+
def validate_journalist_alert_email(self):
421+
if (self.config['journalist_alert_gpg_public_key'] == '' and
422+
self.config['journalist_gpg_fpr'] == ''):
423+
return True
424+
425+
class Document(object):
426+
def __init__(self, text):
427+
self.text = text
428+
429+
try:
430+
SiteConfig.ValidateEmail().validate(Document(
431+
self.config['journalist_alert_email']))
432+
except ValidationError as e:
433+
raise JournalistAlertEmailException(
434+
"journalist alerts email: " + e.message)
435+
return True
436+
415437
def exists(self):
416438
return os.path.exists(self.args.site_config)
417439

admin/tests/test_securedrop-admin.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,41 @@ def test_validate_gpg_key(self, caplog):
411411
site_config.validate_gpg_keys()
412412
assert 'FAIL does not match' in e.value.message
413413

414+
def test_journalist_alert_email(self):
415+
args = argparse.Namespace(site_config='INVALID',
416+
ansible_path='tests/files',
417+
app_path=dirname(__file__))
418+
site_config = securedrop_admin.SiteConfig(args)
419+
site_config.config = {
420+
'journalist_alert_gpg_public_key':
421+
'',
422+
423+
'journalist_gpg_fpr':
424+
'',
425+
}
426+
assert site_config.validate_journalist_alert_email()
427+
site_config.config = {
428+
'journalist_alert_gpg_public_key':
429+
'test_journalist_key.pub',
430+
431+
'journalist_gpg_fpr':
432+
'65A1B5FF195B56353CC63DFFCC40EF1228271441',
433+
}
434+
site_config.config['journalist_alert_email'] = ''
435+
with pytest.raises(
436+
securedrop_admin.JournalistAlertEmailException) as e:
437+
site_config.validate_journalist_alert_email()
438+
assert 'not be empty' in e.value.message
439+
440+
site_config.config['journalist_alert_email'] = 'bademail'
441+
with pytest.raises(
442+
securedrop_admin.JournalistAlertEmailException) as e:
443+
site_config.validate_journalist_alert_email()
444+
assert 'Must contain a @' in e.value.message
445+
446+
site_config.config['journalist_alert_email'] = '[email protected]'
447+
assert site_config.validate_journalist_alert_email()
448+
414449
@mock.patch('securedrop_admin.SiteConfig.validated_input',
415450
side_effect=lambda p, d, v, t: d)
416451
@mock.patch('securedrop_admin.SiteConfig.save')

0 commit comments

Comments
 (0)