Package nbxmpp :: Module c14n
[hide private]
[frames] | no frames]

Source Code for Module nbxmpp.c14n

 1  # -*- coding:utf-8 -*- 
 2  ## c14n.py 
 3  ## 
 4  ## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com> 
 5  ## 
 6  ## This file is part of Gajim. 
 7  ## 
 8  ## Gajim is free software; you can redistribute it and/or modify 
 9  ## it under the terms of the GNU General Public License as published 
10  ## by the Free Software Foundation; version 3 only. 
11  ## 
12  ## Gajim is distributed in the hope that it will be useful, 
13  ## but WITHOUT ANY WARRANTY; without even the implied warranty of 
14  ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
15  ## GNU General Public License for more details. 
16  ## 
17  ## You should have received a copy of the GNU General Public License 
18  ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. 
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 # like XMLescape() but with whitespace and without &gt; 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
55 -def normalise_attr(val):
56 return val.replace('&', '&amp;').replace('<', '&lt;').replace('"', '&quot;').replace('\t', '&#x9;').replace('\n', '&#xA;').replace('\r', '&#xD;')
57
58 -def normalise_text(val):
59 return val.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('\r', '&#xD;')
60