From 05195ff4764de9e8318a678129fc31c8fba0b96d Mon Sep 17 00:00:00 2001 From: Ivan Kanakarakis Date: Thu, 6 Dec 2018 10:12:47 +0100 Subject: Remove the python-future module and use six Signed-off-by: Ivan Kanakarakis --- setup.cfg | 1 - src/saml2/discovery.py | 18 ++++++++---------- src/saml2/response.py | 2 -- src/saml2/s2repoze/plugins/sp.py | 14 ++++++-------- src/saml2/sigver.py | 4 ++-- tests/test_30_mdstore.py | 6 +++--- tests/test_51_client.py | 28 +++++++++++++--------------- 7 files changed, 32 insertions(+), 41 deletions(-) diff --git a/setup.cfg b/setup.cfg index 8538d788..e6a7ca3e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -50,7 +50,6 @@ scripts = install_requires = cryptography >= 1.4 defusedxml - future pyOpenSSL python-dateutil pytz diff --git a/src/saml2/discovery.py b/src/saml2/discovery.py index 8031b41f..d3e42500 100644 --- a/src/saml2/discovery.py +++ b/src/saml2/discovery.py @@ -1,6 +1,4 @@ -from future.backports.urllib.parse import parse_qs -from future.backports.urllib.parse import urlencode -from future.backports.urllib.parse import urlparse +from six.moves.urllib import parse from saml2.entity import Entity from saml2.response import VerificationError @@ -17,10 +15,10 @@ class DiscoveryServer(Entity): def parse_discovery_service_request(self, url="", query=""): if url: - part = urlparse(url) - dsr = parse_qs(part[4]) + part = parse.urlparse(url) + dsr = parse.parse_qs(part[4]) elif query: - dsr = parse_qs(query) + dsr = parse.parse_qs(query) else: dsr = {} @@ -35,9 +33,9 @@ class DiscoveryServer(Entity): pass if "return" in dsr: - part = urlparse(dsr["return"]) + part = parse.urlparse(dsr["return"]) if part.query: - qp = parse_qs(part.query) + qp = parse.parse_qs(part.query) if "returnIDParam" in dsr: assert dsr["returnIDParam"] not in qp.keys() else: @@ -74,9 +72,9 @@ class DiscoveryServer(Entity): return_url = kwargs["return"] if entity_id: - qp = urlencode({returnIDParam: entity_id}) + qp = parse.urlencode({returnIDParam: entity_id}) - part = urlparse(return_url) + part = parse.urlparse(return_url) if part.query: # Iff there is a query part add the new info at the end return_url = "%s&%s" % (return_url, qp) diff --git a/src/saml2/response.py b/src/saml2/response.py index 6d32e313..d0d78f8b 100644 --- a/src/saml2/response.py +++ b/src/saml2/response.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # -from future.utils import python_2_unicode_compatible import calendar import logging import six @@ -468,7 +467,6 @@ class ManageNameIDResponse(StatusResponse): # ---------------------------------------------------------------------------- -@python_2_unicode_compatible class AuthnResponse(StatusResponse): """ This is where all the profile compliance is checked. This one does saml2int compliance. """ diff --git a/src/saml2/s2repoze/plugins/sp.py b/src/saml2/s2repoze/plugins/sp.py index 3b09a91e..afc74539 100644 --- a/src/saml2/s2repoze/plugins/sp.py +++ b/src/saml2/s2repoze/plugins/sp.py @@ -15,10 +15,8 @@ import six from saml2.samlp import Extensions from saml2 import xmldsig as ds -from future.backports.urllib.parse import parse_qs -from future.backports.urllib.parse import urlparse - from six import StringIO +from six.moves.urllib import parse from paste.httpexceptions import HTTPSeeOther, HTTPRedirection from paste.httpexceptions import HTTPNotImplemented @@ -104,7 +102,7 @@ class SAML2Plugin(object): self.discosrv = discovery self.idp_query_param = idp_query_param self.logout_endpoints = [ - urlparse(ep)[2] for ep in config.endpoint("single_logout_service") + parse.urlparse(ep)[2] for ep in config.endpoint("single_logout_service") ] try: self.metadata = self.conf.metadata @@ -158,7 +156,7 @@ class SAML2Plugin(object): environ["wsgi.input"] = StringIO(body) # restore the request body # as a stream so that everything seems untouched - post = parse_qs(body) # parse the POST fields into a dict + post = parse.parse_qs(body) # parse the POST fields into a dict logger.debug("identify post: %s", post) @@ -218,7 +216,7 @@ class SAML2Plugin(object): query = environ.get(key) if query: try: - _idp_entity_id = dict(parse_qs(query))[self.idp_query_param][0] + _idp_entity_id = dict(parse.parse_qs(query))[self.idp_query_param][0] if _idp_entity_id in idps: idp_entity_id = _idp_entity_id break @@ -239,7 +237,7 @@ class SAML2Plugin(object): if self.wayf: if query: try: - wayf_selected = dict(parse_qs(query))["wayf_selected"][0] + wayf_selected = dict(parse.parse_qs(query))["wayf_selected"][0] except KeyError: return self._wayf_redirect(came_from) idp_entity_id = wayf_selected @@ -385,7 +383,7 @@ class SAML2Plugin(object): if (environ["PATH_INFO"]) in ret and ret.split(environ["PATH_INFO"])[ 1 ] == "": - query = parse_qs(environ["QUERY_STRING"]) + query = parse.parse_qs(environ["QUERY_STRING"]) sid = query["sid"][0] came_from = self.outstanding_queries[sid] except: diff --git a/src/saml2/sigver.py b/src/saml2/sigver.py index 4483b03b..59fe2dee 100644 --- a/src/saml2/sigver.py +++ b/src/saml2/sigver.py @@ -13,7 +13,7 @@ import six from time import mktime from binascii import hexlify -from future.backports.urllib.parse import urlencode +from six.moves.urllib import parse import saml2.cryptography.asymmetric import saml2.cryptography.pki @@ -578,7 +578,7 @@ def verify_redirect_signature(saml_msg, crypto, cert=None, sigkey=None): _args = saml_msg.copy() del _args['Signature'] # everything but the signature string = '&'.join( - [urlencode({k: _args[k]}) for k in _order if k in + [parse.urlencode({k: _args[k]}) for k in _order if k in _args]).encode('ascii') if cert: diff --git a/tests/test_30_mdstore.py b/tests/test_30_mdstore.py index 9f56bf94..46a38aea 100644 --- a/tests/test_30_mdstore.py +++ b/tests/test_30_mdstore.py @@ -4,7 +4,7 @@ import datetime import re from collections import OrderedDict -from future.backports.urllib.parse import quote_plus +from six.moves.urllib import parse from saml2.config import Config from saml2.mdstore import MetadataStore, MetaDataExtern @@ -299,7 +299,7 @@ def test_mdx_service(): entity_id = "http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php" url = "http://mdx.example.com/entities/{}".format( - quote_plus(MetaDataMDX.sha1_entity_transform(entity_id))) + parse.quote_plus(MetaDataMDX.sha1_entity_transform(entity_id))) responses.add(responses.GET, url, body=TEST_METADATA_STRING, status=200, content_type=SAML_METADATA_CONTENT_TYPE) @@ -315,7 +315,7 @@ def test_mdx_single_sign_on_service(): entity_id = "http://xenosmilus.umdc.umu.se/simplesaml/saml2/idp/metadata.php" url = "http://mdx.example.com/entities/{}".format( - quote_plus(MetaDataMDX.sha1_entity_transform(entity_id))) + parse.quote_plus(MetaDataMDX.sha1_entity_transform(entity_id))) responses.add(responses.GET, url, body=TEST_METADATA_STRING, status=200, content_type=SAML_METADATA_CONTENT_TYPE) diff --git a/tests/test_51_client.py b/tests/test_51_client.py index a56ef2cf..2e2b7f1c 100644 --- a/tests/test_51_client.py +++ b/tests/test_51_client.py @@ -4,9 +4,7 @@ import base64 import uuid import six -from future.backports.urllib.parse import parse_qs -from future.backports.urllib.parse import urlencode -from future.backports.urllib.parse import urlparse +from six.moves.urllib import parse from pytest import raises from saml2.argtree import add_path @@ -1378,7 +1376,7 @@ class TestClient: relay_state="relay2", sign=True, sigalg=SIG_RSA_SHA256) loc = info["headers"][0][1] - qs = parse_qs(loc[1:]) + qs = parse.parse_qs(loc[1:]) assert _leq(qs.keys(), ['SigAlg', 'SAMLRequest', 'RelayState', 'Signature']) @@ -1417,8 +1415,8 @@ class TestClient: assert binding == BINDING_HTTP_REDIRECT loc = info["headers"][0][1] - _, _, _, _, qs, _ = urlparse(loc) - qs = parse_qs(qs) + _, _, _, _, qs, _ = parse.urlparse(loc) + qs = parse.parse_qs(qs) assert _leq(qs.keys(), ['SigAlg', 'SAMLRequest', 'RelayState', 'Signature']) @@ -2940,7 +2938,7 @@ class TestClientNonAsciiAva: relay_state="relay2", sign=True, sigalg=SIG_RSA_SHA256) loc = info["headers"][0][1] - qs = parse_qs(loc[1:]) + qs = parse.parse_qs(loc[1:]) assert _leq(qs.keys(), ['SigAlg', 'SAMLRequest', 'RelayState', 'Signature']) @@ -2979,8 +2977,8 @@ class TestClientNonAsciiAva: assert binding == BINDING_HTTP_REDIRECT loc = info["headers"][0][1] - _, _, _, _, qs, _ = urlparse(loc) - qs = parse_qs(qs) + _, _, _, _, qs, _ = parse.urlparse(loc) + qs = parse.parse_qs(qs) assert _leq(qs.keys(), ['SigAlg', 'SAMLRequest', 'RelayState', 'Signature']) @@ -3076,8 +3074,8 @@ class TestClientWithDummy(): assert http_args["headers"][0][0] == "Location" assert http_args["data"] == [] redirect_url = http_args["headers"][0][1] - _, _, _, _, qs, _ = urlparse(redirect_url) - qs_dict = parse_qs(qs) + _, _, _, _, qs, _ = parse.urlparse(redirect_url) + qs_dict = parse.parse_qs(qs) req = self.server.parse_authn_request(qs_dict["SAMLRequest"][0], binding) resp_args = self.server.response_args(req.message, [response_binding]) @@ -3097,8 +3095,8 @@ class TestClientWithDummy(): assert http_args["headers"][0][0] == "Location" assert http_args["data"] == [] redirect_url = http_args["headers"][0][1] - _, _, _, _, qs, _ = urlparse(redirect_url) - qs_dict = parse_qs(qs) + _, _, _, _, qs, _ = parse.urlparse(redirect_url) + qs_dict = parse.parse_qs(qs) req = self.server.parse_authn_request(qs_dict["SAMLRequest"][0], binding) resp_args = self.server.response_args(req.message, [response_binding]) @@ -3152,7 +3150,7 @@ class TestClientWithDummy(): # Here I fake what the client will do # create the form post - http_args["data"] = urlencode(_dic) + http_args["data"] = parse.urlencode(_dic) http_args["method"] = "POST" http_args["dummy"] = _dic["SAMLRequest"] http_args["headers"] = [('Content-type', @@ -3188,7 +3186,7 @@ class TestClientWithDummy(): # Here I fake what the client will do # create the form post - http_args["data"] = urlencode(_dic) + http_args["data"] = parse.urlencode(_dic) http_args["method"] = "POST" http_args["dummy"] = _dic["SAMLRequest"] http_args["headers"] = [('Content-type', -- cgit v1.2.1