diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 7b8ae8c5f..ee035771c 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -324,9 +324,10 @@ B1963B30228F1C4900CBA17F /* BubbleReactionsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B1963B2A228F1C4800CBA17F /* BubbleReactionsView.xib */; }; B1963B32228F1C6B00CBA17F /* BubbleReactionsViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1963B31228F1C6B00CBA17F /* BubbleReactionsViewModelType.swift */; }; B1963B3822933BC800CBA17F /* AutosizedCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1963B3722933BC800CBA17F /* AutosizedCollectionView.swift */; }; - B19664BC24AB4B0900C9DE90 /* KeyVerificationSetupBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19664BB24AB4B0900C9DE90 /* KeyVerificationSetupBannerCell.swift */; }; - B19664BE24AB531000C9DE90 /* KeyVerificationSetupBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B19664BD24AB531000C9DE90 /* KeyVerificationSetupBannerCell.xib */; }; - B19664C024AB62CD00C9DE90 /* KeyVerificationBannerPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19664BF24AB62CD00C9DE90 /* KeyVerificationBannerPreferences.swift */; }; + B19664BC24AB4B0900C9DE90 /* CrossSigningSetupBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19664BB24AB4B0900C9DE90 /* CrossSigningSetupBannerCell.swift */; }; + B19664BE24AB531000C9DE90 /* CrossSigningSetupBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B19664BD24AB531000C9DE90 /* CrossSigningSetupBannerCell.xib */; }; + B19664C024AB62CD00C9DE90 /* CrossSigningBannerPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19664BF24AB62CD00C9DE90 /* CrossSigningBannerPreferences.swift */; }; + B19664C324ABC6C900C9DE90 /* CrossSigningService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19664C224ABC6C900C9DE90 /* CrossSigningService.swift */; }; B197B7C6243DE947005ABBF3 /* EncryptionTrustLevelBadgeImageHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B197B7C5243DE947005ABBF3 /* EncryptionTrustLevelBadgeImageHelper.swift */; }; B19C4E6F248F79EF009A423F /* SecretsRecoveryCoordinatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19C4E6D248F79EE009A423F /* SecretsRecoveryCoordinatorType.swift */; }; B19C4E70248F79EF009A423F /* SecretsRecoveryCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19C4E6E248F79EF009A423F /* SecretsRecoveryCoordinator.swift */; }; @@ -1227,9 +1228,10 @@ B1963B2A228F1C4800CBA17F /* BubbleReactionsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BubbleReactionsView.xib; sourceTree = ""; }; B1963B31228F1C6B00CBA17F /* BubbleReactionsViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubbleReactionsViewModelType.swift; sourceTree = ""; }; B1963B3722933BC800CBA17F /* AutosizedCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutosizedCollectionView.swift; sourceTree = ""; }; - B19664BB24AB4B0900C9DE90 /* KeyVerificationSetupBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyVerificationSetupBannerCell.swift; sourceTree = ""; }; - B19664BD24AB531000C9DE90 /* KeyVerificationSetupBannerCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KeyVerificationSetupBannerCell.xib; sourceTree = ""; }; - B19664BF24AB62CD00C9DE90 /* KeyVerificationBannerPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyVerificationBannerPreferences.swift; sourceTree = ""; }; + B19664BB24AB4B0900C9DE90 /* CrossSigningSetupBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrossSigningSetupBannerCell.swift; sourceTree = ""; }; + B19664BD24AB531000C9DE90 /* CrossSigningSetupBannerCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CrossSigningSetupBannerCell.xib; sourceTree = ""; }; + B19664BF24AB62CD00C9DE90 /* CrossSigningBannerPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrossSigningBannerPreferences.swift; sourceTree = ""; }; + B19664C224ABC6C900C9DE90 /* CrossSigningService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrossSigningService.swift; sourceTree = ""; }; B197B7C5243DE947005ABBF3 /* EncryptionTrustLevelBadgeImageHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptionTrustLevelBadgeImageHelper.swift; sourceTree = ""; }; B19C4E6D248F79EE009A423F /* SecretsRecoveryCoordinatorType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsRecoveryCoordinatorType.swift; sourceTree = ""; }; B19C4E6E248F79EF009A423F /* SecretsRecoveryCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SecretsRecoveryCoordinator.swift; sourceTree = ""; }; @@ -2543,7 +2545,6 @@ B1CE83B4242259ED00D07506 /* Common */, B1B335122421497000B4A6B5 /* User */, B1B335112421496800B4A6B5 /* Device */, - B19664BA24AB39F500C9DE90 /* Banners */, ); path = KeyVerification; sourceTree = ""; @@ -2910,13 +2911,22 @@ B19664BA24AB39F500C9DE90 /* Banners */ = { isa = PBXGroup; children = ( - B19664BF24AB62CD00C9DE90 /* KeyVerificationBannerPreferences.swift */, - B19664BB24AB4B0900C9DE90 /* KeyVerificationSetupBannerCell.swift */, - B19664BD24AB531000C9DE90 /* KeyVerificationSetupBannerCell.xib */, + B19664BF24AB62CD00C9DE90 /* CrossSigningBannerPreferences.swift */, + B19664BB24AB4B0900C9DE90 /* CrossSigningSetupBannerCell.swift */, + B19664BD24AB531000C9DE90 /* CrossSigningSetupBannerCell.xib */, ); path = Banners; sourceTree = ""; }; + B19664C124ABB92900C9DE90 /* CrossSigning */ = { + isa = PBXGroup; + children = ( + B19664C224ABC6C900C9DE90 /* CrossSigningService.swift */, + B19664BA24AB39F500C9DE90 /* Banners */, + ); + path = CrossSigning; + sourceTree = ""; + }; B19C4E6A248E98B9009A423F /* Secrets */ = { isa = PBXGroup; children = ( @@ -3072,6 +3082,7 @@ B1B5596B20EFA85C00210D55 /* EncryptionInfo */, B1B556FD20EE6C4C00210D55 /* RoomKeyRequest */, B1B556B020EE6C4C00210D55 /* BugReport */, + B19664C124ABB92900C9DE90 /* CrossSigning */, B1520C6C24A60ACD006F102F /* SecureBackup */, B1098BE921ECFE64000DDA48 /* KeyBackup */, B1550FCF242148FA00CE097B /* KeyVerification */, @@ -4998,7 +5009,7 @@ B1C562E4228C7C8D0037F12A /* RoomContextualMenuToolbarView.xib in Resources */, B1DCC62E22E61EAF00625807 /* EmojiPickerViewCell.xib in Resources */, B1B5590720EF768F00210D55 /* RoomOutgoingTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.xib in Resources */, - B19664BE24AB531000C9DE90 /* KeyVerificationSetupBannerCell.xib in Resources */, + B19664BE24AB531000C9DE90 /* CrossSigningSetupBannerCell.xib in Resources */, B169329920F39E6300746532 /* LaunchScreen.storyboard in Resources */, B1B5595320EF9A8700210D55 /* RecentTableViewCell.xib in Resources */, B1B557AD20EF5A6D00210D55 /* DeviceView.xib in Resources */, @@ -5400,7 +5411,7 @@ B1C543B023A2871300DCA1FA /* KeyVerificationBaseBubbleCell.swift in Sources */, B19C4E8E248F7A0E009A423F /* SecretsRecoveryWithPassphraseCoordinatorType.swift in Sources */, B1963B2F228F1C4900CBA17F /* BubbleReactionViewCell.swift in Sources */, - B19664BC24AB4B0900C9DE90 /* KeyVerificationSetupBannerCell.swift in Sources */, + B19664BC24AB4B0900C9DE90 /* CrossSigningSetupBannerCell.swift in Sources */, B1B558E920EF768F00210D55 /* RoomSelectedStickerBubbleCell.m in Sources */, B1C3360222F1ED600021BA8D /* MediaPickerCoordinatorBridgePresenter.swift in Sources */, B1B558DF20EF768F00210D55 /* RoomOutgoingTextMsgWithoutSenderInfoBubbleCell.m in Sources */, @@ -5534,7 +5545,7 @@ B1B5571D20EE6C4D00210D55 /* HomeViewController.m in Sources */, B1CE83DD2422817200D07506 /* KeyVerificationVerifyBySASViewAction.swift in Sources */, B185AF4F24A2672D00EE7D30 /* SecretsRecoveryCoordinatorBridgePresenter.swift in Sources */, - B19664C024AB62CD00C9DE90 /* KeyVerificationBannerPreferences.swift in Sources */, + B19664C024AB62CD00C9DE90 /* CrossSigningBannerPreferences.swift in Sources */, B1C45A84232A8C2600165425 /* SettingsIdentityServerCoordinatorType.swift in Sources */, B1DCC63722E8541700625807 /* EmojiStore.swift in Sources */, 3232ABA6225730E100AD6A5C /* DeviceVerificationStartViewController.swift in Sources */, @@ -5741,6 +5752,7 @@ B1B5572C20EE6C4D00210D55 /* RoomParticipantsViewController.m in Sources */, 6E6F1CAA244DC1E90068B78B /* SectionHeaderView.m in Sources */, B1B558EE20EF768F00210D55 /* RoomOutgoingAttachmentBubbleCell.m in Sources */, + B19664C324ABC6C900C9DE90 /* CrossSigningService.swift in Sources */, 32BF994F21FA29A400698084 /* SettingsKeyBackupViewModel.swift in Sources */, B19C4E7B248F79FD009A423F /* SecretsRecoveryWithKeyViewController.swift in Sources */, B14B17602462C69000C2751E /* KeyVerificationManuallyVerifyViewAction.swift in Sources */, diff --git a/Riot/AppDelegate.m b/Riot/AppDelegate.m index d5b55094a..e77f56f3f 100644 --- a/Riot/AppDelegate.m +++ b/Riot/AppDelegate.m @@ -2294,7 +2294,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni [SecureBackupBannerPreferences.shared reset]; // Reset key verification banner preferences - [KeyVerificationBannerPreferences.shared reset]; + [CrossSigningBannerPreferences.shared reset]; #ifdef MX_CALL_STACK_ENDPOINT // Erase all created certificates and private keys by MXEndpointCallStack diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index e1e96d842..aac86bb9a 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -1301,11 +1301,6 @@ "key_verification_scan_confirmation_scanned_user_information" = "Is %@ showing the same shield?"; "key_verification_scan_confirmation_scanned_device_information" = "Is the other device showing the same shield?"; -// Banner - -"key_verification_setup_banner_title" = "Set up encryption"; -"key_verification_setup_banner_subtitle" = "Verify your other devices easier"; - // MARK: - User verification // Start @@ -1402,3 +1397,9 @@ "key_backup_setup_passphrase_confirm_passphrase_valid" = "Great!"; "key_backup_setup_passphrase_confirm_passphrase_invalid" = "Passphrase doesn’t match"; +// MARK: - Cross-signing + +// Banner + +"cross_signing_setup_banner_title" = "Set up encryption"; +"cross_signing_setup_banner_subtitle" = "Verify your other devices easier"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index cce7453f7..51d45fbba 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -482,6 +482,14 @@ internal enum VectorL10n { internal static var create: String { return VectorL10n.tr("Vector", "create") } + /// Verify your other devices easier + internal static var crossSigningSetupBannerSubtitle: String { + return VectorL10n.tr("Vector", "cross_signing_setup_banner_subtitle") + } + /// Set up encryption + internal static var crossSigningSetupBannerTitle: String { + return VectorL10n.tr("Vector", "cross_signing_setup_banner_title") + } /// Please forget all messages I have sent when my account is deactivated ( internal static var deactivateAccountForgetMessagesInformationPart1: String { return VectorL10n.tr("Vector", "deactivate_account_forget_messages_information_part1") @@ -1610,14 +1618,6 @@ internal enum VectorL10n { internal static var keyVerificationSelfVerifyUnverifiedSessionsAlertValidateAction: String { return VectorL10n.tr("Vector", "key_verification_self_verify_unverified_sessions_alert_validate_action") } - /// Verify your other devices easier - internal static var keyVerificationSetupBannerSubtitle: String { - return VectorL10n.tr("Vector", "key_verification_setup_banner_subtitle") - } - /// Set up encryption - internal static var keyVerificationSetupBannerTitle: String { - return VectorL10n.tr("Vector", "key_verification_setup_banner_title") - } /// Verify this session internal static var keyVerificationThisSessionTitle: String { return VectorL10n.tr("Vector", "key_verification_this_session_title") diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h index b2bd5a93f..92c74d8cb 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h @@ -42,12 +42,12 @@ typedef NS_ENUM(NSInteger, SecureBackupBannerDisplay) }; /** - List the different key verification banners that could be displayed. + List the different cross-signing banners that could be displayed. */ -typedef NS_ENUM(NSInteger, KeyVerificationBannerDisplay) +typedef NS_ENUM(NSInteger, CrossSigningBannerDisplay) { - KeyVerificationBannerDisplayNone, - KeyVerificationBannerDisplaySetup + CrossSigningBannerDisplayNone, + CrossSigningBannerDisplaySetup }; /** @@ -63,7 +63,7 @@ extern NSString *const kRecentsDataSourceTapOnDirectoryServerChange; */ @interface RecentsDataSource : MXKInterleavedRecentsDataSource -@property (nonatomic) NSInteger keyVerificationBannerSection; +@property (nonatomic) NSInteger crossSigningBannerSection; @property (nonatomic) NSInteger secureBackupBannerSection; @property (nonatomic) NSInteger directorySection; @property (nonatomic) NSInteger invitesSection; @@ -81,7 +81,7 @@ extern NSString *const kRecentsDataSourceTapOnDirectoryServerChange; @property (nonatomic, readonly) NSArray* serverNoticeCellDataArray; @property (nonatomic, readonly) SecureBackupBannerDisplay secureBackupBannerDisplay; -@property (nonatomic, readonly) KeyVerificationBannerDisplay keyVerificationBannerDisplay; +@property (nonatomic, readonly) CrossSigningBannerDisplay crossSigningBannerDisplay; /** Set the delegate by specifying the selected display mode. diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index accee1f17..894b5f96c 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -43,7 +43,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSourceTapOnDirectoryServerChange"; -@interface RecentsDataSource() +@interface RecentsDataSource() { NSMutableArray* invitesCellDataArray; NSMutableArray* favoriteCellDataArray; @@ -65,14 +65,14 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } @property (nonatomic, assign, readwrite) SecureBackupBannerDisplay secureBackupBannerDisplay; -@property (nonatomic, assign, readwrite) KeyVerificationBannerDisplay keyVerificationBannerDisplay; +@property (nonatomic, assign, readwrite) CrossSigningBannerDisplay crossSigningBannerDisplay; -@property (nonatomic, strong) KeyVerificationService *keyVerificationService; +@property (nonatomic, strong) CrossSigningService *crossSigningService; @end @implementation RecentsDataSource -@synthesize directorySection, invitesSection, favoritesSection, peopleSection, conversationSection, lowPrioritySection, serverNoticeSection, secureBackupBannerSection, keyVerificationBannerSection; +@synthesize directorySection, invitesSection, favoritesSection, peopleSection, conversationSection, lowPrioritySection, serverNoticeSection, secureBackupBannerSection, crossSigningBannerSection; @synthesize hiddenCellIndexPath, droppingCellIndexPath, droppingCellBackGroundView; @synthesize invitesCellDataArray, favoriteCellDataArray, peopleCellDataArray, conversationCellDataArray, lowPriorityCellDataArray, serverNoticeCellDataArray; @@ -88,8 +88,8 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou serverNoticeCellDataArray = [[NSMutableArray alloc] init]; conversationCellDataArray = [[NSMutableArray alloc] init]; - _keyVerificationBannerDisplay = KeyVerificationBannerDisplayNone; - keyVerificationBannerSection = -1; + _crossSigningBannerDisplay = CrossSigningBannerDisplayNone; + crossSigningBannerSection = -1; _secureBackupBannerDisplay = SecureBackupBannerDisplayNone; secureBackupBannerSection = -1; @@ -106,7 +106,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou roomTagsListenerByUserId = [[NSMutableDictionary alloc] init]; - _keyVerificationService = [KeyVerificationService new]; + _crossSigningService = [CrossSigningService new]; // Set default data and view classes [self registerCellDataClass:RecentCellData.class forCellIdentifier:kMXKRecentCellIdentifier]; @@ -139,7 +139,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou [self updateSecureBackupBanner]; [self forceRefresh]; - [self refreshKeyVerificationBannerDisplay]; + [self refreshCrossSigningBannerDisplay]; } - (UIView *)viewForStickyHeaderInSection:(NSInteger)section withFrame:(CGRect)frame @@ -220,62 +220,62 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou [self forceRefresh]; } -#pragma mark - Key verification setup banner +#pragma mark - Cross-signing setup banner -- (void)refreshKeyVerificationBannerDisplay +- (void)refreshCrossSigningBannerDisplay { if (self.recentsDataSourceMode == RecentsDataSourceModeHome) { - KeyVerificationBannerPreferences *keyVerificationBannerPreferences = KeyVerificationBannerPreferences.shared; + CrossSigningBannerPreferences *crossSigningBannerPreferences = CrossSigningBannerPreferences.shared; - if (!keyVerificationBannerPreferences.hideSetupBanner) + if (!crossSigningBannerPreferences.hideSetupBanner) { - [self.keyVerificationService canSetupKeyVerificationFor:self.mxSession success:^(BOOL canSetupKeyVerification) { + [self.crossSigningService canSetupCrossSigningFor:self.mxSession success:^(BOOL canSetupCrossSigning) { - KeyVerificationBannerDisplay keyVerificationBannerDisplay = canSetupKeyVerification ? KeyVerificationBannerDisplaySetup : KeyVerificationBannerDisplayNone; + CrossSigningBannerDisplay crossSigningBannerDisplay = canSetupCrossSigning ? CrossSigningBannerDisplaySetup : CrossSigningBannerDisplayNone; - [self updateKeyVerificationBannerDisplay:keyVerificationBannerDisplay]; + [self updateCrossSigningBannerDisplay:crossSigningBannerDisplay]; } failure:^(NSError * _Nonnull error) { - NSLog(@"[RecentsDataSource] refreshKeyVerificationBannerDisplay: Fail to verify if key verification banner can be displayed"); + NSLog(@"[RecentsDataSource] refreshCrossSigningBannerDisplay: Fail to verify if cross signing banner can be displayed"); }]; } else { - [self updateKeyVerificationBannerDisplay:KeyVerificationBannerDisplayNone]; + [self updateCrossSigningBannerDisplay:CrossSigningBannerDisplayNone]; } } else { - [self updateKeyVerificationBannerDisplay:KeyVerificationBannerDisplayNone]; + [self updateCrossSigningBannerDisplay:CrossSigningBannerDisplayNone]; } } -- (void)updateKeyVerificationBannerDisplay:(KeyVerificationBannerDisplay)keyVerificationBannerDisplay +- (void)updateCrossSigningBannerDisplay:(CrossSigningBannerDisplay)crossSigningBannerDisplay { - if (self.keyVerificationBannerDisplay == keyVerificationBannerDisplay) + if (self.crossSigningBannerDisplay == crossSigningBannerDisplay) { return; } - self.keyVerificationBannerDisplay = keyVerificationBannerDisplay; + self.crossSigningBannerDisplay = crossSigningBannerDisplay; [self forceRefresh]; } -- (void)hideKeyVerificationBannerWithDisplay:(KeyVerificationBannerDisplay)keyVerificationBannerDisplay +- (void)hideCrossSigningBannerWithDisplay:(CrossSigningBannerDisplay)crossSigningBannerDisplay { - KeyVerificationBannerPreferences *keyVerificationBannerPreferences = KeyVerificationBannerPreferences.shared; + CrossSigningBannerPreferences *crossSigningBannerPreferences = CrossSigningBannerPreferences.shared; - switch (keyVerificationBannerDisplay) { - case KeyVerificationBannerDisplaySetup: - keyVerificationBannerPreferences.hideSetupBanner = YES; + switch (crossSigningBannerDisplay) { + case CrossSigningBannerDisplaySetup: + crossSigningBannerPreferences.hideSetupBanner = YES; break; default: break; } - [self refreshKeyVerificationBannerDisplay]; + [self refreshCrossSigningBannerDisplay]; } #pragma mark - @@ -392,11 +392,11 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou // Check whether all data sources are ready before rendering recents if (self.state == MXKDataSourceStateReady) { - keyVerificationBannerSection = secureBackupBannerSection = directorySection = favoritesSection = peopleSection = conversationSection = lowPrioritySection = invitesSection = serverNoticeSection = -1; + crossSigningBannerSection = secureBackupBannerSection = directorySection = favoritesSection = peopleSection = conversationSection = lowPrioritySection = invitesSection = serverNoticeSection = -1; - if (self.keyVerificationBannerDisplay != KeyVerificationBannerDisplayNone) + if (self.crossSigningBannerDisplay != CrossSigningBannerDisplayNone) { - keyVerificationBannerSection = sectionsCount++; + crossSigningBannerSection = sectionsCount++; } else if (self.secureBackupBannerDisplay != SecureBackupBannerDisplayNone) { @@ -455,7 +455,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou NSUInteger count = 0; - if (section == self.keyVerificationBannerSection && self.keyVerificationBannerDisplay != KeyVerificationBannerDisplayNone) + if (section == self.crossSigningBannerSection && self.crossSigningBannerDisplay != CrossSigningBannerDisplayNone) { count = 1; } @@ -508,7 +508,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou - (CGFloat)heightForHeaderInSection:(NSInteger)section { - if (section == self.secureBackupBannerSection || section == self.keyVerificationBannerSection) + if (section == self.secureBackupBannerSection || section == self.crossSigningBannerSection) { return 0.0; } @@ -672,7 +672,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou - (UIView *)viewForHeaderInSection:(NSInteger)section withFrame:(CGRect)frame { // No header view in key backup banner section - if (section == self.secureBackupBannerSection || section == self.keyVerificationBannerSection) + if (section == self.secureBackupBannerSection || section == self.crossSigningBannerSection) { return nil; } @@ -820,11 +820,11 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou return [[UITableViewCell alloc] init]; } - if (indexPath.section == self.keyVerificationBannerSection) + if (indexPath.section == self.crossSigningBannerSection) { - KeyVerificationSetupBannerCell* keyVerificationSetupBannerCell = [tableView dequeueReusableCellWithIdentifier:KeyVerificationSetupBannerCell.defaultReuseIdentifier forIndexPath:indexPath]; - keyVerificationSetupBannerCell.delegate = self; - return keyVerificationSetupBannerCell; + CrossSigningSetupBannerCell* crossSigningSetupBannerCell = [tableView dequeueReusableCellWithIdentifier:CrossSigningSetupBannerCell.defaultReuseIdentifier forIndexPath:indexPath]; + crossSigningSetupBannerCell.delegate = self; + return crossSigningSetupBannerCell; } else if (indexPath.section == self.secureBackupBannerSection) { @@ -1629,11 +1629,11 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou [self hideKeyBackupBannerWithDisplay:self.secureBackupBannerDisplay]; } -#pragma mark - KeyVerificationSetupBannerCellDelegate +#pragma mark - CrossSigningSetupBannerCellDelegate -- (void)keyVerificationSetupBannerCellDidTapCloseAction:(KeyVerificationSetupBannerCell *)cell +- (void)crossSigningSetupBannerCellDidTapCloseAction:(CrossSigningSetupBannerCell *)cell { - [self hideKeyVerificationBannerWithDisplay:self.keyVerificationBannerDisplay]; + [self hideCrossSigningBannerWithDisplay:self.crossSigningBannerDisplay]; } @end diff --git a/Riot/Modules/KeyVerification/Banners/KeyVerificationBannerPreferences.swift b/Riot/Modules/CrossSigning/Banners/CrossSigningBannerPreferences.swift similarity index 82% rename from Riot/Modules/KeyVerification/Banners/KeyVerificationBannerPreferences.swift rename to Riot/Modules/CrossSigning/Banners/CrossSigningBannerPreferences.swift index f368ca4d2..56565a81c 100644 --- a/Riot/Modules/KeyVerification/Banners/KeyVerificationBannerPreferences.swift +++ b/Riot/Modules/CrossSigning/Banners/CrossSigningBannerPreferences.swift @@ -16,17 +16,17 @@ import Foundation -/// Key verification banner user preferences. +/// Cross-Signing banner user preferences. @objcMembers -final class KeyVerificationBannerPreferences: NSObject { +final class CrossSigningBannerPreferences: NSObject { // MARK: - Constants private enum UserDefaultsKeys { - static let hideSetupBanner = "KeyVerificationBannerPreferencesHideSetupBanner" + static let hideSetupBanner = "CrossSigningBannerPreferencesHideSetupBanner" } - static let shared = KeyVerificationBannerPreferences() + static let shared = CrossSigningBannerPreferences() // MARK: - Properties diff --git a/Riot/Modules/KeyVerification/Banners/KeyVerificationSetupBannerCell.swift b/Riot/Modules/CrossSigning/Banners/CrossSigningSetupBannerCell.swift similarity index 81% rename from Riot/Modules/KeyVerification/Banners/KeyVerificationSetupBannerCell.swift rename to Riot/Modules/CrossSigning/Banners/CrossSigningSetupBannerCell.swift index 11719b516..6a7161bea 100644 --- a/Riot/Modules/KeyVerification/Banners/KeyVerificationSetupBannerCell.swift +++ b/Riot/Modules/CrossSigning/Banners/CrossSigningSetupBannerCell.swift @@ -16,12 +16,12 @@ import UIKit -@objc protocol KeyVerificationSetupBannerCellDelegate: class { - func keyVerificationSetupBannerCellDidTapCloseAction(_ cell: KeyVerificationSetupBannerCell) +@objc protocol CrossSigningSetupBannerCellDelegate: class { + func crossSigningSetupBannerCellDidTapCloseAction(_ cell: CrossSigningSetupBannerCell) } @objcMembers -final class KeyVerificationSetupBannerCell: MXKTableViewCell, Themable { +final class CrossSigningSetupBannerCell: MXKTableViewCell, Themable { // MARK: - Properties @@ -34,7 +34,7 @@ final class KeyVerificationSetupBannerCell: MXKTableViewCell, Themable { // MARK: Public - weak var delegate: KeyVerificationSetupBannerCellDelegate? + weak var delegate: CrossSigningSetupBannerCellDelegate? // MARK: - Overrides @@ -65,8 +65,8 @@ final class KeyVerificationSetupBannerCell: MXKTableViewCell, Themable { let closeImage = Asset.Images.closeBanner.image.withRenderingMode(.alwaysTemplate) self.closeButton.setImage(closeImage, for: .normal) - self.titleLabel.text = VectorL10n.keyVerificationSetupBannerTitle - self.subtitleLabel.text = VectorL10n.keyVerificationSetupBannerSubtitle + self.titleLabel.text = VectorL10n.crossSigningSetupBannerTitle + self.subtitleLabel.text = VectorL10n.crossSigningSetupBannerSubtitle } // MARK: - Public @@ -82,6 +82,6 @@ final class KeyVerificationSetupBannerCell: MXKTableViewCell, Themable { // MARK: - Actions @IBAction private func closeButtonAction(_ sender: Any) { - self.delegate?.keyVerificationSetupBannerCellDidTapCloseAction(self) + self.delegate?.crossSigningSetupBannerCellDidTapCloseAction(self) } } diff --git a/Riot/Modules/KeyVerification/Banners/KeyVerificationSetupBannerCell.xib b/Riot/Modules/CrossSigning/Banners/CrossSigningSetupBannerCell.xib similarity index 98% rename from Riot/Modules/KeyVerification/Banners/KeyVerificationSetupBannerCell.xib rename to Riot/Modules/CrossSigning/Banners/CrossSigningSetupBannerCell.xib index 160bfae31..0d66e087b 100644 --- a/Riot/Modules/KeyVerification/Banners/KeyVerificationSetupBannerCell.xib +++ b/Riot/Modules/CrossSigning/Banners/CrossSigningSetupBannerCell.xib @@ -11,7 +11,7 @@ - + diff --git a/Riot/Modules/CrossSigning/CrossSigningService.swift b/Riot/Modules/CrossSigning/CrossSigningService.swift new file mode 100644 index 000000000..1168a8243 --- /dev/null +++ b/Riot/Modules/CrossSigning/CrossSigningService.swift @@ -0,0 +1,63 @@ +/* + Copyright 2020 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation + +@objcMembers +final class CrossSigningService: NSObject { + + private var authenticatedSessionFactory: AuthenticatedSessionViewControllerFactory? + private var supportSetupKeyVerificationByUser: [String: Bool] = [:] // Cached server response + + @discardableResult + func canSetupCrossSigning(for session: MXSession, success: @escaping ((Bool) -> Void), failure: @escaping ((Error) -> Void)) -> MXHTTPOperation? { + + guard let crossSigning = session.crypto?.crossSigning, crossSigning.state == .notBootstrapped else { + // Cross-signing already setup + success(false) + return nil + } + + let userId: String = session.myUserId + + if let supportSetupKeyVerification = self.supportSetupKeyVerificationByUser[userId] { + // Return cached response + success(supportSetupKeyVerification) + return nil + } + + let authenticatedSessionFactory = AuthenticatedSessionViewControllerFactory(session: session) + + self.authenticatedSessionFactory = authenticatedSessionFactory + + let path = "\(kMXAPIPrefixPathUnstable)/keys/device_signing/upload" + + return authenticatedSessionFactory.hasSupport(forPath: path, httpMethod: "POST", success: { [weak self] succeeded in + guard let self = self else { + return + } + self.authenticatedSessionFactory = nil + self.supportSetupKeyVerificationByUser[userId] = succeeded + success(succeeded) + }, failure: { [weak self] error in + guard let self = self else { + return + } + self.authenticatedSessionFactory = nil + failure(error) + }) + } +} diff --git a/Riot/Modules/Home/HomeViewController.m b/Riot/Modules/Home/HomeViewController.m index 7176613ba..4627b0be3 100644 --- a/Riot/Modules/Home/HomeViewController.m +++ b/Riot/Modules/Home/HomeViewController.m @@ -44,7 +44,7 @@ @property (nonatomic, strong) SecureBackupSetupCoordinatorBridgePresenter *secureBackupSetupCoordinatorBridgePresenter; @property (nonatomic, strong) SecureBackupBannerCell *secureBackupBannerPrototypeCell; -@property (nonatomic, strong) KeyVerificationSetupBannerCell *keyVerificationSetupBannerPrototypeCell; +@property (nonatomic, strong) CrossSigningSetupBannerCell *keyVerificationSetupBannerPrototypeCell; @property (nonatomic, strong) AuthenticatedSessionViewControllerFactory *authenticatedSessionViewControllerFactory; @end @@ -83,7 +83,7 @@ [self.recentsTableView registerNib:SecureBackupBannerCell.nib forCellReuseIdentifier:SecureBackupBannerCell.defaultReuseIdentifier]; // Register key verification banner cells - [self.recentsTableView registerNib:KeyVerificationSetupBannerCell.nib forCellReuseIdentifier:KeyVerificationSetupBannerCell.defaultReuseIdentifier]; + [self.recentsTableView registerNib:CrossSigningSetupBannerCell.nib forCellReuseIdentifier:CrossSigningSetupBannerCell.defaultReuseIdentifier]; // Change the table data source. It must be the home view controller itself. self.recentsTableView.dataSource = self; @@ -159,11 +159,11 @@ return _secureBackupBannerPrototypeCell; } -- (KeyVerificationSetupBannerCell *)keyVerificationSetupBannerPrototypeCell +- (CrossSigningSetupBannerCell *)keyVerificationSetupBannerPrototypeCell { if (!_keyVerificationSetupBannerPrototypeCell) { - _keyVerificationSetupBannerPrototypeCell = [self.recentsTableView dequeueReusableCellWithIdentifier:KeyVerificationSetupBannerCell.defaultReuseIdentifier]; + _keyVerificationSetupBannerPrototypeCell = [self.recentsTableView dequeueReusableCellWithIdentifier:CrossSigningSetupBannerCell.defaultReuseIdentifier]; } return _keyVerificationSetupBannerPrototypeCell; } @@ -305,7 +305,7 @@ if ((indexPath.section == recentsDataSource.conversationSection && !recentsDataSource.conversationCellDataArray.count) || (indexPath.section == recentsDataSource.peopleSection && !recentsDataSource.peopleCellDataArray.count) || (indexPath.section == recentsDataSource.secureBackupBannerSection) - || (indexPath.section == recentsDataSource.keyVerificationBannerSection) + || (indexPath.section == recentsDataSource.crossSigningBannerSection) ) { return [recentsDataSource tableView:tableView cellForRowAtIndexPath:indexPath]; @@ -382,7 +382,7 @@ { return [recentsDataSource cellHeightAtIndexPath:indexPath]; } - else if (indexPath.section == recentsDataSource.secureBackupBannerSection || indexPath.section == recentsDataSource.keyVerificationBannerSection) + else if (indexPath.section == recentsDataSource.secureBackupBannerSection || indexPath.section == recentsDataSource.crossSigningBannerSection) { CGFloat height = 0.0; @@ -394,7 +394,7 @@ [secureBackupBannerCell configureFor:recentsDataSource.secureBackupBannerDisplay]; sizingCell = secureBackupBannerCell; } - else if (indexPath.section == recentsDataSource.keyVerificationBannerSection) + else if (indexPath.section == recentsDataSource.crossSigningBannerSection) { sizingCell = self.keyVerificationSetupBannerPrototypeCell; } @@ -436,7 +436,7 @@ { // No header in key banner section if (section == recentsDataSource.secureBackupBannerSection - || section == recentsDataSource.keyVerificationBannerSection) + || section == recentsDataSource.crossSigningBannerSection) { return 0.0; } @@ -458,9 +458,9 @@ break; } } - else if (indexPath.section == recentsDataSource.keyVerificationBannerSection) + else if (indexPath.section == recentsDataSource.crossSigningBannerSection) { - [self showKeyVerificationSetup]; + [self showCrossSigningSetup]; } } @@ -723,11 +723,11 @@ self.secureBackupSetupCoordinatorBridgePresenter = nil; } -#pragma mark - Key verification setup +#pragma mark - Cross-signing setup -- (void)showKeyVerificationSetup +- (void)showCrossSigningSetup { - [self setupCrossSigningWithTitle:NSLocalizedStringFromTable(@"key_verification_setup_banner_title", @"Vector", nil) message:NSLocalizedStringFromTable(@"security_settings_user_password_description", @"Vector", nil) success:^{ + [self setupCrossSigningWithTitle:NSLocalizedStringFromTable(@"cross_signing_setup_banner_title", @"Vector", nil) message:NSLocalizedStringFromTable(@"security_settings_user_password_description", @"Vector", nil) success:^{ } failure:^(NSError *error) { diff --git a/Riot/Modules/KeyVerification/Common/KeyVerificationService.swift b/Riot/Modules/KeyVerification/Common/KeyVerificationService.swift index 5967c8e96..aeca8a37d 100644 --- a/Riot/Modules/KeyVerification/Common/KeyVerificationService.swift +++ b/Riot/Modules/KeyVerification/Common/KeyVerificationService.swift @@ -16,17 +16,15 @@ import Foundation -@objcMembers -final class KeyVerificationService: NSObject { +final class KeyVerificationService { private let cameraAccessManager: CameraAccessManager private var authenticatedSessionFactory: AuthenticatedSessionViewControllerFactory? private var supportSetupKeyVerificationByUser: [String: Bool] = [:] // Cached server response - override init() { + init() { self.cameraAccessManager = CameraAccessManager() - super.init() } func supportedKeyVerificationMethods() -> [String] { @@ -42,43 +40,4 @@ final class KeyVerificationService: NSObject { return supportedMethods } - - @discardableResult - func canSetupKeyVerification(for session: MXSession, success: @escaping ((Bool) -> Void), failure: @escaping ((Error) -> Void)) -> MXHTTPOperation? { - - guard let crossSigning = session.crypto?.crossSigning, crossSigning.state == .notBootstrapped else { - // Cross-signing already setup - success(false) - return nil - } - - let userId: String = session.myUserId - - if let supportSetupKeyVerification = self.supportSetupKeyVerificationByUser[userId] { - // Return cached response - success(supportSetupKeyVerification) - return nil - } - - let authenticatedSessionFactory = AuthenticatedSessionViewControllerFactory(session: session) - - self.authenticatedSessionFactory = authenticatedSessionFactory - - let path = "\(kMXAPIPrefixPathUnstable)/keys/device_signing/upload" - - return authenticatedSessionFactory.hasSupport(forPath: path, httpMethod: "POST", success: { [weak self] succeeded in - guard let self = self else { - return - } - self.authenticatedSessionFactory = nil - self.supportSetupKeyVerificationByUser[userId] = succeeded - success(succeeded) - }, failure: { [weak self] error in - guard let self = self else { - return - } - self.authenticatedSessionFactory = nil - failure(error) - }) - } }