From 82c1578aaaa5b54b1ee0d152351a6bca018734bc Mon Sep 17 00:00:00 2001 From: manuroe Date: Thu, 30 Jan 2020 17:07:53 +0100 Subject: [PATCH 1/4] Room Shield: Use sync version of [MXRoom membersTrustLevelSummary:] https://github.com/vector-im/riot-ios/issues/2956 to break keys downloads in loop --- Riot/Modules/Room/DataSources/RoomDataSource.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.m b/Riot/Modules/Room/DataSources/RoomDataSource.m index 3bd0d0165..93b77ad81 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.m +++ b/Riot/Modules/Room/DataSources/RoomDataSource.m @@ -205,7 +205,7 @@ if (userId) { - [self encryptionTrustLevelDidChangeRelatedToUserId:userId]; + [self encryptionTrustLevelDidChangeRelatedToUserId:userId forceDownload:NO]; } } @@ -217,16 +217,16 @@ if (userId) { - [self encryptionTrustLevelDidChangeRelatedToUserId:userId]; + [self encryptionTrustLevelDidChangeRelatedToUserId:userId forceDownload:NO]; } } - (void)fetchEncryptionTrustedLevel { - [self encryptionTrustLevelDidChangeRelatedToUserId:self.mxSession.myUser.userId]; + [self encryptionTrustLevelDidChangeRelatedToUserId:self.mxSession.myUser.userId forceDownload:YES]; } -- (void)encryptionTrustLevelDidChangeRelatedToUserId:(NSString*)userId +- (void)encryptionTrustLevelDidChangeRelatedToUserId:(NSString*)userId forceDownload:(BOOL)forceDownload { if (!self.room.summary.isEncrypted) { @@ -239,7 +239,7 @@ // If user belongs to the room refresh the trust level if (roomMember) { - [self.room membersTrustLevelSummaryWithSuccess:^(MXUsersTrustLevelSummary *usersTrustLevelSummary) { + [self.room membersTrustLevelSummaryWithForceDownload:forceDownload success:^(MXUsersTrustLevelSummary *usersTrustLevelSummary) { RoomEncryptionTrustLevel roomEncryptionTrustLevel; From 23a23445fa5f2cbae705e78e07c4b626f8a439a5 Mon Sep 17 00:00:00 2001 From: manuroe Date: Thu, 30 Jan 2020 17:48:22 +0100 Subject: [PATCH 2/4] Shields: Shields in one self room should be green if I have no other device --- Riot/Modules/Room/DataSources/RoomDataSource.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.m b/Riot/Modules/Room/DataSources/RoomDataSource.m index 93b77ad81..175cff69a 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.m +++ b/Riot/Modules/Room/DataSources/RoomDataSource.m @@ -245,7 +245,8 @@ double trustedDevicesPercentage = usersTrustLevelSummary.trustedDevicesProgress.fractionCompleted; - if (trustedDevicesPercentage >= 1.0) + if (trustedDevicesPercentage >= 1.0 + || usersTrustLevelSummary.trustedDevicesProgress.totalUnitCount == 0) { roomEncryptionTrustLevel = RoomEncryptionTrustLevelTrusted; } From c70452661a4ac1d8a93c88d4412f527d7a7345f1 Mon Sep 17 00:00:00 2001 From: manuroe Date: Fri, 31 Jan 2020 14:59:54 +0100 Subject: [PATCH 3/4] Room decoration: Use shields instead of padlocks #2906 --- CHANGES.rst | 1 + Riot/AppDelegate.m | 1 + Riot/Categories/MXRoomSummary+Riot.h | 18 +++++ Riot/Categories/MXRoomSummary+Riot.m | 27 +++++++ .../Recents/Views/RecentTableViewCell.m | 38 ++++++++- .../Home/Views/RoomCollectionViewCell.m | 38 ++++++++- .../Modules/Room/DataSources/RoomDataSource.h | 10 +-- .../Modules/Room/DataSources/RoomDataSource.m | 80 +++---------------- .../Listing/Views/RecentRoomTableViewCell.m | 38 ++++++++- 9 files changed, 170 insertions(+), 81 deletions(-) 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 From fb97b498c615dfe25831bede5514aab19871a36b Mon Sep 17 00:00:00 2001 From: manuroe Date: Fri, 31 Jan 2020 16:20:28 +0100 Subject: [PATCH 4/4] Room decoration: Make shields bigger --- .../Recents/Views/RecentTableViewCell.xib | 18 +++++++++--------- .../Home/Views/RoomCollectionViewCell.xib | 17 ++++++++--------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib index 0303e1aca..8fd41d271 100644 --- a/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib +++ b/Riot/Modules/Common/Recents/Views/RecentTableViewCell.xib @@ -1,11 +1,11 @@ - + - + @@ -75,10 +75,10 @@ @@ -112,11 +112,11 @@ - + - + diff --git a/Riot/Modules/Home/Views/RoomCollectionViewCell.xib b/Riot/Modules/Home/Views/RoomCollectionViewCell.xib index b0c964fa1..ea0162bc9 100644 --- a/Riot/Modules/Home/Views/RoomCollectionViewCell.xib +++ b/Riot/Modules/Home/Views/RoomCollectionViewCell.xib @@ -1,12 +1,11 @@ - + - - + @@ -39,7 +38,7 @@ - + @@ -108,7 +107,7 @@ - +