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"
/**
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.
*/
@ -39,6 +51,11 @@
*/
@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.
@ -85,3 +102,9 @@
failure:(void(^)(NSError*))failure;
@end
@protocol RoomDataSourceDelegate <MXKDataSourceDelegate>
- (void)roomDataSource:(RoomDataSource*)roomDataSource didUpdateEncryptionTrustLevel:(RoomEncryptionTrustLevel)roomEncryptionTrustLevel;
@end

View file

@ -44,6 +44,10 @@
// Timer used to debounce cells refresh
@property (nonatomic, strong) NSTimer *refreshCellsTimer;
@property (nonatomic, readonly) id<RoomDataSourceDelegate> roomDataSourceDelegate;
@property(nonatomic, readwrite) RoomEncryptionTrustLevel encryptionTrustLevel;
@end
@implementation RoomDataSource
@ -83,6 +87,9 @@
[self registerKeyVerificationRequestNotification];
[self registerDeviceVerificationTransactionNotification];
[self registerTrustLevelDidChangeNotifications];
self.encryptionTrustLevel = RoomEncryptionTrustLevelUnknown;
}
return self;
}
@ -105,6 +112,21 @@
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
@ -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 -
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section