Skip to content

Commit efb2515

Browse files
committed
Passing NameQualifier through to logout request
1 parent aea56bb commit efb2515

4 files changed

Lines changed: 56 additions & 4 deletions

File tree

src/onelogin/saml2/auth.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ def login(self, return_to=None, force_authn=False, is_passive=False):
300300
parameters['Signature'] = self.build_request_signature(saml_request, parameters['RelayState'], security['signatureAlgorithm'])
301301
return self.redirect_to(self.get_sso_url(), parameters)
302302

303-
def logout(self, return_to=None, name_id=None, session_index=None):
303+
def logout(self, return_to=None, name_id=None, session_index=None, nq=None):
304304
"""
305305
Initiates the SLO process.
306306
@@ -313,6 +313,9 @@ def logout(self, return_to=None, name_id=None, session_index=None):
313313
:param session_index: SessionIndex that identifies the session of the user.
314314
:type session_index: string
315315
316+
:param nq: IDP Name Qualifier
317+
:type: string
318+
316319
:returns: Redirection url
317320
"""
318321
slo_url = self.get_slo_url()
@@ -325,7 +328,12 @@ def logout(self, return_to=None, name_id=None, session_index=None):
325328
if name_id is None and self.__nameid is not None:
326329
name_id = self.__nameid
327330

328-
logout_request = OneLogin_Saml2_Logout_Request(self.__settings, name_id=name_id, session_index=session_index)
331+
logout_request = OneLogin_Saml2_Logout_Request(
332+
self.__settings,
333+
name_id=name_id,
334+
session_index=session_index,
335+
nq=nq
336+
)
329337

330338
self.__last_request_id = logout_request.id
331339

src/onelogin/saml2/logout_request.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class OneLogin_Saml2_Logout_Request(object):
2929
3030
"""
3131

32-
def __init__(self, settings, request=None, name_id=None, session_index=None):
32+
def __init__(self, settings, request=None, name_id=None, session_index=None, nq=None):
3333
"""
3434
Constructs the Logout Request object.
3535
@@ -44,6 +44,9 @@ def __init__(self, settings, request=None, name_id=None, session_index=None):
4444
4545
:param session_index: SessionIndex that identifies the session of the user.
4646
:type session_index: string
47+
48+
:param nq: IDP Name Qualifier
49+
:type: string
4750
"""
4851
self.__settings = settings
4952
self.__error = None

src/onelogin/saml2/utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ def format_finger_print(fingerprint):
584584
return formated_fingerprint.lower()
585585

586586
@staticmethod
587-
def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False):
587+
def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False, nq=None):
588588
"""
589589
Generates a nameID.
590590
@@ -603,6 +603,9 @@ def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False):
603603
:param debug: Activate the xmlsec debug
604604
:type: bool
605605
606+
:param nq: IDP Name Qualifier
607+
:type: string
608+
606609
:returns: DOMElement | XMLSec nameID
607610
:rtype: string
608611
"""
@@ -613,6 +616,8 @@ def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False):
613616
name_id = doc.createElement('saml:NameID')
614617
if sp_nq is not None:
615618
name_id.setAttribute('SPNameQualifier', sp_nq)
619+
if nq is not None:
620+
name_id.setAttribute('NameQualifier', nq)
616621
name_id.setAttribute('Format', sp_format)
617622
name_id.appendChild(doc.createTextNode(value))
618623
name_id_container.appendChild(name_id)

tests/src/OneLogin/saml2_tests/utils_test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,42 @@ def testQuery(self):
559559
signature_nodes_5 = OneLogin_Saml2_Utils.query(dom, './/ds:SignatureValue', assertion)
560560
self.assertEqual(1, len(signature_nodes_5))
561561

562+
def _generate_name_id_element(self, name_qualifier):
563+
name_id_value = 'value'
564+
entity_id = 'sp-entity-id'
565+
name_id_format = 'name-id-format'
566+
567+
raw_name_id = OneLogin_Saml2_Utils.generate_name_id(
568+
name_id_value,
569+
entity_id,
570+
name_id_format,
571+
nq=name_qualifier,
572+
)
573+
parser = etree.XMLParser(recover=True)
574+
return etree.fromstring(raw_name_id, parser)
575+
576+
def testNameidGenerationIncludesNameQualifierAttribute(self):
577+
"""
578+
Tests the inclusion of NameQualifier in the generateNameId method of the OneLogin_Saml2_Utils
579+
"""
580+
idp_name_qualifier = 'idp-name-qualifier'
581+
idp_name_qualifier_attribute = ('NameQualifier', idp_name_qualifier)
582+
583+
name_id = self._generate_name_id_element(idp_name_qualifier)
584+
585+
self.assertIn(idp_name_qualifier_attribute, name_id.attrib.items())
586+
587+
def testNameidGenerationDoesNotIncludeNameQualifierAttribute(self):
588+
"""
589+
Tests the (not) inclusion of NameQualifier in the generateNameId method of the OneLogin_Saml2_Utils
590+
"""
591+
idp_name_qualifier = None
592+
not_expected_attribute = 'NameQualifier'
593+
594+
name_id = self._generate_name_id_element(idp_name_qualifier)
595+
596+
self.assertNotIn(not_expected_attribute, name_id.attrib.keys())
597+
562598
def testGenerateNameIdWithSPNameQualifier(self):
563599
"""
564600
Tests the generateNameId method of the OneLogin_Saml2_Utils

0 commit comments

Comments
 (0)