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

Add authentication to thirdparty bridge APIs #12746

Merged
merged 11 commits into from
May 24, 2022
Merged
1 change: 1 addition & 0 deletions changelog.d/12746.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Require an `access_token` in `/thirdparty/` requests to appservices, as required by the [Matrix specification](https://spec.matrix.org/v1.1/application-service-api/#third-party-networks).
Half-Shot marked this conversation as resolved.
Show resolved Hide resolved
15 changes: 12 additions & 3 deletions synapse/appservice/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# limitations under the License.
import logging
import urllib.parse
from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Tuple
from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Mapping, Optional, Tuple

from prometheus_client import Counter
from typing_extensions import TypeGuard
Expand Down Expand Up @@ -155,14 +155,21 @@ async def query_3pe(
if service.url is None:
return []

# This is required by the configuration.
assert service.hs_token is not None

uri = "%s%s/thirdparty/%s/%s" % (
service.url,
APP_SERVICE_PREFIX,
kind,
urllib.parse.quote(protocol),
)
try:
response = await self.get_json(uri, fields)
args: Mapping[Any, Any] = {
**fields,
b"access_token": [service.hs_token],
}
response = await self.get_json(uri, args=args)
if not isinstance(response, list):
logger.warning(
"query_3pe to %s returned an invalid response %r", uri, response
Expand Down Expand Up @@ -190,13 +197,15 @@ async def get_3pe_protocol(
return {}

async def _get() -> Optional[JsonDict]:
# This is required by the configuration.
assert service.hs_token is not None
uri = "%s%s/thirdparty/protocol/%s" % (
service.url,
APP_SERVICE_PREFIX,
urllib.parse.quote(protocol),
)
try:
info = await self.get_json(uri)
info = await self.get_json(uri, {"access_token": service.hs_token})

if not _is_valid_3pe_metadata(info):
logger.warning(
Expand Down