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

Commit d246c99

Browse files
committed
Merge pull request #5638 from matrix-org/babolivier/invite-json
2 parents 69cdd59 + 65434da commit d246c99

3 files changed

Lines changed: 30 additions & 8 deletions

File tree

changelog.d/5638.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix requests to the `/store_invite` endpoint of identity servers being sent in the wrong format.

synapse/handlers/room_member.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,14 @@
2525
import synapse.server
2626
import synapse.types
2727
from synapse.api.constants import EventTypes, Membership
28-
from synapse.api.errors import AuthError, Codes, ProxiedRequestError, SynapseError
2928
from synapse.api.ratelimiting import Ratelimiter
29+
from synapse.api.errors import (
30+
AuthError,
31+
Codes,
32+
ProxiedRequestError,
33+
HttpResponseException,
34+
SynapseError,
35+
)
3036
from synapse.types import RoomID, UserID
3137
from synapse.util.async_helpers import Linearizer
3238
from synapse.util.distributor import user_joined_room, user_left_room
@@ -932,9 +938,23 @@ def _ask_id_server_for_third_party_invite(
932938
"sender_avatar_url": inviter_avatar_url,
933939
}
934940

935-
data = yield self.simple_http_client.post_urlencoded_get_json(
936-
is_url, invite_config
937-
)
941+
try:
942+
data = yield self.simple_http_client.post_json_get_json(
943+
is_url, invite_config
944+
)
945+
except HttpResponseException as e:
946+
# Some identity servers may only support application/x-www-form-urlencoded
947+
# types. This is especially true with old instances of Sydent, see
948+
# https://github.com/matrix-org/sydent/pull/170
949+
logger.info(
950+
"Failed to POST %s with JSON, falling back to urlencoded form: %s",
951+
is_url,
952+
e,
953+
)
954+
data = yield self.simple_http_client.post_urlencoded_get_json(
955+
is_url, invite_config
956+
)
957+
938958
# TODO: Check for success
939959
token = data["token"]
940960
public_keys = data.get("public_keys", [])

tests/rest/client/test_room_access_rules.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from mock import Mock
2222

2323
from twisted.internet import defer
24-
2524
from synapse.api.constants import EventTypes, JoinRules, RoomCreationPreset
2625
from synapse.rest import admin
2726
from synapse.rest.client.v1 import login, room
@@ -62,7 +61,7 @@ def get_json(uri, args={}, headers=None):
6261
address_domain = args["address"].split("@")[1]
6362
return defer.succeed({"hs": address_domain})
6463

65-
def post_urlencoded_get_json(uri, args={}, headers=None):
64+
def post_json_get_json(uri, post_json, args={}, headers=None):
6665
token = "".join(random.choice(string.ascii_letters) for _ in range(10))
6766
return defer.succeed(
6867
{
@@ -84,11 +83,13 @@ def post_urlencoded_get_json(uri, args={}, headers=None):
8483
mock_federation_client = Mock(spec=["send_invite"])
8584
mock_federation_client.send_invite.side_effect = send_invite
8685

87-
mock_http_client = Mock(spec=["get_json", "post_urlencoded_get_json"])
86+
mock_http_client = Mock(
87+
spec=["get_json", "post_json_get_json"],
88+
)
8889
# Mocking the response for /info on the IS API.
8990
mock_http_client.get_json.side_effect = get_json
9091
# Mocking the response for /store-invite on the IS API.
91-
mock_http_client.post_urlencoded_get_json.side_effect = post_urlencoded_get_json
92+
mock_http_client.post_json_get_json.side_effect = post_json_get_json
9293
self.hs = self.setup_test_homeserver(
9394
config=config,
9495
federation_client=mock_federation_client,

0 commit comments

Comments
 (0)