Skip to content

Commit d6d76e1

Browse files
author
Hans Hörberg
committed
Added PEFIM changes that had been removed.
1 parent 93bdb86 commit d6d76e1

File tree

4 files changed

+53
-24
lines changed

4 files changed

+53
-24
lines changed

src/saml2/extension/pefim.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import saml2
44
from saml2 import SamlBase
5-
from saml2.xmldsig import X509Data
5+
from saml2.xmldsig import KeyInfo
66

77
NAMESPACE = 'urn:net:eustix:names:tc:PEFIM:0.0:assertion'
88

@@ -16,19 +16,31 @@ class SPCertEncType_(SamlBase):
1616
c_attributes = SamlBase.c_attributes.copy()
1717
c_child_order = SamlBase.c_child_order[:]
1818
c_cardinality = SamlBase.c_cardinality.copy()
19-
c_children['{http://www.w3.org/2000/09/xmldsig#}X509Data'] = ('x509_data',
20-
[X509Data])
19+
c_children['{http://www.w3.org/2000/09/xmldsig#}KeyInfo'] = ('key_info',
20+
[KeyInfo])
21+
c_cardinality['key_info'] = {"min": 1}
22+
c_attributes['VerifyDepth'] = ('verify_depth', 'unsignedByte', False)
23+
c_child_order.extend(['key_info'])
2124

2225
def __init__(self,
26+
key_info=None,
2327
x509_data=None,
28+
verify_depth='1',
2429
text=None,
2530
extension_elements=None,
2631
extension_attributes=None):
2732
SamlBase.__init__(self,
2833
text=text,
2934
extension_elements=extension_elements,
3035
extension_attributes=extension_attributes)
31-
self.x509_data = x509_data
36+
if key_info:
37+
self.key_info = key_info
38+
elif x509_data:
39+
self.key_info = KeyInfo(x509_data=x509_data)
40+
else:
41+
self.key_info = []
42+
self.verify_depth = verify_depth
43+
#self.x509_data = x509_data
3244

3345

3446
def spcertenc_type__from_string(xml_string):
@@ -62,5 +74,4 @@ def spcertenc_from_string(xml_string):
6274

6375

6476
def factory(tag, **kwargs):
65-
return ELEMENT_BY_TAG[tag](**kwargs)
66-
77+
return ELEMENT_BY_TAG[tag](**kwargs)

src/saml2/response.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -871,11 +871,16 @@ def parse_assertion(self, keys=None):
871871
logger.debug("***Encrypted assertion/-s***")
872872
decr_text = "%s" % self.response
873873
resp = self.response
874-
while self.find_encrypt_data(resp):
874+
decr_text_old = None
875+
while self.find_encrypt_data(resp) and decr_text_old != decr_text:
876+
decr_text_old = decr_text
875877
decr_text = self.sec.decrypt_keys(decr_text, keys)
876878
resp = samlp.response_from_string(decr_text)
877879
_enc_assertions = self.decrypt_assertions(resp.encrypted_assertion, decr_text)
878-
while self.find_encrypt_data(resp) or self.find_encrypt_data_assertion_list(_enc_assertions):
880+
decr_text_old = None
881+
while self.find_encrypt_data(resp) or self.find_encrypt_data_assertion_list(_enc_assertions) and \
882+
decr_text_old != decr_text:
883+
decr_text_old = decr_text
879884
decr_text = self.sec.decrypt_keys(decr_text, keys)
880885
resp = samlp.response_from_string(decr_text)
881886
_enc_assertions = self.decrypt_assertions(resp.encrypted_assertion, decr_text, verified=True)
@@ -893,7 +898,8 @@ def parse_assertion(self, keys=None):
893898
tmp_ass.advice.assertion.extend(advice_res)
894899
else:
895900
tmp_ass.advice.assertion = advice_res
896-
tmp_ass.advice.encrypted_assertion = []
901+
if len(advice_res) > 0:
902+
tmp_ass.advice.encrypted_assertion = []
897903
self.response.assertion = resp.assertion
898904
for assertion in _enc_assertions:
899905
if not self._assertion(assertion, True):
@@ -902,7 +908,8 @@ def parse_assertion(self, keys=None):
902908
self.assertions.append(assertion)
903909

904910
self.xmlstr = decr_text
905-
self.response.encrypted_assertion = []
911+
if len(_enc_assertions) > 0:
912+
self.response.encrypted_assertion = []
906913

907914
if self.response.assertion:
908915
for assertion in self.response.assertion:

src/saml2/sigver.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
from saml2.cert import OpenSSLWrapper
4343
from saml2.extension import pefim
44+
from saml2.extension.pefim import SPCertEnc
4445
from saml2.saml import EncryptedAssertion
4546

4647
import saml2.xmldsig as ds
@@ -1066,21 +1067,30 @@ def security_context(conf, debug=None):
10661067
def encrypt_cert_from_item(item):
10671068
_encrypt_cert = None
10681069
try:
1069-
_elem = extension_elements_to_elements(item.extension_elements[0].children,
1070-
[pefim, ds])
1071-
if len(_elem) == 1:
1072-
_encrypt_cert = _elem[0].x509_data[0].x509_certificate.text
1073-
#else:
1074-
# certs = cert_from_instance(item)
1075-
# if len(certs) > 0:
1076-
# _encrypt_cert = certs[0]
1077-
except Exception:
1070+
try:
1071+
_elem = extension_elements_to_elements(item.extensions.extension_elements,[pefim, ds])
1072+
except:
1073+
_elem = extension_elements_to_elements(item.extension_elements[0].children,
1074+
[pefim, ds])
1075+
1076+
for _tmp_elem in _elem:
1077+
if isinstance(_tmp_elem, SPCertEnc):
1078+
for _tmp_key_info in _tmp_elem.key_info:
1079+
if _tmp_key_info.x509_data is not None and len(_tmp_key_info.x509_data) > 0:
1080+
_encrypt_cert = _tmp_key_info.x509_data[0].x509_certificate.text
1081+
break
1082+
#_encrypt_cert = _elem[0].x509_data[0].x509_certificate.text
1083+
# else:
1084+
# certs = cert_from_instance(item)
1085+
# if len(certs) > 0:
1086+
# _encrypt_cert = certs[0]
1087+
except Exception as _exception:
10781088
pass
10791089

1080-
#if _encrypt_cert is None:
1081-
# certs = cert_from_instance(item)
1082-
# if len(certs) > 0:
1083-
# _encrypt_cert = certs[0]
1090+
# if _encrypt_cert is None:
1091+
# certs = cert_from_instance(item)
1092+
# if len(certs) > 0:
1093+
# _encrypt_cert = certs[0]
10841094

10851095
if _encrypt_cert is not None:
10861096
if _encrypt_cert.find("-----BEGIN CERTIFICATE-----\n") == -1:
@@ -1090,6 +1100,7 @@ def encrypt_cert_from_item(item):
10901100
return _encrypt_cert
10911101

10921102

1103+
10931104
class CertHandlerExtra(object):
10941105
def __init__(self):
10951106
pass

tests/test_82_pefim.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@
4848

4949
assert len(_elem) == 1
5050
_spcertenc = _elem[0]
51-
_cert = _spcertenc.x509_data[0].x509_certificate.text
51+
_cert = _spcertenc.key_info[0].x509_data[0].x509_certificate.text
5252
assert cert == _cert

0 commit comments

Comments
 (0)