ソースを参照

move generate_signature and verify_signature from images/views/serve to images/utils

Noah Hall 4 年 前
コミット
37245d8546

+ 1 - 1
wagtail/images/tests/test_admin_views.py

@@ -9,7 +9,7 @@ from django.utils.http import RFC3986_SUBDELIMS, urlquote
 
 from wagtail.core.models import Collection, GroupCollectionPermission
 from wagtail.images.models import UploadedImage
-from wagtail.images.views.serve import generate_signature
+from wagtail.images.utils import generate_signature
 from wagtail.tests.testapp.models import CustomImage, CustomImageWithAuthor
 from wagtail.tests.utils import WagtailTestUtils
 

+ 2 - 1
wagtail/images/tests/tests.py

@@ -14,7 +14,8 @@ from wagtail.images.formats import Format, get_image_format, register_image_form
 from wagtail.images.forms import get_image_form
 from wagtail.images.models import Image as WagtailImage
 from wagtail.images.rect import Rect, Vector
-from wagtail.images.views.serve import ServeView, generate_signature, verify_signature
+from wagtail.images.utils import generate_signature, verify_signature
+from wagtail.images.views.serve import ServeView
 from wagtail.tests.testapp.models import CustomImage, CustomImageFilePath
 from wagtail.tests.utils import WagtailTestUtils
 

+ 26 - 2
wagtail/images/utils.py

@@ -1,7 +1,13 @@
-# Helper functions for migrating the Rendition.filter foreign key to the filter_spec field,
-# and the corresponding reverse migration
+import base64
+import hashlib
+import hmac
+
+from django.conf import settings
+from django.utils.encoding import force_str
 
 
+# Helper functions for migrating the Rendition.filter foreign key to the filter_spec field,
+# and the corresponding reverse migration
 def get_fill_filter_spec_migrations(app_name, rendition_model_name):
 
     def fill_filter_spec_forward(apps, schema_editor):
@@ -60,3 +66,21 @@ def parse_color_string(color_string):
         raise ValueError('Color string must be either 3 or 6 hexadecimal digits long')
 
     return r, g, b
+
+
+def generate_signature(image_id, filter_spec, key=None):
+    if key is None:
+        key = settings.SECRET_KEY
+
+    # Key must be a bytes object
+    if isinstance(key, str):
+        key = key.encode()
+
+    # Based on libthumbor hmac generation
+    # https://github.com/thumbor/libthumbor/blob/b19dc58cf84787e08c8e397ab322e86268bb4345/libthumbor/crypto.py#L50
+    url = '{}/{}/'.format(image_id, filter_spec)
+    return force_str(base64.urlsafe_b64encode(hmac.new(key, url.encode(), hashlib.sha1).digest()))
+
+
+def verify_signature(signature, image_id, filter_spec, key=None):
+    return force_str(signature) == generate_signature(image_id, filter_spec, key=key)

+ 1 - 1
wagtail/images/views/images.py

@@ -20,7 +20,7 @@ from wagtail.images.exceptions import InvalidFilterSpecError
 from wagtail.images.forms import URLGeneratorForm, get_image_form
 from wagtail.images.models import Filter, SourceImageIOError
 from wagtail.images.permissions import permission_policy
-from wagtail.images.views.serve import generate_signature
+from wagtail.images.utils import generate_signature
 from wagtail.search import index as search_index
 
 permission_checker = PermissionPolicyChecker(permission_policy)

+ 1 - 23
wagtail/images/views/serve.py

@@ -1,42 +1,20 @@
-import base64
-import hashlib
-import hmac
 import imghdr
 from wsgiref.util import FileWrapper
 
-from django.conf import settings
 from django.core.exceptions import ImproperlyConfigured, PermissionDenied
 from django.http import HttpResponse, HttpResponsePermanentRedirect, StreamingHttpResponse
 from django.shortcuts import get_object_or_404
 from django.urls import reverse
 from django.utils.decorators import classonlymethod
-from django.utils.encoding import force_str
 from django.views.generic import View
 
 from wagtail.images import get_image_model
 from wagtail.images.exceptions import InvalidFilterSpecError
 from wagtail.images.models import SourceImageIOError
+from wagtail.images.utils import generate_signature, verify_signature
 from wagtail.utils.sendfile import sendfile
 
 
-def generate_signature(image_id, filter_spec, key=None):
-    if key is None:
-        key = settings.SECRET_KEY
-
-    # Key must be a bytes object
-    if isinstance(key, str):
-        key = key.encode()
-
-    # Based on libthumbor hmac generation
-    # https://github.com/thumbor/libthumbor/blob/b19dc58cf84787e08c8e397ab322e86268bb4345/libthumbor/crypto.py#L50
-    url = '{}/{}/'.format(image_id, filter_spec)
-    return force_str(base64.urlsafe_b64encode(hmac.new(key, url.encode(), hashlib.sha1).digest()))
-
-
-def verify_signature(signature, image_id, filter_spec, key=None):
-    return force_str(signature) == generate_signature(image_id, filter_spec, key=key)
-
-
 def generate_image_url(image, filter_spec, viewname='wagtailimages_serve', key=None):
     signature = generate_signature(image.id, filter_spec, key)
     url = reverse(viewname, args=(signature, image.id, filter_spec))