Skip to content

Commit 992eaa3

Browse files
committed
Merge pull request #15 from alejandrovich/master
passing NameQualifier through to logout request
2 parents 3c16e22 + 1365615 commit 992eaa3

4 files changed

Lines changed: 58 additions & 5 deletions

File tree

src/onelogin/saml2/auth.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def login(self, return_to=None, force_authn=False, is_passive=False):
291291
self.add_request_signature(parameters, security['signatureAlgorithm'])
292292
return self.redirect_to(self.get_sso_url(), parameters)
293293

294-
def logout(self, return_to=None, name_id=None, session_index=None):
294+
def logout(self, return_to=None, name_id=None, session_index=None, nq=None):
295295
"""
296296
Initiates the SLO process.
297297
@@ -304,6 +304,9 @@ def logout(self, return_to=None, name_id=None, session_index=None):
304304
:param session_index: SessionIndex that identifies the session of the user.
305305
:type session_index: string
306306
307+
:param nq: IDP Name Qualifier
308+
:type: string
309+
307310
:returns: Redirection url
308311
"""
309312
slo_url = self.get_slo_url()
@@ -316,7 +319,12 @@ def logout(self, return_to=None, name_id=None, session_index=None):
316319
if name_id is None and self.__nameid is not None:
317320
name_id = self.__nameid
318321

319-
logout_request = OneLogin_Saml2_Logout_Request(self.__settings, name_id=name_id, session_index=session_index)
322+
logout_request = OneLogin_Saml2_Logout_Request(
323+
self.__settings,
324+
name_id=name_id,
325+
session_index=session_index,
326+
nq=nq
327+
)
320328

321329
parameters = {'SAMLRequest': logout_request.get_request()}
322330
if return_to is not None:

src/onelogin/saml2/logout_request.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class OneLogin_Saml2_Logout_Request(object):
2424
2525
"""
2626

27-
def __init__(self, settings, request=None, name_id=None, session_index=None):
27+
def __init__(self, settings, request=None, name_id=None, session_index=None, nq=None):
2828
"""
2929
Constructs the Logout Request object.
3030
@@ -39,6 +39,9 @@ def __init__(self, settings, request=None, name_id=None, session_index=None):
3939
4040
:param session_index: SessionIndex that identifies the session of the user.
4141
:type session_index: string
42+
43+
:param nq: IDP Name Qualifier
44+
:type: string
4245
"""
4346
self.__settings = settings
4447
self.__error = None
@@ -70,7 +73,8 @@ def __init__(self, settings, request=None, name_id=None, session_index=None):
7073
name_id,
7174
sp_name_qualifier,
7275
name_id_format,
73-
cert
76+
cert,
77+
nq=nq,
7478
)
7579

7680
if session_index:

src/onelogin/saml2/utils.py

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

525525
@staticmethod
526-
def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False):
526+
def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False, nq=None):
527527
"""
528528
Generates a nameID.
529529
@@ -544,13 +544,18 @@ def generate_name_id(value, sp_nq, sp_format, cert=None, debug=False):
544544
545545
:returns: DOMElement | XMLSec nameID
546546
:rtype: string
547+
548+
:param nq: IDP Name Qualifier
549+
:type: string
547550
"""
548551

549552
root = OneLogin_Saml2_XML.make_root("{%s}container" % OneLogin_Saml2_Constants.NS_SAML)
550553
name_id = OneLogin_Saml2_XML.make_child(root, '{%s}NameID' % OneLogin_Saml2_Constants.NS_SAML)
551554
if sp_nq is not None:
552555
name_id.set('SPNameQualifier', sp_nq)
553556
name_id.set('Format', sp_format)
557+
if nq is not None:
558+
name_id.set('NameQualifier', nq)
554559
name_id.text = value
555560

556561
if cert is not None:

tests/src/OneLogin/saml2_tests/utils_test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,42 @@ def testGetExpireTime(self):
459459
self.assertNotEqual('3311642371', OneLogin_Saml2_Utils.get_expire_time('PT360000S', '2074-12-10T04:39:31Z'))
460460
self.assertNotEqual('3311642371', OneLogin_Saml2_Utils.get_expire_time('PT360000S', 1418186371))
461461

462+
def _generate_name_id_element(self, name_qualifier):
463+
name_id_value = 'value'
464+
entity_id = 'sp-entity-id'
465+
name_id_format = 'name-id-format'
466+
467+
raw_name_id = OneLogin_Saml2_Utils.generate_name_id(
468+
name_id_value,
469+
entity_id,
470+
name_id_format,
471+
nq=name_qualifier,
472+
)
473+
parser = etree.XMLParser(recover=True)
474+
return etree.fromstring(raw_name_id, parser)
475+
476+
def testNameidGenerationIncludesNameQualifierAttribute(self):
477+
"""
478+
Tests the inclusion of NameQualifier in the generateNameId method of the OneLogin_Saml2_Utils
479+
"""
480+
idp_name_qualifier = 'idp-name-qualifier'
481+
idp_name_qualifier_attribute = ('NameQualifier', idp_name_qualifier)
482+
483+
name_id = self._generate_name_id_element(idp_name_qualifier)
484+
485+
self.assertIn(idp_name_qualifier_attribute, name_id.attrib.items())
486+
487+
def testNameidGenerationDoesNotIncludeNameQualifierAttribute(self):
488+
"""
489+
Tests the (not) inclusion of NameQualifier in the generateNameId method of the OneLogin_Saml2_Utils
490+
"""
491+
idp_name_qualifier = None
492+
not_expected_attribute = 'NameQualifier'
493+
494+
name_id = self._generate_name_id_element(idp_name_qualifier)
495+
496+
self.assertNotIn(not_expected_attribute, name_id.attrib.keys())
497+
462498
def testGenerateNameIdWithSPNameQualifier(self):
463499
"""
464500
Tests the generateNameId method of the OneLogin_Saml2_Utils

0 commit comments

Comments
 (0)