diff options
Diffstat (limited to 'src/saml2/httpbase.py')
-rw-r--r-- | src/saml2/httpbase.py | 125 |
1 files changed, 53 insertions, 72 deletions
diff --git a/src/saml2/httpbase.py b/src/saml2/httpbase.py index 17c7373d..cb51a919 100644 --- a/src/saml2/httpbase.py +++ b/src/saml2/httpbase.py @@ -1,19 +1,22 @@ import calendar -import six -from six.moves import http_cookiejar import copy +import logging import re -from six.moves.urllib.parse import urlparse -from six.moves.urllib.parse import urlencode -import requests import time + +import requests +import six +from six.moves import http_cookiejar from six.moves.http_cookies import SimpleCookie -from saml2.time_util import utc_now -from saml2 import class_name, SAMLError +from six.moves.urllib.parse import urlencode +from six.moves.urllib.parse import urlparse + +from saml2 import SAMLError +from saml2 import class_name from saml2.pack import http_post_message from saml2.pack import make_soap_enveloped_saml_thingy +from saml2.time_util import utc_now -import logging logger = logging.getLogger(__name__) @@ -22,32 +25,30 @@ if requests.__version__ < "2.0.0": else: DICT_HEADERS = True -__author__ = 'rolandh' - -ATTRS = {"version": None, - "name": "", - "value": None, - "port": None, - "port_specified": False, - "domain": "", - "domain_specified": False, - "domain_initial_dot": False, - "path": "", - "path_specified": False, - "secure": False, - "expires": None, - "discard": True, - "comment": None, - "comment_url": None, - "rest": "", - "rfc2109": True} - -PAIRS = { - "port": "port_specified", - "domain": "domain_specified", - "path": "path_specified" +__author__ = "rolandh" + +ATTRS = { + "version": None, + "name": "", + "value": None, + "port": None, + "port_specified": False, + "domain": "", + "domain_specified": False, + "domain_initial_dot": False, + "path": "", + "path_specified": False, + "secure": False, + "expires": None, + "discard": True, + "comment": None, + "comment_url": None, + "rest": "", + "rfc2109": True, } +PAIRS = {"port": "port_specified", "domain": "domain_specified", "path": "path_specified"} + class ConnectionError(SAMLError): pass @@ -57,8 +58,7 @@ class HTTPError(SAMLError): pass -TIME_FORMAT = ["%d-%b-%Y %H:%M:%S %Z", "%d-%b-%y %H:%M:%S %Z", - "%d %b %Y %H:%M:%S %Z"] +TIME_FORMAT = ["%d-%b-%Y %H:%M:%S %Z", "%d-%b-%y %H:%M:%S %Z", "%d %b %Y %H:%M:%S %Z"] def _since_epoch(cdate): @@ -71,20 +71,18 @@ def _since_epoch(cdate): if len(cdate) < 5: return utc_now() - cdate = cdate[5:] # assume short weekday, i.e. do not support obsolete RFC 1036 date format + cdate = cdate[5:] # assume short weekday, i.e. do not support obsolete RFC 1036 date format t = -1 - for time_format in TIME_FORMAT : + for time_format in TIME_FORMAT: try: - t = time.strptime(cdate, time_format) # e.g. 18-Apr-2014 12:30:51 GMT + t = time.strptime(cdate, time_format) # e.g. 18-Apr-2014 12:30:51 GMT except ValueError: pass else: break if t == -1: - err = 'ValueError: Date "{0}" does not match any of: {1}'.format( - cdate, TIME_FORMAT - ) + err = 'ValueError: Date "{0}" does not match any of: {1}'.format(cdate, TIME_FORMAT) raise Exception(err) return calendar.timegm(t) @@ -99,10 +97,9 @@ def dict2set_list(dic): class HTTPBase(object): - def __init__(self, verify=True, ca_bundle=None, key_file=None, - cert_file=None, http_client_timeout=None): + def __init__(self, verify=True, ca_bundle=None, key_file=None, cert_file=None, http_client_timeout=None): self.request_args = {"allow_redirects": False} - #self.cookies = {} + # self.cookies = {} self.cookiejar = http_cookiejar.CookieJar() self.request_args["verify"] = verify @@ -126,9 +123,9 @@ class HTTPBase(object): """ part = urlparse(url) - #if part.port: + # if part.port: # _domain = "%s:%s" % (part.hostname, part.port) - #else: + # else: _domain = part.hostname cookie_dict = {} @@ -198,16 +195,12 @@ class HTTPBase(object): if morsel["max-age"] == 0: try: - self.cookiejar.clear(domain=std_attr["domain"], - path=std_attr["path"], - name=std_attr["name"]) + self.cookiejar.clear(domain=std_attr["domain"], path=std_attr["path"], name=std_attr["name"]) except ValueError: pass elif std_attr["expires"] and std_attr["expires"] < utc_now(): try: - self.cookiejar.clear(domain=std_attr["domain"], - path=std_attr["path"], - name=std_attr["name"]) + self.cookiejar.clear(domain=std_attr["domain"], path=std_attr["path"], name=std_attr["name"]) except ValueError: pass else: @@ -256,14 +249,10 @@ class HTTPBase(object): @staticmethod def use_http_artifact(message, destination="", relay_state=""): if relay_state: - query = urlencode({"SAMLart": message, - "RelayState": relay_state}) + query = urlencode({"SAMLart": message, "RelayState": relay_state}) else: query = urlencode({"SAMLart": message}) - info = { - "data": "", - "url": "%s?%s" % (destination, query) - } + info = {"data": "", "url": "%s?%s" % (destination, query)} return info @staticmethod @@ -278,27 +267,22 @@ class HTTPBase(object): "headers": [ ("Content-Type", "application/samlassertion+xml"), ("Cache-Control", "no-cache, no-store"), - ("Pragma", "no-cache") - ] + ("Pragma", "no-cache"), + ], } elif typ == "SAMLRequest": # msg should be an identifier if relay_state: - query = urlencode({"ID": message, - "RelayState": relay_state}) + query = urlencode({"ID": message, "RelayState": relay_state}) else: query = urlencode({"ID": message}) - info = { - "data": "", - "url": "%s?%s" % (destination, query) - } + info = {"data": "", "url": "%s?%s" % (destination, query)} else: raise NotImplementedError return info - def use_soap(self, request, destination="", soap_headers=None, sign=False, - **kwargs): + def use_soap(self, request, destination="", soap_headers=None, sign=False, **kwargs): """ Construct the necessary information for using SOAP+POST @@ -315,13 +299,10 @@ class HTTPBase(object): logger.debug("SOAP message: %s", soap_message) if sign and self.sec: - _signed = self.sec.sign_statement(soap_message, - node_name=class_name(request), - node_id=request.id) + _signed = self.sec.sign_statement(soap_message, node_name=class_name(request), node_id=request.id) soap_message = _signed - return {"url": destination, "method": "POST", - "data": soap_message, "headers": headers} + return {"url": destination, "method": "POST", "data": soap_message, "headers": headers} def send_using_soap(self, request, destination, headers=None, sign=False): """ |