From 0801bd9e444d08878b28ea7aac71ce6fb35f1c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20=E2=80=9CFrogeye=E2=80=9D=20Preud=27homme?= Date: Sun, 10 Nov 2019 22:18:27 +0100 Subject: [PATCH] Error-proofed DNS-resolution --- filter_subdomains.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/filter_subdomains.py b/filter_subdomains.py index d630b1a..ac19670 100755 --- a/filter_subdomains.py +++ b/filter_subdomains.py @@ -10,10 +10,12 @@ import re import sys import dns.resolver +import dns.exception import progressbar import regexes +DNS_TIMEOUT = 5.0 def is_subdomain_matching(subdomain: str) -> bool: """ @@ -21,9 +23,20 @@ def is_subdomain_matching(subdomain: str) -> bool: """ # TODO Look at the whole chain rather than the last one try: - query = dns.resolver.query(subdomain, 'A') + query = dns.resolver.query(subdomain, 'A', lifetime=DNS_TIMEOUT) except dns.resolver.NXDOMAIN: return False + except dns.resolver.NoAnswer: + return False + except dns.resolver.YXDOMAIN: + print(f"Query name too long for {subdomain}", file=sys.stderr) + return False + except dns.resolver.NoNameservers: + print(f"All nameservers broken for {subdomain}", file=sys.stderr) + return False + except dns.exception.Timeout: + print(f"Timeout for {subdomain}", file=sys.stderr) + return False canonical = query.canonical_name.to_text() for regex in regexes.REGEXES: if re.match(regex, canonical):