mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 07:42: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"
|
||||
|
||||
/**
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue