@@ -50,7 +50,7 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
5050 :param contacts: Contacts info
5151 :type contacts: dict
5252
53- :param organization: Organization ingo
53+ :param organization: Organization info
5454 :type organization: dict
5555 """
5656 if valid_until is None :
@@ -76,6 +76,55 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
7676 if organization is None :
7777 organization = {}
7878
79+ str_attribute_consuming_service = ''
80+
81+ if 'attributeConsumingService' in sp and len (sp ['attributeConsumingService' ]):
82+ attr_cs_desc_str = ''
83+ if "serviceDescription" in sp ['attributeConsumingService' ]:
84+ attr_cs_desc_str = """ <md:ServiceDescription xml:lang="en">%s</md:ServiceDescription>
85+ """ % sp ['attributeConsumingService' ]['serviceDescription' ]
86+
87+ requested_attribute_data = []
88+ for req_attribs in sp ['attributeConsumingService' ]['requestedAttributes' ]:
89+ req_attr_nameformat_str = req_attr_friendlyname_str = req_attr_isrequired_str = ''
90+ req_attr_aux_str = ' \>'
91+
92+ if 'nameFormat' in req_attribs .keys () and req_attribs ['nameFormat' ]:
93+ req_attr_nameformat_str = " NameFormat=\" %s\" " % req_attribs ['nameFormat' ]
94+ if 'friendlyName' in req_attribs .keys () and req_attribs ['friendlyName' ]:
95+ req_attr_nameformat_str = " FriendlyName=\" %s\" " % req_attribs ['friendlyName' ]
96+ if 'isRequired' in req_attribs .keys () and req_attribs ['isRequired' ]:
97+ req_attr_isrequired_str = " isRequired=\" %s\" " % req_attribs ['isRequired' ]
98+ 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""" % \
107+ {
108+ 'req_attr_name' : req_attribs ['name' ],
109+ 'req_attr_nameformat_str' : req_attr_nameformat_str ,
110+ 'req_attr_friendlyname_str' : req_attr_friendlyname_str ,
111+ 'req_attr_isrequired_str' : req_attr_isrequired_str ,
112+ 'req_attr_aux_str' : req_attr_aux_str
113+ }
114+
115+ requested_attribute_data .append (requested_attribute )
116+
117+ str_attribute_consuming_service = """ <md:AttributeConsumingService index="1">
118+ <md:ServiceName xml:lang="en">%(service_name)s</md:ServiceName>
119+ %(attr_cs_desc)s%(requested_attribute_str)s
120+ </md:AttributeConsumingService>
121+ """ % \
122+ {
123+ 'service_name' : sp ['attributeConsumingService' ]['serviceName' ],
124+ 'attr_cs_desc' : attr_cs_desc_str ,
125+ 'requested_attribute_str' : '\n ' .join (requested_attribute_data )
126+ }
127+
79128 sls = ''
80129 if 'singleLogoutService' in sp and 'url' in sp ['singleLogoutService' ]:
81130 sls = """ <md:SingleLogoutService Binding="%(binding)s"
@@ -100,7 +149,7 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
100149 org_data = '\n ' .join (organization_names ) + '\n ' + '\n ' .join (organization_displaynames ) + '\n ' + '\n ' .join (organization_urls )
101150 str_organization = """ <md:Organization>
102151%(org)s
103- </md:Organization>""" % {'org' : org_data }
152+ </md:Organization>\n """ % {'org' : org_data }
104153
105154 str_contacts = ''
106155 if len (contacts ) > 0 :
@@ -116,7 +165,7 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
116165 'email' : info ['emailAddress' ],
117166 }
118167 contacts_info .append (contact )
119- str_contacts = '\n ' .join (contacts_info )
168+ str_contacts = '\n ' .join (contacts_info ) + ' \n '
120169
121170 metadata = """<?xml version="1.0"?>
122171<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
@@ -128,10 +177,8 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
128177 <md:AssertionConsumerService Binding="%(binding)s"
129178 Location="%(location)s"
130179 index="1" />
131- </md:SPSSODescriptor>
132- %(organization)s
133- %(contacts)s
134- </md:EntityDescriptor>""" % \
180+ %(attribute_consuming_service)s </md:SPSSODescriptor>
181+ %(organization)s%(contacts)s</md:EntityDescriptor>""" % \
135182 {
136183 'valid' : ('validUntil="%s"' % valid_until_str ) if valid_until_str else '' ,
137184 'cache' : ('cacheDuration="%s"' % cache_duration_str ) if cache_duration_str else '' ,
@@ -144,6 +191,7 @@ def builder(sp, authnsign=False, wsign=False, valid_until=None, cache_duration=N
144191 'sls' : sls ,
145192 'organization' : str_organization ,
146193 'contacts' : str_contacts ,
194+ 'attribute_consuming_service' : str_attribute_consuming_service
147195 }
148196 return metadata
149197
0 commit comments