2018-10-24 15:24:24 -04:00
|
|
|
#
|
2023-11-21 15:29:58 -05:00
|
|
|
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
|
|
#
|
|
|
|
# Copyright (C) 2023 New Vector, Ltd
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU Affero General Public License as
|
|
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
|
|
# License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# See the GNU Affero General Public License for more details:
|
|
|
|
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
|
|
#
|
|
|
|
# Originally licensed under the Apache License, Version 2.0:
|
|
|
|
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
|
|
#
|
|
|
|
# [This file includes modifications made by New Vector Limited]
|
2018-10-24 15:24:24 -04:00
|
|
|
#
|
|
|
|
#
|
|
|
|
|
2021-04-09 13:44:38 -04:00
|
|
|
from unittest.mock import Mock
|
2018-10-24 15:32:13 -04:00
|
|
|
|
2023-02-07 07:03:39 -05:00
|
|
|
from twisted.internet.interfaces import IReactorTime
|
|
|
|
from twisted.test.proto_helpers import MemoryReactor, MemoryReactorClock
|
2018-10-24 15:32:13 -04:00
|
|
|
|
2021-08-17 07:57:58 -04:00
|
|
|
from synapse.rest.client.register import register_servlets
|
2023-02-07 07:03:39 -05:00
|
|
|
from synapse.server import HomeServer
|
|
|
|
from synapse.types import JsonDict
|
2018-10-24 15:32:13 -04:00
|
|
|
from synapse.util import Clock
|
|
|
|
|
|
|
|
from tests import unittest
|
|
|
|
|
|
|
|
|
2018-10-24 15:24:24 -04:00
|
|
|
class TermsTestCase(unittest.HomeserverTestCase):
|
|
|
|
servlets = [register_servlets]
|
|
|
|
|
2023-02-07 07:03:39 -05:00
|
|
|
def default_config(self) -> JsonDict:
|
2020-03-24 14:33:49 -04:00
|
|
|
config = super().default_config()
|
2019-09-25 06:32:05 -04:00
|
|
|
config.update(
|
|
|
|
{
|
|
|
|
"public_baseurl": "https://example.org/",
|
|
|
|
"user_consent": {
|
|
|
|
"version": "1.0",
|
|
|
|
"policy_name": "My Cool Privacy Policy",
|
|
|
|
"template_dir": "/",
|
|
|
|
"require_at_registration": True,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
)
|
|
|
|
return config
|
|
|
|
|
2023-02-07 07:03:39 -05:00
|
|
|
def prepare(
|
|
|
|
self, reactor: MemoryReactor, clock: Clock, homeserver: HomeServer
|
|
|
|
) -> None:
|
|
|
|
# type-ignore: mypy-zope doesn't seem to recognise that MemoryReactorClock
|
|
|
|
# implements IReactorTime, via inheritance from twisted.internet.testing.Clock
|
|
|
|
self.clock: IReactorTime = MemoryReactorClock() # type: ignore[assignment]
|
2018-10-24 15:24:24 -04:00
|
|
|
self.hs_clock = Clock(self.clock)
|
|
|
|
self.url = "/_matrix/client/r0/register"
|
|
|
|
self.registration_handler = Mock()
|
|
|
|
self.auth_handler = Mock()
|
|
|
|
self.device_handler = Mock()
|
|
|
|
|
2023-02-07 07:03:39 -05:00
|
|
|
def test_ui_auth(self) -> None:
|
2018-10-24 15:24:24 -04:00
|
|
|
# Do a UI auth request
|
2023-02-07 07:03:39 -05:00
|
|
|
request_data: JsonDict = {"username": "kermit", "password": "monkey"}
|
2020-12-15 09:44:04 -05:00
|
|
|
channel = self.make_request(b"POST", self.url, request_data)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
2022-08-05 10:59:09 -04:00
|
|
|
self.assertEqual(channel.code, 401, channel.result)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
self.assertTrue(channel.json_body is not None)
|
2020-06-16 08:51:47 -04:00
|
|
|
self.assertIsInstance(channel.json_body["session"], str)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
self.assertIsInstance(channel.json_body["flows"], list)
|
|
|
|
for flow in channel.json_body["flows"]:
|
|
|
|
self.assertIsInstance(flow["stages"], list)
|
|
|
|
self.assertTrue(len(flow["stages"]) > 0)
|
2019-05-13 11:10:26 -04:00
|
|
|
self.assertTrue("m.login.terms" in flow["stages"])
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
expected_params = {
|
|
|
|
"m.login.terms": {
|
|
|
|
"policies": {
|
|
|
|
"privacy_policy": {
|
|
|
|
"en": {
|
2018-11-06 05:32:34 -05:00
|
|
|
"name": "My Cool Privacy Policy",
|
2018-10-31 15:28:08 -04:00
|
|
|
"url": "https://example.org/_matrix/consent?v=1.0",
|
2018-10-24 15:24:24 -04:00
|
|
|
},
|
2019-05-10 01:12:11 -04:00
|
|
|
"version": "1.0",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-10-24 15:24:24 -04:00
|
|
|
}
|
|
|
|
self.assertIsInstance(channel.json_body["params"], dict)
|
2023-08-25 15:05:10 -04:00
|
|
|
self.assertLessEqual(
|
|
|
|
channel.json_body["params"].items(), expected_params.items()
|
|
|
|
)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
# We have to complete the dummy auth stage before completing the terms stage
|
2022-07-17 17:28:45 -04:00
|
|
|
request_data = {
|
|
|
|
"username": "kermit",
|
|
|
|
"password": "monkey",
|
|
|
|
"auth": {
|
|
|
|
"session": channel.json_body["session"],
|
|
|
|
"type": "m.login.dummy",
|
|
|
|
},
|
|
|
|
}
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
self.registration_handler.check_username = Mock(return_value=True)
|
|
|
|
|
2020-12-15 09:44:04 -05:00
|
|
|
channel = self.make_request(b"POST", self.url, request_data)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
# We don't bother checking that the response is correct - we'll leave that to
|
|
|
|
# other tests. We just want to make sure we're on the right path.
|
2022-08-05 10:59:09 -04:00
|
|
|
self.assertEqual(channel.code, 401, channel.result)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
# Finish the UI auth for terms
|
2022-07-17 17:28:45 -04:00
|
|
|
request_data = {
|
|
|
|
"username": "kermit",
|
|
|
|
"password": "monkey",
|
|
|
|
"auth": {
|
|
|
|
"session": channel.json_body["session"],
|
|
|
|
"type": "m.login.terms",
|
|
|
|
},
|
|
|
|
}
|
2020-12-15 09:44:04 -05:00
|
|
|
channel = self.make_request(b"POST", self.url, request_data)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
2018-10-24 15:54:38 -04:00
|
|
|
# We're interested in getting a response that looks like a successful
|
|
|
|
# registration, not so much that the details are exactly what we want.
|
2018-10-24 15:24:24 -04:00
|
|
|
|
2022-08-05 10:59:09 -04:00
|
|
|
self.assertEqual(channel.code, 200, channel.result)
|
2018-10-24 15:24:24 -04:00
|
|
|
|
|
|
|
self.assertTrue(channel.json_body is not None)
|
2020-06-16 08:51:47 -04:00
|
|
|
self.assertIsInstance(channel.json_body["user_id"], str)
|
|
|
|
self.assertIsInstance(channel.json_body["access_token"], str)
|
|
|
|
self.assertIsInstance(channel.json_body["device_id"], str)
|