Delete e2e keys on device delete

This commit is contained in:
Richard van der Hoff 2016-07-27 12:18:03 +01:00
parent 2e3d90d67c
commit d47115ff8b
3 changed files with 28 additions and 4 deletions

View File

@ -143,6 +143,10 @@ class DeviceHandler(BaseHandler):
delete_refresh_tokens=True, delete_refresh_tokens=True,
) )
yield self.store.delete_e2e_keys_by_device(
user_id=user_id, device_id=device_id
)
@defer.inlineCallbacks @defer.inlineCallbacks
def update_device(self, user_id, device_id, content): def update_device(self, user_id, device_id, content):
""" Update the given device """ Update the given device

View File

@ -86,10 +86,6 @@ class KeyUploadServlet(RestServlet):
raise synapse.api.errors.SynapseError( raise synapse.api.errors.SynapseError(
400, "Can only upload keys for current device" 400, "Can only upload keys for current device"
) )
self.device_handler.check_device_registered(
user_id, device_id, "unknown device"
)
else: else:
device_id = requester.device_id device_id = requester.device_id
@ -131,6 +127,15 @@ class KeyUploadServlet(RestServlet):
user_id, device_id, time_now, key_list user_id, device_id, time_now, key_list
) )
# the device should have been registered already, but it may have been
# deleted due to a race with a DELETE request. Or we may be using an
# old access_token without an associated device_id. Either way, we
# need to double-check the device is registered to avoid ending up with
# keys without a corresponding device.
self.device_handler.check_device_registered(
user_id, device_id, "unknown device"
)
result = yield self.store.count_e2e_one_time_keys(user_id, device_id) result = yield self.store.count_e2e_one_time_keys(user_id, device_id)
defer.returnValue((200, {"one_time_key_counts": result})) defer.returnValue((200, {"one_time_key_counts": result}))

View File

@ -13,6 +13,8 @@
# 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 twisted.internet.defer
from ._base import SQLBaseStore from ._base import SQLBaseStore
@ -123,3 +125,16 @@ class EndToEndKeyStore(SQLBaseStore):
return self.runInteraction( return self.runInteraction(
"claim_e2e_one_time_keys", _claim_e2e_one_time_keys "claim_e2e_one_time_keys", _claim_e2e_one_time_keys
) )
@twisted.internet.defer.inlineCallbacks
def delete_e2e_keys_by_device(self, user_id, device_id):
yield self._simple_delete(
table="e2e_device_keys_json",
keyvalues={"user_id": user_id, "device_id": device_id},
desc="delete_e2e_device_keys_by_device"
)
yield self._simple_delete(
table="e2e_one_time_keys_json",
keyvalues={"user_id": user_id, "device_id": device_id},
desc="delete_e2e_one_time_keys_by_device"
)