Skip to content

Commit c4eac48

Browse files
author
Roland Hedberg
committed
Merge pull request #224 from SpamapS/master
A plethora of python3 fixes
2 parents 5003a5f + f412b22 commit c4eac48

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+294
-240
lines changed

src/saml2/__init__.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ def create_class_from_xml_string(target_class, xml_string):
8383
the contents of the XML - or None if the root XML tag and namespace did
8484
not match those of the target class.
8585
"""
86+
if not isinstance(xml_string, six.binary_type):
87+
xml_string = xml_string.encode('utf-8')
8688
tree = ElementTree.fromstring(xml_string)
8789
return create_class_from_element_tree(target_class, tree)
8890

@@ -576,7 +578,7 @@ def get_ns_map(self, elements, uri_set):
576578

577579
for elem in elements:
578580
uri_set = self.get_ns_map_attribute(elem.attrib, uri_set)
579-
uri_set = self.get_ns_map(elem._children, uri_set)
581+
uri_set = self.get_ns_map(elem.getchildren(), uri_set)
580582
uri = self.tag_get_uri(elem)
581583
if uri is not None:
582584
uri_set.add(uri)
@@ -600,7 +602,7 @@ def get_xml_string_with_self_contained_assertion_within_advice_encrypted_asserti
600602
if assertion is not None:
601603
self.set_prefixes(assertion, prefix_map)
602604

603-
return ElementTree.tostring(tree, encoding="UTF-8")
605+
return ElementTree.tostring(tree, encoding="UTF-8").decode('utf-8')
604606

605607
def get_xml_string_with_self_contained_assertion_within_encrypted_assertion(self, assertion_tag):
606608
""" Makes a encrypted assertion only containing self contained namespaces.
@@ -614,7 +616,7 @@ def get_xml_string_with_self_contained_assertion_within_encrypted_assertion(self
614616

615617
self.set_prefixes(tree.find(self.encrypted_assertion._to_element_tree().tag).find(assertion_tag), prefix_map)
616618

617-
return ElementTree.tostring(tree, encoding="UTF-8")
619+
return ElementTree.tostring(tree, encoding="UTF-8").decode('utf-8')
618620

619621
def set_prefixes(self, elem, prefix_map):
620622

@@ -825,10 +827,14 @@ def __eq__(self, other):
825827
return False
826828
elif isinstance(svals, list):
827829
for sval in svals:
828-
for oval in ovals:
829-
if sval == oval:
830-
break
831-
else:
830+
try:
831+
for oval in ovals:
832+
if sval == oval:
833+
break
834+
else:
835+
return False
836+
except TypeError:
837+
# ovals isn't iterable
832838
return False
833839
else:
834840
if svals == ovals: # Since I only support '=='

src/saml2/assertion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def filter_attribute_value_assertions(ava, attribute_restrictions=None):
229229
if not attribute_restrictions:
230230
return ava
231231

232-
for attr, vals in ava.items():
232+
for attr, vals in list(ava.items()):
233233
_attr = attr.lower()
234234
try:
235235
_rests = attribute_restrictions[_attr]
@@ -767,7 +767,7 @@ def apply_policy(self, sp_entity_id, policy, metadata=None):
767767
policy.acs = self.acs
768768
ava = policy.restrict(self, sp_entity_id, metadata)
769769

770-
for key, val in self.items():
770+
for key, val in list(self.items()):
771771
if key in ava:
772772
self[key] = ava[key]
773773
else:

src/saml2/cache.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class CacheError(SAMLError):
2323
class Cache(object):
2424
def __init__(self, filename=None):
2525
if filename:
26-
self._db = shelve.open(filename, writeback=True)
26+
self._db = shelve.open(filename, writeback=True, protocol=2)
2727
self._sync = True
2828
else:
2929
self._db = {}
@@ -96,7 +96,7 @@ def get(self, name_id, entity_id, check_not_on_or_after=True):
9696
cni = code(name_id)
9797
(timestamp, info) = self._db[cni][entity_id]
9898
if check_not_on_or_after and time_util.after(timestamp):
99-
raise ToOld("past %s" % timestamp)
99+
raise ToOld("past %s" % str(timestamp))
100100

101101
return info or None
102102

@@ -139,7 +139,7 @@ def entities(self, name_id):
139139
:return: A possibly empty list of entity identifiers
140140
"""
141141
cni = code(name_id)
142-
return self._db[cni].keys()
142+
return list(self._db[cni].keys())
143143

144144
def receivers(self, name_id):
145145
""" Another name for entities() just to make it more logic in the IdP

src/saml2/client_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def _sso_location(self, entityid=None, binding=BINDING_HTTP_REDIRECT):
149149
raise IdpUnspecified("Too many IdPs to choose from: %s" % eids)
150150

151151
try:
152-
srvs = self.metadata.single_sign_on_service(eids.keys()[0], binding)
152+
srvs = self.metadata.single_sign_on_service(list(eids.keys())[0], binding)
153153
return destinations(srvs)[0]
154154
except IndexError:
155155
raise IdpUnspecified("No IdP to send to given the premises")

src/saml2/discovery.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
from urllib import urlencode
2-
from urlparse import parse_qs
3-
from urlparse import urlparse
1+
from six.moves.urllib.parse import urlencode, parse_qs, urlparse
42
from saml2.entity import Entity
53
from saml2.response import VerificationError
64

src/saml2/ecp_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
programs.
88
"""
99

10-
import cookielib
10+
from six.moves import http_cookiejar as cookielib
1111
import logging
1212

1313
from saml2 import soap

src/saml2/entity.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from saml2.s_utils import sid
3535
from saml2.s_utils import UnravelError
3636
from saml2.s_utils import error_status_factory
37-
from saml2.s_utils import rndstr
37+
from saml2.s_utils import rndbytes
3838
from saml2.s_utils import success_status_factory
3939
from saml2.s_utils import decode_base64_and_inflate
4040
from saml2.s_utils import UnsupportedBinding
@@ -73,7 +73,7 @@
7373

7474
__author__ = 'rolandh'
7575

76-
ARTIFACT_TYPECODE = '\x00\x04'
76+
ARTIFACT_TYPECODE = b'\x00\x04'
7777

7878
SERVICE2MESSAGE = {
7979
"single_sign_on_service": AuthnRequest,
@@ -103,11 +103,17 @@ def create_artifact(entity_id, message_handle, endpoint_index=0):
103103
:param endpoint_index:
104104
:return:
105105
"""
106+
if not isinstance(entity_id, six.binary_type):
107+
entity_id = entity_id.encode('utf-8')
106108
sourceid = sha1(entity_id)
107109

108-
ter = "%s%.2x%s%s" % (ARTIFACT_TYPECODE, endpoint_index,
109-
sourceid.digest(), message_handle)
110-
return base64.b64encode(ter)
110+
if not isinstance(message_handle, six.binary_type):
111+
message_handle = message_handle.encode('utf-8')
112+
ter = b"".join((ARTIFACT_TYPECODE,
113+
("%.2x" % endpoint_index).encode('ascii'),
114+
sourceid.digest(),
115+
message_handle))
116+
return base64.b64encode(ter).decode('ascii')
111117

112118

113119
class Entity(HTTPBase):
@@ -540,7 +546,7 @@ def _encrypt_assertion(self, encrypt_cert, sp_entity_id, response, node_xpath=No
540546
_cert = "%s%s" % (begin_cert, _cert)
541547
if end_cert not in _cert:
542548
_cert = "%s%s" % (_cert, end_cert)
543-
_, cert_file = make_temp(_cert, decode=False)
549+
_, cert_file = make_temp(_cert.encode('ascii'), decode=False)
544550
response = cbxs.encrypt_assertion(response, cert_file,
545551
pre_encryption_part(), node_xpath=node_xpath)
546552
return response
@@ -1115,8 +1121,8 @@ def use_artifact(self, message, endpoint_index=0):
11151121
:param endpoint_index:
11161122
:return:
11171123
"""
1118-
message_handle = sha1("%s" % message)
1119-
message_handle.update(rndstr())
1124+
message_handle = sha1(str(message).encode('utf-8'))
1125+
message_handle.update(rndbytes())
11201126
mhd = message_handle.digest()
11211127
saml_art = create_artifact(self.config.entityid, mhd, endpoint_index)
11221128
self.artifact[saml_art] = message

src/saml2/eptid.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ def __getitem__(self, key):
4242
return self._db[key]
4343

4444
def __setitem__(self, key, value):
45+
if six.PY3 and isinstance(key, six.binary_type):
46+
key = key.decode('utf-8')
4547
self._db[key] = value
4648

4749
def get(self, idp, sp, *args):

src/saml2/filter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(self, allow):
2121
def __call__(self, entity_descriptor):
2222
# get descriptors
2323
_all = []
24-
for desc in entity_descriptor.keys():
24+
for desc in list(entity_descriptor.keys()):
2525
if desc.endswith("_descriptor"):
2626
typ, _ = desc.rsplit("_", 1)
2727
if typ in self.allow:

src/saml2/httpbase.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import re
66
import urllib
77
from six.moves.urllib.parse import urlparse
8+
from six.moves.urllib.parse import urlencode
89
import requests
910
import time
1011
from six.moves.http_cookies import SimpleCookie
@@ -269,10 +270,10 @@ def use_http_form_post(message, destination, relay_state,
269270
@staticmethod
270271
def use_http_artifact(message, destination="", relay_state=""):
271272
if relay_state:
272-
query = urllib.urlencode({"SAMLart": message,
273-
"RelayState": relay_state})
273+
query = urlencode({"SAMLart": message,
274+
"RelayState": relay_state})
274275
else:
275-
query = urllib.urlencode({"SAMLart": message})
276+
query = urlencode({"SAMLart": message})
276277
info = {
277278
"data": "",
278279
"url": "%s?%s" % (destination, query)
@@ -281,9 +282,13 @@ def use_http_artifact(message, destination="", relay_state=""):
281282

282283
@staticmethod
283284
def use_http_uri(message, typ, destination="", relay_state=""):
285+
if "\n" in message:
286+
data = message.split("\n")[1]
287+
else:
288+
data = message.strip()
284289
if typ == "SAMLResponse":
285290
info = {
286-
"data": message.split("\n")[1],
291+
"data": data,
287292
"headers": [
288293
("Content-Type", "application/samlassertion+xml"),
289294
("Cache-Control", "no-cache, no-store"),
@@ -293,10 +298,10 @@ def use_http_uri(message, typ, destination="", relay_state=""):
293298
elif typ == "SAMLRequest":
294299
# msg should be an identifier
295300
if relay_state:
296-
query = urllib.urlencode({"ID": message,
297-
"RelayState": relay_state})
301+
query = urlencode({"ID": message,
302+
"RelayState": relay_state})
298303
else:
299-
query = urllib.urlencode({"ID": message})
304+
query = urlencode({"ID": message})
300305
info = {
301306
"data": "",
302307
"url": "%s?%s" % (destination, query)

0 commit comments

Comments
 (0)