Skip to content

Commit

Permalink
MXEvent: editedEventFromReplacementEvent: Use decrypted replacing eve…
Browse files Browse the repository at this point in the history
…nt data

It solves 2 things:
 - avoid synchronous decryption
 - decryption of the  MXRoomSummary.lastMessageEvent when it is edited (element-hq/element-ios/issues/4322)

Plus it saves a decryption.
  • Loading branch information
manuroe committed May 19, 2021
1 parent 44ec72d commit fbde49c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
2 changes: 1 addition & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Changes to be released in next version
* MXStore: New commit method accepting a completion block.

🐛 Bugfix
*
* MXRoomSummary: Fix decryption of the last message when it is edited (vector-im/element-ios/issues/4322).

⚠️ API Changes
*
Expand Down
7 changes: 0 additions & 7 deletions MatrixSDK/Aggregations/MXAggregatedEditsUpdater.m
Original file line number Diff line number Diff line change
Expand Up @@ -243,13 +243,6 @@ - (void)handleReplace:(MXEvent *)replaceEvent
if (editedEvent)
{
[self.matrixStore replaceEvent:editedEvent inRoom:roomId];

if (editedEvent.isEncrypted && !editedEvent.clearEvent)
{
[self.mxSession decryptEvent:editedEvent inTimeline:nil];
}


[self notifyEventEditsListenersOfRoom:roomId replaceEvent:replaceEvent];
}
}
Expand Down
28 changes: 28 additions & 0 deletions MatrixSDK/JSONModels/MXEvent.m
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,8 @@ - (MXEvent*)editedEventFromReplacementEvent:(MXEvent*)replaceEvent
MXEvent *event = self;
NSDictionary *newContentDict;
MXJSONModelSetDictionary(newContentDict, replaceEvent.content[@"m.new_content"])

MXEventDecryptionResult *replaceEventDecryptionResult;

NSMutableDictionary *editedEventDict;
if (replaceEvent.isEncrypted)
Expand All @@ -591,6 +593,9 @@ - (MXEvent*)editedEventFromReplacementEvent:(MXEvent*)replaceEvent
NSMutableDictionary *editedEventContentDict = [replaceEvent.wireContent mutableCopy];
[editedEventContentDict removeObjectForKey:@"m.relates_to"];
editedEventDict[@"content"] = editedEventContentDict;

// Reuse its decryption data
replaceEventDecryptionResult = [replaceEvent decryptionResult];
}
else if (event.content[@"body"] && newContentDict && [newContentDict[@"msgtype"] isEqualToString:event.content[@"msgtype"]])
{
Expand Down Expand Up @@ -630,6 +635,11 @@ - (MXEvent*)editedEventFromReplacementEvent:(MXEvent*)replaceEvent
}

editedEvent = [MXEvent modelFromJSON:editedEventDict];

if (replaceEventDecryptionResult)
{
[editedEvent setClearData:replaceEventDecryptionResult];
}
}

return editedEvent;
Expand Down Expand Up @@ -1001,6 +1011,24 @@ - (MXEncryptedContentFile*)getEncryptedContentFile
return encryptedContentFiles;
}

// Extract the decryption result that allowed to decrypt the event.
- (MXEventDecryptionResult*)decryptionResult
{
MXEventDecryptionResult *decryptionResult = [MXEventDecryptionResult new];

if (_clearEvent)
{
decryptionResult.clearEvent = _clearEvent.JSONDictionary;
decryptionResult.senderCurve25519Key = _clearEvent->senderCurve25519Key;
decryptionResult.claimedEd25519Key = _clearEvent->claimedEd25519Key;
decryptionResult.forwardingCurve25519KeyChain = _clearEvent->forwardingCurve25519KeyChain;
}

decryptionResult.error = _decryptionError;

return decryptionResult;
}

#pragma mark - private
- (NSMutableDictionary*)filterInEventWithKeys:(NSArray*)keys
{
Expand Down

0 comments on commit fbde49c

Please sign in to comment.