11#!/usr/bin/env python
22import argparse
33import base64
4-
4+ import xmldsig as ds
55import re
66import logging
77import time
2424from saml2 .authn_context import PASSWORD
2525from saml2 .authn_context import UNSPECIFIED
2626from saml2 .authn_context import authn_context_class_ref
27+ from saml2 .extension import pefim
2728from saml2 .httputil import Response
2829from saml2 .httputil import NotFound
2930from saml2 .httputil import geturl
3839from saml2 .s_utils import UnknownPrincipal
3940from saml2 .s_utils import UnsupportedBinding
4041from 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
4243
4344logger = logging .getLogger ("saml2.idp" )
4445
@@ -125,8 +126,9 @@ def operation(self, _dict, binding):
125126 return resp (self .environ , self .start_response )
126127 else :
127128 try :
129+ _encrypt_cert = encrypt_cert_from_item (_dict ["req_info" ].message )
128130 return self .do (_dict ["SAMLRequest" ], binding ,
129- _dict ["RelayState" ])
131+ _dict ["RelayState" ], encrypt_cert = _encrypt_cert )
130132 except KeyError :
131133 # Can live with no relay state
132134 return self .do (_dict ["SAMLRequest" ], binding )
@@ -151,7 +153,7 @@ def response(self, binding, http_args):
151153 resp = Response (http_args ["data" ], headers = http_args ["headers" ])
152154 return resp (self .environ , self .start_response )
153155
154- def do (self , query , binding , relay_state = "" ):
156+ def do (self , query , binding , relay_state = "" , encrypt_cert = None ):
155157 pass
156158
157159 def redirect (self ):
@@ -277,7 +279,7 @@ def verify_request(self, query, binding):
277279
278280 return resp_args , _resp
279281
280- def do (self , query , binding_in , relay_state = "" ):
282+ def do (self , query , binding_in , relay_state = "" , encrypt_cert = None ):
281283 try :
282284 resp_args , _resp = self .verify_request (query , binding_in )
283285 except UnknownPrincipal , excp :
@@ -297,13 +299,10 @@ def do(self, query, binding_in, relay_state=""):
297299 if REPOZE_ID_EQUIVALENT :
298300 identity [REPOZE_ID_EQUIVALENT ] = self .user
299301 try :
300- sign_assertion = IDP .config .getattr ("sign_assertion" , "idp" )
301- if sign_assertion is None :
302- sign_assertion = False
303302 _resp = IDP .create_authn_response (
304303 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" ]], encrypt_cert = encrypt_cert ,
305+ ** resp_args )
307306 except Exception , excp :
308307 logging .error (exception_trace (excp ))
309308 resp = ServiceError ("Exception: %s" % (excp ,))
@@ -537,7 +536,7 @@ def not_found(environ, start_response):
537536# return subject, sp_entity_id
538537
539538class SLO (Service ):
540- def do (self , request , binding , relay_state = "" ):
539+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
541540 logger .info ("--- Single Log Out Service ---" )
542541 try :
543542 _ , body = request .split ("\n " )
@@ -589,7 +588,7 @@ def do(self, request, binding, relay_state=""):
589588
590589class NMI (Service ):
591590
592- def do (self , query , binding , relay_state = "" ):
591+ def do (self , query , binding , relay_state = "" , encrypt_cert = None ):
593592 logger .info ("--- Manage Name ID Service ---" )
594593 req = IDP .parse_manage_name_id_request (query , binding )
595594 request = req .message
@@ -617,7 +616,7 @@ def do(self, query, binding, relay_state=""):
617616
618617# Only URI binding
619618class AIDR (Service ):
620- def do (self , aid , binding , relay_state = "" ):
619+ def do (self , aid , binding , relay_state = "" , encrypt_cert = None ):
621620 logger .info ("--- Assertion ID Service ---" )
622621
623622 try :
@@ -646,7 +645,7 @@ def operation(self, _dict, binding, **kwargs):
646645# ----------------------------------------------------------------------------
647646
648647class ARS (Service ):
649- def do (self , request , binding , relay_state = "" ):
648+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
650649 _req = IDP .parse_artifact_resolve (request , binding )
651650
652651 msg = IDP .create_artifact_response (_req , _req .artifact .text )
@@ -664,7 +663,7 @@ def do(self, request, binding, relay_state=""):
664663
665664# Only SOAP binding
666665class AQS (Service ):
667- def do (self , request , binding , relay_state = "" ):
666+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
668667 logger .info ("--- Authn Query Service ---" )
669668 _req = IDP .parse_authn_query (request , binding )
670669 _query = _req .message
@@ -688,7 +687,7 @@ def do(self, request, binding, relay_state=""):
688687
689688# Only SOAP binding
690689class ATTR (Service ):
691- def do (self , request , binding , relay_state = "" ):
690+ def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
692691 logger .info ("--- Attribute Query Service ---" )
693692
694693 _req = IDP .parse_attribute_query (request , binding )
@@ -721,7 +720,7 @@ def do(self, request, binding, relay_state=""):
721720
722721
723722class NIM (Service ):
724- def do (self , query , binding , relay_state = "" ):
723+ def do (self , query , binding , relay_state = "" , encrypt_cert = None ):
725724 req = IDP .parse_name_id_mapping_request (query , binding )
726725 request = req .message
727726 # Do the necessary stuff
0 commit comments