Add 'server_version' endpoint to admin API
This is required because the 'Server' HTTP header is not always passed through proxies.
This commit is contained in:
parent
b136ee10df
commit
1e8388b311
|
@ -17,12 +17,14 @@
|
||||||
import hashlib
|
import hashlib
|
||||||
import hmac
|
import hmac
|
||||||
import logging
|
import logging
|
||||||
|
import platform
|
||||||
|
|
||||||
from six import text_type
|
from six import text_type
|
||||||
from six.moves import http_client
|
from six.moves import http_client
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
|
import synapse
|
||||||
from synapse.api.constants import Membership, UserTypes
|
from synapse.api.constants import Membership, UserTypes
|
||||||
from synapse.api.errors import AuthError, Codes, NotFoundError, SynapseError
|
from synapse.api.errors import AuthError, Codes, NotFoundError, SynapseError
|
||||||
from synapse.http.servlet import (
|
from synapse.http.servlet import (
|
||||||
|
@ -32,6 +34,7 @@ from synapse.http.servlet import (
|
||||||
parse_string,
|
parse_string,
|
||||||
)
|
)
|
||||||
from synapse.types import UserID, create_requester
|
from synapse.types import UserID, create_requester
|
||||||
|
from synapse.util.versionstring import get_version_string
|
||||||
|
|
||||||
from .base import ClientV1RestServlet, client_path_patterns
|
from .base import ClientV1RestServlet, client_path_patterns
|
||||||
|
|
||||||
|
@ -66,6 +69,25 @@ class UsersRestServlet(ClientV1RestServlet):
|
||||||
defer.returnValue((200, ret))
|
defer.returnValue((200, ret))
|
||||||
|
|
||||||
|
|
||||||
|
class VersionServlet(ClientV1RestServlet):
|
||||||
|
PATTERNS = client_path_patterns("/admin/server_version")
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def on_GET(self, request):
|
||||||
|
requester = yield self.auth.get_user_by_req(request)
|
||||||
|
is_admin = yield self.auth.is_server_admin(requester.user)
|
||||||
|
|
||||||
|
if not is_admin:
|
||||||
|
raise AuthError(403, "You are not a server admin")
|
||||||
|
|
||||||
|
ret = {
|
||||||
|
'server_version': get_version_string(synapse),
|
||||||
|
'python_version': platform.python_version(),
|
||||||
|
}
|
||||||
|
|
||||||
|
defer.returnValue((200, ret))
|
||||||
|
|
||||||
|
|
||||||
class UserRegisterServlet(ClientV1RestServlet):
|
class UserRegisterServlet(ClientV1RestServlet):
|
||||||
"""
|
"""
|
||||||
Attributes:
|
Attributes:
|
||||||
|
@ -763,3 +785,4 @@ def register_servlets(hs, http_server):
|
||||||
QuarantineMediaInRoom(hs).register(http_server)
|
QuarantineMediaInRoom(hs).register(http_server)
|
||||||
ListMediaInRoom(hs).register(http_server)
|
ListMediaInRoom(hs).register(http_server)
|
||||||
UserRegisterServlet(hs).register(http_server)
|
UserRegisterServlet(hs).register(http_server)
|
||||||
|
VersionServlet(hs).register(http_server)
|
||||||
|
|
|
@ -20,11 +20,45 @@ import json
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
|
|
||||||
from synapse.api.constants import UserTypes
|
from synapse.api.constants import UserTypes
|
||||||
from synapse.rest.client.v1 import admin
|
from synapse.rest.client.v1 import admin, login
|
||||||
|
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class VersionTestCase(unittest.HomeserverTestCase):
|
||||||
|
|
||||||
|
servlets = [
|
||||||
|
admin.register_servlets,
|
||||||
|
login.register_servlets,
|
||||||
|
]
|
||||||
|
|
||||||
|
url = '/_matrix/client/r0/admin/server_version'
|
||||||
|
|
||||||
|
def test_version_string(self):
|
||||||
|
self.register_user("admin", "pass", admin=True)
|
||||||
|
self.admin_token = self.login("admin", "pass")
|
||||||
|
|
||||||
|
request, channel = self.make_request("GET", self.url,
|
||||||
|
access_token=self.admin_token)
|
||||||
|
self.render(request)
|
||||||
|
|
||||||
|
self.assertEqual(200, int(channel.result["code"]),
|
||||||
|
msg=channel.result["body"])
|
||||||
|
self.assertEqual({'server_version', 'python_version'},
|
||||||
|
set(channel.json_body.keys()))
|
||||||
|
|
||||||
|
def test_inaccessible_to_non_admins(self):
|
||||||
|
self.register_user("unprivileged-user", "pass", admin=False)
|
||||||
|
user_token = self.login("unprivileged-user", "pass")
|
||||||
|
|
||||||
|
request, channel = self.make_request("GET", self.url,
|
||||||
|
access_token=user_token)
|
||||||
|
self.render(request)
|
||||||
|
|
||||||
|
self.assertEqual(403, int(channel.result['code']),
|
||||||
|
msg=channel.result['body'])
|
||||||
|
|
||||||
|
|
||||||
class UserRegisterTestCase(unittest.HomeserverTestCase):
|
class UserRegisterTestCase(unittest.HomeserverTestCase):
|
||||||
|
|
||||||
servlets = [admin.register_servlets]
|
servlets = [admin.register_servlets]
|
||||||
|
|
Loading…
Reference in New Issue