@@ -103,12 +103,12 @@ def __init__(self, environ, start_response, user=None):
103
103
def unpack_redirect (self ):
104
104
if "QUERY_STRING" in self .environ :
105
105
_qs = self .environ ["QUERY_STRING" ]
106
- return dict ([(k , v [0 ]) for k , v in parse_qs (_qs ).items ()])
106
+ return dict ([(k , v [0 ]) for k , v in _get_query (_qs ).items ()])
107
107
else :
108
108
return None
109
109
110
110
def unpack_post (self ):
111
- _dict = parse_qs (get_post (self .environ ))
111
+ _dict = _get_query (get_post (self .environ ))
112
112
logger .debug ("unpack_post:: %s" , _dict )
113
113
try :
114
114
return dict ([(k , v [0 ]) for k , v in _dict .items ()])
@@ -297,7 +297,7 @@ def verify_request(self, query, binding):
297
297
298
298
resp_args = {}
299
299
try :
300
- resp_args = IDP .response_args (_authn_req )
300
+ resp_args = IDP .response_args (_authn_req , self . response_bindings )
301
301
_resp = None
302
302
except UnknownPrincipal as excp :
303
303
_resp = IDP .create_error_response (_authn_req .id ,
@@ -482,13 +482,13 @@ def ecp(self):
482
482
resp = Unauthorized ()
483
483
else :
484
484
try :
485
- (user , passwd ) = _info .split (":" )
486
- if is_equal (PASSWD [user ], passwd ):
485
+ (user , passwd ) = _info .split (b":" )
486
+ user = user .decode ()
487
+ if not is_equal (PASSWD [user ], passwd ):
487
488
resp = Unauthorized ()
488
489
self .user = user
489
- self .environ [
490
- "idp.authn" ] = AUTHN_BROKER .get_authn_by_accr (
491
- PASSWORD )
490
+ self .environ ["idp.authn" ] = \
491
+ AUTHN_BROKER .get_authn_by_accr (PASSWORD )
492
492
except ValueError :
493
493
resp = Unauthorized ()
494
494
else :
@@ -531,11 +531,11 @@ def do_authentication(environ, start_response, authn_context, key,
531
531
# -----------------------------------------------------------------------------
532
532
533
533
PASSWD = {
534
- "daev0001" : "qwerty" ,
535
- "testuser" : "qwerty" ,
536
- "roland" : "dianakra" ,
537
- "babs" : "howes" ,
538
- "upper" : "crust" }
534
+ "daev0001" : b "qwerty" ,
535
+ "testuser" : b "qwerty" ,
536
+ "roland" : b "dianakra" ,
537
+ "babs" : b "howes" ,
538
+ "upper" : b "crust" }
539
539
540
540
541
541
def username_password_authn (environ , start_response , reference , key ,
@@ -563,18 +563,46 @@ def username_password_authn(environ, start_response, reference, key,
563
563
return resp (environ , start_response , ** argv )
564
564
565
565
566
+ def _ensure_string (thing ):
567
+ import six
568
+ if isinstance (thing , six .binary_type ):
569
+ return thing .decode ()
570
+ elif isinstance (thing , six .string_types ):
571
+ return thing
572
+ elif isinstance (thing , list ):
573
+ return [_ensure_string (item ) for item in thing ]
574
+ else :
575
+ return thing
576
+
577
+
578
+ def _convert_dict_with_bytes (d ):
579
+ new_d = {}
580
+ for key , value in d .items ():
581
+ new_key = _ensure_string (key )
582
+ new_value = _ensure_string (value )
583
+ new_d [new_key ] = new_value
584
+ return new_d
585
+
586
+
587
+ def _get_query (qs ):
588
+ query = parse_qs (qs )
589
+ return _convert_dict_with_bytes (query )
590
+
591
+
566
592
def verify_username_and_password (dic ):
567
593
global PASSWD
568
594
# verify username and password
569
- if PASSWD [dic ["login" ][0 ]] == dic ["password" ][0 ]:
570
- return True , dic ["login" ][0 ]
595
+ login = dic ["login" ][0 ]
596
+ password = dic ["password" ][0 ].encode ()
597
+
598
+ if PASSWD [login ] == password :
599
+ return True , login
571
600
else :
572
601
return False , ""
573
602
574
603
575
604
def do_verify (environ , start_response , _ ):
576
- query = parse_qs (get_post (environ ))
577
-
605
+ query = _get_query (get_post (environ ))
578
606
logger .debug ("do_verify: %s" , query )
579
607
580
608
try :
@@ -861,7 +889,8 @@ def info_from_cookie(kaka):
861
889
morsel = cookie_obj .get ("idpauthn" , None )
862
890
if morsel :
863
891
try :
864
- key , ref = base64 .b64decode (morsel .value ).split (":" )
892
+ key , ref = \
893
+ _ensure_string (base64 .b64decode (morsel .value )).split (":" )
865
894
return IDP .cache .uid2user [key ], ref
866
895
except (KeyError , TypeError ):
867
896
return None , None
@@ -886,8 +915,10 @@ def delete_cookie(environ, name):
886
915
887
916
888
917
def set_cookie (name , _ , * args ):
918
+ args = [a .encode () for a in args ]
919
+
889
920
cookie = SimpleCookie ()
890
- cookie [name ] = base64 .b64encode (":" .join (args ))
921
+ cookie [name ] = base64 .b64encode (b ":" .join (args )). decode ( )
891
922
cookie [name ]['path' ] = "/"
892
923
cookie [name ]["expires" ] = _expiration (5 ) # 5 minutes from now
893
924
logger .debug ("Cookie expires: %s" , cookie [name ]["expires" ])
@@ -951,7 +982,7 @@ def metadata(environ, start_response):
951
982
args .valid , args .cert , args .keyfile ,
952
983
args .id , args .name , args .sign )
953
984
start_response ('200 OK' , [('Content-Type' , "text/xml" )])
954
- return metadata
985
+ return [ metadata ]
955
986
except Exception as ex :
956
987
logger .error ("An error occured while creating metadata: %s" , ex .message )
957
988
return not_found (environ , start_response )
@@ -1042,7 +1073,8 @@ def application(environ, start_response):
1042
1073
1043
1074
if __name__ == '__main__' :
1044
1075
parser = argparse .ArgumentParser ()
1045
- parser .add_argument ('-p' , dest = 'path' , help = 'Path to configuration file.' , default = './idp_conf.py' )
1076
+ parser .add_argument ('-p' , dest = 'path' , help = 'Path to configuration file.' ,
1077
+ default = './idp_conf.py' )
1046
1078
parser .add_argument ('-v' , dest = 'valid' ,
1047
1079
help = "How long, in days, the metadata is valid from "
1048
1080
"the time of creation" )
0 commit comments