diff --git a/LdapService.py b/LdapService.py index ab6ce82..99630e5 100755 --- a/LdapService.py +++ b/LdapService.py @@ -3,12 +3,16 @@ import time import random import mmap -import sys, getopt -from struct import pack -from collections import deque from os.path import dirname, realpath +import sys, getopt +reload(sys) +from sys import path, setdefaultencoding path.append(dirname(realpath(__file__)) + '/lib') +setdefaultencoding('utf-8') + +from struct import pack +from collections import deque from Server import Server @@ -136,7 +140,7 @@ def main(): server = Server( Application( - args[0], int(args[1], hosturi, binddn, basedn, password)) + args[0], int(args[1]), hosturi, binddn, basedn, password)) server.bindTcp(args[0], int(args[1]), Http()) server.start(1.0) diff --git a/LdapService2.py b/LdapService2.py index bc46da0..6dfae06 100755 --- a/LdapService2.py +++ b/LdapService2.py @@ -7,9 +7,9 @@ from struct import pack from collections import deque from os.path import dirname, realpath -import sys +import sys, getopt reload(sys) -from sys import argv, path, setdefaultencoding +from sys import path, setdefaultencoding path.append(dirname(realpath(__file__)) + '/lib') setdefaultencoding('utf-8') import re @@ -44,7 +44,12 @@ class Application(EventHandler): @property def _body(self): - return self._template.render(ldaptree=self._ldaptree).encode('utf8') + try: + return self._template.render(ldaptree=self._ldaptree).encode('utf8') + except UnicodeDecodeError as e: + print e.object + raise TypeError('failed') + def _handle_data(self, event): protocol = event.subject.getProtocol() @@ -114,7 +119,7 @@ def main(): server = Server( Application( - args[0], int(args[1], hosturi, binddn, basedn, password)) + args[0], int(args[1]), hosturi, binddn, basedn, password)) server.bindTcp(args[0], int(args[1]), Http()) server.start(1.0) diff --git a/ldaptree.py b/ldaptree.py index 66cfabf..9a21079 100755 --- a/ldaptree.py +++ b/ldaptree.py @@ -73,16 +73,20 @@ def main(): info = LdapTree(hosturi, binddn, basedn, password, use_gssapi) - if not creategraph: - if outfile: - info.text(outfile) - else: - print info.text() - else: - if outfile: - info.graph(outfile) + try: + if not creategraph: + if outfile: + info.text(outfile) + else: + print info.text() else: - print info.graph() + if outfile: + info.graph(outfile) + else: + print info.graph() + except UnicodeDecodeError as e: + print e.object + raise TypeError('failed') if __name__ == "__main__": main() diff --git a/lib/LdapTree.py b/lib/LdapTree.py index bd44136..0933b10 100644 --- a/lib/LdapTree.py +++ b/lib/LdapTree.py @@ -92,13 +92,36 @@ class LdapTree(object): return thislen + def _encode(self, data): + if type(data) is str: + try: + unicode(data, 'utf-8') + except UnicodeDecodeError: + data = data.encode('base64') + return data + @property def all(self): if self._data == None: self._data = {} result = self._ldap.search_s(self._basedn, ldap.SCOPE_SUBTREE) for entry in result: - self._data[entry[0]] = entry[1:][0] + if entry[1] is None: + self._data[entry[0]] = None + elif type(entry[1]) is str: + self._data[entry[0]] = self._encode(entry[1]) + elif type(entry[1]) is list: + self._data[entry[0]] = [self._encode(v) for v in entry[1]] + elif type(entry[1]) is dict: + self._data[entry[0]] = {} + for k in entry[1].keys(): + if type(entry[1][k]) is str: + self._data[entry[0]][k] = self._encode(entry[1]) + else: + self._data[entry[0]][k] = [ + self._encode(v) for v in entry[1][k]] + else: + raise TypeError("unsupported ldap type") return self._data @@ -107,12 +130,13 @@ class LdapTree(object): retval = {} for d in self.all.keys(): current = retval - for k in reversed(d.split(',')): - try: - current = current[k] - except: - current[k] = {} - current = current[k] + if d: + for k in reversed(d.split(',')): + try: + current = current[k] + except: + current[k] = {} + current = current[k] return retval @property diff --git a/templates/simple.html.j2 b/templates/simple.html.j2 index cdc8f04..d7b99cc 100644 --- a/templates/simple.html.j2 +++ b/templates/simple.html.j2 @@ -72,6 +72,9 @@ onclick="toggle(this, 'childs')">dn: {{ d[2]|e }} {% endfor -%}