1
# -*- coding: utf-8 -*-
3
# This file is part of emesene.
5
# Emesene is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
10
# emesene is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with emesene; if not, write to the Free Software
17
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
import xml.parsers.expat
22
'''Parse dynamic xml'''
23
def __init__(self, xml_raw):
24
'''init parser and setup handlers'''
25
self.parser = xml.parsers.expat.ParserCreate()
26
self.parser.buffer_text = True
27
self.parser.returns_unicode = False
35
self.in_contact = False
36
self.in_annotation = False
37
self.in_group_ids = False
40
self.contact_data = {}
41
self.annotation_data = {}
42
self.group_ids_data = {}
47
self.parser.StartElementHandler = self.start_element
48
self.parser.EndElementHandler = self.end_element
49
self.parser.CharacterDataHandler = self.char_data
50
self.parser.Parse(xml_raw)
54
def start_element(self, name, attrs):
55
'''Start xml element handler'''
58
elif name == 'Contact':
59
self.in_contact = True
60
elif name == 'Annotation':
61
self.in_annotation = True
62
elif name == 'groupIds':
63
self.in_group_ids = True
64
self.current_tag = name
66
def end_element(self, name):
67
'''End xml element handler'''
70
if len(self.group_data) > 0:
71
if len(self.annotations) > 0:
72
self.group_data.update({'Annotations':self.annotations})
74
self.groups.append(self.group_data)
76
elif name == 'Contact':
77
self.in_contact = False
78
if len(self.contact_data) > 0:
79
annotations = self.annotations
80
self.contact_data.update({'Annotations':annotations})
81
self.contact_data.update({'groupIds':self.group_ids})
82
self.contacts.append(self.contact_data)
83
self.contact_data = {}
86
elif name == 'Annotation':
87
self.in_annotation = False
88
if len(self.annotation_data) > 0:
89
self.annotations.append(self.annotation_data)
90
self.annotation_data = {}
91
elif name == 'groupIds':
92
self.in_group_ids = False
93
if len(self.group_ids_data) > 0:
94
self.group_ids.append(self.group_ids_data)
95
self.group_ids_data = {}
97
def char_data(self, data):
98
'''Char xml element handler'''
100
self.group_ids.append(data)
101
elif self.in_annotation:
102
self.annotation_data.update({self.current_tag:data})
104
self.group_data.update({self.current_tag:data})
105
elif self.in_contact:
106
self.contact_data.update({self.current_tag:data})
108
class MembershipParser:
109
'''Parse membership xml'''
110
def __init__(self, xml_raw):
111
'''init parser and setup handlers'''
112
self.parser = xml.parsers.expat.ParserCreate()
113
self.parser.buffer_text = True
114
self.parser.returns_unicode = False
116
self.memberships = []
119
self.in_membership = False
120
self.in_member = False
122
self.membership_data = {}
123
self.member_data = {}
125
self.current_tag = ''
128
self.parser.StartElementHandler = self.start_element
129
self.parser.EndElementHandler = self.end_element
130
self.parser.CharacterDataHandler = self.char_data
131
self.parser.Parse(xml_raw)
134
def start_element(self, name, attrs):
135
'''Start xml element handler'''
136
if name == 'Membership':
137
self.in_membership = True
138
elif name == 'Member':
139
self.in_member = True
140
self.current_tag = name
142
def end_element(self, name):
143
'''End xml element handler'''
144
if name == 'Membership':
145
self.in_membership = False
146
if len(self.membership_data) > 0:
147
self.membership_data.update({'Members':self.members})
148
self.memberships.append(self.membership_data)
149
self.membership_data = {}
152
self.in_member = False
153
if len(self.member_data) > 0:
154
self.members.append(self.member_data)
155
self.member_data = {}
157
def char_data(self, data):
158
'''Char xml element handler'''
160
self.member_data.update({self.current_tag:data})
161
elif self.in_membership:
162
self.membership_data.update({self.current_tag:data})
166
def __init__(self, xml_raw):
167
'''init parser and setup handlers'''
168
self.parser = xml.parsers.expat.ParserCreate()
169
self.parser.buffer_text = True
170
self.parser.returns_unicode = False
174
self.in_token_response = False
175
self.in_address = False
176
self.in_binary_secret = False
177
self.in_binary_security = False
179
self.current_tag = ''
180
self.current_token = ''
183
self.parser.StartElementHandler = self.start_element
184
self.parser.EndElementHandler = self.end_element
185
self.parser.CharacterDataHandler = self.char_data
186
self.parser.Parse(xml_raw)
189
def start_element(self, name, attrs):
190
'''Start xml element handler'''
191
if name == 'RequestSecurityTokenResponse':
192
self.in_token_response = True
193
elif name == 'wsa:Address':
194
self.in_address = True
195
elif name == 'wst:BinarySecret':
196
self.in_binary_secret = True
197
elif name == 'wsse:BinarySecurityToken':
198
self.in_binary_security = True
199
self.current_tag = name
201
def end_element(self, name):
202
'''End xml element handler'''
203
if name == 'RequestSecurityTokenResponse':
204
self.in_token_response = False
205
elif name == 'wsa:Address':
206
self.in_address = False
207
elif name == 'wst:BinarySecret':
208
self.in_binary_secret = False
209
elif name == 'wsse:BinarySecurityToken':
210
self.in_binary_security = False
212
def char_data(self, data):
213
'''Char xml element handler'''
215
self.tokens.update({data:{}})
216
self.current_token = data
217
elif self.in_binary_secret:
218
self.tokens[self.current_token].update({'secret':data})
219
elif self.in_binary_security:
220
self.tokens[self.current_token].update({'security':data})