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.
Files changed (76) hide show
  1. {cloudinary-1.44.3/cloudinary.egg-info → cloudinary-1.44.4}/PKG-INFO +1 -1
  2. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/__init__.py +1 -1
  3. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/utils.py +4 -0
  4. {cloudinary-1.44.3 → cloudinary-1.44.4/cloudinary.egg-info}/PKG-INFO +1 -1
  5. {cloudinary-1.44.3 → cloudinary-1.44.4}/pyproject.toml +1 -1
  6. {cloudinary-1.44.3 → cloudinary-1.44.4}/setup.py +1 -1
  7. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_utils.py +49 -0
  8. {cloudinary-1.44.3 → cloudinary-1.44.4}/LICENSE.txt +0 -0
  9. {cloudinary-1.44.3 → cloudinary-1.44.4}/MANIFEST.in +0 -0
  10. {cloudinary-1.44.3 → cloudinary-1.44.4}/README.md +0 -0
  11. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api.py +0 -0
  12. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/__init__.py +0 -0
  13. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/call_account_api.py +0 -0
  14. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/call_api.py +0 -0
  15. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/execute_request.py +0 -0
  16. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/api_client/tcp_keep_alive_manager.py +0 -0
  17. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/auth_token.py +0 -0
  18. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/__init__.py +0 -0
  19. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/adapter/__init__.py +0 -0
  20. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/adapter/cache_adapter.py +0 -0
  21. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/adapter/key_value_cache_adapter.py +0 -0
  22. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/responsive_breakpoints_cache.py +0 -0
  23. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/__init__.py +0 -0
  24. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/file_system_key_value_storage.py +0 -0
  25. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/cache/storage/key_value_storage.py +0 -0
  26. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/compat.py +0 -0
  27. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/exceptions.py +0 -0
  28. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/forms.py +0 -0
  29. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/http_client.py +0 -0
  30. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/models.py +0 -0
  31. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/poster/__init__.py +0 -0
  32. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/poster/encode.py +0 -0
  33. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/poster/streaminghttp.py +0 -0
  34. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/provisioning/__init__.py +0 -0
  35. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/provisioning/account.py +0 -0
  36. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/provisioning/account_config.py +0 -0
  37. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/search.py +0 -0
  38. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/search_folders.py +0 -0
  39. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/html/cloudinary_cors.html +0 -0
  40. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/canvas-to-blob.min.js +0 -0
  41. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.cloudinary.js +0 -0
  42. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-image.js +0 -0
  43. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-process.js +0 -0
  44. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload-validate.js +0 -0
  45. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.fileupload.js +0 -0
  46. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.iframe-transport.js +0 -0
  47. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/jquery.ui.widget.js +0 -0
  48. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/static/cloudinary/js/load-image.all.min.js +0 -0
  49. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templates/cloudinary_direct_upload.html +0 -0
  50. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templates/cloudinary_includes.html +0 -0
  51. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templates/cloudinary_js_config.html +0 -0
  52. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templatetags/__init__.py +0 -0
  53. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/templatetags/cloudinary.py +0 -0
  54. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary/uploader.py +0 -0
  55. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/SOURCES.txt +0 -0
  56. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/dependency_links.txt +0 -0
  57. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/not-zip-safe +0 -0
  58. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/requires.txt +0 -0
  59. {cloudinary-1.44.3 → cloudinary-1.44.4}/cloudinary.egg-info/top_level.txt +0 -0
  60. {cloudinary-1.44.3 → cloudinary-1.44.4}/setup.cfg +0 -0
  61. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_api.py +0 -0
  62. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_api_authorization.py +0 -0
  63. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_archive.py +0 -0
  64. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_auth_token.py +0 -0
  65. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_cloudinary_resource.py +0 -0
  66. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_config.py +0 -0
  67. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_expression_normalization.py +0 -0
  68. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_http_client.py +0 -0
  69. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_image.py +0 -0
  70. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_metadata.py +0 -0
  71. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_metadata_rules.py +0 -0
  72. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_provisioning_api.py +0 -0
  73. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_search.py +0 -0
  74. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_streaming_profiles.py +0 -0
  75. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_uploader.py +0 -0
  76. {cloudinary-1.44.3 → cloudinary-1.44.4}/test/test_video.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudinary
3
- Version: 1.44.3
3
+ Version: 1.44.4
4
4
  Summary: Python and Django SDK for Cloudinary
5
5
  Author-email: Cloudinary <info@cloudinary.com>
6
6
  License: Released under the MIT license.
@@ -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.3"
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudinary
3
- Version: 1.44.3
3
+ Version: 1.44.4
4
4
  Summary: Python and Django SDK for Cloudinary
5
5
  Author-email: Cloudinary <info@cloudinary.com>
6
6
  License: Released under the MIT license.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "cloudinary"
3
3
  description = "Python and Django SDK for Cloudinary"
4
- version = "1.44.3"
4
+ version = "1.44.4"
5
5
 
6
6
  authors = [{ name = "Cloudinary", email = "info@cloudinary.com" }]
7
7
  license = { file = "LICENSE.txt" }
@@ -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.3"
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