Add exception `SatoriInvalidDomain`

When `domain_info` is passed an invalid domain, it would attempt to
parse the registered domain and eventually pass a blank string to
`pythonwhois.get_whois`. This causes an exception of "No root WHOIS
server found for TLD." This is a valid exception, but we should not make
it this far to get this exception.

Instead, this patch will raise an exception of `SatoriInvalidDomain` if
domain_info attempted to be used with an invalid domain.

Change-Id: Ie30b9a01b39d92d8bfeb7f3a80d333fa4bb30d49
Closes-Bug: #1295391
Closes-Bug: #1293670
This commit is contained in:
BK Box 2014-03-21 15:24:28 -05:00
parent c9fef42b4e
commit d649f19680
3 changed files with 31 additions and 7 deletions

View File

@ -38,11 +38,15 @@ def resolve_hostname(host):
LOG.exception(error)
raise errors.SatoriInvalidNetloc(error)
# Domain names are in netloc, IP addresses fall into path
# Domain names and IP are in netloc when parsed with a protocol
# they will be in path if parsed without a protocol
hostname = parsed.netloc or parsed.path
# socket.gaierror is not trapped here
address = socket.gethostbyname(hostname)
try:
address = socket.gethostbyname(hostname)
except socket.gaierror:
error = "`%s` is an invalid domain." % hostname
raise errors.SatoriInvalidDomain(error)
return address
@ -53,8 +57,12 @@ def get_registered_domain(hostname):
def domain_info(domain):
"""Get as much information as possible for a given domain name."""
domain = get_registered_domain(domain)
result = pythonwhois.get_whois(domain)
registered_domain = get_registered_domain(domain)
if utils.is_valid_ip_address(domain) or registered_domain == '':
error = "`%s` is an invalid domain." % domain
raise errors.SatoriInvalidDomain(error)
result = pythonwhois.get_whois(registered_domain)
registrar = []
if 'registrar' in result and len(result['registrar']) > 0:
registrar = result['registrar'][0]
@ -72,7 +80,7 @@ def domain_info(domain):
days_until_expires = (utils.parse_time_string(expires) -
datetime.datetime.now()).days
return {
'name': domain,
'name': registered_domain,
'whois': result['raw'],
'registrar': registrar,
'nameservers': nameservers,

View File

@ -26,6 +26,11 @@ class SatoriInvalidNetloc(SatoriException):
"""Netloc that cannot be parsed by `urlparse`."""
class SatoriInvalidDomain(SatoriException):
"""Invalid Domain provided."""
class SatoriShellException(SatoriException):
"""Invalid shell parameters."""

View File

@ -12,7 +12,6 @@
#
"""Satori DNS Discovery."""
import datetime
import socket
import unittest
@ -265,5 +264,17 @@ class TestDNS(utils.TestCase):
data = dns.domain_info(self.domain)
self.assertIsNone(data['expiration_date'])
def test_domain_info_raises_invalid_domain_error(self):
ip_whois = ["""
Home net HOME-NET-192-168 (NET-192-0-0-0-1)
Home Inc. HOME-NET-192-168-0 (NET-192-168-0-0-1)
"""]
self.mock_get_whois_raw.return_value = ip_whois
self.assertRaises(
errors.SatoriInvalidDomain,
dns.domain_info,
"192.168.0.1"
)
if __name__ == "__main__":
unittest.main()