Skip to content

Commit

Permalink
Remove legacy_search related code and other dead code, add ability to…
Browse files Browse the repository at this point in the history
… sort domain table by column (needs testing), some style/code cleanup
  • Loading branch information
Mraoul committed Oct 4, 2018
1 parent cca8c8a commit 3fc0f8c
Show file tree
Hide file tree
Showing 16 changed files with 306 additions and 967 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -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
Expand Down
139 changes: 55 additions & 84 deletions pydat/pydat/ajax.py
Expand Up @@ -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')

Expand All @@ -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')
Expand All @@ -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:
Expand All @@ -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()))
Expand All @@ -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]
Expand All @@ -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')

Expand All @@ -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')
12 changes: 7 additions & 5 deletions pydat/pydat/forms.py
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand All @@ -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):
Expand Down
7 changes: 0 additions & 7 deletions pydat/pydat/handlers/__init__.py
Expand Up @@ -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()
Expand Down

0 comments on commit 3fc0f8c

Please sign in to comment.