mirror of
https://github.com/element-hq/synapse
synced 2024-07-06 23:43:34 +00:00
add _matrix/client/v1/media/download endpoint
This commit is contained in:
parent
402f67dc67
commit
f6db4490e3
|
@ -145,6 +145,10 @@ class ClientRestResource(JsonResource):
|
||||||
password_policy.register_servlets(hs, client_resource)
|
password_policy.register_servlets(hs, client_resource)
|
||||||
knock.register_servlets(hs, client_resource)
|
knock.register_servlets(hs, client_resource)
|
||||||
appservice_ping.register_servlets(hs, client_resource)
|
appservice_ping.register_servlets(hs, client_resource)
|
||||||
|
if hs.config.server.enable_media_repo:
|
||||||
|
from synapse.rest.client import media
|
||||||
|
|
||||||
|
media.register_servlets(hs, client_resource)
|
||||||
|
|
||||||
# moving to /_synapse/admin
|
# moving to /_synapse/admin
|
||||||
if is_main_process:
|
if is_main_process:
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from synapse.http.server import (
|
from synapse.http.server import (
|
||||||
HttpServer,
|
HttpServer,
|
||||||
|
@ -194,14 +195,76 @@ class UnstableThumbnailResource(RestServlet):
|
||||||
self.media_repo.mark_recently_accessed(server_name, media_id)
|
self.media_repo.mark_recently_accessed(server_name, media_id)
|
||||||
|
|
||||||
|
|
||||||
|
class DownloadResource(RestServlet):
|
||||||
|
PATTERNS = [
|
||||||
|
re.compile(
|
||||||
|
"/_matrix/client/v1/media/download/(?P<server_name>[^/]*)/(?P<media_id>[^/]*)(/(?P<file_name>[^/]*))?$"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, hs: "HomeServer", media_repo: "MediaRepository"):
|
||||||
|
super().__init__()
|
||||||
|
self.media_repo = media_repo
|
||||||
|
self._is_mine_server_name = hs.is_mine_server_name
|
||||||
|
self.auth = hs.get_auth()
|
||||||
|
|
||||||
|
async def on_GET(
|
||||||
|
self,
|
||||||
|
request: SynapseRequest,
|
||||||
|
server_name: str,
|
||||||
|
media_id: str,
|
||||||
|
file_name: Optional[str] = None,
|
||||||
|
) -> None:
|
||||||
|
# Validate the server name, raising if invalid
|
||||||
|
parse_and_validate_server_name(server_name)
|
||||||
|
|
||||||
|
await self.auth.get_user_by_req(request)
|
||||||
|
|
||||||
|
set_cors_headers(request)
|
||||||
|
set_corp_headers(request)
|
||||||
|
request.setHeader(
|
||||||
|
b"Content-Security-Policy",
|
||||||
|
b"sandbox;"
|
||||||
|
b" default-src 'none';"
|
||||||
|
b" script-src 'none';"
|
||||||
|
b" plugin-types application/pdf;"
|
||||||
|
b" style-src 'unsafe-inline';"
|
||||||
|
b" media-src 'self';"
|
||||||
|
b" object-src 'self';",
|
||||||
|
)
|
||||||
|
# Limited non-standard form of CSP for IE11
|
||||||
|
request.setHeader(b"X-Content-Security-Policy", b"sandbox;")
|
||||||
|
request.setHeader(b"Referrer-Policy", b"no-referrer")
|
||||||
|
max_timeout_ms = parse_integer(
|
||||||
|
request, "timeout_ms", default=DEFAULT_MAX_TIMEOUT_MS
|
||||||
|
)
|
||||||
|
max_timeout_ms = min(max_timeout_ms, MAXIMUM_ALLOWED_MAX_TIMEOUT_MS)
|
||||||
|
|
||||||
|
if self._is_mine_server_name(server_name):
|
||||||
|
await self.media_repo.get_local_media(
|
||||||
|
request, media_id, file_name, max_timeout_ms
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
ip_address = request.getClientAddress().host
|
||||||
|
await self.media_repo.get_remote_media(
|
||||||
|
request,
|
||||||
|
server_name,
|
||||||
|
media_id,
|
||||||
|
file_name,
|
||||||
|
max_timeout_ms,
|
||||||
|
ip_address,
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
|
def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
|
||||||
if hs.config.experimental.msc3916_authenticated_media_enabled:
|
|
||||||
media_repo = hs.get_media_repository()
|
media_repo = hs.get_media_repository()
|
||||||
if hs.config.media.url_preview_enabled:
|
if hs.config.media.url_preview_enabled:
|
||||||
UnstablePreviewURLServlet(
|
UnstablePreviewURLServlet(hs, media_repo, media_repo.media_storage).register(
|
||||||
hs, media_repo, media_repo.media_storage
|
http_server
|
||||||
).register(http_server)
|
)
|
||||||
UnstableMediaConfigResource(hs).register(http_server)
|
UnstableMediaConfigResource(hs).register(http_server)
|
||||||
UnstableThumbnailResource(hs, media_repo, media_repo.media_storage).register(
|
UnstableThumbnailResource(hs, media_repo, media_repo.media_storage).register(
|
||||||
http_server
|
http_server
|
||||||
)
|
)
|
||||||
|
DownloadResource(hs, media_repo).register(http_server)
|
||||||
|
|
Loading…
Reference in a new issue