mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 05:23:35 +00:00
python: Pass query parameters as a dict when making GET requests.
This provides automatic URL-encoding. Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
committed by
Tim Abbott
parent
f0b11d62f6
commit
4e9d587535
@@ -1,5 +1,4 @@
|
||||
import base64
|
||||
import urllib
|
||||
from io import StringIO
|
||||
|
||||
import orjson
|
||||
@@ -46,16 +45,14 @@ class ThumbnailTest(ZulipTestCase):
|
||||
base = '/user_uploads/'
|
||||
self.assertEqual(base, uri[:len(base)])
|
||||
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
|
||||
# Test full size image.
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test thumbnail size.
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=thumbnail")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "thumbnail"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri, '0x300')
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -70,10 +67,8 @@ class ThumbnailTest(ZulipTestCase):
|
||||
emoji_url_base = '/user_avatars/'
|
||||
self.assertEqual(emoji_url_base, custom_emoji_url[:len(emoji_url_base)])
|
||||
|
||||
quoted_emoji_url = urllib.parse.quote(custom_emoji_url[1:], safe='')
|
||||
|
||||
# Test full size custom emoji image (for emoji link in messages case).
|
||||
result = self.client_get(f"/thumbnail?url={quoted_emoji_url}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": custom_emoji_url[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
self.assertIn(custom_emoji_url, result.url)
|
||||
|
||||
@@ -81,14 +76,14 @@ class ThumbnailTest(ZulipTestCase):
|
||||
self.logout()
|
||||
result = self.api_get(
|
||||
hamlet,
|
||||
f'/thumbnail?url={quoted_uri}&size=full')
|
||||
"/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test with another user trying to access image using thumbor.
|
||||
self.login('iago')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 403, result)
|
||||
self.assert_in_response("You are not authorized to view this file.", result)
|
||||
|
||||
@@ -96,15 +91,14 @@ class ThumbnailTest(ZulipTestCase):
|
||||
def run_test_with_image_url(image_url: str) -> None:
|
||||
# Test full size image.
|
||||
self.login('hamlet')
|
||||
quoted_url = urllib.parse.quote(image_url, safe='')
|
||||
encoded_url = base64.urlsafe_b64encode(image_url.encode()).decode('utf-8')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_url}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": image_url, "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = '/smart/filters:no_upscale()/' + encoded_url + '/source_type/external'
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test thumbnail size.
|
||||
result = self.client_get(f"/thumbnail?url={quoted_url}&size=thumbnail")
|
||||
result = self.client_get("/thumbnail", {"url": image_url, "size": "thumbnail"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = '/0x300/smart/filters:no_upscale():sharpen(0.5,0.2,true)/' + encoded_url + '/source_type/external'
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -113,21 +107,21 @@ class ThumbnailTest(ZulipTestCase):
|
||||
self.logout()
|
||||
user_profile = self.example_user("hamlet")
|
||||
result = self.api_get(user_profile,
|
||||
f"/thumbnail?url={quoted_url}&size=thumbnail")
|
||||
"/thumbnail", {"url": image_url, "size": "thumbnail"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = '/0x300/smart/filters:no_upscale():sharpen(0.5,0.2,true)/' + encoded_url + '/source_type/external'
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test API endpoint with legacy API authentication.
|
||||
user_profile = self.example_user("hamlet")
|
||||
result = self.client_get(f"/thumbnail?url={quoted_url}&size=thumbnail&api_key={get_api_key(user_profile)}")
|
||||
result = self.client_get("/thumbnail", {"url": image_url, "size": "thumbnail", "api_key": get_api_key(user_profile)})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = '/0x300/smart/filters:no_upscale():sharpen(0.5,0.2,true)/' + encoded_url + '/source_type/external'
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test a second logged-in user; they should also be able to access it
|
||||
user_profile = self.example_user("iago")
|
||||
result = self.client_get(f"/thumbnail?url={quoted_url}&size=thumbnail&api_key={get_api_key(user_profile)}")
|
||||
result = self.client_get("/thumbnail", {"url": image_url, "size": "thumbnail", "api_key": get_api_key(user_profile)})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = '/0x300/smart/filters:no_upscale():sharpen(0.5,0.2,true)/' + encoded_url + '/source_type/external'
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -135,7 +129,7 @@ class ThumbnailTest(ZulipTestCase):
|
||||
# Test with another user trying to access image using thumbor.
|
||||
# File should be always accessible to user in case of external source
|
||||
self.login('iago')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_url}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": image_url, "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = '/smart/filters:no_upscale()/' + encoded_url + '/source_type/external'
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -174,14 +168,13 @@ class ThumbnailTest(ZulipTestCase):
|
||||
# Test full size image.
|
||||
# We remove the forward slash infront of the `/user_uploads/` to match
|
||||
# Markdown behaviour.
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test thumbnail size.
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=thumbnail")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "thumbnail"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri, '0x300')
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -198,8 +191,7 @@ class ThumbnailTest(ZulipTestCase):
|
||||
|
||||
# We remove the forward slash infront of the `/user_uploads/` to match
|
||||
# Markdown behaviour.
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -214,10 +206,8 @@ class ThumbnailTest(ZulipTestCase):
|
||||
emoji_url_base = '/user_avatars/'
|
||||
self.assertEqual(emoji_url_base, custom_emoji_url[:len(emoji_url_base)])
|
||||
|
||||
quoted_emoji_url = urllib.parse.quote(custom_emoji_url[1:], safe='')
|
||||
|
||||
# Test full size custom emoji image (for emoji link in messages case).
|
||||
result = self.client_get(f"/thumbnail?url={quoted_emoji_url}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": custom_emoji_url[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
self.assertIn(custom_emoji_url, result.url)
|
||||
|
||||
@@ -226,7 +216,7 @@ class ThumbnailTest(ZulipTestCase):
|
||||
user_profile = self.example_user("hamlet")
|
||||
result = self.api_get(
|
||||
user_profile,
|
||||
f'/thumbnail?url={quoted_uri}&size=full')
|
||||
"/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
@@ -235,14 +225,14 @@ class ThumbnailTest(ZulipTestCase):
|
||||
# auth.
|
||||
user_profile = self.example_user("hamlet")
|
||||
result = self.client_get(
|
||||
f'/thumbnail?url={quoted_uri}&size=full&api_key={get_api_key(user_profile)}')
|
||||
"/thumbnail", {"url": uri[1:], "size": "full", "api_key": get_api_key(user_profile)})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test with another user trying to access image using thumbor.
|
||||
self.login('iago')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 403, result)
|
||||
self.assert_in_response("You are not authorized to view this file.", result)
|
||||
|
||||
@@ -250,8 +240,7 @@ class ThumbnailTest(ZulipTestCase):
|
||||
def test_with_static_files(self) -> None:
|
||||
self.login('hamlet')
|
||||
uri = '/static/images/cute/turtle.png'
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
self.assertEqual(uri, result.url)
|
||||
|
||||
@@ -268,33 +257,28 @@ class ThumbnailTest(ZulipTestCase):
|
||||
base = '/user_uploads/'
|
||||
self.assertEqual(base, uri[:len(base)])
|
||||
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
|
||||
with self.settings(THUMBOR_URL=''):
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
self.assertEqual(uri, result.url)
|
||||
|
||||
uri = 'https://www.google.com/images/srpr/logo4w.png'
|
||||
quoted_uri = urllib.parse.quote(uri, safe='')
|
||||
with self.settings(THUMBOR_URL=''):
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri, "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
base = 'https://external-content.zulipcdn.net/external_content/56c362a24201593891955ff526b3b412c0f9fcd2/68747470733a2f2f7777772e676f6f676c652e636f6d2f696d616765732f737270722f6c6f676f34772e706e67'
|
||||
self.assertEqual(base, result.url)
|
||||
|
||||
uri = 'http://www.google.com/images/srpr/logo4w.png'
|
||||
quoted_uri = urllib.parse.quote(uri, safe='')
|
||||
with self.settings(THUMBOR_URL=''):
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri, "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
base = 'https://external-content.zulipcdn.net/external_content/7b6552b60c635e41e8f6daeb36d88afc4eabde79/687474703a2f2f7777772e676f6f676c652e636f6d2f696d616765732f737270722f6c6f676f34772e706e67'
|
||||
self.assertEqual(base, result.url)
|
||||
|
||||
uri = '//www.google.com/images/srpr/logo4w.png'
|
||||
quoted_uri = urllib.parse.quote(uri, safe='')
|
||||
with self.settings(THUMBOR_URL=''):
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri, "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
base = 'https://external-content.zulipcdn.net/external_content/676530cf4b101d56f56cc4a37c6ef4d4fd9b0c03/2f2f7777772e676f6f676c652e636f6d2f696d616765732f737270722f6c6f676f34772e706e67'
|
||||
self.assertEqual(base, result.url)
|
||||
@@ -312,10 +296,9 @@ class ThumbnailTest(ZulipTestCase):
|
||||
base = '/user_uploads/'
|
||||
self.assertEqual(base, uri[:len(base)])
|
||||
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
hex_uri = base64.urlsafe_b64encode(uri.encode()).decode('utf-8')
|
||||
with self.settings(THUMBOR_URL='http://test-thumborhost.com'):
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
base = 'http://test-thumborhost.com/'
|
||||
self.assertEqual(base, result.url[:len(base)])
|
||||
@@ -347,24 +330,23 @@ class ThumbnailTest(ZulipTestCase):
|
||||
# Test with size supplied as a query parameter.
|
||||
# size=thumbnail should return a 0x300 sized image.
|
||||
# size=full should return the original resolution image.
|
||||
quoted_uri = urllib.parse.quote(uri[1:], safe='')
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=thumbnail")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "thumbnail"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri, '0x300')
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=full")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "full"})
|
||||
self.assertEqual(result.status_code, 302, result)
|
||||
expected_part_url = get_file_path_urlpart(uri)
|
||||
self.assertIn(expected_part_url, result.url)
|
||||
|
||||
# Test with size supplied as a query parameter where size is anything
|
||||
# else than 'full' or 'thumbnail'. Result should be an error message.
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}&size=480x360")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:], "size": "480x360"})
|
||||
self.assertEqual(result.status_code, 403, result)
|
||||
self.assert_in_response("Invalid size.", result)
|
||||
|
||||
# Test with no size param supplied. In this case as well we show an
|
||||
# error message.
|
||||
result = self.client_get(f"/thumbnail?url={quoted_uri}")
|
||||
result = self.client_get("/thumbnail", {"url": uri[1:]})
|
||||
self.assertEqual(result.status_code, 400, "Missing 'size' argument")
|
||||
|
||||
Reference in New Issue
Block a user