23
23
import sys
24
24
import platform
25
25
import shelve
26
- import threading
27
26
import traceback
28
27
import saml2
29
28
from urlparse import parse_qs , urlparse
@@ -129,15 +128,17 @@ class SAML2Plugin(object):
129
128
implements (IChallenger , IIdentifier , IAuthenticator , IMetadataProvider )
130
129
131
130
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 ,):
133
133
self .rememberer_name = rememberer_name
134
134
self .wayf = wayf
135
135
self .saml_client = saml_client
136
136
self .conf = config
137
137
self .cache = cache
138
138
self .discosrv = discovery
139
139
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" )]
141
142
try :
142
143
self .metadata = self .conf .metadata
143
144
except KeyError :
@@ -153,24 +154,20 @@ def __init__(self, rememberer_name, config, saml_client, wayf, cache,
153
154
154
155
self .iam = platform .node ()
155
156
156
-
157
157
def _get_rememberer (self , environ ):
158
158
rememberer = environ ['repoze.who.plugins' ][self .rememberer_name ]
159
159
return rememberer
160
160
161
-
162
161
#### IIdentifier ####
163
162
def remember (self , environ , identity ):
164
163
rememberer = self ._get_rememberer (environ )
165
164
return rememberer .remember (environ , identity )
166
165
167
-
168
166
#### IIdentifier ####
169
167
def forget (self , environ , identity ):
170
168
rememberer = self ._get_rememberer (environ )
171
169
return rememberer .forget (environ , identity )
172
170
173
-
174
171
def _get_post (self , environ ):
175
172
"""
176
173
Get the posted information
@@ -293,8 +290,8 @@ def _pick_idp(self, environ, came_from):
293
290
self .outstanding_queries [sid_ ] = came_from
294
291
logger .debug ("Redirect to Discovery Service function" )
295
292
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 ]
298
295
ret += "?sid=%s" % sid_
299
296
loc = _cli .create_discovery_service_request (
300
297
self .discosrv , eid , ** {"return" : ret })
@@ -379,33 +376,40 @@ def challenge(self, environ, _status, _app_headers, _forget_headers):
379
376
"cert" : cert_str ,
380
377
"key" : req_key_str
381
378
}
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 )])
384
383
385
384
if _cli .authn_requests_signed :
386
385
_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 )
389
389
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 )
391
392
msg_str = "%s" % req
392
- _sid = req . id
393
+ _sid = req_id
393
394
394
395
if cert is not None :
395
396
self .outstanding_certs [_sid ] = cert
396
397
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 )
398
401
399
402
logger .debug ("ht_args: %s" % ht_args )
400
403
except Exception , exc :
401
404
logger .exception (exc )
402
405
raise Exception (
403
406
"Failed to construct the AuthnRequest: %s" % exc )
404
407
405
-
406
408
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 ] == "" :
409
413
query = parse_qs (environ ["QUERY_STRING" ])
410
414
sid = query ["sid" ][0 ]
411
415
came_from = self .outstanding_queries [sid ]
@@ -440,7 +444,8 @@ def _eval_authn_response(self, environ, post, binding=BINDING_HTTP_POST):
440
444
# Evaluate the response, returns a AuthnResponse instance
441
445
try :
442
446
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 )
444
449
445
450
except Exception , excp :
446
451
logger .exception ("Exception: %s" % (excp ,))
@@ -476,12 +481,13 @@ def do_ecp_response(self, body, environ):
476
481
#### IIdentifier ####
477
482
def identify (self , environ ):
478
483
"""
479
- Tries do the identification
484
+ Tries to do the identification
480
485
"""
481
486
#logger = environ.get('repoze.who.logger', '')
482
487
483
488
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 :
485
491
logger .debug ('[identify] get or empty post' )
486
492
return {}
487
493
@@ -517,7 +523,9 @@ def identify(self, environ):
517
523
if logout and "SAMLRequest" in post :
518
524
print ("logout request received" )
519
525
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 )
521
529
environ ['samlsp.pending' ] = self ._handle_logout (response )
522
530
return {}
523
531
except :
@@ -537,15 +545,18 @@ def identify(self, environ):
537
545
#if self.debug:
538
546
try :
539
547
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 )
541
550
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
+
544
554
if type (action ) == dict :
545
555
request = self ._handle_logout (action )
546
556
else :
547
557
#logout complete
548
- request = HTTPSeeOther (headers = [('Location' , "/" )])
558
+ request = HTTPSeeOther (headers = [
559
+ ('Location' , "/" )])
549
560
if request :
550
561
environ ['samlsp.pending' ] = request
551
562
return {}
@@ -621,9 +632,9 @@ def add_metadata(self, environ, identity):
621
632
# remove cookie and demand re-authentication
622
633
pass
623
634
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 ):
627
638
if qstr is not None :
628
639
url = construct_url (environ , querystring = qstr )
629
640
else :
@@ -641,7 +652,8 @@ def authenticate(self, environ, identity=None):
641
652
else :
642
653
return None
643
654
644
- def _handle_logout (self , responses ):
655
+ @staticmethod
656
+ def _handle_logout (responses ):
645
657
if 'data' in responses :
646
658
ht_args = responses
647
659
else :
@@ -652,6 +664,7 @@ def _handle_logout(self, responses):
652
664
else :
653
665
return ht_args ["data" ]
654
666
667
+
655
668
def make_plugin (remember_name = None , # plugin for remember
656
669
cache = "" , # cache
657
670
# Which virtual organization to support
0 commit comments