1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 """
22 XML canonicalisation methods (for XEP-0116)
23 """
24
25 from simplexml import ustr
26
27 -def c14n(node, is_buggy):
28 s = "<" + node.name
29 if node.namespace:
30 if not node.parent or node.parent.namespace != node.namespace:
31 s = s + ' xmlns="%s"' % node.namespace
32
33 sorted_attrs = sorted(node.attrs.keys())
34 for key in sorted_attrs:
35 if not is_buggy and key == 'xmlns':
36 continue
37 val = ustr(node.attrs[key])
38
39 s = s + ' %s="%s"' % ( key, normalise_attr(val) )
40 s = s + ">"
41 cnt = 0
42 if node.kids:
43 for a in node.kids:
44 if (len(node.data)-1) >= cnt:
45 s = s + normalise_text(node.data[cnt])
46 s = s + c14n(a, is_buggy)
47 cnt=cnt+1
48 if (len(node.data)-1) >= cnt: s = s + normalise_text(node.data[cnt])
49 if not node.kids and s.endswith('>'):
50 s=s[:-1]+' />'
51 else:
52 s = s + "</" + node.name + ">"
53 return s.encode('utf-8')
54
56 return val.replace('&', '&').replace('<', '<').replace('"', '"').replace('\t', '	').replace('\n', '
').replace('\r', '
')
57
59 return val.replace('&', '&').replace('<', '<').replace('>', '>').replace('\r', '
')
60