Skip to content

Commit f36b06a

Browse files
committed
assertion policy filter: Fallback to match a known attribute or return its name
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent 78e93f9 commit f36b06a

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

src/saml2/assertion.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,19 @@ def filter_on_attributes(ava, required=None, optional=None, acs=None,
8686
"""
8787

8888
def _match_attr_name(attr, ava):
89-
name_format = attr.get('name_format')
90-
name = attr.get('name')
91-
friendly_name = attr.get('friendly_name')
92-
local_name = get_local_name(acs, name, name_format) or friendly_name
93-
89+
name = attr["name"].lower()
90+
name_format = attr.get("name_format")
91+
friendly_name = attr.get("friendly_name")
92+
local_name = (
93+
get_local_name(acs, name, name_format)
94+
or friendly_name
95+
or ""
96+
)
9497
_fn = (
9598
_match(local_name, ava)
96-
if local_name
9799
# In the unlikely case that someone has provided us with URIs as attribute names
98-
else _match(name, ava)
100+
or _match(name, ava)
99101
)
100-
101102
return _fn
102103

103104

tests/test_20_assertion.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,55 @@ def _eq(l1, l2):
6868

6969

7070
def test_filter_on_attributes_0():
71-
a = to_dict(Attribute(name="urn:oid:2.5.4.5", name_format=NAME_FORMAT_URI,
72-
friendly_name="serialNumber"), ONTS)
71+
a = to_dict(
72+
Attribute(
73+
name="urn:oid:2.5.4.5",
74+
name_format=NAME_FORMAT_URI,
75+
friendly_name="serialNumber",
76+
),
77+
ONTS,
78+
)
7379

74-
required = [a]
75-
ava = {"serialNumber": ["12345"]}
80+
b = to_dict(
81+
Attribute(
82+
name="urn:oasis:names:tc:SAML:attribute:subject-id",
83+
name_format=NAME_FORMAT_URI,
84+
friendly_name="subject-id",
85+
),
86+
ONTS,
87+
)
88+
89+
c = to_dict(
90+
Attribute(
91+
name="unmapped_attr_name",
92+
name_format=NAME_FORMAT_URI,
93+
friendly_name="unmapped attr name",
94+
),
95+
ONTS,
96+
)
97+
98+
d = to_dict(
99+
Attribute(
100+
name="urn:oid:2.5.4.6",
101+
friendly_name="c",
102+
),
103+
ONTS,
104+
)
105+
106+
required = [a, b, c, d]
107+
ava = {
108+
"serialNumber": ["12345"],
109+
"subject-id": ["id_12345"],
110+
"unmapped_attr_name": ["abcd"],
111+
"c": ["some-country"],
112+
}
76113

77114
ava = filter_on_attributes(ava, required, acs=ac_factory())
78-
assert list(ava.keys()) == ["serialNumber"]
115+
assert set(ava.keys()) == {"serialNumber", "subject-id", "unmapped_attr_name", "c"}
79116
assert ava["serialNumber"] == ["12345"]
117+
assert ava["subject-id"] == ["id_12345"]
118+
assert ava["unmapped_attr_name"] == ["abcd"]
119+
assert ava["c"] == ["some-country"]
80120

81121

82122
def test_filter_on_attributes_1():

0 commit comments

Comments
 (0)