mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 21:43:21 +00:00
public_export: Add logic for deleting the export tarball.
The path to the uploaded tarball is reconstructed via the relative url and removed with the canonical methods in `upload.py`.
This commit is contained in:
@@ -245,6 +245,8 @@ class ZulipUploadBackend:
|
||||
def upload_export_tarball(self, realm: Realm, tarball_path: str) -> str:
|
||||
raise NotImplementedError()
|
||||
|
||||
def delete_export_tarball(self, path_id: str) -> Optional[str]:
|
||||
raise NotImplementedError()
|
||||
|
||||
### S3
|
||||
|
||||
@@ -598,6 +600,10 @@ class S3UploadBackend(ZulipUploadBackend):
|
||||
key=key.key)
|
||||
return public_url
|
||||
|
||||
def delete_export_tarball(self, path_id: str) -> Optional[str]:
|
||||
if self.delete_file_from_s3(path_id, settings.S3_AVATAR_BUCKET):
|
||||
return path_id
|
||||
return None
|
||||
|
||||
### Local
|
||||
|
||||
@@ -790,6 +796,13 @@ class LocalUploadBackend(ZulipUploadBackend):
|
||||
public_url = realm.uri + '/user_avatars/' + path
|
||||
return public_url
|
||||
|
||||
def delete_export_tarball(self, path_id: str) -> Optional[str]:
|
||||
# Get the last element of a list in the form ['user_avatars', '<file_path>']
|
||||
file_path = path_id.strip('/').split('/', 1)[-1]
|
||||
if delete_local_file('avatars', file_path):
|
||||
return path_id
|
||||
return None
|
||||
|
||||
# Common and wrappers
|
||||
if settings.LOCAL_UPLOADS_DIR is not None:
|
||||
upload_backend = LocalUploadBackend() # type: ZulipUploadBackend
|
||||
@@ -853,3 +866,6 @@ def upload_message_image_from_request(request: HttpRequest, user_file: File,
|
||||
|
||||
def upload_export_tarball(realm: Realm, tarball_path: str) -> str:
|
||||
return upload_backend.upload_export_tarball(realm, tarball_path)
|
||||
|
||||
def delete_export_tarball(path_id: str) -> Optional[str]:
|
||||
return upload_backend.delete_export_tarball(path_id)
|
||||
|
||||
@@ -9,6 +9,7 @@ from zerver.lib.test_helpers import use_s3_backend, create_s3_buckets
|
||||
|
||||
from zerver.models import RealmAuditLog
|
||||
from zerver.views.public_export import public_only_realm_export
|
||||
import zerver.lib.upload
|
||||
|
||||
import os
|
||||
|
||||
@@ -64,6 +65,10 @@ class RealmExportTest(ZulipTestCase):
|
||||
realm=admin.realm,
|
||||
event_type=RealmAuditLog.REALM_EXPORTED).count())
|
||||
|
||||
result = zerver.lib.upload.upload_backend.delete_export_tarball(path_id)
|
||||
self.assertEqual(result, path_id)
|
||||
self.assertIsNone(bucket.get_key(path_id))
|
||||
|
||||
def test_endpoint_local_uploads(self) -> None:
|
||||
admin = self.example_user('iago')
|
||||
self.login(admin.email)
|
||||
@@ -101,6 +106,11 @@ class RealmExportTest(ZulipTestCase):
|
||||
realm=admin.realm,
|
||||
event_type=RealmAuditLog.REALM_EXPORTED).count())
|
||||
|
||||
result = zerver.lib.upload.upload_backend.delete_export_tarball(path_id)
|
||||
self.assertEqual(result, path_id)
|
||||
response = self.client_get(path_id)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
def test_realm_export_rate_limited(self) -> None:
|
||||
admin = self.example_user('iago')
|
||||
self.login(admin.email)
|
||||
|
||||
@@ -24,7 +24,7 @@ from zerver.lib.upload import sanitize_name, S3UploadBackend, \
|
||||
ZulipUploadBackend, MEDIUM_AVATAR_SIZE, resize_avatar, \
|
||||
resize_emoji, BadImageError, get_realm_for_filename, \
|
||||
DEFAULT_AVATAR_SIZE, DEFAULT_EMOJI_SIZE, exif_rotate, \
|
||||
upload_export_tarball
|
||||
upload_export_tarball, delete_export_tarball
|
||||
import zerver.lib.upload
|
||||
from zerver.models import Attachment, get_user, \
|
||||
Message, UserProfile, Realm, \
|
||||
@@ -1448,7 +1448,7 @@ class LocalStorageTest(UploadSerializeMixin, ZulipTestCase):
|
||||
expected_url = "/user_avatars/{emoji_path}".format(emoji_path=emoji_path)
|
||||
self.assertEqual(expected_url, url)
|
||||
|
||||
def test_tarball_upload_local(self) -> None:
|
||||
def test_tarball_upload_and_deletion_local(self) -> None:
|
||||
user_profile = self.example_user("iago")
|
||||
self.assertTrue(user_profile.is_realm_admin)
|
||||
|
||||
@@ -1471,6 +1471,11 @@ class LocalStorageTest(UploadSerializeMixin, ZulipTestCase):
|
||||
)
|
||||
self.assertEqual(expected_url, uri)
|
||||
|
||||
# Delete the tarball.
|
||||
self.assertIsNone(delete_export_tarball('not_a_file'))
|
||||
path_id = urllib.parse.urlparse(uri).path
|
||||
self.assertEqual(delete_export_tarball(path_id), path_id)
|
||||
|
||||
def tearDown(self) -> None:
|
||||
destroy_uploads()
|
||||
|
||||
@@ -1742,7 +1747,7 @@ class S3Test(ZulipTestCase):
|
||||
self.assertEqual(expected_url, url)
|
||||
|
||||
@use_s3_backend
|
||||
def test_tarball_upload(self) -> None:
|
||||
def test_tarball_upload_and_deletion(self) -> None:
|
||||
bucket = create_s3_buckets(settings.S3_AVATAR_BUCKET)[0]
|
||||
|
||||
user_profile = self.example_user("iago")
|
||||
@@ -1764,6 +1769,10 @@ class S3Test(ZulipTestCase):
|
||||
path=os.path.basename(tarball_path))
|
||||
self.assertEqual(uri, expected_url)
|
||||
|
||||
# Delete the tarball.
|
||||
self.assertIsNone(delete_export_tarball('not_a_file'))
|
||||
path_id = urllib.parse.urlparse(uri).path
|
||||
self.assertEqual(delete_export_tarball(path_id), path_id)
|
||||
|
||||
class UploadTitleTests(TestCase):
|
||||
def test_upload_titles(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user