diff --git a/MatrixSDK/Crypto/Algorithms/MXEncrypting.h b/MatrixSDK/Crypto/Algorithms/MXEncrypting.h index dfd625aed5..7f3e74860d 100644 --- a/MatrixSDK/Crypto/Algorithms/MXEncrypting.h +++ b/MatrixSDK/Crypto/Algorithms/MXEncrypting.h @@ -60,7 +60,7 @@ @return a MXHTTPOperation instance. May be nil if all required materials is already in place. */ -- (MXHTTPOperation*)ensureSessionForUsers:(NSArray*)users +- (MXHTTPOperation*)ensureSessionForUsers:(NSArray*)users forceDistributeToUnverified: (BOOL) forceDistributeToUnverified success:(void (^)(NSObject *sessionInfo))success failure:(void (^)(NSError *error))failure; diff --git a/MatrixSDK/Crypto/Algorithms/Megolm/MXMegolmEncryption.m b/MatrixSDK/Crypto/Algorithms/Megolm/MXMegolmEncryption.m index 5c1c458935..18cf0220db 100644 --- a/MatrixSDK/Crypto/Algorithms/Megolm/MXMegolmEncryption.m +++ b/MatrixSDK/Crypto/Algorithms/Megolm/MXMegolmEncryption.m @@ -93,7 +93,8 @@ - (MXHTTPOperation*)encryptEventContent:(NSDictionary*)eventContent eventType:(M queuedEncryption.failure = failure; [pendingEncryptions addObject:queuedEncryption]; - return [self ensureSessionForUsers:users success:^(NSObject *sessionInfo) { + BOOL forceDistributeToUnverified = [self isVerificationEvent:eventType eventContent:eventContent]; + return [self ensureSessionForUsers:users forceDistributeToUnverified:forceDistributeToUnverified success:^(NSObject *sessionInfo) { MXOutboundSessionInfo *session = (MXOutboundSessionInfo*)sessionInfo; [self processPendingEncryptionsInSession:session withError:nil]; @@ -103,14 +104,37 @@ - (MXHTTPOperation*)encryptEventContent:(NSDictionary*)eventContent eventType:(M }]; } -- (MXHTTPOperation*)ensureSessionForUsers:(NSArray*)users +- (BOOL) isVerificationEvent:(MXEventTypeString) eventType eventContent:(NSDictionary*)eventContent +{ + switch ([MXTools eventType:eventType]) + { + case MXEventTypeKeyVerificationKey: + case MXEventTypeKeyVerificationMac: + case MXEventTypeKeyVerificationDone: + case MXEventTypeKeyVerificationReady: + case MXEventTypeKeyVerificationStart: + case MXEventTypeKeyVerificationAccept: + case MXEventTypeKeyVerificationCancel: { + return YES; + } + case MXEventTypeRoomMessage: { + NSString *msgType = eventContent[kMXMessageTypeKey]; + return [msgType isEqualToString:kMXMessageTypeKeyVerificationRequest]; + } + default: { + return NO; + } + } +} + +- (MXHTTPOperation*)ensureSessionForUsers:(NSArray*)users forceDistributeToUnverified: (BOOL) forceDistributeToUnverified success:(void (^)(NSObject *sessionInfo))success failure:(void (^)(NSError *error))failure { NSDate *startDate = [NSDate date]; MXHTTPOperation *operation; - operation = [self getDevicesInRoom:users success:^(MXUsersDevicesMap *devicesInRoom) { + operation = [self getDevicesInRoom:users forceDistributeToUnverified:forceDistributeToUnverified success:^(MXUsersDevicesMap *devicesInRoom) { MXHTTPOperation *operation2 = [self ensureOutboundSession:devicesInRoom success:^(MXOutboundSessionInfo *session) { @@ -166,6 +190,7 @@ - (BOOL)isSessionSharingHistory:(MXOutboundSessionInfo *)session @param failure A block object called when the operation fails. */ - (MXHTTPOperation *)getDevicesInRoom:(NSArray*)users + forceDistributeToUnverified: (BOOL) forceDistributeToUnverified success:(void (^)(MXUsersDevicesMap *devicesInRoom))success failure:(void (^)(NSError *))failure { @@ -198,7 +223,7 @@ - (MXHTTPOperation *)getDevicesInRoom:(NSArray*)users } if (deviceInfo.trustLevel.localVerificationStatus == MXDeviceBlocked - || (!deviceInfo.trustLevel.isVerified && encryptToVerifiedDevicesOnly)) + || (!deviceInfo.trustLevel.isVerified && encryptToVerifiedDevicesOnly && !forceDistributeToUnverified)) { // Remove any blocked devices MXLogDebug(@"[MXMegolmEncryption] getDevicesInRoom: blocked device: %@", deviceInfo); diff --git a/MatrixSDK/Crypto/Algorithms/Olm/MXOlmEncryption.m b/MatrixSDK/Crypto/Algorithms/Olm/MXOlmEncryption.m index ca372f439e..764208102f 100644 --- a/MatrixSDK/Crypto/Algorithms/Olm/MXOlmEncryption.m +++ b/MatrixSDK/Crypto/Algorithms/Olm/MXOlmEncryption.m @@ -62,7 +62,7 @@ - (MXHTTPOperation*)encryptEventContent:(NSDictionary*)eventContent eventType:(M failure:(void (^)(NSError *error))failure { MXWeakify(self); - return [self ensureSessionForUsers:users success:^(NSObject *sessionInfo) { + return [self ensureSessionForUsers:users forceDistributeToUnverified:NO success:^(NSObject *sessionInfo) { MXStrongifyAndReturnIfNil(self); NSMutableArray *participantDevices = [NSMutableArray array]; @@ -99,7 +99,7 @@ - (MXHTTPOperation*)encryptEventContent:(NSDictionary*)eventContent eventType:(M } failure:failure]; } -- (MXHTTPOperation*)ensureSessionForUsers:(NSArray*)users +- (MXHTTPOperation*)ensureSessionForUsers:(NSArray*)users forceDistributeToUnverified: (BOOL) forceDistributeToUnverified success:(void (^)(NSObject *sessionInfo))success failure:(void (^)(NSError *error))failure { diff --git a/MatrixSDK/Crypto/MXCrypto.m b/MatrixSDK/Crypto/MXCrypto.m index 2a95d0b2fa..50bf25aaba 100644 --- a/MatrixSDK/Crypto/MXCrypto.m +++ b/MatrixSDK/Crypto/MXCrypto.m @@ -757,7 +757,7 @@ - (MXHTTPOperation*)ensureEncryptionInRoom:(NSString*)roomId if (alg) { // Check we have everything to encrypt events - MXHTTPOperation *operation2 = [alg ensureSessionForUsers:userIds success:^(NSObject *sessionInfo) { + MXHTTPOperation *operation2 = [alg ensureSessionForUsers:userIds forceDistributeToUnverified:NO success:^(NSObject *sessionInfo) { if (success) { diff --git a/changelog.d/6519.bugfix b/changelog.d/6519.bugfix new file mode 100644 index 0000000000..08b1d1fe2e --- /dev/null +++ b/changelog.d/6519.bugfix @@ -0,0 +1 @@ +Can't verify user when option to send keys to verified devices only is selected