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

Commit 9b683ea

Browse files
authored
Add Cross-Origin-Resource-Policy header to thumbnail and download media endpoints (#12944)
1 parent 3c5549e commit 9b683ea

File tree

5 files changed

+44
-2
lines changed

5 files changed

+44
-2
lines changed

changelog.d/12944.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add `Cross-Origin-Resource-Policy: cross-origin` header to content repository's thumbnail and download endpoints.

synapse/http/server.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,17 @@ def set_cors_headers(request: Request) -> None:
928928
)
929929

930930

931+
def set_corp_headers(request: Request) -> None:
932+
"""Set the CORP headers so that javascript running in a web browsers can
933+
embed the resource returned from this request when their client requires
934+
the `Cross-Origin-Embedder-Policy: require-corp` header.
935+
936+
Args:
937+
request: The http request to add the CORP header to.
938+
"""
939+
request.setHeader(b"Cross-Origin-Resource-Policy", b"cross-origin")
940+
941+
931942
def respond_with_html(request: Request, code: int, html: str) -> None:
932943
"""
933944
Wraps `respond_with_html_bytes` by first encoding HTML from a str to UTF-8 bytes.

synapse/rest/media/v1/download_resource.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
import logging
1616
from typing import TYPE_CHECKING
1717

18-
from synapse.http.server import DirectServeJsonResource, set_cors_headers
18+
from synapse.http.server import (
19+
DirectServeJsonResource,
20+
set_corp_headers,
21+
set_cors_headers,
22+
)
1923
from synapse.http.servlet import parse_boolean
2024
from synapse.http.site import SynapseRequest
2125

@@ -38,6 +42,7 @@ def __init__(self, hs: "HomeServer", media_repo: "MediaRepository"):
3842

3943
async def _async_render_GET(self, request: SynapseRequest) -> None:
4044
set_cors_headers(request)
45+
set_corp_headers(request)
4146
request.setHeader(
4247
b"Content-Security-Policy",
4348
b"sandbox;"

synapse/rest/media/v1/thumbnail_resource.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple
1919

2020
from synapse.api.errors import SynapseError
21-
from synapse.http.server import DirectServeJsonResource, set_cors_headers
21+
from synapse.http.server import (
22+
DirectServeJsonResource,
23+
set_corp_headers,
24+
set_cors_headers,
25+
)
2226
from synapse.http.servlet import parse_integer, parse_string
2327
from synapse.http.site import SynapseRequest
2428
from synapse.rest.media.v1.media_storage import MediaStorage
@@ -58,6 +62,7 @@ def __init__(
5862

5963
async def _async_render_GET(self, request: SynapseRequest) -> None:
6064
set_cors_headers(request)
65+
set_corp_headers(request)
6166
server_name, media_id, _ = parse_media_id(request)
6267
width = parse_integer(request, "width", required=True)
6368
height = parse_integer(request, "height", required=True)

tests/rest/media/v1/test_media_storage.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,12 @@ def _test_thumbnail(
481481

482482
if expected_found:
483483
self.assertEqual(channel.code, 200)
484+
485+
self.assertEqual(
486+
channel.headers.getRawHeaders(b"Cross-Origin-Resource-Policy"),
487+
[b"cross-origin"],
488+
)
489+
484490
if expected_body is not None:
485491
self.assertEqual(
486492
channel.result["body"], expected_body, channel.result["body"]
@@ -549,6 +555,20 @@ def test_x_robots_tag_header(self) -> None:
549555
[b"noindex, nofollow, noarchive, noimageindex"],
550556
)
551557

558+
def test_cross_origin_resource_policy_header(self) -> None:
559+
"""
560+
Test that the Cross-Origin-Resource-Policy header is set to "cross-origin"
561+
allowing web clients to embed media from the downloads API.
562+
"""
563+
channel = self._req(b"inline; filename=out" + self.test_image.extension)
564+
565+
headers = channel.headers
566+
567+
self.assertEqual(
568+
headers.getRawHeaders(b"Cross-Origin-Resource-Policy"),
569+
[b"cross-origin"],
570+
)
571+
552572

553573
class TestSpamChecker:
554574
"""A spam checker module that rejects all media that includes the bytes

0 commit comments

Comments
 (0)