Browse Source

handle binary data

master
Georg Hopp 10 years ago
parent
commit
3afb367149
  1. 12
      LdapService.py
  2. 11
      LdapService2.py
  3. 4
      ldaptree.py
  4. 26
      lib/LdapTree.py
  5. 4
      templates/simple.html.j2

12
LdapService.py

@ -3,12 +3,16 @@
import time import time
import random import random
import mmap import mmap
import sys, getopt
from struct import pack
from collections import deque
from os.path import dirname, realpath from os.path import dirname, realpath
import sys, getopt
reload(sys)
from sys import path, setdefaultencoding
path.append(dirname(realpath(__file__)) + '/lib') path.append(dirname(realpath(__file__)) + '/lib')
setdefaultencoding('utf-8')
from struct import pack
from collections import deque
from Server import Server from Server import Server
@ -136,7 +140,7 @@ def main():
server = Server( server = Server(
Application( 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.bindTcp(args[0], int(args[1]), Http())
server.start(1.0) server.start(1.0)

11
LdapService2.py

@ -7,9 +7,9 @@ from struct import pack
from collections import deque from collections import deque
from os.path import dirname, realpath from os.path import dirname, realpath
import sys
import sys, getopt
reload(sys) reload(sys)
from sys import argv, path, setdefaultencoding
from sys import path, setdefaultencoding
path.append(dirname(realpath(__file__)) + '/lib') path.append(dirname(realpath(__file__)) + '/lib')
setdefaultencoding('utf-8') setdefaultencoding('utf-8')
import re import re
@ -44,7 +44,12 @@ class Application(EventHandler):
@property @property
def _body(self): def _body(self):
try:
return self._template.render(ldaptree=self._ldaptree).encode('utf8') return self._template.render(ldaptree=self._ldaptree).encode('utf8')
except UnicodeDecodeError as e:
print e.object
raise TypeError('failed')
def _handle_data(self, event): def _handle_data(self, event):
protocol = event.subject.getProtocol() protocol = event.subject.getProtocol()
@ -114,7 +119,7 @@ def main():
server = Server( server = Server(
Application( 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.bindTcp(args[0], int(args[1]), Http())
server.start(1.0) server.start(1.0)

4
ldaptree.py

@ -73,6 +73,7 @@ def main():
info = LdapTree(hosturi, binddn, basedn, password, use_gssapi) info = LdapTree(hosturi, binddn, basedn, password, use_gssapi)
try:
if not creategraph: if not creategraph:
if outfile: if outfile:
info.text(outfile) info.text(outfile)
@ -83,6 +84,9 @@ def main():
info.graph(outfile) info.graph(outfile)
else: else:
print info.graph() print info.graph()
except UnicodeDecodeError as e:
print e.object
raise TypeError('failed')
if __name__ == "__main__": if __name__ == "__main__":
main() main()

26
lib/LdapTree.py

@ -92,13 +92,36 @@ class LdapTree(object):
return thislen 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 @property
def all(self): def all(self):
if self._data == None: if self._data == None:
self._data = {} self._data = {}
result = self._ldap.search_s(self._basedn, ldap.SCOPE_SUBTREE) result = self._ldap.search_s(self._basedn, ldap.SCOPE_SUBTREE)
for entry in result: 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 return self._data
@ -107,6 +130,7 @@ class LdapTree(object):
retval = {} retval = {}
for d in self.all.keys(): for d in self.all.keys():
current = retval current = retval
if d:
for k in reversed(d.split(',')): for k in reversed(d.split(',')):
try: try:
current = current[k] current = current[k]

4
templates/simple.html.j2

@ -72,6 +72,9 @@
onclick="toggle(this, 'childs')">dn: {{ d[2]|e }}</span> onclick="toggle(this, 'childs')">dn: {{ d[2]|e }}</span>
<button onclick="toggle(this, 'attributes')">[Attributes]</button> <button onclick="toggle(this, 'attributes')">[Attributes]</button>
<ul class="attributes"> <ul class="attributes">
{% if ldaptree.node(d[2]) is string -%}
<li>{{ ldaptree.node(d[2])|e }}</li>
{% else -%}
{% for k in ldaptree.node(d[2]).keys() -%} {% for k in ldaptree.node(d[2]).keys() -%}
{% if ldaptree.node(d[2]) is string -%} {% if ldaptree.node(d[2]) is string -%}
<li>{{ k }}: {{ ldaptree.node(d[2])[k]|e }}</li> <li>{{ k }}: {{ ldaptree.node(d[2])[k]|e }}</li>
@ -81,6 +84,7 @@
{% endfor -%} {% endfor -%}
{% endif -%} {% endif -%}
{% endfor -%} {% endfor -%}
{% endif -%}
</ul> </ul>
{% endfor -%} {% endfor -%}
</ul> </ul>

Loading…
Cancel
Save