From 3fc0f8c782235d977acf266da37a87b720217b47 Mon Sep 17 00:00:00 2001 From: Murad Khan Date: Thu, 4 Oct 2018 10:48:21 -0400 Subject: [PATCH] Remove legacy_search related code and other dead code, add ability to sort domain table by column (needs testing), some style/code cleanup --- README.md | 2 +- pydat/pydat/ajax.py | 139 ++--- pydat/pydat/forms.py | 12 +- pydat/pydat/handlers/__init__.py | 7 - pydat/pydat/handlers/es.py | 43 +- pydat/pydat/settings.py | 1 - pydat/pydat/static/js/domain.js | 563 ------------------ pydat/pydat/static/js/domain_advanced.js | 36 +- pydat/pydat/templates/base.html | 4 +- pydat/pydat/templates/domain.html | 38 +- .../templates/domain_advsearch_form.html | 128 ++-- pydat/pydat/templates/domain_results.html | 22 +- pydat/pydat/templates/domain_table.html | 4 +- pydat/pydat/templates/navigation_bar.html | 2 - pydat/pydat/urls.py | 27 +- pydat/pydat/views.py | 245 +++----- 16 files changed, 306 insertions(+), 967 deletions(-) delete mode 100644 pydat/pydat/static/js/domain.js diff --git a/README.md b/README.md index 713f4eb..50abf0b 100644 --- a/README.md +++ b/README.md @@ -333,7 +333,7 @@ This endpoint takes 4 parameters via a GET request: query - The query to search ES with size - The number of elements to return (aka page size) page - The page to return, combining this with size you can get the results in chunks - unique - Only accepted if ES scripting is enabled (read above) + unique - Attempts to return the latest entry per domainName **Note on the unique parameter**: If you're using the unique parameter, note that paging of results is disabled, but the size parameter will still be used diff --git a/pydat/pydat/ajax.py b/pydat/pydat/ajax.py index e33deff..ff518e5 100644 --- a/pydat/pydat/ajax.py +++ b/pydat/pydat/ajax.py @@ -7,84 +7,45 @@ from django.shortcuts import render_to_response, HttpResponse import urllib -from pydat.handlers import handler +from pydat.handlers import es as handler + def __renderErrorJSON__(message): context = {'success': False, - 'error': message - } - return HttpResponse(json.dumps(context), content_type='application/json') + 'error': message} + return HttpResponse(json.dumps(context), content_type='application/json') -def metadata(request, version = None): +def metadata(request, version=None): results = handler.metadata(version) - if results['success'] == False: + if not results['success']: return __renderErrorJSON__(results['message']) return HttpResponse(json.dumps(results), content_type='application/json') -def dataTable(request, key, value, low = None, high = None): +def advDataTable(request): if not request.is_ajax(): return __renderErrorJSON__('Expected AJAX') - if key is None or value is None: - return __renderErrorJSON__('Missing Key and/or Value') - - if key not in [keys[0] for keys in settings.SEARCH_KEYS]: - return __renderErrorJSON__('Invalid Key') - - - key = urllib.unquote(key) - value = urllib.unquote(value) - - #TODO Support Post -- need to add cooresponding form + # TODO Support Post -- need to add cooresponding form if request.method == "GET": + query = request.GET.get('query', '') page = int(request.GET.get('iDisplayStart', 0)) pagesize = int(request.GET.get('iDisplayLength', 50)) sortcols = int(request.GET.get('iSortingCols', 0)) sEcho = request.GET.get('sEcho') sSearch = request.GET.get('sSearch', '') + unique = request.GET.get('unique', 'false') sort = [] for x in range(sortcols): - sortTuple = handler.formatSort(int(request.GET.get("iSortCol_%d" % x)), - request.GET.get("sSortDir_%d" % x)) + sortTuple = handler.formatSort( + int(request.GET.get("iSortCol_%d" % x)), + request.GET.get("sSortDir_%d" % x)) if sortTuple is not None: sort.append(sortTuple) - - else: - return __renderErrorJSON__('Unsupported Method') - - if (len(sSearch) == 0): - sSearch = None - - try: - results = handler.dataTableSearch(key, value, page, pagesize, sort, sSearch, low, high) - except Exception as e: - return __renderErrorJSON__(str(e)) - - #Echo back the echo - results['sEcho'] = sEcho - - return HttpResponse(json.dumps(results), content_type='application/json') - - -def advDataTable(request): - if not request.is_ajax(): - return __renderErrorJSON__('Expected AJAX') - - #TODO Support Post -- need to add cooresponding form - if request.method == "GET": - query = request.GET.get('query', '') - page = int(request.GET.get('iDisplayStart', 0)) - pagesize = int(request.GET.get('iDisplayLength', 50)) - sortcols = int(request.GET.get('iSortingCols', 0)) - sEcho = request.GET.get('sEcho') - sSearch = request.GET.get('sSearch', '') - unique = request.GET.get('unique', 'false') - sort = [] else: return __renderErrorJSON__('Unsupported Method') @@ -97,20 +58,22 @@ def advDataTable(request): unique = False try: - results = handler.advDataTableSearch(query, page, pagesize, unique) + results = handler.advDataTableSearch( + query, page, pagesize, unique, sort) except Exception as e: return __renderErrorJSON__(str(e)) - #Echo back the echo + # Echo back the echo results['sEcho'] = sEcho - + return HttpResponse(json.dumps(results), content_type='application/json') + def advanced_search(request): if request.method == "GET": search_string = urllib.unquote(request.GET.get('query', None)) size = int(request.GET.get('size', 20)) - page = int(request.GET.get('page', 1)) + page = int(request.GET.get('page', 1)) unique = request.GET.get('unique', 'false') else: return __renderErrorJSON__('Unsupported Method') @@ -122,34 +85,34 @@ def advanced_search(request): if search_string is None: return __renderErrorJSON__("Query required") - + skip = (page - 1) * size try: results = handler.advanced_search(search_string, skip, size, unique) except Exception as e: return __renderErrorJSON__(str(e)) - if results['success'] == False: + if not results['success']: return __renderErrorJSON__(results['message']) return HttpResponse(json.dumps(results), content_type='application/json') def domains_latest(request, key, value): - return domains(request, key, value, low = handler.lastVersion()) + return domains(request, key, value, low=handler.lastVersion()) + -def domains(request, key, value, low = None, high = None): +def domains(request, key, value, low=None, high=None): if key is None or value is None: return __renderErrorJSON__('Missing Key and/or Value') if key not in [keys[0] for keys in settings.SEARCH_KEYS]: return __renderErrorJSON__('Invalid Key') - key = urllib.unquote(key) value = urllib.unquote(value) - - #TODO Support Post -- need to add cooresponding form + + # TODO Support Post -- need to add cooresponding form if request.method == "GET": limit = int(request.GET.get('limit', settings.LIMIT)) else: @@ -160,54 +123,63 @@ def domains(request, key, value, low = None, high = None): versionSort = True try: - results = handler.search(key, value, filt = None, low = low, high = high, versionSort = versionSort) + results = handler.search(key, value, filt=None, + low=low, high=high, versionSort=versionSort) except Exception as e: return __renderErrorJSON__(str(e)) - if results['success'] == False: + if not results['success']: return __renderErrorJSON__(results['message']) return HttpResponse(json.dumps(results), content_type='application/json') + def domain_latest(request, domainName): - return domain(request, domainName, low = handler.lastVersion()); + return domain(request, domainName, low=handler.lastVersion()) + -def domain(request, domainName = None, low = None, high = None): +def domain(request, domainName=None, low=None, high=None): if request.method == "GET": if not domainName: return __renderErrorJSON__('Requires Domain Name Argument') domainName = urllib.unquote(domainName) try: - results = handler.search('domainName', domainName, filt=None, low = low, high = high, versionSort = True) + results = handler.search( + 'domainName', domainName, filt=None, + low=low, high=high, versionSort=True) except Exception as e: return __renderErrorJSON__(str(e)) - return HttpResponse(json.dumps(results), content_type='application/json') + return HttpResponse(json.dumps(results), + content_type='application/json') else: return __renderErrorJSON__('Bad Method.') -def domain_diff(request, domainName = None, v1 = None, v2 = None): + +def domain_diff(request, domainName=None, v1=None, v2=None): if request.method == "GET": if not domainName or not v1 or not v2: return __renderErrorJSON__('Required Parameters Missing') domainName = urllib.unquote(domainName) try: - v1_res = handler.search('domainName', domainName, filt=None, low = v1) + v1_res = handler.search( + 'domainName', domainName, filt=None, low=v1) except Exception as e: return __renderErrorJSON__(str(e)) try: - v2_res = handler.search('domainName', domainName, filt=None, low = v2) + v2_res = handler.search( + 'domainName', domainName, filt=None, low=v2) except Exception as e: return __renderErrorJSON__(str(e)) try: v1_res = v1_res['data'][0] v2_res = v2_res['data'][0] - except: + except Exception as e: return __renderErrorJSON__("Did not find results") keylist = set(v1_res.keys()).union(set(v2_res.keys())) @@ -219,7 +191,7 @@ def domain_diff(request, domainName = None, v1 = None, v2 = None): output = {} data = {} - for key in keylist: + for key in keylist: if key in v1_res and key in v2_res: if v1_res[key] == v2_res[key]: data[key] = v1_res[key] @@ -228,17 +200,18 @@ def domain_diff(request, domainName = None, v1 = None, v2 = None): else: try: data[key] = [v1_res[key], ''] - except: + except Exception as e: data[key] = ['', v2_res[key]] - - output['success'] = True + + output['success'] = True output['data'] = data - return HttpResponse(json.dumps(output), content_type='application/json') + return HttpResponse(json.dumps(output), + content_type='application/json') else: return __renderErrorJSON__('Bad Method.') -def resolve(request, domainName = None): +def resolve(request, domainName=None): if domainName is None: return __renderErrorJSON__('Domain Name Required') @@ -252,12 +225,10 @@ def resolve(request, domainName = None): result = {'success': True, 'aliases': aliaslist, 'hostname': hostname, - 'ips': [] - } + 'ips': []} for ip in iplist: - ipo = { 'ip' : ip, - 'url' : reverse('pdns_r_rest', args=(ip,)) - } + ipo = {'ip': ip, + 'url': reverse('pdns_r_rest', args=(ip,))} result['ips'].append(ipo) return HttpResponse(json.dumps(result), content_type='application/json') diff --git a/pydat/pydat/forms.py b/pydat/pydat/forms.py index 13737fa..59ed3e7 100644 --- a/pydat/pydat/forms.py +++ b/pydat/pydat/forms.py @@ -2,8 +2,10 @@ import socket from django import forms from django.conf import settings -from pydat.handlers import handler -from pydat.handlers.passive import PDNS_UI_FIELDS_BASE, PDNS_UI_FIELDS_FORWARD, PDNS_UI_FIELDS_REVERSE +from pydat.handlers import es as handler +from pydat.handlers.passive import (PDNS_UI_FIELDS_BASE, + PDNS_UI_FIELDS_FORWARD, + PDNS_UI_FIELDS_REVERSE) import urllib class domain_form(forms.Form): @@ -33,7 +35,7 @@ def __init__(self, *args, **kwargs): self.fields['filt'].choices = settings.SEARCH_KEYS for field in self.fields.values(): - field.error_messages = {'required':'%s is required' % field.label, + field.error_messages = {'required':'%s is required' % field.label, 'invalid_choice': '%s is invalid' % field.label} def clean_latest(self): @@ -87,7 +89,7 @@ def __init__(self, *args, **kwargs): for field in self.fields.values(): field.error_messages = { - 'required':'%s is required' % field.label, + 'required':'%s is required' % field.label, 'invalid_choice': '%s is invalid' % field.label} def clean_unique(self): @@ -105,7 +107,7 @@ def clean_query(self): raise forms.ValidationError("Unable to unquote query") result = handler.test_query(query) if result is not None: - raise forms.ValidationError("Unable to parse query: %s" % result) + raise forms.ValidationError("Unable to parse query: %s" % result) return query class ChoiceNumberField(forms.ChoiceField): diff --git a/pydat/pydat/handlers/__init__.py b/pydat/pydat/handlers/__init__.py index 61382be..da9baa3 100644 --- a/pydat/pydat/handlers/__init__.py +++ b/pydat/pydat/handlers/__init__.py @@ -4,13 +4,6 @@ from django.conf import settings import passive -try: - (file, pathname, description) = imp.find_module(settings.HANDLER, [os.path.dirname(__file__)]) - handler = imp.load_module(settings.HANDLER, file, pathname, description) -except Exception, e: - tb = traceback.format_exc() - raise Exception(tb) - try: passive.initialize() diff --git a/pydat/pydat/handlers/es.py b/pydat/pydat/handlers/es.py index 0102644..fbaaaee 100644 --- a/pydat/pydat/handlers/es.py +++ b/pydat/pydat/handlers/es.py @@ -238,6 +238,8 @@ def formatSort(colID, direction): sort_key = "details.registrant_telephone" elif(colID == 6): sort_key = "dataVersion" + elif(colID == 7): + sort_key = "_score" if direction == "desc": sort_dir = "desc" @@ -385,16 +387,43 @@ def dataTableSearch(key, value, skip, pagesize, sortset, sfilter, low, high): return results -def __createAdvancedQuery__(query, skip, size, unique): +def __createAdvancedQuery__(query, skip, size, unique, sort=None): q = yacc.parse(query) if not unique: - q['sort'] = [{'_score': {'order': 'desc'}}, - {'domainName': {'order': 'asc'}}, - {'dataVersion': {'order': 'desc'}}, + if sort is not None and len(sort) > 0: + sortParams = list() + fields = set() + for (field, direction) in sort: + fields.add(field) + sortParams.append({field: {'order': direction}}) + if field == 'dataVersion': + sortParams.append({'updateVersion': + {'order': 'desc', + 'missing': 0, + 'unmapped_type': 'long'}}) + + if '_score' not in fields: + sortParams.append({"_score": {'order': 'desc'}}) + + if 'domainName' not in fields: + sortParams.append({"domainName": {'order': 'asc'}}) + + if 'dataVersion' not in fields: + sortParams.extend( + [{'dataVersion': {'order': 'desc'}}, {'updateVersion': {'order': 'desc', 'missing': 0, - 'unmapped_type': 'long'}}] + 'unmapped_type': 'long'}}]) + else: + sortParams = [ + {'_score': {'order': 'desc'}}, + {'domainName': {'order': 'asc'}}, + {'dataVersion': {'order': 'desc'}}, + {'updateVersion': {'order': 'desc', + 'missing': 0, + 'unmapped_type': 'long'}}] + q['sort'] = sortParams q['size'] = size q['from'] = skip else: @@ -418,7 +447,7 @@ def __createAdvancedQuery__(query, skip, size, unique): return q -def advDataTableSearch(query, skip, pagesize, unique=False): +def advDataTableSearch(query, skip, pagesize, unique=False, sort=None): results = {'success': False} results['aaData'] = [] @@ -429,7 +458,7 @@ def advDataTableSearch(query, skip, pagesize, unique=False): return results try: - q = __createAdvancedQuery__(query, skip, pagesize, unique) + q = __createAdvancedQuery__(query, skip, pagesize, unique, sort) except Exception as e: results['message'] = str(e) return results diff --git a/pydat/pydat/settings.py b/pydat/pydat/settings.py index c429a13..69213a8 100644 --- a/pydat/pydat/settings.py +++ b/pydat/pydat/settings.py @@ -12,7 +12,6 @@ SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) -HANDLER = 'es' ES_URI = 'localhost:9200' ES_INDEX_PREFIX = 'pydat' ES_USER = None diff --git a/pydat/pydat/static/js/domain.js b/pydat/pydat/static/js/domain.js deleted file mode 100644 index 7228221..0000000 --- a/pydat/pydat/static/js/domain.js +++ /dev/null @@ -1,563 +0,0 @@ -$(document).ready(function() { - - //hide the search menu by default - //search_toggle(0); - - $("#dialog").dialog({ - "width" : ($(window).width() * .8), - "height": 640, - "autoOpen": false, - "modal": true, - "open": function(event, ui) { - $(this).parent().css('position', 'fixed'); - }, - }); - - $("#statusDialog").dialog({ - "modal" : true, - "height": 100, - "width": 400, - "autoOpen": false, - "open": function(event, ui) { - $(this).parent().css('position', 'fixed'); - }, - }); - - var ajax_url = dataTable_url + key + "/" + value + "/" + low_version + "/" + high_version + "/?csrfmiddlewaretoken=" + csrf_token; - var dTable = $('.dnsres').dataTable( - { - "bJQueryUI": true, - "bProcessing": true, - "bServerSide": true, - "sAjaxSource": ajax_url, - "bAutoWidth": false, - "oLanguage": {'sSearch': 'Filter:', - 'sProcessing' : 'Fetching Data', - 'sZeroRecords': 'No Results Found', - }, - "sDom" : '<"H"lfirp>t<"F"lfip>', - "aoColumnDefs":[ - {"sClass": "dtExpand", 'bSortable': false, 'aTargets': [0]}, - //{'bSortable': false, 'aTargets': [6]}, - {"sClass": "dnCell", 'aTargets': [1]}, - ], -/* - "aoColumns" : [ - {"sClass": "dtExpand", 'bSortable': false}, - {"sClass": "dnCell"}, - null, - null, - null, - null - ], -*/ - "sPaginationType": "full_numbers", - "iDisplayLength" : 50, - //Called after ever row is written but not drawn - "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull) { - - var oldVersion = ''; - if (+aData[6] < +latest_version){ - oldVersion = 'oldVersion'; - } - - //Add expand icon - $("td:eq(0)", nRow).html(''); - - var domainName = aData[1]; - $('td:eq(1)', nRow).html( '' - + domainName + "").attr('title', 'Click to Search Passive DNS').addClass(oldVersion); - var registrant = aData[2]; - $('td:eq(2)', nRow).html( '' - + registrant + '').attr('title', 'Click to search by Registrant').addClass(oldVersion); - - var reg_email = aData[3]; - $('td:eq(3)', nRow).html( '' + reg_email + '').attr('title', 'Click to search by Email').addClass(oldVersion); - - $('td:eq(4)', nRow).addClass(oldVersion); - - var telephone = aData[5]; - $('td:eq(5)', nRow).html( '' - + telephone + '').attr('title', 'Click to search by Telephone').addClass(oldVersion); - - $('td:eq(6)', nRow).addClass(oldVersion); - - }, - //Called after table is drawn - "fnDrawCallback": function(oSettings) { - //Add an onclick toggle for the expand cells - $('td.dtExpand span').on('click', function () { - var nTr = $(this).parents('tr')[0]; - if (dTable.fnIsOpen(nTr)){ //Close the row - $(this).removeClass('ui-icon-circle-minus').addClass('ui-icon-circle-plus'); - dTable.fnClose(nTr); - }else { //Open the row - $(this).removeClass('ui-icon-circle-plus').addClass('ui-icon-circle-minus'); - dTable.fnOpen(nTr, fnFormatDetails(dTable, nTr), 'details'); - - //Get a reference to the new table - var dTab = $(this).parents("tr").next().find(".detailTable"); - $(dTab).tabs(); - - var entry_version = dTable.fnGetData(nTr)[6]; - //Fill in the table with some details - get_domain(dTable.fnGetData(nTr)[1], entry_version, dTab.find(".domain_quick")); - get_historical(dTable.fnGetData(nTr)[1], entry_version, dTab.find(".historyTable")); - - //dTab.find(".fullDetail").on("click", function(){ - // full($(this).attr('domainName'), entry_version); - //}); - - dTab.find(".resolve").on("click", function() { - //Disable Tooltip, onclick, and link class - $(this).removeClass('link'); - $(this).tooltip( "option", "disabled", true ); - $(this).off("click"); - resolve($(this).attr('domainName'), $(this)); - }).tooltip(); - } - }); - - $('.dnsres').tooltip({ items: 'td[title]' }); - } - }); - - dTable.dataTable().fnSetFilteringDelay(1000); - -}); - - - -function fnFormatDetails ( oTable, nTr ) -{ - var aData = oTable.fnGetData( nTr ); - - curr_id = Math.random().toString(36).substring(8); - hist_id = Math.random().toString(36).substring(8); - - var dTable ='
'; - - dTable += '' - - - - dTable += '
'; - - dTable += '
'; - - dTable += '
'; - dTable += ' '; - dTable += '
'; - - dTable += '
'; - dTable += 'Fetching Data'; - dTable += '
'; - - - dTable += '
'; - dTable += 'Click To Get Full Details'; - dTable += '
'; - - dTable += '
'; //domain_details - - dTable += '
'; - - dTable += '
'; - dTable += 'Active Resolution: '; - dTable += '
'; - - dTable += '
'; - dTable += 'Click Here to Actively Resolve'; - dTable += '
'; - - dTable += '
'; //active_resolution - - dTable += '
'; //current_details - - dTable += '
'; - - dTable += '
'; - dTable += 'Fetching History'; - dTable += '
'; - - dTable += '
'; //history_details - - dTable += '
'; //detailTable - - - return dTable; -} - -function full(domain, entry_version) { - var ep_url = domain_url + encodeURIComponent(domain) + "/" + entry_version + "/"; - $.ajax({ - type: 'GET', - url: ep_url, - datatype: 'json', - beforeSend: showStatusDialog, - complete: hideStatusDialog, - success: function(response) { - $("#dialog").dialog( "option", "title", domain); - if (response.success) { - $("#dtext").empty(); - - var result = response.data[0]; - var text = document.createElement('div'); - var dtab = document.createElement('table'); - - $(dtab).addClass('fullDetailTable'); - $(text).append(dtab); - $(dtab).html("NameValue"); - var dtabb = $(dtab).find("tbody"); - - //Sort the results in alphabetical order - sort_arr = []; - for (var key in result){ - sort_arr.push([key, result[key]]); - } - sort_arr.sort(function(a, b) { - return a[0].localeCompare(b[0]); - }); - - for (var i = 0; i < sort_arr.length; i++) { - var drow = document.createElement('tr'); - var kcell = document.createElement('td'); - $(kcell).addClass('fdKey'); - var vcell = document.createElement('td'); - $(vcell).addClass('fdValue'); - - $(kcell).html(sort_arr[i][0]); - $(vcell).html(sort_arr[i][1]); - - $(drow).append(kcell).append(vcell); - dtabb.append(drow); - } - - $("#dtext").append(text); - } else { - $("#dtext").append(response.error); - } - $("#dialog").dialog("open"); - } - }); -} - -function diff(domain, v1, v2) { - var ep_url = domain_url + encodeURIComponent(domain) + "/diff/" + v1 + "/" + v2 + "/"; - $.ajax({ - type: 'GET', - url: ep_url, - datatype: 'json', - beforeSend: showStatusDialog, - complete: hideStatusDialog, - success: function(response) { - $("#dialog").dialog( "option", "title", domain + " " + v1 + " -> " + v2); - if (response.success) { - $("#dtext").empty(); - - var result = response.data; - var text = document.createElement('div'); - var dtab = document.createElement('table'); - - $(dtab).addClass('diffTable'); - $(text).append(dtab); - $(dtab).html("EntryVersion: " + v1 + "Version: " + v2 + ""); - var dtabb = $(dtab).find("tbody"); - - //Sort the results in alphabetical order - sort_arr = []; - for (var key in result){ - sort_arr.push([key, result[key]]); - } - sort_arr.sort(function(a, b) { - return a[0].localeCompare(b[0]); - }); - - for (var i = 0; i < sort_arr.length; i++) { - var drow = document.createElement('tr'); - var kcell = document.createElement('td'); - $(kcell).addClass('fdKey'); - var vcell = document.createElement('td'); - $(vcell).addClass('fdValue'); - var vcell2 = document.createElement('td'); - $(vcell2).addClass('fdValue'); - - $(kcell).html(sort_arr[i][0]); - - if (sort_arr[i][1] instanceof Array){ - $(vcell).html(sort_arr[i][1][0]); - $(vcell2).html(sort_arr[i][1][1]); - $(vcell).addClass('changed') - $(vcell2).addClass('changed') - }else{ - $(vcell).html(sort_arr[i][1]); - $(vcell2).html(sort_arr[i][1]); - } - - $(drow).append(kcell).append(vcell).append(vcell2); - dtabb.append(drow); - } - - $("#dtext").append(text); - } else { - $("#dtext").append(response.error); - } - $("#dialog").dialog("open"); - } - }); -} - - -function get_historical(domain, entry_version, target){ - var ep_url = domain_url + encodeURIComponent(domain) + "/"; - $.ajax({ - type: 'GET', - url: ep_url, - datatype: 'json', - beforeSend: showStatusDialog, - complete: hideStatusDialog, - success: function(response) { - if (response.success) { - var result = response.data; - - $(target).empty(); - - - var htable = document.createElement('table'); - $(htable).html("Historical RecordsVersionRegistrantEmailCreatedTelephoneDetailsDiff") - var hbody = document.createElement('tbody'); - $(htable).append(hbody); - - if (result.length == 1) { //Can't be zero - //No Historical Records - var hrow = document.createElement('tr'); - var hcell = document.createElement('td'); - $(hcell).attr('colspan', '7'); - $(hcell).addClass('zerohistory'); - $(hcell).html("No Historical Records Found"); - $(hrow).append(hcell); - $(htable).append(hrow); - }else{ - for(var i = 0; i < result.length; i++){ - var hrow = document.createElement('tr'); - var tdclass = ""; - - if(+(result[i].Version) == +entry_version){ - tdclass = "bold"; - } - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - $(hcell).html(result[i].Version); - $(hrow).append(hcell); - - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - $(hcell).html(result[i].registrant_name); - $(hrow).append(hcell); - - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - $(hcell).html(result[i].contactEmail); - $(hrow).append(hcell); - - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - $(hcell).html(result[i].standardRegCreatedDate); - $(hrow).append(hcell); - - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - $(hcell).html(result[i].registrant_telephone); - $(hrow).append(hcell); - - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - if(+entry_version == result[i].Version){ - $(hcell).html(' '); - }else{ - $(hcell).html('Click'); - } - $(hrow).append(hcell); - - var inner = " " - if (i != 0){ - inner = '' + result[i - 1].Version + " > " + result[i].Version + ''; - } - - var hcell = document.createElement('td'); - $(hcell).addClass(tdclass); - $(hcell).html(inner); - $(hrow).append(hcell); - - - $(htable).append(hrow); - } - } - $(target).append(htable); - - var dTab = $(target).parents("tr").find(".detailTable"); - dTab.find(".fullDetail").on("click", function(){ - full($(this).attr('domainName'), entry_version); - }); - dTab.find(".diff").on("click", function(){ - diff($(this).attr('domainName'), $(this).attr('version1'), $(this).attr('version2')); - }); - } else { - $(target).html(response.error); - } - } - }); -} - - -function get_domain(domain, entry_version, target) { - var ep_url = domain_url + encodeURIComponent(domain) + "/" + entry_version + "/"; - $.ajax({ - type: 'GET', - url: ep_url, - datatype: 'json', - beforeSend: showStatusDialog, - complete: hideStatusDialog, - success: function(response) { - if (response.success) { - var result = response.data[0]; - - $(target).empty(); - - var reg_div = document.createElement('div'); - $(reg_div).addClass('qdtable'); - $(reg_div).append(create_registrant_table(result)); - - var adm_div = document.createElement('div'); - $(adm_div).addClass('qdtable'); - $(adm_div).append(create_adminContact_table(result)); - - var date_div = document.createElement('div'); - $(date_div).addClass('qdtable'); - $(date_div).append(create_dates_table(result)); - - $(target).append(reg_div); - $(target).append(adm_div); - $(target).append(date_div); - } else { - $(target).html(response.error); - } - } - }); -} - -function create_registrant_table(raw_data){ - var registrant_p1 = ['name', 'organization', 'street1','street2','street3','street4'] - var registrant_p2 = ['city', 'state', 'postalCode', 'country'] - - var regtab = document.createElement('table'); - $(regtab).html("Registrant Contact"); - var regbod = document.createElement('tbody'); - $(regtab).append(regbod); - - registrant_p1.forEach(function(piece){ - var index = "registrant_" + piece - if (index in raw_data && (raw_data[index] != "")){ - var ptr= document.createElement('tr'); - var ptd= document.createElement('td'); - $(ptr).append(ptd); - $(ptd).html(raw_data[index]); - $(regbod).append(ptr); - } - }); - - var ptr= document.createElement('tr'); - var ptd= document.createElement('td'); - $(ptr).append(ptd); - - registrant_p2.forEach(function(piece){ - var index = "registrant_" + piece - if (index in raw_data && (raw_data[index] != "")){ - $(ptd).html($(ptd).html() + " " + raw_data[index]); - $(regbod).append(ptr); - } - }); - - return $(regtab); -} - -function create_adminContact_table(raw_data){ - var adminContact_p1 = ['name', 'organization', 'street1','street2','street3','street4'] - var adminContact_p2 = ['city', 'state', 'postalCode', 'country'] - - var admtab = document.createElement('table'); - $(admtab).html("Administrative Contact"); - var admbod = document.createElement('tbody'); - $(admtab).append(admbod); - - adminContact_p1.forEach(function(piece){ - var index = "administrativeContact_" + piece; - if (index in raw_data && (raw_data[index] != "")){ - var ptr= document.createElement('tr'); - var ptd= document.createElement('td'); - $(ptr).append(ptd); - $(ptd).html(raw_data[index]); - $(admbod).append(ptr); - } - }); - - var ptr= document.createElement('tr'); - var ptd= document.createElement('td'); - $(ptr).append(ptd); - - adminContact_p2.forEach(function(piece){ - var index = "administrativeContact_" + piece - if (index in raw_data && (raw_data[index] != "")){ - $(ptd).html($(ptd).html() + " " + raw_data[index]); - $(admbod).append(ptr); - } - }); - - return $(admtab); -} - -function create_dates_table(raw_data){ - var dates = ['CreatedDate', 'UpdatedDate', 'ExpiresDate']; - - var dtab = document.createElement('table'); - $(dtab).html("Significant Dates"); - var dbod = document.createElement('tbody'); - $(dtab).append(dbod); - - dates.forEach(function(piece){ - var index = "standardReg" + piece; - if (index in raw_data && (raw_data[index] != "")){ - var dtr = document.createElement('tr'); - var dti = document.createElement('td'); - var dtd = document.createElement('td'); - $(dtr).append(dti); - $(dti).html(piece); - $(dtr).append(dtd); - $(dtd).html(raw_data[index]); - $(dbod).append(dtr); - } - }); - - return $(dtab); -} - -var statusDialogStack = 0; - -function showStatusDialog(){ - $("#statusDialog").dialog("open"); - statusDialogStack += 1; -} - -function hideStatusDialog(){ - statusDialogStack -= 1; - if(statusDialogStack == 0){ - $("#statusDialog").dialog("close"); - } - -} diff --git a/pydat/pydat/static/js/domain_advanced.js b/pydat/pydat/static/js/domain_advanced.js index f8c7595..cd4f0ce 100644 --- a/pydat/pydat/static/js/domain_advanced.js +++ b/pydat/pydat/static/js/domain_advanced.js @@ -35,7 +35,7 @@ $(document).ready(function() { aoData.push( { "name": "unique", "value": query_unique} ); }, "oLanguage": { - 'sProcessing' : 'Fetching Data', + 'sProcessing' : 'Fetching Data', 'sZeroRecords': 'No Results Found', }, "sDom" : '<"H"lirp>t<"F"lip>', @@ -43,7 +43,7 @@ $(document).ready(function() { {"sClass": "dtExpand", 'bSortable': false, 'aTargets': [0]}, //{'bSortable': false, 'aTargets': [6]}, {"sClass": "dnCell", 'aTargets': [1]}, - {'bSortable': false, 'aTargets': [0,1,2,3,4,5,6,7]}, + {'bSortable': false, 'aTargets': [0]}, ], /* "aoColumns" : [ @@ -70,13 +70,13 @@ $(document).ready(function() { $("td:eq(0)", nRow).html(''); var domainName = aData[1]; - $('td:eq(1)', nRow).html( '' + $('td:eq(1)', nRow).html( '' + domainName + "").attr('title', 'Click to Search Passive DNS').addClass(oldVersion); var registrant = aData[2]; if (registrant != null) var safe_registrant = encodeURIComponent(registrant.toLowerCase()) - $('td:eq(2)', nRow).html( '' + $('td:eq(2)', nRow).html( '' + registrant + '').attr('title', 'Click to search by Registrant').addClass(oldVersion); var reg_email = aData[3]; @@ -88,7 +88,7 @@ $(document).ready(function() { $('td:eq(4)', nRow).addClass(oldVersion); var telephone = aData[5]; - $('td:eq(5)', nRow).html( '' + telephone + '').attr('title', 'Click to search by Telephone').addClass(oldVersion); @@ -97,12 +97,12 @@ $(document).ready(function() { }, //Called after table is drawn - "fnDrawCallback": function(oSettings) { + "fnDrawCallback": function(oSettings) { //Add an onclick toggle for the expand cells $('td.dtExpand span').on('click', function () { var nTr = $(this).parents('tr')[0]; if (dTable.fnIsOpen(nTr)){ //Close the row - $(this).removeClass('ui-icon-circle-minus').addClass('ui-icon-circle-plus'); + $(this).removeClass('ui-icon-circle-minus').addClass('ui-icon-circle-plus'); dTable.fnClose(nTr); }else { //Open the row $(this).removeClass('ui-icon-circle-plus').addClass('ui-icon-circle-minus'); @@ -134,7 +134,7 @@ $(document).ready(function() { $('.dnsres').tooltip({ items: 'td[title]' }); } }); - + dTable.dataTable().fnSetFilteringDelay(1000); @@ -256,7 +256,7 @@ function full(domain, entry_version) { //Sort the results in alphabetical order sort_arr = []; for (var key in result){ - sort_arr.push([key, result[key]]); + sort_arr.push([key, result[key]]); } sort_arr.sort(function(a, b) { return a[0].localeCompare(b[0]); @@ -275,7 +275,7 @@ function full(domain, entry_version) { $(drow).append(kcell).append(vcell); dtabb.append(drow); } - + $("#dtext").append(text); } else { $("#dtext").append(response.error); @@ -310,7 +310,7 @@ function diff(domain, v1, v2) { //Sort the results in alphabetical order sort_arr = []; for (var key in result){ - sort_arr.push([key, result[key]]); + sort_arr.push([key, result[key]]); } sort_arr.sort(function(a, b) { return a[0].localeCompare(b[0]); @@ -340,7 +340,7 @@ function diff(domain, v1, v2) { $(drow).append(kcell).append(vcell).append(vcell2); dtabb.append(drow); } - + $("#dtext").append(text); } else { $("#dtext").append(response.error); @@ -367,7 +367,7 @@ function get_historical(domain, entry_version, target){ var htable = document.createElement('table'); - $(htable).html("Historical RecordsVersionRegistrantEmailCreatedTelephoneDetailsDiff") + $(htable).html("Historical RecordsVersionRegistrantEmailCreatedTelephoneDetailsDiff") var hbody = document.createElement('tbody'); $(htable).append(hbody); @@ -480,10 +480,10 @@ function get_domain(domain, entry_version, target) { success: function(response) { if (response.success) { var result = response.data[0]; - + $(target).empty(); - var reg_div = document.createElement('div'); + var reg_div = document.createElement('div'); $(reg_div).addClass('qdtable'); $(reg_div).append(create_registrant_table(result)); @@ -595,7 +595,7 @@ function create_dates_table(raw_data){ $(dtd).html(raw_data[index]); $(dbod).append(dtr); } - }); + }); return $(dtab); } @@ -604,7 +604,7 @@ var statusDialogStack = 0; function showStatusDialog(){ $("#statusDialog").dialog("open"); - statusDialogStack += 1; + statusDialogStack += 1; } function hideStatusDialog(){ diff --git a/pydat/pydat/templates/base.html b/pydat/pydat/templates/base.html index 3b687b4..d0e7f01 100644 --- a/pydat/pydat/templates/base.html +++ b/pydat/pydat/templates/base.html @@ -39,9 +39,7 @@ {% block searchBar %} {% endblock %} - {% if handler == 'es' %} - {% include 'status_part.html' %} - {% endif %} + {% include 'status_part.html' %} diff --git a/pydat/pydat/templates/domain.html b/pydat/pydat/templates/domain.html index d68acc4..ced2784 100644 --- a/pydat/pydat/templates/domain.html +++ b/pydat/pydat/templates/domain.html @@ -6,42 +6,26 @@ - + {% endblock %} {% block js %} {%endblock %} {% block searchBar %} - {% if legacy_search %} - {% include 'domain_search_form.html' %} - {% else %} - {% include 'domain_advsearch_form.html' %} - {% endif %} + {% include 'domain_advsearch_form.html' %} {% endblock %} {% block errors %} - {% if legacy_search %} - {% for field in domain_form %} - {% if field.errors %} - {% for error in field.errors %} - - {{ error }} - - {% endfor %} - {% endif %} - {% endfor %} - {% else %} - {% for field in advdomain_form %} - {% if field.errors %} - {% for error in field.errors %} - - {{ error }} - - {% endfor %} - {% endif %} - {% endfor %} - {% endif %} + {% for field in advdomain_form %} + {% if field.errors %} + {% for error in field.errors %} + + {{ error }} + + {% endfor %} + {% endif %} + {% endfor %} {% if error %} {{ error }} diff --git a/pydat/pydat/templates/domain_advsearch_form.html b/pydat/pydat/templates/domain_advsearch_form.html index 46297a9..9f94253 100644 --- a/pydat/pydat/templates/domain_advsearch_form.html +++ b/pydat/pydat/templates/domain_advsearch_form.html @@ -1,65 +1,63 @@ - {% if handler == 'es' %} -
- {% if advdomain_form %} -
- {% csrf_token %} - - - - - - - -
- {{ advdomain_form.query}} - - -
- - - - - - - -
- - - {{ advdomain_form.unique }} -
- - - - - - - - - - - -
- - - {{ advdomain_form.fmt }} - -
- -
-
-
- {{ domain_form.limit }} -
-
-
- -
-
-
- {{ domain_form.filt }} -
-
-
- {% endif %} -
- {% endif %} +
+{% if advdomain_form %} +
+ {% csrf_token %} + + + + + + + +
+ {{ advdomain_form.query}} + + +
+ + + + + + + +
+ + + {{ advdomain_form.unique }} +
+ + + + + + + + + + + +
+ + + {{ advdomain_form.fmt }} + +
+ +
+
+
+ {{ domain_form.limit }} +
+
+
+ +
+
+
+ {{ domain_form.filt }} +
+
+
+{% endif %} +
diff --git a/pydat/pydat/templates/domain_results.html b/pydat/pydat/templates/domain_results.html index 3b8f742..5060e82 100644 --- a/pydat/pydat/templates/domain_results.html +++ b/pydat/pydat/templates/domain_results.html @@ -8,35 +8,19 @@ var active = 'domain'; var domain_url = "{% url 'ajax_domain' %}"; var pdns_rest = "{% url 'pdns_results' %}"; - {% if legacy_search %} - var dataTable_url = "{% url 'ajax_dataTable' %}"; - var key = "{{ key }}"; - var value = "{{ value }}"; - var low_version = {{ low_version }}; - var high_version = {{ high_version }}; - {% else %} var advdomains = "{% url 'advdomains' %}"; var advDataTable_url = "{% url 'ajax_advDataTable' %}"; - var query_string = "{{ search_string }}"; + var query_string = "{{ search_string }}"; var query_unique = {{ query_unique }}; - {% endif %} {% endblock %} {% block js %} - {% if legacy_search %} - - {% else %} - - {% endif %} + {%endblock %} {% block searchBar %} - {% if legacy_search %} - {% include 'domain_search_form.html' %} - {% else %} - {% include 'domain_advsearch_form.html' %} - {% endif %} + {% include 'domain_advsearch_form.html' %} {% endblock %} {% block error %} diff --git a/pydat/pydat/templates/domain_table.html b/pydat/pydat/templates/domain_table.html index 0786261..dd060a3 100644 --- a/pydat/pydat/templates/domain_table.html +++ b/pydat/pydat/templates/domain_table.html @@ -8,9 +8,7 @@ Created Telephone Version - {% if not legacy_search %} - Score - {% endif %} + Score diff --git a/pydat/pydat/templates/navigation_bar.html b/pydat/pydat/templates/navigation_bar.html index 796062e..de0abda 100644 --- a/pydat/pydat/templates/navigation_bar.html +++ b/pydat/pydat/templates/navigation_bar.html @@ -10,14 +10,12 @@
  • Reverse pDNS
  • - {% if handler == 'es' %}
  • Stats
  • Help
  • - {% endif %} diff --git a/pydat/pydat/urls.py b/pydat/pydat/urls.py index 15c8702..d89d8d9 100644 --- a/pydat/pydat/urls.py +++ b/pydat/pydat/urls.py @@ -5,37 +5,36 @@ urlpatterns = [ url(r'^$', views.index, name='index'), - url(r'^domains/(?P.*)/(?P.*)/$', views.domains), - url(r'^domains/$', views.domains, name='domains'), - url(r'^pdns_results/(?P.*)/$', views.pdns, name='pdns_rest'), url(r'^pdns_results/$', views.pdns, name='pdns_results'), url(r'^pdns_search/$', views.pdns_index, name='pdns'), - url(r'^pdnsr_results/(?P.*)/$', views.pdns_r, name='pdns_r_rest'), + url(r'^pdnsr_results/(?P.*)/$', + views.pdns_r, name='pdns_r_rest'), url(r'^pdnsr_results/$', views.pdns_r, name='pdns_r_results'), url(r'^pdnsr_search/$', views.rpdns_index, name='pdns_r'), url(r'^ajax/metadata/$', ajax.metadata), url(r'^ajax/metadata/(?P.*)/$', ajax.metadata), - url(r'^ajax/domain/(?P.*)/diff/(?P.*)/(?P.*)/$', ajax.domain_diff), - url(r'^ajax/domain/(?P.*)/(?P.*)/(?P.*)/$', ajax.domain), + url(r'^ajax/domain/(?P.*)/diff/(?P.*)/(?P.*)/$', + ajax.domain_diff), + url(r'^ajax/domain/(?P.*)/(?P.*)/(?P.*)/$', + ajax.domain), url(r'^ajax/domain/(?P.*)/latest/$', ajax.domain_latest), url(r'^ajax/domain/(?P.*)/(?P.*)/$', ajax.domain), url(r'^ajax/domain/(?P.*)/$', ajax.domain), url(r'^ajax/domain/$', ajax.domain, name='ajax_domain'), - url(r'^ajax/domains/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', ajax.domains ), - url(r'^ajax/domains/(?P.*)/(?P.*)/latest/$', ajax.domains_latest ), - url(r'^ajax/domains/(?P.*)/(?P.*)/(?P.*)/$', ajax.domains ), - url(r'^ajax/domains/(?P.*)/(?P.*)/$', ajax.domains ), + url(r'^ajax/domains/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', + ajax.domains), + url(r'^ajax/domains/(?P.*)/(?P.*)/latest/$', + ajax.domains_latest), + url(r'^ajax/domains/(?P.*)/(?P.*)/(?P.*)/$', + ajax.domains), + url(r'^ajax/domains/(?P.*)/(?P.*)/$', ajax.domains), url(r'^ajax/domains/$', ajax.domains, name='ajax_domains'), - url(r'^ajax/dataTable/(?P.*)/(?P.*)/(?P.*)/(?P.*)/$', ajax.dataTable ), - url(r'^ajax/dataTable/$', ajax.dataTable, name='ajax_dataTable'), - - url(r'^ajax/resolve/(?P.*)/$', ajax.resolve), url(r'^ajax/resolve/$', ajax.resolve, name='ajax_resolve'), diff --git a/pydat/pydat/views.py b/pydat/pydat/views.py index d34e917..a2f94b8 100644 --- a/pydat/pydat/views.py +++ b/pydat/pydat/views.py @@ -11,9 +11,10 @@ from pydat.forms import (domain_form, advdomain_form, pdns_form_dynamic, rpdns_form_dynamic) -from pydat.handlers import handler +from pydat.handlers import es as handler from pydat.handlers import passive + def __renderErrorResponse__(request, view, message, data=None): d = {'error': message} if data is not None: @@ -31,26 +32,26 @@ def __renderErrorPage__(request, message, data=None): context = __createRequestContext__(d) return render(request, 'error.html', context=context) + def __createRequestContext__(data=None): - #Default to adding search forms to every context + # Default to adding search forms to every context search_f = domain_form() pdns_f_dyn = pdns_form_dynamic() rpdns_f_dyn = rpdns_form_dynamic() advdomain_f = advdomain_form() - ctx_var = { 'domain_form': search_f, - 'advdomain_form': advdomain_f, - 'pdns_form_dynamic': pdns_f_dyn, - 'rpdns_form_dynamic': rpdns_f_dyn, - 'latest_version': handler.lastVersion(), - 'handler': settings.HANDLER, - 'pdns_sources':[mod_data.config for mod_data in passive.PDNS_HANDLER_MODS.values()] - } + ctx_var = {'domain_form': search_f, + 'advdomain_form': advdomain_f, + 'pdns_form_dynamic': pdns_f_dyn, + 'rpdns_form_dynamic': rpdns_f_dyn, + 'latest_version': handler.lastVersion(), + 'pdns_sources': [ + mod_data.config + for mod_data in passive.PDNS_HANDLER_MODS.values()]} - if settings.HANDLER == 'es': - ctx_var['health'] = handler.cluster_health().capitalize() - ctx_var['record_count'] = handler.record_count() - ctx_var['last_import'] = handler.lastUpdate() + ctx_var['health'] = handler.cluster_health().capitalize() + ctx_var['record_count'] = handler.record_count() + ctx_var['last_import'] = handler.lastUpdate() if data is not None: ctx_var.update(data) @@ -64,22 +65,22 @@ def __createRequestContext__(data=None): return ctx_var + def index(request): - if settings.HANDLER == 'es': - legacy = False - else: - legacy = True - context = __createRequestContext__(data={'legacy_search': legacy}) - return render(request,'domain.html', context=context) + context = __createRequestContext__() + return render(request, 'domain.html', context=context) + def pdns_index(request): context = __createRequestContext__() - return render(request,'pdns.html', context=context) + return render(request, 'pdns.html', context=context) + def rpdns_index(request): context = __createRequestContext__() return render(request, 'rpdns.html', context=context) + def stats(request): stats = handler.cluster_stats() allversions = handler.metadata() @@ -87,7 +88,7 @@ def stats(request): lastimport = allversions['data'][-1] lastten = allversions['data'][-10:] else: - #XXX TODO returne error + # XXX TODO return error pass if lastten[0]['metadata'] == 0: @@ -105,17 +106,19 @@ def stats(request): return render(request, 'stats.html', context=context) + def help(request): try: f = open(settings.SITE_ROOT + "/../README.md") helptxt = f.read() f.close() - except: + except Exception as e: helptxt = "Unable to render help text." - context = __createRequestContext__(data = {'help': helptxt}) + context = __createRequestContext__(data={'help': helptxt}) return render(request, 'help.html', context=context) + def about(request): context = __createRequestContext__() return render(request, 'about.html', context=context) @@ -127,9 +130,10 @@ def advdomains(request): elif request.method == "GET": search_f = advdomain_form(QueryDict('')) search_f.data['query'] = request.GET.get('query', None) - search_f.data['fmt'] = request.GET.get('fmt','none') + search_f.data['fmt'] = request.GET.get('fmt', 'none') search_f.data['limit'] = request.GET.get('limit', settings.LIMIT) - search_f.data['filt'] = request.GET.get('filt', settings.SEARCH_KEYS[0][0]) + search_f.data['filt'] = request.GET.get( + 'filt', settings.SEARCH_KEYS[0][0]) search_f.data['unique'] = request.GET.get('unique', False) else: return __renderErrorResponse__( @@ -139,32 +143,32 @@ def advdomains(request): if not search_f.is_valid(): return __renderErrorResponse__( - request, - 'domain.html', - '', - {'advdomain_form': search_f, 'legacy_search': False}) + request, + 'domain.html', + '', + {'advdomain_form': search_f}) fmt = search_f.cleaned_data['fmt'] or 'none' search_string = search_f.cleaned_data['query'] query_unique = str(search_f.cleaned_data['unique']).lower() if fmt == 'none': - context = __createRequestContext__(data = {'search_string': urllib.quote(search_string) or '', - 'query_unique': query_unique, - 'advdomain_form': search_f, - 'legacy_search': False, - 'fmt': fmt}) + context = __createRequestContext__( + data={'search_string': urllib.quote(search_string) or '', + 'query_unique': query_unique, + 'advdomain_form': search_f, + 'fmt': fmt}) return render(request, 'domain_results.html', context=context) else: filt_key = search_f.cleaned_data['filt'] try: limit = int(search_f.cleaned_data.get('limit', settings.LIMIT)) - except: + except Exception as e: limit = settings.LIMIT filt = None - if fmt == 'list': #Only filter if a list was requested + if fmt == 'list': # Only filter if a list was requested filt = filt_key if query_unique == 'true': @@ -183,9 +187,10 @@ def advdomains(request): results['message']) if len(results['data']) == 0: - return __renderErrorResponse__(request, 'domain.html', 'No results') + return __renderErrorResponse__( + request, 'domain.html', 'No results') - if fmt =='json': + if fmt == 'json': data = [json.dumps(d) for d in results['data']] elif fmt == 'list': data = [d[filt_key] for d in results['data']] @@ -206,96 +211,28 @@ def advdomains(request): 'domain.html', 'Invalid Format') - context = __createRequestContext__(data={'search_string': urllib.quote(search_string) or '', - 'query_unique': str(query_unique).lower(), - 'advdomain_form': search_f, - 'legacy_search': False, - 'fmt': fmt, - 'data': data}) + context = __createRequestContext__( + data={'search_string': urllib.quote(search_string) or '', + 'query_unique': str(query_unique).lower(), + 'advdomain_form': search_f, + 'fmt': fmt, + 'data': data}) return render(request, 'domain_results.html', context=context) -def domains(request, key=None, value=None): - if request.method == "POST": - search_f = domain_form(request.POST) - - elif request.method == "GET": - search_f = domain_form(QueryDict('')) - search_f.data['key'] = key - search_f.data['value'] = value - search_f.data['fmt'] = request.GET.get('fmt','normal') - search_f.data['limit'] = request.GET.get('limit', settings.LIMIT) - search_f.data['filt'] = request.GET.get('filt', settings.SEARCH_KEYS[0][0]) - search_f.data['latest'] = request.GET.get('latest', False) - - else: - return __renderErrorPage__(request, 'Bad Method.') - - if not search_f.is_valid(): - return __renderErrorResponse__(request, 'domain.html', '', {'domain_form': search_f}) - - key = urllib.unquote(search_f.cleaned_data['key']) - value = urllib.unquote(search_f.cleaned_data['value']) - - filt_key = search_f.cleaned_data['filt'] - fmt = search_f.cleaned_data['fmt'] - limit = int(search_f.cleaned_data.get('limit', settings.LIMIT)) - latest = search_f.cleaned_data['latest'] - - if latest: - low_version = handler.lastVersion() - high_version = low_version - else: - low_version = None - high_version = None - - filt = None - if fmt == 'list': #Only filter if a list was requested - filt = filt_key - - #All web searches are AJAXy - if fmt == "normal": - low_version_js = low_version - high_version_js = high_version - if low_version == None: - low_version_js = 'null' - if high_version == None: - high_version_js = 'null' - context = __createRequestContext__(data = { - 'key': urllib.quote(key), - 'value': urllib.quote(value), - 'low_version': low_version_js, - 'high_version': high_version_js, - 'domain_form': search_f, - 'legacy_search': True,} - ) - return render(request,'domain_results.html', context=context) - - - else: - results = handler.search(key, value, filt=filt, limit=limit, low = low_version) - if results['success'] == False: - return __renderErrorPage__(request, results['message']) - if fmt == 'json': - return HttpResponse(json.dumps(results), content_type='application/json') - elif fmt == 'list': - data = '\n'.join([d[filt_key] for d in results['data']]) - return HttpResponse(data, content_type='text/plain') - else: - return __renderErrorPage__(request, 'Invalid Format.') - - def pdns(request, search_value=None): if request.method == 'POST': pdns_f_dyn = pdns_form_dynamic(request.POST) elif request.method == 'GET': pdns_f_dyn = pdns_form_dynamic(QueryDict('')) pdns_f_dyn.data['search_value'] = search_value - pdns_f_dyn.data['result_format'] = request.GET.get('result_format', 'none') + pdns_f_dyn.data['result_format'] = \ + request.GET.get('result_format', 'none') # Filling form with all empty fields for a forward passive-DNS request - for passive_field in passive.PDNS_UI_FIELDS_BASE + passive.PDNS_UI_FIELDS_FORWARD: + for passive_field in (passive.PDNS_UI_FIELDS_BASE + + passive.PDNS_UI_FIELDS_FORWARD): pdns_f_dyn.data[passive_field.django_field_name] = request.GET.get( passive_field.django_field_name, passive_field.field_value_default) @@ -306,28 +243,31 @@ def pdns(request, search_value=None): 'Bad Method') if not pdns_f_dyn.is_valid(): - return __renderErrorResponse__(request, - 'pdns.html', - 'Unable to verify form data', - data = {"passive_form": pdns_f_dyn}) + return __renderErrorResponse__( + request, + 'pdns.html', + 'Unable to verify form data', + data={"passive_form": pdns_f_dyn}) # Get clean values for all common passive form fields search_value = pdns_f_dyn.cleaned_data['search_value'] result_format = pdns_f_dyn.cleaned_data['result_format'] - dynamic_fields = {} # Obtain cleaned data for every passive-DNS field - for passive_field in passive.PDNS_UI_FIELDS_BASE + passive.PDNS_UI_FIELDS_FORWARD: + for passive_field in (passive.PDNS_UI_FIELDS_BASE + + passive.PDNS_UI_FIELDS_FORWARD): if passive_field.source_name not in dynamic_fields: dynamic_fields[passive_field.source_name] = {} - cleaned_value = pdns_f_dyn.cleaned_data[passive_field.django_field_name] + cleaned_value = pdns_f_dyn.cleaned_data[ + passive_field.django_field_name] # If user did not enter a required field, grab a defined default value if not cleaned_value: cleaned_value = passive_field.field_value_default - dynamic_fields[passive_field.source_name][passive_field.field_key] = cleaned_value + dynamic_fields[ + passive_field.source_name][passive_field.field_key] = cleaned_value results = passive.request_pdns(search_value, result_format, dynamic_fields) @@ -335,7 +275,7 @@ def pdns(request, search_value=None): return __renderErrorResponse__(request, 'pdns.html', results['error'], - data = {'passive_form': pdns_f_dyn ,}) + data={'passive_form': pdns_f_dyn}) context = __createRequestContext__(data={'results': results['responses'], 'inverse': False, @@ -345,29 +285,31 @@ def pdns(request, search_value=None): return render(request, 'pdns_results.html', context=context) -def pdns_r(request, search_value = None): +def pdns_r(request, search_value=None): if request.method == 'POST': rpdns_f_dyn = rpdns_form_dynamic(request.POST) - elif request.method == 'GET': # Craft a form to make it easier to validate + elif request.method == 'GET': # Craft a form to make it easier to validate rpdns_f_dyn = rpdns_form_dynamic(QueryDict('')) - rpdns_f_dyn.data['search_value']= search_value - rpdns_f_dyn.data['result_format'] = request.GET.get('result_format','none') + rpdns_f_dyn.data['search_value'] = search_value + rpdns_f_dyn.data['result_format'] = \ + request.GET.get('result_format', 'none') # Filling form with all empty fields for a reverse passive-DNS request - for passive_field in passive.PDNS_UI_FIELDS_BASE + passive.PDNS_UI_FIELDS_REVERSE: - rpdns_f_dyn.data[passive_field.django_field_name] = request.GET.get( - passive_field.django_field_name, - passive_field.field_value_default) + for passive_field in (passive.PDNS_UI_FIELDS_BASE + + passive.PDNS_UI_FIELDS_REVERSE): + rpdns_f_dyn.data[passive_field.django_field_name] = \ + request.GET.get(passive_field.django_field_name, + passive_field.field_value_default) else: return __renderErrorResponse__(request, - 'rpdns.html', - 'Unsupported Method') + 'rpdns.html', + 'Unsupported Method') if not rpdns_f_dyn.is_valid(): return __renderErrorResponse__(request, 'rpdns.html', 'Unable to verify form data', - data={'passive_form': rpdns_f_dyn}) + data={'passive_form': rpdns_f_dyn}) # Get clean values for all common reverse passive form fields search_value = rpdns_f_dyn.cleaned_data['search_value'] @@ -375,28 +317,35 @@ def pdns_r(request, search_value = None): dynamic_fields = {} # Obtain cleaned data for every reverse passive-DNS field - for passive_field in passive.PDNS_UI_FIELDS_BASE + passive.PDNS_UI_FIELDS_REVERSE: + for passive_field in (passive.PDNS_UI_FIELDS_BASE + + passive.PDNS_UI_FIELDS_REVERSE): if passive_field.source_name not in dynamic_fields: dynamic_fields[passive_field.source_name] = {} - cleaned_value = rpdns_f_dyn.cleaned_data[passive_field.django_field_name] - # If user did not enter a required field, grab field defined default value + cleaned_value = \ + rpdns_f_dyn.cleaned_data[passive_field.django_field_name] + # If user did not enter a required field, grab field + # defined default value if not cleaned_value: - cleaned_value = passive_field.field_value_default + cleaned_value = passive_field.field_value_default - dynamic_fields[passive_field.source_name][passive_field.field_key] = cleaned_value + dynamic_fields[ + passive_field.source_name][passive_field.field_key] = cleaned_value - results = passive.request_pdns_reverse(search_value, result_format, dynamic_fields) + results = passive.request_pdns_reverse(search_value, + result_format, + dynamic_fields) if not results['success']: - return __renderErrorResponse__(request, - 'rpdns.html', - results['error'], - data = {'rpdns_form_dynamic': rpdns_f_dyn}) + return __renderErrorResponse__( + request, + 'rpdns.html', + results['error'], + data={'rpdns_form_dynamic': rpdns_f_dyn}) context = __createRequestContext__(data={'results': results['responses'], 'inverse': True, 'rpdns_form_dynamic': rpdns_f_dyn, 'fmt': result_format}) - return render(request,'rpdns_results.html', context=context) + return render(request, 'rpdns_results.html', context=context)