diff --git a/synapse/handlers/e2e_keys.py b/synapse/handlers/e2e_keys.py
index 9081c3f64c..53ca8330ad 100644
--- a/synapse/handlers/e2e_keys.py
+++ b/synapse/handlers/e2e_keys.py
@@ -17,6 +17,8 @@
import logging
+import time
+
from six import iteritems
from canonicaljson import encode_canonical_json, json
@@ -132,7 +134,7 @@ class E2eKeysHandler(object):
r[user_id] = remote_queries[user_id]
# Get cached cross-signing keys
- cross_signing_keys = yield self.query_cross_signing_keys(
+ cross_signing_keys = yield self.get_cross_signing_keys_from_cache(
device_keys_query, from_user_id
)
@@ -200,11 +202,11 @@ class E2eKeysHandler(object):
for user_id, key in remote_result["master_keys"].items():
if user_id in destination_query:
- cross_signing_keys["master"][user_id] = key
+ cross_signing_keys["master_keys"][user_id] = key
for user_id, key in remote_result["self_signing_keys"].items():
if user_id in destination_query:
- cross_signing_keys["self_signing"][user_id] = key
+ cross_signing_keys["self_signing_keys"][user_id] = key
except Exception as e:
failure = _exception_to_failure(e)
@@ -222,14 +224,13 @@ class E2eKeysHandler(object):
ret = {"device_keys": results, "failures": failures}
- for key, value in iteritems(cross_signing_keys):
- ret[key + "_keys"] = value
+ ret.update(cross_signing_keys)
return ret
@defer.inlineCallbacks
- def query_cross_signing_keys(self, query, from_user_id):
- """Get cross-signing keys for users
+ def get_cross_signing_keys_from_cache(self, query, from_user_id):
+ """Get cross-signing keys for users from the database
Args:
query (Iterable[string]) an iterable of user IDs. A dict whose keys
@@ -250,43 +251,32 @@ class E2eKeysHandler(object):
for user_id in query:
# XXX: consider changing the store functions to allow querying
# multiple users simultaneously.
- try:
- key = yield self.store.get_e2e_cross_signing_key(
- user_id, "master", from_user_id
- )
- if key:
- master_keys[user_id] = key
- except Exception as e:
- logger.info("Error getting master key: %s", e)
+ key = yield self.store.get_e2e_cross_signing_key(
+ user_id, "master", from_user_id
+ )
+ if key:
+ master_keys[user_id] = key
- try:
- key = yield self.store.get_e2e_cross_signing_key(
- user_id, "self_signing", from_user_id
- )
- if key:
- self_signing_keys[user_id] = key
- except Exception as e:
- logger.info("Error getting self-signing key: %s", e)
+ key = yield self.store.get_e2e_cross_signing_key(
+ user_id, "self_signing", from_user_id
+ )
+ if key:
+ self_signing_keys[user_id] = key
# users can see other users' master and self-signing keys, but can
# only see their own user-signing keys
if from_user_id == user_id:
- try:
- key = yield self.store.get_e2e_cross_signing_key(
- user_id, "user_signing", from_user_id
- )
- if key:
- user_signing_keys[user_id] = key
- except Exception as e:
- logger.info("Error getting user-signing key: %s", e)
+ key = yield self.store.get_e2e_cross_signing_key(
+ user_id, "user_signing", from_user_id
+ )
+ if key:
+ user_signing_keys[user_id] = key
- defer.returnValue(
- {
- "master": master_keys,
- "self_signing": self_signing_keys,
- "user_signing": user_signing_keys,
- }
- )
+ return {
+ "master_keys": master_keys,
+ "self_signing_keys": self_signing_keys,
+ "user_signing_keys": user_signing_keys,
+ }
@defer.inlineCallbacks
def query_local_devices(self, query):
@@ -542,11 +532,13 @@ class E2eKeysHandler(object):
# if everything checks out, then store the keys and send notifications
deviceids = []
if "master_key" in keys:
- yield self.store.set_e2e_cross_signing_key(user_id, "master", master_key)
+ yield self.store.set_e2e_cross_signing_key(
+ user_id, "master", master_key, time.time() * 1000
+ )
deviceids.append(master_verify_key.version)
if "self_signing_key" in keys:
yield self.store.set_e2e_cross_signing_key(
- user_id, "self_signing", self_signing_key
+ user_id, "self_signing", self_signing_key, time.time() * 1000
)
try:
deviceids.append(
@@ -556,7 +548,7 @@ class E2eKeysHandler(object):
raise SynapseError(400, "Invalid self-signing key", Codes.INVALID_PARAM)
if "user_signing_key" in keys:
yield self.store.set_e2e_cross_signing_key(
- user_id, "user_signing", user_signing_key
+ user_id, "user_signing", user_signing_key, time.time() * 1000
)
# the signature stream matches the semantics that we want for
# user-signing key updates: only the user themselves is notified of
@@ -568,7 +560,7 @@ class E2eKeysHandler(object):
if len(deviceids):
yield self.device_handler.notify_device_update(user_id, deviceids)
- defer.returnValue({})
+ return {}
def _check_cross_signing_key(key, user_id, key_type, signing_key=None):
diff --git a/synapse/rest/client/v2_alpha/keys.py b/synapse/rest/client/v2_alpha/keys.py
index f40a785598..1340d2c80d 100644
--- a/synapse/rest/client/v2_alpha/keys.py
+++ b/synapse/rest/client/v2_alpha/keys.py
@@ -263,7 +263,7 @@ class SigningKeyUploadServlet(RestServlet):
)
result = yield self.e2e_keys_handler.upload_signing_keys_for_user(user_id, body)
- defer.returnValue((200, result))
+ return (200, result)
def register_servlets(hs, http_server):
diff --git a/synapse/storage/devices.py b/synapse/storage/devices.py
index da23a350a1..6a5572e001 100644
--- a/synapse/storage/devices.py
+++ b/synapse/storage/devices.py
@@ -317,7 +317,7 @@ class DeviceWorkerStore(SQLBaseStore):
user_ids,
stream_id,
)
- defer.returnValue(stream_id)
+ return stream_id
def _add_user_signature_change_txn(self, txn, from_user_id, user_ids, stream_id):
txn.call_after(
@@ -491,9 +491,9 @@ class DeviceWorkerStore(SQLBaseStore):
rows = yield self._execute(
"get_users_whose_signatures_changed", None, sql, user_id, from_key
)
- defer.returnValue(set(user for row in rows for user in json.loads(row[0])))
+ return set(user for row in rows for user in json.loads(row[0]))
else:
- defer.returnValue(set())
+ return set()
def get_all_device_list_changes_for_remotes(self, from_key, to_key):
"""Return a list of `(stream_id, user_id, destination)` which is the
diff --git a/synapse/storage/end_to_end_keys.py b/synapse/storage/end_to_end_keys.py
index de2d1bbb9f..b218b7b2e8 100644
--- a/synapse/storage/end_to_end_keys.py
+++ b/synapse/storage/end_to_end_keys.py
@@ -14,8 +14,6 @@
# 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 time
-
from six import iteritems
from canonicaljson import encode_canonical_json, json
@@ -284,7 +282,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
"delete_e2e_keys_by_device", delete_e2e_keys_by_device_txn
)
- def _set_e2e_cross_signing_key_txn(self, txn, user_id, key_type, key):
+ def _set_e2e_cross_signing_key_txn(self, txn, user_id, key_type, key, added_ts):
"""Set a user's cross-signing key.
Args:
@@ -294,6 +292,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
for a master key, 'self_signing' for a self-signing key, or
'user_signing' for a user-signing key
key (dict): the key data
+ added_ts (int): the timestamp for when the key was added
"""
# the cross-signing keys need to occupy the same namespace as devices,
# since signatures are identified by device ID. So add an entry to the
@@ -334,18 +333,19 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
"user_id": user_id,
"keytype": key_type,
"keydata": json.dumps(key),
- "added_ts": time.time() * 1000,
+ "added_ts": added_ts,
},
desc="store_master_key",
)
- def set_e2e_cross_signing_key(self, user_id, key_type, key):
+ def set_e2e_cross_signing_key(self, user_id, key_type, key, added_ts):
"""Set a user's cross-signing key.
Args:
user_id (str): the user to set the user-signing key for
key_type (str): the type of cross-signing key to set
key (dict): the key data
+ added_ts (int): the timestamp for when the key was added
"""
return self.runInteraction(
"add_e2e_cross_signing_key",
@@ -353,6 +353,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
user_id,
key_type,
key,
+ added_ts,
)
def _get_e2e_cross_signing_key_txn(self, txn, user_id, key_type, from_user_id=None):
@@ -368,7 +369,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
the key will be included in the result
Returns:
- dict of the key data
+ dict of the key data or None if not found
"""
sql = (
"SELECT keydata "
@@ -412,7 +413,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
the self-signing key will be included in the result
Returns:
- dict of the key data
+ dict of the key data or None if not found
"""
return self.runInteraction(
"get_e2e_cross_signing_key",
|