Showing
5 changed files
with
65 additions
and
24 deletions
... | ... | @@ -3,12 +3,16 @@ |
3 | 3 | import time |
4 | 4 | import random |
5 | 5 | import mmap |
6 | -import sys, getopt | |
7 | -from struct import pack | |
8 | -from collections import deque | |
9 | 6 | |
10 | 7 | from os.path import dirname, realpath |
8 | +import sys, getopt | |
9 | +reload(sys) | |
10 | +from sys import path, setdefaultencoding | |
11 | 11 | path.append(dirname(realpath(__file__)) + '/lib') |
12 | +setdefaultencoding('utf-8') | |
13 | + | |
14 | +from struct import pack | |
15 | +from collections import deque | |
12 | 16 | |
13 | 17 | from Server import Server |
14 | 18 | |
... | ... | @@ -136,7 +140,7 @@ def main(): |
136 | 140 | |
137 | 141 | server = Server( |
138 | 142 | Application( |
139 | - args[0], int(args[1], hosturi, binddn, basedn, password)) | |
143 | + args[0], int(args[1]), hosturi, binddn, basedn, password)) | |
140 | 144 | server.bindTcp(args[0], int(args[1]), Http()) |
141 | 145 | server.start(1.0) |
142 | 146 | ... | ... |
... | ... | @@ -7,9 +7,9 @@ from struct import pack |
7 | 7 | from collections import deque |
8 | 8 | |
9 | 9 | from os.path import dirname, realpath |
10 | -import sys | |
10 | +import sys, getopt | |
11 | 11 | reload(sys) |
12 | -from sys import argv, path, setdefaultencoding | |
12 | +from sys import path, setdefaultencoding | |
13 | 13 | path.append(dirname(realpath(__file__)) + '/lib') |
14 | 14 | setdefaultencoding('utf-8') |
15 | 15 | import re |
... | ... | @@ -44,7 +44,12 @@ class Application(EventHandler): |
44 | 44 | |
45 | 45 | @property |
46 | 46 | def _body(self): |
47 | - return self._template.render(ldaptree=self._ldaptree).encode('utf8') | |
47 | + try: | |
48 | + return self._template.render(ldaptree=self._ldaptree).encode('utf8') | |
49 | + except UnicodeDecodeError as e: | |
50 | + print e.object | |
51 | + raise TypeError('failed') | |
52 | + | |
48 | 53 | |
49 | 54 | def _handle_data(self, event): |
50 | 55 | protocol = event.subject.getProtocol() |
... | ... | @@ -114,7 +119,7 @@ def main(): |
114 | 119 | |
115 | 120 | server = Server( |
116 | 121 | Application( |
117 | - args[0], int(args[1], hosturi, binddn, basedn, password)) | |
122 | + args[0], int(args[1]), hosturi, binddn, basedn, password)) | |
118 | 123 | server.bindTcp(args[0], int(args[1]), Http()) |
119 | 124 | server.start(1.0) |
120 | 125 | ... | ... |
... | ... | @@ -73,16 +73,20 @@ def main(): |
73 | 73 | |
74 | 74 | info = LdapTree(hosturi, binddn, basedn, password, use_gssapi) |
75 | 75 | |
76 | - if not creategraph: | |
77 | - if outfile: | |
78 | - info.text(outfile) | |
79 | - else: | |
80 | - print info.text() | |
81 | - else: | |
82 | - if outfile: | |
83 | - info.graph(outfile) | |
76 | + try: | |
77 | + if not creategraph: | |
78 | + if outfile: | |
79 | + info.text(outfile) | |
80 | + else: | |
81 | + print info.text() | |
84 | 82 | else: |
85 | - print info.graph() | |
83 | + if outfile: | |
84 | + info.graph(outfile) | |
85 | + else: | |
86 | + print info.graph() | |
87 | + except UnicodeDecodeError as e: | |
88 | + print e.object | |
89 | + raise TypeError('failed') | |
86 | 90 | |
87 | 91 | if __name__ == "__main__": |
88 | 92 | main() | ... | ... |
... | ... | @@ -92,13 +92,36 @@ class LdapTree(object): |
92 | 92 | |
93 | 93 | return thislen |
94 | 94 | |
95 | + def _encode(self, data): | |
96 | + if type(data) is str: | |
97 | + try: | |
98 | + unicode(data, 'utf-8') | |
99 | + except UnicodeDecodeError: | |
100 | + data = data.encode('base64') | |
101 | + return data | |
102 | + | |
95 | 103 | @property |
96 | 104 | def all(self): |
97 | 105 | if self._data == None: |
98 | 106 | self._data = {} |
99 | 107 | result = self._ldap.search_s(self._basedn, ldap.SCOPE_SUBTREE) |
100 | 108 | for entry in result: |
101 | - self._data[entry[0]] = entry[1:][0] | |
109 | + if entry[1] is None: | |
110 | + self._data[entry[0]] = None | |
111 | + elif type(entry[1]) is str: | |
112 | + self._data[entry[0]] = self._encode(entry[1]) | |
113 | + elif type(entry[1]) is list: | |
114 | + self._data[entry[0]] = [self._encode(v) for v in entry[1]] | |
115 | + elif type(entry[1]) is dict: | |
116 | + self._data[entry[0]] = {} | |
117 | + for k in entry[1].keys(): | |
118 | + if type(entry[1][k]) is str: | |
119 | + self._data[entry[0]][k] = self._encode(entry[1]) | |
120 | + else: | |
121 | + self._data[entry[0]][k] = [ | |
122 | + self._encode(v) for v in entry[1][k]] | |
123 | + else: | |
124 | + raise TypeError("unsupported ldap type") | |
102 | 125 | |
103 | 126 | return self._data |
104 | 127 | |
... | ... | @@ -107,12 +130,13 @@ class LdapTree(object): |
107 | 130 | retval = {} |
108 | 131 | for d in self.all.keys(): |
109 | 132 | current = retval |
110 | - for k in reversed(d.split(',')): | |
111 | - try: | |
112 | - current = current[k] | |
113 | - except: | |
114 | - current[k] = {} | |
115 | - current = current[k] | |
133 | + if d: | |
134 | + for k in reversed(d.split(',')): | |
135 | + try: | |
136 | + current = current[k] | |
137 | + except: | |
138 | + current[k] = {} | |
139 | + current = current[k] | |
116 | 140 | return retval |
117 | 141 | |
118 | 142 | @property | ... | ... |
... | ... | @@ -72,6 +72,9 @@ |
72 | 72 | onclick="toggle(this, 'childs')">dn: {{ d[2]|e }}</span> |
73 | 73 | <button onclick="toggle(this, 'attributes')">[Attributes]</button> |
74 | 74 | <ul class="attributes"> |
75 | + {% if ldaptree.node(d[2]) is string -%} | |
76 | + <li>{{ ldaptree.node(d[2])|e }}</li> | |
77 | + {% else -%} | |
75 | 78 | {% for k in ldaptree.node(d[2]).keys() -%} |
76 | 79 | {% if ldaptree.node(d[2]) is string -%} |
77 | 80 | <li>{{ k }}: {{ ldaptree.node(d[2])[k]|e }}</li> |
... | ... | @@ -81,6 +84,7 @@ |
81 | 84 | {% endfor -%} |
82 | 85 | {% endif -%} |
83 | 86 | {% endfor -%} |
87 | + {% endif -%} | |
84 | 88 | </ul> |
85 | 89 | {% endfor -%} |
86 | 90 | </ul> | ... | ... |
Please
register
or
login
to post a comment