This repository has been archived by the owner on Apr 26, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Server capabilities support #4472
Merged
Merged
Changes from all commits
Commits
Show all changes
17 commits
Select commit
Hold shift + click to select a range
53ef4da
track unstable room v3
neilisfragile a3f0556
towncrier
neilisfragile 95f871f
Support room version capabilities in CS API (MSC1804)
neilisfragile 893107b
backout v3
neilisfragile 327b992
register capabilities servlet
neilisfragile a124025
enforce auth for capabilities endpoint
neilisfragile 4eeb2fb
isort
neilisfragile f03b3a7
support change_password in capabilities end-point
neilisfragile 19259d9
update to reflect broadening scope
neilisfragile e4bef9d
rework format of change password capability
neilisfragile c7837dc
reflect that rooms v3 is a stable room version
neilisfragile 2f46804
Populate default room version from Constants
neilisfragile 9c850d9
formatting and use constants where available
neilisfragile c5a0f82
define room dispositions for use in exposing room capabilities
neilisfragile ee4df7f
Merge branch 'develop' into neilj/room_capabilities
neilisfragile f834d98
isort
neilisfragile b37e8c9
Merge branch 'neilj/room_capabilities' of github.com:matrix-org/synap…
neilisfragile File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Support exposing server capabilities in CS API (MSC1753, MSC1804) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2019 New Vector | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
import logging | ||
|
||
from twisted.internet import defer | ||
|
||
from synapse.api.constants import DEFAULT_ROOM_VERSION, RoomDisposition, RoomVersions | ||
from synapse.http.servlet import RestServlet | ||
|
||
from ._base import client_v2_patterns | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class CapabilitiesRestServlet(RestServlet): | ||
"""End point to expose the capabilities of the server.""" | ||
|
||
PATTERNS = client_v2_patterns("/capabilities$") | ||
|
||
def __init__(self, hs): | ||
""" | ||
Args: | ||
hs (synapse.server.HomeServer): server | ||
""" | ||
super(CapabilitiesRestServlet, self).__init__() | ||
self.hs = hs | ||
self.auth = hs.get_auth() | ||
self.store = hs.get_datastore() | ||
|
||
@defer.inlineCallbacks | ||
def on_GET(self, request): | ||
requester = yield self.auth.get_user_by_req(request, allow_guest=True) | ||
user = yield self.store.get_user_by_id(requester.user.to_string()) | ||
change_password = bool(user["password_hash"]) | ||
|
||
response = { | ||
"capabilities": { | ||
"m.room_versions": { | ||
"default": DEFAULT_ROOM_VERSION, | ||
"available": { | ||
RoomVersions.V1: RoomDisposition.STABLE, | ||
RoomVersions.V2: RoomDisposition.STABLE, | ||
RoomVersions.STATE_V2_TEST: RoomDisposition.UNSTABLE, | ||
RoomVersions.V3: RoomDisposition.STABLE, | ||
}, | ||
}, | ||
"m.change_password": {"enabled": change_password}, | ||
} | ||
} | ||
defer.returnValue((200, response)) | ||
|
||
|
||
def register_servlets(hs, http_server): | ||
CapabilitiesRestServlet(hs).register(http_server) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2019 New Vector Ltd | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
from synapse.api.constants import DEFAULT_ROOM_VERSION, KNOWN_ROOM_VERSIONS | ||
from synapse.rest.client.v1 import admin, login | ||
from synapse.rest.client.v2_alpha import capabilities | ||
|
||
from tests import unittest | ||
|
||
|
||
class CapabilitiesTestCase(unittest.HomeserverTestCase): | ||
|
||
servlets = [ | ||
admin.register_servlets, | ||
capabilities.register_servlets, | ||
login.register_servlets, | ||
] | ||
|
||
def make_homeserver(self, reactor, clock): | ||
self.url = b"/_matrix/client/r0/capabilities" | ||
hs = self.setup_test_homeserver() | ||
self.store = hs.get_datastore() | ||
return hs | ||
|
||
def test_check_auth_required(self): | ||
request, channel = self.make_request("GET", self.url) | ||
self.render(request) | ||
|
||
self.assertEqual(channel.code, 401) | ||
|
||
def test_get_room_version_capabilities(self): | ||
self.register_user("user", "pass") | ||
access_token = self.login("user", "pass") | ||
|
||
request, channel = self.make_request("GET", self.url, access_token=access_token) | ||
self.render(request) | ||
capabilities = channel.json_body['capabilities'] | ||
|
||
self.assertEqual(channel.code, 200) | ||
for room_version in capabilities['m.room_versions']['available'].keys(): | ||
self.assertTrue(room_version in KNOWN_ROOM_VERSIONS, "" + room_version) | ||
self.assertEqual( | ||
DEFAULT_ROOM_VERSION, capabilities['m.room_versions']['default'] | ||
) | ||
|
||
def test_get_change_password_capabilities(self): | ||
localpart = "user" | ||
password = "pass" | ||
user = self.register_user(localpart, password) | ||
access_token = self.login(user, password) | ||
|
||
request, channel = self.make_request("GET", self.url, access_token=access_token) | ||
self.render(request) | ||
capabilities = channel.json_body['capabilities'] | ||
|
||
self.assertEqual(channel.code, 200) | ||
|
||
# Test case where password is handled outside of Synapse | ||
self.assertTrue(capabilities['m.change_password']['enabled']) | ||
self.get_success(self.store.user_set_password_hash(user, None)) | ||
request, channel = self.make_request("GET", self.url, access_token=access_token) | ||
self.render(request) | ||
capabilities = channel.json_body['capabilities'] | ||
|
||
self.assertEqual(channel.code, 200) | ||
self.assertFalse(capabilities['m.change_password']['enabled']) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can't add V3 here yet, because doing so will allow us to accept joins/creates for V3 rooms, but won't actually implement the things that make V3 V3.