hs: tweak search parameters, handle exceptions more gracefully

master
mutantmonkey 2011-08-31 14:05:47 -04:00
parent 8768c00063
commit eba3a3acd5
1 changed files with 36 additions and 29 deletions

View File

@ -1,53 +1,60 @@
#!/usr/bin/python2 #!/usr/bin/python2
""" """
hs.py - hokie stalker module hs.py - hokie stalker module
author: mutantmonkey <mutantmonkey@gmail.com> author: mutantmonkey <mutantmonkey@mutantmonkey.in>
""" """
import ldap import ldap
from urllib import quote as urlquote from urllib import quote as urlquote
LDAP_URI = "ldap://directory.vt.edu" LDAP_URI = "ldap://directory.vt.edu"
RESULTS_URL = "http://search.vt.edu/search/people.html?q={0}"
PERSON_URL = "http://search.vt.edu/search/person.html?person={0:d}"
l = ldap.initialize(LDAP_URI) l = ldap.initialize(LDAP_URI)
"""Search LDAP using the argument as a query. Argument must be a valid LDAP query.""" """Search LDAP using the argument as a query. Argument must be a valid LDAP query."""
def search(query): def search(query):
result = l.search_s('ou=People,dc=vt,dc=edu', ldap.SCOPE_SUBTREE, query) result = l.search_s('ou=People,dc=vt,dc=edu', ldap.SCOPE_SUBTREE, query)
if len(result) <= 0: if len(result) <= 0:
return False return False
return result return result
def hs(phenny, input): def hs(phenny, input):
""".hs <pid/name/email> - Search for someone on Virginia Tech People Search.""" """.hs <pid/name/email> - Search for someone on Virginia Tech People Search."""
q = input.group(2) q = input.group(2)
if q is None: if q is None:
return return
q = q.strip() q = q.strip()
results = RESULTS_URL.format(urlquote(q))
# initially try search by PID try:
s = search('uupid=%s' % q) s = search('(|(uupid={0})(mail={0})(cn={1}))'.format(q[0], ' '.join(q)))
if not s:
s = search('(|(uupid=*{0}*)(mail=*{0}*)(cn=*{1}*))'.format(q[0], '*'.join(q)))
except ldap.FILTER_ERROR:
phenny.reply('Filter error; try to avoid injection attacks in the future please.')
return
except ldap.SIZELIMIT_EXCEEDED:
phenny.reply('Too many results to display here; check out {0}'.format(results))
return
except ldap.TIMELIMIT_EXCEEDED:
phenny.reply('Time limit exceeded; check out {0}'.format(results))
return
# try partial search on CN if no results for PID if s:
if not s: if len(s) >1:
s = search('cn=*%s*' % '*'.join(q.split(' '))) phenny.reply("Multiple results found; try {0}".format(results))
else:
# try email address if no results found for PID or CN for dh, entry in s:
if not s: person = PERSON_URL.format(int(entry['uid'][0]))
s = search('mail=%s*' % q) phenny.reply("{0} - {1}".format(entry['cn'][0], person))
else:
if s: phenny.reply("No results found")
if len(s) >1:
phenny.reply("Multiple results found; try http://search.vt.edu/search/people.html?q=%s" % urlquote(q))
else:
for dh, entry in s:
phenny.reply("%s - http://search.vt.edu/search/person.html?person=%d" % (entry['cn'][0], int(entry['uid'][0])))
else:
phenny.reply("No results found")
hs.rule = (['hs'], r'(.*)') hs.rule = (['hs'], r'(.*)')
if __name__ == '__main__': if __name__ == '__main__':
print __doc__.strip() print __doc__.strip()