mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 15:52:40 +00:00
RoomDataSource: Handle room members trust level for an encrypted room.
This commit is contained in:
parent
49984278c5
commit
927a909f21
2 changed files with 127 additions and 0 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue