1
1
#!/usr/bin/env python
2
2
import argparse
3
3
import base64
4
-
4
+ import xmldsig as ds
5
5
import re
6
6
import logging
7
7
import time
24
24
from saml2 .authn_context import PASSWORD
25
25
from saml2 .authn_context import UNSPECIFIED
26
26
from saml2 .authn_context import authn_context_class_ref
27
+ from saml2 .extension import pefim
27
28
from saml2 .httputil import Response
28
29
from saml2 .httputil import NotFound
29
30
from saml2 .httputil import geturl
38
39
from saml2 .s_utils import UnknownPrincipal
39
40
from saml2 .s_utils import UnsupportedBinding
40
41
from saml2 .s_utils import PolicyError
41
- from saml2 .sigver import verify_redirect_signature
42
+ from saml2 .sigver import verify_redirect_signature , cert_from_instance , encrypt_cert_from_item
42
43
43
44
logger = logging .getLogger ("saml2.idp" )
44
45
@@ -125,8 +126,9 @@ def operation(self, _dict, binding):
125
126
return resp (self .environ , self .start_response )
126
127
else :
127
128
try :
129
+ _encrypt_cert = encrypt_cert_from_item (_dict ["req_info" ].message )
128
130
return self .do (_dict ["SAMLRequest" ], binding ,
129
- _dict ["RelayState" ])
131
+ _dict ["RelayState" ], encrypt_cert = _encrypt_cert )
130
132
except KeyError :
131
133
# Can live with no relay state
132
134
return self .do (_dict ["SAMLRequest" ], binding )
@@ -151,7 +153,7 @@ def response(self, binding, http_args):
151
153
resp = Response (http_args ["data" ], headers = http_args ["headers" ])
152
154
return resp (self .environ , self .start_response )
153
155
154
- def do (self , query , binding , relay_state = "" ):
156
+ def do (self , query , binding , relay_state = "" , encrypt_cert = None ):
155
157
pass
156
158
157
159
def redirect (self ):
@@ -277,7 +279,7 @@ def verify_request(self, query, binding):
277
279
278
280
return resp_args , _resp
279
281
280
- def do (self , query , binding_in , relay_state = "" ):
282
+ def do (self , query , binding_in , relay_state = "" , encrypt_cert = None ):
281
283
try :
282
284
resp_args , _resp = self .verify_request (query , binding_in )
283
285
except UnknownPrincipal , excp :
@@ -297,13 +299,10 @@ def do(self, query, binding_in, relay_state=""):
297
299
if REPOZE_ID_EQUIVALENT :
298
300
identity [REPOZE_ID_EQUIVALENT ] = self .user
299
301
try :
300
- sign_assertion = IDP .config .getattr ("sign_assertion" , "idp" )
301
- if sign_assertion is None :
302
- sign_assertion = False
303
302
_resp = IDP .create_authn_response (
304
303
identity , userid = self .user ,
305
- authn = AUTHN_BROKER [self .environ ["idp.authn_ref" ]], sign_assertion = sign_assertion ,
306
- sign_response = False , ** resp_args )
304
+ authn = AUTHN_BROKER [self .environ ["idp.authn_ref" ]], sign_response = False , encrypt_cert = encrypt_cert ,
305
+ ** resp_args )
307
306
except Exception , excp :
308
307
logging .error (exception_trace (excp ))
309
308
resp = ServiceError ("Exception: %s" % (excp ,))
@@ -537,7 +536,7 @@ def not_found(environ, start_response):
537
536
# return subject, sp_entity_id
538
537
539
538
class SLO (Service ):
540
- def do (self , request , binding , relay_state = "" ):
539
+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
541
540
logger .info ("--- Single Log Out Service ---" )
542
541
try :
543
542
_ , body = request .split ("\n " )
@@ -589,7 +588,7 @@ def do(self, request, binding, relay_state=""):
589
588
590
589
class NMI (Service ):
591
590
592
- def do (self , query , binding , relay_state = "" ):
591
+ def do (self , query , binding , relay_state = "" , encrypt_cert = None ):
593
592
logger .info ("--- Manage Name ID Service ---" )
594
593
req = IDP .parse_manage_name_id_request (query , binding )
595
594
request = req .message
@@ -617,7 +616,7 @@ def do(self, query, binding, relay_state=""):
617
616
618
617
# Only URI binding
619
618
class AIDR (Service ):
620
- def do (self , aid , binding , relay_state = "" ):
619
+ def do (self , aid , binding , relay_state = "" , encrypt_cert = None ):
621
620
logger .info ("--- Assertion ID Service ---" )
622
621
623
622
try :
@@ -646,7 +645,7 @@ def operation(self, _dict, binding, **kwargs):
646
645
# ----------------------------------------------------------------------------
647
646
648
647
class ARS (Service ):
649
- def do (self , request , binding , relay_state = "" ):
648
+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
650
649
_req = IDP .parse_artifact_resolve (request , binding )
651
650
652
651
msg = IDP .create_artifact_response (_req , _req .artifact .text )
@@ -664,7 +663,7 @@ def do(self, request, binding, relay_state=""):
664
663
665
664
# Only SOAP binding
666
665
class AQS (Service ):
667
- def do (self , request , binding , relay_state = "" ):
666
+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
668
667
logger .info ("--- Authn Query Service ---" )
669
668
_req = IDP .parse_authn_query (request , binding )
670
669
_query = _req .message
@@ -688,7 +687,7 @@ def do(self, request, binding, relay_state=""):
688
687
689
688
# Only SOAP binding
690
689
class ATTR (Service ):
691
- def do (self , request , binding , relay_state = "" ):
690
+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
692
691
logger .info ("--- Attribute Query Service ---" )
693
692
694
693
_req = IDP .parse_attribute_query (request , binding )
@@ -721,7 +720,7 @@ def do(self, request, binding, relay_state=""):
721
720
722
721
723
722
class NIM (Service ):
724
- def do (self , query , binding , relay_state = "" ):
723
+ def do (self , query , binding , relay_state = "" , encrypt_cert = None ):
725
724
req = IDP .parse_name_id_mapping_request (query , binding )
726
725
request = req .message
727
726
# Do the necessary stuff
0 commit comments