cloudinary 1.44.3__tar.gz → 1.44.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cloudinary-1.44.3/cloudinary.egg-info → cloudinary-1.44.4}/PKG-INFO +1 -1
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/__init__.py +1 -1
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/utils.py +4 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4/cloudinary.egg-info}/PKG-INFO +1 -1
- {cloudinary-1.44.3 → cloudinary-1.44.4}/pyproject.toml +1 -1
- {cloudinary-1.44.3 → cloudinary-1.44.4}/setup.py +1 -1
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_utils.py +49 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/LICENSE.txt +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/MANIFEST.in +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/README.md +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/call_account_api.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/call_api.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/execute_request.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/tcp_keep_alive_manager.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/auth_token.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/adapter/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/adapter/cache_adapter.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/adapter/key_value_cache_adapter.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/responsive_breakpoints_cache.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/file_system_key_value_storage.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/key_value_storage.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/compat.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/exceptions.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/forms.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/http_client.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/models.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/poster/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/poster/encode.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/poster/streaminghttp.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/provisioning/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/provisioning/account.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/provisioning/account_config.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/search.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/search_folders.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/html/cloudinary_cors.html +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/canvas-to-blob.min.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.cloudinary.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-image.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-process.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-validate.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.iframe-transport.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.ui.widget.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/load-image.all.min.js +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templates/cloudinary_direct_upload.html +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templates/cloudinary_includes.html +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templates/cloudinary_js_config.html +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templatetags/__init__.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templatetags/cloudinary.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/uploader.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/SOURCES.txt +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/dependency_links.txt +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/not-zip-safe +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/requires.txt +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/top_level.txt +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/setup.cfg +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_api.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_api_authorization.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_archive.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_auth_token.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_cloudinary_resource.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_config.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_expression_normalization.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_http_client.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_image.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_metadata.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_metadata_rules.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_provisioning_api.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_search.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_streaming_profiles.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_uploader.py +0 -0
- {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_video.py +0 -0
|
@@ -38,7 +38,7 @@ CL_BLANK = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAA
|
|
|
38
38
|
URI_SCHEME = "cloudinary"
|
|
39
39
|
API_VERSION = "v1_1"
|
|
40
40
|
|
|
41
|
-
VERSION = "1.44.
|
|
41
|
+
VERSION = "1.44.4"
|
|
42
42
|
|
|
43
43
|
_USER_PLATFORM_DETAILS = "; ".join((platform(), "Python {}".format(python_version())))
|
|
44
44
|
|
|
@@ -642,6 +642,8 @@ def api_sign_request(params_to_sign, api_secret, algorithm=SIGNATURE_SHA1, signa
|
|
|
642
642
|
- Version 2+: Includes parameter encoding to prevent parameter smuggling
|
|
643
643
|
:return: Computed signature
|
|
644
644
|
"""
|
|
645
|
+
if not api_secret:
|
|
646
|
+
raise ValueError("Must supply api_secret")
|
|
645
647
|
to_sign = api_string_to_sign(params_to_sign, signature_version)
|
|
646
648
|
return compute_hex_hash(to_sign + api_secret, algorithm)
|
|
647
649
|
|
|
@@ -875,6 +877,8 @@ def cloudinary_url(source, **options):
|
|
|
875
877
|
|
|
876
878
|
signature = None
|
|
877
879
|
if sign_url and (not auth_token or auth_token.pop('set_url_signature', False)):
|
|
880
|
+
if not api_secret:
|
|
881
|
+
raise ValueError("Must supply api_secret")
|
|
878
882
|
to_sign = "/".join(__compact([transformation, source_to_sign]))
|
|
879
883
|
if long_url_signature:
|
|
880
884
|
# Long signature forces SHA256
|
|
@@ -7,7 +7,7 @@ if version_info[0] >= 3:
|
|
|
7
7
|
else:
|
|
8
8
|
# Following code is legacy (Python 2.7 compatibility) and will be removed in the future!
|
|
9
9
|
# TODO: Remove in next major update (when dropping Python 2.7 compatibility)
|
|
10
|
-
version = "1.44.
|
|
10
|
+
version = "1.44.4"
|
|
11
11
|
|
|
12
12
|
with open('README.md') as file:
|
|
13
13
|
long_description = file.read()
|
|
@@ -21,6 +21,7 @@ from cloudinary.utils import (
|
|
|
21
21
|
encode_unicode_url,
|
|
22
22
|
base64url_encode,
|
|
23
23
|
patch_fetch_format,
|
|
24
|
+
cloudinary_url,
|
|
24
25
|
cloudinary_scaled_url,
|
|
25
26
|
chain_transformations,
|
|
26
27
|
generate_transformation_string,
|
|
@@ -1591,6 +1592,54 @@ class TestUtils(unittest.TestCase):
|
|
|
1591
1592
|
self.assertEqual(signed_params_v1['signature'], expected_sig_v1)
|
|
1592
1593
|
self.assertEqual(signed_params_v2['signature'], expected_sig_v2)
|
|
1593
1594
|
|
|
1595
|
+
def test_cloudinary_url_sign_without_secret_raises(self):
|
|
1596
|
+
"""Signing without a secret should raise ValueError"""
|
|
1597
|
+
cloudinary.config(cloud_name="test123", api_secret=None)
|
|
1598
|
+
with self.assertRaises(ValueError) as context:
|
|
1599
|
+
cloudinary_url("sample", sign_url=True)
|
|
1600
|
+
self.assertEqual(str(context.exception), "Must supply api_secret")
|
|
1601
|
+
|
|
1602
|
+
def test_cloudinary_url_unsigned_without_secret_works(self):
|
|
1603
|
+
"""Unsigned URL should work without a secret"""
|
|
1604
|
+
cloudinary.config(cloud_name="test123", api_secret=None)
|
|
1605
|
+
url, _ = cloudinary_url("sample")
|
|
1606
|
+
self.assertIn("test123", url)
|
|
1607
|
+
self.assertNotIn("s--", url)
|
|
1608
|
+
|
|
1609
|
+
def test_cloudinary_url_sign_with_secret_works(self):
|
|
1610
|
+
"""Signing with a secret should work and include signature"""
|
|
1611
|
+
cloudinary.config(cloud_name="test123", api_key="key", api_secret="secret")
|
|
1612
|
+
url, _ = cloudinary_url("sample", sign_url=True)
|
|
1613
|
+
self.assertIn("s--", url)
|
|
1614
|
+
self.assertIn("test123", url)
|
|
1615
|
+
|
|
1616
|
+
def test_cloudinary_url_per_call_secret_override(self):
|
|
1617
|
+
"""Per-call api_secret override should sign successfully"""
|
|
1618
|
+
cloudinary.config(cloud_name="test123", api_secret=None)
|
|
1619
|
+
url, _ = cloudinary_url("sample", sign_url=True, api_secret="override_secret")
|
|
1620
|
+
self.assertIn("s--", url)
|
|
1621
|
+
self.assertIn("test123", url)
|
|
1622
|
+
|
|
1623
|
+
def test_api_sign_request_without_secret_raises(self):
|
|
1624
|
+
"""api_sign_request with None secret should raise ValueError"""
|
|
1625
|
+
params = {"a": "b"}
|
|
1626
|
+
with self.assertRaises(ValueError) as context:
|
|
1627
|
+
api_sign_request(params, None)
|
|
1628
|
+
self.assertEqual(str(context.exception), "Must supply api_secret")
|
|
1629
|
+
|
|
1630
|
+
def test_api_sign_request_with_empty_string_raises(self):
|
|
1631
|
+
"""api_sign_request with empty string secret should raise ValueError"""
|
|
1632
|
+
params = {"a": "b"}
|
|
1633
|
+
with self.assertRaises(ValueError) as context:
|
|
1634
|
+
api_sign_request(params, "")
|
|
1635
|
+
self.assertEqual(str(context.exception), "Must supply api_secret")
|
|
1636
|
+
|
|
1637
|
+
def test_api_sign_request_with_secret_works(self):
|
|
1638
|
+
"""api_sign_request with a real secret should work"""
|
|
1639
|
+
params = dict(cloud_name=API_SIGN_REQUEST_CLOUD_NAME, timestamp=1568810420, username="user@cloudinary.com")
|
|
1640
|
+
signature = api_sign_request(params, API_SIGN_REQUEST_TEST_SECRET)
|
|
1641
|
+
self.assertEqual(signature, "14c00ba6d0dfdedbc86b316847d95b9e6cd46d94")
|
|
1642
|
+
|
|
1594
1643
|
|
|
1595
1644
|
if __name__ == '__main__':
|
|
1596
1645
|
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/file_system_key_value_storage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/html/cloudinary_cors.html
RENAMED
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/canvas-to-blob.min.js
RENAMED
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.cloudinary.js
RENAMED
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-image.js
RENAMED
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-process.js
RENAMED
|
File without changes
|
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload.js
RENAMED
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.iframe-transport.js
RENAMED
|
File without changes
|
|
File without changes
|
{cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/load-image.all.min.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|