forked from MirrorHub/synapse
Move v1-only APIs into their own module & isolate deprecated ones (#3460)
This commit is contained in:
parent
6f62a6ef21
commit
a97c845271
13 changed files with 116 additions and 101 deletions
0
changelog.d/3460.misc
Normal file
0
changelog.d/3460.misc
Normal file
|
@ -36,3 +36,4 @@ known_compat = mock,six
|
||||||
known_twisted=twisted,OpenSSL
|
known_twisted=twisted,OpenSSL
|
||||||
multi_line_output=3
|
multi_line_output=3
|
||||||
include_trailing_comma=true
|
include_trailing_comma=true
|
||||||
|
combine_as_imports=true
|
||||||
|
|
|
@ -26,9 +26,11 @@ from OpenSSL.SSL import VERIFY_NONE
|
||||||
from twisted.internet import defer, protocol, reactor, ssl, task
|
from twisted.internet import defer, protocol, reactor, ssl, task
|
||||||
from twisted.internet.endpoints import HostnameEndpoint, wrapClientTLS
|
from twisted.internet.endpoints import HostnameEndpoint, wrapClientTLS
|
||||||
from twisted.web._newclient import ResponseDone
|
from twisted.web._newclient import ResponseDone
|
||||||
from twisted.web.client import Agent, BrowserLikeRedirectAgent, ContentDecoderAgent
|
|
||||||
from twisted.web.client import FileBodyProducer as TwistedFileBodyProducer
|
|
||||||
from twisted.web.client import (
|
from twisted.web.client import (
|
||||||
|
Agent,
|
||||||
|
BrowserLikeRedirectAgent,
|
||||||
|
ContentDecoderAgent,
|
||||||
|
FileBodyProducer as TwistedFileBodyProducer,
|
||||||
GzipDecoder,
|
GzipDecoder,
|
||||||
HTTPConnectionPool,
|
HTTPConnectionPool,
|
||||||
PartialDownloadError,
|
PartialDownloadError,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Copyright 2014-2016 OpenMarket Ltd
|
# Copyright 2014-2016 OpenMarket Ltd
|
||||||
|
# Copyright 2018 New Vector Ltd
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
|
@ -13,13 +14,24 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from six import PY3
|
||||||
|
|
||||||
from synapse.http.server import JsonResource
|
from synapse.http.server import JsonResource
|
||||||
from synapse.rest.client import versions
|
from synapse.rest.client import versions
|
||||||
from synapse.rest.client.v1 import admin, directory, events, initial_sync
|
from synapse.rest.client.v1 import (
|
||||||
from synapse.rest.client.v1 import login as v1_login
|
admin,
|
||||||
from synapse.rest.client.v1 import logout, presence, profile, push_rule, pusher
|
directory,
|
||||||
from synapse.rest.client.v1 import register as v1_register
|
events,
|
||||||
from synapse.rest.client.v1 import room, voip
|
initial_sync,
|
||||||
|
login as v1_login,
|
||||||
|
logout,
|
||||||
|
presence,
|
||||||
|
profile,
|
||||||
|
push_rule,
|
||||||
|
pusher,
|
||||||
|
room,
|
||||||
|
voip,
|
||||||
|
)
|
||||||
from synapse.rest.client.v2_alpha import (
|
from synapse.rest.client.v2_alpha import (
|
||||||
account,
|
account,
|
||||||
account_data,
|
account_data,
|
||||||
|
@ -42,6 +54,11 @@ from synapse.rest.client.v2_alpha import (
|
||||||
user_directory,
|
user_directory,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not PY3:
|
||||||
|
from synapse.rest.client.v1_only import (
|
||||||
|
register as v1_register,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ClientRestResource(JsonResource):
|
class ClientRestResource(JsonResource):
|
||||||
"""A resource for version 1 of the matrix client API."""
|
"""A resource for version 1 of the matrix client API."""
|
||||||
|
@ -54,14 +71,22 @@ class ClientRestResource(JsonResource):
|
||||||
def register_servlets(client_resource, hs):
|
def register_servlets(client_resource, hs):
|
||||||
versions.register_servlets(client_resource)
|
versions.register_servlets(client_resource)
|
||||||
|
|
||||||
# "v1"
|
if not PY3:
|
||||||
room.register_servlets(hs, client_resource)
|
# "v1" (Python 2 only)
|
||||||
|
v1_register.register_servlets(hs, client_resource)
|
||||||
|
|
||||||
|
# Deprecated in r0
|
||||||
|
initial_sync.register_servlets(hs, client_resource)
|
||||||
|
room.register_deprecated_servlets(hs, client_resource)
|
||||||
|
|
||||||
|
# Partially deprecated in r0
|
||||||
events.register_servlets(hs, client_resource)
|
events.register_servlets(hs, client_resource)
|
||||||
v1_register.register_servlets(hs, client_resource)
|
|
||||||
|
# "v1" + "r0"
|
||||||
|
room.register_servlets(hs, client_resource)
|
||||||
v1_login.register_servlets(hs, client_resource)
|
v1_login.register_servlets(hs, client_resource)
|
||||||
profile.register_servlets(hs, client_resource)
|
profile.register_servlets(hs, client_resource)
|
||||||
presence.register_servlets(hs, client_resource)
|
presence.register_servlets(hs, client_resource)
|
||||||
initial_sync.register_servlets(hs, client_resource)
|
|
||||||
directory.register_servlets(hs, client_resource)
|
directory.register_servlets(hs, client_resource)
|
||||||
voip.register_servlets(hs, client_resource)
|
voip.register_servlets(hs, client_resource)
|
||||||
admin.register_servlets(hs, client_resource)
|
admin.register_servlets(hs, client_resource)
|
||||||
|
|
|
@ -832,10 +832,13 @@ def register_servlets(hs, http_server):
|
||||||
RoomSendEventRestServlet(hs).register(http_server)
|
RoomSendEventRestServlet(hs).register(http_server)
|
||||||
PublicRoomListRestServlet(hs).register(http_server)
|
PublicRoomListRestServlet(hs).register(http_server)
|
||||||
RoomStateRestServlet(hs).register(http_server)
|
RoomStateRestServlet(hs).register(http_server)
|
||||||
RoomInitialSyncRestServlet(hs).register(http_server)
|
|
||||||
RoomRedactEventRestServlet(hs).register(http_server)
|
RoomRedactEventRestServlet(hs).register(http_server)
|
||||||
RoomTypingRestServlet(hs).register(http_server)
|
RoomTypingRestServlet(hs).register(http_server)
|
||||||
SearchRestServlet(hs).register(http_server)
|
SearchRestServlet(hs).register(http_server)
|
||||||
JoinedRoomsRestServlet(hs).register(http_server)
|
JoinedRoomsRestServlet(hs).register(http_server)
|
||||||
RoomEventServlet(hs).register(http_server)
|
RoomEventServlet(hs).register(http_server)
|
||||||
RoomEventContextServlet(hs).register(http_server)
|
RoomEventContextServlet(hs).register(http_server)
|
||||||
|
|
||||||
|
|
||||||
|
def register_deprecated_servlets(hs, http_server):
|
||||||
|
RoomInitialSyncRestServlet(hs).register(http_server)
|
||||||
|
|
3
synapse/rest/client/v1_only/__init__.py
Normal file
3
synapse/rest/client/v1_only/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
"""
|
||||||
|
REST APIs that are only used in v1 (the legacy API).
|
||||||
|
"""
|
39
synapse/rest/client/v1_only/base.py
Normal file
39
synapse/rest/client/v1_only/base.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2014-2016 OpenMarket Ltd
|
||||||
|
# Copyright 2018 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.
|
||||||
|
|
||||||
|
"""This module contains base REST classes for constructing client v1 servlets.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
from synapse.api.urls import CLIENT_PREFIX
|
||||||
|
|
||||||
|
|
||||||
|
def v1_only_client_path_patterns(path_regex, include_in_unstable=True):
|
||||||
|
"""Creates a regex compiled client path with the correct client path
|
||||||
|
prefix.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path_regex (str): The regex string to match. This should NOT have a ^
|
||||||
|
as this will be prefixed.
|
||||||
|
Returns:
|
||||||
|
list of SRE_Pattern
|
||||||
|
"""
|
||||||
|
patterns = [re.compile("^" + CLIENT_PREFIX + path_regex)]
|
||||||
|
if include_in_unstable:
|
||||||
|
unstable_prefix = CLIENT_PREFIX.replace("/api/v1", "/unstable")
|
||||||
|
patterns.append(re.compile("^" + unstable_prefix + path_regex))
|
||||||
|
return patterns
|
|
@ -24,9 +24,10 @@ import synapse.util.stringutils as stringutils
|
||||||
from synapse.api.constants import LoginType
|
from synapse.api.constants import LoginType
|
||||||
from synapse.api.errors import Codes, SynapseError
|
from synapse.api.errors import Codes, SynapseError
|
||||||
from synapse.http.servlet import assert_params_in_dict, parse_json_object_from_request
|
from synapse.http.servlet import assert_params_in_dict, parse_json_object_from_request
|
||||||
|
from synapse.rest.client.v1.base import ClientV1RestServlet
|
||||||
from synapse.types import create_requester
|
from synapse.types import create_requester
|
||||||
|
|
||||||
from .base import ClientV1RestServlet, client_path_patterns
|
from .base import v1_only_client_path_patterns
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -49,7 +50,7 @@ class RegisterRestServlet(ClientV1RestServlet):
|
||||||
handler doesn't have a concept of multi-stages or sessions.
|
handler doesn't have a concept of multi-stages or sessions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PATTERNS = client_path_patterns("/register$", releases=(), include_in_unstable=False)
|
PATTERNS = v1_only_client_path_patterns("/register$", include_in_unstable=False)
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs):
|
||||||
"""
|
"""
|
||||||
|
@ -379,7 +380,7 @@ class CreateUserRestServlet(ClientV1RestServlet):
|
||||||
"""Handles user creation via a server-to-server interface
|
"""Handles user creation via a server-to-server interface
|
||||||
"""
|
"""
|
||||||
|
|
||||||
PATTERNS = client_path_patterns("/createUser$", releases=())
|
PATTERNS = v1_only_client_path_patterns("/createUser$")
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs):
|
||||||
super(CreateUserRestServlet, self).__init__(hs)
|
super(CreateUserRestServlet, self).__init__(hs)
|
|
@ -14,100 +14,30 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
""" Tests REST events for /events paths."""
|
""" Tests REST events for /events paths."""
|
||||||
|
|
||||||
from mock import Mock, NonCallableMock
|
from mock import Mock, NonCallableMock
|
||||||
|
from six import PY3
|
||||||
|
|
||||||
# twisted imports
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
import synapse.rest.client.v1.events
|
|
||||||
import synapse.rest.client.v1.register
|
|
||||||
import synapse.rest.client.v1.room
|
|
||||||
|
|
||||||
from tests import unittest
|
|
||||||
|
|
||||||
from ....utils import MockHttpResource, setup_test_homeserver
|
from ....utils import MockHttpResource, setup_test_homeserver
|
||||||
from .utils import RestTestCase
|
from .utils import RestTestCase
|
||||||
|
|
||||||
PATH_PREFIX = "/_matrix/client/api/v1"
|
PATH_PREFIX = "/_matrix/client/api/v1"
|
||||||
|
|
||||||
|
|
||||||
class EventStreamPaginationApiTestCase(unittest.TestCase):
|
|
||||||
""" Tests event streaming query parameters and start/end keys used in the
|
|
||||||
Pagination stream API. """
|
|
||||||
user_id = "sid1"
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
# configure stream and inject items
|
|
||||||
pass
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def TODO_test_long_poll(self):
|
|
||||||
# stream from 'end' key, send (self+other) message, expect message.
|
|
||||||
|
|
||||||
# stream from 'END', send (self+other) message, expect message.
|
|
||||||
|
|
||||||
# stream from 'end' key, send (self+other) topic, expect topic.
|
|
||||||
|
|
||||||
# stream from 'END', send (self+other) topic, expect topic.
|
|
||||||
|
|
||||||
# stream from 'end' key, send (self+other) invite, expect invite.
|
|
||||||
|
|
||||||
# stream from 'END', send (self+other) invite, expect invite.
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
def TODO_test_stream_forward(self):
|
|
||||||
# stream from START, expect injected items
|
|
||||||
|
|
||||||
# stream from 'start' key, expect same content
|
|
||||||
|
|
||||||
# stream from 'end' key, expect nothing
|
|
||||||
|
|
||||||
# stream from 'END', expect nothing
|
|
||||||
|
|
||||||
# The following is needed for cases where content is removed e.g. you
|
|
||||||
# left a room, so the token you're streaming from is > the one that
|
|
||||||
# would be returned naturally from START>END.
|
|
||||||
# stream from very new token (higher than end key), expect same token
|
|
||||||
# returned as end key
|
|
||||||
pass
|
|
||||||
|
|
||||||
def TODO_test_limits(self):
|
|
||||||
# stream from a key, expect limit_num items
|
|
||||||
|
|
||||||
# stream from START, expect limit_num items
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
def TODO_test_range(self):
|
|
||||||
# stream from key to key, expect X items
|
|
||||||
|
|
||||||
# stream from key to END, expect X items
|
|
||||||
|
|
||||||
# stream from START to key, expect X items
|
|
||||||
|
|
||||||
# stream from START to END, expect all items
|
|
||||||
pass
|
|
||||||
|
|
||||||
def TODO_test_direction(self):
|
|
||||||
# stream from END to START and fwds, expect newest first
|
|
||||||
|
|
||||||
# stream from END to START and bwds, expect oldest first
|
|
||||||
|
|
||||||
# stream from START to END and fwds, expect oldest first
|
|
||||||
|
|
||||||
# stream from START to END and bwds, expect newest first
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class EventStreamPermissionsTestCase(RestTestCase):
|
class EventStreamPermissionsTestCase(RestTestCase):
|
||||||
""" Tests event streaming (GET /events). """
|
""" Tests event streaming (GET /events). """
|
||||||
|
|
||||||
|
if PY3:
|
||||||
|
skip = "Skip on Py3 until ported to use not V1 only register."
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
import synapse.rest.client.v1.events
|
||||||
|
import synapse.rest.client.v1_only.register
|
||||||
|
import synapse.rest.client.v1.room
|
||||||
|
|
||||||
self.mock_resource = MockHttpResource(prefix=PATH_PREFIX)
|
self.mock_resource = MockHttpResource(prefix=PATH_PREFIX)
|
||||||
|
|
||||||
hs = yield setup_test_homeserver(
|
hs = yield setup_test_homeserver(
|
||||||
|
@ -125,7 +55,7 @@ class EventStreamPermissionsTestCase(RestTestCase):
|
||||||
|
|
||||||
hs.get_handlers().federation_handler = Mock()
|
hs.get_handlers().federation_handler = Mock()
|
||||||
|
|
||||||
synapse.rest.client.v1.register.register_servlets(hs, self.mock_resource)
|
synapse.rest.client.v1_only.register.register_servlets(hs, self.mock_resource)
|
||||||
synapse.rest.client.v1.events.register_servlets(hs, self.mock_resource)
|
synapse.rest.client.v1.events.register_servlets(hs, self.mock_resource)
|
||||||
synapse.rest.client.v1.room.register_servlets(hs, self.mock_resource)
|
synapse.rest.client.v1.room.register_servlets(hs, self.mock_resource)
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,12 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
|
from six import PY3
|
||||||
|
|
||||||
from twisted.test.proto_helpers import MemoryReactorClock
|
from twisted.test.proto_helpers import MemoryReactorClock
|
||||||
|
|
||||||
from synapse.http.server import JsonResource
|
from synapse.http.server import JsonResource
|
||||||
from synapse.rest.client.v1.register import register_servlets
|
from synapse.rest.client.v1_only.register import register_servlets
|
||||||
from synapse.util import Clock
|
from synapse.util import Clock
|
||||||
|
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
|
@ -31,6 +32,8 @@ class CreateUserServletTestCase(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
Tests for CreateUserRestServlet.
|
Tests for CreateUserRestServlet.
|
||||||
"""
|
"""
|
||||||
|
if PY3:
|
||||||
|
skip = "Not ported to Python 3."
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.registration_handler = Mock()
|
self.registration_handler = Mock()
|
||||||
|
|
|
@ -20,7 +20,6 @@ import json
|
||||||
from mock import Mock, NonCallableMock
|
from mock import Mock, NonCallableMock
|
||||||
from six.moves.urllib import parse as urlparse
|
from six.moves.urllib import parse as urlparse
|
||||||
|
|
||||||
# twisted imports
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
import synapse.rest.client.v1.room
|
import synapse.rest.client.v1.room
|
||||||
|
@ -86,6 +85,7 @@ class RoomBase(unittest.TestCase):
|
||||||
|
|
||||||
self.resource = JsonResource(self.hs)
|
self.resource = JsonResource(self.hs)
|
||||||
synapse.rest.client.v1.room.register_servlets(self.hs, self.resource)
|
synapse.rest.client.v1.room.register_servlets(self.hs, self.resource)
|
||||||
|
synapse.rest.client.v1.room.register_deprecated_servlets(self.hs, self.resource)
|
||||||
self.helper = RestHelper(self.hs, self.resource, self.user_id)
|
self.helper = RestHelper(self.hs, self.resource, self.user_id)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,12 @@ from synapse.types import UserID
|
||||||
from synapse.util import Clock
|
from synapse.util import Clock
|
||||||
|
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
from tests.server import ThreadedMemoryReactorClock as MemoryReactorClock
|
from tests.server import (
|
||||||
from tests.server import make_request, setup_test_homeserver, wait_until_result
|
ThreadedMemoryReactorClock as MemoryReactorClock,
|
||||||
|
make_request,
|
||||||
|
setup_test_homeserver,
|
||||||
|
wait_until_result,
|
||||||
|
)
|
||||||
|
|
||||||
PATH_PREFIX = "/_matrix/client/v2_alpha"
|
PATH_PREFIX = "/_matrix/client/v2_alpha"
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,12 @@ from synapse.types import UserID
|
||||||
from synapse.util import Clock
|
from synapse.util import Clock
|
||||||
|
|
||||||
from tests import unittest
|
from tests import unittest
|
||||||
from tests.server import ThreadedMemoryReactorClock as MemoryReactorClock
|
from tests.server import (
|
||||||
from tests.server import make_request, setup_test_homeserver, wait_until_result
|
ThreadedMemoryReactorClock as MemoryReactorClock,
|
||||||
|
make_request,
|
||||||
|
setup_test_homeserver,
|
||||||
|
wait_until_result,
|
||||||
|
)
|
||||||
|
|
||||||
PATH_PREFIX = "/_matrix/client/v2_alpha"
|
PATH_PREFIX = "/_matrix/client/v2_alpha"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue