diff --git a/synapse/rest/admin/media.py b/synapse/rest/admin/media.py
index 24dd46113a..2c71af4279 100644
--- a/synapse/rest/admin/media.py
+++ b/synapse/rest/admin/media.py
@@ -137,8 +137,31 @@ class ProtectMediaByID(RestServlet):
logging.info("Protecting local media by ID: %s", media_id)
- # Quarantine this media id
- await self.store.mark_local_media_as_safe(media_id)
+ # Protect this media id
+ await self.store.mark_local_media_as_safe(media_id, safe=True)
+
+ return 200, {}
+
+
+class UnprotectMediaByID(RestServlet):
+ """Unprotect local media from being quarantined."""
+
+ PATTERNS = admin_patterns("/media/unprotect/(?P<media_id>[^/]+)")
+
+ def __init__(self, hs: "HomeServer"):
+ self.store = hs.get_datastore()
+ self.auth = hs.get_auth()
+
+ async def on_POST(
+ self, request: SynapseRequest, media_id: str
+ ) -> Tuple[int, JsonDict]:
+ requester = await self.auth.get_user_by_req(request)
+ await assert_user_is_admin(self.auth, requester.user)
+
+ logging.info("Unprotecting local media by ID: %s", media_id)
+
+ # Unprotect this media id
+ await self.store.mark_local_media_as_safe(media_id, safe=False)
return 200, {}
@@ -269,6 +292,7 @@ def register_servlets_for_media_repo(hs: "HomeServer", http_server):
QuarantineMediaByID(hs).register(http_server)
QuarantineMediaByUser(hs).register(http_server)
ProtectMediaByID(hs).register(http_server)
+ UnprotectMediaByID(hs).register(http_server)
ListMediaInRoom(hs).register(http_server)
DeleteMediaByID(hs).register(http_server)
DeleteMediaByDateSize(hs).register(http_server)
diff --git a/synapse/storage/databases/main/media_repository.py b/synapse/storage/databases/main/media_repository.py
index c584868188..2fa945d171 100644
--- a/synapse/storage/databases/main/media_repository.py
+++ b/synapse/storage/databases/main/media_repository.py
@@ -143,6 +143,7 @@ class MediaRepositoryStore(MediaRepositoryBackgroundUpdateStore):
"created_ts",
"quarantined_by",
"url_cache",
+ "safe_from_quarantine",
),
allow_none=True,
desc="get_local_media",
@@ -296,12 +297,12 @@ class MediaRepositoryStore(MediaRepositoryBackgroundUpdateStore):
desc="store_local_media",
)
- async def mark_local_media_as_safe(self, media_id: str) -> None:
- """Mark a local media as safe from quarantining."""
+ async def mark_local_media_as_safe(self, media_id: str, safe: bool = True) -> None:
+ """Mark a local media as safe or unsafe from quarantining."""
await self.db_pool.simple_update_one(
table="local_media_repository",
keyvalues={"media_id": media_id},
- updatevalues={"safe_from_quarantine": True},
+ updatevalues={"safe_from_quarantine": safe},
desc="mark_local_media_as_safe",
)
|