From 9f8307a4fff14e2360f54f7d758a8b81430e482a Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 9 Mar 2023 15:45:51 -0300 Subject: [PATCH 01/10] [EC-770] Implement MessagePack on Watch sync (#2264) * EC-770 Started implementing MessagePack for the iPhone -> Watch communication * EC-770 Removed Pods and installed MessagePack through SPM * EC-770 Implemented MessagePack + Lzfse compression when syncing iPhone -> Watch * EC-770 Added MessagePack as submodule and updated the build to checkout the submodule as well. Also added MessagePack files as reference in the watch project * EC-770 Updated build Updated build.yml to checkout submodules on iOS --- .github/workflows/build.yml | 4 + .gitmodules | 3 + lib/MessagePack | 1 + src/Android/Services/WatchDeviceService.cs | 3 +- src/App/App.csproj | 3 + src/App/Services/BaseWatchDeviceService.cs | 19 ++++- src/Core/Core.csproj | 7 ++ src/Core/Models/View/SimpleCipherView.cs | 22 +++++- src/Core/Models/View/WatchDTO.cs | 20 +++++ src/iOS.Core/Services/WatchDeviceService.cs | 29 +++++--- src/iOS.Core/Utilities/WCSessionManager.cs | 6 +- src/iOS.Core/Utilities/iOSCoreHelpers.cs | 3 +- .../Models/Cipher.swift | 6 ++ .../Utilities/BWState.swift | 1 + .../Utilities/JsonDecoderExtensions.swift | 14 ++-- .../ViewModels/BWStateViewModel.swift | 4 +- .../ViewModels/CipherListViewModel.swift | 3 + .../Views/BWStateView.swift | 6 +- .../Views/CipherListView.swift | 2 +- .../WatchConnectivityManager.swift | 44 ++++++++--- .../bitwarden.xcodeproj/project.pbxproj | 73 +++++++++++++++++++ 21 files changed, 228 insertions(+), 45 deletions(-) create mode 100644 .gitmodules create mode 160000 lib/MessagePack diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 47813e813..362ff1579 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,6 +37,8 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + with: + submodules: 'true' - name: Check if special branches exist id: branch-check @@ -514,6 +516,8 @@ jobs: - name: Checkout repo uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 + with: + submodules: 'true' - name: Login to Azure - Prod Subscription uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..e5c10debf --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/MessagePack"] + path = lib/MessagePack + url = https://github.com/bitwarden/MessagePack.git diff --git a/lib/MessagePack b/lib/MessagePack new file mode 160000 index 000000000..1ecb15e31 --- /dev/null +++ b/lib/MessagePack @@ -0,0 +1 @@ +Subproject commit 1ecb15e31176023f6aa0b4948859b197b771d357 diff --git a/src/Android/Services/WatchDeviceService.cs b/src/Android/Services/WatchDeviceService.cs index 0cad001b3..f7273c68f 100644 --- a/src/Android/Services/WatchDeviceService.cs +++ b/src/Android/Services/WatchDeviceService.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Bit.App.Services; using Bit.Core.Abstractions; -using Bit.Core.Models; namespace Bit.Droid.Services { @@ -22,7 +21,7 @@ namespace Bit.Droid.Services protected override bool CanSendData => false; - protected override Task SendDataToWatchAsync(WatchDTO watchDto) => throw new NotImplementedException(); + protected override Task SendDataToWatchAsync(byte[] rawData) => throw new NotImplementedException(); protected override void ConnectToWatch() => throw new NotImplementedException(); } diff --git a/src/App/App.csproj b/src/App/App.csproj index 23b7a7d0e..7901bcca6 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -21,6 +21,7 @@ + @@ -436,6 +437,8 @@ + + diff --git a/src/App/Services/BaseWatchDeviceService.cs b/src/App/Services/BaseWatchDeviceService.cs index defd04a35..79acc44c1 100644 --- a/src/App/Services/BaseWatchDeviceService.cs +++ b/src/App/Services/BaseWatchDeviceService.cs @@ -1,11 +1,11 @@ -using System; -using System.Linq; +using System.Linq; using System.Threading.Tasks; using Bit.Core.Abstractions; using Bit.Core.Enums; using Bit.Core.Models; using Bit.Core.Models.View; -using Xamarin.Forms; +using MessagePack; +using MessagePack.Resolvers; namespace Bit.App.Services { @@ -124,7 +124,18 @@ namespace Bit.App.Services await SyncDataToWatchAsync(); } - protected abstract Task SendDataToWatchAsync(WatchDTO watchDto); + protected async Task SendDataToWatchAsync(WatchDTO watchDto) + { + var options = MessagePackSerializerOptions.Standard + .WithResolver(CompositeResolver.Create( + GeneratedResolver.Instance, + StandardResolver.Instance + )); + + await SendDataToWatchAsync(MessagePackSerializer.Serialize(watchDto, options)); + } + + protected abstract Task SendDataToWatchAsync(byte[] rawData); protected abstract void ConnectToWatch(); } diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index bc2add9b6..bb55f7d47 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -18,6 +18,8 @@ + + @@ -32,6 +34,11 @@ + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + diff --git a/src/Core/Models/View/SimpleCipherView.cs b/src/Core/Models/View/SimpleCipherView.cs index df5262710..cfd078b4a 100644 --- a/src/Core/Models/View/SimpleCipherView.cs +++ b/src/Core/Models/View/SimpleCipherView.cs @@ -1,11 +1,17 @@ using System.Collections.Generic; using System.Linq; using Bit.Core.Enums; +using MessagePack; namespace Bit.Core.Models.View { + [MessagePackObject] public class SimpleCipherView { + public SimpleCipherView() + { + } + public SimpleCipherView(CipherView c) { Id = c.Id; @@ -22,26 +28,40 @@ namespace Bit.Core.Models.View } } + [Key(0)] public string Id { get; set; } + [Key(1)] public string Name { get; set; } - public CipherType Type { get; set; } + [IgnoreMember] + public CipherType Type { get; set; } // ignoring on serialization for now, given that all are going to be of type Login + [Key(2)] public SimpleLoginView Login { get; set; } } + [MessagePackObject] public class SimpleLoginView { + [Key(0)] public string Username { get; set; } + [Key(1)] public string Totp { get; set; } + [Key(2)] public List Uris { get; set; } } + [MessagePackObject] public class SimpleLoginUriView { + public SimpleLoginUriView() + { + } + public SimpleLoginUriView(string uri) { Uri = uri; } + [Key(0)] public string Uri { get; set; } } } diff --git a/src/Core/Models/View/WatchDTO.cs b/src/Core/Models/View/WatchDTO.cs index 33bcae973..10c901b87 100644 --- a/src/Core/Models/View/WatchDTO.cs +++ b/src/Core/Models/View/WatchDTO.cs @@ -1,36 +1,56 @@ using System.Collections.Generic; using Bit.Core.Enums; using Bit.Core.Models.View; +using MessagePack; namespace Bit.Core.Models { + [MessagePackObject] public class WatchDTO { + public WatchDTO() + { + } + public WatchDTO(WatchState state) { State = state; } + [Key(0)] public WatchState State { get; private set; } + [Key(1)] public List Ciphers { get; set; } + [Key(2)] public UserDataDto UserData { get; set; } + [Key(3)] public EnvironmentUrlDataDto EnvironmentData { get; set; } //public SettingsDataDto SettingsData { get; set; } + [MessagePackObject] public class UserDataDto { + [Key(0)] public string Id { get; set; } + + [Key(1)] public string Email { get; set; } + + [Key(2)] public string Name { get; set; } } + [MessagePackObject] public class EnvironmentUrlDataDto { + [Key(0)] public string Base { get; set; } + + [Key(1)] public string Icons { get; set; } } diff --git a/src/iOS.Core/Services/WatchDeviceService.cs b/src/iOS.Core/Services/WatchDeviceService.cs index 250d4788c..099311b0c 100644 --- a/src/iOS.Core/Services/WatchDeviceService.cs +++ b/src/iOS.Core/Services/WatchDeviceService.cs @@ -3,9 +3,8 @@ using System.Collections.Generic; using System.Threading.Tasks; using Bit.App.Services; using Bit.Core.Abstractions; -using Bit.Core.Models; using Bit.Core.Utilities; -using Newtonsoft.Json; +using Foundation; using WatchConnectivity; namespace Bit.iOS.Core.Services @@ -15,12 +14,17 @@ namespace Bit.iOS.Core.Services const string ACTION_MESSAGE_KEY = "actionMessage"; const string TRIGGER_SYNC_ACTION_KEY = "triggerSync"; + private readonly ILogger _logger; + public WatchDeviceService(ICipherService cipherService, IEnvironmentService environmentService, IStateService stateService, - IVaultTimeoutService vaultTimeoutService) + IVaultTimeoutService vaultTimeoutService, + ILogger logger) : base(cipherService, environmentService, stateService, vaultTimeoutService) { + _logger = logger; + WCSessionManager.SharedManager.OnMessagedReceived += OnMessagedReceived; } @@ -30,17 +34,24 @@ namespace Bit.iOS.Core.Services protected override bool IsSupported => WCSession.IsSupported; - protected override Task SendDataToWatchAsync(WatchDTO watchDto) + protected override Task SendDataToWatchAsync(byte[] rawData) { - var serializedData = JsonConvert.SerializeObject(watchDto); + NSError error = null; + // Lzfse is available on iOS 13+ but we're already constraining that by the constraint of watchOS version + // so there's no way this will be executed on lower than iOS 13. So no condition is needed here. + var data = NSData.FromArray(rawData).Compress(NSDataCompressionAlgorithm.Lzfse, out error); + + if (error != null) + { + _logger.Error("Can't compress Lzfse. Error: " + error.LocalizedDescription); + return Task.CompletedTask; + } // Add time to the key to make it change on every message sent so it's delivered faster. // If we use the same key then the OS may defer the delivery of the message because of // resources, reachability and other stuff - WCSessionManager.SharedManager.SendBackgroundHighPriorityMessage(new Dictionary - { - [$"watchDto-{DateTime.UtcNow.ToLongTimeString()}"] = serializedData - }); + var dict = new NSDictionary(new NSString($"watchDto-{DateTime.UtcNow.ToLongTimeString()}"), data); + WCSessionManager.SharedManager.SendBackgroundHighPriorityMessage(dict); return Task.CompletedTask; } diff --git a/src/iOS.Core/Utilities/WCSessionManager.cs b/src/iOS.Core/Utilities/WCSessionManager.cs index 7802019f3..e3e0375cd 100644 --- a/src/iOS.Core/Utilities/WCSessionManager.cs +++ b/src/iOS.Core/Utilities/WCSessionManager.cs @@ -74,7 +74,7 @@ namespace WatchConnectivity Debug.WriteLine($"Watch connectivity Reachable:{(session.Reachable ? '✓' : '✗')}"); } - public void SendBackgroundHighPriorityMessage(Dictionary applicationContext) + public void SendBackgroundHighPriorityMessage(NSDictionary applicationContext) { // Application context doesnt need the watch to be reachable, it will be received when opened if (validSession is null || validSession.ActivationState != WCSessionActivationState.Activated) @@ -84,10 +84,10 @@ namespace WatchConnectivity try { - var sendSuccessfully = validSession.UpdateApplicationContext(applicationContext.ToNSDictionary(), out var error); + var sendSuccessfully = validSession.UpdateApplicationContext(applicationContext, out var error); if (sendSuccessfully) { - Debug.WriteLine($"Sent App Context \nPayLoad: {applicationContext.ToNSDictionary().ToString()} \n"); + Debug.WriteLine($"Sent App Context \nPayLoad: {applicationContext.ToString()} \n"); } else { diff --git a/src/iOS.Core/Utilities/iOSCoreHelpers.cs b/src/iOS.Core/Utilities/iOSCoreHelpers.cs index 0ef4a39b3..e56560b9a 100644 --- a/src/iOS.Core/Utilities/iOSCoreHelpers.cs +++ b/src/iOS.Core/Utilities/iOSCoreHelpers.cs @@ -144,7 +144,8 @@ namespace Bit.iOS.Core.Utilities ServiceContainer.Register(new WatchDeviceService(ServiceContainer.Resolve(), ServiceContainer.Resolve(), ServiceContainer.Resolve(), - ServiceContainer.Resolve())); + ServiceContainer.Resolve(), + ServiceContainer.Resolve())); } public static void Bootstrap(Func postBootstrapFunc = null) diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Models/Cipher.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Models/Cipher.swift index 24232f2a0..38b42b7ba 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Models/Cipher.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Models/Cipher.swift @@ -2,6 +2,12 @@ import Foundation import CoreData struct Cipher:Identifiable,Codable{ + enum CodingKeys : CodingKey { + case id + case name + case login + } + var id:String var name:String? var userId:String? diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/BWState.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/BWState.swift index cfccda06a..13f87ff97 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/BWState.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/BWState.swift @@ -9,6 +9,7 @@ enum BWState : Int, Codable { case syncing = 5 // case needUnlock = 6 case needDeviceOwnerAuth = 7 + case debug = 255 var isDestructive: Bool { return self == .needSetup || self == .needLogin || self == .needPremium || self == .need2FAItem diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/JsonDecoderExtensions.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/JsonDecoderExtensions.swift index c40a0303b..6062ae491 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/JsonDecoderExtensions.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Utilities/JsonDecoderExtensions.swift @@ -3,9 +3,9 @@ import Foundation extension JSONDecoder.KeyDecodingStrategy { static var upperToLowerCamelCase: JSONDecoder.KeyDecodingStrategy { return .custom { codingKeys in - - var key = AnyCodingKey(codingKeys.last!) - + + var key = JSONAnyCodingKey(codingKeys.last!) + if let firstChar = key.stringValue.first { key.stringValue.replaceSubrange( ...key.stringValue.startIndex, with: String(firstChar).lowercased() @@ -16,10 +16,10 @@ extension JSONDecoder.KeyDecodingStrategy { } } -struct AnyCodingKey : CodingKey { +struct JSONAnyCodingKey : CodingKey { var stringValue: String var intValue: Int? - + init(_ base: CodingKey) { self.init(stringValue: base.stringValue, intValue: base.intValue) } @@ -27,12 +27,12 @@ struct AnyCodingKey : CodingKey { init(stringValue: String) { self.stringValue = stringValue } - + init(intValue: Int) { self.stringValue = "\(intValue)" self.intValue = intValue } - + init(stringValue: String, intValue: Int?) { self.stringValue = stringValue self.intValue = intValue diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/BWStateViewModel.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/BWStateViewModel.swift index c55991a1c..9f60d2223 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/BWStateViewModel.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/BWStateViewModel.swift @@ -4,7 +4,7 @@ class BWStateViewModel : ObservableObject{ @Published var text:String @Published var isLoading:Bool = false - init(_ state: BWState){ + init(_ state: BWState, _ defaultText: String?){ switch state { case .needLogin: text = "LogInToBitwardenOnYourIPhoneToViewVerificationCodes" @@ -22,7 +22,7 @@ class BWStateViewModel : ObservableObject{ case .needDeviceOwnerAuth: text = "SetUpAppleWatchPasscodeInOrderToUseBitwarden" default: - text = "" + text = defaultText ?? "" } } } diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/CipherListViewModel.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/CipherListViewModel.swift index ffebd82d0..2a5093d33 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/CipherListViewModel.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/ViewModels/CipherListViewModel.swift @@ -15,6 +15,8 @@ class CipherListViewModel : ObservableObject { @Published var searchTerm: String = "" + var debugText: String? = nil + private var subscriber: AnyCancellable? init(_ cipherService: CipherServiceProtocol){ @@ -23,6 +25,7 @@ class CipherListViewModel : ObservableObject { subscriber = watchConnectivityManager.watchConnectivitySubject.sink { completion in print("WCM subject: \(completion)") } receiveValue: { value in + self.debugText = value.debugText self.checkStateAndFetch(value.state) } diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/BWStateView.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/BWStateView.swift index 05436a17c..3912e2937 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/BWStateView.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/BWStateView.swift @@ -3,8 +3,8 @@ import SwiftUI struct BWStateView: View { @ObservedObject var viewModel:BWStateViewModel - init(_ state: BWState) { - viewModel = BWStateViewModel(state) + init(_ state: BWState, _ defaultText: String?) { + viewModel = BWStateViewModel(state, defaultText) } var body: some View { @@ -32,6 +32,6 @@ struct BWStateView: View { struct BWStateView_Previews: PreviewProvider { static var previews: some View { - BWStateView(.needSetup) + BWStateView(.needSetup, nil) } } diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/CipherListView.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/CipherListView.swift index 596ace963..ab8b720fd 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/CipherListView.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/Views/CipherListView.swift @@ -62,7 +62,7 @@ struct CipherListView: View { #endif } .fullScreenCover(isPresented: $viewModel.showingSheet) { - BWStateView(viewModel.currentState) + BWStateView(viewModel.currentState, viewModel.debugText) } } diff --git a/src/watchOS/bitwarden/bitwarden WatchKit Extension/WatchConnectivityManager.swift b/src/watchOS/bitwarden/bitwarden WatchKit Extension/WatchConnectivityManager.swift index 405062064..c0f4291fe 100644 --- a/src/watchOS/bitwarden/bitwarden WatchKit Extension/WatchConnectivityManager.swift +++ b/src/watchOS/bitwarden/bitwarden WatchKit Extension/WatchConnectivityManager.swift @@ -4,6 +4,7 @@ import WatchConnectivity struct WatchConnectivityMessage { var state: BWState? + var debugText: String? } final class WatchConnectivityManager: NSObject, ObservableObject { @@ -76,22 +77,41 @@ extension WatchConnectivityManager: WCSessionDelegate { k.starts(with: WATCH_DTO_APP_CONTEXT_KEY) } - guard let dtoKey = watchDtoKey, let serializedDto = applicationContext[dtoKey] as? String else { - return - } - - guard KeychainHelper.standard.hasDeviceOwnerAuth() else { - return - } - do { - guard let json = try! JSONSerialization.jsonObject(with: serializedDto.data(using: .utf8)!, options: [.fragmentsAllowed]) as? String else { + guard let dtoKey = watchDtoKey, + let nsRawData = applicationContext[dtoKey] as? NSData, + KeychainHelper.standard.hasDeviceOwnerAuth() else { return } - let decoder = JSONDecoder() - decoder.keyDecodingStrategy = .upperToLowerCamelCase - let watchDTO = try decoder.decode(WatchDTO.self, from: json.data(using: .utf8)!) + let decoder = MessagePackDecoder() + decoder.userInfo[MessagePackDecoder.dataSpecKey] = DataSpecBuilder() + .append("state") + .appendArray("ciphers", DataSpecBuilder() + .append("id") + .append("name") + .appendObj("login", DataSpecBuilder() + .append("username") + .append("totp") + .appendArray("uris", DataSpecBuilder() + .append("uri") + .build()) + .build()) + .build()) + .appendObj("userData", DataSpecBuilder() + .append("id") + .append("email") + .append("name") + .build()) + .appendObj("environmentData", DataSpecBuilder() + .append("base") + .append("icons") + .build()) + .build() + + let rawData = try nsRawData.decompressed(using: .lzfse) + + let watchDTO = try decoder.decode(WatchDTO.self, from: Data(referencing: rawData)) let previousUserId = StateService.shared.getUser()?.id diff --git a/src/watchOS/bitwarden/bitwarden.xcodeproj/project.pbxproj b/src/watchOS/bitwarden/bitwarden.xcodeproj/project.pbxproj index 0c691510d..8720e755d 100644 --- a/src/watchOS/bitwarden/bitwarden.xcodeproj/project.pbxproj +++ b/src/watchOS/bitwarden/bitwarden.xcodeproj/project.pbxproj @@ -27,6 +27,18 @@ 1B15615B28B7F3D900610B9B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1B15615A28B7F3D900610B9B /* Preview Assets.xcassets */; }; 1B15616C28B81A2200610B9B /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B15616B28B81A2200610B9B /* Cipher.swift */; }; 1B15616E28B81A4300610B9B /* WatchConnectivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B15616D28B81A4300610B9B /* WatchConnectivityManager.swift */; }; + 1B2A484029A90D9B00621E13 /* FixedWidthInteger+Bytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483229A90D9B00621E13 /* FixedWidthInteger+Bytes.swift */; }; + 1B2A484129A90D9B00621E13 /* UnkeyedEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483429A90D9B00621E13 /* UnkeyedEncodingContainer.swift */; }; + 1B2A484229A90D9B00621E13 /* SingleValueEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483529A90D9B00621E13 /* SingleValueEncodingContainer.swift */; }; + 1B2A484329A90D9B00621E13 /* KeyedEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483629A90D9B00621E13 /* KeyedEncodingContainer.swift */; }; + 1B2A484429A90D9B00621E13 /* MessagePackEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483729A90D9B00621E13 /* MessagePackEncoder.swift */; }; + 1B2A484529A90D9B00621E13 /* KeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483929A90D9B00621E13 /* KeyedDecodingContainer.swift */; }; + 1B2A484629A90D9B00621E13 /* SingleValueDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483A29A90D9B00621E13 /* SingleValueDecodingContainer.swift */; }; + 1B2A484729A90D9B00621E13 /* MessagePackDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483B29A90D9B00621E13 /* MessagePackDecoder.swift */; }; + 1B2A484829A90D9B00621E13 /* UnkeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483C29A90D9B00621E13 /* UnkeyedDecodingContainer.swift */; }; + 1B2A484929A90D9B00621E13 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483D29A90D9B00621E13 /* Box.swift */; }; + 1B2A484A29A90D9B00621E13 /* DataSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483E29A90D9B00621E13 /* DataSpec.swift */; }; + 1B2A484B29A90D9B00621E13 /* AnyCodingKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A483F29A90D9B00621E13 /* AnyCodingKey.swift */; }; 1B5849A7294D1C020055286B /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B5849A6294D1C020055286B /* Queue.swift */; }; 1B59EC5729007DEE00A8718D /* BitwardenDB.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1B59EC5529007DEE00A8718D /* BitwardenDB.xcdatamodeld */; }; 1B59EC592900801500A8718D /* StringEncryptionTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B59EC582900801500A8718D /* StringEncryptionTransformer.swift */; }; @@ -140,6 +152,18 @@ 1B15615D28B7F3D900610B9B /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; 1B15616B28B81A2200610B9B /* Cipher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cipher.swift; sourceTree = ""; }; 1B15616D28B81A4300610B9B /* WatchConnectivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchConnectivityManager.swift; sourceTree = ""; }; + 1B2A483229A90D9B00621E13 /* FixedWidthInteger+Bytes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FixedWidthInteger+Bytes.swift"; sourceTree = ""; }; + 1B2A483429A90D9B00621E13 /* UnkeyedEncodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnkeyedEncodingContainer.swift; sourceTree = ""; }; + 1B2A483529A90D9B00621E13 /* SingleValueEncodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleValueEncodingContainer.swift; sourceTree = ""; }; + 1B2A483629A90D9B00621E13 /* KeyedEncodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyedEncodingContainer.swift; sourceTree = ""; }; + 1B2A483729A90D9B00621E13 /* MessagePackEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagePackEncoder.swift; sourceTree = ""; }; + 1B2A483929A90D9B00621E13 /* KeyedDecodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyedDecodingContainer.swift; sourceTree = ""; }; + 1B2A483A29A90D9B00621E13 /* SingleValueDecodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleValueDecodingContainer.swift; sourceTree = ""; }; + 1B2A483B29A90D9B00621E13 /* MessagePackDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagePackDecoder.swift; sourceTree = ""; }; + 1B2A483C29A90D9B00621E13 /* UnkeyedDecodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnkeyedDecodingContainer.swift; sourceTree = ""; }; + 1B2A483D29A90D9B00621E13 /* Box.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Box.swift; sourceTree = ""; }; + 1B2A483E29A90D9B00621E13 /* DataSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataSpec.swift; sourceTree = ""; }; + 1B2A483F29A90D9B00621E13 /* AnyCodingKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyCodingKey.swift; sourceTree = ""; }; 1B5849A6294D1C020055286B /* Queue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = ""; }; 1B5849A92950BC860055286B /* LocalAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LocalAuthentication.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS9.1.sdk/System/Library/Frameworks/LocalAuthentication.framework; sourceTree = DEVELOPER_DIR; }; 1B59EC5629007DEE00A8718D /* BitwardenDB.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = BitwardenDB.xcdatamodel; sourceTree = ""; }; @@ -288,6 +312,7 @@ 1B15614C28B7F3D800610B9B /* bitwarden WatchKit Extension */ = { isa = PBXGroup; children = ( + 1B2A483129A90D9B00621E13 /* MessagePack */, 1B8BF9072919A2BC006F069E /* Controls */, 1B5AFF0629197809004478F9 /* Localization */, 1B59EC5F2900C48300A8718D /* Helpers */, @@ -320,6 +345,42 @@ path = "Preview Content"; sourceTree = ""; }; + 1B2A483129A90D9B00621E13 /* MessagePack */ = { + isa = PBXGroup; + children = ( + 1B2A483229A90D9B00621E13 /* FixedWidthInteger+Bytes.swift */, + 1B2A483329A90D9B00621E13 /* Encoder */, + 1B2A483829A90D9B00621E13 /* Decoder */, + 1B2A483D29A90D9B00621E13 /* Box.swift */, + 1B2A483E29A90D9B00621E13 /* DataSpec.swift */, + 1B2A483F29A90D9B00621E13 /* AnyCodingKey.swift */, + ); + name = MessagePack; + path = ../../../../lib/MessagePack/Sources/MessagePack; + sourceTree = ""; + }; + 1B2A483329A90D9B00621E13 /* Encoder */ = { + isa = PBXGroup; + children = ( + 1B2A483429A90D9B00621E13 /* UnkeyedEncodingContainer.swift */, + 1B2A483529A90D9B00621E13 /* SingleValueEncodingContainer.swift */, + 1B2A483629A90D9B00621E13 /* KeyedEncodingContainer.swift */, + 1B2A483729A90D9B00621E13 /* MessagePackEncoder.swift */, + ); + path = Encoder; + sourceTree = ""; + }; + 1B2A483829A90D9B00621E13 /* Decoder */ = { + isa = PBXGroup; + children = ( + 1B2A483929A90D9B00621E13 /* KeyedDecodingContainer.swift */, + 1B2A483A29A90D9B00621E13 /* SingleValueDecodingContainer.swift */, + 1B2A483B29A90D9B00621E13 /* MessagePackDecoder.swift */, + 1B2A483C29A90D9B00621E13 /* UnkeyedDecodingContainer.swift */, + ); + path = Decoder; + sourceTree = ""; + }; 1B5849A82950BC860055286B /* Frameworks */ = { isa = PBXGroup; children = ( @@ -584,8 +645,12 @@ 1BDBFEAC290B4215009C78C7 /* CipherListViewModel.swift in Sources */, 1BF5F6DB29103066002DDC0C /* CipherService.swift in Sources */, 1B5F5E3E293FBB17009B5FCC /* CipherItemView.swift in Sources */, + 1B2A484629A90D9B00621E13 /* SingleValueDecodingContainer.swift in Sources */, 1B15616C28B81A2200610B9B /* Cipher.swift in Sources */, + 1B2A484A29A90D9B00621E13 /* DataSpec.swift in Sources */, 1B8BF90429199BBB006F069E /* CipherDetailsView.swift in Sources */, + 1B2A484229A90D9B00621E13 /* SingleValueEncodingContainer.swift in Sources */, + 1B2A484929A90D9B00621E13 /* Box.swift in Sources */, 1B8BF9112919CDBB006F069E /* DateExtensions.swift in Sources */, 1BD291BB2927E9B50004F33F /* WatchDTO.swift in Sources */, 1B11C899291BFAB500CE58D8 /* CryptoFunctionService.swift in Sources */, @@ -595,32 +660,40 @@ 1BD291BD292807240004F33F /* User.swift in Sources */, 1BDBFEB3290B5D07009C78C7 /* CoreDataHelper.swift in Sources */, 1B15615028B7F3D800610B9B /* CipherListView.swift in Sources */, + 1B2A484529A90D9B00621E13 /* KeyedDecodingContainer.swift in Sources */, + 1B2A484329A90D9B00621E13 /* KeyedEncodingContainer.swift in Sources */, 1BD291BF292D0E6F0004F33F /* JsonDecoderExtensions.swift in Sources */, 1B59EC632901B1C100A8718D /* LoggerHelper.swift in Sources */, 1BD291C329311E1C0004F33F /* VaultTimeoutAction.swift in Sources */, 1B15615628B7F3D800610B9B /* ComplicationController.swift in Sources */, + 1B2A484129A90D9B00621E13 /* UnkeyedEncodingContainer.swift in Sources */, 1BD291B9292438830004F33F /* StateService.swift in Sources */, 1BC1CD6329227D3C006540DA /* EnvironmentService.swift in Sources */, 1B8BF9092919A2CC006F069E /* CircularProgressView.swift in Sources */, + 1B2A484B29A90D9B00621E13 /* AnyCodingKey.swift in Sources */, 1BD291B7292409410004F33F /* BWState.swift in Sources */, 1B15614E28B7F3D800610B9B /* bitwardenApp.swift in Sources */, 1BC1CD6929228CEB006540DA /* StringExtensions.swift in Sources */, 1BDBFEB1290B5BD3009C78C7 /* DBHelperProtocol.swift in Sources */, + 1B2A484429A90D9B00621E13 /* MessagePackEncoder.swift in Sources */, 1B8BF90629199EC5006F069E /* CipherDetailsViewModel.swift in Sources */, 1BF5F6DE29103B86002DDC0C /* CipherServiceMock.swift in Sources */, 1BC1CD672922871A006540DA /* URLExtensions.swift in Sources */, 1B11C89B291C587600CE58D8 /* UInt64Extensions.swift in Sources */, 1B8453ED290C672E00F921E1 /* CipherEntity+CoreDataProperties.swift in Sources */, + 1B2A484029A90D9B00621E13 /* FixedWidthInteger+Bytes.swift in Sources */, 1BC1CD6E2922B92B006540DA /* ImageView.swift in Sources */, 1BD291C1292E7E690004F33F /* ErrorExtensions.swift in Sources */, 1B14DF37291186D900EA43F1 /* EmptyStateViewModifier.swift in Sources */, 1BD291B52924047C0004F33F /* BWStateViewModel.swift in Sources */, 1B5849A7294D1C020055286B /* Queue.swift in Sources */, 1B15616E28B81A4300610B9B /* WatchConnectivityManager.swift in Sources */, + 1B2A484829A90D9B00621E13 /* UnkeyedDecodingContainer.swift in Sources */, 1B5AFF0329196C81004478F9 /* ColorUtils.swift in Sources */, 1B59EC612900C48E00A8718D /* KeychainHelper.swift in Sources */, 1B5BE453295A08C600E0C323 /* ExtensionDelegate.swift in Sources */, 1B59EC5729007DEE00A8718D /* BitwardenDB.xcdatamodeld in Sources */, + 1B2A484729A90D9B00621E13 /* MessagePackDecoder.swift in Sources */, 1B8BF90D2919BED9006F069E /* Base32.swift in Sources */, 1B8453EC290C672E00F921E1 /* CipherEntity+CoreDataClass.swift in Sources */, 1BC1CD6529227F3C006540DA /* IconImageHelper.swift in Sources */, From f733d22d55d25ad56a79f0db954a964b98a9ac6f Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 9 Mar 2023 15:58:16 -0300 Subject: [PATCH 02/10] PM-1386 Fix otp data issuer and account name being set correctly (#2411) --- src/Core/Utilities/OtpData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/Utilities/OtpData.cs b/src/Core/Utilities/OtpData.cs index 5306f8adf..874aa8c3a 100644 --- a/src/Core/Utilities/OtpData.cs +++ b/src/Core/Utilities/OtpData.cs @@ -32,8 +32,8 @@ namespace Bit.Core.Utilities if (label.Contains(LABEL_SEPARATOR)) { var parts = label.Split(LABEL_SEPARATOR); - AccountName = parts[0].Trim(); - Issuer = parts[1].Trim(); + Issuer = parts[0].Trim(); + AccountName = parts[1].Trim(); } else { From fe12b0e908e0868762940271d382d771eba5f52c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Mar 2023 01:31:13 +0100 Subject: [PATCH 03/10] Autosync the updated translations (#2412) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- src/App/Resources/AppResources.af.resx | 24 +++- src/App/Resources/AppResources.ar.resx | 12 ++ src/App/Resources/AppResources.az.resx | 12 ++ src/App/Resources/AppResources.be.resx | 12 ++ src/App/Resources/AppResources.bg.resx | 12 ++ src/App/Resources/AppResources.bn.resx | 12 ++ src/App/Resources/AppResources.bs.resx | 12 ++ src/App/Resources/AppResources.ca.resx | 12 ++ src/App/Resources/AppResources.cs.resx | 14 ++- src/App/Resources/AppResources.da.resx | 12 ++ src/App/Resources/AppResources.de.resx | 131 +++++++++++--------- src/App/Resources/AppResources.el.resx | 12 ++ src/App/Resources/AppResources.en-GB.resx | 12 ++ src/App/Resources/AppResources.en-IN.resx | 12 ++ src/App/Resources/AppResources.es.resx | 12 ++ src/App/Resources/AppResources.et.resx | 12 ++ src/App/Resources/AppResources.eu.resx | 12 ++ src/App/Resources/AppResources.fa.resx | 12 ++ src/App/Resources/AppResources.fi.resx | 12 ++ src/App/Resources/AppResources.fil.resx | 12 ++ src/App/Resources/AppResources.fr.resx | 12 ++ src/App/Resources/AppResources.gl.resx | 12 ++ src/App/Resources/AppResources.he.resx | 12 ++ src/App/Resources/AppResources.hi.resx | 12 ++ src/App/Resources/AppResources.hr.resx | 12 ++ src/App/Resources/AppResources.hu.resx | 12 ++ src/App/Resources/AppResources.id.resx | 12 ++ src/App/Resources/AppResources.it.resx | 20 ++- src/App/Resources/AppResources.ja.resx | 12 ++ src/App/Resources/AppResources.ka.resx | 12 ++ src/App/Resources/AppResources.kn.resx | 12 ++ src/App/Resources/AppResources.ko.resx | 12 ++ src/App/Resources/AppResources.lt.resx | 14 ++- src/App/Resources/AppResources.lv.resx | 12 ++ src/App/Resources/AppResources.ml.resx | 12 ++ src/App/Resources/AppResources.nb.resx | 26 ++-- src/App/Resources/AppResources.ne.resx | 12 ++ src/App/Resources/AppResources.nl.resx | 12 ++ src/App/Resources/AppResources.nn.resx | 12 ++ src/App/Resources/AppResources.pl.resx | 12 ++ src/App/Resources/AppResources.pt-BR.resx | 12 ++ src/App/Resources/AppResources.pt-PT.resx | 12 ++ src/App/Resources/AppResources.ro.resx | 12 ++ src/App/Resources/AppResources.ru.resx | 12 ++ src/App/Resources/AppResources.si.resx | 12 ++ src/App/Resources/AppResources.sk.resx | 12 ++ src/App/Resources/AppResources.sl.resx | 12 ++ src/App/Resources/AppResources.sr.resx | 12 ++ src/App/Resources/AppResources.sv.resx | 12 ++ src/App/Resources/AppResources.ta.resx | 12 ++ src/App/Resources/AppResources.te.resx | 12 ++ src/App/Resources/AppResources.th.resx | 12 ++ src/App/Resources/AppResources.tr.resx | 18 ++- src/App/Resources/AppResources.uk.resx | 12 ++ src/App/Resources/AppResources.vi.resx | 12 ++ src/App/Resources/AppResources.zh-Hans.resx | 36 ++++-- src/App/Resources/AppResources.zh-Hant.resx | 12 ++ 57 files changed, 778 insertions(+), 93 deletions(-) diff --git a/src/App/Resources/AppResources.af.resx b/src/App/Resources/AppResources.af.resx index cfff15153..46cc72d4a 100644 --- a/src/App/Resources/AppResources.af.resx +++ b/src/App/Resources/AppResources.af.resx @@ -584,7 +584,7 @@ ’n Hoofwagwoordwenk kan u help om u wagwoord te onthou indien u dit sou vergeet. - Master password must be at least {0} characters long. + Die hoofwagwoord moet ten minste {0} karakters lank wees. Min. aantal syfers @@ -2541,16 +2541,16 @@ Wil u na die rekening omskakel? Laat die kamera versoek toe om die skandeerder te gebruik - Language + Taal - The language has been changed to {0}. Please restart the app to see the change + Die taal is na {0} verander. Asseblief herbegin die toep om die veranderinge te sien - Language change requires app restart + Die taal verandering vereis 'n herbegin van die toep - Default (System) + Verstek (Sisteem) Belangrik @@ -2589,6 +2589,18 @@ Wil u na die rekening omskakel? Swak wagwoord geïdentifiseer en in 'n data lekkasie gevind. Gebruik 'n sterk en unieke wagwoord om jou rekening te beskerm. Is jy seker dat jy hierdie wagwoord wil gebruik? - Organization SSO identifier required. + Organisasie SSO identifiseerder vereis. + + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search diff --git a/src/App/Resources/AppResources.ar.resx b/src/App/Resources/AppResources.ar.resx index 5c2141713..4c9ab22d3 100644 --- a/src/App/Resources/AppResources.ar.resx +++ b/src/App/Resources/AppResources.ar.resx @@ -2592,4 +2592,16 @@ Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.az.resx b/src/App/Resources/AppResources.az.resx index e21ad4377..a20809072 100644 --- a/src/App/Resources/AppResources.az.resx +++ b/src/App/Resources/AppResources.az.resx @@ -2590,4 +2590,16 @@ Bu hesaba keçmək istəyirsiniz? Təşkilat SSO identifikatoru tələb olundu. + + Açarı, mövcud və ya yeni bir elementə əlavə edin + + + Anbarınızda {0} ilə uyğunlaşan heç bir element yoxdur + + + Bir element axtarın və ya yenisini əlavə edin + + + Axtarışa uyğun gələn heç bir element yoxdur + diff --git a/src/App/Resources/AppResources.be.resx b/src/App/Resources/AppResources.be.resx index 97c169cc4..e04f911c0 100644 --- a/src/App/Resources/AppResources.be.resx +++ b/src/App/Resources/AppResources.be.resx @@ -2591,4 +2591,16 @@ Неабходны ідэнтыфікатар SSO арганізацыі. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.bg.resx b/src/App/Resources/AppResources.bg.resx index ec5b3772e..24db8d124 100644 --- a/src/App/Resources/AppResources.bg.resx +++ b/src/App/Resources/AppResources.bg.resx @@ -2591,4 +2591,16 @@ select Add TOTP to store the key safely Идентификаторът за еднократн идентификация на организация е задължителен. + + Добавяне на ключа към съществуващ или нов елемент + + + В трезора липсват елементи, които отговарят на „{0}“ + + + Търсене на елемент или добавяне на нов + + + Няма елементи, които отговарят на търсенето + diff --git a/src/App/Resources/AppResources.bn.resx b/src/App/Resources/AppResources.bn.resx index 169f2112b..b8a9bd396 100644 --- a/src/App/Resources/AppResources.bn.resx +++ b/src/App/Resources/AppResources.bn.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.bs.resx b/src/App/Resources/AppResources.bs.resx index 88dc8e7de..aa68f1823 100644 --- a/src/App/Resources/AppResources.bs.resx +++ b/src/App/Resources/AppResources.bs.resx @@ -2590,4 +2590,16 @@ Skeniranje će biti izvršeno automatski. Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ca.resx b/src/App/Resources/AppResources.ca.resx index ffc636de1..ee23b2a0b 100644 --- a/src/App/Resources/AppResources.ca.resx +++ b/src/App/Resources/AppResources.ca.resx @@ -2591,4 +2591,16 @@ Voleu canviar a aquest compte? L’identificador SSO de l’organització és obligatori. + + Afig la clau a un element existent o nou + + + No hi ha cap element a la caixa forta que coincidisca amb "{0}" + + + Cerca un element o n'afig un nou + + + No hi ha elements que coincidisquen amb la cerca + diff --git a/src/App/Resources/AppResources.cs.resx b/src/App/Resources/AppResources.cs.resx index b19f60639..0ac31bf31 100644 --- a/src/App/Resources/AppResources.cs.resx +++ b/src/App/Resources/AppResources.cs.resx @@ -285,7 +285,7 @@ Účet byl již přidán - Would you like to switch to it now? + Chcete se na něj nyní přepnout? Hlavní heslo @@ -2591,4 +2591,16 @@ Chcete se přepnout na tento účet? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.da.resx b/src/App/Resources/AppResources.da.resx index 8964490f7..8c56b7a6c 100644 --- a/src/App/Resources/AppResources.da.resx +++ b/src/App/Resources/AppResources.da.resx @@ -2591,4 +2591,16 @@ Vil du skifte til denne konto? Organisations-SSO obligatorisk. + + Føj nøglen til et eksisterende eller nyt emne + + + Der er ingen emner i boksen matchende "{0}" + + + Søg efter, eller tilføj et nyt, emne + + + Ingen emner matcher søgningen + diff --git a/src/App/Resources/AppResources.de.resx b/src/App/Resources/AppResources.de.resx index 76ee22fbc..7316263ef 100644 --- a/src/App/Resources/AppResources.de.resx +++ b/src/App/Resources/AppResources.de.resx @@ -156,7 +156,7 @@ The button text that allows a user to copy the login's password to their clipboard. - Benutzernamen kopieren + Benutzername kopieren The button text that allows a user to copy the login's username to their clipboard. @@ -232,7 +232,7 @@ Ordner gespeichert - Webseite besuchen + Zur Website The button text that allows user to launch the website to their web browser. @@ -379,10 +379,10 @@ Confirmation message after successfully copying a value to the clipboard. - Fingerabdruck überprüfen + Fingerabdruck verifizieren - Master-Passwort überprüfen + Master-Passwort verifizieren PIN überprüfen @@ -394,7 +394,7 @@ Ansicht - Besuche unsere Webseite + Besuche unsere Website Besuche unsere Webseite um Hilfe zu erhalten, Neuigkeiten zu erfahren, Kontakt aufzunehmen und mehr über die Verwendung von Bitwarden zu lernen. @@ -422,7 +422,7 @@ Verwende den Bitwarden Dienst in den Bedienungshilfen, um deine Zugangsdaten in Apps und im Web automatisch ausfüllen zu lassen. - Automatische Ausfüllfunktion + Auto-Ausfüllen-Dienst Mehrdeutige Zeichen vermeiden @@ -587,7 +587,7 @@ Das Master-Passwort muss mindestens {0} Zeichen lang sein. - Mindestanzahl Zahlen + Mindestanzahl Ziffern Minimum numeric characters for password generator settings @@ -635,10 +635,10 @@ Passwort generiert - Passwortgenerator + Passwort-Generator - Passworthinweis + Passwort-Hinweis Wir haben Ihnen eine E-Mail mit Ihrem Masterpassworthinweis gesendet. @@ -678,7 +678,7 @@ Gebe deine 4-stellige PIN ein, um die App zu entsperren. - Eintrags-Information + Eintragsinformationen Eintrag gespeichert @@ -815,7 +815,7 @@ Message shown when trying to launch an app that does not exist on the user's device. - Authentifizierungs-App + Authenticator App For 2FA @@ -863,7 +863,7 @@ Halte deinen YubiKey NEO an die Rückseite des Geräts, um fortzufahren. - YubiKey NEO Sicherheitsschlüssel + YubiKey Sicherheitsschlüssel "YubiKey" is the product name and should not be translated. @@ -978,7 +978,7 @@ Das Scannen erfolgt automatisch. "Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management - Selbstgehostete Umgebung + Selbst gehostete Umgebung Bitte gebe die Basis-URL deiner selbst gehosteten Bitwarden-Installation an. @@ -1140,7 +1140,7 @@ Das Scannen erfolgt automatisch. Gültig bis - Zeige Webseiten-Icons + Website-Symbole anzeigen Ein wiedererkennbares Bild neben jeden Zugangsdaten anzeigen. @@ -1173,10 +1173,10 @@ Das Scannen erfolgt automatisch. Auto-Fill Bedienungshilfe - Die automatische Ausfüllfunktion von Bitwarden benutzt das Android Autofill Framework, um Zugangsdaten in anderen Apps auf deinem Gerät auszufüllen. + Der Auto-Ausfüllen-Dienst von Bitwarden benutzt das Android Autofill Framework, um Zugangsdaten in anderen Apps auf deinem Gerät auszufüllen. - Verwende die automatische Ausfüllfunktion von Bitwarden, um Anmeldedaten in anderen Apps auszufüllen. + Verwende den Auto-Ausfüllen-Dienst von Bitwarden, um Anmeldedaten in anderen Apps auszufüllen. Öffne Auto-Fill Einstellungen @@ -1201,7 +1201,7 @@ Das Scannen erfolgt automatisch. Die Android Auto-Fill Einstellungen konnten nicht automatisch geöffnet werden. Über Android Einstellungen > Sprachen & Eingabe > AutoFill-Dienst kannst du manuell zu den Auto-Fill Einstellungen navigieren. - Name des benutzerdefinierten Feld + Name des benutzerdefinierten Feldes Boolean @@ -1259,7 +1259,7 @@ Das Scannen erfolgt automatisch. URI match detection for auto-fill. - Ja, und speichern + Ja und speichern Automatisch ausfüllen und speichern @@ -1289,7 +1289,7 @@ Das Scannen erfolgt automatisch. ex. Date this item was updated - Automatisch ausfüllen aktiviert! + Auto-Ausfüllen aktiviert! Du musst dich in der Bitwarden App einloggen, bevor du AutoFill nutzen kannst. @@ -1384,13 +1384,13 @@ Das Scannen erfolgt automatisch. Sammlung durchsuchen - Datei-Sends suchen + Datei-Sends durchsuchen - Text-Sends suchen + Text-Sends durchsuchen - Suche {0} + {0} durchsuchen ex: Search Logins @@ -1437,7 +1437,7 @@ Das Scannen erfolgt automatisch. Keine Organisationen vorhanden. - Wähle eine Organisation aus, in die du diesen Eintrag verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum an diese Organisation. Du bist nicht mehr der direkte Besitzer dieses Eintrags, sobald er verschoben wurde. + Wähle eine Organisation aus, in die du diesen Eintrag verschieben möchtest. Das Verschieben in eine Organisation überträgt das Eigentum an diese Organisation. Du bist nicht mehr der direkte Eigentümer dieses Eintrags, sobald er verschoben wurde. Anzahl der Wörter @@ -1502,7 +1502,7 @@ Das Scannen erfolgt automatisch. Dein Tresor ist gesperrt. Gebe deinen PIN-Code ein um fortzufahren. - Dein Tresor ist gesperrt. Überprüfe deine Identität, um fortzufahren. + Dein Tresor ist gesperrt. Verifiziere deine Identität, um fortzufahren. Dunkel @@ -1556,7 +1556,8 @@ Das Scannen erfolgt automatisch. Dunkles Standard-Design - Wähle das zu verwendende dunkle Design aus, das bei der Auswahl vom Standard-(System)-Design verwendet werden soll, während der Dunkelmodus deines Geräts aktiviert ist. + Wähle das zu verwendende dunkle Design aus, das bei der Auswahl vom Standard-(System)-Design verwendet werden soll, während der Dark +Mode deines Geräts aktiviert ist. Notiz kopieren @@ -1598,7 +1599,7 @@ Das Scannen erfolgt automatisch. Beim Neustart der App - Automatisches Ausfüllen vereinfacht es, sicher auf deinen Bitwarden Tresor über andere Webseiten und Apps zuzugreifen. Es sieht aus, als ob du die automatische Ausfüllfunktion für Bitwarden nicht eingerichtet hast. Richte die automatische Ausfüllfunktion in den "Einstellungen" ein. + Auto-Ausfüllen vereinfacht es, sicher auf deinen Bitwarden Tresor über andere Webseiten und Apps zuzugreifen. Es sieht aus, als ob du den Auto-Ausfüllen-Dienst für Bitwarden nicht eingerichtet hast. Richte Auto-Ausfüllen in den "Einstellungen" ein. Deine Änderungen am Aussehen der App werden beim nächsten Neustart der App angewendet. @@ -1608,7 +1609,7 @@ Das Scannen erfolgt automatisch. ex. Uppercase the first character of a word. - Ziffer hinzufügen + Ziffern einschließen Herunterladen @@ -1629,7 +1630,7 @@ Das Scannen erfolgt automatisch. Biometrie - Benutze Biometrie zum Entsperren + Biometrie zum Entsperren verwenden Bitwarden braucht Aufmerksamkeit - Siehe "Bedienungshilfen zum automatischen Ausfüllen" in den Bitwarden-Einstellungen @@ -1659,13 +1660,13 @@ Das Scannen erfolgt automatisch. Gib das Masterpasswort ein, um deine Tresordaten zu exportieren. - Einen Bestätigungscode an deine E-Mail-Adresse senden + Einen Verifizierungscode an deine E-Mail-Adresse senden Code gesendet! - Bestätige deine Identität, um fortzufahren. + Verifiziere deine Identität, um fortzufahren. Dieser Export enthält deine Tresordaten in einem unverschlüsseltem Format. Du solltest sie nicht speichern oder über unsichere Kanäle (z. B. E-Mail) senden. Lösche sie sofort nach ihrer Verwendung. @@ -1707,7 +1708,7 @@ Das Scannen erfolgt automatisch. Anhang erfolgreich gespeichert - Bitte aktiviere "Bedienungshilfen zum automatischen Ausfüllen" in den Bitwarden-Einstellungen, um die Automatisch-Ausfüllen-Kachel zu verwenden. + Bitte aktiviere "Bedienungshilfen zum automatischen Ausfüllen" in den Bitwarden-Einstellungen, um die Auto-Ausfüllen-Kachel zu verwenden. Keine Passwortfelder erkannt @@ -1768,7 +1769,7 @@ Das Scannen erfolgt automatisch. Enterprise Single-Sign-On - Schnell über den Single Sign-on deiner Organisation anmelden. Bitte gib deine Organisationskennung an, um zu beginnen. + Schnell über den Single Sign-on deiner Organisation anmelden. Bitte gib deine Organisations-ID an, um zu beginnen. Organisationskennung @@ -1825,10 +1826,10 @@ Das Scannen erfolgt automatisch. Datenschutzbestimmungen - Bitwarden braucht Aufmerksamkeit - Aktiviere "Überschreiben" in den "Funktionen zum automatischen Ausfüllen" in den Bitwarden-Einstellungen + Bitwarden braucht Aufmerksamkeit - Aktiviere "Überschreiben" im "Auto-Ausfüllen-Dienst" in den Bitwarden-Einstellungen - Funktionen zum automatischen Ausfüllen + Auto-Ausfüllen-Dienst Inline Auto-Ausfüllen verwenden @@ -1933,7 +1934,7 @@ Das Scannen erfolgt automatisch. Ablaufdatum - Ablaufzeit + Ablaufzeitpunkt Falls aktiviert, verfällt der Zugriff auf diesen Send zur angegebenen Datum und Uhrzeit. @@ -2080,7 +2081,7 @@ Das Scannen erfolgt automatisch. Master-Passwort bestätigen - Diese Aktion ist geschützt. Um fortzufahren, gib bitte dein Master-Passwort erneut ein, um deine Identität zu bestätigen. + Diese Aktion ist geschützt. Um fortzufahren, gib bitte dein Master-Passwort erneut ein, um deine Identität zu verifizieren. Captcha erforderlich @@ -2095,7 +2096,7 @@ Das Scannen erfolgt automatisch. Master-Passwort aktualisieren - Dein Master-Passwort wurde kürzlich von einem Administrator Deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst Du Dein Master-Passwort jetzt aktualisieren. Wenn Du fortfährst, wirst Du aus der aktuellen Sitzung abgemeldet und wirst Dich erneut anmelden müssen. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben. + Dein Master-Passwort wurde kürzlich von einem Administrator deiner Organisation geändert. Um auf den Tresor zuzugreifen, musst du dein Master-Passwort jetzt aktualisieren. Wenn Du fortfährst, wirst du aus der aktuellen Sitzung abgemeldet und eine erneute Anmeldung ist erforderlich. Aktive Sitzungen auf anderen Geräten können bis zu einer Stunde weiterhin aktiv bleiben. Passwort wird aktualisiert @@ -2122,13 +2123,13 @@ Das Scannen erfolgt automatisch. FIDO2 WebAuthn - Um fortzufahren, halte deinen FIDO2 WebAuthn kompatiblen Sicherheitsschlüssel bereit und folge dann den Anweisungen, nachdem du auf der nächsten Seite auf 'Authentifiziere WebAuthn' geklickt hast. + Um fortzufahren, halte deinen FIDO2 WebAuthn-kompatiblen Sicherheitsschlüssel bereit und folge dann den Anweisungen, nachdem du auf der nächsten Seite auf 'WebAuthn authentifizieren' geklickt hast. Authentifizierung mit FIDO2 WebAuthn. Du kannst dich mit einem externen Sicherheitsschlüssel authentifizieren. - Authentifiziere WebAuthn + WebAuthn authentifizieren Zurück zur App @@ -2137,7 +2138,7 @@ Das Scannen erfolgt automatisch. Bitte stelle sicher, dass dein Standardbrowser WebAuthn unterstützt und versuche es erneut. - Diese Organisation hat eine Unternehmensrichtlinie, die dich automatisch für die Passwort Zurücksetzung registriert. Die Registrierung wird es Administratoren der Organisation erlauben, dein Master-Passwort zu ändern. + Diese Organisation hat eine Unternehmensrichtlinie, die dich automatisch für die Passwortzurücksetzung registriert. Die Registrierung wird es Administratoren der Organisation erlauben, dein Master-Passwort zu ändern. Deine Organisationsrichtlinien haben Auswirkungen auf dein Tresor-Timeout. Das maximal zulässige Tresor-Timeout beträgt {0} Stunde(n) und {1} Minute(n) @@ -2182,7 +2183,7 @@ Das Scannen erfolgt automatisch. Dein Konto und alle damit verbundenen Daten werden gelöscht und sind nicht wiederherstellbar. Bist du sicher, dass du fortfahren möchtest? - Löschung deines Kontos + Dein Konto wird gelöscht Dein Konto wurde unwiderruflich gelöscht @@ -2197,16 +2198,16 @@ Das Scannen erfolgt automatisch. Code senden - Sende + Wird gesendet Send-Link beim Speichern kopieren - Sende Code + Code wird gesendet - Überprüfen + Wird verifiziert Code erneut senden @@ -2218,7 +2219,7 @@ Das Scannen erfolgt automatisch. Beim Senden des Bestätigungscodes an deine E-Mail-Adresse ist ein Fehler aufgetreten. Bitte versuche es erneut - Gib den Bestätigungscode ein, der an deine E-Mail-Adresse gesendet wurde + Gib den Verifizierungscode ein, der an deine E-Mail-Adresse gesendet wurde Absturzprotokolle senden @@ -2227,10 +2228,10 @@ Das Scannen erfolgt automatisch. Hilf Bitwarden die Stabilität der App zu verbessern, indem du Absturzberichte sendest. - Optionen sind ausgeklappt, tippen zum einklappen. + Optionen sind ausgeklappt, tippen zum Einklappen. - Optionen sind eingeklappt, tippe zum ausklappen. + Optionen sind eingeklappt, tippe zum Ausklappen. Großbuchstaben (A bis Z) @@ -2284,7 +2285,7 @@ Das Scannen erfolgt automatisch. QR Code scannen - QR Code kann nicht gescannt werden? + QR-Code kann nicht gescannt werden? Authentifizierungsschlüssel @@ -2323,7 +2324,7 @@ Das Scannen erfolgt automatisch. Versuchst du dich anzumelden? - Anmeldeversuch von {0} am {1} + Anmeldeversuch von {0} auf {1} Gerätetyp @@ -2338,10 +2339,10 @@ Das Scannen erfolgt automatisch. Nahe - Anmeldung bestätigen + Anmeldung genehmigen - Anmeldung verweigern + Anmeldung ablehnen Gerade eben @@ -2350,10 +2351,10 @@ Das Scannen erfolgt automatisch. vor {0} Minuten - Anmeldung bestätigt + Anmeldung genehmigt - Anmeldung verweigert + Anmeldung abgelehnt Anmeldeanfragen genehmigen @@ -2368,7 +2369,7 @@ Das Scannen erfolgt automatisch. Push-Benachrichtigungen für neue Anmeldeanfragen erhalten - Nein, danke + Nein danke Anmeldeversuch für {0} bestätigen @@ -2401,7 +2402,7 @@ Das Scannen erfolgt automatisch. E-Mail (erforderlich) - Domain-Name (erforderlich) + Domainname (erforderlich) API-Schlüssel (erforderlich) @@ -2430,13 +2431,13 @@ Das Scannen erfolgt automatisch. "Fastmail" is the product name and should not be translated. - API-Zugangs-Token + API-Zugriffstoken Bist Du sicher, dass Du den aktuellen Benutzernamen überschreiben möchtest? - Benutzernamen generieren + Benutzername generieren E-Mail-Typ @@ -2516,7 +2517,7 @@ Möchtest du zu diesem Konto wechseln? Brauchst du eine andere Option? - Alle Anmelde-Optionen anzeigen + Alle Anmeldeoptionen anzeigen Diese Anfrage ist nicht mehr gültig @@ -2588,6 +2589,18 @@ Möchtest du zu diesem Konto wechseln? Schwaches Passwort erkannt und in einem Datendiebstahl gefunden. Verwende ein starkes und einzigartiges Passwort, um dein Konto zu schützen. Bist du sicher, dass du dieses Passwort verwenden möchtest? - SSO-Kennung der Organisation erforderlich. + SSO-ID der Organisation erforderlich. + + + Schlüssel zu einem bestehenden oder neuen Eintrag hinzufügen + + + Es gibt keine Einträge in deinem Tresor, die mit "{0}" übereinstimmen + + + Nach einem Eintrag suchen oder einen neuen Eintrag hinzufügen + + + Es gibt keine Einträge, die mit der Suche übereinstimmen diff --git a/src/App/Resources/AppResources.el.resx b/src/App/Resources/AppResources.el.resx index ec3f3af01..6a06ff4e6 100644 --- a/src/App/Resources/AppResources.el.resx +++ b/src/App/Resources/AppResources.el.resx @@ -2591,4 +2591,16 @@ Απαιτείται αναγνωριστικό οργανισμού SSO. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.en-GB.resx b/src/App/Resources/AppResources.en-GB.resx index 17f79056a..92809e1bf 100644 --- a/src/App/Resources/AppResources.en-GB.resx +++ b/src/App/Resources/AppResources.en-GB.resx @@ -2591,4 +2591,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.en-IN.resx b/src/App/Resources/AppResources.en-IN.resx index d27712947..5b0de1a66 100644 --- a/src/App/Resources/AppResources.en-IN.resx +++ b/src/App/Resources/AppResources.en-IN.resx @@ -2605,4 +2605,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.es.resx b/src/App/Resources/AppResources.es.resx index 0f2b44c35..19e49399d 100644 --- a/src/App/Resources/AppResources.es.resx +++ b/src/App/Resources/AppResources.es.resx @@ -2592,4 +2592,16 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Se requiere un inicio de sesión único de la organización. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.et.resx b/src/App/Resources/AppResources.et.resx index d303fabfe..43bea8edf 100644 --- a/src/App/Resources/AppResources.et.resx +++ b/src/App/Resources/AppResources.et.resx @@ -2591,4 +2591,16 @@ Soovid selle konto peale lülituda? Nõutud on organisatsiooni SSO identifikaator. + + Lisa võti olemasolevale või uuele kirjele + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.eu.resx b/src/App/Resources/AppResources.eu.resx index f06b66fb0..9da95e0ac 100644 --- a/src/App/Resources/AppResources.eu.resx +++ b/src/App/Resources/AppResources.eu.resx @@ -2590,4 +2590,16 @@ Kontu honetara aldatu nahi duzu? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.fa.resx b/src/App/Resources/AppResources.fa.resx index dc7fce352..f56466f5e 100644 --- a/src/App/Resources/AppResources.fa.resx +++ b/src/App/Resources/AppResources.fa.resx @@ -2592,4 +2592,16 @@ شناسه سازمان SSO مورد نیاز است. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.fi.resx b/src/App/Resources/AppResources.fi.resx index 5a1ad1e11..9ef8bd3e8 100644 --- a/src/App/Resources/AppResources.fi.resx +++ b/src/App/Resources/AppResources.fi.resx @@ -2592,4 +2592,16 @@ Haluatko vaihtaa tähän tiliin? Organisaation SSO-tunniste tarvitaan. + + Lisää avain olemassa olevaan tai uuteen kohteeseen + + + Holvissasi ei ole kohteita osoitteelle "{0}" + + + Etsi kohdetta tai lisää uusi kohde + + + Hakua vastaavia kohteita ei ole + diff --git a/src/App/Resources/AppResources.fil.resx b/src/App/Resources/AppResources.fil.resx index 5dbc525a5..0377b26be 100644 --- a/src/App/Resources/AppResources.fil.resx +++ b/src/App/Resources/AppResources.fil.resx @@ -2592,4 +2592,16 @@ Gusto mo bang pumunta sa account na ito? Kinakailangan ang Organization SSO identifier. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.fr.resx b/src/App/Resources/AppResources.fr.resx index 55abeb308..5491a74a3 100644 --- a/src/App/Resources/AppResources.fr.resx +++ b/src/App/Resources/AppResources.fr.resx @@ -2591,4 +2591,16 @@ Voulez-vous basculer vers ce compte ? Identifiant SSO de l'organisation requis. + + Ajouter la clé à un élément existant ou nouveau + + + Il n'y a pas d'éléments dans votre coffre qui correspondent à "{0}" + + + Rechercher un élément ou ajouter un nouvel élément + + + Il n'y a pas d'éléments qui correspondent à la recherche + diff --git a/src/App/Resources/AppResources.gl.resx b/src/App/Resources/AppResources.gl.resx index 7d8d9cba9..6430f8a85 100644 --- a/src/App/Resources/AppResources.gl.resx +++ b/src/App/Resources/AppResources.gl.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.he.resx b/src/App/Resources/AppResources.he.resx index b2d252fda..c184f1571 100644 --- a/src/App/Resources/AppResources.he.resx +++ b/src/App/Resources/AppResources.he.resx @@ -2594,4 +2594,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.hi.resx b/src/App/Resources/AppResources.hi.resx index 41afa18ab..76c93fe78 100644 --- a/src/App/Resources/AppResources.hi.resx +++ b/src/App/Resources/AppResources.hi.resx @@ -2593,4 +2593,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.hr.resx b/src/App/Resources/AppResources.hr.resx index 2b678f532..89d5f2c33 100644 --- a/src/App/Resources/AppResources.hr.resx +++ b/src/App/Resources/AppResources.hr.resx @@ -2589,4 +2589,16 @@ Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.hu.resx b/src/App/Resources/AppResources.hu.resx index 9c44a73b4..8b9f63c9b 100644 --- a/src/App/Resources/AppResources.hu.resx +++ b/src/App/Resources/AppResources.hu.resx @@ -2590,4 +2590,16 @@ Szeretnénk átváltani erre a fiókra? A szervezeti SSO azonosító megadása szükséges. + + Adjuk hozzá a kulcsot egy meglévő vagy új elemhez. + + + Nincs elem a széfben {0} egyezéssel. + + + Keressünk egy elemet vagy adjunk hozzá új elemet. + + + Nincsenek a keresésnek megfelelő elemek. + diff --git a/src/App/Resources/AppResources.id.resx b/src/App/Resources/AppResources.id.resx index 1b2484c69..a622f1dc8 100644 --- a/src/App/Resources/AppResources.id.resx +++ b/src/App/Resources/AppResources.id.resx @@ -2591,4 +2591,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.it.resx b/src/App/Resources/AppResources.it.resx index 6d3bf1a91..e4c1b857b 100644 --- a/src/App/Resources/AppResources.it.resx +++ b/src/App/Resources/AppResources.it.resx @@ -2541,16 +2541,16 @@ Vuoi passare a questo account? Abilita i permessi della fotocamera per usare lo scanner - Language + Lingua - The language has been changed to {0}. Please restart the app to see the change + La lingua è stata cambiata a {0}. Riavviare l'app per applicare la modifica - Language change requires app restart + La modifica della lingua richiede il riavvio dell'app - Default (System) + Predefinito (Sistema) Importante @@ -2591,4 +2591,16 @@ Vuoi passare a questo account? L'identificatore SSO dell'organizzazione è necessario. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ja.resx b/src/App/Resources/AppResources.ja.resx index 652479429..e40b80f40 100644 --- a/src/App/Resources/AppResources.ja.resx +++ b/src/App/Resources/AppResources.ja.resx @@ -2591,4 +2591,16 @@ 組織の SSO IDが必要です。 + + 既存または新規アイテムにキーを追加 + + + "{0}" に一致するアイテムは保管庫にありません + + + アイテムを検索するか、新しいアイテムを追加 + + + 検索に一致するアイテムはありません + diff --git a/src/App/Resources/AppResources.ka.resx b/src/App/Resources/AppResources.ka.resx index 7d8d9cba9..6430f8a85 100644 --- a/src/App/Resources/AppResources.ka.resx +++ b/src/App/Resources/AppResources.ka.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.kn.resx b/src/App/Resources/AppResources.kn.resx index cf8549f1c..13240f187 100644 --- a/src/App/Resources/AppResources.kn.resx +++ b/src/App/Resources/AppResources.kn.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ko.resx b/src/App/Resources/AppResources.ko.resx index c44c09680..bec291dba 100644 --- a/src/App/Resources/AppResources.ko.resx +++ b/src/App/Resources/AppResources.ko.resx @@ -2591,4 +2591,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.lt.resx b/src/App/Resources/AppResources.lt.resx index 6f1dad75c..94a15ff88 100644 --- a/src/App/Resources/AppResources.lt.resx +++ b/src/App/Resources/AppResources.lt.resx @@ -2542,7 +2542,7 @@ Ar norite pereiti prie šios paskyros? Įgalinkite fotoaparato leidimą naudoti skaitytuvą - Language + Kalba The language has been changed to {0}. Please restart the app to see the change @@ -2592,4 +2592,16 @@ Ar norite pereiti prie šios paskyros? Būtinas organizacijos SSO identifikatorius. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.lv.resx b/src/App/Resources/AppResources.lv.resx index 818595036..ccfdd6e6d 100644 --- a/src/App/Resources/AppResources.lv.resx +++ b/src/App/Resources/AppResources.lv.resx @@ -2591,4 +2591,16 @@ Vai pārslēgties uz šo kontu? Ir nepieciešams apvienības SSO identifikators. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ml.resx b/src/App/Resources/AppResources.ml.resx index c9349f896..c02dcd706 100644 --- a/src/App/Resources/AppResources.ml.resx +++ b/src/App/Resources/AppResources.ml.resx @@ -2591,4 +2591,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.nb.resx b/src/App/Resources/AppResources.nb.resx index 60393e875..ea31d90d5 100644 --- a/src/App/Resources/AppResources.nb.resx +++ b/src/App/Resources/AppResources.nb.resx @@ -584,7 +584,7 @@ Et hint om hovedpassordet kan hjelpe deg å huske passordet om du skulle glemme det. - Master password must be at least {0} characters long. + Hovedpassordet må være minst {0} tegn. Minst antall siffer @@ -604,7 +604,7 @@ Aldri - Nytt element opprettet. + Nytt element opprettet Det er ingen favoritter i hvelvet ditt. @@ -2542,16 +2542,16 @@ Vil du bytte til denne kontoen? Aktiver kameratillatelse for å bruke skanner - Language + Språk - The language has been changed to {0}. Please restart the app to see the change + Språket er endret til {0}. Start appen på nytt for å se endringen - Language change requires app restart + Språkendring krever omstart av appen - Default (System) + Standard (System) Viktig @@ -2590,6 +2590,18 @@ Vil du bytte til denne kontoen? Svakt passord identifisert og funnet i et databrudd. Bruk et sterkt og unikt passord for å beskytte kontoen din. Er du sikker på at du vil bruke dette passordet? - Organization SSO identifier required. + Organisasjon SSO identifikator kreves. + + + Legg nøkkelen til et eksisterende eller nytt element + + + Det er ingen elementer i hvelvet ditt som samsvarer med "{0}" + + + Søk etter et element eller legg til et nytt element + + + Det er ingen elementer som samsvarer med søket diff --git a/src/App/Resources/AppResources.ne.resx b/src/App/Resources/AppResources.ne.resx index 7d8d9cba9..6430f8a85 100644 --- a/src/App/Resources/AppResources.ne.resx +++ b/src/App/Resources/AppResources.ne.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.nl.resx b/src/App/Resources/AppResources.nl.resx index 07ef69f53..21f86a51a 100644 --- a/src/App/Resources/AppResources.nl.resx +++ b/src/App/Resources/AppResources.nl.resx @@ -2591,4 +2591,16 @@ Wilt u naar dit account wisselen? Organisatie-identificatie vereist. + + De sleutel aan een bestaand of nieuw item toevoegen + + + Er zijn geen items in je kluis die overeenkomen met "{0}" + + + Naar een item zoeken of een nieuw item toevoegen + + + Er zijn geen items die overeenkomen met de zoekopdracht + diff --git a/src/App/Resources/AppResources.nn.resx b/src/App/Resources/AppResources.nn.resx index 1baf72bf1..aaca774be 100644 --- a/src/App/Resources/AppResources.nn.resx +++ b/src/App/Resources/AppResources.nn.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.pl.resx b/src/App/Resources/AppResources.pl.resx index 4d22b086c..f0390faa1 100644 --- a/src/App/Resources/AppResources.pl.resx +++ b/src/App/Resources/AppResources.pl.resx @@ -2591,4 +2591,16 @@ Czy chcesz przełączyć się na to konto? Identyfikator organizacji jest wymagany. + + Dodaj klucz do istniejącego lub nowego elementu + + + W Twoim sejfie nie ma żadnych elementów, które pasują do "{0}" + + + Wyszukaj element lub dodaj nowy + + + Brak elementów, które pasują do wyszukiwania + diff --git a/src/App/Resources/AppResources.pt-BR.resx b/src/App/Resources/AppResources.pt-BR.resx index 9307df4b3..7c93be82f 100644 --- a/src/App/Resources/AppResources.pt-BR.resx +++ b/src/App/Resources/AppResources.pt-BR.resx @@ -2592,4 +2592,16 @@ Você deseja mudar para esta conta? Identificador SSO da organização necessário. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.pt-PT.resx b/src/App/Resources/AppResources.pt-PT.resx index 5505ecb8c..1b1f5d45c 100644 --- a/src/App/Resources/AppResources.pt-PT.resx +++ b/src/App/Resources/AppResources.pt-PT.resx @@ -2591,4 +2591,16 @@ Deseja mudar para esta conta? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ro.resx b/src/App/Resources/AppResources.ro.resx index da093e89c..19da9a150 100644 --- a/src/App/Resources/AppResources.ro.resx +++ b/src/App/Resources/AppResources.ro.resx @@ -2591,4 +2591,16 @@ Doriți să comutați la acest cont? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ru.resx b/src/App/Resources/AppResources.ru.resx index 1a2023a80..68e187e34 100644 --- a/src/App/Resources/AppResources.ru.resx +++ b/src/App/Resources/AppResources.ru.resx @@ -2591,4 +2591,16 @@ Требуется идентификатор SSO организации. + + Добавить ключ к существующему или новому элементу + + + В вашем хранилище нет элементов, соответствующих "{0}" + + + Поиск или добавление нового элемента + + + Нет элементов, соответствующих запросу + diff --git a/src/App/Resources/AppResources.si.resx b/src/App/Resources/AppResources.si.resx index 93df9d3df..1ab41a637 100644 --- a/src/App/Resources/AppResources.si.resx +++ b/src/App/Resources/AppResources.si.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.sk.resx b/src/App/Resources/AppResources.sk.resx index c26ba1258..df6d155b4 100644 --- a/src/App/Resources/AppResources.sk.resx +++ b/src/App/Resources/AppResources.sk.resx @@ -2591,4 +2591,16 @@ Chcete prepnúť na toto konto? Pole identifikátora SSO je povinné. + + Pridať kľúč k existujúcej alebo novej položke + + + Vo vašom trezore nie sú žiadne položky, ktoré zodpovedajú "{0}" + + + Vyhľadať položku alebo pridať novú položku + + + Vyhľadávaniu nezodpovedajú žiadne položky + diff --git a/src/App/Resources/AppResources.sl.resx b/src/App/Resources/AppResources.sl.resx index a50854331..536caf5bd 100644 --- a/src/App/Resources/AppResources.sl.resx +++ b/src/App/Resources/AppResources.sl.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.sr.resx b/src/App/Resources/AppResources.sr.resx index cf2441268..0c40eddf2 100644 --- a/src/App/Resources/AppResources.sr.resx +++ b/src/App/Resources/AppResources.sr.resx @@ -2593,4 +2593,16 @@ Потребан је SSO идентификатор организације. + + Додајте кључ постојећој или новој ставци + + + У вашем сефу нема ставке за "{0}" + + + Потражите ставку или додајте нову + + + Нема ставки које одговарају претрази + diff --git a/src/App/Resources/AppResources.sv.resx b/src/App/Resources/AppResources.sv.resx index 09cb837c5..9771afa0e 100644 --- a/src/App/Resources/AppResources.sv.resx +++ b/src/App/Resources/AppResources.sv.resx @@ -2593,4 +2593,16 @@ Vill du byta till detta konto? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.ta.resx b/src/App/Resources/AppResources.ta.resx index ea78b57c4..adbc15310 100644 --- a/src/App/Resources/AppResources.ta.resx +++ b/src/App/Resources/AppResources.ta.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.te.resx b/src/App/Resources/AppResources.te.resx index 7d8d9cba9..6430f8a85 100644 --- a/src/App/Resources/AppResources.te.resx +++ b/src/App/Resources/AppResources.te.resx @@ -2592,4 +2592,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.th.resx b/src/App/Resources/AppResources.th.resx index 8be5adcb0..37e38182e 100644 --- a/src/App/Resources/AppResources.th.resx +++ b/src/App/Resources/AppResources.th.resx @@ -2599,4 +2599,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.tr.resx b/src/App/Resources/AppResources.tr.resx index cc59bb0ad..0150ba9f2 100644 --- a/src/App/Resources/AppResources.tr.resx +++ b/src/App/Resources/AppResources.tr.resx @@ -2498,7 +2498,7 @@ Bu hesaba geçmek ister misiniz? Ana parola ile giriş yap - Başka bir cihazla giriş yap + Cihazla giriş yap Giriş başlatıldı @@ -2522,13 +2522,13 @@ Bu hesaba geçmek ister misiniz? Bu istek artık geçerli değil - Bekleyen oturum açma istekleri + Bekleyen giriş istekleri Tüm istekleri reddet - Bekleyen tüm oturum açma isteklerini reddetmek istediğinizden emin misiniz? + Bekleyen tüm giriş isteklerini reddetmek istediğinizden emin misiniz? İstekler reddedildi @@ -2590,4 +2590,16 @@ Bu hesaba geçmek ister misiniz? Kuruluş SSO tanımlayıcısı gereklidir. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.uk.resx b/src/App/Resources/AppResources.uk.resx index ea9715bf0..c2f88feb1 100644 --- a/src/App/Resources/AppResources.uk.resx +++ b/src/App/Resources/AppResources.uk.resx @@ -2591,4 +2591,16 @@ Потрібен SSO-ідентифікатор організації. + + Додати ключ до наявного чи нового запису + + + У вашому сховищі немає записів, які відповідають "{0}" + + + Шукати запис або додати новий запис + + + Немає записів, що відповідають пошуку + diff --git a/src/App/Resources/AppResources.vi.resx b/src/App/Resources/AppResources.vi.resx index b8c262780..d69b4a4e6 100644 --- a/src/App/Resources/AppResources.vi.resx +++ b/src/App/Resources/AppResources.vi.resx @@ -2591,4 +2591,16 @@ Do you want to switch to this account? Organization SSO identifier required. + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.zh-Hans.resx b/src/App/Resources/AppResources.zh-Hans.resx index e4d03f5d5..3fa677049 100644 --- a/src/App/Resources/AppResources.zh-Hans.resx +++ b/src/App/Resources/AppResources.zh-Hans.resx @@ -2523,7 +2523,7 @@ 请求已失效 - Pending login requests + 待定登录请求 拒绝所有请求 @@ -2535,7 +2535,7 @@ 请求被拒绝 - No pending requests + 无待处理请求 启用相机权限以使用扫描器 @@ -2556,39 +2556,51 @@ 重要事项: - Your master password cannot be recovered if you forget it! {0} characters minimum. + 主密码忘记后,将无法恢复!密码不能少于{0}个字符 - Weak Master Password + 脆弱的主密码 Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password? - Weak + - Good + 良好 - Strong + - Check known data breaches for this password + 检查已知的数据泄露是否包含此密码 - Exposed Master Password + 已暴露的主密码 - Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password? + 一起数据泄露中存在该密码。使用独特的密码有助保护您的账户。确定要使用曾经暴露的密码吗? - Weak and Exposed Master Password + 主密码弱且曾经暴露 - Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password? + 密码太弱并出现在数据泄露。使用强悍且独特的密码有助保护您的账户。确定继续使用当前密码吗? 必须填写组织 SSO 标识符。 + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + diff --git a/src/App/Resources/AppResources.zh-Hant.resx b/src/App/Resources/AppResources.zh-Hant.resx index 2a2b1dfe4..46e3ec2d2 100644 --- a/src/App/Resources/AppResources.zh-Hant.resx +++ b/src/App/Resources/AppResources.zh-Hant.resx @@ -2591,4 +2591,16 @@ 需要單一登入 (SSO) 組織識別碼。 + + Add the key to an existing or new item + + + There are no items in your vault that match "{0}" + + + Search for an item or add a new item + + + There are no items that match the search + From ad9ca125a09447470255eaa860e8eaa0908d2000 Mon Sep 17 00:00:00 2001 From: larena1 <60823161+larena1@users.noreply.github.com> Date: Fri, 10 Mar 2023 11:39:20 +0100 Subject: [PATCH 04/10] [PS-2486] Finally stop filling password into username field (#2367) * Finally stop filling password into username field The logic in #2331 is unfortunately not very reliable as it'll only detect fields that have one of "email", "phone" or "username" in their id as username fields. This commit ensures that additonally fields that have TextVariationWebEmailAddress are also detected as username fields. * Add TextVariationEmailAddress * Remove --------- Co-authored-by: aj-rosado <109146700+aj-rosado@users.noreply.github.com> --- src/Android/Autofill/FieldCollection.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Android/Autofill/FieldCollection.cs b/src/Android/Autofill/FieldCollection.cs index 8b29ab8e3..a01aaad70 100644 --- a/src/Android/Autofill/FieldCollection.cs +++ b/src/Android/Autofill/FieldCollection.cs @@ -102,7 +102,7 @@ namespace Bit.Droid.Autofill if (!_usernameFields.Any()) { - _usernameFields = Fields.Where(f => FieldHasUsernameTerms(f)).ToList(); + _usernameFields = Fields.Where(f => FieldIsUsername(f)).ToList(); } } return _usernameFields; @@ -327,13 +327,18 @@ namespace Bit.Droid.Autofill } return inputTypePassword && !ValueContainsAnyTerms(f.IdEntry, _ignoreSearchTerms) && - !ValueContainsAnyTerms(f.Hint, _ignoreSearchTerms) && !FieldHasUsernameTerms(f); + !ValueContainsAnyTerms(f.Hint, _ignoreSearchTerms) && !FieldIsUsername(f); } private bool FieldHasPasswordTerms(Field f) { return ValueContainsAnyTerms(f.IdEntry, _passwordTerms) || ValueContainsAnyTerms(f.Hint, _passwordTerms); } + + private bool FieldIsUsername(Field f) + { + return f.InputType.HasFlag(InputTypes.TextVariationWebEmailAddress) || FieldHasUsernameTerms(f); + } private bool FieldHasUsernameTerms(Field f) { @@ -350,4 +355,4 @@ namespace Bit.Droid.Autofill return terms.Any(t => lowerValue.Contains(t)); } } -} \ No newline at end of file +} From dcb585455714623e99a36390ac45aba28aaacd45 Mon Sep 17 00:00:00 2001 From: Jake Fink Date: Fri, 10 Mar 2023 12:55:48 -0500 Subject: [PATCH 05/10] [EC-1045] add vault timeout action to policy (#2372) * [EC-1045] lock action if policy and show message * [EC-1045] add text for policy message * [EC-1045] add consts to policy service * [EC-1045] missed a const * [AC-1045] fix build --- .../SettingsPage/SettingsPageViewModel.cs | 46 +++++++++++++++---- src/App/Resources/AppResources.Designer.cs | 20 +++++++- src/App/Resources/AppResources.resx | 8 +++- src/Core/Abstractions/IPolicyService.cs | 1 + src/Core/Services/PolicyService.cs | 22 ++++----- src/Core/Services/VaultTimeoutService.cs | 2 +- 6 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs index 2845401bf..7f27993ef 100644 --- a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs +++ b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs @@ -120,7 +120,7 @@ namespace Bit.App.Pages if (await _policyService.PolicyAppliesToUser(PolicyType.MaximumVaultTimeout)) { _vaultTimeoutPolicy = (await _policyService.GetAll(PolicyType.MaximumVaultTimeout)).First(); - var minutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes").GetValueOrDefault(); + var minutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES).GetValueOrDefault(); _vaultTimeouts = _vaultTimeouts.Where(t => t.Value <= minutes && (t.Value > 0 || t.Value == CustomVaultTimeoutValue) && @@ -295,7 +295,7 @@ namespace Bit.App.Pages if (_vaultTimeoutPolicy != null) { - var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes"); + var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES); if (newTimeout > maximumTimeout) { @@ -374,6 +374,10 @@ namespace Bit.App.Pages public async Task VaultTimeoutActionAsync() { + if (!string.IsNullOrEmpty(_policyService.GetPolicyString(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_ACTION))) + { + return; + } var options = _vaultTimeoutActions.Select(o => o.Key == _vaultTimeoutActionDisplayValue ? $"✓ {o.Key}" : o.Key).ToArray(); var selection = await Page.DisplayActionSheet(AppResources.VaultTimeoutAction, @@ -597,14 +601,38 @@ namespace Bit.App.Pages } if (_vaultTimeoutPolicy != null) { - var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes").GetValueOrDefault(); - securityItems.Insert(0, new SettingsPageListItem + var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES).GetValueOrDefault(); + var timeoutAction = _policyService.GetPolicyString(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_ACTION); + if (maximumTimeout != default && timeoutAction != default) { - Name = string.Format(AppResources.VaultTimeoutPolicyInEffect, - Math.Floor((float)maximumTimeout / 60), - maximumTimeout % 60), - UseFrame = true, - }); + securityItems.Insert(0, new SettingsPageListItem + { + Name = string.Format(AppResources.VaultTimeoutPolicyWithActionInEffect, + Math.Floor((float)maximumTimeout / 60), + maximumTimeout % 60, + timeoutAction == PolicyService.TIMEOUT_POLICY_ACTION_LOCK ? AppResources.Lock : AppResources.LogOut), + UseFrame = true, + }); + } + else if (maximumTimeout != default && timeoutAction == default) + { + securityItems.Insert(0, new SettingsPageListItem + { + Name = string.Format(AppResources.VaultTimeoutPolicyInEffect, + Math.Floor((float)maximumTimeout / 60), + maximumTimeout % 60), + UseFrame = true, + }); + } + else if (maximumTimeout == default && timeoutAction != default) + { + securityItems.Insert(0, new SettingsPageListItem + { + Name = string.Format(AppResources.VaultTimeoutActionPolicyInEffect, + timeoutAction == PolicyService.TIMEOUT_POLICY_ACTION_LOCK ? AppResources.Lock : AppResources.LogOut), + UseFrame = true, + }); + } } if (Device.RuntimePlatform == Device.Android) { diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index 16763104f..243501dac 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -6677,6 +6677,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Your organization policies have set your vault timeout action to {0}.. + /// + public static string VaultTimeoutActionPolicyInEffect { + get { + return ResourceManager.GetString("VaultTimeoutActionPolicyInEffect", resourceCulture); + } + } + /// /// Looks up a localized string similar to Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?. /// @@ -6687,7 +6696,7 @@ namespace Bit.App.Resources { } /// - /// Looks up a localized string similar to Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). + /// Looks up a localized string similar to Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s).. /// public static string VaultTimeoutPolicyInEffect { get { @@ -6695,6 +6704,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.. + /// + public static string VaultTimeoutPolicyWithActionInEffect { + get { + return ResourceManager.GetString("VaultTimeoutPolicyWithActionInEffect", resourceCulture); + } + } + /// /// Looks up a localized string similar to Your vault timeout exceeds the restrictions set by your organization.. /// diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 61742c5f6..d7b15ae3f 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -2141,7 +2141,13 @@ Scanning will happen automatically. This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password. - Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s) + Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s). + + + Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}. + + + Your organization policies have set your vault timeout action to {0}. Your vault timeout exceeds the restrictions set by your organization. diff --git a/src/Core/Abstractions/IPolicyService.cs b/src/Core/Abstractions/IPolicyService.cs index caabeca3d..8acca2c9a 100644 --- a/src/Core/Abstractions/IPolicyService.cs +++ b/src/Core/Abstractions/IPolicyService.cs @@ -20,6 +20,7 @@ namespace Bit.Core.Abstractions string orgId); Task PolicyAppliesToUser(PolicyType policyType, Func policyFilter = null, string userId = null); int? GetPolicyInt(Policy policy, string key); + string GetPolicyString(Policy policy, string key); Task ShouldShowVaultFilterAsync(); } } diff --git a/src/Core/Services/PolicyService.cs b/src/Core/Services/PolicyService.cs index c7b374643..448cd1112 100644 --- a/src/Core/Services/PolicyService.cs +++ b/src/Core/Services/PolicyService.cs @@ -17,6 +17,11 @@ namespace Bit.Core.Services private IEnumerable _policyCache; + public const string TIMEOUT_POLICY_MINUTES = "minutes"; + public const string TIMEOUT_POLICY_ACTION = "action"; + public const string TIMEOUT_POLICY_ACTION_LOCK = "lock"; + public const string TIMEOUT_POLICY_ACTION_LOGOUT = "logOut"; + public PolicyService( IStateService stateService, IOrganizationService organizationService) @@ -247,6 +252,10 @@ namespace Bit.Core.Services return null; } + public string GetPolicyString(Policy policy, string key) => + policy.Data.TryGetValue(key, out var val) ? val as string : null; + + public async Task ShouldShowVaultFilterAsync() { var personalOwnershipPolicyApplies = await PolicyAppliesToUser(PolicyType.PersonalOwnership); @@ -272,17 +281,6 @@ namespace Bit.Core.Services return null; } - private string GetPolicyString(Policy policy, string key) - { - if (policy.Data.ContainsKey(key)) - { - var value = policy.Data[key]; - if (value != null) - { - return (string)value; - } - } - return null; - } + } } diff --git a/src/Core/Services/VaultTimeoutService.cs b/src/Core/Services/VaultTimeoutService.cs index 43adc7866..2cef20fc4 100644 --- a/src/Core/Services/VaultTimeoutService.cs +++ b/src/Core/Services/VaultTimeoutService.cs @@ -247,7 +247,7 @@ namespace Bit.Core.Services { var policy = (await _policyService.GetAll(PolicyType.MaximumVaultTimeout, userId)).First(); // Remove negative values, and ensure it's smaller than maximum allowed value according to policy - var policyTimeout = _policyService.GetPolicyInt(policy, "minutes"); + var policyTimeout = _policyService.GetPolicyInt(policy, PolicyService.TIMEOUT_POLICY_MINUTES); if (!policyTimeout.HasValue) { return vaultTimeout; From 839aa9134c1064e5aed56e184333a4620bd2bcc9 Mon Sep 17 00:00:00 2001 From: Jake Fink Date: Fri, 10 Mar 2023 13:02:41 -0500 Subject: [PATCH 06/10] Revert "[EC-1045] add vault timeout action to policy (#2372)" (#2414) This reverts commit dcb585455714623e99a36390ac45aba28aaacd45. --- .../SettingsPage/SettingsPageViewModel.cs | 46 ++++--------------- src/App/Resources/AppResources.Designer.cs | 20 +------- src/App/Resources/AppResources.resx | 8 +--- src/Core/Abstractions/IPolicyService.cs | 1 - src/Core/Services/PolicyService.cs | 22 +++++---- src/Core/Services/VaultTimeoutService.cs | 2 +- 6 files changed, 24 insertions(+), 75 deletions(-) diff --git a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs index 7f27993ef..2845401bf 100644 --- a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs +++ b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs @@ -120,7 +120,7 @@ namespace Bit.App.Pages if (await _policyService.PolicyAppliesToUser(PolicyType.MaximumVaultTimeout)) { _vaultTimeoutPolicy = (await _policyService.GetAll(PolicyType.MaximumVaultTimeout)).First(); - var minutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES).GetValueOrDefault(); + var minutes = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes").GetValueOrDefault(); _vaultTimeouts = _vaultTimeouts.Where(t => t.Value <= minutes && (t.Value > 0 || t.Value == CustomVaultTimeoutValue) && @@ -295,7 +295,7 @@ namespace Bit.App.Pages if (_vaultTimeoutPolicy != null) { - var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES); + var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes"); if (newTimeout > maximumTimeout) { @@ -374,10 +374,6 @@ namespace Bit.App.Pages public async Task VaultTimeoutActionAsync() { - if (!string.IsNullOrEmpty(_policyService.GetPolicyString(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_ACTION))) - { - return; - } var options = _vaultTimeoutActions.Select(o => o.Key == _vaultTimeoutActionDisplayValue ? $"✓ {o.Key}" : o.Key).ToArray(); var selection = await Page.DisplayActionSheet(AppResources.VaultTimeoutAction, @@ -601,38 +597,14 @@ namespace Bit.App.Pages } if (_vaultTimeoutPolicy != null) { - var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_MINUTES).GetValueOrDefault(); - var timeoutAction = _policyService.GetPolicyString(_vaultTimeoutPolicy, PolicyService.TIMEOUT_POLICY_ACTION); - if (maximumTimeout != default && timeoutAction != default) + var maximumTimeout = _policyService.GetPolicyInt(_vaultTimeoutPolicy, "minutes").GetValueOrDefault(); + securityItems.Insert(0, new SettingsPageListItem { - securityItems.Insert(0, new SettingsPageListItem - { - Name = string.Format(AppResources.VaultTimeoutPolicyWithActionInEffect, - Math.Floor((float)maximumTimeout / 60), - maximumTimeout % 60, - timeoutAction == PolicyService.TIMEOUT_POLICY_ACTION_LOCK ? AppResources.Lock : AppResources.LogOut), - UseFrame = true, - }); - } - else if (maximumTimeout != default && timeoutAction == default) - { - securityItems.Insert(0, new SettingsPageListItem - { - Name = string.Format(AppResources.VaultTimeoutPolicyInEffect, - Math.Floor((float)maximumTimeout / 60), - maximumTimeout % 60), - UseFrame = true, - }); - } - else if (maximumTimeout == default && timeoutAction != default) - { - securityItems.Insert(0, new SettingsPageListItem - { - Name = string.Format(AppResources.VaultTimeoutActionPolicyInEffect, - timeoutAction == PolicyService.TIMEOUT_POLICY_ACTION_LOCK ? AppResources.Lock : AppResources.LogOut), - UseFrame = true, - }); - } + Name = string.Format(AppResources.VaultTimeoutPolicyInEffect, + Math.Floor((float)maximumTimeout / 60), + maximumTimeout % 60), + UseFrame = true, + }); } if (Device.RuntimePlatform == Device.Android) { diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index 243501dac..16763104f 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -6677,15 +6677,6 @@ namespace Bit.App.Resources { } } - /// - /// Looks up a localized string similar to Your organization policies have set your vault timeout action to {0}.. - /// - public static string VaultTimeoutActionPolicyInEffect { - get { - return ResourceManager.GetString("VaultTimeoutActionPolicyInEffect", resourceCulture); - } - } - /// /// Looks up a localized string similar to Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?. /// @@ -6696,7 +6687,7 @@ namespace Bit.App.Resources { } /// - /// Looks up a localized string similar to Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s).. + /// Looks up a localized string similar to Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). /// public static string VaultTimeoutPolicyInEffect { get { @@ -6704,15 +6695,6 @@ namespace Bit.App.Resources { } } - /// - /// Looks up a localized string similar to Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.. - /// - public static string VaultTimeoutPolicyWithActionInEffect { - get { - return ResourceManager.GetString("VaultTimeoutPolicyWithActionInEffect", resourceCulture); - } - } - /// /// Looks up a localized string similar to Your vault timeout exceeds the restrictions set by your organization.. /// diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index d7b15ae3f..61742c5f6 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -2141,13 +2141,7 @@ Scanning will happen automatically. This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password. - Your organization policies have set your maximum allowed vault timeout to {0} hour(s) and {1} minute(s). - - - Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}. - - - Your organization policies have set your vault timeout action to {0}. + Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s) Your vault timeout exceeds the restrictions set by your organization. diff --git a/src/Core/Abstractions/IPolicyService.cs b/src/Core/Abstractions/IPolicyService.cs index 8acca2c9a..caabeca3d 100644 --- a/src/Core/Abstractions/IPolicyService.cs +++ b/src/Core/Abstractions/IPolicyService.cs @@ -20,7 +20,6 @@ namespace Bit.Core.Abstractions string orgId); Task PolicyAppliesToUser(PolicyType policyType, Func policyFilter = null, string userId = null); int? GetPolicyInt(Policy policy, string key); - string GetPolicyString(Policy policy, string key); Task ShouldShowVaultFilterAsync(); } } diff --git a/src/Core/Services/PolicyService.cs b/src/Core/Services/PolicyService.cs index 448cd1112..c7b374643 100644 --- a/src/Core/Services/PolicyService.cs +++ b/src/Core/Services/PolicyService.cs @@ -17,11 +17,6 @@ namespace Bit.Core.Services private IEnumerable _policyCache; - public const string TIMEOUT_POLICY_MINUTES = "minutes"; - public const string TIMEOUT_POLICY_ACTION = "action"; - public const string TIMEOUT_POLICY_ACTION_LOCK = "lock"; - public const string TIMEOUT_POLICY_ACTION_LOGOUT = "logOut"; - public PolicyService( IStateService stateService, IOrganizationService organizationService) @@ -252,10 +247,6 @@ namespace Bit.Core.Services return null; } - public string GetPolicyString(Policy policy, string key) => - policy.Data.TryGetValue(key, out var val) ? val as string : null; - - public async Task ShouldShowVaultFilterAsync() { var personalOwnershipPolicyApplies = await PolicyAppliesToUser(PolicyType.PersonalOwnership); @@ -281,6 +272,17 @@ namespace Bit.Core.Services return null; } - + private string GetPolicyString(Policy policy, string key) + { + if (policy.Data.ContainsKey(key)) + { + var value = policy.Data[key]; + if (value != null) + { + return (string)value; + } + } + return null; + } } } diff --git a/src/Core/Services/VaultTimeoutService.cs b/src/Core/Services/VaultTimeoutService.cs index 2cef20fc4..43adc7866 100644 --- a/src/Core/Services/VaultTimeoutService.cs +++ b/src/Core/Services/VaultTimeoutService.cs @@ -247,7 +247,7 @@ namespace Bit.Core.Services { var policy = (await _policyService.GetAll(PolicyType.MaximumVaultTimeout, userId)).First(); // Remove negative values, and ensure it's smaller than maximum allowed value according to policy - var policyTimeout = _policyService.GetPolicyInt(policy, PolicyService.TIMEOUT_POLICY_MINUTES); + var policyTimeout = _policyService.GetPolicyInt(policy, "minutes"); if (!policyTimeout.HasValue) { return vaultTimeout; From ccd71202de6d99666c1080eceea447ea6b80e6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Mon, 13 Mar 2023 15:39:55 +0000 Subject: [PATCH 07/10] [PM-1078] Login with Device - Change mobile to not get fingerprint from API (#2390) * [PM-1078] Fingerprint phrase gets calculated from pub key on AuthService instead of coming as a property from the api. --- src/App/App.xaml.cs | 2 +- .../LoginPasswordlessRequestViewModel.cs | 2 +- .../LoginPasswordlessRequestsListPage.xaml | 2 +- .../LoginPasswordlessRequestsListViewModel.cs | 2 +- .../Response/PasswordlessLoginResponse.cs | 2 +- src/Core/Services/AuthService.cs | 33 ++++++++++++++++--- 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/App/App.xaml.cs b/src/App/App.xaml.cs index 3cbc4ff52..e10bf85c0 100644 --- a/src/App/App.xaml.cs +++ b/src/App/App.xaml.cs @@ -217,7 +217,7 @@ namespace Bit.App Id = loginRequestData.Id, IpAddress = loginRequestData.RequestIpAddress, Email = await _stateService.GetEmailAsync(), - FingerprintPhrase = loginRequestData.RequestFingerprint, + FingerprintPhrase = loginRequestData.FingerprintPhrase, RequestDate = loginRequestData.CreationDate, DeviceType = loginRequestData.RequestDeviceType, Origin = loginRequestData.Origin diff --git a/src/App/Pages/Accounts/LoginPasswordlessRequestViewModel.cs b/src/App/Pages/Accounts/LoginPasswordlessRequestViewModel.cs index df8fce7dd..efdfe4cd3 100644 --- a/src/App/Pages/Accounts/LoginPasswordlessRequestViewModel.cs +++ b/src/App/Pages/Accounts/LoginPasswordlessRequestViewModel.cs @@ -171,7 +171,7 @@ namespace Bit.App.Pages var response = await _authService.PasswordlessCreateLoginRequestAsync(_email); if (response != null) { - FingerprintPhrase = response.RequestFingerprint; + FingerprintPhrase = response.FingerprintPhrase; _requestId = response.Id; _requestAccessCode = response.RequestAccessCode; _requestKeyPair = response.RequestKeyPair; diff --git a/src/App/Pages/Settings/LoginPasswordlessRequestsListPage.xaml b/src/App/Pages/Settings/LoginPasswordlessRequestsListPage.xaml index 3a170c30a..213127ea1 100644 --- a/src/App/Pages/Settings/LoginPasswordlessRequestsListPage.xaml +++ b/src/App/Pages/Settings/LoginPasswordlessRequestsListPage.xaml @@ -39,7 +39,7 @@ Padding="0, 10, 0 ,0" FontAttributes="Bold"/> > GetPasswordlessLoginRequestsAsync() { - return await _apiService.GetAuthRequestAsync(); + var response = await _apiService.GetAuthRequestAsync(); + return await PopulateFingerprintPhrasesAsync(response); } public async Task> GetActivePasswordlessLoginRequestsAsync() { var requests = await GetPasswordlessLoginRequestsAsync(); - return requests.Where(r => !r.IsAnswered && !r.IsExpired).OrderByDescending(r => r.CreationDate).ToList(); + var activeRequests = requests.Where(r => !r.IsAnswered && !r.IsExpired).OrderByDescending(r => r.CreationDate).ToList(); + return await PopulateFingerprintPhrasesAsync(activeRequests); } public async Task GetPasswordlessLoginRequestByIdAsync(string id) { - return await _apiService.GetAuthRequestAsync(id); + var response = await _apiService.GetAuthRequestAsync(id); + return await PopulateFingerprintPhraseAsync(response, await _stateService.GetEmailAsync()); } public async Task GetPasswordlessLoginResponseAsync(string id, string accessCode) @@ -520,7 +523,8 @@ namespace Bit.Core.Services var encryptedKey = await _cryptoService.RsaEncryptAsync(masterKey.EncKey, publicKey); var encryptedMasterPassword = await _cryptoService.RsaEncryptAsync(Encoding.UTF8.GetBytes(await _stateService.GetKeyHashAsync()), publicKey); var deviceId = await _appIdService.GetAppIdAsync(); - return await _apiService.PutAuthRequestAsync(id, encryptedKey.EncryptedString, encryptedMasterPassword.EncryptedString, deviceId, requestApproved); + var response = await _apiService.PutAuthRequestAsync(id, encryptedKey.EncryptedString, encryptedMasterPassword.EncryptedString, deviceId, requestApproved); + return await PopulateFingerprintPhraseAsync(response, await _stateService.GetEmailAsync()); } public async Task PasswordlessCreateLoginRequestAsync(string email) @@ -538,9 +542,30 @@ namespace Bit.Core.Services { response.RequestKeyPair = keyPair; response.RequestAccessCode = accessCode; + response.FingerprintPhrase = fingerprintPhrase; } return response; } + + private async Task> PopulateFingerprintPhrasesAsync(List passwordlessLoginList) + { + if (passwordlessLoginList == null) + { + return null; + } + var userEmail = await _stateService.GetEmailAsync(); + foreach (var passwordlessLogin in passwordlessLoginList) + { + await PopulateFingerprintPhraseAsync(passwordlessLogin, userEmail); + } + return passwordlessLoginList; + } + + private async Task PopulateFingerprintPhraseAsync(PasswordlessLoginResponse passwordlessLogin, string userEmail) + { + passwordlessLogin.FingerprintPhrase = string.Join("-", await _cryptoService.GetFingerprintAsync(userEmail, CoreHelpers.Base64UrlDecode(passwordlessLogin.PublicKey))); + return passwordlessLogin; + } } } From 151ecf83e7f1686828f3a3cced6d231505ae76d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Thu, 16 Mar 2023 12:48:40 +0000 Subject: [PATCH 08/10] [PM-1431] [Defect] [Android] New accounts are not able to log in (#2417) * [PM-1431] Do not clear Master password if login is ongoing. --- src/App/Pages/Accounts/LoginPageViewModel.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/App/Pages/Accounts/LoginPageViewModel.cs b/src/App/Pages/Accounts/LoginPageViewModel.cs index be8ab4d99..3622c0338 100644 --- a/src/App/Pages/Accounts/LoginPageViewModel.cs +++ b/src/App/Pages/Accounts/LoginPageViewModel.cs @@ -40,6 +40,7 @@ namespace Bit.App.Pages private string _masterPassword; private bool _isEmailEnabled; private bool _isKnownDevice; + private bool _isExecutingLogin; public LoginPageViewModel() { @@ -192,6 +193,7 @@ namespace Bit.App.Pages ShowPassword = false; try { + _isExecutingLogin = true; if (checkForExistingAccount) { var userId = await _stateService.GetUserIdAsync(Email); @@ -253,14 +255,21 @@ namespace Bit.App.Pages AppResources.AnErrorHasOccurred, AppResources.Ok); } } + finally + { + _isExecutingLogin = false; + } } public void ResetPasswordField() { try { - MasterPassword = string.Empty; - ShowPassword = false; + if (!_isExecutingLogin) + { + MasterPassword = string.Empty; + ShowPassword = false; + } } catch (Exception ex) { From 606b00142f15ebcf56105fd404cb9b52783604dc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 01:24:09 +0100 Subject: [PATCH 09/10] Autosync the updated translations (#2419) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- src/App/Resources/AppResources.be.resx | 8 +- src/App/Resources/AppResources.ca.resx | 2 +- src/App/Resources/AppResources.de.resx | 11 +- src/App/Resources/AppResources.et.resx | 8 +- src/App/Resources/AppResources.fa.resx | 16 +-- src/App/Resources/AppResources.fi.resx | 2 +- src/App/Resources/AppResources.fil.resx | 10 +- src/App/Resources/AppResources.fr.resx | 13 +- src/App/Resources/AppResources.hu.resx | 134 ++++++++++---------- src/App/Resources/AppResources.it.resx | 42 +++--- src/App/Resources/AppResources.lt.resx | 12 +- src/App/Resources/AppResources.lv.resx | 8 +- src/App/Resources/AppResources.pt-BR.resx | 8 +- src/App/Resources/AppResources.sv.resx | 14 +- src/App/Resources/AppResources.tr.resx | 8 +- src/App/Resources/AppResources.zh-Hans.resx | 12 +- 16 files changed, 154 insertions(+), 154 deletions(-) diff --git a/src/App/Resources/AppResources.be.resx b/src/App/Resources/AppResources.be.resx index e04f911c0..2623ca267 100644 --- a/src/App/Resources/AppResources.be.resx +++ b/src/App/Resources/AppResources.be.resx @@ -2592,15 +2592,15 @@ Неабходны ідэнтыфікатар SSO арганізацыі. - Add the key to an existing or new item + Дадаць ключ да існуючага або новага элемента - There are no items in your vault that match "{0}" + У вашым сховішчы адсутнічаюць элементы, якія адпавядаюць "{0}" - Search for an item or add a new item + Пошук або дабаўленне новага элемента - There are no items that match the search + Адсутнічаюць элементы, якія адпавядаюць пошуку diff --git a/src/App/Resources/AppResources.ca.resx b/src/App/Resources/AppResources.ca.resx index ee23b2a0b..8460d5935 100644 --- a/src/App/Resources/AppResources.ca.resx +++ b/src/App/Resources/AppResources.ca.resx @@ -2140,7 +2140,7 @@ L'escaneig es farà automàticament. Aquesta organització té una política empresarial que us inscriurà automàticament al restabliment de la contrasenya. La inscripció permetrà als administradors de l’organització canviar la vostra contrasenya mestra. - Les polítiques de la vostra organització afecten el temps d'espera de la vostra caixa forta. El temps d'espera màxim permès de la caixa forta és de {0} hores i {1} minuts + Les polítiques de l'organització afecten el temps d'espera de la caixa forta. El temps d'espera màxim permès de la caixa forta és de {0} hores i {1} minuts El temps d'espera de la caixa forta supera les restriccions establertes per la vostra organització. diff --git a/src/App/Resources/AppResources.de.resx b/src/App/Resources/AppResources.de.resx index 7316263ef..d2790b865 100644 --- a/src/App/Resources/AppResources.de.resx +++ b/src/App/Resources/AppResources.de.resx @@ -1556,8 +1556,7 @@ Das Scannen erfolgt automatisch. Dunkles Standard-Design - Wähle das zu verwendende dunkle Design aus, das bei der Auswahl vom Standard-(System)-Design verwendet werden soll, während der Dark -Mode deines Geräts aktiviert ist. + Wähle das zu verwendende dunkle Design aus, das bei der Auswahl vom Standard-(System)-Design verwendet werden soll, während der Dark Mode deines Geräts aktiviert ist. Notiz kopieren @@ -1769,7 +1768,7 @@ Mode deines Geräts aktiviert ist. Enterprise Single-Sign-On - Schnell über den Single Sign-on deiner Organisation anmelden. Bitte gib deine Organisations-ID an, um zu beginnen. + Melde dich schnell über das Single Sign-on-Portal deiner Organisation an. Bitte gib die Organisationskennung ein, um zu beginnen. Organisationskennung @@ -2387,7 +2386,7 @@ Mode deines Geräts aktiviert ist. Benutzernamenstyp - Mit Plus adressierte E-Mail-Adresse + Plus-adressierte E-Mail-Adresse Catch-All E-Mail-Adresse @@ -2589,10 +2588,10 @@ Möchtest du zu diesem Konto wechseln? Schwaches Passwort erkannt und in einem Datendiebstahl gefunden. Verwende ein starkes und einzigartiges Passwort, um dein Konto zu schützen. Bist du sicher, dass du dieses Passwort verwenden möchtest? - SSO-ID der Organisation erforderlich. + SSO-Kennung der Organisation erforderlich. - Schlüssel zu einem bestehenden oder neuen Eintrag hinzufügen + Den Schlüssel zu einem bestehenden oder neuen Eintrag hinzufügen Es gibt keine Einträge in deinem Tresor, die mit "{0}" übereinstimmen diff --git a/src/App/Resources/AppResources.et.resx b/src/App/Resources/AppResources.et.resx index 43bea8edf..f8075ecd7 100644 --- a/src/App/Resources/AppResources.et.resx +++ b/src/App/Resources/AppResources.et.resx @@ -584,7 +584,7 @@ Vihje võib abiks olla olukorras, kui oled ülemparooli unustanud. - Master password must be at least {0} characters long. + Ülemparool peab olema vähemalt {0} tähemärgi pikkune. Vähim arv numbreid @@ -2595,12 +2595,12 @@ Soovid selle konto peale lülituda? Lisa võti olemasolevale või uuele kirjele - There are no items in your vault that match "{0}" + Hoidlas puuduvad kirjed, mis sobituksid sõnaga "{0}" - Search for an item or add a new item + Otsi kirjet või lisa uus kirje - There are no items that match the search + Otsingusõnale ei vasta kirjeid diff --git a/src/App/Resources/AppResources.fa.resx b/src/App/Resources/AppResources.fa.resx index f56466f5e..500aa11ac 100644 --- a/src/App/Resources/AppResources.fa.resx +++ b/src/App/Resources/AppResources.fa.resx @@ -2542,16 +2542,16 @@ اجازه دوربین را برای استفاده از اسکنر فعال کنید - Language + زبان - The language has been changed to {0}. Please restart the app to see the change + زبان به {0} تغییر کرده است. لطفاً برنامه را مجدداً راه اندازی کنید تا تغییرات را مشاهده کنید - Language change requires app restart + تغییر زبان نیاز به راه اندازی مجدد برنامه دارد - Default (System) + پیش‌فرض (سیستم) مهم @@ -2593,15 +2593,15 @@ شناسه سازمان SSO مورد نیاز است. - Add the key to an existing or new item + کلید را به یک مورد موجود یا جدید اضافه کنید - There are no items in your vault that match "{0}" + هیچ موردی در گاوصندوق شما وجود ندارد که با "{0}" مطابقت داشته باشد - Search for an item or add a new item + یک مورد را جستجو کنید یا یک مورد جدید اضافه کنید - There are no items that match the search + هیچ موردی وجود ندارد که با جستجو مطابقت داشته باشد diff --git a/src/App/Resources/AppResources.fi.resx b/src/App/Resources/AppResources.fi.resx index 9ef8bd3e8..a98864728 100644 --- a/src/App/Resources/AppResources.fi.resx +++ b/src/App/Resources/AppResources.fi.resx @@ -2141,7 +2141,7 @@ Koodi luetaan automaattisesti. Organisaatiolla on käytäntö, joka liittää tilisi automaattisesti salasanan palautusapuun. Liitos sallii organisaation ylläpitäjien vaihtaa pääsalasanasi. - Organisaatiokäytännöt vaikuttavat holvin aikakatkaisuun. Suurin sallittu aika on {0} tunti(a) ja {1} minuutti(a) + Organisaatiokäytännöt vaikuttavat holvisi aikakatkaisuun. Suurin sallittu aika on {0} tunti(a) ja {1} minuutti(a). Holvisi aikakatkaisu ylittää organisaatiosi asettamat rajoitukset. diff --git a/src/App/Resources/AppResources.fil.resx b/src/App/Resources/AppResources.fil.resx index 0377b26be..7af6c3ad1 100644 --- a/src/App/Resources/AppResources.fil.resx +++ b/src/App/Resources/AppResources.fil.resx @@ -1668,7 +1668,7 @@ Awtomatikong itong magsa-scan. Kumpirmahin ang pagkakakilanlan mo para tumuloy. - Naglalaman ng unencrypted vault data mo ang export na ito. Hindi mo dapat ilagay o ipadala ang file gamit ang hindi ligtas na mga paraan (tulad ng email). I-delete ito kaagad pagkagamit. + Naglalaman ng unencrypted vault data mo ang export na ito. Hindi mo dapat ilagay o ipadala ang file gamit ang hindi ligtas na mga paraan (tulad ng email). Burahin ito kaagad pagkagamit. Ine-encrypt ng export na ito ang data mo gamit ang encryption key ng iyong account. Kung iro-rotate mo man ang encryption key ng iyong account, kailangan mong mag-export ulit dahil hindi mo na made-decrypt ang file na ito. @@ -2593,15 +2593,15 @@ Gusto mo bang pumunta sa account na ito? Kinakailangan ang Organization SSO identifier. - Add the key to an existing or new item + Idagdag ang key sa kasalukuyan o bagong item - There are no items in your vault that match "{0}" + Walang mga item sa vault mo na tumutugma sa "{0}" - Search for an item or add a new item + Hanapin ang isang item o gumawa ng bagong item - There are no items that match the search + Walang mga item na tumutugma sa paghahanap diff --git a/src/App/Resources/AppResources.fr.resx b/src/App/Resources/AppResources.fr.resx index 5491a74a3..736db549e 100644 --- a/src/App/Resources/AppResources.fr.resx +++ b/src/App/Resources/AppResources.fr.resx @@ -1694,7 +1694,7 @@ La numérisation se fera automatiquement. Clone an entity (verb). - Une ou plusieurs politiques d'organisation affectent les paramètres de votre générateur + Une ou plusieurs politiques de sécurité de l'organisation affectent les paramètres de votre générateur Ouvrir @@ -1783,7 +1783,7 @@ La numérisation se fera automatiquement. Afin de finaliser la connexion avec SSO, veuillez définir un mot de passe principal pour accéder et protéger votre coffre. - Une ou plusieurs politiques de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes : + Une ou plusieurs politiques de sécurité de l'organisation exigent que votre mot de passe principal réponde aux exigences suivantes : Score de complexité minimum de {0} @@ -1813,7 +1813,8 @@ La numérisation se fera automatiquement. Chargement - En cochant cette case, vous acceptez les éléments suivants : + En cochant cette case vous acceptez ce qui suit : + Les conditions d'utilisation et la politique de confidentialité n'ont pas été acceptées. @@ -2062,7 +2063,7 @@ La numérisation se fera automatiquement. Masquer mon adresse électronique aux destinataires - Une ou plusieurs politiques d'organisation affectent vos options Send. + Une ou plusieurs politiques de sécurité de l'organisation affectent vos options Send. 'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated. @@ -2140,13 +2141,13 @@ La numérisation se fera automatiquement. Cette organisation dispose d'une politique d'entreprise qui vous inscrira automatiquement à la réinitialisation du mot de passe. L'inscription permettra aux administrateurs de l'organisation de changer votre mot de passe principal. - Les politiques de votre organisation affectent le délai d'expiration de votre coffre-fort. Le délai d'expiration maximal autorisé est de {0} heure(s) et {1} minute(s) + Les politiques de sécurité de votre organisation affectent le délai d'expiration de votre coffre. Le délai d'expiration autorisé du coffre est de {0} heure(s) et {1} minute(s) maximum Le délai d'expiration de votre coffre dépasse les restrictions définies par votre organisation. - Une ou plusieurs politiques d'organisation vous empêchent d'exporter votre coffre personnel. + Une ou plusieurs politiques de sécurité de l'organisation vous empêchent d'exporter votre coffre individuel. Ajouter un compte diff --git a/src/App/Resources/AppResources.hu.resx b/src/App/Resources/AppResources.hu.resx index 8b9f63c9b..610d8ca46 100644 --- a/src/App/Resources/AppResources.hu.resx +++ b/src/App/Resources/AppResources.hu.resx @@ -186,7 +186,7 @@ Short label for an email address. - E-mail-cím + Email cím Full label for a email address. @@ -232,7 +232,7 @@ A mappa mentésre került. - Weboldal megnyitása + Ugrás a webhelyre The button text that allows user to launch the website to their web browser. @@ -251,7 +251,7 @@ Title for the alert when internet connection is required to continue. - A mesterjelszó érvénytelen. Próbálkozz újra. + A mesterjelszó érvénytelen. Próbáljuk újra. A pinkód érvénytelen. Próbáljuk újra. @@ -553,10 +553,10 @@ Azonnal - Széf időkorlátja + Széf időkifutás - Művelet a széf időkorlátjának túllépésekor + Széf időkifutás művelet Kijelentkezve az összes széf elérés eltávolításra kerül és webes hitelesítésre van szükség az időkifutás után. Biztosan szeretnénk használni ezt a beállítást? @@ -578,7 +578,7 @@ A mesterjelszó az a jelszó amit a széfed eléréséhez fogsz használni. Nagyon fontos, hogy ne felejtsd el a mesterjelszavad, mert nincs lehetőséged visszaállítani ha elfelejtetted. - Mesterjelszó-emlékeztető (nem kötelező) + Mesterjelszó emlékeztető (nem kötelező) A mesterjelszó emlékeztető segíthet emlékezni a jelszavadra ha elfejetetted volna. @@ -632,13 +632,13 @@ Egyéb - Jelszó generálva. + A jelszó generálásra került. Jelszógenerátor - Jelszó-emlékeztető + Jelszó emlékeztető Elküldtünk neked egy E-mailt mely tartalmazza a mesterjelszó emlékeztetődet. @@ -647,7 +647,7 @@ Biztosan felül akarod írni a jelenlegi jelszót? - A Bitwarden push-értesítések használatával gondoskodik a széfed automatikus szinkronizálásáról. A funkció előnyeinek kihasználásához a push-értesítések engedélyezésére vonatkozó kérdés megjelenésekor válaszd az Engedélyezés lehetőséget. + A Bitwarden push-értesítések használatával gondoskodik a széf automatikus szinkronizálásáról. A funkció előnyeinek kihasználásához a push-értesítések engedélyezésére vonatkozó kérdés megjelenésekor válasszuk az "Engedélyezés" lehetőséget. Push notifications for apple products @@ -660,7 +660,7 @@ Jelszó újragenerálása - Írd be újra a mesterjelszavad + Mesterjelszó ismételt beírása Keresés a széfben @@ -678,7 +678,7 @@ Egy 4 számjegyű PIN-kód beállítása az alkalmazás kinyitásához. - Elem adatai + Elem információ Az elem frissítésre került. @@ -708,7 +708,7 @@ Kétlépcsős bejelentkezés - A kétlépcsős bejelentkezés biztonságosabbá teszi a fiókodat, mert egy másik eszközzel, például biztonsági kulccsal, hitelesítőalkalmazással, sms-sel, telefonhívással vagy e-maillel is jóvá kell hagynod a bejelentkezést. A kétlépcsős bejelentkezést a bitwarden.com webes széfjében kapcsolhatod be. Megnyitod most a weboldalt? + A kétlépcsős bejelentkezés biztonságosabbá teszi a fiókot, mert egy másik eszközzel, például biztonsági kulccsal, hitelesítőalkalmazással, sms- segítségével, telefonhívással vagy emaillel is jóvá kell hagyni a bejelentkezést. A kétlépcsős bejelentkezés a bitwarden.com webes széfjében kapcsolható be. Megnyitásra kerüljön a webhely most? Kinyitás ezzel: {0} @@ -737,7 +737,7 @@ Screen title - A kiegészítő aktiválva. + A kiegészítő bekapcsolásra került. Ikonok @@ -796,10 +796,10 @@ Biztos, hogy automatikusan kitöltésre kerüljön ez az elem? Nem teljesen egyezik: {0}. - Talált elemek + Megegyező elemek - Lehetséges találatok + Lehetséges megfelelő elemek Keresés @@ -815,7 +815,7 @@ Message shown when trying to launch an app that does not exist on the user's device. - Hitelesítőalkalmazás + Hitelesítő alkalmazás For 2FA @@ -827,11 +827,11 @@ For 2FA - Nem érhető el bejelentkezés + A bejelentkezés nem érhető el. For 2FA whenever there are no available providers on this device. - Ennél a fióknál engedélyezett a kétlépcsős bejelentkezés, de a beállított kétlépcsős bejelentkezési szolgáltatók egyike sem támogatott ezen az eszközön. Használj támogatott eszközt és/vagy olyan szolgáltatókat, amelyek jobban támogatják a több eszközzel történő használatot (ilyenek például a hitelesítőalkalmazások). + Ennél a fióknál engedélyezett a kétlépcsős bejelentkezés, de a beállított kétlépcsős bejelentkezési szolgáltatók egyike sem támogatott ezen az eszközön. Használjunk támogatott eszközt és/vagy olyan szolgáltatókat, amelyek jobban támogatják a több eszközzel történő használatot (ilyenek például a hitelesítőalkalmazások). Helyreállító kód @@ -856,7 +856,7 @@ For 2FA - Az ellenőrzőkódot tartalmazó e-mail elküldve. + Az ellenőrző kódot tartalmazó email elküldésre került. For 2FA @@ -900,7 +900,7 @@ Nem lehet olvasni a hitelesítő kulcsot. - Irányítsa a kamerát a QR-kódra. + Irányítsuk a kamerát a QR-kódra. QR kód beolvasása @@ -945,7 +945,7 @@ Fájl forrás - Ez a funkció nem érhető el + Ez a funkció nem érhető el. Maximális fájl méret 100 MB. @@ -957,10 +957,10 @@ További információ - API-szerver URL-címe + API szerver webcím - Egyéni környezet + Egyedi környezet Haladó felhasználóknak. Minden egyes szolgáltatásnak külön megadhatod az alap URL-t. @@ -973,7 +973,7 @@ Validation error when something is not formatted correctly, such as a URL or email address. - Identitásszerver URL-címe + Azonosító szerver webcím "Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management @@ -986,13 +986,13 @@ Szerver URL - Webes széf szerverének URL-címe + Webes széf szerver webcím Koppintunk erre az értesítésre a széfben tárolt elemek megtekintéséhez. - Egyéni mezők + Egyedi mezők Szám másolása @@ -1004,7 +1004,7 @@ Szám - Biztonsági kód + Biztonsági Kód Kártya @@ -1064,7 +1064,7 @@ február - Utónév + Személynév január @@ -1200,7 +1200,7 @@ Nem sikerült automatikusan megnyitni az Android automatikus kitöltés beállításai menüt. A beállítás megnyitásához nyitssuk meg a Beállítások > Rendszer > Nyelv és bevitel > Speciális > Automatikus kitöltés menüpontot. - Egyéni mezőnév + Egyedi mezőnév Logikai @@ -1215,7 +1215,7 @@ Szöveg - Új egyéni mező + Új egyedi mező Milyen típusú egyéni mező legyen hozzáadva? @@ -1280,7 +1280,7 @@ A kisegítő szolgáltatás használata hasznos lehet, ha az alkalmazások nem támogatják a szabványos automatikus kitöltési szolgáltatást. - A jelszó frissítve + A jelszó frissítésre került. ex. Date this password was updated @@ -1288,7 +1288,7 @@ ex. Date this item was updated - Az automatikus kitöltés aktiválva. + Az automatikus kitöltés bekapcsolásra került. Az automatikus kitöltő szolgáltatás használata előtt be kell jelentkezni a fő Bitwarden alkalmazásba. @@ -1303,13 +1303,13 @@ A széf közvetlenül a billentyűzetről érhető el a jelszavak gyors kitöltéséhez. - A következő lépésekkel engedélyezheted a jelszó automatikus kitöltését: + A jelszó automatikus kitöltés szolgáltatás engedélyezéséhez kövessük az alábbi utasításokat: 1. Lépjünk be az iOS "Beállítások" alkalmazásba - 2. Válasszuk a "Jelszavak és Fiókok" lehetőséget + 2. Válasszuk a "Jelszavak" lehetőséget 3. Válasszuk ki az "Jelszavak automatikus kitöltése" lehetőséget @@ -1342,7 +1342,7 @@ Védett jegyzetek - Minden elem + Összes elem URI elemek @@ -1362,13 +1362,13 @@ Ez a jelszó nem érintett egyetlen ismert adatszivárgásban sem. Biztonságos a használata. - Identitásnév + Azonosság név Érték - Korábbi jelszavak + Jelszó előzmények Típusok @@ -1383,7 +1383,7 @@ Gyűjtemény keresése - Fájl Sends elemek keresése + Sends fájl elemek keresése Szöveges Sends elemek keresése @@ -1396,7 +1396,7 @@ Típus - Lejjebb + Lefelé mozgatás Felfelé mozgatás @@ -1459,7 +1459,7 @@ Nincsenek megjeleníthető mappák. - Ujjlenyomat-kifejezés + Ujjlenyomat mondat A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing. @@ -1558,7 +1558,7 @@ A sötét téma választása használatra, ha az Alapértelmezett (Rendszer) témát használjuk az eszköz bekapcsolt sötét módja mellett. - Jegyzetek másolása + Jegyzet másolása Kilépés @@ -1597,7 +1597,7 @@ Újraindításkor - Az automatikus kitöltés megkönnyíti a Bitwarden széf biztonságos elérését más webhelyekről és alkalmazásokból. Úgy tűnik, hogy nem engedélyezett az automatikus kitöltés a Bitwardenből. Az automatikus kitöltést a Beállítások képernyőn engedélyezheted. + Az automatikus kitöltés megkönnyíti a Bitwarden széf biztonságos elérését más webhelyekről és alkalmazásokból. Úgy tűnik, hogy nem engedélyezett az automatikus kitöltés a Bitwardennél. Az automatikus kitöltés a Bitwardennél a "Beállítások" képernyőn engedélyezhető. A témaváltás az alkalmazás újraindítása után lép életbe. @@ -1616,7 +1616,7 @@ Megosztott - Láthatóság váltása + Láthatóság váltás A bejelentkezési munkamenet lejárt. @@ -1631,10 +1631,10 @@ Biometria használata a feloldáshoz - A Bitwarden figyelmet igényel - nyisd meg az "Automatikus kitöltés akadálymentesítő szolgáltatás" szakaszt a Bitwarden beállításaiban + A Bitwarden figyelmet igényel - Információ az "Automatikus kitöltés elérési szolgáltatás" elemnél a Bitwarden beállításaiban - 3. Az Android Alkalmazásbeállítások képernyőjén nyisd meg a "Megjelenítés más alkalmazások felett" szakaszt (a Speciális alatt), és a kapcsolóval engedélyezd az átfedéstámogatást. + 3. Az Android Alkalmazás beállítások képernyőn a "Megjelenítés más alkalmazások felett" opcióknál (a Bővített alatt) koppintsunk az átfedés támogatást engedélyező váltóra. Jogosultság @@ -1676,7 +1676,7 @@ A fiók titkosítási kulcsai minden Bitwarden felhasználói fiókhoz egyediek, ezért nem importálhatunk titkosított exportálást egy másik fiókba. - Széfexportálás megerősítése + Széf export megerősítése Title for the alert to confirm vault exports. @@ -1706,7 +1706,7 @@ A melléklet sikeresen mentésre került. - Az Automatikus kitöltés csempe használatához engedélyezd az "Automatikus kitöltés akadálymentesítő szolgáltatás" funkciót a Bitwarden beállításaiban. + Engedélyezzük az "Automatikus kitöltés elérés szolgáltatás" lehetőséget a Bitwarden beállításainál az automatikus kitöltés engedélyezéséhez. Nincs érzékelt jelszó mező. @@ -1728,7 +1728,7 @@ Message shown when interacting with the server - Az elem visszaállítva. + Az elem visszaállításra került. Confirmation message after successfully restoring a soft-deleted item @@ -1803,7 +1803,7 @@ {0} speciális karakterekből egyet vagy többet tartalmaz - Érvénytelen jelszó + Érvénytelen jelszó. A jelszó nem egyezik a szervezeti követelményekhez. Ellenőrizzük a szabály információt és próbáljuk újra. @@ -1824,46 +1824,46 @@ Adatvédelmi Irányelvek - A Bitwarden figyelmet igényel - engedélyezd az Átfedő megjelenítés beállítást a Bitwarden beállításainak "Automatikus kitöltési szolgáltatások" szakaszában. + A Bitwarden figyelmet igényel - Engedélyezzük Bitwarden beállításokban a "Felülrajzolás" opciót az "Automatikus kitöltési szolgáltatások" résznél. - Automatikus kitöltési szolgáltatások + Automatikus kitöltés Szövegközi automatikus kitöltés használata - Akkor használhatod a szövegközi automatikus kitöltést, ha a kiválasztott IME (billentyűzet) támogatja. Ha a konfiguráció nem támogatott (vagy ez a beállítás nincs engedélyezve), akkor az alapértelmezett automatikus kitöltési átfedőréteg lesz alkalmazva. + Használjuk a szövegközi automatikus kitöltést, ha azt a kiválasztott IME (billentyűzet) támogatja. Ha a konfiguráció nem támogatott (vagy ez az opció le van tiltva), akkor az alapértelmezett automatikus kitöltési átfedőréteg kerül használatba. Akadálymentes használat - A Bitwarden akadálymentesítő szolgáltatásával automatikus kitöltheted a bejelentkezési adataidat az alkalmazásokban és a weben. Ha engedélyezett, akkor előugró ablak fog megjelenni, amikor egy bejelentkezési mezőre lépsz. + Használjuk a Bitwarden Kisegítő Szolgáltatást a bejelentkezések automatikus kitöltéséhez az alkalmazásokban és az interneten. Ha engedélyezve van, akkor a bejelentkezési mezők kiválasztásakor megjelenik egy felbukkanó ablak. - A Bitwarden akadálymentesítő szolgáltatásával automatikus kitöltheted a bejelentkezési adataidat az alkalmazásokban és a weben. (Ehhez engedélyezni kell az Átfedő megjelenítés beállítást is.) + Használjuk a Bitwarden Kisegítő Szolgáltatást a bejelentkezések automatikus kitöltéséhez az alkalmazásokban és az interneten. (Megköveteli a Felülrajzolás engedélyezését is) - A Bitwarden akadálymentesítő szolgáltatásával használhatod az Automatikus kitöltés gyorsműveleti csempt, és/vagy egy előugró ablakot jeleníthetsz meg az Átfedő megjelenítés használatával (ha engedélyezve van). + Használjuk a Bitwarden Kisegítő Szolgáltatást az Automatikus kitöltés gyorsműveleti csempe használatához és/vagy egy felugró ablak megjelenítéséhez a Felülrajzolás használatával (ha engedélyezve van). - Szükséges az Automatikus kitöltés gyorsműveleti csempe használatához, vagy az automatikus kitöltési szolgáltatás kiterjesztéséhez az Átfedő megjelenítés használatával (ha engedélyezve van). + Szükséges az Automatikus kitöltés gyorsműveleti csempe használatához, vagy az automatikus kitöltési szolgáltatás bővítéséhez a Felülrajzolás használatával (ha engedélyezve van). - Átfedő megjelenítés használata + Felülrajzolás használata - Ha engedélyezett, akkor a Bitwarden akadálymentesítő szolgáltatása előugró ablakot jelenít meg, amikor bejelentkezési mezőre lépsz. + Engedélyezve a Bitwarden Akadálymentes Szolgáltatás egy felbukkanó ablakot jelenít meg, amikor a bejelentkezési mezők kiválasztottak. - Ha engedélyezett, akkor a Bitwarden akadálymentesítő szolgáltatása előugró ablakot jelenít meg, amikor bejelentkezési mezőre lépsz, hogy segítsen az adatok automatikus kitöltésében. + Engedélyezve a Bitwarden Kisegítő Szolgáltatás egy felbukkanó ablakot jelenít meg a bejelentkezések automatikus kitöltéséhez, amikor a bejelentkezési mezők kiválasztottak. - Ha engedélyezett, akkor az akadálymentesítő szolgáltatás előugró ablakot jelenít meg, hogy olyan régebbi alkalmazásokban is használhasd az automatikus kiegészítési szolgáltatást, ami nem támogatja az Android automatikus kitöltési keretrendszerét. + Engedélyezve a a Kisegítő felbukkanó ablakot jelenít meg az Automatikus Kitöltési Szolgáltatás kibővítéséhez olyan régebbi alkalmazások számára, amelyek nem támogatják az Android automatikus kitöltés keretrendszerét. - A vállalat szabályai korlátozzák a személyes széfbe menthető elemeket. Adj meg egy szervezetet a Tulajdonjog beállításban, és válassz az elérhető gyűjtemények közül. + Egy vállalati házirend miatt korlátozható az elemek személyes tárolóba történő mentése. Módosítsuk a Tulajdon opciót egy szervezetre és válasszunk az elérhető gyűjtemények közül. Egy szervezeti házirend befolyásolja a tulajdonjog beállításait. @@ -1919,7 +1919,7 @@ Törlési dátum - Törlési dátum + Törlési időpont A Send véglegesen törlésre kerül a meghatározott időpontban. @@ -1932,7 +1932,7 @@ Lejárati dátum - Lejárati idő + Lejárati időpont Beállítva a hozzáférés ehhez a Send elemhez lejár a meghatározott időpontban. @@ -2106,10 +2106,10 @@ Mesterjelszó eltávolítása - A(z) {0} SSO-t használ ügyfél által kezelt titkosítással. Ha folytatod, akkor eltávolítod a mesterjelszót a fiókodból, és SSO-ra lesz szükség a bejelentkezéshez. + {0} SSO szolgáltatást használ ügyfél által kezelt titkosítással. A folytatással eltávolító a mesterjelszó a fiókból és egyszeri bejelentkezés szükséges a bejelentkezéshez. - Ha nem szeretnéd eltávolítani a mesterjelszót, kiléphetsz ebből a szervezetből. + Ha nem szeretnénk eltávolítani a mesterjelszót, kiléphetünk ebből a szervezetből. Kilépés a szervezetből @@ -2187,7 +2187,7 @@ A fiók véglegesen törlésre került. - Az ellenőrzőkód érvénytelen. + A hitelesítő kód érvénytelen. Egyszeri jelszó kérése @@ -2268,7 +2268,7 @@ Összes - Idő alapú egyszer használatos jelszó (TOTP) + TOTP Hitelesítő kód diff --git a/src/App/Resources/AppResources.it.resx b/src/App/Resources/AppResources.it.resx index e4c1b857b..3404a40f9 100644 --- a/src/App/Resources/AppResources.it.resx +++ b/src/App/Resources/AppResources.it.resx @@ -422,7 +422,7 @@ Usa il servizio di accessibilità di Bitwarden per l'auto-completamento dei tuoi login su app e web. - Servizio di auto-completamento + Servizio di riempimento automatico Evita caratteri ambigui @@ -784,7 +784,7 @@ Stato - Il modo più semplice per aggiungere nuovi login alla tua cassaforte è dal servizio di completamento automatico Bitwarden. Scopri di più sull'utilizzo del servizio di completamento automatico di Bitwarden navigando nella schermata "Impostazioni". + Il modo più semplice per aggiungere nuovi login alla tua cassaforte è dal servizio di riempimento automatico di Bitwarden. Scopri di più sull'utilizzo del servizio di riempimento automatico di Bitwarden navigando nella schermata "Impostazioni". Auto-completamento @@ -915,7 +915,7 @@ Copia TOTP - Se un login è dotato di una chiave di autenticazione, copia il codice di verifica TOTP negli appunti all'autocompletamento del login. + Se un login è dotato di una chiave di autenticazione, copia il codice di verifica TOTP negli appunti al riempimento automatico del login. Copia TOTP automaticamente @@ -1172,10 +1172,10 @@ Servizio di accessibilità dell'auto-completamento - Il servizio di auto-completamento Bitwarden usa l'Android Autofill Framework per assistenza nel completare informazioni su login, carte di credito e identità su altre applicazioni nel tuo dispositivo. + Il servizio di riempimento automatico Bitwarden usa l'Android Autofill Framework per assistenza nel completare informazioni su login, carte di credito e identità su altre applicazioni nel tuo dispositivo. - Usa il servizio di auto-completamento di Bitwarden per riempire le informazioni su login, carte di credito e identità su altre app. + Usa il servizio di riempimento automatico di Bitwarden per riempire le informazioni su login, carte di credito e identità su altre app. Apri impostazioni di auto-completamento @@ -1321,7 +1321,7 @@ 5. Seleziona "Bitwarden" - Completamento automatico password + Riempimento automatico password Il modo più semplice per aggiungere nuovi login alla tua cassaforte è l'estensione Bitwarden Password AutoFill. Scopri di più sull'utilizzo dell'estensione Bitwarden Password AutoFill navigando nella schermata "Impostazioni". @@ -1535,11 +1535,11 @@ Clipboard is the operating system thing where you copy/paste data to on your device. - Rilevamento corrispondenza URI predefinito + Rilevamento di corrispondenza URI predefinito Default URI match detection for auto-fill. - Scegli il modo predefinito in cui il rilevamento della corrispondenza dell'URI viene gestito per gli accessi quando si eseguono azioni come il completamento automatico. + Scegli il modo predefinito in cui il rilevamento della corrispondenza dell'URI viene gestito per gli accessi quando si eseguono azioni come il riempimento automatico. Tema @@ -1582,10 +1582,10 @@ 'Solarized Dark' is the name of a specific color scheme. It should not be translated. - URI per cui l'autocompletamento non è permesso + URI per cui il riempimento automatico non è permesso - L'autocompletamento non sarà proposto per gli URI bloccati. Separa più URI con una virgola. Ad esempio: "https://twitter.com, androidapp://com.twitter.android". + Il riempimento automatico non sarà proposto per gli URI bloccati. Separa più URI con una virgola. Per esempio: "https://twitter.com, androidapp://com.twitter.android". Chiedi di aggiungere il login @@ -1597,7 +1597,7 @@ Al riavvio dell'applicazione - L'auto-completamento rende facile accedere in modo sicuro alla tua cassaforte Bitwarden da altri siti web e applicazioni. Sembra che tu non abbia abilitato un servizio di completamento automatico per Bitwarden. Abilita l'auto-completamento per Bitwarden dalla schermata "Impostazioni". + Il riempimento automatico rende facile accedere in modo sicuro alla tua cassaforte Bitwarden da altri siti web e applicazioni. Sembra che tu non abbia abilitato un servizio di riempimento automatico per Bitwarden. Abilita il riempimento automatico per Bitwarden dalla schermata "Impostazioni". Le modifiche del tema verranno applicate al riavvio dell'applicazione. @@ -1631,7 +1631,7 @@ Sblocca con dati biometrici - Bitwarden richiede la tua attenzione - Vedi "Servizio di accessibilità per l'auto-completamento" dalle Impostazioni di Bitwarden + Bitwarden richiede la tua attenzione - Vedi "Servizio di accessibilità per il riempimento automatico" dalle impostazioni di Bitwarden 3. Sulla schermata di Impostazioni dell'App Android per Bitwarden, vai alle opzioni "Mostra sulle altre app" (sotto Avanzate) e tocca l'interruttore per abilitare il supporto overlay. @@ -1706,7 +1706,7 @@ Allegato salvato con successo - Abilita il "Servizio di accessibilità per il completamento automatico" dalle impostazioni di Bitwarden per utilizzare la funzione di completamento automatico. + Abilita il "Servizio di accessibilità per il riempimento automatico" dalle impostazioni di Bitwarden per utilizzare la funzione di riempimento automatico. Nessun campo password rilevato @@ -1828,7 +1828,7 @@ Bitwarden richiede la tua attenzione - Abilita "Mostra sopra altre app" nelle opzioni di Bitwarden - Servizi di auto-completamento + Servizi di riempimento automatico Usa il completamento automatico @@ -1840,10 +1840,10 @@ Usa accessibilità - Utilizza il servizio di accessibilità di Bitwarden per l'auto-completamento. Se abilitato, verrà mostrato una finestra a comparsa quando i campi relativi al login sono selezionati. + Utilizza il servizio di accessibilità di Bitwarden per il riempimento automatico. Se abilitato, verrà mostrato una finestra a comparsa quando i campi relativi al login sono selezionati. - Utilizza il servizio di accessibilità di Bitwarden per accedere automaticamente sul web e sulle applicazioni tramite autocompletamento (È necessario abilitare "Mostra sopra altre app") + Utilizza il servizio di accessibilità di Bitwarden per riempire automaticamente i tuoi accessi attraverso siti e applicazioni. (è necessario che anche "Mostra sopra altre app" sia abilitato) Abilita il servizio di accessibilità di Bitwarden per usare il riquadro di auto-completamento rapido, e/o mostra una finestra a comparsa quando "Mostra sopra altre app" viene utilizzato (se abilitato). @@ -1858,7 +1858,7 @@ Se abilitato, permette al servizio di accessibilità di Bitwarden di mostrare un popup quando i campi relativi al login vengono selezionati. - Se abilitato, il servizio di accessibilità di Bitwarden mostrerà una finestra a comparsa quando i campi login vengono selezionati per aiutarti con l'auto-completamento. + Se abilitato, il servizio di accessibilità di Bitwarden mostrerà una finestra a comparsa quando i campi di accesso vengono selezionati per aiutarti con il riempimento automatico. Se abilitato, l'accessibilità mostrerà una finestra a comparsa per aumentare il servizio di auto-completamento per le vecchie applicazioni che non supportano il framework di auto-completamento di Android. @@ -2592,15 +2592,15 @@ Vuoi passare a questo account? L'identificatore SSO dell'organizzazione è necessario. - Add the key to an existing or new item + Aggiungi la chiave a un elemento esistente o nuovo - There are no items in your vault that match "{0}" + Nessun elemento nella tua cassaforte corrisponde a "{0}" - Search for an item or add a new item + Cerca un elemento o aggiungi un nuovo elemento - There are no items that match the search + Nessun elemento corrisponde alla ricerca diff --git a/src/App/Resources/AppResources.lt.resx b/src/App/Resources/AppResources.lt.resx index 94a15ff88..f8a7e3db5 100644 --- a/src/App/Resources/AppResources.lt.resx +++ b/src/App/Resources/AppResources.lt.resx @@ -2545,13 +2545,13 @@ Ar norite pereiti prie šios paskyros? Kalba - The language has been changed to {0}. Please restart the app to see the change + Kalba pakeista į {0}. Iš naujo paleiskite programą, kad pamatytumėte pakeitimą - Language change requires app restart + Keičiant kalbą reikia iš naujo paleisti programą - Default (System) + Numatyta (System) Svarbu @@ -2593,15 +2593,15 @@ Ar norite pereiti prie šios paskyros? Būtinas organizacijos SSO identifikatorius. - Add the key to an existing or new item + Pridėkite raktą prie esamo ar naujo elemento There are no items in your vault that match "{0}" - Search for an item or add a new item + Ieškokite elemento arba pridėkite naują elementą - There are no items that match the search + Elementų, atitinkančių paiešką, nėra diff --git a/src/App/Resources/AppResources.lv.resx b/src/App/Resources/AppResources.lv.resx index ccfdd6e6d..92dcc9dda 100644 --- a/src/App/Resources/AppResources.lv.resx +++ b/src/App/Resources/AppResources.lv.resx @@ -2592,15 +2592,15 @@ Vai pārslēgties uz šo kontu? Ir nepieciešams apvienības SSO identifikators. - Add the key to an existing or new item + Pievienot atslēgu esošam vai jaunam vienumam - There are no items in your vault that match "{0}" + Glabātavā nav vienumu, kas atbilstu "{0}" - Search for an item or add a new item + Meklēt vienumu vai pievienot jaunu - There are no items that match the search + Nav vienumu, kas atbilstu meklējumam diff --git a/src/App/Resources/AppResources.pt-BR.resx b/src/App/Resources/AppResources.pt-BR.resx index 7c93be82f..19e64d42f 100644 --- a/src/App/Resources/AppResources.pt-BR.resx +++ b/src/App/Resources/AppResources.pt-BR.resx @@ -2593,15 +2593,15 @@ Você deseja mudar para esta conta? Identificador SSO da organização necessário. - Add the key to an existing or new item + Adicionar a chave a um item existente ou novo - There are no items in your vault that match "{0}" + Não existem itens no seu cofre que correspondam a "{0}" - Search for an item or add a new item + Procure por um item ou adicione um novo item - There are no items that match the search + Não há itens que correspondam à pesquisa diff --git a/src/App/Resources/AppResources.sv.resx b/src/App/Resources/AppResources.sv.resx index 9771afa0e..7a7f88357 100644 --- a/src/App/Resources/AppResources.sv.resx +++ b/src/App/Resources/AppResources.sv.resx @@ -2546,10 +2546,10 @@ Vill du byta till detta konto? Språk - The language has been changed to {0}. Please restart the app to see the change + Språket har ändrats till {0}. Starta om appen för att se ändringen - Language change requires app restart + Ändring av språk kräver att appen startas om Standard (System) @@ -2591,18 +2591,18 @@ Vill du byta till detta konto? Lösenordet är svagt och avslöjades vid ett dataintrång. Använd ett starkt och unikt lösenord för att skydda ditt konto. Är det säkert att du vill använda detta lösenord? - Organization SSO identifier required. + Organisationens SSO-identifierare krävs. - Add the key to an existing or new item + Lägg till nyckeln till ett befintligt eller nytt objekt - There are no items in your vault that match "{0}" + Det finns inga objekt i ditt valv som matchar "{0}" - Search for an item or add a new item + Sök efter ett objekt eller lägg till ett nytt objekt - There are no items that match the search + Det finns inga objekt som matchar sökningen diff --git a/src/App/Resources/AppResources.tr.resx b/src/App/Resources/AppResources.tr.resx index 0150ba9f2..453485ebf 100644 --- a/src/App/Resources/AppResources.tr.resx +++ b/src/App/Resources/AppResources.tr.resx @@ -2591,15 +2591,15 @@ Bu hesaba geçmek ister misiniz? Kuruluş SSO tanımlayıcısı gereklidir. - Add the key to an existing or new item + Anahtarı mevcut veya yeni bir kayda ekle - There are no items in your vault that match "{0}" + Kasanızda "{0}" ile eşleşen kayıt yok - Search for an item or add a new item + Kayıtlarda ara veya yeni kayıt ekle - There are no items that match the search + Aramayla eşleşen kayıt yok diff --git a/src/App/Resources/AppResources.zh-Hans.resx b/src/App/Resources/AppResources.zh-Hans.resx index 3fa677049..b35a71b1f 100644 --- a/src/App/Resources/AppResources.zh-Hans.resx +++ b/src/App/Resources/AppResources.zh-Hans.resx @@ -2529,7 +2529,7 @@ 拒绝所有请求 - Are you sure you want to decline all pending login requests? + 您确定要拒绝所有待处理的登录请求吗? 请求被拒绝 @@ -2562,7 +2562,7 @@ 脆弱的主密码 - Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password? + 发现弱密码。使用一个强密码来保护你的账户。你确定你要使用弱密码吗? @@ -2592,15 +2592,15 @@ 必须填写组织 SSO 标识符。 - Add the key to an existing or new item + 将密钥添加到现有或新项目 - There are no items in your vault that match "{0}" + 您的密码库中没有匹配 "{0}" 的项目 - Search for an item or add a new item + 搜索一个项目或添加一个新项目 - There are no items that match the search + 没有匹配搜索的项目 From a6bb08963395f0b2090ffab27f441722b97cf63b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bispo?= Date: Fri, 17 Mar 2023 15:07:41 +0000 Subject: [PATCH 10/10] [PM-1497] Known device api error (#2418) * [PM-1497] Ignore know device api error. --- src/App/Pages/Accounts/LoginPageViewModel.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/App/Pages/Accounts/LoginPageViewModel.cs b/src/App/Pages/Accounts/LoginPageViewModel.cs index 3622c0338..cebdffdb3 100644 --- a/src/App/Pages/Accounts/LoginPageViewModel.cs +++ b/src/App/Pages/Accounts/LoginPageViewModel.cs @@ -150,15 +150,21 @@ namespace Bit.App.Pages { Email = await _stateService.GetRememberedEmailAsync(); } - var deviceIdentifier = await _appIdService.GetAppIdAsync(); - IsKnownDevice = await _apiService.GetKnownDeviceAsync(Email, deviceIdentifier); CanRemoveAccount = await _stateService.GetActiveUserEmailAsync() != Email; - await _deviceActionService.HideLoadingAsync(); + IsKnownDevice = await _apiService.GetKnownDeviceAsync(Email, await _appIdService.GetAppIdAsync()); + } + catch (ApiException apiEx) when (apiEx.Error.StatusCode == System.Net.HttpStatusCode.Unauthorized) + { + _logger.Exception(apiEx); } catch (Exception ex) { HandleException(ex); } + finally + { + await _deviceActionService.HideLoadingAsync(); + } } public async Task LogInAsync(bool showLoading = true, bool checkForExistingAccount = false)