diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index df7cc8491..2bc239527 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -427,13 +427,17 @@ "settings_key_backup_info_valid" = "Backup has a valid signature from this device."; "settings_key_backup_info_not_valid" = "Secure Message Recovery is not active on this device."; "settings_key_backup_info_progress" = "Backing up %@ keys..."; -"settings_key_backup_info_progress_done" = "All keys have been backed up"; // TO DEL -"settings_key_backup_info_trust_signature_unknown" = "Backup has a signature from unknown device with ID %@."; +"settings_key_backup_info_progress_done" = "All keys have been backed up"; +"settings_key_backup_info_not_trusted_from_verifiable_device_fix_action" = "To use Secure Message Recovery on this device, verify %@ now."; +"settings_key_backup_info_not_trusted_fix_action" = "To use Secure Message Recovery on this device, provide your passphrase or recovery key now."; + +"settings_key_backup_info_trust_signature_unknown" = "Backup has a signature from device with ID: %@"; "settings_key_backup_info_trust_signature_valid" = "Backup has a valid signature from this device"; -"settings_key_backup_info_trust_signature_valid_device_verified" = "Backup has a valid signature from verified device %@"; -"settings_key_backup_info_trust_signature_valid_device_unverified" = "Backup has a valid signature from unverified device %@"; -"settings_key_backup_info_trust_signature_invalid_device_verified" = "Backup has a invalid signature from verified device %@"; -"settings_key_backup_info_trust_signature_invalid_device_unverified" = "Backup has a invalid signature from unverified device %@"; +"settings_key_backup_info_trust_signature_valid_device_verified" = "Backup has a valid signature from %@"; +"settings_key_backup_info_trust_signature_valid_device_unverified" = "Backup has a signature from %@"; +"settings_key_backup_info_trust_signature_invalid_device_verified" = "Backup has an invalid signature from %@"; +"settings_key_backup_info_trust_signature_invalid_device_unverified" = "Backup has an invalid signature from %@"; + "settings_key_backup_button_create" = "Set up Secure Message Recovery"; "settings_key_backup_button_restore" = "Restore backup"; "settings_key_backup_button_delete" = "Delete backup"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index e812c8f08..d2d49c760 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -1954,6 +1954,14 @@ internal enum VectorL10n { internal static var settingsKeyBackupInfoNone: String { return VectorL10n.tr("Vector", "settings_key_backup_info_none") } + /// To use Secure Message Recovery on this device, provide your passphrase or recovery key now. + internal static var settingsKeyBackupInfoNotTrustedFixAction: String { + return VectorL10n.tr("Vector", "settings_key_backup_info_not_trusted_fix_action") + } + /// To use Secure Message Recovery on this device, verify %@ now. + internal static func settingsKeyBackupInfoNotTrustedFromVerifiableDeviceFixAction(_ p1: String) -> String { + return VectorL10n.tr("Vector", "settings_key_backup_info_not_trusted_from_verifiable_device_fix_action", p1) + } /// Secure Message Recovery is not active on this device. internal static var settingsKeyBackupInfoNotValid: String { return VectorL10n.tr("Vector", "settings_key_backup_info_not_valid") @@ -1966,15 +1974,15 @@ internal enum VectorL10n { internal static var settingsKeyBackupInfoProgressDone: String { return VectorL10n.tr("Vector", "settings_key_backup_info_progress_done") } - /// Backup has a invalid signature from unverified device %@ + /// Backup has an invalid signature from %@ internal static func settingsKeyBackupInfoTrustSignatureInvalidDeviceUnverified(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_key_backup_info_trust_signature_invalid_device_unverified", p1) } - /// Backup has a invalid signature from verified device %@ + /// Backup has an invalid signature from %@ internal static func settingsKeyBackupInfoTrustSignatureInvalidDeviceVerified(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_key_backup_info_trust_signature_invalid_device_verified", p1) } - /// Backup has a signature from unknown device with ID %@. + /// Backup has a signature from device with ID: %@ internal static func settingsKeyBackupInfoTrustSignatureUnknown(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_key_backup_info_trust_signature_unknown", p1) } @@ -1982,11 +1990,11 @@ internal enum VectorL10n { internal static var settingsKeyBackupInfoTrustSignatureValid: String { return VectorL10n.tr("Vector", "settings_key_backup_info_trust_signature_valid") } - /// Backup has a valid signature from unverified device %@ + /// Backup has a signature from %@ internal static func settingsKeyBackupInfoTrustSignatureValidDeviceUnverified(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_key_backup_info_trust_signature_valid_device_unverified", p1) } - /// Backup has a valid signature from verified device %@ + /// Backup has a valid signature from %@ internal static func settingsKeyBackupInfoTrustSignatureValidDeviceVerified(_ p1: String) -> String { return VectorL10n.tr("Vector", "settings_key_backup_info_trust_signature_valid_device_verified", p1) } diff --git a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift index 7e2f45021..01319c60b 100644 --- a/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift +++ b/Riot/Modules/Settings/KeyBackup/SettingsKeyBackupTableViewSection.swift @@ -69,8 +69,8 @@ import UIKit numberOfRows = self.numberOfBackupRows() case .backupAndRunning(_, _, _): numberOfRows = self.numberOfBackupAndRunningRows() - case .backupNotTrusted(_, let keyBackupVersionTrust): - numberOfRows = self.numberOfBackupNotTrustedRows(keyBackupVersionTrust: keyBackupVersionTrust) + case .backupNotTrusted(_, _): + numberOfRows = self.numberOfBackupNotTrustedRows() } return numberOfRows @@ -267,12 +267,8 @@ import UIKit } - private func numberOfBackupNotTrustedRows(keyBackupVersionTrust: MXKeyBackupVersionTrust) -> Int { - var numberOfRows = 3 - if self.lastNonVerifiedDevice(keyBackupVersionTrust) != nil { - numberOfRows += 1 - } - return numberOfRows + private func numberOfBackupNotTrustedRows() -> Int { + return 6 } private func renderBackupNotTrustedCell(atRow row: Int, keyBackupVersion: MXKeyBackupVersion, keyBackupVersionTrust: MXKeyBackupVersionTrust) -> UITableViewCell { @@ -280,42 +276,66 @@ import UIKit return UITableViewCell.init() } - // Display a verify button for the last non verified device only + // Is the device that created the device verifiable? + // ie, is it known and already stored in crytpo store? let lastNonVerifiedDevice = self.lastNonVerifiedDevice(keyBackupVersionTrust) + let lastUnVerifiableDevice = self.lastUnVerifiableDevice(keyBackupVersionTrust) var cell: UITableViewCell switch row { case 0: let infoCell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) - let version = VectorL10n.settingsKeyBackupInfoVersion(keyBackupVersion.version ?? "") - let algorithm = VectorL10n.settingsKeyBackupInfoAlgorithm(keyBackupVersion.algorithm) - let backupStatus = VectorL10n.settingsKeyBackupInfoValid - let uploadStatus = VectorL10n.settingsKeyBackupInfoProgressDone - let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust); + let backupStatus = VectorL10n.settingsKeyBackupInfoNotValid - let strings = [version, algorithm, backupStatus, uploadStatus] + backupTrust + var fixAction: [String] = [] + if let lastNonVerifiedDevice = lastNonVerifiedDevice { + let deviceName = lastNonVerifiedDevice.displayName ?? lastNonVerifiedDevice.deviceId ?? "" + fixAction = [VectorL10n.settingsKeyBackupInfoNotTrustedFromVerifiableDeviceFixAction(deviceName)] + } + else if lastUnVerifiableDevice != nil { + fixAction = [VectorL10n.settingsKeyBackupInfoNotTrustedFixAction] + } + + let strings = [backupStatus] + fixAction infoCell.mxkTextView.text = strings.joined(separator: "\n") cell = infoCell case 1: if let lastNonVerifiedDevice = lastNonVerifiedDevice { - cell = self.buttonCellForVerifyingDevice(lastNonVerifiedDevice, atRow: row) + cell = self.buttonCellForVerifyingDevice(lastNonVerifiedDevice.deviceId, atRow: row) + } + else if lastUnVerifiableDevice != nil { + cell = self.buttonCellForRestore(keyBackupVersion: keyBackupVersion, atRow: row, title: VectorL10n.settingsKeyBackupButtonVerify) } else { - cell = self.buttonCellForRestore(keyBackupVersion: keyBackupVersion, atRow: row) + cell = UITableViewCell.init() } case 2: - if lastNonVerifiedDevice != nil { - cell = self.buttonCellForRestore(keyBackupVersion: keyBackupVersion, atRow: row) - } - else { - cell = self.buttonCellForDelete(keyBackupVersion: keyBackupVersion, atRow: row) - } + let infoCell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) + + let version = VectorL10n.settingsKeyBackupInfoVersion(keyBackupVersion.version ?? "") + let algorithm = VectorL10n.settingsKeyBackupInfoAlgorithm(keyBackupVersion.algorithm) + + let strings = [version, algorithm] + infoCell.mxkTextView.text = strings.joined(separator: "\n") + + cell = infoCell case 3: + let infoCell: MXKTableViewCellWithTextView = delegate.settingsKeyBackupTableViewSection(self, textCellForRow: row) + + let backupTrust = self.stringForKeyBackupTrust(keyBackupVersionTrust); + infoCell.mxkTextView.text = backupTrust.joined(separator: "\n") + + cell = infoCell + + case 4: + cell = self.buttonCellForRestore(keyBackupVersion: keyBackupVersion, atRow: row) + + case 5: cell = self.buttonCellForDelete(keyBackupVersion: keyBackupVersion, atRow: row) default: @@ -357,9 +377,9 @@ import UIKit } } - private func lastNonVerifiedDevice(_ keyBackupVersionTrust:MXKeyBackupVersionTrust) -> String? + private func lastNonVerifiedDevice(_ keyBackupVersionTrust:MXKeyBackupVersionTrust) -> MXDeviceInfo? { - var lastNonVerifiedDeviceId: String? + var lastNonVerifiedDevice: MXDeviceInfo? for signature in keyBackupVersionTrust.signatures.reversed() { guard let device = signature.device else { @@ -368,13 +388,25 @@ import UIKit if device.verified != MXDeviceVerified { - lastNonVerifiedDeviceId = device.deviceId + lastNonVerifiedDevice = device break } } - return lastNonVerifiedDeviceId + return lastNonVerifiedDevice } + private func lastUnVerifiableDevice(_ keyBackupVersionTrust:MXKeyBackupVersionTrust) -> String? + { + var lastUnVerifiableDevice: String? + for signature in keyBackupVersionTrust.signatures.reversed() { + + if signature.device == nil { + lastUnVerifiableDevice = signature.deviceId + break + } + } + return lastUnVerifiableDevice + } // MARK: - Button cells @@ -416,15 +448,14 @@ import UIKit return cell } - private func buttonCellForRestore(keyBackupVersion: MXKeyBackupVersion, atRow row: Int) -> UITableViewCell { + private func buttonCellForRestore(keyBackupVersion: MXKeyBackupVersion, atRow row: Int, title: String = VectorL10n.settingsKeyBackupButtonRestore) -> UITableViewCell { guard let delegate = self.delegate else { return UITableViewCell.init() } let cell:MXKTableViewCellWithButton = delegate.settingsKeyBackupTableViewSection(self, buttonCellForRow: row) - let btnTitle = VectorL10n.settingsKeyBackupButtonRestore - cell.mxkButton.setTitle(btnTitle, for: .normal) - cell.mxkButton.setTitle(btnTitle, for: .highlighted) + cell.mxkButton.setTitle(title, for: .normal) + cell.mxkButton.setTitle(title, for: .highlighted) cell.mxkButton.vc_addAction { self.viewModel.process(viewAction: .restore(keyBackupVersion)) }