Skip to content

Commit c041083

Browse files
committed
WIP works good - set on init use on create_
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent fb86347 commit c041083

File tree

5 files changed

+70
-51
lines changed

5 files changed

+70
-51
lines changed

src/saml2/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@ def global_logout(self, name_id, reason="", expire=None, sign=None,
201201
return self.do_logout(name_id, entity_ids, reason, expire, sign,
202202
sign_alg=sign_alg, digest_alg=digest_alg)
203203

204+
# XXX calls DefaultSignature
205+
# XXX calls self.sign
204206
def do_logout(self, name_id, entity_ids, reason, expire, sign=None,
205207
expected_binding=None, sign_alg=None, digest_alg=None,
206208
**kwargs):

src/saml2/client_base.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656

5757
from saml2.xmldsig import SIG_ALLOWED_ALG
5858
from saml2.xmldsig import DIGEST_ALLOWED_ALG
59-
from saml2.xmldsig import DefaultSignature
59+
6060

6161
logger = logging.getLogger(__name__)
6262

@@ -184,10 +184,6 @@ def __init__(self, config=None, identity_cache=None, state_cache=None,
184184
val = True
185185
setattr(self, attr, val)
186186

187-
# signing and digest algs
188-
self.signing_algorithm = self.config.getattr('signing_algorithm', "sp")
189-
self.digest_algorithm = self.config.getattr('digest_algorithm', "sp")
190-
191187
if self.entity_type == "sp" and not any(
192188
[
193189
self.want_assertions_signed,
@@ -287,6 +283,7 @@ def service_urls(self, binding=BINDING_HTTP_POST):
287283
else:
288284
return None
289285

286+
# XXX sp create
290287
def create_authn_request(
291288
self,
292289
destination,
@@ -451,12 +448,9 @@ def create_authn_request(
451448
client_crt = kwargs.get("client_crt")
452449
nsprefix = kwargs.get("nsprefix")
453450

454-
# XXX will be used to embed the signature to the xml doc - ie, POST binding
455-
# XXX always called by the SP, no need to check the context
456-
sign = self.authn_requests_signed if sign is None else sign
457-
def_sig = DefaultSignature()
458-
sign_alg = sign_alg or def_sig.get_sign_alg()
459-
digest_alg = digest_alg or def_sig.get_digest_alg()
451+
sign = sign if sign is not None else self.should_sign
452+
sign_alg = sign_alg or self.signing_algorithm
453+
digest_alg = digest_alg or self.digest_algorithm
460454

461455
if sign_alg not in [long_name for short_name, long_name in SIG_ALLOWED_ALG]:
462456
raise Exception(
@@ -506,6 +500,7 @@ def create_authn_request(
506500

507501
return msg
508502

503+
# XXX sp create
509504
def create_attribute_query(self, destination, name_id=None,
510505
attribute=None, message_id=0, consent=None,
511506
extensions=None, sign=False, sign_prepare=False, sign_alg=None,
@@ -572,6 +567,7 @@ def create_attribute_query(self, destination, name_id=None,
572567
# MUST use SOAP for
573568
# AssertionIDRequest, SubjectQuery,
574569
# AuthnQuery, AttributeQuery, or AuthzDecisionQuery
570+
# XXX sp create
575571
def create_authz_decision_query(self, destination, action,
576572
evidence=None, resource=None, subject=None,
577573
message_id=0, consent=None, extensions=None,
@@ -596,6 +592,7 @@ def create_authz_decision_query(self, destination, action,
596592
subject=subject, sign_alg=sign_alg,
597593
digest_alg=digest_alg, **kwargs)
598594

595+
# XXX sp create
599596
def create_authz_decision_query_using_assertion(self, destination,
600597
assertion, action=None,
601598
resource=None,
@@ -632,6 +629,7 @@ def create_authz_decision_query_using_assertion(self, destination,
632629
extensions=extensions, sign=sign, nsprefix=nsprefix)
633630

634631
@staticmethod
632+
# XXX sp create
635633
def create_assertion_id_request(assertion_id_refs, **kwargs):
636634
"""
637635
@@ -644,6 +642,7 @@ def create_assertion_id_request(assertion_id_refs, **kwargs):
644642
else:
645643
return 0, assertion_id_refs[0]
646644

645+
# XXX sp create
647646
def create_authn_query(self, subject, destination=None, authn_context=None,
648647
session_index="", message_id=0, consent=None,
649648
extensions=None, sign=False, nsprefix=None, sign_alg=None,
@@ -667,6 +666,7 @@ def create_authn_query(self, subject, destination=None, authn_context=None,
667666
nsprefix=nsprefix, sign_alg=sign_alg,
668667
digest_alg=digest_alg)
669668

669+
# XXX sp create
670670
def create_name_id_mapping_request(self, name_id_policy,
671671
name_id=None, base_id=None,
672672
encrypted_id=None, destination=None,
@@ -828,6 +828,7 @@ def parse_name_id_mapping_request_response(self, txt, binding=BINDING_SOAP):
828828

829829
# ------------------- ECP ------------------------------------------------
830830

831+
# XXX sp create
831832
def create_ecp_authn_request(self, entityid=None, relay_state="",
832833
sign=False, **kwargs):
833834
""" Makes an authentication request.
@@ -932,6 +933,7 @@ def can_handle_ecp_response(response):
932933
# ----------------------------------------------------------------------
933934

934935
@staticmethod
936+
# XXX sp create
935937
def create_discovery_service_request(url, entity_id, **kwargs):
936938
"""
937939
Created the HTTP redirect URL needed to send the user to the

src/saml2/entity.py

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,24 @@ def __init__(self, entity_type, config=None, config_file="",
141141
else:
142142
raise SAMLError("Missing configuration")
143143

144+
def_sig = DefaultSignature()
145+
self.signing_algorithm = (
146+
self.config.getattr('signing_algorithm')
147+
or def_sig.get_sign_alg()
148+
)
149+
self.digest_algorithm = (
150+
self.config.getattr('digest_algorithm')
151+
or def_sig.get_digest_alg()
152+
)
153+
sign_config = (
154+
self.config.getattr("authn_requests_signed", "sp")
155+
if self.entity_type == "sp"
156+
else self.config.getattr("sign_response", "idp")
157+
if self.entity_type == "idp"
158+
else False
159+
)
160+
self.should_sign = sign_config
161+
144162
for item in ["cert_file", "key_file", "ca_certs"]:
145163
_val = getattr(self.config, item, None)
146164
if not _val:
@@ -219,20 +237,8 @@ def apply_binding(
219237
:return: A dictionary
220238
"""
221239

222-
# XXX authn_requests_signed (obj property) applies only to an SP
223-
# XXX sign_response (config option) applies to idp/aa
224-
# XXX Looking into sp/idp/aa properties should be done in the same way
225-
# XXX ^this discrepancy should be fixed
226-
sign_config = (
227-
self.authn_requests_signed
228-
if self.config.context == "sp"
229-
else self.config.getattr("sign_response")
230-
if self.config.context == "idp"
231-
else None
232-
)
233-
sign = sign_config if sign is None else sign
234-
def_sig = DefaultSignature()
235-
sigalg = sigalg or def_sig.get_sign_alg()
240+
sign = sign if sign is not None else self.should_sign
241+
sigalg = sigalg or self.signing_algorithm
236242

237243
# unless if BINDING_HTTP_ARTIFACT
238244
if response:
@@ -453,10 +459,6 @@ def sign(
453459
sign_alg=None,
454460
digest_alg=None,
455461
):
456-
# sign adn digest algs
457-
sign_alg = sign_alg or self.signing_algorithm
458-
digest_alg = digest_alg or self.digest_algorithm
459-
460462
if msg.signature is None:
461463
msg.signature = pre_signature_part(
462464
msg.id, self.sec.my_cert, 1, sign_alg=sign_alg, digest_alg=digest_alg
@@ -476,6 +478,7 @@ def sign(
476478
logger.info("REQUEST: %s", msg)
477479
return signed_instance_factory(msg, self.sec, to_sign)
478480

481+
# XXX calls self.sign
479482
def _message(
480483
self,
481484
request_cls,
@@ -629,6 +632,7 @@ def _encrypt_assertion(self, encrypt_cert, sp_entity_id, response,
629632
raise exception
630633
return response
631634

635+
# XXX calls self.sign
632636
def _response(self, in_response_to, consumer_url=None, status=None,
633637
issuer=None, sign=False, to_sign=None, sp_entity_id=None,
634638
encrypt_assertion=False,
@@ -806,6 +810,7 @@ def _response(self, in_response_to, consumer_url=None, status=None,
806810
else:
807811
return response
808812

813+
# XXX calls self.sign
809814
def _status_response(self, response_class, issuer, status, sign=False,
810815
sign_alg=None, digest_alg=None,
811816
**kwargs):
@@ -914,6 +919,7 @@ def _parse_request(self, enc_request, request_cls, service, binding):
914919

915920
# ------------------------------------------------------------------------
916921

922+
# XXX ent create
917923
def create_error_response(self, in_response_to, destination, info,
918924
sign=False, issuer=None, sign_alg=None,
919925
digest_alg=None, **kwargs):
@@ -936,6 +942,7 @@ def create_error_response(self, in_response_to, destination, info,
936942

937943
# ------------------------------------------------------------------------
938944

945+
# XXX ent create
939946
def create_logout_request(self, destination, issuer_entity_id,
940947
subject_id=None, name_id=None,
941948
reason=None, expire=None, message_id=0,
@@ -988,6 +995,7 @@ def create_logout_request(self, destination, issuer_entity_id,
988995
issuer=self._issuer(), sign_alg=sign_alg,
989996
digest_alg=digest_alg, **args)
990997

998+
# XXX ent create
991999
def create_logout_response(self, request, bindings=None, status=None,
9921000
sign=False, issuer=None, sign_alg=None,
9931001
digest_alg=None):
@@ -1015,6 +1023,7 @@ def create_logout_response(self, request, bindings=None, status=None,
10151023

10161024
return response
10171025

1026+
# XXX ent create
10181027
def create_artifact_resolve(self, artifact, destination, sessid,
10191028
consent=None, extensions=None, sign=False,
10201029
sign_alg=None, digest_alg=None):
@@ -1036,6 +1045,7 @@ def create_artifact_resolve(self, artifact, destination, sessid,
10361045
consent, extensions, sign, artifact=artifact,
10371046
sign_alg=sign_alg, digest_alg=digest_alg)
10381047

1048+
# XXX ent create
10391049
def create_artifact_response(self, request, artifact, bindings=None,
10401050
status=None, sign=False, issuer=None,
10411051
sign_alg=None, digest_alg=None):
@@ -1056,6 +1066,7 @@ def create_artifact_response(self, request, artifact, bindings=None,
10561066

10571067
return response
10581068

1069+
# XXX ent create
10591070
def create_manage_name_id_request(self, destination, message_id=0,
10601071
consent=None, extensions=None, sign=False,
10611072
name_id=None, new_id=None,
@@ -1114,6 +1125,7 @@ def parse_manage_name_id_request(self, xmlstr, binding=BINDING_SOAP):
11141125
return self._parse_request(xmlstr, saml_request.ManageNameIDRequest,
11151126
"manage_name_id_service", binding)
11161127

1128+
# XXX ent create
11171129
def create_manage_name_id_response(self, request, bindings=None,
11181130
status=None, sign=False, issuer=None,
11191131
sign_alg=None, digest_alg=None,

src/saml2/server.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,15 @@ def _shelve_compat(name, *args, **kwargs):
7777
class Server(Entity):
7878
""" A class that does things that IdPs or AAs do """
7979

80-
def __init__(self, config_file="", config=None, cache=None, stype="idp",
81-
symkey="", msg_cb=None):
80+
def __init__(
81+
self,
82+
config_file="",
83+
config=None,
84+
cache=None,
85+
stype="idp",
86+
symkey="",
87+
msg_cb=None,
88+
):
8289
Entity.__init__(self, stype, config, config_file, msg_cb=msg_cb)
8390
self.eptid = None
8491
self.init_config(stype)
@@ -218,6 +225,7 @@ def verify_assertion_consumer_service(self, request):
218225
return False
219226

220227
# -------------------------------------------------------------------------
228+
221229
def parse_authn_request(self, enc_request, binding=BINDING_HTTP_REDIRECT):
222230
"""Parse a Authentication Request
223231
@@ -438,7 +446,6 @@ def _authn_response(
438446
:param encrypt_cert_assertion: Certificate to be used for encryption
439447
of assertions.
440448
:param authn_statement: Authentication statement.
441-
:param sign_assertion: True if assertions should be signed.
442449
:param pefim: True if a response according to the PEFIM profile
443450
should be created.
444451
:param farg: Argument to pass on to the assertion constructor
@@ -510,7 +517,7 @@ def _authn_response(
510517

511518
# ------------------------------------------------------------------------
512519

513-
# noinspection PyUnusedLocal
520+
# XXX idp create
514521
def create_attribute_response(self, identity, in_response_to, destination,
515522
sp_entity_id, userid="", name_id=None,
516523
status=None, issuer=None,
@@ -594,28 +601,24 @@ def create_attribute_response(self, identity, in_response_to, destination,
594601
def gather_authn_response_args(
595602
self, sp_entity_id, name_id_policy, userid, **kwargs
596603
):
604+
kwargs["policy"] = kwargs.get("release_policy")
605+
597606
# collect args and return them
598607
args = {}
599608

600-
args["policy"] = kwargs.get(
601-
"release_policy", self.config.getattr("policy", "idp")
602-
)
603-
args['best_effort'] = kwargs.get("best_effort", False)
604-
609+
# XXX will be passed to _authn_response
605610
param_defaults = {
611+
'policy': None,
612+
'best_effort': False,
606613
'sign_assertion': False,
607614
'sign_response': False,
608615
'encrypt_assertion': False,
609616
'encrypt_assertion_self_contained': True,
610617
'encrypted_advice_attributes': False,
611618
'encrypt_cert_advice': None,
612619
'encrypt_cert_assertion': None,
620+
# need to be named sign_alg and digest_alg
613621
}
614-
615-
# signing and digest algs
616-
self.signing_algorithm = self.config.getattr('signing_algorithm', "idp")
617-
self.digest_algorithm = self.config.getattr('digest_algorithm', "idp")
618-
619622
for param, val_default in param_defaults.items():
620623
val_kw = kwargs.get(param)
621624
val_config = self.config.getattr(param, "idp")
@@ -687,6 +690,7 @@ def gather_authn_response_args(
687690

688691
return args
689692

693+
# XXX idp create
690694
def create_authn_response(
691695
self,
692696
identity,
@@ -736,7 +740,6 @@ def create_authn_response(
736740
assertions in the advice element.
737741
:param encrypt_cert_assertion: Certificate to be used for encryption
738742
of assertions.
739-
:param sign_assertion: True if assertions should be signed.
740743
:param pefim: True if a response according to the PEFIM profile
741744
should be created.
742745
:return: A response instance
@@ -785,6 +788,7 @@ def create_authn_response(
785788
return self.create_error_response(in_response_to, destination,
786789
sp_entity_id, exc, name_id)
787790

791+
# XXX idp create
788792
def create_authn_request_response(self, identity, in_response_to,
789793
destination, sp_entity_id,
790794
name_id_policy=None, userid=None,
@@ -800,7 +804,7 @@ def create_authn_request_response(self, identity, in_response_to,
800804
authn_decl=authn_decl,
801805
session_not_on_or_after=session_not_on_or_after)
802806

803-
# noinspection PyUnusedLocal
807+
# XXX idp create
804808
def create_assertion_id_request_response(self, assertion_id, sign=False,
805809
sign_alg=None,
806810
digest_alg=None, **kwargs):
@@ -827,7 +831,8 @@ def create_assertion_id_request_response(self, assertion_id, sign=False,
827831
else:
828832
return assertion
829833

830-
# noinspection PyUnusedLocal
834+
# XXX calls self.sign => should it call _message (which calls self.sign)?
835+
# XXX idp create
831836
def create_name_id_mapping_response(self, name_id=None, encrypted_id=None,
832837
in_response_to=None,
833838
issuer=None, sign_response=False,
@@ -859,6 +864,7 @@ def create_name_id_mapping_response(self, name_id=None, encrypted_id=None,
859864
logger.info("Message: %s", _resp)
860865
return _resp
861866

867+
# XXX idp create
862868
def create_authn_query_response(self, subject, session_index=None,
863869
requested_context=None, in_response_to=None,
864870
issuer=None, sign_response=False,
@@ -892,6 +898,7 @@ def create_authn_query_response(self, subject, session_index=None,
892898
def parse_ecp_authn_request(self):
893899
pass
894900

901+
# XXX idp create
895902
def create_ecp_authn_request_response(self, acs_url, identity,
896903
in_response_to, destination,
897904
sp_entity_id, name_id_policy=None,

0 commit comments

Comments
 (0)