RoomDataSource: Handle room members trust level for an encrypted room.

This commit is contained in:
SBiOSoftWhare 2020-01-22 16:21:47 +01:00
parent 49984278c5
commit 927a909f21
2 changed files with 127 additions and 0 deletions

View file

@ -19,6 +19,18 @@
#import "WidgetManager.h" #import "WidgetManager.h"
/**
RoomEncryptionTrustLevel represents the room members trust level in an encrypted room.
*/
typedef NS_ENUM(NSUInteger, RoomEncryptionTrustLevel) {
RoomEncryptionTrustLevelTrusted,
RoomEncryptionTrustLevelWarning,
RoomEncryptionTrustLevelNormal,
RoomEncryptionTrustLevelUnknown
};
@protocol RoomDataSourceDelegate;
/** /**
The data source for `RoomViewController` in Vector. The data source for `RoomViewController` in Vector.
*/ */
@ -39,6 +51,11 @@
*/ */
@property(nonatomic) BOOL showBubbleDateTimeOnSelection; @property(nonatomic) BOOL showBubbleDateTimeOnSelection;
/**
Current room members trust level for an encrypted room.
*/
@property(nonatomic, readonly) RoomEncryptionTrustLevel encryptionTrustLevel;
/** /**
Check if there is an active jitsi widget in the room and return it. Check if there is an active jitsi widget in the room and return it.
@ -85,3 +102,9 @@
failure:(void(^)(NSError*))failure; failure:(void(^)(NSError*))failure;
@end @end
@protocol RoomDataSourceDelegate <MXKDataSourceDelegate>
- (void)roomDataSource:(RoomDataSource*)roomDataSource didUpdateEncryptionTrustLevel:(RoomEncryptionTrustLevel)roomEncryptionTrustLevel;
@end

View file

@ -44,6 +44,10 @@
// Timer used to debounce cells refresh // Timer used to debounce cells refresh
@property (nonatomic, strong) NSTimer *refreshCellsTimer; @property (nonatomic, strong) NSTimer *refreshCellsTimer;
@property (nonatomic, readonly) id<RoomDataSourceDelegate> roomDataSourceDelegate;
@property(nonatomic, readwrite) RoomEncryptionTrustLevel encryptionTrustLevel;
@end @end
@implementation RoomDataSource @implementation RoomDataSource
@ -83,6 +87,9 @@
[self registerKeyVerificationRequestNotification]; [self registerKeyVerificationRequestNotification];
[self registerDeviceVerificationTransactionNotification]; [self registerDeviceVerificationTransactionNotification];
[self registerTrustLevelDidChangeNotifications];
self.encryptionTrustLevel = RoomEncryptionTrustLevelUnknown;
} }
return self; return self;
} }
@ -105,6 +112,21 @@
NSLog(@"[MXKRoomDataSource] finalizeRoomDataSource: Cannot retrieve all room members"); NSLog(@"[MXKRoomDataSource] finalizeRoomDataSource: Cannot retrieve all room members");
}]; }];
} }
if (self.room.summary.isEncrypted)
{
[self fetchEncryptionTrustedLevel];
}
}
- (id<RoomDataSourceDelegate>)roomDataSourceDelegate
{
if (!self.delegate || ![self.delegate conformsToProtocol:@protocol(RoomDataSourceDelegate)])
{
return nil;
}
return ((id<RoomDataSourceDelegate>)(self.delegate));
} }
- (void)updateEventFormatter - (void)updateEventFormatter
@ -167,6 +189,88 @@
} }
} }
#pragma mark Encryption trust level
- (void)registerTrustLevelDidChangeNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceInfoTrustLevelDidChange:) name:MXDeviceInfoTrustLevelDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(crossSigningInfoTrustLevelDidChange:) name:MXCrossSigningInfoTrustLevelDidChangeNotification object:nil];
}
- (void)deviceInfoTrustLevelDidChange:(NSNotification*)notification
{
MXDeviceInfo *deviceInfo = notification.object;
NSString *userId = deviceInfo.userId;
if (userId)
{
[self encryptionTrustLevelDidChangeRelatedToUserId:userId];
}
}
- (void)crossSigningInfoTrustLevelDidChange:(NSNotification*)notification
{
MXCrossSigningInfo *crossSigningInfo = notification.object;
NSString *userId = crossSigningInfo.userId;
if (userId)
{
[self encryptionTrustLevelDidChangeRelatedToUserId:userId];
}
}
- (void)fetchEncryptionTrustedLevel
{
[self encryptionTrustLevelDidChangeRelatedToUserId:self.mxSession.myUser.userId];
}
- (void)encryptionTrustLevelDidChangeRelatedToUserId:(NSString*)userId
{
if (!self.room.summary.isEncrypted)
{
return;
}
[self.room members:^(MXRoomMembers *roomMembers) {
MXRoomMember *roomMember = [roomMembers memberWithUserId:userId];
// If user belongs to the room refresh the trust level
if (roomMember)
{
[self.room trustedMembersProgressWithSuccess:^(NSProgress *trustedMembersProgress) {
RoomEncryptionTrustLevel roomEncryptionTrustLevel;
double trustedMembersPercentage = trustedMembersProgress.fractionCompleted;
if (trustedMembersPercentage >= 1.0)
{
roomEncryptionTrustLevel = RoomEncryptionTrustLevelTrusted;
}
else if (trustedMembersPercentage == 0.0)
{
roomEncryptionTrustLevel = RoomEncryptionTrustLevelNormal;
}
else
{
roomEncryptionTrustLevel = RoomEncryptionTrustLevelWarning;
}
self.encryptionTrustLevel = roomEncryptionTrustLevel;
[self.roomDataSourceDelegate roomDataSource:self didUpdateEncryptionTrustLevel:roomEncryptionTrustLevel];
} failure:^(NSError *error) {
NSLog(@"[RoomDataSource] trustLevelDidChangeRelatedToUserId fails to retrieve room members trusted progress");
}];
}
} failure:^(NSError *error) {
NSLog(@"[RoomDataSource] trustLevelDidChangeRelatedToUserId fails to retrieve room members");
}];
}
#pragma mark - #pragma mark -
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section