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

Implement /keys/changes #1869

Merged
merged 3 commits into from
Feb 1, 2017
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions synapse/handlers/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,22 @@ def notify_device_update(self, user_id, device_ids):
for host in hosts:
self.federation_sender.send_device_messages(host)

@defer.inlineCallbacks
def get_user_ids_changed(self, user_id, from_device_key):
rooms = yield self.store.get_rooms_for_user(user_id)
room_ids = set(r.room_id for r in rooms)

user_ids_changed = set()
changed = yield self.store.get_user_whose_devices_changed(
from_device_key
)
for other_user_id in changed:
other_rooms = yield self.store.get_rooms_for_user(other_user_id)
if room_ids.intersection(e.room_id for e in other_rooms):
user_ids_changed.add(other_user_id)

defer.returnValue(user_ids_changed)

@defer.inlineCallbacks
def _incoming_device_list_update(self, origin, edu_content):
user_id = edu_content["user_id"]
Expand Down
49 changes: 49 additions & 0 deletions synapse/rest/client/v2_alpha/keys.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
from synapse.http.servlet import (
RestServlet, parse_json_object_from_request, parse_integer
)
from synapse.http.servlet import parse_string
from synapse.types import StreamToken
from ._base import client_v2_patterns

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -149,6 +151,52 @@ def on_POST(self, request):
defer.returnValue((200, result))


class KeyChangesServlet(RestServlet):
"""Returns the list of changes of keys between two stream tokens (may return
spurious results).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe explain why the results might be spurious and the nature of their spuriosity?


GET /keys/changes?from=...&to=...

200 OK
{ "changed": ["@foo:example.com"] }
"""
PATTERNS = client_v2_patterns(
"/keys/changes$",
releases=()
)

def __init__(self, hs):
"""
Args:
hs (synapse.server.HomeServer):
"""
super(KeyChangesServlet, self).__init__()
self.auth = hs.get_auth()
self.device_handler = hs.get_device_handler()

@defer.inlineCallbacks
def on_GET(self, request):
requester = yield self.auth.get_user_by_req(request, allow_guest=True)

from_token_string = parse_string(request, "from")

# We want to enforce they do pass us one, but we ignore it and return
# changes after the "to" as well as before.
parse_string(request, "to")

from_token = StreamToken.from_string(from_token_string)

user_id = requester.user.to_string()

changed = yield self.device_handler.get_user_ids_changed(
user_id, from_token.device_list_key,
)

defer.returnValue((200, {
"changed": changed
}))


class OneTimeKeyServlet(RestServlet):
"""
POST /keys/claim HTTP/1.1
Expand Down Expand Up @@ -192,4 +240,5 @@ def on_POST(self, request):
def register_servlets(hs, http_server):
KeyUploadServlet(hs).register(http_server)
KeyQueryServlet(hs).register(http_server)
KeyChangesServlet(hs).register(http_server)
OneTimeKeyServlet(hs).register(http_server)