From 78583597aa606527ebdc32fc3e9464fa169c49b6 Mon Sep 17 00:00:00 2001 From: Doug Date: Wed, 21 Jun 2023 14:02:50 +0100 Subject: [PATCH 01/40] Prepare for new sprint --- Config/AppVersion.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index b484e08dc..46c0099fd 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.10.14 -CURRENT_PROJECT_VERSION = 1.10.14 +MARKETING_VERSION = 1.10.15 +CURRENT_PROJECT_VERSION = 1.10.15 From f1c7575f40a6509f80fec1d061aa532e77ad4ab1 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:26:43 +0100 Subject: [PATCH 02/40] Disable Siri, Share and Reply (from NSE) Extensions. (#7619) --- Podfile | 24 +++++++++++---------- Podfile.lock | 2 +- Riot/SupportingFiles/Riot-Bridging-Header.h | 2 +- Riot/target.yml | 6 ++++-- RiotNSE/NotificationService.swift | 4 +++- changelog.d/7618.change | 1 + project.yml | 6 ++++-- 7 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 changelog.d/7618.change diff --git a/Podfile b/Podfile index 4aabb6bbc..fda86b718 100644 --- a/Podfile +++ b/Podfile @@ -104,22 +104,12 @@ abstract_target 'RiotPods' do end end - target "RiotShareExtension" do - import_MatrixSDK - import_MatrixKit_pods - end - target "RiotSwiftUI" do import_SwiftUI_pods - end + end target "RiotSwiftUITests" do import_SwiftUI_pods - end - - target "SiriIntents" do - import_MatrixSDK - import_MatrixKit_pods end target "RiotNSE" do @@ -131,6 +121,18 @@ abstract_target 'RiotPods' do import_MatrixSDK end + # Disabled due to crypto corruption issues. + # https://github.com/vector-im/element-ios/issues/7618 + # target "RiotShareExtension" do + # import_MatrixSDK + # import_MatrixKit_pods + # end + # + # target "SiriIntents" do + # import_MatrixSDK + # import_MatrixKit_pods + # end + end post_install do |installer| diff --git a/Podfile.lock b/Podfile.lock index bdbbb2d00..fb9bd48ae 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -208,6 +208,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 0e7e10f516d40d9df60cb874170b91603c632118 +PODFILE CHECKSUM: f8d711a31048bfd5981d17b00487a85996b62983 COCOAPODS: 1.11.3 diff --git a/Riot/SupportingFiles/Riot-Bridging-Header.h b/Riot/SupportingFiles/Riot-Bridging-Header.h index 296545a4e..8c2df6f56 100644 --- a/Riot/SupportingFiles/Riot-Bridging-Header.h +++ b/Riot/SupportingFiles/Riot-Bridging-Header.h @@ -44,7 +44,7 @@ #import "ContactDetailsViewController.h" #import "RoomInputToolbarView.h" #import "NSArray+Element.h" -#import "ShareItemSender.h" +#import "ShareItemSenderProtocol.h" #import "Contact.h" #import "RoomTimelineCellProvider.h" #import "PlainRoomTimelineCellProvider.h" diff --git a/Riot/target.yml b/Riot/target.yml index 8139be715..929af6e3a 100644 --- a/Riot/target.yml +++ b/Riot/target.yml @@ -34,8 +34,10 @@ targets: platform: iOS dependencies: - - target: RiotShareExtension - - target: SiriIntents + # Disabled due to crypto corruption issues. + # https://github.com/vector-im/element-ios/issues/7618 + # - target: RiotShareExtension + # - target: SiriIntents - target: RiotNSE - target: BroadcastUploadExtension - target: DesignKit diff --git a/RiotNSE/NotificationService.swift b/RiotNSE/NotificationService.swift index 1f953583b..6c41f34c6 100644 --- a/RiotNSE/NotificationService.swift +++ b/RiotNSE/NotificationService.swift @@ -799,7 +799,9 @@ class NotificationService: UNNotificationServiceExtension { return Constants.toBeRemovedNotificationCategoryIdentifier } - return "QUICK_REPLY" + // Don't return QUICK_REPLY here as there is an issue + // with crypto corruption when sending from extensions. + return nil } /// Attempts to send trigger a VoIP push for the given event diff --git a/changelog.d/7618.change b/changelog.d/7618.change new file mode 100644 index 000000000..0cefa0983 --- /dev/null +++ b/changelog.d/7618.change @@ -0,0 +1 @@ +Disable Siri, Share and Reply (from NSE) Extensions. \ No newline at end of file diff --git a/project.yml b/project.yml index 8cbc73192..430b39cbc 100644 --- a/project.yml +++ b/project.yml @@ -29,8 +29,6 @@ options: include: - path: Riot/target.yml - path: RiotTests/target.yml - - path: RiotShareExtension/target.yml - - path: SiriIntents/target.yml - path: RiotNSE/target.yml - path: BroadcastUploadExtension/target.yml - path: DesignKit/target.yml @@ -39,6 +37,10 @@ include: - path: RiotSwiftUI/targetUITests.yml - path: CommonKit/target.yml - path: CommonKit/targetUnitTests.yml + # Disabled due to crypto corruption issues. + # https://github.com/vector-im/element-ios/issues/7618 + # - path: RiotShareExtension/target.yml + # - path: SiriIntents/target.yml packages: AnalyticsEvents: From 29324382ba603a80fbf49c9d812205456ec5f0dc Mon Sep 17 00:00:00 2001 From: Laurence Gill Date: Wed, 12 Jul 2023 12:14:28 +0100 Subject: [PATCH 03/40] Update posthog URL to posthog.element.io (#7620) --- Config/BuildSettings.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index f58f969c1..faf730a90 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -192,7 +192,7 @@ final class BuildSettings: NSObject { #else /// The configuration to use for analytics. Set `isEnabled` to false to disable analytics. static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: BuildSettings.baseBundleIdentifier.starts(with: "im.vector.app"), - host: "https://posthog.hss.element.io", + host: "https://posthog.element.io", apiKey: "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO", termsURL: URL(string: "https://element.io/cookie-policy")!) #endif From dfe669af7a604ebeb00fc2ad19757d8f15cf6251 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:22:14 +0100 Subject: [PATCH 04/40] Fix a crash when opening v11 rooms. (#7635) https://github.com/matrix-org/matrix-spec-proposals/pull/2175 --- .../Utils/EventFormatter/MXKEventFormatter.m | 46 ++++++++++--------- changelog.d/7633.bugfix | 1 + 2 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 changelog.d/7633.bugfix diff --git a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m index 19fae141d..7ae98184a 100644 --- a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m +++ b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m @@ -833,35 +833,39 @@ static NSString *const kRepliedTextPattern = @".*
.*
(.* NSString *creatorId; MXJSONModelSetString(creatorId, event.content[@"creator"]); - if (creatorId) + if (!creatorId) { - if ([creatorId isEqualToString:mxSession.myUserId]) + // Room version 11 removes `creator` in favour of `sender`. + // https://github.com/matrix-org/matrix-spec-proposals/pull/2175 + creatorId = event.sender; + } + + if ([creatorId isEqualToString:mxSession.myUserId]) + { + if (isRoomDirect) { - if (isRoomDirect) - { - displayText = [VectorL10n noticeRoomCreatedByYouForDm]; - } - else - { - displayText = [VectorL10n noticeRoomCreatedByYou]; - } + displayText = [VectorL10n noticeRoomCreatedByYouForDm]; } else { - if (isRoomDirect) - { - displayText = [VectorL10n noticeRoomCreatedForDm:(roomState ? [roomState.members memberName:creatorId] : creatorId)]; - } - else - { - displayText = [VectorL10n noticeRoomCreated:(roomState ? [roomState.members memberName:creatorId] : creatorId)]; - } + displayText = [VectorL10n noticeRoomCreatedByYou]; } - // Append redacted info if any - if (redactedInfo) + } + else + { + if (isRoomDirect) { - displayText = [NSString stringWithFormat:@"%@ %@", displayText, redactedInfo]; + displayText = [VectorL10n noticeRoomCreatedForDm:(roomState ? [roomState.members memberName:creatorId] : creatorId)]; } + else + { + displayText = [VectorL10n noticeRoomCreated:(roomState ? [roomState.members memberName:creatorId] : creatorId)]; + } + } + // Append redacted info if any + if (redactedInfo) + { + displayText = [NSString stringWithFormat:@"%@ %@", displayText, redactedInfo]; } break; } diff --git a/changelog.d/7633.bugfix b/changelog.d/7633.bugfix new file mode 100644 index 000000000..b7345971e --- /dev/null +++ b/changelog.d/7633.bugfix @@ -0,0 +1 @@ +Fix a crash when opening v11 rooms. \ No newline at end of file From b08a60c96c4f319da71f0e20f8dd24f43b59bb26 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Wed, 9 Aug 2023 11:15:03 +0100 Subject: [PATCH 05/40] Fix SSO generating invalid URLs. (#7639) --- Riot/Modules/Authentication/SSO/SSOAuthenticationService.swift | 2 +- changelog.d/pr-7639.bugfix | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/pr-7639.bugfix diff --git a/Riot/Modules/Authentication/SSO/SSOAuthenticationService.swift b/Riot/Modules/Authentication/SSO/SSOAuthenticationService.swift index a0282c742..706c3782d 100644 --- a/Riot/Modules/Authentication/SSO/SSOAuthenticationService.swift +++ b/Riot/Modules/Authentication/SSO/SSOAuthenticationService.swift @@ -50,7 +50,7 @@ final class SSOAuthenticationService: NSObject { var ssoRedirectPath = SSOURLConstants.Paths.redirect - if let identityProvider = identityProvider { + if let identityProvider = identityProvider, !identityProvider.isEmpty { ssoRedirectPath.append("/\(identityProvider)") } diff --git a/changelog.d/pr-7639.bugfix b/changelog.d/pr-7639.bugfix new file mode 100644 index 000000000..9bbf73b23 --- /dev/null +++ b/changelog.d/pr-7639.bugfix @@ -0,0 +1 @@ +Fix bug in SSO URL generation that was non-compliant with the spec. \ No newline at end of file From 4ef6fecfbc925033282897a8d04f0f3812ca3e78 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Wed, 9 Aug 2023 18:18:33 +0100 Subject: [PATCH 06/40] Only use the sender when rendering the room creation event. (#7640) On Room v11 it is possible that the sender could put in a fake creator. Don't allow this to happen. --- .../Utils/EventFormatter/MXKEventFormatter.m | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m index 7ae98184a..d6a3b5cfd 100644 --- a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m +++ b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m @@ -830,15 +830,10 @@ static NSString *const kRepliedTextPattern = @".*
.*
(.* } case MXEventTypeRoomCreate: { - NSString *creatorId; - MXJSONModelSetString(creatorId, event.content[@"creator"]); - - if (!creatorId) - { - // Room version 11 removes `creator` in favour of `sender`. - // https://github.com/matrix-org/matrix-spec-proposals/pull/2175 - creatorId = event.sender; - } + // Room version 11 removes `creator` in favour of `sender`. + // https://github.com/matrix-org/matrix-spec-proposals/pull/2175 + // Just use the sender as it is possible to create a v11 room and spoof the `creator`. + NSString *creatorId = event.sender; if ([creatorId isEqualToString:mxSession.myUserId]) { From 6ad39f6fcb423306d9ce496f5aa53360273d7dc2 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 27 Jul 2023 16:03:13 +0300 Subject: [PATCH 07/40] Device dehydration v2 - add support for device dehydration v2 i.e. `org.matrix.msc3814` - run dehydration flows after successfully recovering or creating secrets - enable said flows based on .well-known `org.matrix.msc3814` config key - delete previous implementation and helper methods --- .../HomeserverConfigurationBuilder.swift | 5 +- .../HomeserverEncryptionConfiguration.swift | 5 +- .../MXKAuthenticationViewController.h | 10 --- .../MXKAuthenticationViewController.m | 62 ------------------ .../MatrixKit/Models/Account/MXKAccount.h | 7 -- .../MatrixKit/Models/Account/MXKAccount.m | 64 ------------------- .../Models/Account/MXKAccountManager.h | 2 - .../Models/Account/MXKAccountManager.m | 1 - .../SecretsRecoveryWithKeyCoordinator.swift | 4 +- .../SecretsRecoveryWithKeyViewModel.swift | 9 ++- ...etsRecoveryWithPassphraseCoordinator.swift | 4 +- ...cretsRecoveryWithPassphraseViewModel.swift | 9 ++- .../Recover/SecretsRecoveryCoordinator.swift | 18 +++++- .../SecretsSetupRecoveryKeyCoordinator.swift | 9 ++- .../SecretsSetupRecoveryKeyViewModel.swift | 8 ++- .../Setup/SecureBackupSetupCoordinator.swift | 15 ++++- 16 files changed, 72 insertions(+), 160 deletions(-) diff --git a/Riot/Model/HomeserverConfiguration/HomeserverConfigurationBuilder.swift b/Riot/Model/HomeserverConfiguration/HomeserverConfigurationBuilder.swift index 1b7805223..af4beb29e 100644 --- a/Riot/Model/HomeserverConfiguration/HomeserverConfigurationBuilder.swift +++ b/Riot/Model/HomeserverConfiguration/HomeserverConfigurationBuilder.swift @@ -50,11 +50,14 @@ final class HomeserverConfigurationBuilder: NSObject { } else { secureBackupSetupMethods = VectorWellKnownBackupSetupMethod.allCases } + + let deviceDehydrationEnabled = wellKnown?.jsonDictionary()["org.matrix.msc3814"] as? Bool == true let encryptionConfiguration = HomeserverEncryptionConfiguration(isE2EEByDefaultEnabled: isE2EEByDefaultEnabled, isSecureBackupRequired: isSecureBackupRequired, secureBackupSetupMethods: secureBackupSetupMethods, - outboundKeysPreSharingMode: outboundKeysPreSharingMode) + outboundKeysPreSharingMode: outboundKeysPreSharingMode, + deviceDehydrationEnabled: deviceDehydrationEnabled) // Jitsi configuration let jitsiPreferredDomain: String? diff --git a/Riot/Model/HomeserverConfiguration/HomeserverEncryptionConfiguration.swift b/Riot/Model/HomeserverConfiguration/HomeserverEncryptionConfiguration.swift index 6672bff45..671756f63 100644 --- a/Riot/Model/HomeserverConfiguration/HomeserverEncryptionConfiguration.swift +++ b/Riot/Model/HomeserverConfiguration/HomeserverEncryptionConfiguration.swift @@ -23,15 +23,18 @@ final class HomeserverEncryptionConfiguration: NSObject { let isSecureBackupRequired: Bool let secureBackupSetupMethods: [VectorWellKnownBackupSetupMethod] let outboundKeysPreSharingMode: MXKKeyPreSharingStrategy + let deviceDehydrationEnabled: Bool init(isE2EEByDefaultEnabled: Bool, isSecureBackupRequired: Bool, secureBackupSetupMethods: [VectorWellKnownBackupSetupMethod], - outboundKeysPreSharingMode: MXKKeyPreSharingStrategy) { + outboundKeysPreSharingMode: MXKKeyPreSharingStrategy, + deviceDehydrationEnabled: Bool) { self.isE2EEByDefaultEnabled = isE2EEByDefaultEnabled self.isSecureBackupRequired = isSecureBackupRequired self.outboundKeysPreSharingMode = outboundKeysPreSharingMode self.secureBackupSetupMethods = secureBackupSetupMethods + self.deviceDehydrationEnabled = deviceDehydrationEnabled super.init() } diff --git a/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.h b/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.h index 4b218086f..bbfbfed06 100644 --- a/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.h +++ b/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.h @@ -305,15 +305,5 @@ */ - (void)showAuthenticationFallBackView; -#pragma mark - Device rehydration - -/** - Call this method at an appropriate time to attempt rehydrating from an existing dehydrated device - @param keyData Secret key data - @param credentials Account credentials - */ - -- (void)attemptDeviceRehydrationWithKeyData:(NSData *)keyData credentials:(MXCredentials *)credentials; - @end diff --git a/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.m b/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.m index 1ec7972a0..9d0f01487 100644 --- a/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.m +++ b/Riot/Modules/MatrixKit/Controllers/MXKAuthenticationViewController.m @@ -1495,68 +1495,6 @@ [self _createAccountWithCredentials:credentials]; } -- (void)attemptDeviceRehydrationWithKeyData:(NSData *)keyData - credentials:(MXCredentials *)credentials -{ - [self attemptDeviceRehydrationWithKeyData:keyData - credentials:credentials - retry:YES]; -} - -- (void)attemptDeviceRehydrationWithKeyData:(NSData *)keyData - credentials:(MXCredentials *)credentials - retry:(BOOL)retry -{ - MXLogDebug(@"[MXKAuthenticationViewController] attemptDeviceRehydration: starting device rehydration"); - - if (keyData == nil) - { - MXLogError(@"[MXKAuthenticationViewController] attemptDeviceRehydration: no key provided for device rehydration"); - [self _createAccountWithCredentials:credentials]; - return; - } - - MXRestClient *mxRestClient = [[MXRestClient alloc] initWithCredentials:credentials andOnUnrecognizedCertificateBlock:^BOOL(NSData *certificate) { - return NO; - } andPersistentTokenDataHandler:^(void (^handler)(NSArray *credentials, void (^completion)(BOOL didUpdateCredentials))) { - [[MXKAccountManager sharedManager] readAndWriteCredentials:handler]; - } andUnauthenticatedHandler: nil]; - - MXWeakify(self); - [[MXKAccountManager sharedManager].dehydrationService rehydrateDeviceWithMatrixRestClient:mxRestClient dehydrationKey:keyData success:^(NSString * deviceId) { - MXStrongifyAndReturnIfNil(self); - - if (deviceId) - { - MXLogDebug(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device %@ rehydrated successfully.", deviceId); - credentials.deviceId = deviceId; - } - else - { - MXLogDebug(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device rehydration has been canceled."); - } - - [self _createAccountWithCredentials:credentials]; - } failure:^(NSError *error) { - MXStrongifyAndReturnIfNil(self); - - if (retry) - { - MXLogErrorDetails(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device rehydration failed due to error: Retrying", @{ - @"error": error ?: @"unknown" - }); - [self attemptDeviceRehydrationWithKeyData:keyData credentials:credentials retry:NO]; - return; - } - - MXLogErrorDetails(@"[MXKAuthenticationViewController] attemptDeviceRehydration: device rehydration failed due to error", @{ - @"error": error ?: @"unknown" - }); - - [self _createAccountWithCredentials:credentials]; - }]; -} - - (void)_createAccountWithCredentials:(MXCredentials *)credentials { MXKAccount *account = [[MXKAccount alloc] initWithCredentials:credentials]; diff --git a/Riot/Modules/MatrixKit/Models/Account/MXKAccount.h b/Riot/Modules/MatrixKit/Models/Account/MXKAccount.h index 679e805f8..ecd5b3aad 100644 --- a/Riot/Modules/MatrixKit/Models/Account/MXKAccount.h +++ b/Riot/Modules/MatrixKit/Models/Account/MXKAccount.h @@ -360,13 +360,6 @@ typedef BOOL (^MXKAccountOnCertificateChange)(MXKAccount *mxAccount, NSData *cer #pragma mark - Sync filter -/** - Call this method at an appropriate time to attempt dehydrating to a new backup device - */ -- (void)attemptDeviceDehydrationWithKeyData:(NSData *)keyData - success:(void (^)(void))success - failure:(void (^)(NSError *error))failure; - /** Handle unauthenticated errors from the server triggering hard/soft logouts as appropriate. */ diff --git a/Riot/Modules/MatrixKit/Models/Account/MXKAccount.m b/Riot/Modules/MatrixKit/Models/Account/MXKAccount.m index 1d0382375..930a63f8a 100644 --- a/Riot/Modules/MatrixKit/Models/Account/MXKAccount.m +++ b/Riot/Modules/MatrixKit/Models/Account/MXKAccount.m @@ -1715,70 +1715,6 @@ static NSArray *initialSyncSilentErrorsHTTPStatusCodes; }]; } -- (void)attemptDeviceDehydrationWithKeyData:(NSData *)keyData - success:(void (^)(void))success - failure:(void (^)(NSError *error))failure -{ - [self attemptDeviceDehydrationWithKeyData:keyData retry:YES success:success failure:failure]; -} - -- (void)attemptDeviceDehydrationWithKeyData:(NSData *)keyData - retry:(BOOL)retry - success:(void (^)(void))success - failure:(void (^)(NSError *error))failure -{ - if (keyData == nil) - { - MXLogWarning(@"[MXKAccount] attemptDeviceDehydrationWithRetry: no key provided for device dehydration"); - - if (failure) - { - failure(nil); - } - - return; - } - - if (![mxSession.crypto.crossSigning isKindOfClass:[MXLegacyCrossSigning class]]) { - MXLogFailure(@"Device dehydratation is currently only supported by legacy cross signing, add support to all implementations"); - if (failure) - { - failure(nil); - } - return; - } - MXLegacyCrossSigning *crossSigning = (MXLegacyCrossSigning *)mxSession.crypto.crossSigning;; - - MXLogDebug(@"[MXKAccount] attemptDeviceDehydrationWithRetry: starting device dehydration"); - [[MXKAccountManager sharedManager].dehydrationService dehydrateDeviceWithMatrixRestClient:mxRestClient crossSigning:crossSigning dehydrationKey:keyData success:^(NSString *deviceId) { - MXLogDebug(@"[MXKAccount] attemptDeviceDehydrationWithRetry: device successfully dehydrated"); - - if (success) - { - success(); - } - } failure:^(NSError *error) { - if (retry) - { - [self attemptDeviceDehydrationWithKeyData:keyData retry:NO success:success failure:failure]; - MXLogErrorDetails(@"[MXKAccount] attemptDeviceDehydrationWithRetry: device dehydration failed due to error: Retrying.", @{ - @"error": error ?: @"unknown" - }); - } - else - { - MXLogErrorDetails(@"[MXKAccount] attemptDeviceDehydrationWithRetry: device dehydration failed due to error", @{ - @"error": error ?: @"unknown" - }); - - if (failure) - { - failure(error); - } - } - }]; -} - - (void)onMatrixSessionStateChange { // Check if pause has been requested diff --git a/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.h b/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.h index 7881832e0..2e21bd9a4 100644 --- a/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.h +++ b/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.h @@ -104,8 +104,6 @@ extern NSString *const MXKAccountManagerDataType; */ @property (nonatomic) BOOL isPushAvailable; -@property (nonatomic, readonly) MXDehydrationService *dehydrationService; - /** Retrieve the MXKAccounts manager. diff --git a/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.m b/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.m index 6a69ee6a7..c779e5c47 100644 --- a/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.m +++ b/Riot/Modules/MatrixKit/Models/Account/MXKAccountManager.m @@ -71,7 +71,6 @@ NSString *const MXKAccountManagerDataType = @"org.matrix.kit.MXKAccountManagerDa if (self) { _storeClass = [MXFileStore class]; - _dehydrationService = [MXDehydrationService new]; _savingAccountsEnabled = YES; // Migrate old account file to new format diff --git a/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift b/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift index efb42a35a..27d05afb2 100644 --- a/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift +++ b/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyCoordinator.swift @@ -34,9 +34,9 @@ final class SecretsRecoveryWithKeyCoordinator: SecretsRecoveryWithKeyCoordinator // MARK: - Setup - init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool) { + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool, dehydrationService: DehydrationService?) { - let secretsRecoveryWithKeyViewModel = SecretsRecoveryWithKeyViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal) + let secretsRecoveryWithKeyViewModel = SecretsRecoveryWithKeyViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal, dehydrationService: dehydrationService) let secretsRecoveryWithKeyViewController = SecretsRecoveryWithKeyViewController.instantiate(with: secretsRecoveryWithKeyViewModel, cancellable: cancellable) self.secretsRecoveryWithKeyViewController = secretsRecoveryWithKeyViewController self.secretsRecoveryWithKeyViewModel = secretsRecoveryWithKeyViewModel diff --git a/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift b/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift index f56562f7d..c18222bd0 100644 --- a/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift +++ b/Riot/Modules/Secrets/Recover/RecoverWithKey/SecretsRecoveryWithKeyViewModel.swift @@ -24,6 +24,8 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType private let recoveryService: MXRecoveryService + private let dehydrationService: DehydrationService? + // MARK: Public let recoveryGoal: SecretsRecoveryGoal @@ -39,8 +41,9 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType // MARK: - Setup - init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) { + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, dehydrationService: DehydrationService?) { self.recoveryService = recoveryService + self.dehydrationService = dehydrationService self.recoveryGoal = recoveryGoal } @@ -83,6 +86,10 @@ final class SecretsRecoveryWithKeyViewModel: SecretsRecoveryWithKeyViewModelType } self.update(viewState: .loaded) self.coordinatorDelegate?.secretsRecoveryWithKeyViewModelDidRecover(self) + + Task { + await self.dehydrationService?.runDeviceDehydrationFlow(privateKeyData: privateKey) + } }, failure: { [weak self] error in guard let self = self else { return diff --git a/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift b/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift index 02133fcbc..52d34a2eb 100644 --- a/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift +++ b/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseCoordinator.swift @@ -34,8 +34,8 @@ final class SecretsRecoveryWithPassphraseCoordinator: SecretsRecoveryWithPassphr // MARK: - Setup - init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool) { - let secretsRecoveryWithPassphraseViewModel = SecretsRecoveryWithPassphraseViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal) + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, cancellable: Bool, dehydrationService: DehydrationService?) { + let secretsRecoveryWithPassphraseViewModel = SecretsRecoveryWithPassphraseViewModel(recoveryService: recoveryService, recoveryGoal: recoveryGoal, dehydrationService: dehydrationService) let secretsRecoveryWithPassphraseViewController = SecretsRecoveryWithPassphraseViewController.instantiate(with: secretsRecoveryWithPassphraseViewModel, cancellable: cancellable) self.secretsRecoveryWithPassphraseViewController = secretsRecoveryWithPassphraseViewController self.secretsRecoveryWithPassphraseViewModel = secretsRecoveryWithPassphraseViewModel diff --git a/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift b/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift index 71e51e270..dd05f8425 100644 --- a/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift +++ b/Riot/Modules/Secrets/Recover/RecoverWithPassphrase/SecretsRecoveryWithPassphraseViewModel.swift @@ -24,6 +24,8 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras private let recoveryService: MXRecoveryService + private let dehydrationService: DehydrationService? + // MARK: Public let recoveryGoal: SecretsRecoveryGoal @@ -39,8 +41,9 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras // MARK: - Setup - init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal) { + init(recoveryService: MXRecoveryService, recoveryGoal: SecretsRecoveryGoal, dehydrationService: DehydrationService?) { self.recoveryService = recoveryService + self.dehydrationService = dehydrationService self.recoveryGoal = recoveryGoal } @@ -103,6 +106,10 @@ final class SecretsRecoveryWithPassphraseViewModel: SecretsRecoveryWithPassphras } self.update(viewState: .loaded) self.coordinatorDelegate?.secretsRecoveryWithPassphraseViewModelDidRecover(self) + + Task { + await self.dehydrationService?.runDeviceDehydrationFlow(privateKeyData: privateKey) + } }, failure: { [weak self] error in guard let self = self else { return diff --git a/Riot/Modules/Secrets/Recover/SecretsRecoveryCoordinator.swift b/Riot/Modules/Secrets/Recover/SecretsRecoveryCoordinator.swift index 817414956..762c72a73 100644 --- a/Riot/Modules/Secrets/Recover/SecretsRecoveryCoordinator.swift +++ b/Riot/Modules/Secrets/Recover/SecretsRecoveryCoordinator.swift @@ -85,14 +85,28 @@ final class SecretsRecoveryCoordinator: SecretsRecoveryCoordinatorType { // MARK: - Private + private var dehydrationService: DehydrationService? { + if self.session.vc_homeserverConfiguration().encryption.deviceDehydrationEnabled { + return self.session.crypto.dehydrationService + } + + return nil + } + private func createRecoverFromKeyCoordinator() -> SecretsRecoveryWithKeyCoordinator { - let coordinator = SecretsRecoveryWithKeyCoordinator(recoveryService: self.session.crypto.recoveryService, recoveryGoal: self.recoveryGoal, cancellable: self.cancellable) + let coordinator = SecretsRecoveryWithKeyCoordinator(recoveryService: self.session.crypto.recoveryService, + recoveryGoal: self.recoveryGoal, + cancellable: self.cancellable, + dehydrationService: dehydrationService) coordinator.delegate = self return coordinator } private func createRecoverFromPassphraseCoordinator() -> SecretsRecoveryWithPassphraseCoordinator { - let coordinator = SecretsRecoveryWithPassphraseCoordinator(recoveryService: self.session.crypto.recoveryService, recoveryGoal: self.recoveryGoal, cancellable: self.cancellable) + let coordinator = SecretsRecoveryWithPassphraseCoordinator(recoveryService: self.session.crypto.recoveryService, + recoveryGoal: self.recoveryGoal, + cancellable: self.cancellable, + dehydrationService: dehydrationService) coordinator.delegate = self return coordinator } diff --git a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift index 58ebf79ba..9dc055e49 100644 --- a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift +++ b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyCoordinator.swift @@ -42,8 +42,13 @@ final class SecretsSetupRecoveryKeyCoordinator: SecretsSetupRecoveryKeyCoordinat passphrase: String?, passphraseOnly: Bool, allowOverwrite: Bool = false, - cancellable: Bool) { - let secretsSetupRecoveryKeyViewModel = SecretsSetupRecoveryKeyViewModel(recoveryService: recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly, allowOverwrite: allowOverwrite) + cancellable: Bool, + dehydrationService: DehydrationService?) { + let secretsSetupRecoveryKeyViewModel = SecretsSetupRecoveryKeyViewModel(recoveryService: recoveryService, + passphrase: passphrase, + passphraseOnly: passphraseOnly, + allowOverwrite: allowOverwrite, + dehydrationService: dehydrationService) let secretsSetupRecoveryKeyViewController = SecretsSetupRecoveryKeyViewController.instantiate(with: secretsSetupRecoveryKeyViewModel, cancellable: cancellable) self.secretsSetupRecoveryKeyViewModel = secretsSetupRecoveryKeyViewModel self.secretsSetupRecoveryKeyViewController = secretsSetupRecoveryKeyViewController diff --git a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift index af85b7eb7..c91cb6787 100644 --- a/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift +++ b/Riot/Modules/Secrets/Setup/RecoveryKey/SecretsSetupRecoveryKeyViewModel.swift @@ -28,6 +28,7 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy private let passphrase: String? private let passphraseOnly: Bool private let allowOverwrite: Bool + private let dehydrationService: DehydrationService? // MARK: Public @@ -36,11 +37,12 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy // MARK: - Setup - init(recoveryService: MXRecoveryService, passphrase: String?, passphraseOnly: Bool, allowOverwrite: Bool = false) { + init(recoveryService: MXRecoveryService, passphrase: String?, passphraseOnly: Bool, allowOverwrite: Bool = false, dehydrationService: DehydrationService?) { self.recoveryService = recoveryService self.passphrase = passphrase self.passphraseOnly = passphraseOnly self.allowOverwrite = allowOverwrite + self.dehydrationService = dehydrationService } // MARK: - Public @@ -76,6 +78,10 @@ final class SecretsSetupRecoveryKeyViewModel: SecretsSetupRecoveryKeyViewModelTy self.recoveryService.createRecovery(forSecrets: nil, withPassphrase: self.passphrase, createServicesBackups: true, success: { secretStorageKeyCreationInfo in self.update(viewState: .recoveryCreated(secretStorageKeyCreationInfo.recoveryKey)) + + Task { + await self.dehydrationService?.runDeviceDehydrationFlow(privateKeyData: secretStorageKeyCreationInfo.privateKey) + } }, failure: { error in self.update(viewState: .error(error)) }) diff --git a/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift b/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift index 0cb633945..9752e3609 100644 --- a/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift +++ b/Riot/Modules/SecureBackup/Setup/SecureBackupSetupCoordinator.swift @@ -104,8 +104,21 @@ final class SecureBackupSetupCoordinator: SecureBackupSetupCoordinatorType { return introViewController } + private var dehydrationService: DehydrationService? { + if self.session.vc_homeserverConfiguration().encryption.deviceDehydrationEnabled { + return self.session.crypto.dehydrationService + } + + return nil + } + private func showSetupKey(passphraseOnly: Bool, passphrase: String? = nil) { - let coordinator = SecretsSetupRecoveryKeyCoordinator(recoveryService: self.recoveryService, passphrase: passphrase, passphraseOnly: passphraseOnly, allowOverwrite: allowOverwrite, cancellable: self.cancellable) + let coordinator = SecretsSetupRecoveryKeyCoordinator(recoveryService: self.recoveryService, + passphrase: passphrase, + passphraseOnly: passphraseOnly, + allowOverwrite: allowOverwrite, + cancellable: self.cancellable, + dehydrationService: dehydrationService) coordinator.delegate = self coordinator.start() From a1a7af1b8b622a0479d809524524f8d157cbecec Mon Sep 17 00:00:00 2001 From: random Date: Fri, 16 Jun 2023 10:18:13 +0000 Subject: [PATCH 08/40] Translated using Weblate (Italian) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/ --- Riot/Assets/it.lproj/Vector.strings | 37 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index 81f489410..d3c3cf5c5 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -274,7 +274,7 @@ "room_title_members" = "%@ membri"; "room_title_one_member" = "1 membro"; // Room Preview -"room_preview_invitation_format" = "Sei stato invitato ad entrare in questa stanza da %@"; +"room_preview_invitation_format" = "Sei stato/a invitato/a ad entrare in questa stanza da %@"; "room_preview_subtitle" = "Questa è l'anteprima della stanza. Le interazioni sono disabilitate."; "room_preview_unlinked_email_warning" = "Questo invito è stato spedito a %@, che non è associato a questo account. Puoi aggiungere questa email al tuo account o provare ad accedere con un account differente."; "room_preview_try_join_an_unknown_room" = "Stai provando ad accedere a %@. Desideri entrare per partecipare alla discussione?"; @@ -457,7 +457,7 @@ "group_home_multi_members_format" = "%tu membri"; "group_home_one_room_format" = "1 stanza"; "group_home_multi_rooms_format" = "%tu stanze"; -"group_invitation_format" = "%@ ti ha invitato ad unirti a questa comunità"; +"group_invitation_format" = "%@ ti ha invitato/a ad unirti a questa comunità"; // Group participants "group_participants_add_participant" = "Aggiungi membri"; "group_participants_leave_prompt_title" = "Lascia la stanza"; @@ -649,7 +649,7 @@ "sign_out_key_backup_in_progress_alert_cancel_action" = "Attendo"; "close" = "Chiudi"; "auth_forgot_password_error_no_configured_identity_server" = "Non è stato configurato alcun server d'identità: aggiungine uno per ripristinare la password dell'account Matrix."; -"auth_softlogout_signed_out" = "Sei uscito"; +"auth_softlogout_signed_out" = "Sei disconnesso/a"; "auth_softlogout_sign_in" = "Accedi"; "auth_softlogout_reason" = "L'amministratore dell'Home Server (%1$@) ti ha disconnesso dal tuo account %2$@ (%3$@)."; "auth_softlogout_recover_encryption_keys" = "Accedi per recuperare le chiavi crittografiche archiviate su questo dispositivo. Le chiavi ti servono per poter leggere i tuoi messaggi cifrati su altri dispositivi."; @@ -1164,7 +1164,7 @@ "biometrics_cant_unlocked_alert_message_login" = "Riaccedi"; "biometrics_cant_unlocked_alert_message_retry" = "Riprova"; "device_verification_self_verify_wait_recover_secrets_checking_availability" = "Controllo di altre possibilità di verifica..."; -"joined" = "Entrato"; +"joined" = "Entrato/a"; "switch" = "Cambia"; "more" = "Altro"; "pin_protection_choose_pin_welcome_after_login" = "Bentornato/a."; @@ -1832,7 +1832,7 @@ "room_error_cannot_load_timeline" = "Caricamento storico dei messaggi fallito"; "room_error_timeline_event_not_found_title" = "Caricamento della posizione nello storico fallito"; "room_error_timeline_event_not_found" = "L'applicazione ha cercato di caricare un punto specifico dello storico dei messaggi in questo canale, ma non è riuscita a trovarlo"; -"room_left" = "Sei uscito dalla stanza"; +"room_left" = "Sei uscito/a dalla stanza"; "room_no_power_to_create_conference_call" = "Hai bisogno del permesso per invitare a iniziare una conferenza in questo canale"; "room_no_conference_call_in_encrypted_rooms" = "Le chiamate in conferenza non sono supportate nei canali criptati"; // Reply to message @@ -1906,7 +1906,7 @@ // Language picker "language_picker_title" = "Scegli una lingua"; "language_picker_default_language" = "Predefinito (%@)"; -"notice_room_invite" = "%@ invitato %@"; +"notice_room_invite" = "%@ ha invitato %@"; "notice_room_third_party_invite" = "%@ ha invitato %@ a unirsi al canale"; "notice_room_third_party_registered_invite" = "%@ ha accettato l'invito per %@"; "notice_room_third_party_revoked_invite" = "%@ ha ritirato l'invito per %@ a unirsi al canale"; @@ -1944,7 +1944,7 @@ "login" = "Entra"; "create_account" = "Crea utente"; "membership_invite" = "Invitati"; -"membership_leave" = "Uscito"; +"membership_leave" = "Uscito/a"; "membership_ban" = "Espulso"; "num_members_one" = "%@ utente"; "num_members_other" = "%@ utenti"; @@ -1979,7 +1979,7 @@ "notification_settings_contain_my_user_name" = "Notifica con un suono i messaggi che contengono il mio nome utente"; "notification_settings_contain_my_display_name" = "Notifica con un suono i messaggi che contengono il mio nome completo"; "notification_settings_just_sent_to_me" = "Notifica con un suono i messaggi inviati solo a me"; -"notification_settings_invite_to_a_new_room" = "Notifica quando sono invitato in un nuovo canale"; +"notification_settings_invite_to_a_new_room" = "Avvisami quando sono invitato/a in una nuova stanza"; "notification_settings_people_join_leave_rooms" = "Notifica quando gli utenti entrano o escono dai canali"; "notification_settings_receive_a_call" = "Notifica quando ricevo una chiamata"; "notification_settings_suppress_from_bots" = "Sopprimi le notifiche dai bot"; @@ -2009,12 +2009,12 @@ "notice_encryption_enabled_unknown_algorithm" = "%1$@ ha attivato la crittografia end-to-end (algoritmo %2$@ non riconosciuto)."; // Notice Events with "You" "notice_room_invite_by_you" = "Hai invitato %@"; -"notice_room_invite_you" = "%@ ti ha invitato"; +"notice_room_invite_you" = "%@ ti ha invitato/a"; "notice_room_third_party_invite_by_you" = "Hai mandato un invito a %@ a unirsi alla stanza"; "notice_room_third_party_registered_invite_by_you" = "Hai accettato l'invito per %@"; "notice_room_third_party_revoked_invite_by_you" = "Hai revocato l'invito per %@ a unirsi alla stanza"; -"notice_room_join_by_you" = "Sei entrato"; -"notice_room_leave_by_you" = "Sei uscito"; +"notice_room_join_by_you" = "Sei entrato/a"; +"notice_room_leave_by_you" = "Sei uscito/a"; "notice_room_reject_by_you" = "Hai rifiutato l'invito"; "notice_room_kick_by_you" = "Hai rimosso %@"; "notice_room_unban_by_you" = "Hai riammesso %@"; @@ -2049,7 +2049,7 @@ "notice_room_join_rule_public" = "%@ ha reso la stanza pubblica."; "notice_room_join_rule_public_by_you" = "Hai reso la stanza pubblica."; "notice_room_name_removed_for_dm" = "%@ ha rimosso il nome"; -"notice_room_created_for_dm" = "%@ è entrato."; +"notice_room_created_for_dm" = "%@ è entrato/a."; "notice_room_join_rule_invite_for_dm" = "%@ l'ha resa solo su invito."; "notice_room_join_rule_invite_by_you_for_dm" = "L'hai resa solo su invito."; "notice_room_join_rule_public_for_dm" = "%@ l'ha resa pubblica."; @@ -2059,7 +2059,7 @@ "notice_room_history_visible_to_members_for_dm" = "%@ ha reso visibili i messaggi futuri a tutti i membri della stanza."; "notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ ha reso visibili i messaggi futuri a chiunque, dal momento dell'invito."; "notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ ha reso visibili i messaggi futuri a chiunque, dal momento dell'entrata."; -"room_left_for_dm" = "Sei uscito"; +"room_left_for_dm" = "Sei uscito/a"; "notice_room_third_party_invite_for_dm" = "%@ ha invitato %@"; "notice_room_third_party_revoked_invite_for_dm" = "%@ ha revocato l'invito per %@"; "notice_room_name_changed_for_dm" = "%@ ha cambiato il nome in %@."; @@ -2067,7 +2067,7 @@ "notice_room_third_party_revoked_invite_by_you_for_dm" = "Hai revocato l'invito per %@"; "notice_room_name_changed_by_you_for_dm" = "Hai cambiato il nome in %@."; "notice_room_name_removed_by_you_for_dm" = "Hai rimosso il nome"; -"notice_room_created_by_you_for_dm" = "Sei entrato."; +"notice_room_created_by_you_for_dm" = "Sei entrato/a."; "notice_room_history_visible_to_members_by_you_for_dm" = "Hai reso visibili i messaggi futuri a tutti i membri della stanza."; "notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Hai reso visibili i messaggi futuri a chiunque, dal momento dell'invito."; "notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Hai reso visibili i messaggi futuri a chiunque, dal momento dell'entrata."; @@ -2096,7 +2096,7 @@ "attachment_small_with_resolution" = "Piccolo %@ (~%@)"; "attachment_size_prompt_message" = "Puoi disattivarlo nelle impostazioni."; "attachment_size_prompt_title" = "Conferma dimensione da inviare"; -"room_displayname_all_other_members_left" = "%@ (Uscito)"; +"room_displayname_all_other_members_left" = "%@ (Uscito/a)"; "attachment_unsupported_preview_message" = "Questo tipo di file non è supportato."; "attachment_unsupported_preview_title" = "Anteprima non disponibile"; "message_reply_to_sender_sent_their_location" = "ha condiviso la sua posizione."; @@ -2273,7 +2273,7 @@ "location_sharing_live_list_item_last_update_invalid" = "Ultimo aggiornamento sconosciuto"; "location_sharing_live_list_item_last_update" = "Aggiornato %@ fa"; "location_sharing_live_list_item_sharing_expired" = "Condivisione scaduta"; -"location_sharing_live_list_item_time_left" = "%@ è uscito"; +"location_sharing_live_list_item_time_left" = "%@ è uscito/a"; "location_sharing_live_viewer_title" = "Posizione"; "location_sharing_live_map_callout_title" = "Condividi posizione"; "bug_report_logs_description" = "Per diagnosticare i problemi, i registri di questo client verranno inviati con questo rapporto di errore. Se preferisci inviare solo il testo soprastante, deseleziona:"; @@ -2737,3 +2737,8 @@ "room_command_change_display_name_description" = "Cambia il tuo nome visualizzato"; "notice_display_name_changed_to" = "%@ ha cambiato il suo nome visualizzato in %@"; "poll_timeline_loading" = "Caricamento..."; +"room_creation_user_not_found_prompt_title" = "Conferma"; +"room_creation_user_not_found_prompt_invite_action" = "Inizia il messaggio lo stesso"; +"room_participants_invite_anyway" = "Invita lo stesso"; +"room_participants_invite_unknown_participant_prompt_to_msg" = "Impossibile trovare profili con questo ID Matrix. Vuoi davvero invitare %@ in %@?"; +"room_creation_user_not_found_prompt_message" = "Impossibile trovare profili con questo ID Matrix. Vuoi comunque iniziare un messaggio diretto?"; From 257bd5843bdb02f2b5e6e6e95bc29e7e0c08b3a3 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 30 Jun 2023 18:54:59 +0000 Subject: [PATCH 09/40] Translated using Weblate (Swedish) Currently translated at 99.2% (2389 of 2406 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sv/ --- Riot/Assets/sv.lproj/Vector.strings | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index bbb4b12c5..17ad24b8d 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -2676,3 +2676,9 @@ "room_command_change_room_topic_description" = "Sätter rummets ämne"; "room_command_discard_session_description" = "Tvingar den aktuella utgående gruppsessionen i ett krypterat rum att kasseras"; "room_command_error_unknown_command" = "Ogiltigt eller obehandlat kommando"; + +// Legacy to Rust security upgrade + +"key_verification_self_verify_security_upgrade_alert_title" = "App uppdaterad"; +"key_verification_self_verify_security_upgrade_alert_message" = "Säker meddelandehantering har förbättrats med den senaste uppdateringen. Vänligen verifiera din enhet igen."; +"device_verification_self_verify_open_on_other_device_title" = "Öppna %@ på din andra enhet"; From 741dc505715cd6e61efb5227b385f68b94bb7079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 5 Jul 2023 05:33:01 +0000 Subject: [PATCH 10/40] Translated using Weblate (Estonian) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/ --- Riot/Assets/et.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index 21f95be98..0cad547d7 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -2709,3 +2709,8 @@ "room_command_change_display_name_description" = "Muudab sinu kuvatavat nime"; "notice_display_name_changed_to" = "%@ muutis oma kuvatavaks nimeks %@"; "poll_timeline_loading" = "Laadin..."; +"room_creation_user_not_found_prompt_title" = "Kinnitus"; +"room_creation_user_not_found_prompt_invite_action" = "Ikkagi alusta vestlust"; +"room_creation_user_not_found_prompt_message" = "Sellele Matrix'i kasutajatunnuse profiili ei leidu. Kas sa ikkagi tahaksid temaga vestlust alustada?"; +"room_participants_invite_unknown_participant_prompt_to_msg" = "Sellele Matrix'i kasutajatunnuse profiili ei leidu. Kas sa ikkagi tahaksid saata kutset kasutajale %@ jututuppa %@?"; +"room_participants_invite_anyway" = "Kutsu siiski"; From 294873dc75423138b3013ddf23f403d17438832c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D1=8F?= Date: Sun, 2 Jul 2023 17:51:17 +0000 Subject: [PATCH 11/40] Translated using Weblate (Russian) Currently translated at 85.8% (2066 of 2406 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/ --- Riot/Assets/ru.lproj/Vector.strings | 88 +++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/Riot/Assets/ru.lproj/Vector.strings b/Riot/Assets/ru.lproj/Vector.strings index 2f016c5fd..3e96f0ad3 100644 --- a/Riot/Assets/ru.lproj/Vector.strings +++ b/Riot/Assets/ru.lproj/Vector.strings @@ -2265,3 +2265,91 @@ // Room Access Settings "room_access_settings_screen_nav_title" = "Доступ к комнате"; "spaces_coming_soon_detail" = "Эта функция еще не реализована здесь, но она в разработке. На данный момент вы можете сделать это с помощью %@ на своем компьютере."; + +// Unverified sessions +"key_verification_alert_title" = "У вас есть не подтвержденные сессии"; +"key_verification_scan_qr_code_title" = "Сканируйте QR-код"; +"home_context_menu_favourite" = "Любимые"; +"spaces_add_space_title" = "Создать пространство"; +"room_details_promote_room_title" = "Продвигать комнату"; +"room_suggestion_settings_screen_title" = "Сделать комнату предлагаемой в пространстве"; +"analytics_prompt_terms_link_new_user" = "здесь"; +"create_room_suggest_room" = "Предложения для пользователей пространства"; +"room_info_back_button_title" = "Информация о комнате"; +"home_context_menu_make_dm" = "Перейти к людям"; +"create_room_processing" = "Создание комнаты"; +"home_context_menu_unmute" = "Снять заглушку"; + +// MARK: - Room invite + +"room_invite_to_space_option_title" = "К %@"; +"analytics_prompt_yes" = "Да, все классно"; +"create_room_section_footer_type_private" = "Только приглашенные люди могут искать и вступать."; +"home_context_menu_make_room" = "Перейти к комнатам"; +"create_room_suggest_room_footer" = "Предлагаемые комнаты выдвинуты для участников как лучший выбор для вступления."; +"home_context_menu_notifications" = "Уведомления"; +"analytics_prompt_terms_link_upgrade" = "здесь"; +"device_verification_self_verify_open_on_other_device_title" = "Откройте %@ на другом вашем устройстве"; +"create_room_section_footer_type_public" = "Только приглашенные люди могут искать и вступать, не только люди из пространства."; +"home_context_menu_unfavourite" = "Удалить из любимых"; +"home_context_menu_normal_priority" = "Нормальный приоритет"; +"home_context_menu_mute" = "Заглушить"; +"room_access_settings_screen_upgrade_alert_upgrading" = "Улучшение комнаты"; +"room_access_settings_screen_upgrade_alert_upgrade_button" = "Улучшить"; +"key_backup_recover_from_private_key_progress" = "%@%% закончено"; +"room_access_settings_screen_upgrade_alert_title" = "Улучшить комнату"; +"share_extension_low_quality_video_message" = "Отправьте в %@ для лучшего качества или отправьте в пониженном качестве."; +"settings_acceptable_use" = "Принимаемые политики пользования"; +"room_suggestion_settings_screen_message" = "Предлагаемые комнаты рекламируются среди участников пространства как подходящие для присоединения."; +/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */ +"analytics_prompt_terms_new_user" = "Вы можете прочитать все наши условия %@."; +"key_verification_alert_body" = "Перепроверьте надежность сохранности аккаунта."; + +// MARK: - Launch loading + +"launch_loading_generic" = "Синхронизация ваших разговоров"; +"home_context_menu_mark_as_unread" = "Пометить как непрочитанное"; + +// MARK: Sign out warning + +"sign_out" = "Выйти"; +"room_command_unban_user_description" = "Разблокирует пользователя с указанным ID"; +"device_verification_self_verify_open_on_other_device_information" = "Вам нужно подтвердить эту сессию для того, чтобы прочитать защищенную историю сообщений\n\nОткройте Element на одном из ваших прочих устройств и действуйте по инструкции."; +"room_command_change_room_topic_description" = "Указывает тему комнаты"; +"room_access_settings_screen_upgrade_required" = "Требуется улучшение"; +"key_verification_scan_qr_code_information_other_user" = "Наведите камеру на QR-код, отображенном на вашем устройстве для подтверждения ваших сессий"; + +// Room suggestion Settings +"room_suggestion_settings_screen_nav_title" = "Предложить комнату"; +/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */ +"analytics_prompt_terms_upgrade" = "Прочитать все наши условия %@. Они подходят?"; +"key_verification_scan_qr_code_information_other_session" = "Наведите камеру на QR-код, отображенном на другом вашем устройстве для подтверждения вашей сессии"; +"key_verification_scan_qr_code_information_other_device" = "Наведите камеру на QR-код, отображенном на другом вашем устройстве для подтверждения этой сессии"; +"create_room_type_restricted" = "Участники пространства"; +"home_context_menu_low_priority" = "Низкий приоритет"; +"share_invite_link_space_text" = "Хэй, вступай в это пространство на %@"; +"create_room_promotion_header" = "ПРОДВИЖЕНИЕ"; +"create_room_show_in_directory_footer" = "Это может помочь людям искать и вступать."; +"space_invite_not_enough_permission" = "У вас нет разрешения для приглашения людей в это пространство"; + +// Room commands descriptions +"room_command_change_display_name_description" = "Изменяет отображаемое имя пользователя"; +"room_command_emote_description" = "Отображает действие"; +"room_command_join_room_description" = "Присоединяться к комнате с указанным адресом"; +"room_command_part_room_description" = "Покинуть комнату"; +"room_command_invite_user_description" = "Добавляет пользователя с указанным ID в текущую комнату"; +"room_command_kick_user_description" = "Удаляет пользователя с указанным ID из этой комнаты"; +"room_command_ban_user_description" = "Блокирует пользователя с указанным ID"; +"room_command_set_user_power_level_description" = "Назначает уровень силы пользователя"; +"room_command_reset_user_power_level_description" = "Разжалует пользователя с указанным ID"; +"room_command_discard_session_description" = "Принудительно отбрасывает текущий исходящий групповой сеанс в зашифрованной комнате"; +"room_command_error_unknown_command" = "Некорректная или необработанная команда"; + +// Legacy to Rust security upgrade + +"key_verification_self_verify_security_upgrade_alert_title" = "Приложение обновлено"; +"key_verification_self_verify_security_upgrade_alert_message" = "Безопасное общение может быть улучшено с новым обновлением. Пожалуйста, проверьте ваше устройство."; +"device_verification_self_verify_wait_recover_secrets_additional_help" = "Нет доступа к существующей %@ сессии?"; +"key_verification_scan_qr_code_information_new_session" = "Наведите камеру на QR-код, отображенном на другом вашем устройстве для подтверждения вашей новой сессии"; +"create_room_section_footer_type_restricted" = "Все в пространстве могут искать и вступать."; +"launch_loading_delay_warning" = "Это может занимать больше времени.\nСпасибо за терпение."; From f04905aab983a35ec5f9d805e5df93b1ca7d0a40 Mon Sep 17 00:00:00 2001 From: Vri Date: Fri, 7 Jul 2023 12:00:23 +0000 Subject: [PATCH 12/40] Translated using Weblate (German) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 035279b74..60aa50e1f 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -2771,3 +2771,8 @@ "notice_display_name_changed_to" = "%@ hat den Anzeigenamen zu %@ geändert"; "poll_timeline_loading" = "Lade …"; "room_command_discard_session_description" = "Erzwingt das Verferfen der aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum"; +"room_creation_user_not_found_prompt_title" = "Bestätigung"; +"room_creation_user_not_found_prompt_message" = "Wir konnten kein Profil für diese Matrix-ID finden. Möchtest du dennoch eine Direktnachricht beginnen?"; +"room_creation_user_not_found_prompt_invite_action" = "Dennoch DM beginnen"; +"room_participants_invite_unknown_participant_prompt_to_msg" = "Wir konnten kein Profil für diese Matrix-ID finden. Möchtest du wirklich %@ nach %@ einladen?"; +"room_participants_invite_anyway" = "Dennoch einladen"; From d626116c46957671a460ea25dd3a6fa291c9bd23 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 24 Jul 2023 19:31:46 +0000 Subject: [PATCH 13/40] Translated using Weblate (Swedish) Currently translated at 99.4% (2392 of 2406 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sv/ --- Riot/Assets/sv.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index 17ad24b8d..a4bb2fe70 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -2682,3 +2682,6 @@ "key_verification_self_verify_security_upgrade_alert_title" = "App uppdaterad"; "key_verification_self_verify_security_upgrade_alert_message" = "Säker meddelandehantering har förbättrats med den senaste uppdateringen. Vänligen verifiera din enhet igen."; "device_verification_self_verify_open_on_other_device_title" = "Öppna %@ på din andra enhet"; +"device_verification_self_verify_wait_recover_secrets_additional_help" = "Kan du inte komma åt en befintlig %@-session?"; +"key_verification_scan_qr_code_title" = "Skanna QR-kod"; +"device_verification_self_verify_open_on_other_device_information" = "Du behöver verifiera den här sessionen för att kunna läsa din säkra meddelandehistorik.\n\nÖppna Element på en av dina andra enheter och följ instruktionerna."; From 5b80670e1b58f62e541ba69e4f8da2cda91013d8 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 24 Jul 2023 19:32:18 +0000 Subject: [PATCH 14/40] Translated using Weblate (Swedish) Currently translated at 100.0% (2406 of 2406 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sv/ --- Riot/Assets/sv.lproj/Vector.strings | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index a4bb2fe70..48d13aea8 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -2685,3 +2685,22 @@ "device_verification_self_verify_wait_recover_secrets_additional_help" = "Kan du inte komma åt en befintlig %@-session?"; "key_verification_scan_qr_code_title" = "Skanna QR-kod"; "device_verification_self_verify_open_on_other_device_information" = "Du behöver verifiera den här sessionen för att kunna läsa din säkra meddelandehistorik.\n\nÖppna Element på en av dina andra enheter och följ instruktionerna."; +"key_verification_scan_qr_code_information_other_user" = "Rikta kameran mot QR-koden som visas på deras enhet för att verifiera deras session"; +"room_waiting_other_participants_title" = "Väntar på att användare ska gå med i %@"; +"pill_message_from" = "Meddelande från %@"; +"pill_message_in" = "Meddelande i %@"; +"notice_display_name_changed_to" = "%@ bytte sitt visningsnamn till %@"; + +// MARK: - Launch loading + +"launch_loading_generic" = "Synkar dina konversationer"; +"launch_loading_delay_warning" = "Detta kan ta lite längre tid.\nTack för ditt tålamod."; +"key_verification_scan_qr_code_information_other_device" = "Rikta kameran mot QR-koden som visas på din andra enhet för att verifiera den här sessionen"; +"room_waiting_other_participants_message" = "När inbjudna användare har gått med i %@ kommer du att kunna chatta och rummet kommer att totalsträckskrypteras"; +"poll_timeline_loading" = "Laddar …"; + +// Pills +"pill_room_fallback_display_name" = "Utrymme/rum"; +"pill_message" = "Meddelande"; +"key_verification_scan_qr_code_information_new_session" = "Rikta kameran mot QR-koden som visas på din andra enhet för att verifiera din nya session"; +"key_verification_scan_qr_code_information_other_session" = "Rikta kameran mot QR-koden som visas på din andra enhet för att verifiera din session"; From c906b8ec42087d8b59200785784570f6aec13b89 Mon Sep 17 00:00:00 2001 From: Kim Brose Date: Fri, 28 Jul 2023 11:24:29 +0000 Subject: [PATCH 15/40] Translated using Weblate (German) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 60aa50e1f..7b91c3a9f 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -406,8 +406,8 @@ "settings_ui_language" = "Sprache"; // Events formatter "event_formatter_member_updates" = "%tu Änderungen der Mitgliedschaft"; -"contacts_user_directory_section" = "NUTZER VERZEICHNIS"; -"contacts_user_directory_offline_section" = "NUTZER VERZEICHNIS (offline)"; +"contacts_user_directory_section" = "NUTZERVERZEICHNIS"; +"contacts_user_directory_offline_section" = "NUTZERVERZEICHNIS (offline)"; "auth_home_server_placeholder" = "URL (z.B. https://matrix.org)"; "auth_identity_server_placeholder" = "URL (z. B. https://vector.im)"; "room_ongoing_conference_call_close" = "Schließen"; From 7994dea3da19331210329f0d493728fcaba7d279 Mon Sep 17 00:00:00 2001 From: Vri Date: Tue, 1 Aug 2023 13:05:20 +0000 Subject: [PATCH 16/40] Translated using Weblate (German) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 7b91c3a9f..ae6ee3d05 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -2396,12 +2396,12 @@ "room_suggestion_settings_screen_nav_title" = "Raum vorschlagen"; "room_access_space_chooser_other_spaces_section_info" = "Diese sind vermutlich Dinge, zu denen andere Admins von %@ gehören."; "room_access_space_chooser_other_spaces_section" = "Andere Spaces oder Räume"; -"room_access_settings_screen_setting_room_access" = "Lege Raumzugriff fest"; -"room_access_settings_screen_upgrade_alert_upgrading" = "Raum upgraden"; +"room_access_settings_screen_setting_room_access" = "Raumzutritt festlegen"; +"room_access_settings_screen_upgrade_alert_upgrading" = "Raum aktualisieren"; "room_access_settings_screen_upgrade_alert_upgrade_button" = "Aktualisieren"; "room_access_settings_screen_upgrade_alert_auto_invite_switch" = "Mitglieder automatisch zu neuem Raum einladen"; -"room_access_settings_screen_upgrade_alert_message" = "Jeder in %@ kann diesen Raum finden und ihm beitreten - jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern."; -"room_access_settings_screen_upgrade_alert_title" = "Raum upgraden"; +"room_access_settings_screen_upgrade_alert_message" = "Jeder in %@ kann diesen Raum finden und ihm beitreten – jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern."; +"room_access_settings_screen_upgrade_alert_title" = "Raum aktualisieren"; "room_access_settings_screen_edit_spaces" = "Spaces bearbeiten"; "room_access_settings_screen_upgrade_required" = "Upgrade erforderlich"; "room_access_settings_screen_message" = "Lege fest, wer %@ finden und beitreten kann."; @@ -2461,13 +2461,13 @@ "threads_discourage_information_1" = "Dein Heimserver unterstützt aktuell keine Threads, weshalb diese Funktion unzuverlässig sein könnte. Manche Thread-Nachrichten könnten nicht zuverlässig verfügbar sein. "; "all_chats_nothing_found_placeholder_title" = "Nichts gefunden."; "spaces_create_subspace_title" = "Sub-Space erstellen"; -"room_access_settings_screen_upgrade_alert_note" = "Bitte beachte, dass das Upgrade eine neue Version dieses Raums erstellt. Alle aktuellen Nachrichten bleiben in diesem archivierten Raum."; +"room_access_settings_screen_upgrade_alert_note" = "Bitte beachte, dass die Aktualisierung eine neue Version dieses Raums erstellt. Alle aktuellen Nachrichten bleiben in diesem archivierten Raum."; "invite_to" = "Zu %@ einladen"; "all_chats_empty_unreads_placeholder_message" = "Hier werden deine ungelesenen Nachrichten erscheinen, wenn du welche hast."; "all_chats_edit_layout_show_recents" = "Historie anzeigen"; "all_chats_empty_list_placeholder_title" = "Du bist auf dem neuesten Stand."; "spaces_explore_rooms_format" = "%@ erkunden"; -"room_access_settings_screen_upgrade_alert_message_no_param" = "Jeder in einem übergeordneten Space kann diesen Raum finden und ihm beitreten - jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern."; +"room_access_settings_screen_upgrade_alert_message_no_param" = "Jeder in einem übergeordneten Space kann diesen Raum finden und ihm beitreten – jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern."; "room_access_settings_screen_public_message" = "Sichtbar und zugänglich für jeden."; "room_access_settings_screen_restricted_message" = "Sichtbar und betretbar für jeden Nutzer in einem Space.\nDu wählst, für welche Spaces dies gilt."; "room_access_settings_screen_private_message" = "Nur sichtbar und betretbar für eingeladene Personen."; From b3c7fee7219c7edb918cdaebd9e2b2948078f748 Mon Sep 17 00:00:00 2001 From: Victor Grousset Date: Fri, 4 Aug 2023 03:04:48 +0000 Subject: [PATCH 17/40] Translated using Weblate (Esperanto) Currently translated at 62.1% (1499 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/eo/ --- Riot/Assets/eo.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/eo.lproj/Vector.strings b/Riot/Assets/eo.lproj/Vector.strings index 2e91114ed..a09965843 100644 --- a/Riot/Assets/eo.lproj/Vector.strings +++ b/Riot/Assets/eo.lproj/Vector.strings @@ -1968,7 +1968,7 @@ "notice_encrypted_message" = "Ĉifrita mesaĝo"; "notice_room_related_groups" = "Grupoj rilataj al ĉi tiu ĉambro estas: %@"; "notice_room_aliases_for_dm" = "La kromnomoj estas: %@"; -"notice_room_aliases" = "Kromnomoj de la ĉamrbo estas: %@"; +"notice_room_aliases" = "Kromnomoj de la ĉambro estas: %@"; "notice_room_power_level_event_requirement" = "La minimumaj povniveloj rilataj al okazoj estas:"; "notice_room_power_level_acting_requirement" = "La minimuma povnivelo, kiun uzanto bezonas antaŭ agi, estas:"; "notice_room_power_level_intro_for_dm" = "La povniveloj de ĉambranoj estas:"; From 9c75a8d0203523880fd4e4d7f52eef0302075b84 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 4 Aug 2023 18:35:22 +0000 Subject: [PATCH 18/40] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/ --- Riot/Assets/uk.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index bac3f4c30..22f63ba25 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -2962,3 +2962,8 @@ "room_command_change_display_name_description" = "Змінює ваш нік"; "notice_display_name_changed_to" = "%@ змінили своє показуване ім'я на %@"; "poll_timeline_loading" = "Завантаження..."; +"room_creation_user_not_found_prompt_invite_action" = "Усе одно розпочати приватну бесіду"; +"room_participants_invite_anyway" = "Усе одно запросити"; +"room_creation_user_not_found_prompt_title" = "Підтвердження"; +"room_creation_user_not_found_prompt_message" = "Не вдалося знайти профілі для цього Matrix ID. Усе одно хочете розпочати приватну бесіду?"; +"room_participants_invite_unknown_participant_prompt_to_msg" = "Не вдалося знайти профілі для цього Matrix ID. Ви впевнені, що хочете запросити %@ до %@?"; From f252a4ac427ef4baf3da72b5aff5272d71075067 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sat, 5 Aug 2023 22:46:12 +0000 Subject: [PATCH 19/40] Translated using Weblate (Slovak) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/ --- Riot/Assets/sk.lproj/Vector.strings | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Riot/Assets/sk.lproj/Vector.strings b/Riot/Assets/sk.lproj/Vector.strings index 91e52cee0..061991f16 100644 --- a/Riot/Assets/sk.lproj/Vector.strings +++ b/Riot/Assets/sk.lproj/Vector.strings @@ -2960,3 +2960,8 @@ "room_command_change_display_name_description" = "Mení vaše zobrazované meno / prezývku"; "notice_display_name_changed_to" = "%@ zmenil/a svoje zobrazované meno na %@"; "poll_timeline_loading" = "Načítavanie…"; +"room_creation_user_not_found_prompt_title" = "Potvrdenie"; +"room_creation_user_not_found_prompt_invite_action" = "Spustiť konverzáciu aj tak"; +"room_participants_invite_anyway" = "Napriek tomu pozvať"; +"room_creation_user_not_found_prompt_message" = "Nie je možné nájsť používateľské profily pre toto Matrix ID. Chcete aj tak poslať priamu správu?"; +"room_participants_invite_unknown_participant_prompt_to_msg" = "Nie je možné nájsť profily pre toto Matrix ID. Ste si istí, že chcete pozvať %@ do %@?"; From b898e90fe21a6512b11bc8352aa3fcc2f0165260 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 8 Aug 2023 21:12:48 +0000 Subject: [PATCH 20/40] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2411 of 2411 strings) Translation: Element iOS/Element iOS Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/ --- Riot/Assets/uk.lproj/Vector.strings | 50 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 22f63ba25..d5113e3c7 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -184,7 +184,7 @@ "settings_remove_prompt_title" = "Підтвердження"; "settings_surname" = "Прізвище"; "settings_first_name" = "Ім’я"; -"settings_display_name" = "Показуване ім’я"; +"settings_display_name" = "Псевдонім"; "settings_profile_picture" = "Зображення профілю"; "settings_sign_out_e2e_warn" = "Ви втратите всі ваші ключі наскрізного шифрування. Це означає що ви більше не будете мати змогу читати старі повідомлення у зашифрованих кімнатах на цьому пристрої."; "settings_sign_out_confirmation" = "Ви впевнені?"; @@ -433,7 +433,7 @@ "room_widget_permission_theme_permission" = "Ваша тема"; "room_widget_permission_user_id_permission" = "Ваш ID користувача"; "room_widget_permission_avatar_url_permission" = "URL-адреса вашого аватара"; -"room_widget_permission_display_name_permission" = "Ваше показуване імʼя"; +"room_widget_permission_display_name_permission" = "Ваш псевдонім"; "room_widget_permission_creator_info_title" = "Цей віджет додано:"; // Room widget permissions @@ -1129,7 +1129,7 @@ "settings_show_url_previews" = "Попередній перегляд вебсайтів"; "settings_ui_theme_picker_message_match_system_theme" = "«Авто» застосовує тему вашого пристрою"; "settings_ui_theme_picker_message_invert_colours" = "«Авто» застосовує налаштування вашого пристрою «Інвертувати кольори»"; -"settings_messages_containing_display_name" = "Моє показуване імʼя"; +"settings_messages_containing_display_name" = "Мій псевдонім"; "settings_discovery_three_pid_details_title_phone_number" = "Керувати номером телефону"; "settings_discovery_three_pid_details_title_email" = "Керувати е-поштою"; "settings_discovery_error_message" = "Сталася помилка. Повторіть спробу."; @@ -1866,7 +1866,7 @@ "login_prompt_email_token" = "Введіть ключ підтвердження електронної пошти:"; "login_email_placeholder" = "Адреса е-пошти"; "login_email_info" = "Вкажіть адресу електронної пошти, щоб інші користувачі могли легше знаходити вас на Matrix і надання вам можливості відновити пароль у майбутньому."; -"login_display_name_placeholder" = "Видиме ім'я (наприклад Bob Obson)"; +"login_display_name_placeholder" = "Псевдонім (наприклад Bob Obson)"; "login_optional_field" = "необов'язково"; "login_password_placeholder" = "Пароль"; "login_user_id_placeholder" = "Ідентифікатор Matrix (наприклад @bob:matrix.org або bob)"; @@ -2113,10 +2113,10 @@ "notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ робить майбутню історію повідомлень видимою всім від часу їхнього приєднання."; "notice_room_history_visible_to_members_from_joined_point" = "%@ робить майбутню історію кімнати видимою всім учасникам кімнати від часу їхнього приєднання."; "notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ робить майбутню історію повідомлень видимою всім від часу їхнього запрошення."; -"notice_room_history_visible_to_members_from_invited_point" = "%@ робить майбутню історію кімнати видимою усім учасникам кімнати від часу їхнього запрошення."; -"notice_room_history_visible_to_members_for_dm" = "%@ робить майбутню історію повідомлень видимою усім учасникам кімнати."; -"notice_room_history_visible_to_members" = "%@ робить майбутню історію кімнати видимою усім учасникам кімнати."; -"notice_room_history_visible_to_anyone" = "%@ робить майбутню історію кімнати видимою усім."; +"notice_room_history_visible_to_members_from_invited_point" = "%@ робить майбутню історію кімнати видимою всім учасникам кімнати від часу їхнього запрошення."; +"notice_room_history_visible_to_members_for_dm" = "%@ робить майбутню історію повідомлень видимою всім учасникам кімнати."; +"notice_room_history_visible_to_members" = "%@ робить майбутню історію кімнати видимою всім учасникам кімнати."; +"notice_room_history_visible_to_anyone" = "%@ робить майбутню історію кімнати видимою всім."; "notice_redaction" = "%@ редагує подію (id: %@)"; "notice_feedback" = "Подія відгуку (id: %@): %@"; "notice_room_related_groups" = "Групи пов'язані з цією кімнатою: %@"; @@ -2136,9 +2136,9 @@ "notice_room_name_changed_for_dm" = "%@ змінює назву на %@."; "notice_room_name_changed" = "%@ змінює назву кімнати на %@."; "notice_topic_changed" = "%@ змінює тему на «%@»."; -"notice_display_name_removed" = "%@ вилучає своє показуване ім'я"; -"notice_display_name_changed_from" = "%@ змінює своє показуване ім'я з %@ на %@"; -"notice_display_name_set" = "%@ встановлює своїм показуваним іменем %@"; +"notice_display_name_removed" = "%@ вилучає свій псевдонім"; +"notice_display_name_changed_from" = "%@ змінює свій псевдонім з %@ на %@"; +"notice_display_name_set" = "%@ встановлює своїм псевдонімом %@"; "notice_room_withdraw" = "%@ анульовує запрошення для %@"; "notice_room_kick" = "%@ вилучає %@"; "notice_room_reject" = "%@ відхиляє запрошення"; @@ -2194,7 +2194,7 @@ "notification_settings_per_room_notifications" = "Сповіщення від кожної кімнати"; "notification_settings_per_sender_notifications" = "Сповіщення про кожного відправника"; "notification_settings_contain_my_user_name" = "Сповіщати звуком про повідомлення, що містять моє ім'я користиувача"; -"notification_settings_contain_my_display_name" = "Сповіщати звуком про повідомлення, що містять моє показуване ім'я"; +"notification_settings_contain_my_display_name" = "Сповіщати звуком про повідомлення з моїм псевдонімом"; "notification_settings_just_sent_to_me" = "Сповіщати звуком про надіслані лише мені повідомлення"; "notification_settings_invite_to_a_new_room" = "Сповіщати про запрошення до нових кімнат"; "notification_settings_people_join_leave_rooms" = "Сповіщати, коли люди приєднуються чи виходять з кімнат"; @@ -2209,7 +2209,7 @@ "account_error_email_wrong_title" = "Неправильна адреса е-пошти"; "account_error_matrix_session_is_not_opened" = "Сеанс Matrix не відкрито"; "account_error_picture_change_failed" = "Не вдалося змінити зображення"; -"account_error_display_name_change_failed" = "Не вдалося змінити показуване ім'я"; +"account_error_display_name_change_failed" = "Не вдалося змінити псевдонім"; "account_msisdn_validation_error" = "Не вдалося перевірити номер телефону."; "account_email_validation_title" = "Очікування перевірки"; "account_msisdn_validation_title" = "Очікування перевірки"; @@ -2241,12 +2241,12 @@ "e2e_passphrase_enter" = "Введіть парольну фразу"; "e2e_passphrase_empty" = "Парольна фраза не повинна бути порожньою"; "e2e_passphrase_confirm" = "Підтвердити парольну фразу"; -"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими будь-кому від часу їхнього приєднання."; -"notice_room_history_visible_to_members_from_joined_point_by_you" = "Ви зробили майбутню історію кімнати видимою усім учасникам кімнати від часу їхнього приєднання."; +"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими всім від часу їхнього приєднання."; +"notice_room_history_visible_to_members_from_joined_point_by_you" = "Ви зробили майбутню історію кімнати видимою всім учасникам кімнати від часу їхнього приєднання."; "notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими будь-кому від часу запрошення їх."; -"notice_room_history_visible_to_members_from_invited_point_by_you" = "Ви зробили майбутню історію кімнати видимою усім учасникам кімнати від часу запрошення їх."; -"notice_room_history_visible_to_members_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими усім учасникам кімнати."; -"notice_room_history_visible_to_members_by_you" = "Ви зробили майбутню історію кімнати видимою усім учасникам кімнати."; +"notice_room_history_visible_to_members_from_invited_point_by_you" = "Ви зробили майбутню історію кімнати видимою всім учасникам кімнати від часу запрошення їх."; +"notice_room_history_visible_to_members_by_you_for_dm" = "Ви зробили майбутні повідомлення кімнати видимими всім учасникам кімнати."; +"notice_room_history_visible_to_members_by_you" = "Ви зробили майбутню історію кімнати видимою всім учасникам кімнати."; "notice_room_history_visible_to_anyone_by_you" = "Ви зробили майбутню історію кімнати видимою будь-кому."; "notice_room_created_by_you" = "Ви створили й сконфігурували кімнату."; "notice_profile_change_redacted_by_you" = "Ви оновили свій профіль %@"; @@ -2261,9 +2261,9 @@ "notice_room_name_changed_by_you_for_dm" = "Ви змінили назву на %@."; "notice_room_name_changed_by_you" = "Ви змінили назву кімнати на %@."; "notice_topic_changed_by_you" = "Ви змінили тему на «%@»."; -"notice_display_name_removed_by_you" = "Ви вилучили показуване ім'я"; -"notice_display_name_changed_from_by_you" = "Ви змінили показуване ім'я з %@ на %@"; -"notice_display_name_set_by_you" = "Ви вказали показуваним іменем %@"; +"notice_display_name_removed_by_you" = "Ви вилучили псевдонім"; +"notice_display_name_changed_from_by_you" = "Ви змінили псевдонім з %@ на %@"; +"notice_display_name_set_by_you" = "Ви налаштували псевдонімом %@"; "notice_conference_call_finished" = "Голосовий груповий виклик завершено"; "notice_conference_call_started" = "Груповий голосовий виклик розпочато"; "notice_conference_call_request" = "%@ запрошує до групового голосового виклику"; @@ -2467,11 +2467,11 @@ "onboarding_avatar_accessibility_label" = "Зображення профілю"; "onboarding_avatar_message" = "Час додати обличчя до імені"; "onboarding_avatar_title" = "Додати зображення профілю"; -"onboarding_display_name_max_length" = "Ваше показуване ім'я повинно складатися з менш ніж 256 символів"; +"onboarding_display_name_max_length" = "Ваш псевдонім повинен складатися з менш ніж 256 символів"; "onboarding_display_name_hint" = "Ви можете змінити його пізніше"; -"onboarding_display_name_placeholder" = "Показуване ім'я"; +"onboarding_display_name_placeholder" = "Псевдонім"; "onboarding_display_name_message" = "Його буде показано у надісланих повідомленнях."; -"onboarding_display_name_title" = "Виберіть показуване ім'я"; +"onboarding_display_name_title" = "Оберіть псевдонім"; "onboarding_personalization_skip" = "Пропустити цей крок"; "onboarding_personalization_save" = "Зберегти й продовжити"; "onboarding_congratulations_home_button" = "На головну"; @@ -2960,7 +2960,7 @@ // Room commands descriptions "room_command_change_display_name_description" = "Змінює ваш нік"; -"notice_display_name_changed_to" = "%@ змінили своє показуване ім'я на %@"; +"notice_display_name_changed_to" = "%@ змінили свій псевдонім на %@"; "poll_timeline_loading" = "Завантаження..."; "room_creation_user_not_found_prompt_invite_action" = "Усе одно розпочати приватну бесіду"; "room_participants_invite_anyway" = "Усе одно запросити"; From 7150f1376098a67335feb58c1a9bfe2f950e3aaa Mon Sep 17 00:00:00 2001 From: Doug Date: Tue, 15 Aug 2023 10:12:16 +0100 Subject: [PATCH 21/40] changelog.d: Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)). --- Config/AppVersion.xcconfig | 4 ++-- Podfile | 2 +- changelog.d/x-nolink-0.change | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 changelog.d/x-nolink-0.change diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index 46c0099fd..ec41e80dc 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.10.15 -CURRENT_PROJECT_VERSION = 1.10.15 +MARKETING_VERSION = 1.11.0 +CURRENT_PROJECT_VERSION = 1.11.0 diff --git a/Podfile b/Podfile index fda86b718..581fc76b0 100644 --- a/Podfile +++ b/Podfile @@ -16,7 +16,7 @@ use_frameworks! # - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI # # Warning: our internal tooling depends on the name of this variable name, so be sure not to change it -$matrixSDKVersion = '= 0.26.12' +$matrixSDKVersion = '= 0.27.0' # $matrixSDKVersion = :local # $matrixSDKVersion = { :branch => 'develop'} # $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } } diff --git a/changelog.d/x-nolink-0.change b/changelog.d/x-nolink-0.change new file mode 100644 index 000000000..f3e3d6e74 --- /dev/null +++ b/changelog.d/x-nolink-0.change @@ -0,0 +1 @@ +Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)). \ No newline at end of file From f333e17e310bec1f82a8c246a36dad099169db73 Mon Sep 17 00:00:00 2001 From: Doug Date: Tue, 15 Aug 2023 10:12:16 +0100 Subject: [PATCH 22/40] version++ --- CHANGES.md | 13 +++++++++++++ changelog.d/7618.change | 1 - changelog.d/7633.bugfix | 1 - changelog.d/pr-7639.bugfix | 1 - changelog.d/x-nolink-0.change | 1 - 5 files changed, 13 insertions(+), 4 deletions(-) delete mode 100644 changelog.d/7618.change delete mode 100644 changelog.d/7633.bugfix delete mode 100644 changelog.d/pr-7639.bugfix delete mode 100644 changelog.d/x-nolink-0.change diff --git a/CHANGES.md b/CHANGES.md index d2e289625..851c844d4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,16 @@ +## Changes in 1.11.0 (2023-08-15) + +🙌 Improvements + +- Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)). +- Disable Siri, Share and Reply (from NSE) Extensions. ([#7618](https://github.com/vector-im/element-ios/issues/7618)) + +🐛 Bugfixes + +- Fix bug in SSO URL generation that was non-compliant with the spec. ([#7639](https://github.com/vector-im/element-ios/pull/7639)) +- Fix a crash when opening v11 rooms. ([#7633](https://github.com/vector-im/element-ios/issues/7633)) + + ## Changes in 1.10.14 (2023-06-21) 🙌 Improvements diff --git a/changelog.d/7618.change b/changelog.d/7618.change deleted file mode 100644 index 0cefa0983..000000000 --- a/changelog.d/7618.change +++ /dev/null @@ -1 +0,0 @@ -Disable Siri, Share and Reply (from NSE) Extensions. \ No newline at end of file diff --git a/changelog.d/7633.bugfix b/changelog.d/7633.bugfix deleted file mode 100644 index b7345971e..000000000 --- a/changelog.d/7633.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix a crash when opening v11 rooms. \ No newline at end of file diff --git a/changelog.d/pr-7639.bugfix b/changelog.d/pr-7639.bugfix deleted file mode 100644 index 9bbf73b23..000000000 --- a/changelog.d/pr-7639.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix bug in SSO URL generation that was non-compliant with the spec. \ No newline at end of file diff --git a/changelog.d/x-nolink-0.change b/changelog.d/x-nolink-0.change deleted file mode 100644 index f3e3d6e74..000000000 --- a/changelog.d/x-nolink-0.change +++ /dev/null @@ -1 +0,0 @@ -Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)). \ No newline at end of file From b06fb03e82dda9cc1ffde91947e7fbc1eed88b54 Mon Sep 17 00:00:00 2001 From: Doug Date: Tue, 15 Aug 2023 10:18:04 +0100 Subject: [PATCH 23/40] Add missing changelog entry. --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 851c844d4..ee4133fae 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,9 @@ ## Changes in 1.11.0 (2023-08-15) +✨ Features + +- Integrate Device Dehydration v2 through the Crypto SDK ([#7630](https://github.com/vector-im/element-ios/pull/7630)) + 🙌 Improvements - Upgrade MatrixSDK version ([v0.27.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.0)). From b889c54bb0dc2812620d47d9d7409cbdaf4853cc Mon Sep 17 00:00:00 2001 From: Doug Date: Tue, 15 Aug 2023 11:09:55 +0100 Subject: [PATCH 24/40] finish version++ --- Podfile.lock | 22 +++++++++---------- .../xcshareddata/xcschemes/Riot.xcscheme | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index fb9bd48ae..988424488 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -39,20 +39,20 @@ PODS: - LoggerAPI (1.9.200): - Logging (~> 1.1) - Logging (1.4.0) - - MatrixSDK (0.26.12): - - MatrixSDK/Core (= 0.26.12) - - MatrixSDK/Core (0.26.12): + - MatrixSDK (0.27.0): + - MatrixSDK/Core (= 0.27.0) + - MatrixSDK/Core (0.27.0): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) - - MatrixSDKCrypto (= 0.3.4) + - MatrixSDKCrypto (= 0.3.12) - OLMKit (~> 3.2.5) - Realm (= 10.27.0) - SwiftyBeaver (= 1.9.5) - - MatrixSDK/JingleCallStack (0.26.12): + - MatrixSDK/JingleCallStack (0.27.0): - JitsiMeetSDKLite (= 8.1.2-lite) - MatrixSDK/Core - - MatrixSDKCrypto (0.3.4) + - MatrixSDKCrypto (0.3.12) - OLMKit (3.2.12): - OLMKit/olmc (= 3.2.12) - OLMKit/olmcpp (= 3.2.12) @@ -102,8 +102,8 @@ DEPENDENCIES: - KeychainAccess (~> 4.2.2) - KTCenterFlowLayout (~> 1.3.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.26.12) - - MatrixSDK/JingleCallStack (= 0.26.12) + - MatrixSDK (= 0.27.0) + - MatrixSDK/JingleCallStack (= 0.27.0) - OLMKit - PostHog (~> 2.0.0) - ReadMoreTextView (~> 3.0.1) @@ -187,8 +187,8 @@ SPEC CHECKSUMS: libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d Logging: beeb016c9c80cf77042d62e83495816847ef108b - MatrixSDK: 0af737bc461b82d0ec9edd6fdf8f70b02771ebd3 - MatrixSDKCrypto: ac805c22c24f79f349cdbfa065855c73a4c81b51 + MatrixSDK: 981c0e6abd40f0882e1316923edb2b3966d29513 + MatrixSDKCrypto: 25929a40733b4ab54f659aaf6a730552a0a06504 OLMKit: da115f16582e47626616874e20f7bb92222c7a51 PostHog: 660ec6c9d80cec17b685e148f17f6785a88b597d ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d @@ -208,6 +208,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: f8d711a31048bfd5981d17b00487a85996b62983 +PODFILE CHECKSUM: f8f66ce4fa24937192a493d3a0a5c2c2e429c8fc COCOAPODS: 1.11.3 diff --git a/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme b/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme index 012a5a109..52ec9a4e1 100644 --- a/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme +++ b/Riot.xcodeproj/xcshareddata/xcschemes/Riot.xcscheme @@ -1,6 +1,6 @@ Date: Tue, 15 Aug 2023 11:10:01 +0100 Subject: [PATCH 25/40] Prepare for new sprint --- Config/AppVersion.xcconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index ec41e80dc..37b603c0b 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.11.0 -CURRENT_PROJECT_VERSION = 1.11.0 +MARKETING_VERSION = 1.11.1 +CURRENT_PROJECT_VERSION = 1.11.1 From 225b620f121909ceda01256d95680a1f7fc31d48 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 21 Aug 2023 09:58:50 +0300 Subject: [PATCH 26/40] Update introspect to the latest version, remove now duplicate `introspectCollectionView` --- Podfile.lock | 6 +++--- RiotSwiftUI/Modules/Common/Util/ListBackground.swift | 6 ------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 988424488..561af4bce 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -26,7 +26,7 @@ PODS: - GBDeviceInfo/Core (= 7.1.0) - GBDeviceInfo/Core (7.1.0) - GZIP (1.3.0) - - Introspect (0.1.4) + - Introspect (0.11.0) - JitsiMeetSDKLite (8.1.2-lite): - JitsiWebRTC (~> 111.0) - JitsiWebRTC (111.0.2) @@ -177,7 +177,7 @@ SPEC CHECKSUMS: FlowCommoniOS: ca92071ab526dc89905495a37844fd7e78d1a7f2 GBDeviceInfo: 5d62fa85bdcce3ed288d83c28789adf1173e4376 GZIP: 416858efbe66b41b206895ac6dfd5493200d95b3 - Introspect: b62c4dd2063072327c21d618ef2bedc3c87bc366 + Introspect: 4cc1e4c34dd016540c8d86a591c231c09dafbee3 JitsiMeetSDKLite: 895213158cf62342069a10634a41d2f1c00057f7 JitsiWebRTC: 80f62908fcf2a1160e0d14b584323fb6e6be630b KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51 @@ -210,4 +210,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: f8f66ce4fa24937192a493d3a0a5c2c2e429c8fc -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.1 diff --git a/RiotSwiftUI/Modules/Common/Util/ListBackground.swift b/RiotSwiftUI/Modules/Common/Util/ListBackground.swift index d4e087da8..ddfc362c2 100644 --- a/RiotSwiftUI/Modules/Common/Util/ListBackground.swift +++ b/RiotSwiftUI/Modules/Common/Util/ListBackground.swift @@ -49,10 +49,4 @@ extension View { func listBackgroundColor(_ color: Color) -> some View { modifier(ListBackgroundModifier(color: color)) } - - /// Finds a `UICollectionView` from a `SwiftUI.List`, or `SwiftUI.List` child. - /// Stop gap until https://github.com/siteline/SwiftUI-Introspect/pull/169 - func introspectCollectionView(customize: @escaping (UICollectionView) -> Void) -> some View { - introspect(selector: TargetViewSelector.ancestorOrSiblingContaining, customize: customize) - } } From 686932c995bf32f2dba87e77038fab38f5a9aaec Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 21 Aug 2023 10:03:23 +0300 Subject: [PATCH 27/40] Prevent pill crashes when room members are missing display names (objc interop) --- Riot/Modules/Pills/PillsFormatter.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Riot/Modules/Pills/PillsFormatter.swift b/Riot/Modules/Pills/PillsFormatter.swift index 1b6256835..ecdfac5fe 100644 --- a/Riot/Modules/Pills/PillsFormatter.swift +++ b/Riot/Modules/Pills/PillsFormatter.swift @@ -197,12 +197,14 @@ class PillsFormatter: NSObject { guard let roomMember = roomState.members.member(withUserId: userId) else { return } + + let displayName = roomMember.displayname ?? userId pill.data?.items = [ .avatar(url: roomMember.avatarUrl, - string: roomMember.displayname, - matrixId: roomMember.userId), - .text(roomMember.displayname) + string: displayName, + matrixId: userId), + .text(displayName) ] default: break From 06350fd89c16e24cb63f2ce62999acfd3d556d1d Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 21 Aug 2023 14:46:09 +0300 Subject: [PATCH 28/40] Prevent mention crashes when room members are missing display names (objc interop) --- .../WYSIWYGInputToolbar/WysiwygInputToolbarView.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift b/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift index edd951fd6..60b6edf94 100644 --- a/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift +++ b/Riot/Modules/Room/Views/WYSIWYGInputToolbar/WysiwygInputToolbarView.swift @@ -207,8 +207,14 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp } func mention(_ member: MXRoomMember) { - self.wysiwygViewModel.setMention(url: MXTools.permalinkToUser(withUserId: member.userId), - name: member.displayname, + guard let userId = member.userId else { + return + } + + let displayName = member.displayname ?? userId + + self.wysiwygViewModel.setMention(url: MXTools.permalinkToUser(withUserId: userId), + name: displayName, mentionType: .user) } From c21adc1c4d822afe1b8c2231af25a1535598ebaa Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 23 Aug 2023 16:02:04 +0300 Subject: [PATCH 29/40] Add changelogs --- changelog.d/7651.bugfix | 1 + changelog.d/pr-7649.bugfix | 1 + 2 files changed, 2 insertions(+) create mode 100644 changelog.d/7651.bugfix create mode 100644 changelog.d/pr-7649.bugfix diff --git a/changelog.d/7651.bugfix b/changelog.d/7651.bugfix new file mode 100644 index 000000000..4f97c24a7 --- /dev/null +++ b/changelog.d/7651.bugfix @@ -0,0 +1 @@ +Prevent pill crashes when room members are missing display names (objc interop) \ No newline at end of file diff --git a/changelog.d/pr-7649.bugfix b/changelog.d/pr-7649.bugfix new file mode 100644 index 000000000..08e9bebec --- /dev/null +++ b/changelog.d/pr-7649.bugfix @@ -0,0 +1 @@ +Prevent mention crashes when room members are missing display names (objc interop) \ No newline at end of file From 3276b5451b9064b638719ae80f479b53987c793f Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Thu, 24 Aug 2023 17:18:13 +0200 Subject: [PATCH 30/40] Hide deactivate account if the auth property is present on the WK. --- Riot/Modules/Settings/SettingsViewController.m | 2 +- changelog.d/7648.bugfix | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/7648.bugfix diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index be87bea3b..c50bc3c35 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -608,7 +608,7 @@ ChangePasswordCoordinatorBridgePresenterDelegate> } } - if (BuildSettings.settingsScreenAllowDeactivatingAccount) + if (BuildSettings.settingsScreenAllowDeactivatingAccount && !self.mainSession.homeserverWellknown.authentication) { Section *sectionDeactivate = [Section sectionWithTag:SECTION_TAG_DEACTIVATE_ACCOUNT]; [sectionDeactivate addRowWithTag:0]; diff --git a/changelog.d/7648.bugfix b/changelog.d/7648.bugfix new file mode 100644 index 000000000..c8f48546c --- /dev/null +++ b/changelog.d/7648.bugfix @@ -0,0 +1 @@ +Deactivate account is hidden for servers with OIDC auth. \ No newline at end of file From 7248f33497fe9acde3a18663872b6f1ff93b751f Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Thu, 24 Aug 2023 17:53:48 +0200 Subject: [PATCH 31/40] completed --- Riot/Modules/Settings/SettingsViewController.m | 5 ++++- changelog.d/7645.bugfix | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelog.d/7645.bugfix diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index be87bea3b..9f818a988 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -365,7 +365,10 @@ ChangePasswordCoordinatorBridgePresenterDelegate> { [sectionUserSettings addRowWithTag: USER_SETTINGS_PHONENUMBERS_OFFSET + index]; } - if (BuildSettings.settingsScreenAllowAddingEmailThreepids) + if (BuildSettings.settingsScreenAllowAddingEmailThreepids && + // If the threePidChanges is nil we assume the capability to be true + (!self.mainSession.homeserverCapabilities.threePidChanges || + self.mainSession.homeserverCapabilities.threePidChanges.enabled)) { [sectionUserSettings addRowWithTag:USER_SETTINGS_ADD_EMAIL_INDEX]; } diff --git a/changelog.d/7645.bugfix b/changelog.d/7645.bugfix new file mode 100644 index 000000000..b546db4f9 --- /dev/null +++ b/changelog.d/7645.bugfix @@ -0,0 +1 @@ +Add email UI is hidden if the 3 pid changes capability is disabled. \ No newline at end of file From ee00289acc37fa0b59246c9f7144e9e0b9f3fec5 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Thu, 24 Aug 2023 19:15:12 +0200 Subject: [PATCH 32/40] added the cell, now I just need to implement the navigation to the web view --- Riot/Assets/en.lproj/Vector.strings | 3 ++ Riot/Generated/Strings.swift | 12 ++++++ .../Modules/Settings/SettingsViewController.m | 41 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 132e5dd25..1856fdb9f 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -748,6 +748,9 @@ Tap the + to start adding people."; "settings_three_pids_management_information_part1" = "Manage which email addresses or phone numbers you can use to log in or recover your account here. Control who can find you in "; "settings_three_pids_management_information_part2" = "Discovery"; "settings_three_pids_management_information_part3" = "."; +"settings_manage_account_title" = "Account"; +"settings_manage_account_action" = "Manage"; +"settings_manage_account_description" = "Manage your account at %@"; "settings_confirm_media_size" = "Confirm size when sending"; "settings_confirm_media_size_description" = "When this is on, you’ll be asked to confirm what size images and videos will be sent as."; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 1c2516fe9..cc34c01bb 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -7791,6 +7791,18 @@ public class VectorL10n: NSObject { public static var settingsLinks: String { return VectorL10n.tr("Vector", "settings_links") } + /// Manage + public static var settingsManageAccountAction: String { + return VectorL10n.tr("Vector", "settings_manage_account_action") + } + /// Manage your account at %@ + public static func settingsManageAccountDescription(_ p1: String) -> String { + return VectorL10n.tr("Vector", "settings_manage_account_description", p1) + } + /// Account + public static var settingsManageAccountTitle: String { + return VectorL10n.tr("Vector", "settings_manage_account_title") + } /// Mark all messages as read public static var settingsMarkAllAsRead: String { return VectorL10n.tr("Vector", "settings_mark_all_as_read") diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index be87bea3b..86aec19e8 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -50,6 +50,7 @@ typedef NS_ENUM(NSUInteger, SECTION_TAG) { SECTION_TAG_SIGN_OUT = 0, SECTION_TAG_USER_SETTINGS, + SECTION_TAG_ACCOUNT, SECTION_TAG_SENDING_MEDIA, SECTION_TAG_LINKS, SECTION_TAG_SECURITY, @@ -185,6 +186,11 @@ typedef NS_ENUM(NSUInteger, SECURITY) DEVICE_MANAGER_INDEX }; +typedef NS_ENUM(NSUInteger, ACCOUNT) +{ + ACCOUNT_MANAGE_INDEX = 0, +}; + typedef void (^blockSettingsViewController_onReadyToDestroy)(void); #pragma mark - SettingsViewController @@ -383,6 +389,16 @@ ChangePasswordCoordinatorBridgePresenterDelegate> sectionUserSettings.headerTitle = [VectorL10n settingsUserSettings]; [tmpSections addObject:sectionUserSettings]; + + NSString *manageAccountURL = self.mainSession.homeserverWellknown.authentication.account; + if (manageAccountURL) + { + Section *account = [Section sectionWithTag: SECTION_TAG_ACCOUNT]; + [account addRowWithTag:ACCOUNT_MANAGE_INDEX]; + account.headerTitle = [VectorL10n settingsManageAccountTitle]; + account.footerTitle = [VectorL10n settingsManageAccountDescription:manageAccountURL]; + [tmpSections addObject:account]; + } if (BuildSettings.settingsScreenShowConfirmMediaSize) { @@ -2626,6 +2642,17 @@ ChangePasswordCoordinatorBridgePresenterDelegate> cell = deactivateAccountBtnCell; } + else if (section == SECTION_TAG_ACCOUNT) + { + switch (row) + { + case ACCOUNT_MANAGE_INDEX: + cell = [self getDefaultTableViewCell:tableView]; + cell.textLabel.text = [VectorL10n settingsManageAccountAction]; + [cell vc_setAccessoryDisclosureIndicatorWithCurrentTheme]; + break; + } + } return cell; } @@ -2975,6 +3002,14 @@ ChangePasswordCoordinatorBridgePresenterDelegate> break; } } + else if (section == SECTION_TAG_ACCOUNT) + { + switch(row) { + case ACCOUNT_MANAGE_INDEX: + [self onManageAccountTap]; + break; + } + } [tableView deselectRowAtIndexPath:indexPath animated:YES]; } @@ -3883,6 +3918,12 @@ ChangePasswordCoordinatorBridgePresenterDelegate> } } +- (void)onManageAccountTap +{ + // TODO + // Open a web view with the account url +} + - (void)showThemePicker { __weak typeof(self) weakSelf = self; From 489d65d9124aaca8344d91382556d342701963c2 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Fri, 25 Aug 2023 12:21:38 +0200 Subject: [PATCH 33/40] web view opened on tap + changelog --- Riot/Assets/en.lproj/Vector.strings | 2 +- Riot/Modules/Settings/SettingsViewController.m | 7 +++++-- changelog.d/7653.feature | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 changelog.d/7653.feature diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 1856fdb9f..89d86d336 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -749,7 +749,7 @@ Tap the + to start adding people."; "settings_three_pids_management_information_part2" = "Discovery"; "settings_three_pids_management_information_part3" = "."; "settings_manage_account_title" = "Account"; -"settings_manage_account_action" = "Manage"; +"settings_manage_account_action" = "Manage account"; "settings_manage_account_description" = "Manage your account at %@"; "settings_confirm_media_size" = "Confirm size when sending"; diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 86aec19e8..6a29ddf6b 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -3920,8 +3920,11 @@ ChangePasswordCoordinatorBridgePresenterDelegate> - (void)onManageAccountTap { - // TODO - // Open a web view with the account url + NSURL *url = [NSURL URLWithString: self.mainSession.homeserverWellknown.authentication.account]; + if (url) { + SFSafariViewController *accountVC = [[SFSafariViewController alloc] initWithURL: url]; + [self presentViewController:accountVC animated:YES completion:nil]; + } } - (void)showThemePicker diff --git a/changelog.d/7653.feature b/changelog.d/7653.feature new file mode 100644 index 000000000..cabf7402b --- /dev/null +++ b/changelog.d/7653.feature @@ -0,0 +1 @@ +New settings cell to manage your account through MAS if the home server allows it. \ No newline at end of file From 9e50bc89ba193309ee3fc5dbe77420f5caf33107 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Fri, 25 Aug 2023 13:02:06 +0200 Subject: [PATCH 34/40] opening the safari web view externally so that it will be able to share the cookies --- Riot/Generated/Strings.swift | 2 +- Riot/Modules/Settings/SettingsViewController.m | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index cc34c01bb..373f65fbd 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -7791,7 +7791,7 @@ public class VectorL10n: NSObject { public static var settingsLinks: String { return VectorL10n.tr("Vector", "settings_links") } - /// Manage + /// Manage account public static var settingsManageAccountAction: String { return VectorL10n.tr("Vector", "settings_manage_account_action") } diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 6a29ddf6b..bbacd4980 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -3922,8 +3922,7 @@ ChangePasswordCoordinatorBridgePresenterDelegate> { NSURL *url = [NSURL URLWithString: self.mainSession.homeserverWellknown.authentication.account]; if (url) { - SFSafariViewController *accountVC = [[SFSafariViewController alloc] initWithURL: url]; - [self presentViewController:accountVC animated:YES completion:nil]; + [UIApplication.sharedApplication openURL:url options:@{} completionHandler:nil]; } } From 2b93d8f03a6da9d625dbd653089d825046ef8d29 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Fri, 25 Aug 2023 17:22:11 +0200 Subject: [PATCH 35/40] fix 7646 --- .../ManageSession/ManageSessionViewController.m | 14 ++++++++++++++ .../Coordinator/UserSessionsFlowCoordinator.swift | 11 ++++++++++- changelog.d/7646.bugfix | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 changelog.d/7646.bugfix diff --git a/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m b/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m index 806e10cff..fa44c7050 100644 --- a/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m +++ b/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m @@ -655,6 +655,20 @@ enum { } - (void)removeDevice +{ + NSURL *logoutURL = [self.mainSession.homeserverWellknown.authentication getMasLogoutDeviceURLFromDeviceID:device.deviceId]; + if (logoutURL) + { + [UIApplication.sharedApplication openURL:logoutURL options:@{} completionHandler:nil]; + [self withdrawViewControllerAnimated:YES completion:nil]; + } + else + { + [self removeDeviceThroughAPI]; + } +} + +-(void) removeDeviceThroughAPI { [self startActivityIndicator]; self.view.userInteractionEnabled = NO; diff --git a/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift b/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift index 79fd9e573..a3fc8e212 100644 --- a/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift +++ b/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift @@ -123,7 +123,11 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable { if sessionInfo.isCurrent { self.showLogoutConfirmationForCurrentSession() } else { - self.showLogoutConfirmation(for: [sessionInfo]) + if let logoutURL = self.parameters.session.homeserverWellknown.authentication?.getMasLogoutDeviceURL(fromDeviceID: sessionInfo.id) { + self.openMasLogoutURL(logoutURL) + } else { + self.showLogoutConfirmation(for: [sessionInfo]) + } } case let .showSessionStateInfo(sessionInfo): self.showInfoSheet(parameters: .init(userSessionInfo: sessionInfo, parentSize: self.toPresentable().view.bounds.size)) @@ -182,6 +186,11 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable { return UserOtherSessionsCoordinator(parameters: parameters) } + private func openMasLogoutURL(_ url: URL) { + UIApplication.shared.open(url) + popToSessionsOverview() + } + /// Shows a confirmation dialog to the user to sign out of a session. private func showLogoutConfirmation(for sessionInfos: [UserSessionInfo]) { // Use a UIAlertController as we don't have confirmationDialog in SwiftUI on iOS 14. diff --git a/changelog.d/7646.bugfix b/changelog.d/7646.bugfix new file mode 100644 index 000000000..aaae87297 --- /dev/null +++ b/changelog.d/7646.bugfix @@ -0,0 +1 @@ +You can now log out from other sessions using MAS on supported OIDC home servers. \ No newline at end of file From 2a7e0562f109cf63c0ea705f57b8e1f26b6dd9e7 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Fri, 25 Aug 2023 19:39:55 +0200 Subject: [PATCH 36/40] code improvement --- .../Security/ManageSession/ManageSessionViewController.m | 2 +- .../UserSessions/Coordinator/UserSessionsFlowCoordinator.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m b/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m index fa44c7050..a3c1e431e 100644 --- a/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m +++ b/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m @@ -656,7 +656,7 @@ enum { - (void)removeDevice { - NSURL *logoutURL = [self.mainSession.homeserverWellknown.authentication getMasLogoutDeviceURLFromDeviceID:device.deviceId]; + NSURL *logoutURL = [self.mainSession.homeserverWellknown.authentication getLogoutDeviceURLFromID:device.deviceId]; if (logoutURL) { [UIApplication.sharedApplication openURL:logoutURL options:@{} completionHandler:nil]; diff --git a/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift b/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift index a3fc8e212..acf6a3083 100644 --- a/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift +++ b/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift @@ -123,7 +123,7 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable { if sessionInfo.isCurrent { self.showLogoutConfirmationForCurrentSession() } else { - if let logoutURL = self.parameters.session.homeserverWellknown.authentication?.getMasLogoutDeviceURL(fromDeviceID: sessionInfo.id) { + if let logoutURL = self.parameters.session.homeserverWellknown.authentication?.getLogoutDeviceURL(fromID: sessionInfo.id) { self.openMasLogoutURL(logoutURL) } else { self.showLogoutConfirmation(for: [sessionInfo]) From d1445fc6983f1d40da4f9b700fde7020fb468c25 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Mon, 28 Aug 2023 12:20:26 +0200 Subject: [PATCH 37/40] completed --- Riot/Assets/en.lproj/Vector.strings | 2 + Riot/Generated/Strings.swift | 8 ++++ .../ManageSessionViewController.m | 40 ++++++++++++++-- .../UserSessionsFlowCoordinator.swift | 47 ++++++++++++++----- 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 89d86d336..e1244e81e 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -967,6 +967,8 @@ Tap the + to start adding people."; "manage_session_trusted" = "Trusted by you"; "manage_session_not_trusted" = "Not trusted"; "manage_session_sign_out" = "Sign out of this session"; +"manage_session_redirect" = "You will be redirected to your server's authentication provider to complete sign out."; +"manage_session_redirect_error" = "Functionality currently unavailable. Please contact your homeserver admin"; "manage_session_rename" = "Rename session"; "manage_session_sign_out_other_sessions" = "Sign out of all other sessions"; // User sessions management diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 373f65fbd..aa3ca9d72 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -3667,6 +3667,14 @@ public class VectorL10n: NSObject { public static var manageSessionNotTrusted: String { return VectorL10n.tr("Vector", "manage_session_not_trusted") } + /// You will be redirected to your server's authentication provider to complete sign out. + public static var manageSessionRedirect: String { + return VectorL10n.tr("Vector", "manage_session_redirect") + } + /// Functionality currently unavailable. Please contact your homeserver admin + public static var manageSessionRedirectError: String { + return VectorL10n.tr("Vector", "manage_session_redirect_error") + } /// Rename session public static var manageSessionRename: String { return VectorL10n.tr("Vector", "manage_session_rename") diff --git a/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m b/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m index a3c1e431e..e1fd5c5e8 100644 --- a/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m +++ b/Riot/Modules/Settings/Security/ManageSession/ManageSessionViewController.m @@ -656,11 +656,18 @@ enum { - (void)removeDevice { - NSURL *logoutURL = [self.mainSession.homeserverWellknown.authentication getLogoutDeviceURLFromID:device.deviceId]; - if (logoutURL) + MXWellKnownAuthentication *authentication = self.mainSession.homeserverWellknown.authentication; + if (authentication) { - [UIApplication.sharedApplication openURL:logoutURL options:@{} completionHandler:nil]; - [self withdrawViewControllerAnimated:YES completion:nil]; + NSURL *logoutURL = [authentication getLogoutDeviceURLFromID:device.deviceId]; + if (logoutURL) + { + [self removeDeviceRedirectWithURL:logoutURL]; + } + else + { + [self showRemoveDeviceRedirectError]; + } } else { @@ -668,6 +675,31 @@ enum { } } +-(void) removeDeviceRedirectWithURL: (NSURL * _Nonnull) url +{ + UIAlertController *alert = [UIAlertController alertControllerWithTitle: [VectorL10n manageSessionRedirect] message: nil preferredStyle:UIAlertControllerStyleAlert]; + + __weak typeof(self) weakSelf = self; + UIAlertAction *action = [UIAlertAction actionWithTitle:[VectorL10n ok] + style:UIAlertActionStyleDefault + handler: ^(UIAlertAction * action) { + [UIApplication.sharedApplication openURL:url options:@{} completionHandler:^(BOOL success) { + if (success && weakSelf) + { + [weakSelf withdrawViewControllerAnimated:YES completion:nil]; + } + }]; + }]; + [alert addAction: action]; + [self presentViewController:alert animated:YES completion:nil]; +} + +-(void) showRemoveDeviceRedirectError +{ + UIAlertController *alert = [UIAlertController alertControllerWithTitle: [VectorL10n manageSessionRedirectError] message: nil preferredStyle:UIAlertControllerStyleAlert]; + [self presentViewController:alert animated:YES completion:nil]; +} + -(void) removeDeviceThroughAPI { [self startActivityIndicator]; diff --git a/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift b/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift index acf6a3083..041f5a1ae 100644 --- a/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift +++ b/RiotSwiftUI/Modules/UserSessions/Coordinator/UserSessionsFlowCoordinator.swift @@ -120,21 +120,29 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable { case let .renameSession(sessionInfo): self.showRenameSessionScreen(for: sessionInfo) case let .logoutOfSession(sessionInfo): - if sessionInfo.isCurrent { - self.showLogoutConfirmationForCurrentSession() - } else { - if let logoutURL = self.parameters.session.homeserverWellknown.authentication?.getLogoutDeviceURL(fromID: sessionInfo.id) { - self.openMasLogoutURL(logoutURL) - } else { - self.showLogoutConfirmation(for: [sessionInfo]) - } - } + self.handleLogoutOfSession(sessionInfo: sessionInfo) case let .showSessionStateInfo(sessionInfo): self.showInfoSheet(parameters: .init(userSessionInfo: sessionInfo, parentSize: self.toPresentable().view.bounds.size)) } } pushScreen(with: coordinator) } + + private func handleLogoutOfSession(sessionInfo: UserSessionInfo) { + if sessionInfo.isCurrent { + self.showLogoutConfirmationForCurrentSession() + } else { + if let authentication = self.parameters.session.homeserverWellknown.authentication { + if let logoutURL = authentication.getLogoutDeviceURL(fromID: sessionInfo.id) { + self.openDeviceLogoutRedirectURL(logoutURL) + } else { + self.showDeviceLogoutRedirectError() + } + } else { + self.showLogoutConfirmation(for: [sessionInfo]) + } + } + } /// Shows the QR login screen. private func openQRLoginScreen() { @@ -186,9 +194,24 @@ final class UserSessionsFlowCoordinator: NSObject, Coordinator, Presentable { return UserOtherSessionsCoordinator(parameters: parameters) } - private func openMasLogoutURL(_ url: URL) { - UIApplication.shared.open(url) - popToSessionsOverview() + private func openDeviceLogoutRedirectURL(_ url: URL) { + let alert = UIAlertController(title: VectorL10n.manageSessionRedirect, message: nil, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: VectorL10n.ok, style: .default) { [weak self] _ in + UIApplication.shared.open(url) { [weak self] success in + guard success else { + return + } + self?.popToSessionsOverview() + } + }) + alert.popoverPresentationController?.sourceView = toPresentable().view + navigationRouter.present(alert, animated: true) + } + + private func showDeviceLogoutRedirectError() { + let alert = UIAlertController(title: VectorL10n.manageSessionRedirectError, message: nil, preferredStyle: .alert) + alert.popoverPresentationController?.sourceView = toPresentable().view + navigationRouter.present(alert, animated: true) } /// Shows a confirmation dialog to the user to sign out of a session. From 39fcbb78a68a73ec6ea8f94d05f1396a52eafcaa Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 29 Aug 2023 12:20:33 +0300 Subject: [PATCH 38/40] changelog.d: Upgrade MatrixSDK version ([v0.27.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.1)). --- Podfile | 2 +- changelog.d/x-nolink-0.change | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/x-nolink-0.change diff --git a/Podfile b/Podfile index 581fc76b0..6891bc511 100644 --- a/Podfile +++ b/Podfile @@ -16,7 +16,7 @@ use_frameworks! # - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI # # Warning: our internal tooling depends on the name of this variable name, so be sure not to change it -$matrixSDKVersion = '= 0.27.0' +$matrixSDKVersion = '= 0.27.1' # $matrixSDKVersion = :local # $matrixSDKVersion = { :branch => 'develop'} # $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } } diff --git a/changelog.d/x-nolink-0.change b/changelog.d/x-nolink-0.change new file mode 100644 index 000000000..379f8c3fc --- /dev/null +++ b/changelog.d/x-nolink-0.change @@ -0,0 +1 @@ +Upgrade MatrixSDK version ([v0.27.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.1)). \ No newline at end of file From 336c46d416b14845a10a5ad9e930c76d9f4b0d74 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 29 Aug 2023 12:20:34 +0300 Subject: [PATCH 39/40] version++ --- CHANGES.md | 19 +++++++++++++++++++ changelog.d/7645.bugfix | 1 - changelog.d/7646.bugfix | 1 - changelog.d/7648.bugfix | 1 - changelog.d/7651.bugfix | 1 - changelog.d/7653.feature | 1 - changelog.d/pr-7649.bugfix | 1 - changelog.d/x-nolink-0.change | 1 - 8 files changed, 19 insertions(+), 7 deletions(-) delete mode 100644 changelog.d/7645.bugfix delete mode 100644 changelog.d/7646.bugfix delete mode 100644 changelog.d/7648.bugfix delete mode 100644 changelog.d/7651.bugfix delete mode 100644 changelog.d/7653.feature delete mode 100644 changelog.d/pr-7649.bugfix delete mode 100644 changelog.d/x-nolink-0.change diff --git a/CHANGES.md b/CHANGES.md index ee4133fae..25f3abef4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,22 @@ +## Changes in 1.11.1 (2023-08-29) + +✨ Features + +- New settings cell to manage your account through MAS if the home server allows it. ([#7653](https://github.com/vector-im/element-ios/issues/7653)) + +🙌 Improvements + +- Upgrade MatrixSDK version ([v0.27.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.1)). + +🐛 Bugfixes + +- Prevent mention crashes when room members are missing display names (objc interop) ([#7649](https://github.com/vector-im/element-ios/pull/7649)) +- Add email UI is hidden if the 3 pid changes capability is disabled. ([#7645](https://github.com/vector-im/element-ios/issues/7645)) +- You can now log out from other sessions using MAS on supported OIDC home servers. ([#7646](https://github.com/vector-im/element-ios/issues/7646)) +- Deactivate account is hidden for servers with OIDC auth. ([#7648](https://github.com/vector-im/element-ios/issues/7648)) +- Prevent pill crashes when room members are missing display names (objc interop) ([#7651](https://github.com/vector-im/element-ios/issues/7651)) + + ## Changes in 1.11.0 (2023-08-15) ✨ Features diff --git a/changelog.d/7645.bugfix b/changelog.d/7645.bugfix deleted file mode 100644 index b546db4f9..000000000 --- a/changelog.d/7645.bugfix +++ /dev/null @@ -1 +0,0 @@ -Add email UI is hidden if the 3 pid changes capability is disabled. \ No newline at end of file diff --git a/changelog.d/7646.bugfix b/changelog.d/7646.bugfix deleted file mode 100644 index aaae87297..000000000 --- a/changelog.d/7646.bugfix +++ /dev/null @@ -1 +0,0 @@ -You can now log out from other sessions using MAS on supported OIDC home servers. \ No newline at end of file diff --git a/changelog.d/7648.bugfix b/changelog.d/7648.bugfix deleted file mode 100644 index c8f48546c..000000000 --- a/changelog.d/7648.bugfix +++ /dev/null @@ -1 +0,0 @@ -Deactivate account is hidden for servers with OIDC auth. \ No newline at end of file diff --git a/changelog.d/7651.bugfix b/changelog.d/7651.bugfix deleted file mode 100644 index 4f97c24a7..000000000 --- a/changelog.d/7651.bugfix +++ /dev/null @@ -1 +0,0 @@ -Prevent pill crashes when room members are missing display names (objc interop) \ No newline at end of file diff --git a/changelog.d/7653.feature b/changelog.d/7653.feature deleted file mode 100644 index cabf7402b..000000000 --- a/changelog.d/7653.feature +++ /dev/null @@ -1 +0,0 @@ -New settings cell to manage your account through MAS if the home server allows it. \ No newline at end of file diff --git a/changelog.d/pr-7649.bugfix b/changelog.d/pr-7649.bugfix deleted file mode 100644 index 08e9bebec..000000000 --- a/changelog.d/pr-7649.bugfix +++ /dev/null @@ -1 +0,0 @@ -Prevent mention crashes when room members are missing display names (objc interop) \ No newline at end of file diff --git a/changelog.d/x-nolink-0.change b/changelog.d/x-nolink-0.change deleted file mode 100644 index 379f8c3fc..000000000 --- a/changelog.d/x-nolink-0.change +++ /dev/null @@ -1 +0,0 @@ -Upgrade MatrixSDK version ([v0.27.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.27.1)). \ No newline at end of file From e21a2605c89a068cb3bdba78c1f3030596decfaf Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 29 Aug 2023 13:09:52 +0300 Subject: [PATCH 40/40] finish version++ --- Podfile.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 561af4bce..2a6591aa6 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -39,9 +39,9 @@ PODS: - LoggerAPI (1.9.200): - Logging (~> 1.1) - Logging (1.4.0) - - MatrixSDK (0.27.0): - - MatrixSDK/Core (= 0.27.0) - - MatrixSDK/Core (0.27.0): + - MatrixSDK (0.27.1): + - MatrixSDK/Core (= 0.27.1) + - MatrixSDK/Core (0.27.1): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) @@ -49,7 +49,7 @@ PODS: - OLMKit (~> 3.2.5) - Realm (= 10.27.0) - SwiftyBeaver (= 1.9.5) - - MatrixSDK/JingleCallStack (0.27.0): + - MatrixSDK/JingleCallStack (0.27.1): - JitsiMeetSDKLite (= 8.1.2-lite) - MatrixSDK/Core - MatrixSDKCrypto (0.3.12) @@ -102,8 +102,8 @@ DEPENDENCIES: - KeychainAccess (~> 4.2.2) - KTCenterFlowLayout (~> 1.3.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.27.0) - - MatrixSDK/JingleCallStack (= 0.27.0) + - MatrixSDK (= 0.27.1) + - MatrixSDK/JingleCallStack (= 0.27.1) - OLMKit - PostHog (~> 2.0.0) - ReadMoreTextView (~> 3.0.1) @@ -187,7 +187,7 @@ SPEC CHECKSUMS: libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d Logging: beeb016c9c80cf77042d62e83495816847ef108b - MatrixSDK: 981c0e6abd40f0882e1316923edb2b3966d29513 + MatrixSDK: f6c197ca06aab29ff69d1105965a57d277dfcd9d MatrixSDKCrypto: 25929a40733b4ab54f659aaf6a730552a0a06504 OLMKit: da115f16582e47626616874e20f7bb92222c7a51 PostHog: 660ec6c9d80cec17b685e148f17f6785a88b597d @@ -208,6 +208,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: f8f66ce4fa24937192a493d3a0a5c2c2e429c8fc +PODFILE CHECKSUM: ce6afe3dea7ea9b073a7ad0406b2cc5615646746 -COCOAPODS: 1.12.1 +COCOAPODS: 1.11.3