Skip to content

Commit 9289d26

Browse files
committed
Fix 157. Support multiple attributeValues on RequestedAttribute
1 parent 5674f90 commit 9289d26

3 files changed

Lines changed: 38 additions & 11 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ This is the settings.json file:
251251
"isRequired": false,
252252
"nameFormat": "",
253253
"friendlyName": "",
254-
"attributeValue": ""
254+
"attributeValue": []
255255
}
256256
]
257257
},

src/onelogin/saml2/metadata.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
7777
organization = {}
7878

7979
str_attribute_consuming_service = ''
80-
8180
if 'attributeConsumingService' in sp and len(sp['attributeConsumingService']):
8281
attr_cs_desc_str = ''
8382
if "serviceDescription" in sp['attributeConsumingService']:
@@ -94,16 +93,22 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
9493
if 'friendlyName' in req_attribs.keys() and req_attribs['friendlyName']:
9594
req_attr_nameformat_str = " FriendlyName=\"%s\"" % req_attribs['friendlyName']
9695
if 'isRequired' in req_attribs.keys() and req_attribs['isRequired']:
97-
req_attr_isrequired_str = " isRequired=\"%s\"" % 'true' if req_attribs['isRequired'] else 'false'
96+
req_attr_isrequired_str = " isRequired=\"%s\"" % req_attribs['isRequired']
97+
9898
if 'attributeValue' in req_attribs.keys() and req_attribs['attributeValue']:
99-
req_attr_aux_str = """ >
100-
<saml:AttributeValue xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion>%(attributeValue)</saml:AttributeValue>
101-
</md:RequestedAttribute>""" % \
102-
{
103-
'attributeValue': req_attribs['attributeValue']
104-
}
105-
106-
requested_attribute = """ <md:RequestedAttribute Name="%(req_attr_name)s"%(req_attr_nameformat_str)s%(req_attr_isrequired_str)s%(req_attr_aux_str)s""" % \
99+
req_attr_aux_str = ""
100+
if isinstance(req_attribs['attributeValue'], basestring):
101+
req_attribs['attributeValue'] = [req_attribs['attributeValue']]
102+
for attrValue in req_attribs['attributeValue']:
103+
req_attr_aux_str += """
104+
<saml:AttributeValue xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion>%(attributeValue)s</saml:AttributeValue>""" % \
105+
{
106+
'attributeValue': attrValue
107+
}
108+
req_attr_aux_str += """
109+
</md:RequestedAttribute>"""
110+
111+
requested_attribute = """ <md:RequestedAttribute Name="%(req_attr_name)s"%(req_attr_nameformat_str)s%(req_attr_friendlyname_str)s%(req_attr_isrequired_str)s%(req_attr_aux_str)s""" % \
107112
{
108113
'req_attr_name': req_attribs['name'],
109114
'req_attr_nameformat_str': req_attr_nameformat_str,

tests/src/OneLogin/saml2_tests/metadata_test.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,28 @@ def testBuilderAttributeConsumingService(self):
165165
<md:RequestedAttribute Name="urn:oid:0.9.2342.19200300.100.1.1" FriendlyName="uid" />
166166
</md:AttributeConsumingService>""", metadata)
167167

168+
def testBuilderAttributeConsumingServiceWithMultipleAttributeValue(self):
169+
settings = OneLogin_Saml2_Settings(self.loadSettingsJSON('settings5.json'))
170+
sp_data = settings.get_sp_data()
171+
security = settings.get_security_data()
172+
organization = settings.get_organization()
173+
contacts = settings.get_contacts()
174+
175+
metadata = OneLogin_Saml2_Metadata.builder(
176+
sp_data, security['authnRequestsSigned'],
177+
security['wantAssertionsSigned'], None, None, contacts,
178+
organization
179+
)
180+
self.assertIn(""" <md:AttributeConsumingService index="1">
181+
<md:ServiceName xml:lang="en">Test Service</md:ServiceName>
182+
<md:ServiceDescription xml:lang="en">Test Service</md:ServiceDescription>
183+
<md:RequestedAttribute Name="userType" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
184+
<saml:AttributeValue xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion>userType</saml:AttributeValue>
185+
<saml:AttributeValue xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion>admin</saml:AttributeValue>
186+
</md:RequestedAttribute>
187+
<md:RequestedAttribute Name="urn:oid:0.9.2342.19200300.100.1.1" FriendlyName="uid" />
188+
</md:AttributeConsumingService>""", metadata)
189+
168190
def testSignMetadata(self):
169191
"""
170192
Tests the signMetadata method of the OneLogin_Saml2_Metadata

0 commit comments

Comments
 (0)