Add tests for 3PID invites

This commit is contained in:
Brendan Abolivier 2019-06-18 17:59:07 +01:00
parent 7157276124
commit 9b3c69f661
No known key found for this signature in database
GPG Key ID: 1E015C145F1916CD

View File

@ -15,6 +15,8 @@
import json import json
import random
import string
from mock import Mock from mock import Mock
@ -32,7 +34,7 @@ from synapse.third_party_rules.access_rules import (
from tests import unittest from tests import unittest
class RoomAccessEventTestCase(unittest.HomeserverTestCase): class RoomAccessTestCase(unittest.HomeserverTestCase):
servlets = [ servlets = [
admin.register_servlets, admin.register_servlets,
@ -52,18 +54,51 @@ class RoomAccessEventTestCase(unittest.HomeserverTestCase):
"id_server": "testis", "id_server": "testis",
} }
} }
config["trusted_third_party_id_servers"] = [
"testis",
]
def send_invite(destination, room_id, event_id, pdu): def send_invite(destination, room_id, event_id, pdu):
return defer.succeed(pdu) return defer.succeed(pdu)
federation_client = Mock(spec=[ def get_json(uri, args={}, headers=None):
address_domain = args["address"].split("@")[1]
return defer.succeed({"hs": address_domain})
def post_urlencoded_get_json(uri, args={}, headers=None):
token = ''.join(random.choice(string.ascii_letters) for _ in range(10))
return defer.succeed({
"token": token,
"public_keys": [
{
"public_key": "serverpublickey",
"key_validity_url": "https://testis/pubkey/isvalid",
},
{
"public_key": "phemeralpublickey",
"key_validity_url": "https://testis/pubkey/ephemeral/isvalid",
},
],
"display_name": "f...@b...",
})
mock_federation_client = Mock(spec=[
"send_invite", "send_invite",
]) ])
federation_client.send_invite.side_effect = send_invite mock_federation_client.send_invite.side_effect = send_invite
mock_http_client = Mock(spec=[
"get_json",
"post_urlencoded_get_json"
])
# Mocking the response for /info on the IS API.
mock_http_client.get_json.side_effect = get_json
# Mocking the response for /store-invite on the IS API.
mock_http_client.post_urlencoded_get_json.side_effect = post_urlencoded_get_json
self.hs = self.setup_test_homeserver( self.hs = self.setup_test_homeserver(
config=config, config=config,
federation_client=federation_client, federation_client=mock_federation_client,
simple_http_client=mock_http_client,
) )
return self.hs return self.hs
@ -74,13 +109,17 @@ class RoomAccessEventTestCase(unittest.HomeserverTestCase):
self.restricted_room = self.create_room() self.restricted_room = self.create_room()
self.unrestricted_room = self.create_room(rule=ACCESS_RULE_UNRESTRICTED) self.unrestricted_room = self.create_room(rule=ACCESS_RULE_UNRESTRICTED)
self.direct_room = self.create_room(direct=True) self.direct_rooms = [
self.create_room(direct=True),
self.create_room(direct=True),
self.create_room(direct=True),
]
self.invitee_id = self.register_user("invitee", "test") self.invitee_id = self.register_user("invitee", "test")
self.invitee_tok = self.login("invitee", "test") self.invitee_tok = self.login("invitee", "test")
self.helper.invite( self.helper.invite(
room=self.direct_room, room=self.direct_rooms[0],
src=self.user_id, src=self.user_id,
targ=self.invitee_id, targ=self.invitee_id,
tok=self.tok, tok=self.tok,
@ -121,6 +160,7 @@ class RoomAccessEventTestCase(unittest.HomeserverTestCase):
"""Tests that in restricted mode we're unable to invite users from blacklisted """Tests that in restricted mode we're unable to invite users from blacklisted
servers but can invite other users. servers but can invite other users.
""" """
# We can't invite a user from a forbidden HS.
self.helper.invite( self.helper.invite(
room=self.restricted_room, room=self.restricted_room,
src=self.user_id, src=self.user_id,
@ -129,54 +169,117 @@ class RoomAccessEventTestCase(unittest.HomeserverTestCase):
expect_code=403, expect_code=403,
) )
# We can invite a user which HS isn't forbidden.
self.helper.invite( self.helper.invite(
room=self.restricted_room, room=self.restricted_room,
src=self.user_id, src=self.user_id,
targ="@test:not_forbidden_domain", targ="@test:allowed_domain",
tok=self.tok, tok=self.tok,
expect_code=200, expect_code=200,
) )
# We can't send a 3PID invite to an address that is mapped to a forbidden HS.
self.send_threepid_invite(
address="test@forbidden_domain",
room_id=self.restricted_room,
expected_code=403,
)
# We can send a 3PID invite to an address that is mapped to an HS that's not
# forbidden.
self.send_threepid_invite(
address="test@allowed_domain",
room_id=self.restricted_room,
expected_code=200,
)
def test_direct(self): def test_direct(self):
"""Tests that, in direct mode, other users than the initial two can't be invited, """Tests that, in direct mode, other users than the initial two can't be invited,
but the following scenario works: but the following scenario works:
* invited user joins the room * invited user joins the room
* invited user leaves the room * invited user leaves the room
* room creator re-invites invited user * room creator re-invites invited user
Also tests that a user from a HS that's in the list of forbidden domains (to use
in restricted mode) can be invited.
""" """
not_invited_user = "@not_invited:forbidden_domain"
# We can't invite a new user to the room.
self.helper.invite( self.helper.invite(
room=self.direct_room, room=self.direct_rooms[0],
src=self.user_id, src=self.user_id,
targ="@not_invited:test", targ=not_invited_user,
tok=self.tok, tok=self.tok,
expect_code=403, expect_code=403,
) )
# The invited user can join the room.
self.helper.join( self.helper.join(
room=self.direct_room, room=self.direct_rooms[0],
user=self.invitee_id, user=self.invitee_id,
tok=self.invitee_tok, tok=self.invitee_tok,
expect_code=200, expect_code=200,
) )
# The invited user can leave the room.
self.helper.leave( self.helper.leave(
room=self.direct_room, room=self.direct_rooms[0],
user=self.invitee_id, user=self.invitee_id,
tok=self.invitee_tok, tok=self.invitee_tok,
expect_code=200, expect_code=200,
) )
# The invited user can be re-invited to the room.
self.helper.invite( self.helper.invite(
room=self.direct_room, room=self.direct_rooms[0],
src=self.user_id, src=self.user_id,
targ=self.invitee_id, targ=self.invitee_id,
tok=self.tok, tok=self.tok,
expect_code=200, expect_code=200,
) )
# If we're alone in the room and have always been the only member, we can invite
# someone.
self.helper.invite(
room=self.direct_rooms[1],
src=self.user_id,
targ=not_invited_user,
tok=self.tok,
expect_code=200,
)
# We can't send a 3PID invite to a room that already has two members.
self.send_threepid_invite(
address="test@allowed_domain",
room_id=self.direct_rooms[0],
expected_code=403,
)
# We can't send a 3PID invite to a room that already has a pending invite.
self.send_threepid_invite(
address="test@allowed_domain",
room_id=self.direct_rooms[1],
expected_code=403,
)
# We can send a 3PID invite to a room in which we've always been the only member.
self.send_threepid_invite(
address="test@forbidden_domain",
room_id=self.direct_rooms[2],
expected_code=200,
)
# We can send a 3PID invite to a room in which there's a 3PID invite.
self.send_threepid_invite(
address="test@forbidden_domain",
room_id=self.direct_rooms[2],
expected_code=403,
)
def test_unrestricted(self): def test_unrestricted(self):
"""Tests that, in unrestricted mode, we can invite whoever we want. """Tests that, in unrestricted mode, we can invite whoever we want.
""" """
# We can invite
self.helper.invite( self.helper.invite(
room=self.unrestricted_room, room=self.unrestricted_room,
src=self.user_id, src=self.user_id,
@ -193,6 +296,21 @@ class RoomAccessEventTestCase(unittest.HomeserverTestCase):
expect_code=200, expect_code=200,
) )
# We can send a 3PID invite to an address that is mapped to a forbidden HS.
self.send_threepid_invite(
address="test@forbidden_domain",
room_id=self.unrestricted_room,
expected_code=200,
)
# We can send a 3PID invite to an address that is mapped to an HS that's not
# forbidden.
self.send_threepid_invite(
address="test@allowed_domain",
room_id=self.unrestricted_room,
expected_code=200,
)
def create_room(self, direct=False, rule=None, expected_code=200): def create_room(self, direct=False, rule=None, expected_code=200):
content = { content = {
"is_direct": direct, "is_direct": direct,
@ -230,3 +348,19 @@ class RoomAccessEventTestCase(unittest.HomeserverTestCase):
self.assertEqual(channel.code, 200, channel.result) self.assertEqual(channel.code, 200, channel.result)
return channel.json_body["rule"] return channel.json_body["rule"]
def send_threepid_invite(self, address, room_id, expected_code=200):
params = {
"id_server": "testis",
"medium": "email",
"address": address,
}
request, channel = self.make_request(
"POST",
"/_matrix/client/r0/rooms/%s/invite" % room_id,
json.dumps(params),
access_token=self.tok,
)
self.render(request)
self.assertEqual(channel.code, expected_code, channel.result)