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

Commit 59e2d26

Browse files
authored
Remove the requirement to authenticate for /admin/server_version. (#5122)
This endpoint isn't much use for its intended purpose if you first need to get yourself an admin's auth token. I've restricted it to the `/_synapse/admin` path to make it a bit easier to lock down for those concerned about exposing this information. I don't imagine anyone is using it in anger currently.
1 parent 3fdff14 commit 59e2d26

File tree

5 files changed

+32
-38
lines changed

5 files changed

+32
-38
lines changed

changelog.d/5122.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove the requirement to authenticate for /admin/server_version.

docs/admin_api/version_api.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ The api is::
1010

1111
GET /_synapse/admin/v1/server_version
1212

13-
including an ``access_token`` of a server admin.
14-
1513
It returns a JSON body like the following:
1614

1715
.. code:: json

synapse/rest/admin/__init__.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,16 @@ def on_GET(self, request, user_id):
8888

8989

9090
class VersionServlet(RestServlet):
91-
PATTERNS = historical_admin_path_patterns("/server_version")
91+
PATTERNS = (re.compile("^/_synapse/admin/v1/server_version$"), )
9292

9393
def __init__(self, hs):
94-
self.auth = hs.get_auth()
95-
96-
@defer.inlineCallbacks
97-
def on_GET(self, request):
98-
yield assert_requester_is_admin(self.auth, request)
99-
100-
ret = {
94+
self.res = {
10195
'server_version': get_version_string(synapse),
10296
'python_version': platform.python_version(),
10397
}
10498

105-
defer.returnValue((200, ret))
99+
def on_GET(self, request):
100+
return 200, self.res
106101

107102

108103
class UserRegisterServlet(RestServlet):
@@ -830,6 +825,7 @@ def __init__(self, hs):
830825

831826
register_servlets_for_client_rest_resource(hs, self)
832827
SendServerNoticeServlet(hs).register(self)
828+
VersionServlet(hs).register(self)
833829

834830

835831
def register_servlets_for_client_rest_resource(hs, http_server):
@@ -847,7 +843,6 @@ def register_servlets_for_client_rest_resource(hs, http_server):
847843
QuarantineMediaInRoom(hs).register(http_server)
848844
ListMediaInRoom(hs).register(http_server)
849845
UserRegisterServlet(hs).register(http_server)
850-
VersionServlet(hs).register(http_server)
851846
DeleteGroupAdminRestServlet(hs).register(http_server)
852847
AccountValidityRenewServlet(hs).register(http_server)
853848
# don't add more things here: new servlets should only be exposed on

tests/rest/admin/test_admin.py

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,45 +21,31 @@
2121

2222
import synapse.rest.admin
2323
from synapse.api.constants import UserTypes
24+
from synapse.http.server import JsonResource
25+
from synapse.rest.admin import VersionServlet
2426
from synapse.rest.client.v1 import events, login, room
2527
from synapse.rest.client.v2_alpha import groups
2628

2729
from tests import unittest
2830

2931

3032
class VersionTestCase(unittest.HomeserverTestCase):
33+
url = '/_synapse/admin/v1/server_version'
3134

32-
servlets = [
33-
synapse.rest.admin.register_servlets_for_client_rest_resource,
34-
login.register_servlets,
35-
]
36-
37-
url = '/_matrix/client/r0/admin/server_version'
35+
def create_test_json_resource(self):
36+
resource = JsonResource(self.hs)
37+
VersionServlet(self.hs).register(resource)
38+
return resource
3839

3940
def test_version_string(self):
40-
self.register_user("admin", "pass", admin=True)
41-
self.admin_token = self.login("admin", "pass")
42-
43-
request, channel = self.make_request("GET", self.url,
44-
access_token=self.admin_token)
41+
request, channel = self.make_request("GET", self.url, shorthand=False)
4542
self.render(request)
4643

4744
self.assertEqual(200, int(channel.result["code"]),
4845
msg=channel.result["body"])
4946
self.assertEqual({'server_version', 'python_version'},
5047
set(channel.json_body.keys()))
5148

52-
def test_inaccessible_to_non_admins(self):
53-
self.register_user("unprivileged-user", "pass", admin=False)
54-
user_token = self.login("unprivileged-user", "pass")
55-
56-
request, channel = self.make_request("GET", self.url,
57-
access_token=user_token)
58-
self.render(request)
59-
60-
self.assertEqual(403, int(channel.result['code']),
61-
msg=channel.result['body'])
62-
6349

6450
class UserRegisterTestCase(unittest.HomeserverTestCase):
6551

tests/unittest.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,7 @@ def setUp(self):
181181
raise Exception("A homeserver wasn't returned, but %r" % (self.hs,))
182182

183183
# Register the resources
184-
self.resource = JsonResource(self.hs)
185-
186-
for servlet in self.servlets:
187-
servlet(self.hs, self.resource)
184+
self.resource = self.create_test_json_resource()
188185

189186
from tests.rest.client.v1.utils import RestHelper
190187

@@ -230,6 +227,23 @@ def make_homeserver(self, reactor, clock):
230227
hs = self.setup_test_homeserver()
231228
return hs
232229

230+
def create_test_json_resource(self):
231+
"""
232+
Create a test JsonResource, with the relevant servlets registerd to it
233+
234+
The default implementation calls each function in `servlets` to do the
235+
registration.
236+
237+
Returns:
238+
JsonResource:
239+
"""
240+
resource = JsonResource(self.hs)
241+
242+
for servlet in self.servlets:
243+
servlet(self.hs, resource)
244+
245+
return resource
246+
233247
def default_config(self, name="test"):
234248
"""
235249
Get a default HomeServer config object.

0 commit comments

Comments
 (0)