Skip to content

Commit 322a5f6

Browse files
Merge pull request #621 from skoranda/better_edupersontargetedid
Allow NameQualifier and SPNameQualifier attributes to be set for ePTID
2 parents 643902d + 1432950 commit 322a5f6

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

src/saml2/attribute_converter.py

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -432,12 +432,7 @@ def to_(self, attrvals):
432432
if name:
433433
if name == "urn:oid:1.3.6.1.4.1.5923.1.1.1.10":
434434
# special case for eduPersonTargetedID
435-
attr_value = []
436-
for v in value:
437-
extension_element = ExtensionElement("NameID", NAMESPACE,
438-
attributes={'Format': NAMEID_FORMAT_PERSISTENT}, text=v)
439-
attrval = saml.AttributeValue(extension_elements=[extension_element])
440-
attr_value.append(attrval)
435+
attr_value = self.to_eptid_value(value)
441436
else:
442437
attr_value = do_ava(value)
443438
attributes.append(factory(saml.Attribute,
@@ -452,6 +447,43 @@ def to_(self, attrvals):
452447

453448
return attributes
454449

450+
def to_eptid_value(self, values):
451+
"""
452+
Create AttributeValue instances of NameID from the given values.
453+
454+
Special handling for the "eptid" attribute
455+
Name=urn:oid:1.3.6.1.4.1.5923.1.1.1.10
456+
FriendlyName=eduPersonTargetedID
457+
458+
values is a list of items of type str or dict. When an item is a
459+
dictionary it has the keys: "NameQualifier", "SPNameQualifier", and
460+
"text".
461+
462+
Returns a list of AttributeValue instances of NameID elements.
463+
"""
464+
465+
def _create_nameid_ext_el(value):
466+
text = value["text"] if isinstance(value, dict) else value
467+
attributes = (
468+
{
469+
"Format": NAMEID_FORMAT_PERSISTENT,
470+
"NameQualifier": value["NameQualifier"],
471+
"SPNameQualifier": value["SPNameQualifier"],
472+
}
473+
if isinstance(value, dict)
474+
else {"Format": NAMEID_FORMAT_PERSISTENT}
475+
)
476+
element = ExtensionElement(
477+
"NameID", NAMESPACE, attributes=attributes, text=text
478+
)
479+
return element
480+
481+
attribute_values = [
482+
saml.AttributeValue(extension_elements=[_create_nameid_ext_el(v)])
483+
for v in values
484+
]
485+
return attribute_values
486+
455487

456488
class AttributeConverterNOOP(AttributeConverter):
457489
""" Does a NOOP conversion, that is no conversion is made """

tests/test_19_attribute_converter.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,29 @@ def test_from_local_nest_eduPersonTargetedID_in_NameID(self):
221221
assert attributes[0].attribute_value[0].extension_elements[0].text == "test value1"
222222
assert attributes[0].attribute_value[1].extension_elements[0].text == "test value2"
223223

224+
def test_from_local_eduPersonTargetedID_with_qualifiers(self):
225+
IDP_ENTITY_ID = "https://some.org/idp"
226+
SP_ENTITY_ID = "https://some.org/sp"
227+
228+
ava = {
229+
"edupersontargetedid": [
230+
{
231+
"text": "test value1",
232+
"NameQualifier": IDP_ENTITY_ID,
233+
"SPNameQualifier": SP_ENTITY_ID,
234+
}
235+
]
236+
}
237+
attributes = from_local(self.acs, ava, URI_NF)
238+
239+
assert len(attributes) == 1
240+
241+
element = attributes[0].attribute_value[0].extension_elements[0]
242+
243+
assert element.text == "test value1"
244+
assert element.attributes["NameQualifier"] == IDP_ENTITY_ID
245+
assert element.attributes["SPNameQualifier"] == SP_ENTITY_ID
246+
224247

225248
def test_noop_attribute_conversion():
226249
ava = {"urn:oid:2.5.4.4": "Roland", "urn:oid:2.5.4.42": "Hedberg"}

0 commit comments

Comments
 (0)