diff --git a/CHANGES.rst b/CHANGES.rst index 2c9f973b5..a1ec981a5 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,7 @@ Improvements: * ON/OFF Cross-signing development in a Lab setting (#2855). * RoomVC: Update encryption decoration with shields (#2934, #2930, #2906). * Settings: Remove "End-to-End Encryption" from the LABS section (#2941). + * Room decoration: Use shields instead of padlocks (#2906). Changes in 0.10.4 (2019-12-11) =============================================== diff --git a/Riot/AppDelegate.m b/Riot/AppDelegate.m index ddde73e32..779442d16 100644 --- a/Riot/AppDelegate.m +++ b/Riot/AppDelegate.m @@ -266,6 +266,7 @@ NSString *const AppDelegateDidValidateEmailNotificationClientSecretKey = @"AppDe // Set the App Group identifier. MXSDKOptions *sdkOptions = [MXSDKOptions sharedInstance]; sdkOptions.applicationGroupIdentifier = @"group.im.vector"; + sdkOptions.computeE2ERoomSummaryTrust = YES; // Redirect NSLogs to files only if we are not debugging if (!isatty(STDERR_FILENO)) diff --git a/Riot/Categories/MXRoomSummary+Riot.h b/Riot/Categories/MXRoomSummary+Riot.h index 804a6a6be..c69617bf5 100644 --- a/Riot/Categories/MXRoomSummary+Riot.h +++ b/Riot/Categories/MXRoomSummary+Riot.h @@ -16,6 +16,17 @@ #import +/** + RoomEncryptionTrustLevel represents the trust level in an encrypted room. + */ +typedef NS_ENUM(NSUInteger, RoomEncryptionTrustLevel) { + RoomEncryptionTrustLevelTrusted, + RoomEncryptionTrustLevelWarning, + RoomEncryptionTrustLevelNormal, + RoomEncryptionTrustLevelUnknown +}; + + /** Define a `MXRoomSummary` category at Riot level. */ @@ -32,4 +43,11 @@ */ - (void)setRoomAvatarImageIn:(MXKImageView*)mxkImageView; +/** + Get the trust level in the room. + + @return the trust level. + */ +- (RoomEncryptionTrustLevel)roomEncryptionTrustLevel; + @end diff --git a/Riot/Categories/MXRoomSummary+Riot.m b/Riot/Categories/MXRoomSummary+Riot.m index 0367f2436..fb13dccc4 100644 --- a/Riot/Categories/MXRoomSummary+Riot.m +++ b/Riot/Categories/MXRoomSummary+Riot.m @@ -47,4 +47,31 @@ mxkImageView.contentMode = UIViewContentModeScaleAspectFill; } +- (RoomEncryptionTrustLevel)roomEncryptionTrustLevel +{ + RoomEncryptionTrustLevel roomEncryptionTrustLevel = RoomEncryptionTrustLevelUnknown; + if (self.trust) + { + double trustedDevicesPercentage = self.trust.trustedDevicesProgress.fractionCompleted; + + if (trustedDevicesPercentage >= 1.0 + || self.trust.trustedDevicesProgress.totalUnitCount == 0) + { + roomEncryptionTrustLevel = RoomEncryptionTrustLevelTrusted; + } + else if (trustedDevicesPercentage == 0.0) + { + roomEncryptionTrustLevel = RoomEncryptionTrustLevelNormal; + } + else + { + roomEncryptionTrustLevel = RoomEncryptionTrustLevelWarning; + } + + roomEncryptionTrustLevel = roomEncryptionTrustLevel; + } + + return roomEncryptionTrustLevel; +} + @end diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m index 1f7e1b443..a33e0e5e0 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.m @@ -137,7 +137,15 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; self.directRoomBorderView.hidden = !roomCellData.roomSummary.room.isDirect; - self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted; + if (roomCellData.roomSummary.isEncrypted) + { + self.encryptedRoomIcon.hidden = NO; + self.encryptedRoomIcon.image = [self shieldImageForTrustLevel:roomCellData.roomSummary.roomEncryptionTrustLevel]; + } + else + { + self.encryptedRoomIcon.hidden = YES; + } [roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar]; } @@ -153,4 +161,32 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; return 74; } +- (UIImage*)shieldImageForTrustLevel:(RoomEncryptionTrustLevel)roomEncryptionTrustLevel +{ + UIImage *shieldImage; + + NSString *encryptionIconName; + switch (roomEncryptionTrustLevel) + { + case RoomEncryptionTrustLevelWarning: + encryptionIconName = @"encryption_warning"; + break; + case RoomEncryptionTrustLevelNormal: + encryptionIconName = @"encryption_normal"; + break; + case RoomEncryptionTrustLevelTrusted: + encryptionIconName = @"encryption_trusted"; + break; + case RoomEncryptionTrustLevelUnknown: + encryptionIconName = @"encryption_normal"; + break; + } + + if (encryptionIconName) + { + shieldImage = [UIImage imageNamed:encryptionIconName]; + } + return shieldImage; +} + @end diff --git a/Riot/Modules/Home/Views/RoomCollectionViewCell.m b/Riot/Modules/Home/Views/RoomCollectionViewCell.m index 5c6ed3aa3..8bd307ecf 100644 --- a/Riot/Modules/Home/Views/RoomCollectionViewCell.m +++ b/Riot/Modules/Home/Views/RoomCollectionViewCell.m @@ -159,7 +159,15 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; self.directRoomBorderView.hidden = !roomCellData.roomSummary.room.isDirect; - self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted; + if (roomCellData.roomSummary.isEncrypted) + { + self.encryptedRoomIcon.hidden = NO; + self.encryptedRoomIcon.image = [self shieldImageForTrustLevel:roomCellData.roomSummary.roomEncryptionTrustLevel]; + } + else + { + self.encryptedRoomIcon.hidden = YES; + } [roomCellData.roomSummary setRoomAvatarImageIn:self.roomAvatar]; } @@ -207,5 +215,33 @@ static const CGFloat kDirectRoomBorderWidth = 3.0; return nil; } +- (UIImage*)shieldImageForTrustLevel:(RoomEncryptionTrustLevel)roomEncryptionTrustLevel +{ + UIImage *shieldImage; + + NSString *encryptionIconName; + switch (roomEncryptionTrustLevel) + { + case RoomEncryptionTrustLevelWarning: + encryptionIconName = @"encryption_warning"; + break; + case RoomEncryptionTrustLevelNormal: + encryptionIconName = @"encryption_normal"; + break; + case RoomEncryptionTrustLevelTrusted: + encryptionIconName = @"encryption_trusted"; + break; + case RoomEncryptionTrustLevelUnknown: + encryptionIconName = @"encryption_normal"; + break; + } + + if (encryptionIconName) + { + shieldImage = [UIImage imageNamed:encryptionIconName]; + } + return shieldImage; +} + @end diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.h b/Riot/Modules/Room/DataSources/RoomDataSource.h index ab09e2d2f..37ec55cbf 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.h +++ b/Riot/Modules/Room/DataSources/RoomDataSource.h @@ -19,15 +19,7 @@ #import "WidgetManager.h" -/** - RoomEncryptionTrustLevel represents the room members trust level in an encrypted room. - */ -typedef NS_ENUM(NSUInteger, RoomEncryptionTrustLevel) { - RoomEncryptionTrustLevelTrusted, - RoomEncryptionTrustLevelWarning, - RoomEncryptionTrustLevelNormal, - RoomEncryptionTrustLevelUnknown -}; +#import "MXRoomSummary+Riot.h" @protocol RoomDataSourceDelegate; diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.m b/Riot/Modules/Room/DataSources/RoomDataSource.m index 175cff69a..e38abb761 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.m +++ b/Riot/Modules/Room/DataSources/RoomDataSource.m @@ -112,7 +112,7 @@ NSLog(@"[MXKRoomDataSource] finalizeRoomDataSource: Cannot retrieve all room members"); }]; } - + if (self.room.summary.isEncrypted) { [self fetchEncryptionTrustedLevel]; @@ -193,85 +193,27 @@ - (void)registerTrustLevelDidChangeNotifications { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceInfoTrustLevelDidChange:) name:MXDeviceInfoTrustLevelDidChangeNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(crossSigningInfoTrustLevelDidChange:) name:MXCrossSigningInfoTrustLevelDidChangeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(roomSummaryDidChange:) name:kMXRoomSummaryDidChangeNotification object:self.room.summary]; } -- (void)deviceInfoTrustLevelDidChange:(NSNotification*)notification -{ - MXDeviceInfo *deviceInfo = notification.object; - - NSString *userId = deviceInfo.userId; - - if (userId) - { - [self encryptionTrustLevelDidChangeRelatedToUserId:userId forceDownload:NO]; - } -} -- (void)crossSigningInfoTrustLevelDidChange:(NSNotification*)notification -{ - MXCrossSigningInfo *crossSigningInfo = notification.object; - - NSString *userId = crossSigningInfo.userId; - - if (userId) - { - [self encryptionTrustLevelDidChangeRelatedToUserId:userId forceDownload:NO]; - } -} - -- (void)fetchEncryptionTrustedLevel -{ - [self encryptionTrustLevelDidChangeRelatedToUserId:self.mxSession.myUser.userId forceDownload:YES]; -} - -- (void)encryptionTrustLevelDidChangeRelatedToUserId:(NSString*)userId forceDownload:(BOOL)forceDownload +- (void)roomSummaryDidChange:(NSNotification*)notification { 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 membersTrustLevelSummaryWithForceDownload:forceDownload success:^(MXUsersTrustLevelSummary *usersTrustLevelSummary) { - - RoomEncryptionTrustLevel roomEncryptionTrustLevel; - - double trustedDevicesPercentage = usersTrustLevelSummary.trustedDevicesProgress.fractionCompleted; - - if (trustedDevicesPercentage >= 1.0 - || usersTrustLevelSummary.trustedDevicesProgress.totalUnitCount == 0) - { - roomEncryptionTrustLevel = RoomEncryptionTrustLevelTrusted; - } - else if (trustedDevicesPercentage == 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"); - }]; + [self fetchEncryptionTrustedLevel]; } +- (void)fetchEncryptionTrustedLevel +{ + self.encryptionTrustLevel = self.room.summary.roomEncryptionTrustLevel; + [self.roomDataSourceDelegate roomDataSource:self didUpdateEncryptionTrustLevel:self.encryptionTrustLevel]; +} + + #pragma mark - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section diff --git a/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m b/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m index 4796cc841..48db29100 100644 --- a/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m +++ b/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m @@ -71,7 +71,15 @@ self.directRoomBorderView.hidden = !roomCellData.roomSummary.isDirect; - self.encryptedRoomIcon.hidden = !roomCellData.roomSummary.isEncrypted; + if (roomCellData.roomSummary.isEncrypted) + { + self.encryptedRoomIcon.hidden = NO; + self.encryptedRoomIcon.image = [self shieldImageForTrustLevel:roomCellData.roomSummary.roomEncryptionTrustLevel]; + } + else + { + self.encryptedRoomIcon.hidden = YES; + } } } @@ -80,4 +88,32 @@ return 74; } +- (UIImage*)shieldImageForTrustLevel:(RoomEncryptionTrustLevel)roomEncryptionTrustLevel +{ + UIImage *shieldImage; + + NSString *encryptionIconName; + switch (roomEncryptionTrustLevel) + { + case RoomEncryptionTrustLevelWarning: + encryptionIconName = @"encryption_warning"; + break; + case RoomEncryptionTrustLevelNormal: + encryptionIconName = @"encryption_normal"; + break; + case RoomEncryptionTrustLevelTrusted: + encryptionIconName = @"encryption_trusted"; + break; + case RoomEncryptionTrustLevelUnknown: + encryptionIconName = @"encryption_normal"; + break; + } + + if (encryptionIconName) + { + shieldImage = [UIImage imageNamed:encryptionIconName]; + } + return shieldImage; +} + @end