2323import sys
2424import platform
2525import shelve
26- import threading
2726import traceback
2827import saml2
2928from 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+
655668def make_plugin (remember_name = None , # plugin for remember
656669 cache = "" , # cache
657670 # Which virtual organization to support
0 commit comments