Skip to content

Commit e2bebdc

Browse files
author
Roland Hedberg
committed
Fix bugs with using extension schemas.
1 parent 805a01c commit e2bebdc

File tree

4 files changed

+123
-84
lines changed

4 files changed

+123
-84
lines changed

src/saml2/client_base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,8 @@ def parse_authn_request_response(self, xmlstr, binding, outstanding=None):
513513
"return_addr": self.service_url(),
514514
"entity_id": self.config.entityid,
515515
"attribute_converters": self.config.attribute_converters,
516-
"allow_unknown_attributes": self.config.allow_unknown_attributes}
516+
"allow_unknown_attributes": self.config.allow_unknown_attributes,
517+
}
517518
try:
518519
resp = self._parse_response(xmlstr, AuthnResponse,
519520
"assertion_consumer_service",

src/saml2/config.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,10 @@ def load(self, cnf, metadata_construction=False):
295295
continue
296296
elif arg == "extension_schemas":
297297
# List of filename of modules representing the schemas
298-
for mod_file in cnf["extension_schemas"]:
299-
_mod = self._load(mod_file)
300-
self.extension_schema[_mod.NAMESPACE] = _mod
298+
if "extension_schemas" in cnf:
299+
for mod_file in cnf["extension_schemas"]:
300+
_mod = self._load(mod_file)
301+
self.extension_schema[_mod.NAMESPACE] = _mod
301302

302303
try:
303304
setattr(self, arg, _uc(cnf[arg]))

src/saml2/extension/dri.py

Lines changed: 110 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
NAMESPACE = 'urn:oasis:names:tc:SAML:2.0:metadata:dri'
1313

14+
1415
class CreationInstant(SamlBase):
1516
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:CreationInstant element """
1617

@@ -22,6 +23,7 @@ class CreationInstant(SamlBase):
2223
c_child_order = SamlBase.c_child_order[:]
2324
c_cardinality = SamlBase.c_cardinality.copy()
2425

26+
2527
def creation_instant_from_string(xml_string):
2628
return saml2.create_class_from_xml_string(CreationInstant, xml_string)
2729

@@ -37,6 +39,7 @@ class SerialNumber(SamlBase):
3739
c_child_order = SamlBase.c_child_order[:]
3840
c_cardinality = SamlBase.c_cardinality.copy()
3941

42+
4043
def serial_number_from_string(xml_string):
4144
return saml2.create_class_from_xml_string(SerialNumber, xml_string)
4245

@@ -52,6 +55,7 @@ class UsagePolicy(SamlBase):
5255
c_child_order = SamlBase.c_child_order[:]
5356
c_cardinality = SamlBase.c_cardinality.copy()
5457

58+
5559
def usage_policy_from_string(xml_string):
5660
return saml2.create_class_from_xml_string(UsagePolicy, xml_string)
5761

@@ -70,28 +74,30 @@ class PublisherType_(SamlBase):
7074
c_attributes['SerialNumber'] = ('serial_number', 'string', False)
7175

7276
def __init__(self,
73-
publisher_id=None,
74-
creation_instant=None,
75-
serial_number=None,
76-
text=None,
77-
extension_elements=None,
78-
extension_attributes=None,
79-
):
80-
SamlBase.__init__(self,
81-
text=text,
82-
extension_elements=extension_elements,
83-
extension_attributes=extension_attributes,
84-
)
85-
self.publisher_id=publisher_id
86-
self.creation_instant=creation_instant
87-
self.serial_number=serial_number
77+
publisher_id=None,
78+
creation_instant=None,
79+
serial_number=None,
80+
text=None,
81+
extension_elements=None,
82+
extension_attributes=None,
83+
):
84+
SamlBase.__init__(self,
85+
text=text,
86+
extension_elements=extension_elements,
87+
extension_attributes=extension_attributes,
88+
)
89+
self.publisher_id = publisher_id
90+
self.creation_instant = creation_instant
91+
self.serial_number = serial_number
92+
8893

8994
def publisher_type__from_string(xml_string):
9095
return saml2.create_class_from_xml_string(PublisherType_, xml_string)
9196

9297

9398
class RegistrationAuthority(md.EntityIDType_):
94-
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationAuthority element """
99+
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationAuthority
100+
element """
95101

96102
c_tag = 'RegistrationAuthority'
97103
c_namespace = NAMESPACE
@@ -100,12 +106,14 @@ class RegistrationAuthority(md.EntityIDType_):
100106
c_child_order = md.EntityIDType_.c_child_order[:]
101107
c_cardinality = md.EntityIDType_.c_cardinality.copy()
102108

109+
103110
def registration_authority_from_string(xml_string):
104111
return saml2.create_class_from_xml_string(RegistrationAuthority, xml_string)
105112

106113

107114
class RegistrationInstant(SamlBase):
108-
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationInstant element """
115+
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationInstant
116+
element """
109117

110118
c_tag = 'RegistrationInstant'
111119
c_namespace = NAMESPACE
@@ -115,12 +123,14 @@ class RegistrationInstant(SamlBase):
115123
c_child_order = SamlBase.c_child_order[:]
116124
c_cardinality = SamlBase.c_cardinality.copy()
117125

126+
118127
def registration_instant_from_string(xml_string):
119128
return saml2.create_class_from_xml_string(RegistrationInstant, xml_string)
120129

121130

122131
class RegistrationPolicy(SamlBase):
123-
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationPolicy element """
132+
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationPolicy
133+
element """
124134

125135
c_tag = 'RegistrationPolicy'
126136
c_namespace = NAMESPACE
@@ -130,6 +140,7 @@ class RegistrationPolicy(SamlBase):
130140
c_child_order = SamlBase.c_child_order[:]
131141
c_cardinality = SamlBase.c_cardinality.copy()
132142

143+
133144
def registration_policy_from_string(xml_string):
134145
return saml2.create_class_from_xml_string(RegistrationPolicy, xml_string)
135146

@@ -144,41 +155,51 @@ class Publisher(PublisherType_):
144155
c_child_order = PublisherType_.c_child_order[:]
145156
c_cardinality = PublisherType_.c_cardinality.copy()
146157

158+
147159
def publisher_from_string(xml_string):
148160
return saml2.create_class_from_xml_string(Publisher, xml_string)
149161

150162

151163
class RegistrationInfoType_(SamlBase):
152-
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationInfoType element """
164+
"""The urn:oasis:names:tc:SAML:2.0:metadata:dri:RegistrationInfoType
165+
element """
153166

154167
c_tag = 'RegistrationInfoType'
155168
c_namespace = NAMESPACE
156169
c_children = SamlBase.c_children.copy()
157170
c_attributes = SamlBase.c_attributes.copy()
158171
c_child_order = SamlBase.c_child_order[:]
159172
c_cardinality = SamlBase.c_cardinality.copy()
160-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}RegistrationAuthority'] = ('registration_authority', RegistrationAuthority)
161-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}RegistrationInstant'] = ('registration_instant', RegistrationInstant)
162-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}RegistrationPolicy'] = ('registration_policy', RegistrationPolicy)
163-
c_cardinality['registration_policy'] = {"min":0, "max":1}
164-
c_child_order.extend(['registration_authority', 'registration_instant', 'registration_policy'])
173+
c_children[
174+
'{urn:oasis:names:tc:SAML:2.0:metadata:dri}RegistrationAuthority'] = (
175+
'registration_authority', RegistrationAuthority)
176+
c_children[
177+
'{urn:oasis:names:tc:SAML:2.0:metadata:dri}RegistrationInstant'] = (
178+
'registration_instant', RegistrationInstant)
179+
c_children[
180+
'{urn:oasis:names:tc:SAML:2.0:metadata:dri}RegistrationPolicy'] = (
181+
'registration_policy', RegistrationPolicy)
182+
c_cardinality['registration_policy'] = {"min": 0, "max": 1}
183+
c_child_order.extend(['registration_authority', 'registration_instant',
184+
'registration_policy'])
165185

166186
def __init__(self,
167-
registration_authority=None,
168-
registration_instant=None,
169-
registration_policy=None,
170-
text=None,
171-
extension_elements=None,
172-
extension_attributes=None,
173-
):
174-
SamlBase.__init__(self,
175-
text=text,
176-
extension_elements=extension_elements,
177-
extension_attributes=extension_attributes,
178-
)
179-
self.registration_authority=registration_authority
180-
self.registration_instant=registration_instant
181-
self.registration_policy=registration_policy
187+
registration_authority=None,
188+
registration_instant=None,
189+
registration_policy=None,
190+
text=None,
191+
extension_elements=None,
192+
extension_attributes=None,
193+
):
194+
SamlBase.__init__(self,
195+
text=text,
196+
extension_elements=extension_elements,
197+
extension_attributes=extension_attributes,
198+
)
199+
self.registration_authority = registration_authority
200+
self.registration_instant = registration_instant
201+
self.registration_policy = registration_policy
202+
182203

183204
def registration_info_type__from_string(xml_string):
184205
return saml2.create_class_from_xml_string(RegistrationInfoType_, xml_string)
@@ -193,22 +214,24 @@ class PublishersType_(SamlBase):
193214
c_attributes = SamlBase.c_attributes.copy()
194215
c_child_order = SamlBase.c_child_order[:]
195216
c_cardinality = SamlBase.c_cardinality.copy()
196-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}Publisher'] = ('publisher', [Publisher])
197-
c_cardinality['publisher'] = {"min":0}
217+
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}Publisher'] = (
218+
'publisher', [Publisher])
219+
c_cardinality['publisher'] = {"min": 0}
198220
c_child_order.extend(['publisher'])
199221

200222
def __init__(self,
201-
publisher=None,
202-
text=None,
203-
extension_elements=None,
204-
extension_attributes=None,
205-
):
206-
SamlBase.__init__(self,
207-
text=text,
208-
extension_elements=extension_elements,
209-
extension_attributes=extension_attributes,
210-
)
211-
self.publisher=publisher or []
223+
publisher=None,
224+
text=None,
225+
extension_elements=None,
226+
extension_attributes=None,
227+
):
228+
SamlBase.__init__(self,
229+
text=text,
230+
extension_elements=extension_elements,
231+
extension_attributes=extension_attributes,
232+
)
233+
self.publisher = publisher or []
234+
212235

213236
def publishers_type__from_string(xml_string):
214237
return saml2.create_class_from_xml_string(PublishersType_, xml_string)
@@ -224,6 +247,7 @@ class RegistrationInfo(RegistrationInfoType_):
224247
c_child_order = RegistrationInfoType_.c_child_order[:]
225248
c_cardinality = RegistrationInfoType_.c_cardinality.copy()
226249

250+
227251
def registration_info_from_string(xml_string):
228252
return saml2.create_class_from_xml_string(RegistrationInfo, xml_string)
229253

@@ -238,6 +262,7 @@ class Publishers(PublishersType_):
238262
c_child_order = PublishersType_.c_child_order[:]
239263
c_cardinality = PublishersType_.c_cardinality.copy()
240264

265+
241266
def publishers_from_string(xml_string):
242267
return saml2.create_class_from_xml_string(Publishers, xml_string)
243268

@@ -251,34 +276,40 @@ class DocumentInfoType_(SamlBase):
251276
c_attributes = SamlBase.c_attributes.copy()
252277
c_child_order = SamlBase.c_child_order[:]
253278
c_cardinality = SamlBase.c_cardinality.copy()
254-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}CreationInstant'] = ('creation_instant', CreationInstant)
255-
c_cardinality['creation_instant'] = {"min":0, "max":1}
256-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}SerialNumber'] = ('serial_number', SerialNumber)
257-
c_cardinality['serial_number'] = {"min":0, "max":1}
258-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}UsagePolicy'] = ('usage_policy', UsagePolicy)
259-
c_cardinality['usage_policy'] = {"min":0, "max":1}
260-
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}Publishers'] = ('publishers', Publishers)
261-
c_cardinality['publishers'] = {"min":0, "max":1}
262-
c_child_order.extend(['creation_instant', 'serial_number', 'usage_policy', 'publishers'])
279+
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}CreationInstant'] = (
280+
'creation_instant', CreationInstant)
281+
c_cardinality['creation_instant'] = {"min": 0, "max": 1}
282+
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}SerialNumber'] = (
283+
'serial_number', SerialNumber)
284+
c_cardinality['serial_number'] = {"min": 0, "max": 1}
285+
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}UsagePolicy'] = (
286+
'usage_policy', UsagePolicy)
287+
c_cardinality['usage_policy'] = {"min": 0, "max": 1}
288+
c_children['{urn:oasis:names:tc:SAML:2.0:metadata:dri}Publishers'] = (
289+
'publishers', Publishers)
290+
c_cardinality['publishers'] = {"min": 0, "max": 1}
291+
c_child_order.extend(
292+
['creation_instant', 'serial_number', 'usage_policy', 'publishers'])
263293

264294
def __init__(self,
265-
creation_instant=None,
266-
serial_number=None,
267-
usage_policy=None,
268-
publishers=None,
269-
text=None,
270-
extension_elements=None,
271-
extension_attributes=None,
272-
):
273-
SamlBase.__init__(self,
274-
text=text,
275-
extension_elements=extension_elements,
276-
extension_attributes=extension_attributes,
277-
)
278-
self.creation_instant=creation_instant
279-
self.serial_number=serial_number
280-
self.usage_policy=usage_policy
281-
self.publishers=publishers
295+
creation_instant=None,
296+
serial_number=None,
297+
usage_policy=None,
298+
publishers=None,
299+
text=None,
300+
extension_elements=None,
301+
extension_attributes=None,
302+
):
303+
SamlBase.__init__(self,
304+
text=text,
305+
extension_elements=extension_elements,
306+
extension_attributes=extension_attributes,
307+
)
308+
self.creation_instant = creation_instant
309+
self.serial_number = serial_number
310+
self.usage_policy = usage_policy
311+
self.publishers = publishers
312+
282313

283314
def document_info_type__from_string(xml_string):
284315
return saml2.create_class_from_xml_string(DocumentInfoType_, xml_string)
@@ -294,6 +325,7 @@ class DocumentInfo(DocumentInfoType_):
294325
c_child_order = DocumentInfoType_.c_child_order[:]
295326
c_cardinality = DocumentInfoType_.c_cardinality.copy()
296327

328+
297329
def document_info_from_string(xml_string):
298330
return saml2.create_class_from_xml_string(DocumentInfo, xml_string)
299331

src/saml2/response.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,10 @@ def __init__(self, sec_context, attribute_converters, entity_id,
467467
self.test = test
468468
self.allow_unknown_attributes = allow_unknown_attributes
469469
#
470-
self.extension_schema = kwargs["extension_schema"]
470+
try:
471+
self.extension_schema = kwargs["extension_schema"]
472+
except KeyError:
473+
self.extension_schema = {}
471474

472475
def loads(self, xmldata, decode=True, origxml=None):
473476
self._loads(xmldata, decode, origxml)
@@ -554,8 +557,10 @@ def condition_ok(self, lax=False):
554557
try:
555558
if cond.extension_attributes[XSI_TYPE] in self.extension_schema:
556559
pass
560+
else:
561+
raise Exception("Unknown condition")
557562
except KeyError:
558-
raise Exception("Unknown condition")
563+
raise Exception("Missing xsi:type specification")
559564

560565
return True
561566

0 commit comments

Comments
 (0)