Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor verification manager, requests, transactions #1599

Merged
merged 3 commits into from
Oct 6, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Refactor verification manager, requests, transactions
  • Loading branch information
Anderas committed Oct 6, 2022
commit ee35c54fbdcf70215e22ee6bce0a3c3f30d1e731
2 changes: 1 addition & 1 deletion MatrixSDK/Crypto/MXCrypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ extern NSString *const MXDeviceListDidUpdateUsersDevicesNotification;
/**
The device verification manager.
*/
@property (nonatomic, readonly) MXKeyVerificationManager *keyVerificationManager;
@property (nonatomic, readonly) id<MXKeyVerificationManager> keyVerificationManager;

/**
Service to manage backup of private keys on the homeserver.
Expand Down
2 changes: 1 addition & 1 deletion MatrixSDK/Crypto/MXCrypto.m
Original file line number Diff line number Diff line change
Expand Up @@ -2052,7 +2052,7 @@ - (instancetype)initWithMatrixSession:(MXSession*)matrixSession cryptoQueue:(dis
unrequestedForwardedRoomKeyManager = [[MXUnrequestedForwardedRoomKeyManager alloc] init];
unrequestedForwardedRoomKeyManager.delegate = self;

_keyVerificationManager = [[MXKeyVerificationManager alloc] initWithCrypto:self];
_keyVerificationManager = [[MXLegacyKeyVerificationManager alloc] initWithCrypto:self];

_secretStorage = [[MXSecretStorage alloc] initWithMatrixSession:_mxSession processingQueue:_cryptoQueue];
_secretShareManager = [[MXSecretShareManager alloc] initWithCrypto:self];
Expand Down
9 changes: 6 additions & 3 deletions MatrixSDK/Crypto/Verification/MXKeyVerificationManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,11 @@ FOUNDATION_EXPORT NSString *const MXKeyVerificationManagerNotificationTransactio


/**
The `MXKeyVerificationManager` class instance manages interactive key
The `MXKeyVerificationManager` protocol specifies interactive key
verifications according to MSC1267 (Interactive key verification):
https://github.com/matrix-org/matrix-doc/issues/1267.
*/
@interface MXKeyVerificationManager : NSObject

@protocol MXKeyVerificationManager <NSObject>

#pragma mark - Requests

Expand Down Expand Up @@ -198,4 +197,8 @@ FOUNDATION_EXPORT NSString *const MXKeyVerificationManagerNotificationTransactio

@end

@interface MXLegacyKeyVerificationManager : NSObject <MXKeyVerificationManager>

@end

NS_ASSUME_NONNULL_END
64 changes: 32 additions & 32 deletions MatrixSDK/Crypto/Verification/MXKeyVerificationManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,19 @@
static NSArray<MXEventTypeString> *kMXKeyVerificationManagerVerificationEventTypes;


@interface MXKeyVerificationManager ()
@interface MXLegacyKeyVerificationManager ()
{
// The queue to run background tasks
dispatch_queue_t cryptoQueue;

// All running transactions
MXUsersDevicesMap<MXDefaultKeyVerificationTransaction *> *transactions;
MXUsersDevicesMap<MXLegacyKeyVerificationTransaction *> *transactions;
// Timer to cancel transactions
NSTimer *transactionTimeoutTimer;

// All pending requests
// Request id -> request
NSMutableDictionary<NSString*, MXDefaultKeyVerificationRequest*> *pendingRequestsMap;
NSMutableDictionary<NSString*, MXLegacyKeyVerificationRequest*> *pendingRequestsMap;

// Timer to cancel requests
NSTimer *requestTimeoutTimer;
Expand All @@ -87,7 +87,7 @@ @interface MXKeyVerificationManager ()

@end

@implementation MXKeyVerificationManager
@implementation MXLegacyKeyVerificationManager

#pragma mark - Public methods -

Expand Down Expand Up @@ -241,7 +241,7 @@ - (void)requestVerificationByDMWithUserId2:(NSString*)userId
MXRoom *room = [self.crypto.mxSession roomWithRoomId:roomId];
MXEvent *event = [room fakeRoomMessageEventWithEventId:eventId andContent:request.JSONDictionary threadId:nil];

MXDefaultKeyVerificationRequest *request = [self verificationRequestInDMEvent:event];
MXLegacyKeyVerificationRequest *request = [self verificationRequestInDMEvent:event];
[request updateState:MXKeyVerificationRequestStatePending notifiy:YES];
[self addPendingRequest:request notify:NO];

Expand Down Expand Up @@ -582,7 +582,7 @@ - (nullable NSString *)keyVerificationIdFromDMEvent:(MXEvent*)event
- (nullable MXKeyVerification *)pendingKeyVerificationWithKeyVerificationId:(NSString*)keyVerificationId
{
id<MXKeyVerificationTransaction> transaction = [self transactionWithTransactionId:keyVerificationId];
MXDefaultKeyVerificationRequest *request = [self pendingRequestWithRequestId:keyVerificationId];
MXLegacyKeyVerificationRequest *request = [self pendingRequestWithRequestId:keyVerificationId];

return [self->statusResolver keyVerificationFromRequest:request andTransaction:transaction];
}
Expand Down Expand Up @@ -777,9 +777,9 @@ - (void)cancelTransaction:(id<MXKeyVerificationTransaction>)transaction

[self sendToOtherInTransaction:transaction eventType:kMXEventTypeStringKeyVerificationCancel content:cancel.JSONDictionary success:^{

if ([transaction isKindOfClass:[MXDefaultKeyVerificationTransaction class]])
if ([transaction isKindOfClass:[MXLegacyKeyVerificationTransaction class]])
{
((MXDefaultKeyVerificationTransaction *)transaction).reasonCancelCode = code;
((MXLegacyKeyVerificationTransaction *)transaction).reasonCancelCode = code;
}
else
{
Expand Down Expand Up @@ -946,7 +946,7 @@ - (void)handleReadyEvent:(MXEvent*)event isToDeviceEvent:(BOOL)isToDeviceEvent
}

NSString *requestId = keyVerificationReady.transactionId;
MXDefaultKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
MXLegacyKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];

if (request)
{
Expand Down Expand Up @@ -982,15 +982,15 @@ - (void)handleCancelEvent:(MXEvent*)event

if (cancelContent)
{
MXDefaultKeyVerificationTransaction *transaction = [self transactionWithTransactionId:cancelContent.transactionId];
MXLegacyKeyVerificationTransaction *transaction = [self transactionWithTransactionId:cancelContent.transactionId];
if (transaction)
{
[transaction handleCancel:cancelContent];
[self removeTransactionWithTransactionId:transaction.transactionId];
}

NSString *requestId = cancelContent.transactionId;
MXDefaultKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
MXLegacyKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
if (request)
{
[request handleCancel:cancelContent];
Expand Down Expand Up @@ -1040,7 +1040,7 @@ - (void)handleSASKeyVerificationStart:(MXSASKeyVerificationStart*)keyVerificatio
}

NSString *requestId = keyVerificationStart.transactionId;
MXDefaultKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
MXLegacyKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
if (request)
{
// We have a start response. The request is complete
Expand Down Expand Up @@ -1146,7 +1146,7 @@ - (void)handleAcceptEvent:(MXEvent*)event

if (acceptContent)
{
MXDefaultSASTransaction *transaction = [self sasTransactionWithTransactionId:acceptContent.transactionId];
MXLegacySASTransaction *transaction = [self sasTransactionWithTransactionId:acceptContent.transactionId];
if (transaction)
{
[transaction handleAccept:acceptContent];
Expand All @@ -1171,7 +1171,7 @@ - (void)handleKeyEvent:(MXEvent*)event

if (keyContent)
{
MXDefaultSASTransaction *transaction = [self sasTransactionWithTransactionId:keyContent.transactionId];
MXLegacySASTransaction *transaction = [self sasTransactionWithTransactionId:keyContent.transactionId];
if (transaction)
{
[transaction handleKey:keyContent];
Expand All @@ -1196,7 +1196,7 @@ - (void)handleMacEvent:(MXEvent*)event

if (macContent)
{
MXDefaultSASTransaction *transaction = [self sasTransactionWithTransactionId:macContent.transactionId];
MXLegacySASTransaction *transaction = [self sasTransactionWithTransactionId:macContent.transactionId];
if (transaction)
{
[transaction handleMac:macContent];
Expand Down Expand Up @@ -1265,7 +1265,7 @@ - (void)handleQRCodeKeyVerificationStart:(MXQRCodeKeyVerificationStart*)keyVerif
}

NSString *requestId = keyVerificationStart.transactionId;
MXDefaultKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
MXLegacyKeyVerificationRequest *request = [self pendingRequestWithRequestId:requestId];
if (request)
{
// We have a start response. The request is complete
Expand Down Expand Up @@ -1543,7 +1543,7 @@ - (void)computeReadyMethodsFromVerificationRequestWithId:(NSString*)transactionI
andSupportedMethods:(NSArray<NSString*>*)supportedMethods
completion:(void (^)(NSArray<NSString*>* readyMethods, MXQRCodeData *qrCodeData))completion;
{
MXDefaultKeyVerificationRequest *keyVerificationRequest = [self pendingRequestWithRequestId:transactionId];
MXLegacyKeyVerificationRequest *keyVerificationRequest = [self pendingRequestWithRequestId:transactionId];

if (!keyVerificationRequest)
{
Expand Down Expand Up @@ -1675,7 +1675,7 @@ - (nullable MXKeyVerificationByDMRequest*)verificationRequestInDMEvent:(MXEvent*
return request;
}

- (nullable MXDefaultKeyVerificationRequest*)pendingRequestWithRequestId:(NSString*)requestId
- (nullable MXLegacyKeyVerificationRequest*)pendingRequestWithRequestId:(NSString*)requestId
{
return pendingRequestsMap[requestId];
}
Expand Down Expand Up @@ -1714,7 +1714,7 @@ - (void)removePendingRequestWithRequestId:(NSString*)requestId
- (nullable NSDate*)oldestRequestDate
{
NSDate *oldestRequestDate;
for (MXDefaultKeyVerificationRequest *request in pendingRequestsMap.allValues)
for (MXLegacyKeyVerificationRequest *request in pendingRequestsMap.allValues)
{
if (!oldestRequestDate
|| request.timestamp < oldestRequestDate.timeIntervalSince1970)
Expand All @@ -1725,7 +1725,7 @@ - (nullable NSDate*)oldestRequestDate
return oldestRequestDate;
}

- (BOOL)isRequestStillValid:(MXDefaultKeyVerificationRequest *)request
- (BOOL)isRequestStillValid:(MXLegacyKeyVerificationRequest *)request
{
NSDate *requestDate = [NSDate dateWithTimeIntervalSince1970:(request.timestamp / 1000)];
return (requestDate.timeIntervalSinceNow > -_requestTimeout);
Expand Down Expand Up @@ -1773,7 +1773,7 @@ - (void)onRequestTimeoutTimer
- (void)checkRequestTimeoutsWithCompletion:(dispatch_block_t)completionBlock
{
dispatch_group_t group = dispatch_group_create();
for (MXDefaultKeyVerificationRequest *request in pendingRequestsMap.allValues)
for (MXLegacyKeyVerificationRequest *request in pendingRequestsMap.allValues)
{
if (![self isRequestStillValid:request])
{
Expand Down Expand Up @@ -1804,10 +1804,10 @@ - (void)checkRequestTimeoutsWithCompletion:(dispatch_block_t)completionBlock
return [transactions objectsForUser:userId];
}

- (MXDefaultKeyVerificationTransaction *)transactionWithTransactionId:(NSString*)transactionId
- (MXLegacyKeyVerificationTransaction *)transactionWithTransactionId:(NSString*)transactionId
{
MXDefaultKeyVerificationTransaction *transaction;
for (MXDefaultKeyVerificationTransaction *t in transactions.allObjects)
MXLegacyKeyVerificationTransaction *transaction;
for (MXLegacyKeyVerificationTransaction *t in transactions.allObjects)
{
if ([t.transactionId isEqualToString:transactionId])
{
Expand All @@ -1819,15 +1819,15 @@ - (MXDefaultKeyVerificationTransaction *)transactionWithTransactionId:(NSString*
return transaction;
}

- (MXDefaultSASTransaction *)sasTransactionWithTransactionId:(NSString*)transactionId
- (MXLegacySASTransaction *)sasTransactionWithTransactionId:(NSString*)transactionId
{
MXDefaultSASTransaction *sasTransaction;
MXLegacySASTransaction *sasTransaction;

MXDefaultKeyVerificationTransaction *transaction = [self transactionWithTransactionId:transactionId];
MXLegacyKeyVerificationTransaction *transaction = [self transactionWithTransactionId:transactionId];

if ([transaction isKindOfClass:[MXDefaultSASTransaction class]])
if ([transaction isKindOfClass:[MXLegacySASTransaction class]])
{
sasTransaction = (MXDefaultSASTransaction *)transaction;
sasTransaction = (MXLegacySASTransaction *)transaction;
}

return sasTransaction;
Expand Down Expand Up @@ -1873,7 +1873,7 @@ - (void)removeTransactionWithTransactionId:(NSString*)transactionId
- (nullable NSDate*)oldestTransactionCreationDate
{
NSDate *oldestCreationDate;
for (MXDefaultKeyVerificationTransaction *transaction in transactions.allObjects)
for (MXLegacyKeyVerificationTransaction *transaction in transactions.allObjects)
{
if (!oldestCreationDate
|| transaction.creationDate.timeIntervalSince1970 < oldestCreationDate.timeIntervalSince1970)
Expand All @@ -1884,7 +1884,7 @@ - (nullable NSDate*)oldestTransactionCreationDate
return oldestCreationDate;
}

- (BOOL)isCreationDateValid:(MXDefaultKeyVerificationTransaction *)transaction
- (BOOL)isCreationDateValid:(MXLegacyKeyVerificationTransaction *)transaction
{
return (transaction.creationDate.timeIntervalSinceNow > -MXTransactionTimeout);
}
Expand Down Expand Up @@ -1948,7 +1948,7 @@ - (void)onTransactionTimeoutTimer

- (void)checkTransactionTimeouts
{
for (MXDefaultKeyVerificationTransaction *transaction in transactions.allObjects)
for (MXLegacyKeyVerificationTransaction *transaction in transactions.allObjects)
{
if (![self isCreationDateValid:transaction])
{
Expand Down
24 changes: 12 additions & 12 deletions MatrixSDK/Crypto/Verification/MXKeyVerificationManagerV2.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ enum MXKeyVerificationUpdateResult {

typealias MXCryptoVerification = MXCryptoVerificationRequesting & MXCryptoSASVerifying

class MXKeyVerificationManagerV2: MXKeyVerificationManager {
class MXKeyVerificationManagerV2: NSObject, MXKeyVerificationManager {
enum Error: Swift.Error {
case notSupported
}
Expand Down Expand Up @@ -89,7 +89,7 @@ class MXKeyVerificationManagerV2: MXKeyVerificationManager {
updatePendingVerification()
}

override func requestVerificationByToDevice(
func requestVerificationByToDevice(
withUserId userId: String,
deviceIds: [String]?,
methods: [String],
Expand Down Expand Up @@ -121,7 +121,7 @@ class MXKeyVerificationManagerV2: MXKeyVerificationManager {
}
}

override func requestVerificationByDM(
func requestVerificationByDM(
withUserId userId: String,
roomId: String?,
fallbackText: String,
Expand Down Expand Up @@ -153,18 +153,18 @@ class MXKeyVerificationManagerV2: MXKeyVerificationManager {
}
}

override func beginKeyVerification(
func beginKeyVerification(
withUserId userId: String,
andDeviceId deviceId: String,
method: String,
success: @escaping (MXKeyVerificationTransaction) -> Void,
failure: @escaping (Swift.Error) -> Void
) {
log.debug("Not implemented")
success(MXDefaultKeyVerificationTransaction())
success(MXLegacyKeyVerificationTransaction())
}

override func beginKeyVerification(
func beginKeyVerification(
from request: MXKeyVerificationRequest,
method: String,
success: @escaping (MXKeyVerificationTransaction) -> Void,
Expand All @@ -189,15 +189,15 @@ class MXKeyVerificationManagerV2: MXKeyVerificationManager {
}
}

override var pendingRequests: [MXKeyVerificationRequest] {
var pendingRequests: [MXKeyVerificationRequest] {
return Array(activeRequests.values)
}

override func transactions(_ complete: @escaping ([MXKeyVerificationTransaction]) -> Void) {
func transactions(_ complete: @escaping ([MXKeyVerificationTransaction]) -> Void) {
complete(Array(activeTransactions.values))
}

override func keyVerification(
func keyVerification(
fromKeyVerificationEvent event: MXEvent,
success: @escaping (MXKeyVerification) -> Void,
failure: @escaping (Swift.Error) -> Void
Expand All @@ -207,16 +207,16 @@ class MXKeyVerificationManagerV2: MXKeyVerificationManager {
return MXHTTPOperation()
}

override func qrCodeTransaction(withTransactionId transactionId: String) -> MXQRCodeTransaction? {
func qrCodeTransaction(withTransactionId transactionId: String) -> MXQRCodeTransaction? {
log.debug("Not implemented")
return nil
}

override func removeQRCodeTransaction(withTransactionId transactionId: String) {
func removeQRCodeTransaction(withTransactionId transactionId: String) {
log.debug("Not implemented")
}

override func notifyOthersOfAcceptance(withTransactionId transactionId: String, acceptedUserId: String, acceptedDeviceId: String, success: @escaping () -> Void, failure: @escaping (Swift.Error) -> Void) {
func notifyOthersOfAcceptance(withTransactionId transactionId: String, acceptedUserId: String, acceptedDeviceId: String, success: @escaping () -> Void, failure: @escaping (Swift.Error) -> Void) {
log.debug("Not implemented")
success()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
The `MXKeyBackup_Private` extension exposes internal operations.
*/
@interface MXKeyVerificationManager ()
@interface MXLegacyKeyVerificationManager ()

/**
The Matrix crypto.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,16 @@
#import "MXKeyVerificationRequest.h"
#import "MXKeyVerificationRequestByDMJSONModel.h"

@class MXEvent, MXKeyVerificationManager;
@class MXEvent;


NS_ASSUME_NONNULL_BEGIN

/**
An handler on an interactive request for verification by Direct Message.
*/
@interface MXKeyVerificationByDMRequest : MXDefaultKeyVerificationRequest
@interface MXKeyVerificationByDMRequest : MXLegacyKeyVerificationRequest

@property (nonatomic, readonly) NSString *roomId;
@property (nonatomic, readonly) NSString *eventId;

@property (nonatomic, readonly) MXKeyVerificationRequestByDMJSONModel *request;
Expand Down
Loading