Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 918c74b

Browse files
Add a MXCUri class to make working with mxc uri's easier. (#13162)
1 parent 957e3d7 commit 918c74b

File tree

6 files changed

+53
-74
lines changed

6 files changed

+53
-74
lines changed

changelog.d/13162.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Bump the minimum dependency of `matrix_common` to 1.3.0 to make use of the `MXCUri` class. Use `MXCUri` to simplify media retention test code.

poetry.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ typing-extensions = ">=3.10.0.1"
164164
cryptography = ">=3.4.7"
165165
# ijson 3.1.4 fixes a bug with "." in property names
166166
ijson = ">=3.1.4"
167-
matrix-common = "^1.2.1"
167+
matrix-common = "^1.3.0"
168168
# We need packaging.requirements.Requirement, added in 16.1.
169169
packaging = ">=16.1"
170170
# At the time of writing, we only use functions from the version `importlib.metadata`

synapse/rest/media/v1/media_repository.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from io import BytesIO
2020
from typing import IO, TYPE_CHECKING, Dict, List, Optional, Set, Tuple
2121

22+
from matrix_common.types.mxc_uri import MXCUri
23+
2224
import twisted.internet.error
2325
import twisted.web.http
2426
from twisted.internet.defer import Deferred
@@ -186,7 +188,7 @@ async def create_content(
186188
content: IO,
187189
content_length: int,
188190
auth_user: UserID,
189-
) -> str:
191+
) -> MXCUri:
190192
"""Store uploaded content for a local user and return the mxc URL
191193
192194
Args:
@@ -219,7 +221,7 @@ async def create_content(
219221

220222
await self._generate_thumbnails(None, media_id, media_id, media_type)
221223

222-
return "mxc://%s/%s" % (self.server_name, media_id)
224+
return MXCUri(self.server_name, media_id)
223225

224226
async def get_local_media(
225227
self, request: SynapseRequest, media_id: str, name: Optional[str]

synapse/rest/media/v1/upload_resource.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ async def _async_render_POST(self, request: SynapseRequest) -> None:
101101
# the default 404, as that would just be confusing.
102102
raise SynapseError(400, "Bad content")
103103

104-
logger.info("Uploaded content with URI %r", content_uri)
104+
logger.info("Uploaded content with URI '%s'", content_uri)
105105

106-
respond_with_json(request, 200, {"content_uri": content_uri}, send_cors=True)
106+
respond_with_json(
107+
request, 200, {"content_uri": str(content_uri)}, send_cors=True
108+
)

tests/rest/media/test_media_retention.py

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
# limitations under the License.
1414

1515
import io
16-
from typing import Iterable, Optional, Tuple
16+
from typing import Iterable, Optional
17+
18+
from matrix_common.types.mxc_uri import MXCUri
1719

1820
from twisted.test.proto_helpers import MemoryReactor
1921

@@ -63,9 +65,9 @@ def _create_media_and_set_attributes(
6365
last_accessed_ms: Optional[int],
6466
is_quarantined: Optional[bool] = False,
6567
is_protected: Optional[bool] = False,
66-
) -> str:
68+
) -> MXCUri:
6769
# "Upload" some media to the local media store
68-
mxc_uri = self.get_success(
70+
mxc_uri: MXCUri = self.get_success(
6971
media_repository.create_content(
7072
media_type="text/plain",
7173
upload_name=None,
@@ -75,13 +77,11 @@ def _create_media_and_set_attributes(
7577
)
7678
)
7779

78-
media_id = mxc_uri.split("/")[-1]
79-
8080
# Set the last recently accessed time for this media
8181
if last_accessed_ms is not None:
8282
self.get_success(
8383
self.store.update_cached_last_access_time(
84-
local_media=(media_id,),
84+
local_media=(mxc_uri.media_id,),
8585
remote_media=(),
8686
time_ms=last_accessed_ms,
8787
)
@@ -92,7 +92,7 @@ def _create_media_and_set_attributes(
9292
self.get_success(
9393
self.store.quarantine_media_by_id(
9494
server_name=self.hs.config.server.server_name,
95-
media_id=media_id,
95+
media_id=mxc_uri.media_id,
9696
quarantined_by="@theadmin:test",
9797
)
9898
)
@@ -101,18 +101,18 @@ def _create_media_and_set_attributes(
101101
# Mark this media as protected from quarantine
102102
self.get_success(
103103
self.store.mark_local_media_as_safe(
104-
media_id=media_id,
104+
media_id=mxc_uri.media_id,
105105
safe=True,
106106
)
107107
)
108108

109-
return media_id
109+
return mxc_uri
110110

111111
def _cache_remote_media_and_set_attributes(
112112
media_id: str,
113113
last_accessed_ms: Optional[int],
114114
is_quarantined: Optional[bool] = False,
115-
) -> str:
115+
) -> MXCUri:
116116
# Pretend to cache some remote media
117117
self.get_success(
118118
self.store.store_cached_remote_media(
@@ -146,7 +146,7 @@ def _cache_remote_media_and_set_attributes(
146146
)
147147
)
148148

149-
return media_id
149+
return MXCUri(self.remote_server_name, media_id)
150150

151151
# Start with the local media store
152152
self.local_recently_accessed_media = _create_media_and_set_attributes(
@@ -214,28 +214,16 @@ def test_local_media_retention(self) -> None:
214214
# Remote media should be unaffected.
215215
self._assert_if_mxc_uris_purged(
216216
purged=[
217-
(
218-
self.hs.config.server.server_name,
219-
self.local_not_recently_accessed_media,
220-
),
221-
(self.hs.config.server.server_name, self.local_never_accessed_media),
217+
self.local_not_recently_accessed_media,
218+
self.local_never_accessed_media,
222219
],
223220
not_purged=[
224-
(self.hs.config.server.server_name, self.local_recently_accessed_media),
225-
(
226-
self.hs.config.server.server_name,
227-
self.local_not_recently_accessed_quarantined_media,
228-
),
229-
(
230-
self.hs.config.server.server_name,
231-
self.local_not_recently_accessed_protected_media,
232-
),
233-
(self.remote_server_name, self.remote_recently_accessed_media),
234-
(self.remote_server_name, self.remote_not_recently_accessed_media),
235-
(
236-
self.remote_server_name,
237-
self.remote_not_recently_accessed_quarantined_media,
238-
),
221+
self.local_recently_accessed_media,
222+
self.local_not_recently_accessed_quarantined_media,
223+
self.local_not_recently_accessed_protected_media,
224+
self.remote_recently_accessed_media,
225+
self.remote_not_recently_accessed_media,
226+
self.remote_not_recently_accessed_quarantined_media,
239227
],
240228
)
241229

@@ -261,49 +249,35 @@ def test_remote_media_cache_retention(self) -> None:
261249
# Remote media accessed <30 days ago should still exist.
262250
self._assert_if_mxc_uris_purged(
263251
purged=[
264-
(self.remote_server_name, self.remote_not_recently_accessed_media),
252+
self.remote_not_recently_accessed_media,
265253
],
266254
not_purged=[
267-
(self.remote_server_name, self.remote_recently_accessed_media),
268-
(self.hs.config.server.server_name, self.local_recently_accessed_media),
269-
(
270-
self.hs.config.server.server_name,
271-
self.local_not_recently_accessed_media,
272-
),
273-
(
274-
self.hs.config.server.server_name,
275-
self.local_not_recently_accessed_quarantined_media,
276-
),
277-
(
278-
self.hs.config.server.server_name,
279-
self.local_not_recently_accessed_protected_media,
280-
),
281-
(
282-
self.remote_server_name,
283-
self.remote_not_recently_accessed_quarantined_media,
284-
),
285-
(self.hs.config.server.server_name, self.local_never_accessed_media),
255+
self.remote_recently_accessed_media,
256+
self.local_recently_accessed_media,
257+
self.local_not_recently_accessed_media,
258+
self.local_not_recently_accessed_quarantined_media,
259+
self.local_not_recently_accessed_protected_media,
260+
self.remote_not_recently_accessed_quarantined_media,
261+
self.local_never_accessed_media,
286262
],
287263
)
288264

289265
def _assert_if_mxc_uris_purged(
290-
self, purged: Iterable[Tuple[str, str]], not_purged: Iterable[Tuple[str, str]]
266+
self, purged: Iterable[MXCUri], not_purged: Iterable[MXCUri]
291267
) -> None:
292-
def _assert_mxc_uri_purge_state(
293-
server_name: str, media_id: str, expect_purged: bool
294-
) -> None:
268+
def _assert_mxc_uri_purge_state(mxc_uri: MXCUri, expect_purged: bool) -> None:
295269
"""Given an MXC URI, assert whether it has been purged or not."""
296-
if server_name == self.hs.config.server.server_name:
270+
if mxc_uri.server_name == self.hs.config.server.server_name:
297271
found_media_dict = self.get_success(
298-
self.store.get_local_media(media_id)
272+
self.store.get_local_media(mxc_uri.media_id)
299273
)
300274
else:
301275
found_media_dict = self.get_success(
302-
self.store.get_cached_remote_media(server_name, media_id)
276+
self.store.get_cached_remote_media(
277+
mxc_uri.server_name, mxc_uri.media_id
278+
)
303279
)
304280

305-
mxc_uri = f"mxc://{server_name}/{media_id}"
306-
307281
if expect_purged:
308282
self.assertIsNone(
309283
found_media_dict, msg=f"{mxc_uri} unexpectedly not purged"
@@ -315,7 +289,7 @@ def _assert_mxc_uri_purge_state(
315289
)
316290

317291
# Assert that the given MXC URIs have either been correctly purged or not.
318-
for server_name, media_id in purged:
319-
_assert_mxc_uri_purge_state(server_name, media_id, expect_purged=True)
320-
for server_name, media_id in not_purged:
321-
_assert_mxc_uri_purge_state(server_name, media_id, expect_purged=False)
292+
for mxc_uri in purged:
293+
_assert_mxc_uri_purge_state(mxc_uri, expect_purged=True)
294+
for mxc_uri in not_purged:
295+
_assert_mxc_uri_purge_state(mxc_uri, expect_purged=False)

0 commit comments

Comments
 (0)