mirror of
https://mau.dev/maunium/synapse.git
synced 2024-10-01 01:36:05 -04:00
apply PR review suggestions
This commit is contained in:
parent
8c9adcc95d
commit
7c3abc6572
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
|
||||||
from canonicaljson import encode_canonical_json, json
|
from canonicaljson import encode_canonical_json, json
|
||||||
@ -132,7 +134,7 @@ class E2eKeysHandler(object):
|
|||||||
r[user_id] = remote_queries[user_id]
|
r[user_id] = remote_queries[user_id]
|
||||||
|
|
||||||
# Get cached cross-signing keys
|
# 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
|
device_keys_query, from_user_id
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -200,11 +202,11 @@ class E2eKeysHandler(object):
|
|||||||
|
|
||||||
for user_id, key in remote_result["master_keys"].items():
|
for user_id, key in remote_result["master_keys"].items():
|
||||||
if user_id in destination_query:
|
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():
|
for user_id, key in remote_result["self_signing_keys"].items():
|
||||||
if user_id in destination_query:
|
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:
|
except Exception as e:
|
||||||
failure = _exception_to_failure(e)
|
failure = _exception_to_failure(e)
|
||||||
@ -222,14 +224,13 @@ class E2eKeysHandler(object):
|
|||||||
|
|
||||||
ret = {"device_keys": results, "failures": failures}
|
ret = {"device_keys": results, "failures": failures}
|
||||||
|
|
||||||
for key, value in iteritems(cross_signing_keys):
|
ret.update(cross_signing_keys)
|
||||||
ret[key + "_keys"] = value
|
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def query_cross_signing_keys(self, query, from_user_id):
|
def get_cross_signing_keys_from_cache(self, query, from_user_id):
|
||||||
"""Get cross-signing keys for users
|
"""Get cross-signing keys for users from the database
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
query (Iterable[string]) an iterable of user IDs. A dict whose keys
|
query (Iterable[string]) an iterable of user IDs. A dict whose keys
|
||||||
@ -250,43 +251,32 @@ class E2eKeysHandler(object):
|
|||||||
for user_id in query:
|
for user_id in query:
|
||||||
# XXX: consider changing the store functions to allow querying
|
# XXX: consider changing the store functions to allow querying
|
||||||
# multiple users simultaneously.
|
# multiple users simultaneously.
|
||||||
try:
|
key = yield self.store.get_e2e_cross_signing_key(
|
||||||
key = yield self.store.get_e2e_cross_signing_key(
|
user_id, "master", from_user_id
|
||||||
user_id, "master", from_user_id
|
)
|
||||||
)
|
if key:
|
||||||
if key:
|
master_keys[user_id] = key
|
||||||
master_keys[user_id] = key
|
|
||||||
except Exception as e:
|
|
||||||
logger.info("Error getting master key: %s", e)
|
|
||||||
|
|
||||||
try:
|
key = yield self.store.get_e2e_cross_signing_key(
|
||||||
key = yield self.store.get_e2e_cross_signing_key(
|
user_id, "self_signing", from_user_id
|
||||||
user_id, "self_signing", from_user_id
|
)
|
||||||
)
|
if key:
|
||||||
if key:
|
self_signing_keys[user_id] = key
|
||||||
self_signing_keys[user_id] = key
|
|
||||||
except Exception as e:
|
|
||||||
logger.info("Error getting self-signing key: %s", e)
|
|
||||||
|
|
||||||
# users can see other users' master and self-signing keys, but can
|
# users can see other users' master and self-signing keys, but can
|
||||||
# only see their own user-signing keys
|
# only see their own user-signing keys
|
||||||
if from_user_id == user_id:
|
if from_user_id == user_id:
|
||||||
try:
|
key = yield self.store.get_e2e_cross_signing_key(
|
||||||
key = yield self.store.get_e2e_cross_signing_key(
|
user_id, "user_signing", from_user_id
|
||||||
user_id, "user_signing", from_user_id
|
)
|
||||||
)
|
if key:
|
||||||
if key:
|
user_signing_keys[user_id] = key
|
||||||
user_signing_keys[user_id] = key
|
|
||||||
except Exception as e:
|
|
||||||
logger.info("Error getting user-signing key: %s", e)
|
|
||||||
|
|
||||||
defer.returnValue(
|
return {
|
||||||
{
|
"master_keys": master_keys,
|
||||||
"master": master_keys,
|
"self_signing_keys": self_signing_keys,
|
||||||
"self_signing": self_signing_keys,
|
"user_signing_keys": user_signing_keys,
|
||||||
"user_signing": user_signing_keys,
|
}
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def query_local_devices(self, query):
|
def query_local_devices(self, query):
|
||||||
@ -542,11 +532,13 @@ class E2eKeysHandler(object):
|
|||||||
# if everything checks out, then store the keys and send notifications
|
# if everything checks out, then store the keys and send notifications
|
||||||
deviceids = []
|
deviceids = []
|
||||||
if "master_key" in keys:
|
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)
|
deviceids.append(master_verify_key.version)
|
||||||
if "self_signing_key" in keys:
|
if "self_signing_key" in keys:
|
||||||
yield self.store.set_e2e_cross_signing_key(
|
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:
|
try:
|
||||||
deviceids.append(
|
deviceids.append(
|
||||||
@ -556,7 +548,7 @@ class E2eKeysHandler(object):
|
|||||||
raise SynapseError(400, "Invalid self-signing key", Codes.INVALID_PARAM)
|
raise SynapseError(400, "Invalid self-signing key", Codes.INVALID_PARAM)
|
||||||
if "user_signing_key" in keys:
|
if "user_signing_key" in keys:
|
||||||
yield self.store.set_e2e_cross_signing_key(
|
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
|
# the signature stream matches the semantics that we want for
|
||||||
# user-signing key updates: only the user themselves is notified of
|
# user-signing key updates: only the user themselves is notified of
|
||||||
@ -568,7 +560,7 @@ class E2eKeysHandler(object):
|
|||||||
if len(deviceids):
|
if len(deviceids):
|
||||||
yield self.device_handler.notify_device_update(user_id, 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):
|
def _check_cross_signing_key(key, user_id, key_type, signing_key=None):
|
||||||
|
@ -263,7 +263,7 @@ class SigningKeyUploadServlet(RestServlet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
result = yield self.e2e_keys_handler.upload_signing_keys_for_user(user_id, body)
|
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):
|
def register_servlets(hs, http_server):
|
||||||
|
@ -317,7 +317,7 @@ class DeviceWorkerStore(SQLBaseStore):
|
|||||||
user_ids,
|
user_ids,
|
||||||
stream_id,
|
stream_id,
|
||||||
)
|
)
|
||||||
defer.returnValue(stream_id)
|
return stream_id
|
||||||
|
|
||||||
def _add_user_signature_change_txn(self, txn, from_user_id, user_ids, stream_id):
|
def _add_user_signature_change_txn(self, txn, from_user_id, user_ids, stream_id):
|
||||||
txn.call_after(
|
txn.call_after(
|
||||||
@ -491,9 +491,9 @@ class DeviceWorkerStore(SQLBaseStore):
|
|||||||
rows = yield self._execute(
|
rows = yield self._execute(
|
||||||
"get_users_whose_signatures_changed", None, sql, user_id, from_key
|
"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:
|
else:
|
||||||
defer.returnValue(set())
|
return set()
|
||||||
|
|
||||||
def get_all_device_list_changes_for_remotes(self, from_key, to_key):
|
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
|
"""Return a list of `(stream_id, user_id, destination)` which is the
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
# 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.
|
||||||
import time
|
|
||||||
|
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
|
||||||
from canonicaljson import encode_canonical_json, json
|
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
|
"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.
|
"""Set a user's cross-signing key.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -294,6 +292,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
|
|||||||
for a master key, 'self_signing' for a self-signing key, or
|
for a master key, 'self_signing' for a self-signing key, or
|
||||||
'user_signing' for a user-signing key
|
'user_signing' for a user-signing key
|
||||||
key (dict): the key data
|
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,
|
# 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
|
# 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,
|
"user_id": user_id,
|
||||||
"keytype": key_type,
|
"keytype": key_type,
|
||||||
"keydata": json.dumps(key),
|
"keydata": json.dumps(key),
|
||||||
"added_ts": time.time() * 1000,
|
"added_ts": added_ts,
|
||||||
},
|
},
|
||||||
desc="store_master_key",
|
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.
|
"""Set a user's cross-signing key.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
user_id (str): the user to set the user-signing key for
|
user_id (str): the user to set the user-signing key for
|
||||||
key_type (str): the type of cross-signing key to set
|
key_type (str): the type of cross-signing key to set
|
||||||
key (dict): the key data
|
key (dict): the key data
|
||||||
|
added_ts (int): the timestamp for when the key was added
|
||||||
"""
|
"""
|
||||||
return self.runInteraction(
|
return self.runInteraction(
|
||||||
"add_e2e_cross_signing_key",
|
"add_e2e_cross_signing_key",
|
||||||
@ -353,6 +353,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
|
|||||||
user_id,
|
user_id,
|
||||||
key_type,
|
key_type,
|
||||||
key,
|
key,
|
||||||
|
added_ts,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _get_e2e_cross_signing_key_txn(self, txn, user_id, key_type, from_user_id=None):
|
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
|
the key will be included in the result
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict of the key data
|
dict of the key data or None if not found
|
||||||
"""
|
"""
|
||||||
sql = (
|
sql = (
|
||||||
"SELECT keydata "
|
"SELECT keydata "
|
||||||
@ -412,7 +413,7 @@ class EndToEndKeyStore(EndToEndKeyWorkerStore, SQLBaseStore):
|
|||||||
the self-signing key will be included in the result
|
the self-signing key will be included in the result
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict of the key data
|
dict of the key data or None if not found
|
||||||
"""
|
"""
|
||||||
return self.runInteraction(
|
return self.runInteraction(
|
||||||
"get_e2e_cross_signing_key",
|
"get_e2e_cross_signing_key",
|
||||||
|
Loading…
Reference in New Issue
Block a user