diff --git a/Makefile b/Makefile index 5fdf104..5718550 100644 --- a/Makefile +++ b/Makefile @@ -13,5 +13,6 @@ build: test: $(PYTHON) setup.py test + clean: rm -rf dist/* diff --git a/README.rst b/README.rst index ad4d9b8..6a5aa0a 100644 --- a/README.rst +++ b/README.rst @@ -34,7 +34,7 @@ GitHub `_ or file an issue at its .. code-block:: bash - $ pip install --upgrade setuptools + $ pip install --upgrade setuptools wheel $ python setup.py install develop The `setuptools` pakage must be upgraded (as shown above) because the version diff --git a/objectstore/objectstore.py b/objectstore/objectstore.py index 593f4d3..523e381 100644 --- a/objectstore/objectstore.py +++ b/objectstore/objectstore.py @@ -33,15 +33,16 @@ """ +import hmac import logging import os -# import pprint +from hashlib import sha1 +from time import time from swiftclient.client import Connection LOG = logging.getLogger('objectstore') - logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("swiftclient").setLevel(logging.WARNING) @@ -66,7 +67,7 @@ def make_config_from_env(): def get_connection(store_settings: dict = {}) -> Connection: """ - get an objectsctore connection + get an objectstore connection """ store = store_settings @@ -140,6 +141,28 @@ def put_object( content_type=content_type) +def create_temp_url(connection, container: str, file_name: str, temp_url_key, expiry_minutes=0, expiry_hours=0, + expiry_days=0): + """ + Returns an url for users to temporarily access an object without further authentication + """ + # Create signature body + method = 'GET' + duration_in_seconds = ((((expiry_days * 24) + expiry_hours) * 60) + expiry_minutes) * 60 + expires = int(time() + duration_in_seconds) + path = os.path.join(f'/{container}', file_name) + hmac_body = f'{method}\n{expires}\n{path}'.encode('utf-8') + + # Create signature + key = bytes(temp_url_key, 'UTF-8') + sig = hmac.new(key, hmac_body, sha1).hexdigest() + + # Create url + tenant_id = connection.os_options['tenant_id'] + url = f'https://{tenant_id}.objectstore.eu{path}?temp_url_sig={sig}&temp_url_expires={expires}' + return url + + def delete_object(connection, container: str, object_meta_data: dict) -> None: """ Delete single object from objectstore