Create lazy in-memory room encryptors #1570
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The existing
[MXCrypto getRoomEncryptor]
method is used by a variety of codepaths, incl. re-sharing room keys etc. It returns a cached / in-memory value ofMXMegolmEncryptor
, but only if it was previously set to memory, typically byensureEncryptionInRoom
method (which performs a bunch of other actions). This method is typically called when a user starts typing in a given room.When a user launches the app the
roomEncryptors
dictionary will be empty for all rooms, and encryptors will only be created if a user types a message in that room, or some message arrives to this device. It is not however created when the user receives am.room_key_request
for this room, and thus silently fails in re-sharing a given key, leaving the requester with UISIs.To solve this, this PR ensures that
getRoomEncryptor
can instantiate an in-memory encryptor if it does not exist already, rather than waiting onensureEncryptionInRoom
to be called. That way we always return an encryptor when needed, and the client will respond to key requests even after fresh app start