Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-edgegrid-python for
openSUSE:Factory checked in at 2024-01-09 20:49:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-edgegrid-python (Old)
and /work/SRC/openSUSE:Factory/.python-edgegrid-python.new.21961 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-edgegrid-python"
Tue Jan 9 20:49:42 2024 rev:3 rq:1137638 version:1.3.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-edgegrid-python/python-edgegrid-python.changes
2021-12-12 21:28:10.992361932 +0100
+++
/work/SRC/openSUSE:Factory/.python-edgegrid-python.new.21961/python-edgegrid-python.changes
2024-01-09 20:50:16.905590963 +0100
@@ -1,0 +2,10 @@
+Mon Jan 8 20:56:05 UTC 2024 - Dirk Müller <[email protected]>
+
+- update to 1.3.1:
+ * GH#51 issue: include path params in signed path
+- update to 1.3.0:
+ * decouple from `requests` library
+ * add support for MultipartEncoder
+ * remove unnecessary shebangs and permissions
+
+-------------------------------------------------------------------
Old:
----
edgegrid-python-1.2.1.tar.gz
New:
----
edgegrid-python-1.3.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-edgegrid-python.spec ++++++
--- /var/tmp/diff_new_pack.TUlAYs/_old 2024-01-09 20:50:17.369607833 +0100
+++ /var/tmp/diff_new_pack.TUlAYs/_new 2024-01-09 20:50:17.369607833 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-edgegrid-python
#
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -16,9 +16,8 @@
#
-%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-edgegrid-python
-Version: 1.2.1
+Version: 1.3.1
Release: 0
Summary: Client authentication protocol for python-requests
License: Apache-2.0
@@ -26,13 +25,16 @@
URL: https://github.com/akamai-open/AkamaiOPEN-edgegrid-python
Source:
https://files.pythonhosted.org/packages/source/e/edgegrid-python/edgegrid-python-%{version}.tar.gz
BuildRequires: %{python_module devel}
+BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools}
+BuildRequires: %{python_module wheel}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-ndg-httpsclient
Requires: python-pyOpenSSL >= 19.0.0
Requires: python-pyasn1
Requires: python-requests >= 2.3.0
+Requires: python-requests-toolbelt
Requires: python-urllib3
BuildArch: noarch
@@ -45,14 +47,17 @@
%setup -q -n edgegrid-python-%{version}
%build
-%python_build
+%pyproject_wheel
%install
-%python_install
+%pyproject_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%files %{python_files}
-%doc README.rst
+%doc README.md
%license LICENSE
-%{python_sitelib}/*
+%dir %{python_sitelib}/akamai
+%{python_sitelib}/akamai/edgegrid
+%{python_sitelib}/edgegrid_python-%{version}*.pth
+%{python_sitelib}/edgegrid_python-%{version}.dist-info
++++++ edgegrid-python-1.2.1.tar.gz -> edgegrid-python-1.3.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/PKG-INFO
new/edgegrid-python-1.3.1/PKG-INFO
--- old/edgegrid-python-1.2.1/PKG-INFO 2021-10-11 09:39:22.888507000 +0200
+++ new/edgegrid-python-1.3.1/PKG-INFO 2022-09-22 11:50:47.786121400 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: edgegrid-python
-Version: 1.2.1
+Version: 1.3.1
Summary: {OPEN} client authentication protocol for python-requests
Home-page: https://github.com/akamai/AkamaiOPEN-edgegrid-python
Author: Jonathan Landis
@@ -8,12 +8,8 @@
Maintainer: Akamai Developer Experience team
Maintainer-email: [email protected]
License: Apache 2.0
-Platform: UNKNOWN
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Requires-Python: >=2.7.10
License-File: LICENSE
-
-UNKNOWN
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/README.md
new/edgegrid-python-1.3.1/README.md
--- old/edgegrid-python-1.2.1/README.md 1970-01-01 01:00:00.000000000 +0100
+++ new/edgegrid-python-1.3.1/README.md 2022-09-08 12:49:34.000000000 +0200
@@ -0,0 +1,148 @@
+# EdgeGrid for Python
+
+This library implements an authentication handler for HTTP
[requests](https://requests.readthedocs.io/en/latest/) using the [EdgeGrid
authentication](https://techdocs.akamai.com/developer/docs/authenticate-with-edgegrid)
scheme.
+
+## Prerequisites
+Before you begin, you need to [Create authentication
credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials)
in [Control Center](https://control.akamai.com/).
+
+Download the Python release compatible with your operating system at
[https://www.python.org/downloads/](https://www.python.org/downloads/).
+
+> Python 2 is no longer supported by the [Python Software
Foundation](https://www.python.org/doc/sunset-python-2/).
+ However, if you're still using it, you can follow the [Python 2
steps](#python-2-steps).
+
+## Install
+
+1. Install Python.
+ ```
+ python setup.py install
+ ```
+
+1. Install the developer libraries for Python, SSL and FFI.
+ ```
+ sudo apt-get install ibssl-dev libffi-dev python-dev
+ ```
+
+1. Install the `edgegrid-python` authentication handler.
+ ```
+ pip install edgegrid-python
+ ```
+
+## Make an API call
+
+To use Akamai APIs, you need the values for the tokens from your [.edgerc
file](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials#add-credential-to-edgerc-file).
+
+```pycon
+>>> import requests
+>>> from akamai.edgegrid import EdgeGridAuth
+>>> from urllib.parse import urljoin
+>>> baseurl = 'https://akaa-WWWWWWWWWWWW.luna.akamaiapis.net/'
+>>> s = requests.Session()
+>>> s.auth = EdgeGridAuth(
+ client_token='ccccccccccccccccc',
+ client_secret='ssssssssssssssssss',
+ access_token='aaaaaaaaaaaaaaaaaaaaa'
+)
+
+>>> result = s.get(urljoin(baseurl,
'/diagnostic-tools/v2/ghost-locations/available'))
+>>> result.status_code
+200
+>>> result.json()['locations'][0]['value']
+Oakbrook, IL, United States
+...
+```
+
+This is an example of an API call to [List available edge server
locations](https://techdocs.akamai.com/diagnostic-tools/reference/ghost-locationsavailable).
Change the `baseurl` element to reference an endpoint in any of the [Akamai
APIs](https://techdocs.akamai.com/home/page/products-tools-a-z?sort=api).
+
+Alternatively, your program can read the credential values directly from the
`.edgerc`.
+
+```pycon
+>>> import requests
+>>> from akamai.edgegrid import EdgeGridAuth, EdgeRc
+>>> from urllib.parse import urljoin
+
+>>> edgerc = EdgeRc('~/.edgerc')
+>>> section = 'default'
+>>> baseurl = 'https://%s' % edgerc.get(section, 'host')
+
+>>> s = requests.Session()
+>>> s.auth = EdgeGridAuth.from_edgerc(edgerc, section)
+
+>>> result = s.get(urljoin(baseurl,
'/diagnostic-tools/v2/ghost-locations/available'))
+>>> result.status_code
+200
+>>> result.json()['locations'][0]['value']
+Oakbrook, IL, United States
+...
+```
+
+> NOTE: If your `.edgerc` file contains more than one credential set, use the
`section` argument to specify which section contains the credentials for your
API request.
+
+## Virtual environment
+
+To test in a [virtual
environment](https://packaging.python.org/tutorials/installing-packages/#creating-virtual-environments),
run:
+
+```
+$ python3 -m venv venv
+$ . venv/bin/activate
+$ pip install -r requirements.txt
+$ python -m unittest discover
+```
+
+### Python 2 steps
+
+Python 2.7 is no longer supported by the [Python Software
Foundation](https://www.python.org/doc/sunset-python-2/), but we recognize that
some developers continue to use it. If you're using Python 2.7 with EdgeGrid,
follow these steps.
+
+1. To upgrade the cryptography package, first run:
+ ```
+ pip install --upgrade 'cryptography<3.4'
+ ```
+
+1. To continue with the installation, run:
+ ```
+ pip install edgegrid-python
+ ```
+
+ or install from sources:
+ ```
+ python setup.py install
+ ```
+
+1. To test, run:
+ ```
+ $ virtualenv -p python2.7 venv
+ $ . venv/bin/activate
+ $ pip install 'cryptography<3.4' # just necessary for Python 2.7
+ $ pip install -r requirements.txt
+ $ python -m unittest discover
+ ```
+
+> If you intend to run the examples with Python 2.7, remember that `urljoin`
is contained in a different package.
+ ```
+ from urlparse import urljoin
+ ```
+
+## Contribute
+
+1. Fork the
[repository](https://github.com/akamai-open/AkamaiOPEN-edgegrid-python) to
modify the **master** branch.
+2. Write a test that demonstrates that the bug was fixed or the feature works
as expected.
+3. Send a pull request and nudge the maintainer until it gets merged and
published. :)
+
+## Author
+
+Jonathan Landis
+
+## License
+
+> Copyright 2022 Akamai Technologies, Inc. All rights reserved.
+>
+> Licensed under the Apache License, Version 2.0 (the \"License\"); you
+> may not use this file except in compliance with the License. You may
+> obtain a copy of the License at
+>
+> > <http://www.apache.org/licenses/LICENSE-2.0>
+>
+> Unless required by applicable law or agreed to in writing, software
+> distributed under the License is distributed on an \"AS IS\" BASIS,
+> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+> implied. See the License for the specific language governing
+> permissions and limitations under the License.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/README.rst
new/edgegrid-python-1.3.1/README.rst
--- old/edgegrid-python-1.2.1/README.rst 2021-10-11 09:27:16.000000000
+0200
+++ new/edgegrid-python-1.3.1/README.rst 1970-01-01 01:00:00.000000000
+0100
@@ -1,151 +0,0 @@
-EdgeGrid for Python
-===================
-
-This library implements an Authentication handler for `requests`_
-that provides the `Akamai {OPEN} Edgegrid Authentication`_ scheme. For more
information
-visit the `Akamai {OPEN} Developer Community`_.
-
-.. code-block:: pycon
-
- >>> import requests
- >>> from akamai.edgegrid import EdgeGridAuth
- >>> from urllib.parse import urljoin
- >>> baseurl = 'https://akaa-WWWWWWWWWWWW.luna.akamaiapis.net/'
- >>> s = requests.Session()
- >>> s.auth = EdgeGridAuth(
- client_token='ccccccccccccccccc',
- client_secret='ssssssssssssssssss',
- access_token='aaaaaaaaaaaaaaaaaaaaa'
- )
-
- >>> result = s.get(urljoin(baseurl,
'/diagnostic-tools/v2/ghost-locations/available'))
- >>> result.status_code
- 200
- >>> result.json()['locations'][0]['value']
- Oakbrook, IL, United States
- ...
-
-Alternatively, your program can read the credentials from an .edgerc file.
-
-.. code-block:: pycon
-
- >>> import requests
- >>> from akamai.edgegrid import EdgeGridAuth, EdgeRc
- >>> from urllib.parse import urljoin
-
- >>> edgerc = EdgeRc('~/.edgerc')
- >>> section = 'default'
- >>> baseurl = 'https://%s' % edgerc.get(section, 'host')
-
- >>> s = requests.Session()
- >>> s.auth = EdgeGridAuth.from_edgerc(edgerc, section)
-
- >>> result = s.get(urljoin(baseurl,
'/diagnostic-tools/v2/ghost-locations/available'))
- >>> result.status_code
- 200
- >>> result.json()['locations'][0]['value']
- Oakbrook, IL, United States
- ...
-
-If you intend to run the above examples with Python 2.7, remember that urljoin
is contained in a different package:
-
-.. code-block:: pycon
-
- >>> from urlparse import urljoin
-
-.. _`requests`: http://docs.python-requests.org
-.. _`Akamai {OPEN} Edgegrid authentication`:
https://developer.akamai.com/introduction/Client_Auth.html
-.. _`Akamai {OPEN} Developer Community`: https://developer.akamai.com
-
-Installation
-------------
-
-**Prerequisite**
-
-For Linux-based distribution, install the developer libraries for Python, SSL
and FFI. For example, on Debian-based systems, run:
-
-.. code-block:: bash
-
- $ sudo apt-get install ibssl-dev libffi-dev python-dev
-
-**To install from pip**
-
-We recommend using any recent Python 3 distribution. Starting from version 3.4
of the cryptography package, Python 2.7 is no longer supported.
-
-If you still want to use Python 2.7, first run:
-
-.. code-block:: bash
-
- $ pip install --upgrade 'cryptography<3.4'
-
-To continue with the installation:
-
-.. code-block:: bash
-
- $ pip install edgegrid-python
-
-**To install from sources**
-
-.. code-block:: bash
-
- $ python setup.py install
-
-**To run tests**
-
-Both Python 2 and Python 3 are supported. This example uses Python 2.7. Run:
-
-.. code-block:: bash
-
- $ virtualenv -p python2.7 venv
- $ . venv/bin/activate
- $ pip install 'cryptography<3.4' # just necessary for Python 2.7
- $ pip install -r requirements.txt
- $ python -m unittest discover
-
-For Python 3.3 or newer, replace the `virtualenv` module with `venv`. Run:
-
-.. code-block:: bash
-
- $ python3 -m venv venv
- $ . venv/bin/activate
- $ pip install -r requirements.txt
- $ python -m unittest discover
-
-Creating your own .edgerc
-----------
-
-#. Copy the `akamai/edgegrid/test/sample_edgerc` file to your home directory
and rename as `.edgerc`.
-#. Edit the copied file and provide your own credentials. For more information
on creating an `.edgerc` file, see `Get started with APIs`_.
-
-.. _`Get started with APIs`:
https://developer.akamai.com/api/getting-started#edgercfile
-
-Contribute
-----------
-
-#. Fork `the repository`_ to start making your changes to the **master** branch
-#. Write a test which shows that the bug was fixed or that the feature works
as expected.
-#. Send a pull request and bug the maintainer until it gets merged and
published. :)
-
-.. _`the repository`: https://github.com/akamai-open/AkamaiOPEN-edgegrid-python
-
-Author
-------
-
-Jonathan Landis
-
-License
--------
-
- Copyright 2021 Akamai Technologies, Inc. All rights reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/akamai/edgegrid/__init__.py
new/edgegrid-python-1.3.1/akamai/edgegrid/__init__.py
--- old/edgegrid-python-1.2.1/akamai/edgegrid/__init__.py 2021-10-11
09:27:16.000000000 +0200
+++ new/edgegrid-python-1.3.1/akamai/edgegrid/__init__.py 2022-09-22
11:39:50.000000000 +0200
@@ -35,7 +35,7 @@
__all__ = ['EdgeGridAuth', 'EdgeRc']
__title__ = 'edgegrid-python'
-__version__ = '1.2.1'
+__version__ = '1.3.1'
__author__ = 'Jonathan Landis <[email protected]>'
__maintainer__ = 'Akamai Developer Experience team <[email protected]>'
__license__ = 'Apache 2.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/akamai/edgegrid/edgegrid.py
new/edgegrid-python-1.3.1/akamai/edgegrid/edgegrid.py
--- old/edgegrid-python-1.2.1/akamai/edgegrid/edgegrid.py 2021-06-24
16:17:32.000000000 +0200
+++ new/edgegrid-python-1.3.1/akamai/edgegrid/edgegrid.py 2022-09-22
11:39:50.000000000 +0200
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
# EdgeGrid requests Auth handler
#
# Original author: Jonathan Landis <[email protected]>
@@ -63,10 +61,26 @@
).decode('utf8')
+def get_multipart_body(encoder, size=-1):
+ multipart_body = encoder.read(size)
+ encoder._buffer.seek(0)
+ return multipart_body
+
+
def base64_sha256(data):
if isinstance(data, str):
data = data.encode('utf8')
- return base64.b64encode(hashlib.sha256(data).digest()).decode('utf8')
+ try:
+ return base64.b64encode(hashlib.sha256(data).digest()).decode('utf8')
+ except TypeError:
+ return
base64.b64encode(hashlib.sha256(get_multipart_body(data)).digest()).decode('utf8')
+
+
+def get_prepared_body_len(prepared_body):
+ try:
+ return len(prepared_body)
+ except TypeError:
+ return prepared_body.len
class EdgeGridAuth(AuthBase):
@@ -85,7 +99,7 @@
"""
def __init__(self, client_token, client_secret, access_token,
- headers_to_sign=None, max_body=131072):
+ headers_to_sign=(), max_body=131072):
"""Initialize authentication using the given parameters from the
Akamai OPEN APIs
Interface:
@@ -98,21 +112,19 @@
specific APIs. (default 131072)
"""
- self.client_token = client_token
- self.client_secret = client_secret
- self.access_token = access_token
- if headers_to_sign:
- self.headers_to_sign = [h.lower() for h in headers_to_sign]
- else:
- self.headers_to_sign = []
- self.max_body = max_body
-
- self.redirect_location = None
+ self.ah = EdgeGridAuthHeaders(
+ client_token,
+ client_secret,
+ access_token,
+ headers_to_sign,
+ max_body
+ )
@staticmethod
def from_edgerc(rcinput, section='default'):
- """Returns an EdgeGridAuth object from the configuration from the
given section of the
- given edgerc file.
+ """
+ Returns an EdgeGridAuth object from the configuration from the given
section
+ of the given edgerc file.
:param rcinput: EdgeRc instance or path to the edgerc file
:param section: the section to use (this is the [bracketed] part of
the edgerc,
@@ -133,37 +145,83 @@
max_body=rc.getint(section, 'max_body')
)
+ def handle_redirect(self, res, **kwargs):
+ if res.is_redirect:
+ redirect_location = res.headers['location']
+
+ logger.debug("signing the redirected url: %s", redirect_location)
+ request_to_sign = res.request.copy()
+ request_to_sign.url = redirect_location
+
+ res.request.headers['Authorization'] = self.ah.make_auth_header(
+ request_to_sign.url,
+ request_to_sign.headers,
+ request_to_sign.method,
+ request_to_sign.body,
+ eg_timestamp(),
+ new_nonce()
+ )
+
+ def __call__(self, r):
+ timestamp = eg_timestamp()
+ nonce = new_nonce()
+
+ r.headers['Authorization'] = self.ah.make_auth_header(
+ r.url,
+ r.headers,
+ r.method,
+ r.body,
+ timestamp,
+ nonce
+ )
+ r.register_hook('response', self.handle_redirect)
+ return r
+
+
+class EdgeGridAuthHeaders():
+
+ def __init__(self, client_token, client_secret, access_token,
+ headers_to_sign=(), max_body=131072):
+ self.client_token = client_token
+ self.client_secret = client_secret
+ self.access_token = access_token
+ self.headers_to_sign = [h.lower() for h in headers_to_sign]
+ self.max_body = max_body
+
def make_signing_key(self, timestamp):
signing_key = base64_hmac_sha256(timestamp, self.client_secret)
logger.debug('signing key: %s', signing_key)
return signing_key
- def canonicalize_headers(self, r):
+ def canonicalize_headers(self, headers):
spaces_re = re.compile('\\s+')
# note: r.headers is a case-insensitive dict and self.headers_to_sign
# should already be lowercased at this point
return '\t'.join([
- "%s:%s" % (h, spaces_re.sub(' ', r.headers[h].strip()))
- for h in self.headers_to_sign if h in r.headers
+ "%s:%s" % (h, spaces_re.sub(' ', headers[h].strip()))
+ for h in self.headers_to_sign if h in headers
])
- def make_content_hash(self, r):
+ def make_content_hash(self, body, method):
content_hash = ""
- prepared_body = (r.body or '')
+ prepared_body = body
logger.debug("body is '%s'", prepared_body)
- if r.method == 'POST' and len(prepared_body) > 0:
+ if method == 'POST' and get_prepared_body_len(prepared_body) > 0:
logger.debug("signing content: %s", prepared_body)
- if len(prepared_body) > self.max_body:
+ if get_prepared_body_len(prepared_body) > self.max_body:
logger.debug(
"data length %d is larger than maximum %d",
- len(prepared_body), self.max_body
+ get_prepared_body_len(prepared_body), self.max_body
)
- prepared_body = prepared_body[0:self.max_body]
+ try:
+ prepared_body = prepared_body[0:self.max_body]
+ except TypeError:
+ prepared_body = get_multipart_body(prepared_body,
self.max_body)
logger.debug(
"data truncated to %d for computing the hash",
- len(prepared_body))
+ get_prepared_body_len(prepared_body))
content_hash = base64_sha256(prepared_body)
@@ -194,38 +252,37 @@
return header
- def make_data_to_sign(self, r, auth_header):
- parsed_url = urlparse(r.url)
+ def make_data_to_sign(self, url, headers, auth_header, method, body):
+ parsed_url = urlparse(url)
- if r.headers.get('Host', False):
- netloc = r.headers['Host']
+ if headers.get('Host', False):
+ netloc = headers['Host']
else:
netloc = parsed_url.netloc
- self.get_header_versions(r.headers)
+ self.get_header_versions(headers)
data_to_sign = '\t'.join([
- r.method,
+ method,
parsed_url.scheme,
netloc,
- # Note: relative URL constraints are handled by requests when it
- # sets up 'r'
- parsed_url.path + \
+ # Note: relative URL constraints are handled by requests when it
sets up 'r'
+ parsed_url.path + (';' + parsed_url.params if parsed_url.params
else "") +
('?' + parsed_url.query if parsed_url.query else ""),
- self.canonicalize_headers(r),
- self.make_content_hash(r),
+ self.canonicalize_headers(headers),
+ self.make_content_hash(body or '', method),
auth_header
])
logger.debug('data to sign: %s', '\\t'.join(data_to_sign.split('\t')))
return data_to_sign
- def sign_request(self, r, timestamp, auth_header):
+ def sign_request(self, url, headers, method, body, timestamp, auth_header):
return base64_hmac_sha256(
- self.make_data_to_sign(r, auth_header),
+ self.make_data_to_sign(url, headers, auth_header, method, body),
self.make_signing_key(timestamp)
)
- def make_auth_header(self, r, timestamp, nonce):
+ def make_auth_header(self, url, headers, method, body, timestamp, nonce):
kvps = [
('client_token', self.client_token),
('access_token', self.access_token),
@@ -237,27 +294,7 @@
logger.debug('unsigned authorization header: %s', auth_header)
signed_auth_header = auth_header + \
- 'signature=' + self.sign_request(r, timestamp, auth_header)
+ 'signature=' + self.sign_request(url, headers, method, body,
timestamp, auth_header)
logger.debug('signed authorization header: %s', signed_auth_header)
return signed_auth_header
-
- def handle_redirect(self, res, **kwargs):
- if res.is_redirect:
- redirect_location = res.headers['location']
-
- logger.debug("signing the redirected url: %s", redirect_location)
- request_to_sign = res.request.copy()
- request_to_sign.url = redirect_location
-
- res.request.headers['Authorization'] = self.make_auth_header(
- request_to_sign, eg_timestamp(), new_nonce()
- )
-
- def __call__(self, r):
- timestamp = eg_timestamp()
- nonce = new_nonce()
-
- r.headers['Authorization'] = self.make_auth_header(r, timestamp, nonce)
- r.register_hook('response', self.handle_redirect)
- return r
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/akamai/edgegrid/edgerc.py
new/edgegrid-python-1.3.1/akamai/edgegrid/edgerc.py
--- old/edgegrid-python-1.2.1/akamai/edgegrid/edgerc.py 2021-06-24
16:17:32.000000000 +0200
+++ new/edgegrid-python-1.3.1/akamai/edgegrid/edgerc.py 2022-08-24
16:44:24.000000000 +0200
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
# support for .edgerc file format
#
# Copyright 2021 Akamai Technologies, Inc. All Rights Reserved
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid-python-1.2.1/akamai/edgegrid/test/test_edgegrid.py
new/edgegrid-python-1.3.1/akamai/edgegrid/test/test_edgegrid.py
--- old/edgegrid-python-1.2.1/akamai/edgegrid/test/test_edgegrid.py
2021-06-24 16:17:32.000000000 +0200
+++ new/edgegrid-python-1.3.1/akamai/edgegrid/test/test_edgegrid.py
2022-09-22 11:39:50.000000000 +0200
@@ -27,6 +27,7 @@
import os
import re
import requests
+import requests_toolbelt
import sys
import unittest
@@ -45,6 +46,35 @@
expected_client_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx='
+class EdgeGridAuthHeadersTest(unittest.TestCase):
+ def __init__(self, testdata=None, testcase=None):
+ super(EdgeGridAuthHeadersTest, self).__init__()
+ self.testdata = testdata
+ self.testcase = testcase
+ self.maxDiff = None
+
+ def runTest(self):
+ self.ah = eg.EdgeGridAuthHeaders(
+ client_token=self.testdata['client_token'],
+ client_secret=self.testdata['client_secret'],
+ access_token=self.testdata['access_token'],
+ headers_to_sign=self.testdata['headers_to_sign'],
+ max_body=self.testdata['max_body']
+ )
+
+ sign_key = self.ah.make_signing_key(self.testdata['timestamp'])
+ self.assertEqual(sign_key, self.testdata["sign_key_test"])
+
+ content_hash = self.ah.make_content_hash(
+ body="test_body",
+ method="POST"
+ )
+ self.assertEqual(content_hash, self.testdata["content_hash_test"])
+
+ header = self.ah.get_header_versions()
+ self.assertEqual(header, {})
+
+
class EdgeGridTest(unittest.TestCase):
def __init__(self, testdata=None, testcase=None):
super(EdgeGridTest, self).__init__()
@@ -78,9 +108,11 @@
)
try:
- auth_header = auth.make_auth_header(
- request.prepare(
- ), self.testdata['timestamp'], self.testdata['nonce']
+ r = request.prepare()
+ data_to_sign = auth.ah.make_data_to_sign(r.url, r.headers, "",
r.method, r.body)
+ auth_header = auth.ah.make_auth_header(
+ r.url, r.headers, r.method, r.body, self.testdata['timestamp'],
+ self.testdata['nonce']
)
except Exception as e:
logger.debug('Got exception from make_auth_header', exc_info=True)
@@ -88,6 +120,7 @@
return
self.assertEqual(auth_header, self.testcase['expectedAuthorization'])
+ self.assertEqual(data_to_sign, self.testcase['expectedDataToSign'])
class EGSimpleTest(unittest.TestCase):
@@ -123,34 +156,34 @@
auth = EdgeGridAuth(
client_token='xxx', client_secret='xxx', access_token='xxx'
)
- self.assertEqual(auth.max_body, 131072)
- self.assertEqual(auth.headers_to_sign, [])
+ self.assertEqual(auth.ah.max_body, 131072)
+ self.assertEqual(auth.ah.headers_to_sign, [])
def test_edgerc_default(self):
auth = EdgeGridAuth.from_edgerc(os.path.join(mydir, 'sample_edgerc'))
self.assertEqual(
- auth.client_token,
+ auth.ah.client_token,
'xxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx')
self.assertEqual(
- auth.client_secret,
+ auth.ah.client_secret,
expected_client_secret)
self.assertEqual(
- auth.access_token,
+ auth.ah.access_token,
'xxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx')
- self.assertEqual(auth.max_body, 131072)
- self.assertEqual(auth.headers_to_sign, ['none'])
+ self.assertEqual(auth.ah.max_body, 131072)
+ self.assertEqual(auth.ah.headers_to_sign, ['none'])
def test_edgerc_broken(self):
auth = EdgeGridAuth.from_edgerc(
os.path.join(mydir, 'sample_edgerc'), 'broken')
self.assertEqual(
- auth.client_secret,
+ auth.ah.client_secret,
expected_client_secret)
self.assertEqual(
- auth.access_token,
+ auth.ah.access_token,
'xxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx')
- self.assertEqual(auth.max_body, 128 * 1024)
- self.assertEqual(auth.headers_to_sign, ['none'])
+ self.assertEqual(auth.ah.max_body, 128 * 1024)
+ self.assertEqual(auth.ah.headers_to_sign, ['none'])
def test_edgerc_unparseable(self):
# noinspection PyBroadException
@@ -164,15 +197,15 @@
def test_edgerc_headers(self):
auth = EdgeGridAuth.from_edgerc(
os.path.join(mydir, 'sample_edgerc'), 'headers')
- self.assertEqual(auth.headers_to_sign, ['x-mything1', 'x-mything2'])
+ self.assertEqual(auth.ah.headers_to_sign, ['x-mything1', 'x-mything2'])
def test_get_header_versions(self):
auth = EdgeGridAuth.from_edgerc(
os.path.join(mydir, 'sample_edgerc'), 'headers')
- header = auth.get_header_versions()
+ header = auth.ah.get_header_versions()
self.assertFalse('user-agent' in header)
- header = auth.get_header_versions({'User-Agent': 'testvalue'})
+ header = auth.ah.get_header_versions({'User-Agent': 'testvalue'})
self.assertTrue('User-Agent' in header)
# setting environment variables with hardcoded `1.0.0` value, just for
this test.
@@ -180,23 +213,23 @@
os.environ["AKAMAI_CLI"] = '1.0.0'
os.environ["AKAMAI_CLI_VERSION"] = '1.0.0'
- header = auth.get_header_versions()
+ header = auth.ah.get_header_versions()
self.assertTrue('User-Agent' in header)
self.assertEqual(header['User-Agent'], 'AkamaiCLI/1.0.0')
- header = auth.get_header_versions({'User-Agent': 'test-agent'})
+ header = auth.ah.get_header_versions({'User-Agent': 'test-agent'})
self.assertTrue('User-Agent' in header)
self.assertEqual(header['User-Agent'], 'test-agent AkamaiCLI/1.0.0')
os.environ["AKAMAI_CLI_COMMAND"] = '1.0.0'
os.environ["AKAMAI_CLI_COMMAND_VERSION"] = '1.0.0'
- header = auth.get_header_versions()
+ header = auth.ah.get_header_versions()
self.assertTrue('User-Agent' in header)
self.assertEqual(header['User-Agent'],
'AkamaiCLI/1.0.0 AkamaiCLI-1.0.0/1.0.0')
- header = auth.get_header_versions({'User-Agent': 'testvalue'})
+ header = auth.ah.get_header_versions({'User-Agent': 'testvalue'})
self.assertTrue('User-Agent' in header)
self.assertEqual(
header['User-Agent'],
@@ -216,21 +249,33 @@
auth = EdgeGridAuth.from_edgerc(
EdgeRc(os.path.join(mydir, 'sample_edgerc')))
self.assertEqual(
- auth.client_token,
+ auth.ah.client_token,
'xxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx')
self.assertEqual(
- auth.client_secret,
+ auth.ah.client_secret,
expected_client_secret)
self.assertEqual(
- auth.access_token,
+ auth.ah.access_token,
'xxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx')
- self.assertEqual(auth.max_body, 131072)
- self.assertEqual(auth.headers_to_sign, ['none'])
+ self.assertEqual(auth.ah.max_body, 131072)
+ self.assertEqual(auth.ah.headers_to_sign, ['none'])
def test_edgerc_dashes(self):
auth = EdgeGridAuth.from_edgerc(
os.path.join(mydir, 'sample_edgerc'), 'dashes')
- self.assertEqual(auth.max_body, 128 * 1024)
+ self.assertEqual(auth.ah.max_body, 128 * 1024)
+
+ def test_get_multipart_body(self):
+ with open("%s/sample_file.txt" % mydir, "rb") as sample_file:
+ encoder = requests_toolbelt.MultipartEncoder(
+ fields={
+ "foo": "bar",
+ "baz": ("sample_file.txt", sample_file),
+ },
+ boundary="multipart_boundary",
+ )
+ self.assertEqual(eg.get_multipart_body(encoder, size=20),
b"--multipart_boundary")
+ self.assertEqual(eg.get_multipart_body(encoder),
encoder.to_string())
class JsonTest(unittest.TestCase):
@@ -262,14 +307,61 @@
json=data,
)
- auth_header = auth.make_auth_header(
- request.prepare(
- ), self.testdata['timestamp'], self.testdata['nonce']
+ r = request.prepare()
+ auth_header = auth.ah.make_auth_header(
+ r.url, r.headers, r.method, r.body, self.testdata['timestamp'],
+ self.testdata['nonce']
)
self.assertEqual(auth_header, self.testdata['jsontest_hash'])
+class MultipartEncoderTest(unittest.TestCase):
+ def __init__(self, testdata=None, multipart_fields=None):
+ super(MultipartEncoderTest, self).__init__()
+ self.testdata = testdata
+ self.multipart_fields = multipart_fields
+ self.maxDiff = None
+
+ def runTest(self):
+ auth = EdgeGridAuth(
+ client_token=self.testdata["client_token"],
+ client_secret=self.testdata["client_secret"],
+ access_token=self.testdata["access_token"],
+ )
+
+ params = {
+ "extended": "true",
+ }
+
+ data = requests_toolbelt.MultipartEncoder(
+ fields=self.multipart_fields,
+ boundary="multipart_boundary",
+ )
+
+ request = requests.Request(
+ method="POST",
+ url=urljoin(self.testdata["base_url"], "/testapi/v1/t3"),
+ params=params,
+ data=data,
+ )
+
+ r = request.prepare()
+ auth_header = auth.ah.make_auth_header(
+ r.url, r.headers, r.method, r.body, self.testdata["timestamp"],
self.testdata["nonce"]
+ )
+
+ # close any open files
+ for part_value in self.multipart_fields.values():
+ f = part_value[1] if isinstance(part_value, (list, tuple)) else
part_value
+ try:
+ f.close()
+ except AttributeError:
+ pass
+
+ self.assertEqual(auth_header, self.testdata["multipart_hash_test"])
+
+
def suite():
suite = unittest.TestSuite()
with open("%s/testdata.json" % mydir) as testdata:
@@ -280,9 +372,21 @@
for test in tests:
suite.addTest(EdgeGridTest(testdata, test))
+ suite.addTest(EdgeGridAuthHeadersTest(testdata, test))
suite.addTest(JsonTest(testdata))
+ sample_file = open("%s/sample_file.txt" % mydir, "rb")
+ suite.addTest(
+ MultipartEncoderTest(
+ testdata,
+ multipart_fields={
+ "foo": "bar",
+ "baz": ("sample_file.txt", sample_file),
+ },
+ )
+ )
+
suite.addTest(EGSimpleTest('test_nonce'))
suite.addTest(EGSimpleTest('test_timestamp'))
suite.addTest(EGSimpleTest('test_defaults'))
@@ -292,6 +396,7 @@
suite.addTest(EGSimpleTest('test_edgerc_headers'))
suite.addTest(EGSimpleTest('test_get_header_versions'))
suite.addTest(EGSimpleTest('test_edgerc_from_object'))
+ suite.addTest(EGSimpleTest('test_get_multipart_body'))
return suite
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid-python-1.2.1/akamai/edgegrid/test/testdata.json
new/edgegrid-python-1.3.1/akamai/edgegrid/test/testdata.json
--- old/edgegrid-python-1.2.1/akamai/edgegrid/test/testdata.json
2021-04-29 13:45:45.000000000 +0200
+++ new/edgegrid-python-1.3.1/akamai/edgegrid/test/testdata.json
2022-09-22 11:39:50.000000000 +0200
@@ -8,6 +8,9 @@
"nonce": "nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"timestamp": "20140321T19:34:21+0000",
"jsontest_hash": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=nONuDe50qGrPius4Rg4D2jfi/2zDZWAYRUG6RudJLNM=",
+ "sign_key_test": "znsRMDBRqTXGJ7Ojip3/h2FGPu3LuoMYWgv9PKEnE/o=",
+ "content_hash_test": "REPGqEEubBHzJMhwqDZtbt515/ntEvAMNriNR53zcdY=",
+ "multipart_hash_test": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=8b5xnV0YyhRCreV0x5UEftF+EHIr2I7ebyJVNjMb7FM=",
"tests": [
{
"testName": "simple GET",
@@ -18,7 +21,8 @@
{"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=tL+y4hxyHxgWVD30X3pWnGKHcPzmrIF+LThiAOhMxYU="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=tL+y4hxyHxgWVD30X3pWnGKHcPzmrIF+LThiAOhMxYU=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/\t\t\t"
},
{
"testName": "GET with querystring",
@@ -29,7 +33,8 @@
{"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hKDH1UlnQySSHjvIcZpDMbQHihTQ0XyVAKZaApabdeA="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hKDH1UlnQySSHjvIcZpDMbQHihTQ0XyVAKZaApabdeA=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t1?p1=1&p2=2\t\t\t"
},
{
"testName": "POST inside limit",
@@ -41,7 +46,8 @@
{"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hXm4iCxtpN22m4cbZb4lVLW5rhX8Ca82vCFqXzSTPe4="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hXm4iCxtpN22m4cbZb4lVLW5rhX8Ca82vCFqXzSTPe4=",
+ "expectedDataToSign":
"POST\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t3\t\tfDimoYqXOLntG3If/Z0K2aS9I19Pkv9P5OMCoL8lY0w=\t"
},
{
"testName": "POST too large",
@@ -53,7 +59,8 @@
{"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY=",
+ "expectedDataToSign":
"POST\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t3\t\tiysZKJ78BqF0NvDrpv9Hc3pJBWC5f5apR4qUK/Qfo5k=\t"
},
{
"testName": "POST length equals max_body",
@@ -65,7 +72,8 @@
{"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY=",
+ "expectedDataToSign":
"POST\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t3\t\tiysZKJ78BqF0NvDrpv9Hc3pJBWC5f5apR4qUK/Qfo5k=\t"
},
{
"testName": "POST empty body",
@@ -77,7 +85,8 @@
{"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=1gEDxeQGD5GovIkJJGcBaKnZ+VaPtrc4qBUHixjsPCQ="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=1gEDxeQGD5GovIkJJGcBaKnZ+VaPtrc4qBUHixjsPCQ=",
+ "expectedDataToSign":
"POST\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t6\t\t\t"
},
{
"testName": "Simple header signing with GET",
@@ -89,7 +98,8 @@
{"X-Test1": "test-simple-header"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=8F9AybcRw+PLxnvT+H0JRkjROrrUgsxJTnRXMzqvcwY="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=8F9AybcRw+PLxnvT+H0JRkjROrrUgsxJTnRXMzqvcwY=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t4\tx-test1:test-simple-header\t\t"
},
{
"testName": "Header containing spaces",
@@ -101,7 +111,8 @@
{"X-Test1": "\" test-header-with-spaces \""}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=ucq2AbjCNtobHfCTuS38fdkl5UDdWHZhQX46fYR8CqI="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=ucq2AbjCNtobHfCTuS38fdkl5UDdWHZhQX46fYR8CqI=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t4\tx-test1:\"
test-header-with-spaces \"\t\t"
},
{
"testName": "Header with leading and interior spaces",
@@ -113,7 +124,7 @@
{"X-Test1": " first-thing second-thing"}
]
},
- "failsWithMessage": "Invalid return character or leading space in
header: X-Test1",
+ "failsWithMessage": "Invalid leading whitespace, reserved
character(s), or returncharacter(s) in header value: ' first-thing
second-thing'",
"expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=WtnneL539UadAAOJwnsXvPqT4Kt6z7HMgBEwAFpt3+c="
},
{
@@ -128,7 +139,8 @@
{"X-Test3": "t3"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Wus73Nx8jOYM+kkBFF2q8D1EATRIMr0WLWwpLBgkBqY="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Wus73Nx8jOYM+kkBFF2q8D1EATRIMr0WLWwpLBgkBqY=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t4\tx-test1:t1\tx-test2:t2\tx-test3:t3\t\t"
},
{
"testName": "Extra header",
@@ -143,7 +155,8 @@
{"X-Extra": "this won't be included"}
]
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Knd/jc0A5Ghhizjayr0AUUvl2MZjBpS3FDSzvtq4Ixc="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Knd/jc0A5Ghhizjayr0AUUvl2MZjBpS3FDSzvtq4Ixc=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t5\tx-test1:t1\tx-test2:t2\tx-test3:t3\t\t"
},
{
"testName": "PUT test",
@@ -152,7 +165,33 @@
"path": "/testapi/v1/t6",
"data": "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP"
},
- "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=GNBWEYSEWOLtu+7dD52da2C39aX/Jchpon3K/AmBqBU="
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=GNBWEYSEWOLtu+7dD52da2C39aX/Jchpon3K/AmBqBU=",
+ "expectedDataToSign":
"PUT\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/t6\t\t\t"
+ },
+ {
+ "testName": "GET with query params",
+ "request": {
+ "method": "GET",
+ "path": "/testapi/v1/configs/111?from=12345&limit=200000",
+ "headers": [
+ {"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
+ ]
+ },
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=XM+hsuSs6nuy/5eDRty1IjtVCAdr8xPFRAZ/b8RXDm8=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/configs/111?from=12345&limit=200000\t\t\t"
+ },
+ {
+ "_comment": "signature must be different here than in 'GET with
query params' test",
+ "testName": "GET with query params and separator in path",
+ "request": {
+ "method": "GET",
+ "path":
"/testapi/v1/configs/111;222;333?from=12345&limit=200000",
+ "headers": [
+ {"Host":
"akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"}
+ ]
+ },
+ "expectedAuthorization": "EG1-HMAC-SHA256
client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=pmQF7Is2+O4r/mMojPR4yeF58BrempNNoBX5/DT0Fxs=",
+ "expectedDataToSign":
"GET\thttps\takaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net\t/testapi/v1/configs/111;222;333?from=12345&limit=200000\t\t\t"
}
]
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid-python-1.2.1/edgegrid_python.egg-info/PKG-INFO
new/edgegrid-python-1.3.1/edgegrid_python.egg-info/PKG-INFO
--- old/edgegrid-python-1.2.1/edgegrid_python.egg-info/PKG-INFO 2021-10-11
09:39:22.000000000 +0200
+++ new/edgegrid-python-1.3.1/edgegrid_python.egg-info/PKG-INFO 2022-09-22
11:50:47.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: edgegrid-python
-Version: 1.2.1
+Version: 1.3.1
Summary: {OPEN} client authentication protocol for python-requests
Home-page: https://github.com/akamai/AkamaiOPEN-edgegrid-python
Author: Jonathan Landis
@@ -8,12 +8,8 @@
Maintainer: Akamai Developer Experience team
Maintainer-email: [email protected]
License: Apache 2.0
-Platform: UNKNOWN
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Requires-Python: >=2.7.10
License-File: LICENSE
-
-UNKNOWN
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid-python-1.2.1/edgegrid_python.egg-info/SOURCES.txt
new/edgegrid-python-1.3.1/edgegrid_python.egg-info/SOURCES.txt
--- old/edgegrid-python-1.2.1/edgegrid_python.egg-info/SOURCES.txt
2021-10-11 09:39:22.000000000 +0200
+++ new/edgegrid-python-1.3.1/edgegrid_python.egg-info/SOURCES.txt
2022-09-22 11:50:47.000000000 +0200
@@ -1,6 +1,6 @@
LICENSE
MANIFEST.in
-README.rst
+README.md
requirements.txt
setup.py
akamai/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/edgegrid-python-1.2.1/edgegrid_python.egg-info/requires.txt
new/edgegrid-python-1.3.1/edgegrid_python.egg-info/requires.txt
--- old/edgegrid-python-1.2.1/edgegrid_python.egg-info/requires.txt
2021-10-11 09:39:22.000000000 +0200
+++ new/edgegrid-python-1.3.1/edgegrid_python.egg-info/requires.txt
2022-09-22 11:50:47.000000000 +0200
@@ -1,4 +1,5 @@
requests>=2.3.0
+requests_toolbelt>=0.9.0
pyOpenSSL>=19.0.0
ndg-httpsclient
pyasn1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/requirements.txt
new/edgegrid-python-1.3.1/requirements.txt
--- old/edgegrid-python-1.2.1/requirements.txt 2021-06-24 16:17:32.000000000
+0200
+++ new/edgegrid-python-1.3.1/requirements.txt 2022-09-08 12:49:34.000000000
+0200
@@ -1,4 +1,5 @@
requests>=2.3.0
+requests_toolbelt>=0.9.0
pyopenssl>=19.0.0
ndg-httpsclient
pyasn1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/edgegrid-python-1.2.1/setup.py
new/edgegrid-python-1.3.1/setup.py
--- old/edgegrid-python-1.2.1/setup.py 2021-10-11 09:27:16.000000000 +0200
+++ new/edgegrid-python-1.3.1/setup.py 2022-09-22 11:39:50.000000000 +0200
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
setup(
name='edgegrid-python',
- version='1.2.1',
+ version='1.3.1',
description='{OPEN} client authentication protocol for python-requests',
author='Jonathan Landis',
author_email='[email protected]',
@@ -13,6 +13,7 @@
python_requires=">=2.7.10",
install_requires=[
'requests>=2.3.0',
+ 'requests_toolbelt>=0.9.0',
'pyOpenSSL>=19.0.0',
'ndg-httpsclient',
'pyasn1',