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
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a 'devices' table to the storage, as well as a 'device_id' column to refresh_tokens. Allow the client to pass a device_id, and initial_device_display_name, to /login. If login is successful, then register the device in the devices table if it wasn't known already. If no device_id was supplied, make one up. Associate the device_id with the access token and refresh token, so that we can get at it again later. Ensure that the device_id is copied from the refresh token to the access_token when the token is refreshed.
- Loading branch information
Showing
12 changed files
with
354 additions
and
31 deletions.
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
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,71 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2016 OpenMarket 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.errors import StoreError | ||
from synapse.util import stringutils | ||
from twisted.internet import defer | ||
from ._base import BaseHandler | ||
|
||
import logging | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class DeviceHandler(BaseHandler): | ||
def __init__(self, hs): | ||
super(DeviceHandler, self).__init__(hs) | ||
|
||
@defer.inlineCallbacks | ||
def check_device_registered(self, user_id, device_id, | ||
initial_device_display_name): | ||
""" | ||
If the given device has not been registered, register it with the | ||
supplied display name. | ||
If no device_id is supplied, we make one up. | ||
Args: | ||
user_id (str): @user:id | ||
device_id (str | None): device id supplied by client | ||
initial_device_display_name (str | None): device display name from | ||
client | ||
Returns: | ||
str: device id (generated if none was supplied) | ||
""" | ||
if device_id is not None: | ||
yield self.store.store_device( | ||
user_id=user_id, | ||
device_id=device_id, | ||
initial_device_display_name=initial_device_display_name, | ||
ignore_if_known=True, | ||
) | ||
defer.returnValue(device_id) | ||
|
||
# if the device id is not specified, we'll autogen one, but loop a few | ||
# times in case of a clash. | ||
attempts = 0 | ||
while attempts < 5: | ||
try: | ||
device_id = stringutils.random_string_with_symbols(16) | ||
yield self.store.store_device( | ||
user_id=user_id, | ||
device_id=device_id, | ||
initial_device_display_name=initial_device_display_name, | ||
ignore_if_known=False, | ||
) | ||
defer.returnValue(device_id) | ||
except StoreError: | ||
attempts += 1 | ||
|
||
raise StoreError(500, "Couldn't generate a device ID.") |
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
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,77 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2016 OpenMarket 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. | ||
import logging | ||
|
||
from twisted.internet import defer | ||
|
||
from synapse.api.errors import StoreError | ||
from ._base import SQLBaseStore | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class DeviceStore(SQLBaseStore): | ||
@defer.inlineCallbacks | ||
def store_device(self, user_id, device_id, | ||
initial_device_display_name, | ||
ignore_if_known=True): | ||
"""Ensure the given device is known; add it to the store if not | ||
Args: | ||
user_id (str): id of user associated with the device | ||
device_id (str): id of device | ||
initial_device_display_name (str): initial displayname of the | ||
device | ||
ignore_if_known (bool): ignore integrity errors which mean the | ||
device is already known | ||
Returns: | ||
defer.Deferred | ||
Raises: | ||
StoreError: if ignore_if_known is False and the device was already | ||
known | ||
""" | ||
try: | ||
yield self._simple_insert( | ||
"devices", | ||
values={ | ||
"user_id": user_id, | ||
"device_id": device_id, | ||
"display_name": initial_device_display_name | ||
}, | ||
desc="store_device", | ||
or_ignore=ignore_if_known, | ||
) | ||
except Exception as e: | ||
logger.error("store_device with device_id=%s failed: %s", | ||
device_id, e) | ||
raise StoreError(500, "Problem storing device.") | ||
|
||
def get_device(self, user_id, device_id): | ||
"""Retrieve a device. | ||
Args: | ||
user_id (str): The ID of the user which owns the device | ||
device_id (str): The ID of the device to retrieve | ||
Returns: | ||
defer.Deferred for a namedtuple containing the device information | ||
Raises: | ||
StoreError: if the device is not found | ||
""" | ||
return self._simple_select_one( | ||
table="devices", | ||
keyvalues={"user_id": user_id, "device_id": device_id}, | ||
retcols=("user_id", "device_id", "display_name"), | ||
desc="get_device", | ||
) |
Oops, something went wrong.