From 9ca5c7e07f1e5ab4a28c042a72a7f9f29b3426c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Benencia?= Date: Fri, 3 Aug 2012 15:53:33 -0300 Subject: Search by domain --- core.py | 37 ++++++++++++++++++++++++------------- model.py | 27 ++++++++++++++++++++++++++- pywhoisd.conf | 2 +- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/core.py b/core.py index 44e3f90..300f6ff 100644 --- a/core.py +++ b/core.py @@ -26,7 +26,16 @@ class Daemon(): """Receive a dictionary and return a string""" result = "" for k, v in values.items(): - result += '{0}: {1}\n'.format(k, v) + if k == 'domains': + result += '\nAssociated domains\n' + for i, dom in enumerate(v): + result += ' {0}\n'.format(dom.name) + elif k == 'admins': + result += '\nAssociated administrator/s\n ' + for i, adm in enumerate(v): + result += ' {0} {1} <{2}>\n'.format(adm.name, adm.surname, adm.email) + else: + result += '{0}: {1}\n'.format(k, v) return result @@ -38,19 +47,21 @@ class Daemon(): for key in networks: for block in networks[key].ip_blocks: if ipaddr.IPAddress(ip) in ipaddr.IPNetwork(block): - result['name'] = networks[key].name - for k in networks[key].data: - result[k] = networks[key].data[k] - - return result + return networks[key].as_dict(self.data) - result['error'] = "Red no encontrada" + result['error'] = "Network not found" return result - # TODO def search_domain(self, domain): - pass - + # Iterate over all network and check its domains + networks = self.data.get_networks() + domains = self.data.get_domains() + for network in networks.values(): + if any(domains[d].name == domain for d in network.domains): + return network.as_dict(self.data) + + return {'error':'Domain not found'} + # TODO def search_person(self, query): @@ -93,9 +104,9 @@ class WhoisHandler(socketserver.BaseRequestHandler): data = str(self.request.recv(100).strip(), 'utf-8') print('Received: {}'.format(data)) - response = self.daemon.get_header() + " \n" - response += self.daemon.query(data) - response += self.daemon.get_footer() + "\n" + #response = self.daemon.get_header() + " \n" + response = self.daemon.query(data) + #response += self.daemon.get_footer() + "\n" self.request.sendall(bytes(response, 'utf-8')) diff --git a/model.py b/model.py index 99f368f..ef5ce28 100644 --- a/model.py +++ b/model.py @@ -10,6 +10,29 @@ class Network(): self.ip_blocks = [] self.data = {} + def as_dict(self, data): + # Beautify + result = {} + domains = data.get_domains() + persons = data.get_persons() + + result['name'] = self.name + + # Domains + result['domains'] = [] + for d in self.domains: + result['domains'].append(domains[d]) + + # Admins + result['admins'] = [] + for a in self.admins: + result['admins'].append(persons[a]) + + # Networks + result['networks'] = self.ip_blocks + + return result + class Domain(): """A simple domain definition""" @@ -121,6 +144,7 @@ class DataXML(Data): else: person.data[e.tag] = e.text + print("[+] Read person: {0} - {1} - {2}".format(person.name, person.surname, person.email)) self.persons[elem.attrib['id']] = person def add_domain(self, elem): @@ -129,10 +153,11 @@ class DataXML(Data): domain = Domain() for e in elem: if e.tag == 'name': - domain.name == e.text + domain.name = e.text else: domain.data[e.tag] = e.text + print("[+] Read domain: {}".format(domain.name)) self.domains[elem.attrib['id']] = domain def add_network(self, elem): diff --git a/pywhoisd.conf b/pywhoisd.conf index d4523bf..b18da39 100644 --- a/pywhoisd.conf +++ b/pywhoisd.conf @@ -6,7 +6,7 @@ classic = yes # Only makes sense when classic server is enabled classic_host = localhost -classic_port = 4343 +classic_port = 4344 # Run a web whois server? web = no -- cgit v1.2.3