Skip to content

Commit

Permalink
Extend TLD check to validate lists as well
Browse files Browse the repository at this point in the history
  • Loading branch information
b0d0nne11 committed Jan 29, 2018
1 parent 90a3fe2 commit ee882c0
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 39 deletions.
53 changes: 16 additions & 37 deletions flanker/addresslib/address.py
Expand Up @@ -329,7 +329,7 @@ def validate_address(addr_spec, metrics=False, skip_remote_checks=False):


@metrics_wrapper()
def validate_list(addr_list, as_tuple=False, metrics=False):
def validate_list(addr_list, as_tuple=False, metrics=False, skip_remote_checks=False):
"""
Validates an address list, and returns a tuple of parsed and unparsed
portions.
Expand All @@ -348,55 +348,34 @@ def validate_list(addr_list, as_tuple=False, metrics=False):
>>> address.validate_address_list('a@b, c@d, e@example.com', as_tuple=True)
([a@mailgun.com, c@mailgun.com], ['e@example.com'])
"""
mtimes = {'parsing': 0, 'mx_lookup': 0,
'dns_lookup': 0, 'mx_conn':0 , 'custom_grammar':0}
mtimes = {'parsing': 0,
'tld_lookup': 0,
'mx_lookup': 0,
'dns_lookup': 0,
'mx_conn':0 ,
'custom_grammar':0}

# sanity check
if not addr_list:
return AddressList(), mtimes

# parse addresses
# run parser against address list
bstart = time()
parsed_addresses, unparseable = parse_list(addr_list, strict=True, as_tuple=True)
mtimes['parsing'] = time() - bstart

plist = AddressList()
ulist = []
ulist = unparseable

# make sure parsed list pass dns and esp grammar
# validate each address
for paddr in parsed_addresses:

# lookup if this domain has a mail exchanger
exchanger, mx_metrics = mail_exchanger_lookup(paddr.hostname, metrics=True)
mtimes['mx_lookup'] += mx_metrics['mx_lookup']
mtimes['dns_lookup'] += mx_metrics['dns_lookup']
mtimes['mx_conn'] += mx_metrics['mx_conn']

if exchanger is None:
vaddr, metrics = validate_address(paddr.address, metrics=True, skip_remote_checks=skip_remote_checks)
for k in set().union(mtimes.keys(), metrics.keys()):
mtimes[k] += metrics[k]
if vaddr is None:
ulist.append(paddr.full_spec())
continue

# lookup custom local-part grammar if it exists
plugin = plugin_for_esp(exchanger)
bstart = time()
if plugin and plugin.validate(paddr) is False:
ulist.append(paddr.full_spec())
continue
mtimes['custom_grammar'] = time() - bstart

plist.append(paddr)

# loop over unparsable list and check if any can be fixed with
# preparsing cleanup and if so, run full validator
for unpar in unparseable:
paddr, metrics = validate_address(unpar, metrics=True)
if paddr:
plist.append(paddr)
else:
ulist.append(unpar)

# update all the metrics
for k, v in six.iteritems(metrics):
metrics[k] += v
plist.append(paddr)

if as_tuple:
return plist, ulist, mtimes
Expand Down
3 changes: 1 addition & 2 deletions tests/addresslib/validator_test.py
Expand Up @@ -142,8 +142,7 @@ def test_parse_syntax_only_false():
invalid_subdomain_list = [i + '@sub.example.com' for i in invalid_localparts(True)]

all_valid_list = valid_tld_list + valid_domain_list + valid_subdomain_list
all_invalid_list = invalid_mx_list + invalid_tld_list + invalid_domain_list + \
invalid_subdomain_list
all_invalid_list = invalid_domain_list + invalid_subdomain_list + invalid_tld_list + invalid_mx_list
all_list = all_valid_list + all_invalid_list

# all valid
Expand Down

0 comments on commit ee882c0

Please sign in to comment.