@@ -89,15 +89,16 @@ class Base(Entity):
89
89
""" The basic pySAML2 service provider class """
90
90
91
91
def __init__ (self , config = None , identity_cache = None , state_cache = None ,
92
- virtual_organization = "" , config_file = "" ):
92
+ virtual_organization = "" , config_file = "" , msg_cb = None ):
93
93
"""
94
94
:param config: A saml2.config.Config instance
95
95
:param identity_cache: Where the class should store identity information
96
96
:param state_cache: Where the class should keep state information
97
97
:param virtual_organization: A specific virtual organization
98
98
"""
99
99
100
- Entity .__init__ (self , "sp" , config , config_file , virtual_organization )
100
+ Entity .__init__ (self , "sp" , config , config_file , virtual_organization ,
101
+ msg_cb = msg_cb )
101
102
102
103
self .users = Population (identity_cache )
103
104
self .lock = threading .Lock ()
@@ -150,7 +151,8 @@ def _sso_location(self, entityid=None, binding=BINDING_HTTP_REDIRECT):
150
151
raise IdpUnspecified ("Too many IdPs to choose from: %s" % eids )
151
152
152
153
try :
153
- srvs = self .metadata .single_sign_on_service (list (eids .keys ())[0 ], binding )
154
+ srvs = self .metadata .single_sign_on_service (list (eids .keys ())[0 ],
155
+ binding )
154
156
return destinations (srvs )[0 ]
155
157
except IndexError :
156
158
raise IdpUnspecified ("No IdP to send to given the premises" )
@@ -186,7 +188,7 @@ def add_vo_information_about_user(self, name_id):
186
188
ava = self .users .get_identity (name_id )[0 ]
187
189
return ava
188
190
189
- #noinspection PyUnusedLocal
191
+ # noinspection PyUnusedLocal
190
192
@staticmethod
191
193
def is_session_valid (_session_id ):
192
194
""" Place holder. Supposed to check if the session is still valid.
@@ -201,11 +203,12 @@ def service_urls(self, binding=BINDING_HTTP_POST):
201
203
return None
202
204
203
205
def create_authn_request (self , destination , vorg = "" , scoping = None ,
204
- binding = saml2 .BINDING_HTTP_POST ,
205
- nameid_format = None ,
206
- service_url_binding = None , message_id = 0 ,
207
- consent = None , extensions = None , sign = None ,
208
- allow_create = False , sign_prepare = False , sign_alg = None , digest_alg = None , ** kwargs ):
206
+ binding = saml2 .BINDING_HTTP_POST ,
207
+ nameid_format = None ,
208
+ service_url_binding = None , message_id = 0 ,
209
+ consent = None , extensions = None , sign = None ,
210
+ allow_create = False , sign_prepare = False , sign_alg = None ,
211
+ digest_alg = None , ** kwargs ):
209
212
""" Creates an authentication request.
210
213
211
214
:param destination: Where the request should be sent.
@@ -244,7 +247,7 @@ def create_authn_request(self, destination, vorg="", scoping=None,
244
247
except KeyError :
245
248
try :
246
249
args ["assertion_consumer_service_index" ] = str (kwargs [
247
- "assertion_consumer_service_index" ])
250
+ "assertion_consumer_service_index" ])
248
251
del kwargs ["assertion_consumer_service_index" ]
249
252
except KeyError :
250
253
if service_url_binding is None :
@@ -281,7 +284,6 @@ def create_authn_request(self, destination, vorg="", scoping=None,
281
284
raise ValueError ("%s or wrong type expected %s" % (_item ,
282
285
param ))
283
286
284
-
285
287
try :
286
288
args ["name_id_policy" ] = kwargs ["name_id_policy" ]
287
289
del kwargs ["name_id_policy" ]
@@ -303,7 +305,6 @@ def create_authn_request(self, destination, vorg="", scoping=None,
303
305
# NameIDPolicy can only have one format specified
304
306
nameid_format = nameid_format [0 ]
305
307
306
-
307
308
name_id_policy = samlp .NameIDPolicy (allow_create = allow_create ,
308
309
format = nameid_format )
309
310
@@ -334,24 +335,28 @@ def create_authn_request(self, destination, vorg="", scoping=None,
334
335
sign = self .authn_requests_signed
335
336
336
337
if (sign and self .sec .cert_handler .generate_cert ()) or \
337
- client_crt is not None :
338
+ client_crt is not None :
338
339
with self .lock :
339
340
self .sec .cert_handler .update_cert (True , client_crt )
340
341
if client_crt is not None :
341
342
sign_prepare = True
342
343
return self ._message (AuthnRequest , destination , message_id ,
343
344
consent , extensions , sign , sign_prepare ,
344
345
protocol_binding = binding ,
345
- scoping = scoping , nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg , ** args )
346
+ scoping = scoping , nsprefix = nsprefix ,
347
+ sign_alg = sign_alg , digest_alg = digest_alg ,
348
+ ** args )
346
349
return self ._message (AuthnRequest , destination , message_id , consent ,
347
350
extensions , sign , sign_prepare ,
348
351
protocol_binding = binding ,
349
- scoping = scoping , nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg , ** args )
352
+ scoping = scoping , nsprefix = nsprefix ,
353
+ sign_alg = sign_alg , digest_alg = digest_alg , ** args )
350
354
351
355
def create_attribute_query (self , destination , name_id = None ,
352
- attribute = None , message_id = 0 , consent = None ,
353
- extensions = None , sign = False , sign_prepare = False , sign_alg = None , digest_alg = None ,
354
- ** kwargs ):
356
+ attribute = None , message_id = 0 , consent = None ,
357
+ extensions = None , sign = False , sign_prepare = False , sign_alg = None ,
358
+ digest_alg = None ,
359
+ ** kwargs ):
355
360
""" Constructs an AttributeQuery
356
361
357
362
:param destination: To whom the query should be sent
@@ -407,15 +412,16 @@ def create_attribute_query(self, destination, name_id=None,
407
412
408
413
return self ._message (AttributeQuery , destination , message_id , consent ,
409
414
extensions , sign , sign_prepare , subject = subject ,
410
- attribute = attribute , nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg )
415
+ attribute = attribute , nsprefix = nsprefix ,
416
+ sign_alg = sign_alg , digest_alg = digest_alg )
411
417
412
418
# MUST use SOAP for
413
419
# AssertionIDRequest, SubjectQuery,
414
420
# AuthnQuery, AttributeQuery, or AuthzDecisionQuery
415
421
def create_authz_decision_query (self , destination , action ,
416
- evidence = None , resource = None , subject = None ,
417
- message_id = 0 , consent = None , extensions = None ,
418
- sign = None , sign_alg = None , digest_alg = None , ** kwargs ):
422
+ evidence = None , resource = None , subject = None ,
423
+ message_id = 0 , consent = None , extensions = None ,
424
+ sign = None , sign_alg = None , digest_alg = None , ** kwargs ):
419
425
""" Creates an authz decision query.
420
426
421
427
:param destination: The IdP endpoint
@@ -433,15 +439,16 @@ def create_authz_decision_query(self, destination, action,
433
439
return self ._message (AuthzDecisionQuery , destination , message_id ,
434
440
consent , extensions , sign , action = action ,
435
441
evidence = evidence , resource = resource ,
436
- subject = subject , sign_alg = sign_alg , digest_alg = digest_alg , ** kwargs )
442
+ subject = subject , sign_alg = sign_alg ,
443
+ digest_alg = digest_alg , ** kwargs )
437
444
438
445
def create_authz_decision_query_using_assertion (self , destination ,
439
- assertion , action = None ,
440
- resource = None ,
441
- subject = None , message_id = 0 ,
442
- consent = None ,
443
- extensions = None ,
444
- sign = False , nsprefix = None ):
446
+ assertion , action = None ,
447
+ resource = None ,
448
+ subject = None , message_id = 0 ,
449
+ consent = None ,
450
+ extensions = None ,
451
+ sign = False , nsprefix = None ):
445
452
""" Makes an authz decision query based on a previously received
446
453
Assertion.
447
454
@@ -466,9 +473,9 @@ def create_authz_decision_query_using_assertion(self, destination,
466
473
_action = None
467
474
468
475
return self .create_authz_decision_query (
469
- destination , _action , saml .Evidence (assertion = assertion ),
470
- resource , subject , message_id = message_id , consent = consent ,
471
- extensions = extensions , sign = sign , nsprefix = nsprefix )
476
+ destination , _action , saml .Evidence (assertion = assertion ),
477
+ resource , subject , message_id = message_id , consent = consent ,
478
+ extensions = extensions , sign = sign , nsprefix = nsprefix )
472
479
473
480
@staticmethod
474
481
def create_assertion_id_request (assertion_id_refs , ** kwargs ):
@@ -484,8 +491,9 @@ def create_assertion_id_request(assertion_id_refs, **kwargs):
484
491
return 0 , assertion_id_refs [0 ]
485
492
486
493
def create_authn_query (self , subject , destination = None , authn_context = None ,
487
- session_index = "" , message_id = 0 , consent = None ,
488
- extensions = None , sign = False , nsprefix = None , sign_alg = None , digest_alg = None ):
494
+ session_index = "" , message_id = 0 , consent = None ,
495
+ extensions = None , sign = False , nsprefix = None , sign_alg = None ,
496
+ digest_alg = None ):
489
497
"""
490
498
491
499
:param subject: The subject its all about as a <Subject> instance
@@ -502,14 +510,15 @@ def create_authn_query(self, subject, destination=None, authn_context=None,
502
510
extensions , sign , subject = subject ,
503
511
session_index = session_index ,
504
512
requested_authn_context = authn_context ,
505
- nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg )
513
+ nsprefix = nsprefix , sign_alg = sign_alg ,
514
+ digest_alg = digest_alg )
506
515
507
516
def create_name_id_mapping_request (self , name_id_policy ,
508
- name_id = None , base_id = None ,
509
- encrypted_id = None , destination = None ,
510
- message_id = 0 , consent = None ,
511
- extensions = None , sign = False ,
512
- nsprefix = None , sign_alg = None , digest_alg = None ):
517
+ name_id = None , base_id = None ,
518
+ encrypted_id = None , destination = None ,
519
+ message_id = 0 , consent = None ,
520
+ extensions = None , sign = False ,
521
+ nsprefix = None , sign_alg = None , digest_alg = None ):
513
522
"""
514
523
515
524
:param name_id_policy:
@@ -531,31 +540,37 @@ def create_name_id_mapping_request(self, name_id_policy,
531
540
return self ._message (NameIDMappingRequest , destination , message_id ,
532
541
consent , extensions , sign ,
533
542
name_id_policy = name_id_policy , name_id = name_id ,
534
- nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg )
543
+ nsprefix = nsprefix , sign_alg = sign_alg ,
544
+ digest_alg = digest_alg )
535
545
elif base_id :
536
546
return self ._message (NameIDMappingRequest , destination , message_id ,
537
547
consent , extensions , sign ,
538
548
name_id_policy = name_id_policy , base_id = base_id ,
539
- nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg )
549
+ nsprefix = nsprefix , sign_alg = sign_alg ,
550
+ digest_alg = digest_alg )
540
551
else :
541
552
return self ._message (NameIDMappingRequest , destination , message_id ,
542
553
consent , extensions , sign ,
543
554
name_id_policy = name_id_policy ,
544
- encrypted_id = encrypted_id , nsprefix = nsprefix , sign_alg = sign_alg , digest_alg = digest_alg )
555
+ encrypted_id = encrypted_id , nsprefix = nsprefix ,
556
+ sign_alg = sign_alg , digest_alg = digest_alg )
545
557
546
558
# ======== response handling ===========
547
559
548
560
def parse_authn_request_response (self , xmlstr , binding , outstanding = None ,
549
- outstanding_certs = None ):
561
+ outstanding_certs = None ):
550
562
""" Deal with an AuthnResponse
551
563
552
564
:param xmlstr: The reply as a xml string
553
565
:param binding: Which binding that was used for the transport
554
566
:param outstanding: A dictionary with session IDs as keys and
555
567
the original web request from the user before redirection
556
568
as values.
557
- :param only_identity_in_encrypted_assertion: Must exist an assertion that is not encrypted that contains all
558
- other information like subject and authentication statement.
569
+ :param only_identity_in_encrypted_assertion: Must exist an assertion
570
+ that is not encrypted that contains all
571
+ other information like
572
+ subject and
573
+ authentication statement.
559
574
:return: An response.AuthnResponse or None
560
575
"""
561
576
@@ -576,7 +591,7 @@ def parse_authn_request_response(self, xmlstr, binding, outstanding=None,
576
591
"entity_id" : self .config .entityid ,
577
592
"attribute_converters" : self .config .attribute_converters ,
578
593
"allow_unknown_attributes" :
579
- self .config .allow_unknown_attributes ,
594
+ self .config .allow_unknown_attributes ,
580
595
}
581
596
try :
582
597
resp = self ._parse_response (xmlstr , AuthnResponse ,
@@ -594,20 +609,22 @@ def parse_authn_request_response(self, xmlstr, binding, outstanding=None,
594
609
if resp is None :
595
610
return None
596
611
elif isinstance (resp , AuthnResponse ):
597
- if resp .assertion is not None and len (resp .response .encrypted_assertion ) == 0 :
612
+ if resp .assertion is not None and len (
613
+ resp .response .encrypted_assertion ) == 0 :
598
614
self .users .add_information_about_person (resp .session_info ())
599
615
logger .info ("--- ADDED person info ----" )
600
616
pass
601
617
else :
602
- logger .error ("Response type not supported: %s" , saml2 .class_name (resp ))
618
+ logger .error ("Response type not supported: %s" ,
619
+ saml2 .class_name (resp ))
603
620
return resp
604
621
605
622
# ------------------------------------------------------------------------
606
623
# SubjectQuery, AuthnQuery, RequestedAuthnContext, AttributeQuery,
607
624
# AuthzDecisionQuery all get Response as response
608
625
609
626
def parse_authz_decision_query_response (self , response ,
610
- binding = BINDING_SOAP ):
627
+ binding = BINDING_SOAP ):
611
628
""" Verify that the response is OK
612
629
"""
613
630
kwargs = {"entity_id" : self .config .entityid ,
@@ -658,7 +675,7 @@ def parse_name_id_mapping_request_response(self, txt, binding=BINDING_SOAP):
658
675
# ------------------- ECP ------------------------------------------------
659
676
660
677
def create_ecp_authn_request (self , entityid = None , relay_state = "" ,
661
- sign = False , ** kwargs ):
678
+ sign = False , ** kwargs ):
662
679
""" Makes an authentication request.
663
680
664
681
:param entityid: The entity ID of the IdP to send the request to
@@ -710,7 +727,7 @@ def create_ecp_authn_request(self, entityid=None, relay_state="",
710
727
_ , location = self .pick_binding ("single_sign_on_service" ,
711
728
[_binding ], entity_id = entityid )
712
729
req_id , authn_req = self .create_authn_request (
713
- location , service_url_binding = BINDING_PAOS , ** kwargs )
730
+ location , service_url_binding = BINDING_PAOS , ** kwargs )
714
731
715
732
# ----------------------------------------
716
733
# The SOAP envelope
@@ -730,8 +747,8 @@ def parse_ecp_authn_response(self, txt, outstanding=None):
730
747
731
748
_relay_state = None
732
749
for item in rdict ["header" ]:
733
- if item .c_tag == "RelayState" and \
734
- item .c_namespace == ecp .NAMESPACE :
750
+ if item .c_tag == "RelayState" and \
751
+ item .c_namespace == ecp .NAMESPACE :
735
752
_relay_state = item
736
753
737
754
response = self .parse_authn_request_response (rdict ["body" ],
@@ -805,7 +822,7 @@ def create_discovery_service_request(url, entity_id, **kwargs):
805
822
806
823
@staticmethod
807
824
def parse_discovery_service_response (url = "" , query = "" ,
808
- returnIDParam = "entityID" ):
825
+ returnIDParam = "entityID" ):
809
826
"""
810
827
Deal with the response url from a Discovery Service
811
828
0 commit comments