summaryrefslogtreecommitdiff
path: root/src/saml2/httpbase.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/saml2/httpbase.py')
-rw-r--r--src/saml2/httpbase.py125
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):
"""