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:
Wyatt Hoodes
2019-06-27 08:41:47 -10:00
committed by Tim Abbott
parent ef02de4834
commit b1900c406a
3 changed files with 38 additions and 3 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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: