Skip to content

Commit d3b9056

Browse files
author
Roland Hedberg
committed
Methods creating request changed to return a tuple consisting of request id and request.
1 parent a442e03 commit d3b9056

File tree

2 files changed

+45
-32
lines changed

2 files changed

+45
-32
lines changed

example/sp-wsgi/sp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ def redirect_to_auth(self, _cli, entity_id, came_from, vorg_name=""):
529529
entity_id=entity_id)
530530
logger.debug("binding: %s, destination: %s" % (_binding,
531531
destination))
532-
req = _cli.create_authn_request(destination, vorg=vorg_name)
532+
req_id, req = _cli.create_authn_request(destination, vorg=vorg_name)
533533
_rstate = rndstr()
534534
self.cache.relay_state[_rstate] = came_from
535535
ht_args = _cli.apply_binding(_binding, "%s" % req, destination,

src/s2repoze/plugins/sp.py

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import sys
2424
import platform
2525
import shelve
26-
import threading
2726
import traceback
2827
import saml2
2928
from urlparse import parse_qs, urlparse
@@ -129,15 +128,17 @@ class SAML2Plugin(object):
129128
implements(IChallenger, IIdentifier, IAuthenticator, IMetadataProvider)
130129

131130
def __init__(self, rememberer_name, config, saml_client, wayf, cache,
132-
sid_store=None, discovery="", idp_query_param="", sid_store_cert=None,):
131+
sid_store=None, discovery="", idp_query_param="",
132+
sid_store_cert=None,):
133133
self.rememberer_name = rememberer_name
134134
self.wayf = wayf
135135
self.saml_client = saml_client
136136
self.conf = config
137137
self.cache = cache
138138
self.discosrv = discovery
139139
self.idp_query_param = idp_query_param
140-
self.logout_endpoints = [urlparse(ep)[2] for ep in config.endpoint("single_logout_service")]
140+
self.logout_endpoints = [urlparse(ep)[2] for ep in config.endpoint(
141+
"single_logout_service")]
141142
try:
142143
self.metadata = self.conf.metadata
143144
except KeyError:
@@ -153,24 +154,20 @@ def __init__(self, rememberer_name, config, saml_client, wayf, cache,
153154

154155
self.iam = platform.node()
155156

156-
157157
def _get_rememberer(self, environ):
158158
rememberer = environ['repoze.who.plugins'][self.rememberer_name]
159159
return rememberer
160160

161-
162161
#### IIdentifier ####
163162
def remember(self, environ, identity):
164163
rememberer = self._get_rememberer(environ)
165164
return rememberer.remember(environ, identity)
166165

167-
168166
#### IIdentifier ####
169167
def forget(self, environ, identity):
170168
rememberer = self._get_rememberer(environ)
171169
return rememberer.forget(environ, identity)
172170

173-
174171
def _get_post(self, environ):
175172
"""
176173
Get the posted information
@@ -293,8 +290,8 @@ def _pick_idp(self, environ, came_from):
293290
self.outstanding_queries[sid_] = came_from
294291
logger.debug("Redirect to Discovery Service function")
295292
eid = _cli.config.entityid
296-
ret = _cli.config.getattr("endpoints",
297-
"sp")["discovery_response"][0][0]
293+
ret = _cli.config.getattr(
294+
"endpoints", "sp")["discovery_response"][0][0]
298295
ret += "?sid=%s" % sid_
299296
loc = _cli.create_discovery_service_request(
300297
self.discosrv, eid, **{"return": ret})
@@ -379,33 +376,40 @@ def challenge(self, environ, _status, _app_headers, _forget_headers):
379376
"cert": cert_str,
380377
"key": req_key_str
381378
}
382-
spcertenc = SPCertEnc(x509_data=ds.X509Data(x509_certificate=ds.X509Certificate(text=cert_str)))
383-
extensions = Extensions(extension_elements=[element_to_extension_element(spcertenc)])
379+
spcertenc = SPCertEnc(x509_data=ds.X509Data(
380+
x509_certificate=ds.X509Certificate(text=cert_str)))
381+
extensions = Extensions(extension_elements=[
382+
element_to_extension_element(spcertenc)])
384383

385384
if _cli.authn_requests_signed:
386385
_sid = saml2.s_utils.sid(_cli.seed)
387-
msg_str = _cli.create_authn_request(dest, vorg=vorg_name, sign=_cli.authn_requests_signed,
388-
message_id=_sid, extensions=extensions)
386+
msg_id = msg_str = _cli.create_authn_request(
387+
dest, vorg=vorg_name, sign=_cli.authn_requests_signed,
388+
message_id=_sid, extensions=extensions)
389389
else:
390-
req = _cli.create_authn_request(dest, vorg=vorg_name, sign=False, extensions=extensions)
390+
req_id, req = _cli.create_authn_request(
391+
dest, vorg=vorg_name, sign=False, extensions=extensions)
391392
msg_str = "%s" % req
392-
_sid = req.id
393+
_sid = req_id
393394

394395
if cert is not None:
395396
self.outstanding_certs[_sid] = cert
396397

397-
ht_args = _cli.apply_binding(_binding, msg_str, destination=dest, relay_state=came_from)
398+
ht_args = _cli.apply_binding(_binding, msg_str,
399+
destination=dest,
400+
relay_state=came_from)
398401

399402
logger.debug("ht_args: %s" % ht_args)
400403
except Exception, exc:
401404
logger.exception(exc)
402405
raise Exception(
403406
"Failed to construct the AuthnRequest: %s" % exc)
404407

405-
406408
try:
407-
ret = _cli.config.getattr("endpoints","sp")["discovery_response"][0][0]
408-
if (environ["PATH_INFO"]) in ret and ret.split(environ["PATH_INFO"])[1] == "":
409+
ret = _cli.config.getattr(
410+
"endpoints","sp")["discovery_response"][0][0]
411+
if (environ["PATH_INFO"]) in ret and ret.split(
412+
environ["PATH_INFO"])[1] == "":
409413
query = parse_qs(environ["QUERY_STRING"])
410414
sid = query["sid"][0]
411415
came_from = self.outstanding_queries[sid]
@@ -440,7 +444,8 @@ def _eval_authn_response(self, environ, post, binding=BINDING_HTTP_POST):
440444
# Evaluate the response, returns a AuthnResponse instance
441445
try:
442446
authresp = self.saml_client.parse_authn_request_response(
443-
post["SAMLResponse"], binding, self.outstanding_queries, self.outstanding_certs)
447+
post["SAMLResponse"], binding, self.outstanding_queries,
448+
self.outstanding_certs)
444449

445450
except Exception, excp:
446451
logger.exception("Exception: %s" % (excp,))
@@ -476,12 +481,13 @@ def do_ecp_response(self, body, environ):
476481
#### IIdentifier ####
477482
def identify(self, environ):
478483
"""
479-
Tries do the identification
484+
Tries to do the identification
480485
"""
481486
#logger = environ.get('repoze.who.logger', '')
482487

483488
query = parse_dict_querystring(environ)
484-
if ("CONTENT_LENGTH" not in environ or not environ["CONTENT_LENGTH"]) and "SAMLResponse" not in query and "SAMLRequest" not in query:
489+
if ("CONTENT_LENGTH" not in environ or not environ["CONTENT_LENGTH"]) and \
490+
"SAMLResponse" not in query and "SAMLRequest" not in query:
485491
logger.debug('[identify] get or empty post')
486492
return {}
487493

@@ -517,7 +523,9 @@ def identify(self, environ):
517523
if logout and "SAMLRequest" in post:
518524
print("logout request received")
519525
try:
520-
response = self.saml_client.handle_logout_request(post["SAMLRequest"], self.saml_client.users.subjects()[0], binding)
526+
response = self.saml_client.handle_logout_request(
527+
post["SAMLRequest"],
528+
self.saml_client.users.subjects()[0], binding)
521529
environ['samlsp.pending'] = self._handle_logout(response)
522530
return {}
523531
except:
@@ -537,15 +545,18 @@ def identify(self, environ):
537545
#if self.debug:
538546
try:
539547
if logout:
540-
response = self.saml_client.parse_logout_request_response(post["SAMLResponse"], binding)
548+
response = self.saml_client.parse_logout_request_response(
549+
post["SAMLResponse"], binding)
541550
if response:
542-
action = self.saml_client.handle_logout_response(response)
543-
request = None
551+
action = self.saml_client.handle_logout_response(
552+
response)
553+
544554
if type(action) == dict:
545555
request = self._handle_logout(action)
546556
else:
547557
#logout complete
548-
request = HTTPSeeOther(headers=[('Location', "/")])
558+
request = HTTPSeeOther(headers=[
559+
('Location', "/")])
549560
if request:
550561
environ['samlsp.pending'] = request
551562
return {}
@@ -621,9 +632,9 @@ def add_metadata(self, environ, identity):
621632
# remove cookie and demand re-authentication
622633
pass
623634

624-
# @return
625-
# used 2 times : one to get the ticket, the other to validate it
626-
def _service_url(self, environ, qstr=None):
635+
# used 2 times : one to get the ticket, the other to validate it
636+
@staticmethod
637+
def _service_url(environ, qstr=None):
627638
if qstr is not None:
628639
url = construct_url(environ, querystring=qstr)
629640
else:
@@ -641,7 +652,8 @@ def authenticate(self, environ, identity=None):
641652
else:
642653
return None
643654

644-
def _handle_logout(self, responses):
655+
@staticmethod
656+
def _handle_logout(responses):
645657
if 'data' in responses:
646658
ht_args = responses
647659
else:
@@ -652,6 +664,7 @@ def _handle_logout(self, responses):
652664
else:
653665
return ht_args["data"]
654666

667+
655668
def make_plugin(remember_name=None, # plugin for remember
656669
cache="", # cache
657670
# Which virtual organization to support

0 commit comments

Comments
 (0)