From be9d0c0291891708a6ee5de28be8a59c6055f814 Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Fri, 12 Dec 2025 15:00:03 +0100 Subject: [PATCH 01/16] Transfer node-forge ownership to KM (#17941) * chore: move node-forge to KM * chore: sort dependencies --- .github/renovate.json5 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 96e16776545..ca57ccf4f86 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -154,7 +154,6 @@ "@types/glob", "@types/lowdb", "@types/node", - "@types/node-forge", "@types/node-ipc", "@yao-pkg/pkg", "anyhow", @@ -192,7 +191,6 @@ "napi", "napi-build", "napi-derive", - "node-forge", "node-ipc", "nx", "oo7", @@ -415,14 +413,16 @@ }, { matchPackageNames: [ + "@types/node-forge", "aes", "big-integer", "cbc", + "linux-keyutils", + "memsec", + "node-forge", "rsa", "russh-cryptovec", "sha2", - "memsec", - "linux-keyutils", ], description: "Key Management owned dependencies", commitMessagePrefix: "[deps] KM:", From 27d82aaf286d6ef862864c21edef988bc57fd34e Mon Sep 17 00:00:00 2001 From: Todd Martin <106564991+trmartin4@users.noreply.github.com> Date: Fri, 12 Dec 2025 10:03:31 -0500 Subject: [PATCH 02/16] feat(accounts): Add creationDate of account to AccountInfo * Add creationDate of account to AccountInfo * Added initialization of creationDate. * Removed extra changes. * Fixed tests to initialize creation date * Added helper method to abstract account initialization in tests. * More test updates. * Linting * Additional test fixes. * Fixed spec reference * Fixed imports * Linting. * Fixed browser test. * Modified tsconfig to reference spec file. * Fixed import. * Removed dependency on os. This is necessary so that the @bitwarden/common/spec lib package can be referenced in tests without node. * Revert "Removed dependency on os. This is necessary so that the @bitwarden/common/spec lib package can be referenced in tests without node." This reverts commit 669f6557b6561f65ff513c14c2b3e8a55bef4035. * Updated stories to hard-code new field. * Removed changes to tsconfig * Revert "Removed changes to tsconfig" This reverts commit b7d916e8dc70be453f7092138416ce2e3c09ed57. --- .../services/account-switcher.service.spec.ts | 16 ++-- .../notification.background.spec.ts | 12 +-- .../browser/main-context-menu-handler.spec.ts | 8 +- .../extension-anon-layout-wrapper.stories.ts | 3 + .../popup/send-v2/send-v2.component.spec.ts | 8 +- .../open-attachments.component.spec.ts | 8 +- .../commands/unlock.command.spec.ts | 8 +- .../fido2-create.component.spec.ts | 8 +- .../desktop-autotype-policy.service.spec.ts | 8 +- .../biometric-message-handler.service.spec.ts | 16 ++-- .../unified-upgrade-dialog.component.spec.ts | 8 +- .../upgrade-nav-button.component.spec.ts | 8 +- .../services/upgrade-payment.service.spec.ts | 45 ++++++----- .../pages/breach-report.component.spec.ts | 8 +- .../user-key-rotation.service.spec.ts | 8 +- .../navigation-switcher.stories.ts | 3 + .../product-switcher.stories.ts | 3 + .../services/vault-banners.service.spec.ts | 15 +++- .../guards/provider-permissions.guard.spec.ts | 8 +- .../secrets/secret.service.spec.ts | 9 ++- .../services/sm-porting-api.service.spec.ts | 9 ++- .../access-policy.service.spec.ts | 9 ++- .../src/auth/guards/auth.guard.spec.ts | 24 +++--- .../src/auth/guards/lock.guard.spec.ts | 24 +++--- ...edirect-to-vault-if-unlocked.guard.spec.ts | 8 +- .../tde-decryption-required.guard.spec.ts | 8 +- .../src/auth/guards/unauth.guard.spec.ts | 8 +- .../login-approval-dialog.component.spec.ts | 8 +- .../default-change-password.service.spec.ts | 9 ++- ...ypted-migrations-scheduler.service.spec.ts | 15 ++-- .../common/login-strategies/login.strategy.ts | 1 + .../services/accounts/lock.services.spec.ts | 26 ++++--- libs/common/spec/fake-account-service.ts | 28 +++++-- .../src/auth/abstractions/account.service.ts | 11 ++- .../src/auth/services/account.service.spec.ts | 76 ++++++++++++++++++- .../src/auth/services/account.service.ts | 5 ++ .../auth-request-answering.service.spec.ts | 11 ++- .../src/auth/services/auth.service.spec.ts | 27 ++++--- ...-enrollment.service.implementation.spec.ts | 8 +- .../services/vault-timeout.service.spec.ts | 14 ++-- ...ult-server-notifications.multiuser.spec.ts | 13 +++- ...fault-server-notifications.service.spec.ts | 21 ++++- .../default-environment.service.spec.ts | 19 +++-- .../fido2/fido2-authenticator.service.spec.ts | 9 ++- .../services/sdk/default-sdk.service.spec.ts | 7 +- .../services/sdk/register-sdk.service.spec.ts | 12 ++- .../src/platform/sync/default-sync.service.ts | 1 + libs/common/src/services/api.service.spec.ts | 8 +- .../tools/extension/extension.service.spec.ts | 14 +++- .../tools/send/services/send.service.spec.ts | 8 +- .../tools/state/user-state-subject.spec.ts | 15 ++-- ...warden-password-protected-importer.spec.ts | 15 ++-- .../master-password-lock.component.spec.ts | 8 +- .../generator-metadata-provider.spec.ts | 13 +++- .../generator-profile-provider.spec.ts | 29 ++++--- ...fault-credential-generator.service.spec.ts | 9 ++- .../send-list-filters.component.spec.ts | 9 ++- .../login-credentials-view.component.spec.ts | 8 +- .../add-edit-folder-dialog.component.spec.ts | 9 +-- tsconfig.base.json | 1 + 60 files changed, 491 insertions(+), 276 deletions(-) diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts index 4bacd453803..f3be535f00e 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -15,6 +15,7 @@ import { } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { AccountSwitcherService } from "./account-switcher.service"; @@ -71,11 +72,10 @@ describe("AccountSwitcherService", () => { describe("availableAccounts$", () => { it("should return all logged in accounts and an add account option when accounts are less than 5", async () => { - const accountInfo: AccountInfo = { + const accountInfo = mockAccountInfoWith({ name: "Test User 1", email: "test1@email.com", - emailVerified: true, - }; + }); avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); accountsSubject.next({ ["1" as UserId]: accountInfo, ["2" as UserId]: accountInfo }); @@ -109,11 +109,10 @@ describe("AccountSwitcherService", () => { const seedAccounts: Record = {}; const seedStatuses: Record = {}; for (let i = 0; i < numberOfAccounts; i++) { - seedAccounts[`${i}` as UserId] = { + seedAccounts[`${i}` as UserId] = mockAccountInfoWith({ email: `test${i}@email.com`, - emailVerified: true, name: "Test User ${i}", - }; + }); seedStatuses[`${i}` as UserId] = AuthenticationStatus.Unlocked; } avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc")); @@ -133,11 +132,10 @@ describe("AccountSwitcherService", () => { ); it("excludes logged out accounts", async () => { - const user1AccountInfo: AccountInfo = { + const user1AccountInfo = mockAccountInfoWith({ name: "Test User 1", email: "", - emailVerified: true, - }; + }); accountsSubject.next({ ["1" as UserId]: user1AccountInfo }); authStatusSubject.next({ ["1" as UserId]: AuthenticationStatus.LoggedOut }); accountsSubject.next({ diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 8df21bc66ef..ab16788ea6f 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -4,7 +4,7 @@ import { BehaviorSubject, firstValueFrom, of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; -import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { ExtensionCommand } from "@bitwarden/common/autofill/constants"; @@ -17,6 +17,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { ThemeTypes } from "@bitwarden/common/platform/enums"; import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; @@ -80,11 +81,12 @@ describe("NotificationBackground", () => { const organizationService = mock(); const userId = "testId" as UserId; - const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ + const activeAccountSubject = new BehaviorSubject({ id: userId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); beforeEach(() => { diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts index 1348928b7e9..1738485f289 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts @@ -18,6 +18,7 @@ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/s import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; @@ -123,9 +124,10 @@ describe("context-menu", () => { autofillSettingsService.enableContextMenu$ = of(true); accountService.activeAccount$ = of({ id: "userId" as UserId, - email: "", - emailVerified: false, - name: undefined, + ...mockAccountInfoWith({ + email: "", + name: undefined, + }), }); }); diff --git a/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts b/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts index 57ef285bdf5..8fdae06e28a 100644 --- a/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts +++ b/apps/browser/src/popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper.stories.ts @@ -76,11 +76,14 @@ const decorators = (options: { { provide: AccountService, useValue: { + // We can't use mockAccountInfoWith() here because we can't take a dependency on @bitwarden/common/spec. + // This is because that package relies on jest dependencies that aren't available here. activeAccount$: of({ id: "test-user-id" as UserId, name: "Test User 1", email: "test@email.com", emailVerified: true, + creationDate: "2024-01-01T00:00:00.000Z", }), }, }, diff --git a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts index 6d79f430a37..6e73d9811f2 100644 --- a/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts +++ b/apps/browser/src/tools/popup/send-v2/send-v2.component.spec.ts @@ -16,6 +16,7 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { SendType } from "@bitwarden/common/tools/send/enums/send-type"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction"; @@ -96,9 +97,10 @@ describe("SendV2Component", () => { useValue: { activeAccount$: of({ id: "123", - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }), }, }, diff --git a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts index 459b328c44e..e9636e09873 100644 --- a/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts +++ b/apps/browser/src/vault/popup/components/vault-v2/attachments/open-attachments/open-attachments.component.spec.ts @@ -11,6 +11,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs import { ProductTierType } from "@bitwarden/common/billing/enums"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CipherId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; @@ -60,9 +61,10 @@ describe("OpenAttachmentsComponent", () => { const accountService = { activeAccount$: of({ id: mockUserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }), }; const formStatusChange$ = new BehaviorSubject<"enabled" | "disabled">("enabled"); diff --git a/apps/cli/src/key-management/commands/unlock.command.spec.ts b/apps/cli/src/key-management/commands/unlock.command.spec.ts index 70e9a8fd232..50ef414ec37 100644 --- a/apps/cli/src/key-management/commands/unlock.command.spec.ts +++ b/apps/cli/src/key-management/commands/unlock.command.spec.ts @@ -15,6 +15,7 @@ import { ConfigService } from "@bitwarden/common/platform/abstractions/config/co import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; import { KeyService } from "@bitwarden/key-management"; @@ -48,9 +49,10 @@ describe("UnlockCommand", () => { const mockMasterPassword = "testExample"; const activeAccount: Account = { id: "user-id" as UserId, - email: "user@example.com", - emailVerified: true, - name: "User", + ...mockAccountInfoWith({ + email: "user@example.com", + name: "User", + }), }; const mockUserKey = new SymmetricCryptoKey(new Uint8Array(64)) as UserKey; const mockSessionKey = new Uint8Array(64) as CsprngArray; diff --git a/apps/desktop/src/autofill/modal/credentials/fido2-create.component.spec.ts b/apps/desktop/src/autofill/modal/credentials/fido2-create.component.spec.ts index 778215895ee..dbef860aafe 100644 --- a/apps/desktop/src/autofill/modal/credentials/fido2-create.component.spec.ts +++ b/apps/desktop/src/autofill/modal/credentials/fido2-create.component.spec.ts @@ -7,6 +7,7 @@ import { AccountService, Account } from "@bitwarden/common/auth/abstractions/acc import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherRepromptType, CipherType } from "@bitwarden/common/vault/enums"; @@ -40,9 +41,10 @@ describe("Fido2CreateComponent", () => { const activeAccountSubject = new BehaviorSubject({ id: "test-user-id" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); beforeEach(async () => { diff --git a/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts b/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts index 555e6ceef5b..907da2fe85c 100644 --- a/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts +++ b/apps/desktop/src/autofill/services/desktop-autotype-policy.service.spec.ts @@ -10,6 +10,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { Account, UserId } from "@bitwarden/common/platform/models/domain/account"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { DesktopAutotypeDefaultSettingPolicy } from "./desktop-autotype-policy.service"; @@ -30,9 +31,10 @@ describe("DesktopAutotypeDefaultSettingPolicy", () => { beforeEach(() => { mockAccountSubject = new BehaviorSubject({ id: mockUserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); mockFeatureFlagSubject = new BehaviorSubject(true); mockAuthStatusSubject = new BehaviorSubject( diff --git a/apps/desktop/src/services/biometric-message-handler.service.spec.ts b/apps/desktop/src/services/biometric-message-handler.service.spec.ts index 49d346bfa3a..3b343fcc0fb 100644 --- a/apps/desktop/src/services/biometric-message-handler.service.spec.ts +++ b/apps/desktop/src/services/biometric-message-handler.service.spec.ts @@ -2,7 +2,7 @@ import { NgZone } from "@angular/core"; import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, filter, firstValueFrom, of, take, timeout, timer } from "rxjs"; -import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; @@ -10,7 +10,7 @@ import { EncryptService } from "@bitwarden/common/key-management/crypto/abstract import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { FakeAccountService } from "@bitwarden/common/spec"; +import { mockAccountInfoWith, FakeAccountService } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { UserId } from "@bitwarden/common/types/guid"; import { DialogService } from "@bitwarden/components"; @@ -23,17 +23,15 @@ import { BiometricMessageHandlerService } from "./biometric-message-handler.serv const SomeUser = "SomeUser" as UserId; const AnotherUser = "SomeOtherUser" as UserId; -const accounts: Record = { - [SomeUser]: { +const accounts = { + [SomeUser]: mockAccountInfoWith({ name: "some user", email: "some.user@example.com", - emailVerified: true, - }, - [AnotherUser]: { + }), + [AnotherUser]: mockAccountInfoWith({ name: "some other user", email: "some.other.user@example.com", - emailVerified: true, - }, + }), }; describe("BiometricMessageHandlerService", () => { diff --git a/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.spec.ts b/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.spec.ts index b28a7b8c4a2..6bc0efb9e96 100644 --- a/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.spec.ts +++ b/apps/web/src/app/billing/individual/upgrade/unified-upgrade-dialog/unified-upgrade-dialog.component.spec.ts @@ -10,6 +10,7 @@ import { PersonalSubscriptionPricingTierId, PersonalSubscriptionPricingTierIds, } from "@bitwarden/common/billing/types/subscription-pricing-tier"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { DIALOG_DATA, DialogRef } from "@bitwarden/components"; @@ -63,9 +64,10 @@ describe("UnifiedUpgradeDialogComponent", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; const defaultDialogData: UnifiedUpgradeDialogParams = { diff --git a/apps/web/src/app/billing/individual/upgrade/upgrade-nav-button/upgrade-nav-button/upgrade-nav-button.component.spec.ts b/apps/web/src/app/billing/individual/upgrade/upgrade-nav-button/upgrade-nav-button/upgrade-nav-button.component.spec.ts index 787936c102e..f5df248cbbf 100644 --- a/apps/web/src/app/billing/individual/upgrade/upgrade-nav-button/upgrade-nav-button/upgrade-nav-button.component.spec.ts +++ b/apps/web/src/app/billing/individual/upgrade/upgrade-nav-button/upgrade-nav-button/upgrade-nav-button.component.spec.ts @@ -7,6 +7,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogRef, DialogService } from "@bitwarden/components"; @@ -32,9 +33,10 @@ describe("UpgradeNavButtonComponent", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; beforeEach(async () => { diff --git a/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.spec.ts b/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.spec.ts index 9d17d62e4dc..81169d719b6 100644 --- a/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.spec.ts +++ b/apps/web/src/app/billing/individual/upgrade/upgrade-payment/services/upgrade-payment.service.spec.ts @@ -13,6 +13,7 @@ import { PaymentMethodType, PlanType } from "@bitwarden/common/billing/enums"; import { PersonalSubscriptionPricingTierIds } from "@bitwarden/common/billing/types/subscription-pricing-tier"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { SyncService } from "@bitwarden/common/platform/sync"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { LogService } from "@bitwarden/logging"; @@ -46,11 +47,12 @@ describe("UpgradePaymentService", () => { let sut: UpgradePaymentService; - const mockAccount = { + const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; const mockTokenizedPaymentMethod: TokenizedPaymentMethod = { @@ -151,9 +153,10 @@ describe("UpgradePaymentService", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - name: "Test User", - emailVerified: true, + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; const paidOrgData = { @@ -203,9 +206,10 @@ describe("UpgradePaymentService", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - name: "Test User", - emailVerified: true, + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; const paidOrgData = { @@ -255,9 +259,10 @@ describe("UpgradePaymentService", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - name: "Test User", - emailVerified: true, + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; mockAccountService.activeAccount$ = of(mockAccount); @@ -289,9 +294,10 @@ describe("UpgradePaymentService", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - name: "Test User", - emailVerified: true, + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; const expectedCredit = 25.5; @@ -353,9 +359,10 @@ describe("UpgradePaymentService", () => { const mockAccount: Account = { id: "user-id" as UserId, - email: "test@example.com", - name: "Test User", - emailVerified: true, + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; const paidOrgData = { diff --git a/apps/web/src/app/dirt/reports/pages/breach-report.component.spec.ts b/apps/web/src/app/dirt/reports/pages/breach-report.component.spec.ts index 143dce3915e..886267e3189 100644 --- a/apps/web/src/app/dirt/reports/pages/breach-report.component.spec.ts +++ b/apps/web/src/app/dirt/reports/pages/breach-report.component.spec.ts @@ -10,6 +10,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BreachAccountResponse } from "@bitwarden/common/dirt/models/response/breach-account.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { BreachReportComponent } from "./breach-report.component"; @@ -38,9 +39,10 @@ describe("BreachReportComponent", () => { let accountService: MockProxy; const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); beforeEach(async () => { diff --git a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts index f4b50b4a772..c0b734f17cc 100644 --- a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts +++ b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts @@ -30,6 +30,7 @@ import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk- import { HashPurpose } from "@bitwarden/common/platform/enums"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { SendWithIdRequest } from "@bitwarden/common/tools/send/models/request/send-with-id.request"; import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction"; import { UserId } from "@bitwarden/common/types/guid"; @@ -286,9 +287,10 @@ describe("KeyRotationService", () => { const mockUser = { id: "mockUserId" as UserId, - email: "mockEmail", - emailVerified: true, - name: "mockName", + ...mockAccountInfoWith({ + email: "mockEmail", + name: "mockName", + }), }; const mockTrustedPublicKeys = [Utils.fromUtf8ToArray("test-public-key")]; diff --git a/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts b/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts index 88132e56384..ea6e972e431 100644 --- a/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts +++ b/apps/web/src/app/layouts/product-switcher/navigation-switcher/navigation-switcher.stories.ts @@ -75,11 +75,14 @@ class MockSyncService implements Partial { } class MockAccountService implements Partial { + // We can't use mockAccountInfoWith() here because we can't take a dependency on @bitwarden/common/spec. + // This is because that package relies on jest dependencies that aren't available here. activeAccount$?: Observable = of({ id: "test-user-id" as UserId, name: "Test User 1", email: "test@email.com", emailVerified: true, + creationDate: "2024-01-01T00:00:00.000Z", }); } diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts b/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts index 4581f5981e6..d412530a635 100644 --- a/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts +++ b/apps/web/src/app/layouts/product-switcher/product-switcher.stories.ts @@ -75,11 +75,14 @@ class MockSyncService implements Partial { } class MockAccountService implements Partial { + // We can't use mockAccountInfoWith() here because we can't take a dependency on @bitwarden/common/spec. + // This is because that package relies on jest dependencies that aren't available here. activeAccount$?: Observable = of({ id: "test-user-id" as UserId, name: "Test User 1", email: "test@email.com", emailVerified: true, + creationDate: "2024-01-01T00:00:00.000Z", }); } diff --git a/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts b/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts index 6b46cd89956..2ba9dd6fad4 100644 --- a/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts +++ b/apps/web/src/app/vault/individual-vault/vault-banners/services/vault-banners.service.spec.ts @@ -2,14 +2,18 @@ import { TestBed } from "@angular/core/testing"; import { BehaviorSubject, firstValueFrom, take, timeout } from "rxjs"; import { AuthRequestServiceAbstraction } from "@bitwarden/auth/common"; -import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { DeviceType } from "@bitwarden/common/enums"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { StateProvider } from "@bitwarden/common/platform/state"; -import { FakeStateProvider, mockAccountServiceWith } from "@bitwarden/common/spec"; +import { + FakeStateProvider, + mockAccountServiceWith, + mockAccountInfoWith, +} from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; @@ -27,8 +31,11 @@ describe("VaultBannersService", () => { const fakeStateProvider = new FakeStateProvider(mockAccountServiceWith(userId)); const getEmailVerified = jest.fn().mockResolvedValue(true); const lastSync$ = new BehaviorSubject(null); - const accounts$ = new BehaviorSubject>({ - [userId]: { email: "test@bitwarden.com", emailVerified: true, name: "name" } as AccountInfo, + const accounts$ = new BehaviorSubject({ + [userId]: mockAccountInfoWith({ + email: "test@bitwarden.com", + name: "name", + }), }); const pendingAuthRequests$ = new BehaviorSubject>([]); diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts index a0a881dbad7..99d54eedc29 100644 --- a/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts +++ b/bitwarden_license/bit-web/src/app/admin-console/providers/guards/provider-permissions.guard.spec.ts @@ -10,6 +10,7 @@ import { ProviderUserType } from "@bitwarden/common/admin-console/enums"; import { Provider } from "@bitwarden/common/admin-console/models/domain/provider"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { ToastService } from "@bitwarden/components"; import { newGuid } from "@bitwarden/guid"; @@ -41,9 +42,10 @@ describe("Provider Permissions Guard", () => { accountService.activeAccount$ = of({ id: mockUserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); route = mock({ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts index 056f7cfe255..606cb835ff1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts @@ -6,6 +6,7 @@ import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { OrgKey } from "@bitwarden/common/types/key"; @@ -37,9 +38,11 @@ describe("SecretService", () => { let accountService: MockProxy = mock(); const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + emailVerified: true, + }), }); beforeEach(() => { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts index a4f77e6de0b..aa722e31681 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.spec.ts @@ -7,6 +7,7 @@ import { EncryptService } from "@bitwarden/common/key-management/crypto/abstract import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { CsprngArray } from "@bitwarden/common/types/csprng"; import { OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { OrgKey } from "@bitwarden/common/types/key"; @@ -38,9 +39,11 @@ describe("SecretsManagerPortingApiService", () => { let accountService: MockProxy; const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + emailVerified: true, + }), }); beforeEach(() => { diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts index 37a0dc06837..903bfd35122 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts @@ -31,7 +31,7 @@ import { PeopleAccessPoliciesRequest } from "./models/requests/people-access-pol import { ProjectServiceAccountsAccessPoliciesRequest } from "./models/requests/project-service-accounts-access-policies.request"; import { ServiceAccountGrantedPoliciesRequest } from "./models/requests/service-account-granted-policies.request"; -import { trackEmissions } from "@bitwarden/common/../spec"; +import { trackEmissions, mockAccountInfoWith } from "@bitwarden/common/../spec"; const SomeCsprngArray = new Uint8Array(64) as CsprngArray; const SomeOrganization = "some organization" as OrganizationId; @@ -52,9 +52,10 @@ describe("AccessPolicyService", () => { let accountService: MockProxy; const activeAccountSubject = new BehaviorSubject<{ id: UserId } & AccountInfo>({ id: "testId" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); beforeEach(() => { diff --git a/libs/angular/src/auth/guards/auth.guard.spec.ts b/libs/angular/src/auth/guards/auth.guard.spec.ts index fccfcd58874..335e31ec4d8 100644 --- a/libs/angular/src/auth/guards/auth.guard.spec.ts +++ b/libs/angular/src/auth/guards/auth.guard.spec.ts @@ -5,11 +5,7 @@ import { MockProxy, mock } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.guard.spec"; -import { - Account, - AccountInfo, - AccountService, -} from "@bitwarden/common/auth/abstractions/account.service"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ForceSetPasswordReason } from "@bitwarden/common/auth/models/domain/force-set-password-reason"; @@ -18,6 +14,7 @@ import { KeyConnectorService } from "@bitwarden/common/key-management/key-connec import { MasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { authGuard } from "./auth.guard"; @@ -38,16 +35,13 @@ describe("AuthGuard", () => { const accountService: MockProxy = mock(); const activeAccountSubject = new BehaviorSubject(null); accountService.activeAccount$ = activeAccountSubject; - activeAccountSubject.next( - Object.assign( - { - name: "Test User 1", - email: "test@email.com", - emailVerified: true, - } as AccountInfo, - { id: "test-id" as UserId }, - ), - ); + activeAccountSubject.next({ + id: "test-id" as UserId, + ...mockAccountInfoWith({ + name: "Test User 1", + email: "test@email.com", + }), + }); if (featureFlag) { configService.getFeatureFlag.mockResolvedValue(true); diff --git a/libs/angular/src/auth/guards/lock.guard.spec.ts b/libs/angular/src/auth/guards/lock.guard.spec.ts index da89ee786b7..af36df06097 100644 --- a/libs/angular/src/auth/guards/lock.guard.spec.ts +++ b/libs/angular/src/auth/guards/lock.guard.spec.ts @@ -5,11 +5,7 @@ import { MockProxy, mock } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.guard.spec"; -import { - Account, - AccountInfo, - AccountService, -} from "@bitwarden/common/auth/abstractions/account.service"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -20,6 +16,7 @@ import { KeyConnectorDomainConfirmation } from "@bitwarden/common/key-management import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -68,16 +65,13 @@ describe("lockGuard", () => { const accountService: MockProxy = mock(); const activeAccountSubject = new BehaviorSubject(null); accountService.activeAccount$ = activeAccountSubject; - activeAccountSubject.next( - Object.assign( - { - name: "Test User 1", - email: "test@email.com", - emailVerified: true, - } as AccountInfo, - { id: "test-id" as UserId }, - ), - ); + activeAccountSubject.next({ + id: "test-id" as UserId, + ...mockAccountInfoWith({ + name: "Test User 1", + email: "test@email.com", + }), + }); const testBed = TestBed.configureTestingModule({ imports: [ diff --git a/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts b/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts index 004499beede..6dc91fbb925 100644 --- a/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts +++ b/libs/angular/src/auth/guards/redirect-to-vault-if-unlocked/redirect-to-vault-if-unlocked.guard.spec.ts @@ -7,6 +7,7 @@ import { EmptyComponent } from "@bitwarden/angular/platform/guard/feature-flag.g import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { redirectToVaultIfUnlockedGuard } from "./redirect-to-vault-if-unlocked.guard"; @@ -14,9 +15,10 @@ import { redirectToVaultIfUnlockedGuard } from "./redirect-to-vault-if-unlocked. describe("redirectToVaultIfUnlockedGuard", () => { const activeUser: Account = { id: "userId" as UserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }; const setup = (activeUser: Account | null, authStatus: AuthenticationStatus | null) => { diff --git a/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts b/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts index 4408452a2a2..17df6d1d76b 100644 --- a/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts +++ b/libs/angular/src/auth/guards/tde-decryption-required.guard.spec.ts @@ -9,6 +9,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -17,9 +18,10 @@ import { tdeDecryptionRequiredGuard } from "./tde-decryption-required.guard"; describe("tdeDecryptionRequiredGuard", () => { const activeUser: Account = { id: "fake_user_id" as UserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }; const setup = ( diff --git a/libs/angular/src/auth/guards/unauth.guard.spec.ts b/libs/angular/src/auth/guards/unauth.guard.spec.ts index c696b849558..284f595f81a 100644 --- a/libs/angular/src/auth/guards/unauth.guard.spec.ts +++ b/libs/angular/src/auth/guards/unauth.guard.spec.ts @@ -10,6 +10,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { DeviceTrustServiceAbstraction } from "@bitwarden/common/key-management/device-trust/abstractions/device-trust.service.abstraction"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -18,9 +19,10 @@ import { unauthGuardFn } from "./unauth.guard"; describe("UnauthGuard", () => { const activeUser: Account = { id: "fake_user_id" as UserId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + }), }; const setup = ( diff --git a/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts b/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts index b21264eb7c8..4dc7522c1b8 100644 --- a/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts +++ b/libs/angular/src/auth/login-approval/login-approval-dialog.component.spec.ts @@ -11,6 +11,7 @@ import { DevicesServiceAbstraction } from "@bitwarden/common/auth/abstractions/d import { AuthRequestResponse } from "@bitwarden/common/auth/models/response/auth-request.response"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { DialogRef, DIALOG_DATA, ToastService } from "@bitwarden/components"; import { LogService } from "@bitwarden/logging"; @@ -48,10 +49,11 @@ describe("LoginApprovalDialogComponent", () => { validationService = mock(); accountService.activeAccount$ = of({ - email: testEmail, id: "test-user-id" as UserId, - emailVerified: true, - name: null, + ...mockAccountInfoWith({ + email: testEmail, + name: null, + }), }); await TestBed.configureTestingModule({ diff --git a/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts b/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts index d14e33c1fdc..5dfc5ffa245 100644 --- a/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts +++ b/libs/angular/src/auth/password-management/change-password/default-change-password.service.spec.ts @@ -8,6 +8,7 @@ import { MasterPasswordApiService } from "@bitwarden/common/auth/abstractions/ma import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { MasterKey, UserKey } from "@bitwarden/common/types/key"; import { KeyService, PBKDF2KdfConfig } from "@bitwarden/key-management"; @@ -26,9 +27,11 @@ describe("DefaultChangePasswordService", () => { const user: Account = { id: userId, - email: "email", - emailVerified: false, - name: "name", + ...mockAccountInfoWith({ + email: "email", + name: "name", + emailVerified: false, + }), }; const passwordInputResult: PasswordInputResult = { diff --git a/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts b/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts index 76cfbc0bfdd..610ec5923eb 100644 --- a/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts +++ b/libs/angular/src/key-management/encrypted-migration/encrypted-migrations-scheduler.service.spec.ts @@ -2,14 +2,13 @@ import { Router } from "@angular/router"; import { mock } from "jest-mock-extended"; import { of } from "rxjs"; -import { AccountInfo } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { EncryptedMigrator } from "@bitwarden/common/key-management/encrypted-migrator/encrypted-migrator.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { SingleUserState, StateProvider } from "@bitwarden/common/platform/state"; import { SyncService } from "@bitwarden/common/platform/sync"; -import { FakeAccountService } from "@bitwarden/common/spec"; +import { mockAccountInfoWith, FakeAccountService } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { DialogService, ToastService } from "@bitwarden/components"; import { LogService } from "@bitwarden/logging"; @@ -22,17 +21,15 @@ import { PromptMigrationPasswordComponent } from "./prompt-migration-password.co const SomeUser = "SomeUser" as UserId; const AnotherUser = "SomeOtherUser" as UserId; -const accounts: Record = { - [SomeUser]: { +const accounts = { + [SomeUser]: mockAccountInfoWith({ name: "some user", email: "some.user@example.com", - emailVerified: true, - }, - [AnotherUser]: { + }), + [AnotherUser]: mockAccountInfoWith({ name: "some other user", email: "some.other.user@example.com", - emailVerified: true, - }, + }), }; describe("DefaultEncryptedMigrationsSchedulerService", () => { diff --git a/libs/auth/src/common/login-strategies/login.strategy.ts b/libs/auth/src/common/login-strategies/login.strategy.ts index ae375c8b2f5..acb32969f08 100644 --- a/libs/auth/src/common/login-strategies/login.strategy.ts +++ b/libs/auth/src/common/login-strategies/login.strategy.ts @@ -189,6 +189,7 @@ export abstract class LoginStrategy { name: accountInformation.name, email: accountInformation.email ?? "", emailVerified: accountInformation.email_verified ?? false, + creationDate: undefined, // We don't get a creation date in the token. See https://bitwarden.atlassian.net/browse/PM-29551 for consolidation plans. }); // User env must be seeded from currently set env before switching to the account diff --git a/libs/auth/src/common/services/accounts/lock.services.spec.ts b/libs/auth/src/common/services/accounts/lock.services.spec.ts index e22a6f71581..41e3768d80b 100644 --- a/libs/auth/src/common/services/accounts/lock.services.spec.ts +++ b/libs/auth/src/common/services/accounts/lock.services.spec.ts @@ -8,7 +8,7 @@ import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key- import { VaultTimeoutSettingsService } from "@bitwarden/common/key-management/vault-timeout"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { SystemService } from "@bitwarden/common/platform/abstractions/system.service"; -import { mockAccountServiceWith } from "@bitwarden/common/spec"; +import { mockAccountServiceWith, mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -79,17 +79,21 @@ describe("DefaultLockService", () => { ); it("locks the active account last", async () => { - await accountService.addAccount(mockUser2, { - name: "name2", - email: "email2@example.com", - emailVerified: false, - }); + await accountService.addAccount( + mockUser2, + mockAccountInfoWith({ + name: "name2", + email: "email2@example.com", + }), + ); - await accountService.addAccount(mockUser3, { - name: "name3", - email: "name3@example.com", - emailVerified: false, - }); + await accountService.addAccount( + mockUser3, + mockAccountInfoWith({ + name: "name3", + email: "name3@example.com", + }), + ); const lockSpy = jest.spyOn(sut, "lock").mockResolvedValue(undefined); diff --git a/libs/common/spec/fake-account-service.ts b/libs/common/spec/fake-account-service.ts index 389975dc2e1..ed8b7796966 100644 --- a/libs/common/spec/fake-account-service.ts +++ b/libs/common/spec/fake-account-service.ts @@ -6,19 +6,26 @@ import { ReplaySubject, combineLatest, map, Observable } from "rxjs"; import { Account, AccountInfo, AccountService } from "../src/auth/abstractions/account.service"; import { UserId } from "../src/types/guid"; +/** + * Creates a mock AccountInfo object with sensible defaults that can be overridden. + * Use this when you need just an AccountInfo object in tests. + */ +export function mockAccountInfoWith(info: Partial = {}): AccountInfo { + return { + name: "name", + email: "email", + emailVerified: true, + creationDate: "2024-01-01T00:00:00.000Z", + ...info, + }; +} + export function mockAccountServiceWith( userId: UserId, info: Partial = {}, activity: Record = {}, ): FakeAccountService { - const fullInfo: AccountInfo = { - ...info, - ...{ - name: "name", - email: "email", - emailVerified: true, - }, - }; + const fullInfo = mockAccountInfoWith(info); const fullActivity = { [userId]: new Date(), ...activity }; @@ -104,6 +111,10 @@ export class FakeAccountService implements AccountService { await this.mock.setAccountEmailVerified(userId, emailVerified); } + async setAccountCreationDate(userId: UserId, creationDate: string): Promise { + await this.mock.setAccountCreationDate(userId, creationDate); + } + async switchAccount(userId: UserId): Promise { const next = userId == null ? null : { id: userId, ...this.accountsSubject["_buffer"]?.[0]?.[userId] }; @@ -127,4 +138,5 @@ const loggedOutInfo: AccountInfo = { name: undefined, email: "", emailVerified: false, + creationDate: undefined, }; diff --git a/libs/common/src/auth/abstractions/account.service.ts b/libs/common/src/auth/abstractions/account.service.ts index 8b0280feb01..78822f3ebd5 100644 --- a/libs/common/src/auth/abstractions/account.service.ts +++ b/libs/common/src/auth/abstractions/account.service.ts @@ -2,14 +2,11 @@ import { Observable } from "rxjs"; import { UserId } from "../../types/guid"; -/** - * Holds information about an account for use in the AccountService - * if more information is added, be sure to update the equality method. - */ export type AccountInfo = { email: string; emailVerified: boolean; name: string | undefined; + creationDate: string | undefined; }; export type Account = { id: UserId } & AccountInfo; @@ -75,6 +72,12 @@ export abstract class AccountService { * @param emailVerified */ abstract setAccountEmailVerified(userId: UserId, emailVerified: boolean): Promise; + /** + * updates the `accounts$` observable with the creation date for the account. + * @param userId + * @param creationDate + */ + abstract setAccountCreationDate(userId: UserId, creationDate: string): Promise; /** * updates the `accounts$` observable with the new VerifyNewDeviceLogin property for the account. * @param userId diff --git a/libs/common/src/auth/services/account.service.spec.ts b/libs/common/src/auth/services/account.service.spec.ts index 3e3c878eaac..f517b61ffb6 100644 --- a/libs/common/src/auth/services/account.service.spec.ts +++ b/libs/common/src/auth/services/account.service.spec.ts @@ -6,6 +6,7 @@ import { MockProxy, mock } from "jest-mock-extended"; import { firstValueFrom } from "rxjs"; +import { mockAccountInfoWith } from "../../../spec/fake-account-service"; import { FakeGlobalState } from "../../../spec/fake-state"; import { FakeGlobalStateProvider, @@ -27,7 +28,7 @@ import { } from "./account.service"; describe("accountInfoEqual", () => { - const accountInfo: AccountInfo = { name: "name", email: "email", emailVerified: true }; + const accountInfo = mockAccountInfoWith(); it("compares nulls", () => { expect(accountInfoEqual(null, null)).toBe(true); @@ -64,6 +65,23 @@ describe("accountInfoEqual", () => { expect(accountInfoEqual(accountInfo, same)).toBe(true); expect(accountInfoEqual(accountInfo, different)).toBe(false); }); + + it("compares creationDate", () => { + const same = { ...accountInfo }; + const different = { ...accountInfo, creationDate: "2024-12-31T00:00:00.000Z" }; + + expect(accountInfoEqual(accountInfo, same)).toBe(true); + expect(accountInfoEqual(accountInfo, different)).toBe(false); + }); + + it("compares undefined creationDate", () => { + const accountWithoutCreationDate = mockAccountInfoWith({ creationDate: undefined }); + const same = { ...accountWithoutCreationDate }; + const different = { ...accountWithoutCreationDate, creationDate: "2024-01-01T00:00:00.000Z" }; + + expect(accountInfoEqual(accountWithoutCreationDate, same)).toBe(true); + expect(accountInfoEqual(accountWithoutCreationDate, different)).toBe(false); + }); }); describe("accountService", () => { @@ -76,7 +94,10 @@ describe("accountService", () => { let activeAccountIdState: FakeGlobalState; let accountActivityState: FakeGlobalState>; const userId = Utils.newGuid() as UserId; - const userInfo = { email: "email", name: "name", emailVerified: true }; + const userInfo = mockAccountInfoWith({ + email: "email", + name: "name", + }); beforeEach(() => { messagingService = mock(); @@ -253,6 +274,56 @@ describe("accountService", () => { }); }); + describe("setCreationDate", () => { + const initialState = { [userId]: userInfo }; + beforeEach(() => { + accountsState.stateSubject.next(initialState); + }); + + it("should update the account with a new creation date", async () => { + const newCreationDate = "2024-12-31T00:00:00.000Z"; + await sut.setAccountCreationDate(userId, newCreationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual({ + [userId]: { ...userInfo, creationDate: newCreationDate }, + }); + }); + + it("should not update if the creation date is the same", async () => { + await sut.setAccountCreationDate(userId, userInfo.creationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual(initialState); + }); + + it("should update from undefined to a defined creation date", async () => { + const accountWithoutCreationDate = mockAccountInfoWith({ + ...userInfo, + creationDate: undefined, + }); + accountsState.stateSubject.next({ [userId]: accountWithoutCreationDate }); + + const newCreationDate = "2024-06-15T12:30:00.000Z"; + await sut.setAccountCreationDate(userId, newCreationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual({ + [userId]: { ...accountWithoutCreationDate, creationDate: newCreationDate }, + }); + }); + + it("should update to a different creation date string format", async () => { + const newCreationDate = "2023-03-15T08:45:30.123Z"; + await sut.setAccountCreationDate(userId, newCreationDate); + const currentState = await firstValueFrom(accountsState.state$); + + expect(currentState).toEqual({ + [userId]: { ...userInfo, creationDate: newCreationDate }, + }); + }); + }); + describe("setAccountVerifyNewDeviceLogin", () => { const initialState = true; beforeEach(() => { @@ -294,6 +365,7 @@ describe("accountService", () => { email: "", emailVerified: false, name: undefined, + creationDate: undefined, }, }); }); diff --git a/libs/common/src/auth/services/account.service.ts b/libs/common/src/auth/services/account.service.ts index fb4b590ce77..1b028d1eba9 100644 --- a/libs/common/src/auth/services/account.service.ts +++ b/libs/common/src/auth/services/account.service.ts @@ -62,6 +62,7 @@ const LOGGED_OUT_INFO: AccountInfo = { email: "", emailVerified: false, name: undefined, + creationDate: undefined, }; /** @@ -167,6 +168,10 @@ export class AccountServiceImplementation implements InternalAccountService { await this.setAccountInfo(userId, { emailVerified }); } + async setAccountCreationDate(userId: UserId, creationDate: string): Promise { + await this.setAccountInfo(userId, { creationDate }); + } + async clean(userId: UserId) { await this.setAccountInfo(userId, LOGGED_OUT_INFO); await this.removeAccountActivity(userId); diff --git a/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts b/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts index 0b12e1cb661..a44dde04f5f 100644 --- a/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts +++ b/libs/common/src/auth/services/auth-request-answering/auth-request-answering.service.spec.ts @@ -15,6 +15,7 @@ import { SystemNotificationEvent, SystemNotificationsService, } from "@bitwarden/common/platform/system-notifications/system-notifications.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/user-core"; import { AuthRequestAnsweringService } from "./auth-request-answering.service"; @@ -48,14 +49,16 @@ describe("AuthRequestAnsweringService", () => { // Common defaults authService.activeAccountStatus$ = of(AuthenticationStatus.Locked); - accountService.activeAccount$ = of({ - id: userId, + const accountInfo = mockAccountInfoWith({ email: "user@example.com", - emailVerified: true, name: "User", }); + accountService.activeAccount$ = of({ + id: userId, + ...accountInfo, + }); accountService.accounts$ = of({ - [userId]: { email: "user@example.com", emailVerified: true, name: "User" }, + [userId]: accountInfo, }); (masterPasswordService.forceSetPasswordReason$ as jest.Mock).mockReturnValue( of(ForceSetPasswordReason.None), diff --git a/libs/common/src/auth/services/auth.service.spec.ts b/libs/common/src/auth/services/auth.service.spec.ts index 5dcb8c372e5..c7ff55e6bb1 100644 --- a/libs/common/src/auth/services/auth.service.spec.ts +++ b/libs/common/src/auth/services/auth.service.spec.ts @@ -10,6 +10,7 @@ import { makeStaticByteArray, mockAccountServiceWith, trackEmissions, + mockAccountInfoWith, } from "../../../spec"; import { ApiService } from "../../abstractions/api.service"; import { MessagingService } from "../../platform/abstractions/messaging.service"; @@ -58,9 +59,10 @@ describe("AuthService", () => { const accountInfo = { status: AuthenticationStatus.Unlocked, id: userId, - email: "email", - emailVerified: false, - name: "name", + ...mockAccountInfoWith({ + email: "email", + name: "name", + }), }; beforeEach(() => { @@ -112,9 +114,10 @@ describe("AuthService", () => { const accountInfo2 = { status: AuthenticationStatus.Unlocked, id: Utils.newGuid() as UserId, - email: "email2", - emailVerified: false, - name: "name2", + ...mockAccountInfoWith({ + email: "email2", + name: "name2", + }), }; const emissions = trackEmissions(sut.activeAccountStatus$); @@ -131,11 +134,13 @@ describe("AuthService", () => { it("requests auth status for all known users", async () => { const userId2 = Utils.newGuid() as UserId; - await accountService.addAccount(userId2, { - email: "email2", - emailVerified: false, - name: "name2", - }); + await accountService.addAccount( + userId2, + mockAccountInfoWith({ + email: "email2", + name: "name2", + }), + ); const mockFn = jest.fn().mockReturnValue(of(AuthenticationStatus.Locked)); sut.authStatusFor$ = mockFn; diff --git a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts index 7e6e0d53f57..693992d4c4a 100644 --- a/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts +++ b/libs/common/src/auth/services/password-reset-enrollment.service.implementation.spec.ts @@ -8,12 +8,13 @@ import { OrganizationUserApiService } from "@bitwarden/admin-console/common"; // eslint-disable-next-line no-restricted-imports import { KeyService } from "@bitwarden/key-management"; +import { mockAccountInfoWith } from "../../../spec/fake-account-service"; import { OrganizationApiServiceAbstraction } from "../../admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationAutoEnrollStatusResponse } from "../../admin-console/models/response/organization-auto-enroll-status.response"; import { EncryptService } from "../../key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "../../platform/abstractions/i18n.service"; import { UserId } from "../../types/guid"; -import { Account, AccountInfo, AccountService } from "../abstractions/account.service"; +import { Account, AccountService } from "../abstractions/account.service"; import { PasswordResetEnrollmentServiceImplementation } from "./password-reset-enrollment.service.implementation"; @@ -96,11 +97,10 @@ describe("PasswordResetEnrollmentServiceImplementation", () => { const encryptedKey = { encryptedString: "encryptedString" }; organizationApiService.getKeys.mockResolvedValue(orgKeyResponse as any); - const user1AccountInfo: AccountInfo = { + const user1AccountInfo = mockAccountInfoWith({ name: "Test User 1", email: "test1@email.com", - emailVerified: true, - }; + }); activeAccountSubject.next(Object.assign(user1AccountInfo, { id: "userId" as UserId })); keyService.userKey$.mockReturnValue(of({ key: "key" } as any)); diff --git a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts index 51eec18f173..8f7f93f368c 100644 --- a/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts +++ b/libs/common/src/key-management/vault-timeout/services/vault-timeout.service.spec.ts @@ -7,7 +7,7 @@ import { BehaviorSubject, from, of } from "rxjs"; // eslint-disable-next-line no-restricted-imports import { LockService, LogoutService } from "@bitwarden/auth/common"; -import { FakeAccountService, mockAccountServiceWith } from "../../../../spec"; +import { FakeAccountService, mockAccountServiceWith, mockAccountInfoWith } from "../../../../spec"; import { AccountInfo } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; @@ -109,19 +109,19 @@ describe("VaultTimeoutService", () => { if (globalSetups?.userId) { accountService.activeAccountSubject.next({ id: globalSetups.userId as UserId, - email: null, - emailVerified: false, - name: null, + ...mockAccountInfoWith({ + email: null, + name: null, + }), }); } accountService.accounts$ = of( Object.entries(accounts).reduce( (agg, [id]) => { - agg[id] = { + agg[id] = mockAccountInfoWith({ email: "", - emailVerified: true, name: "", - }; + }); return agg; }, {} as Record, diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts index cd1bf97150c..46178f62a07 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.multiuser.spec.ts @@ -7,6 +7,7 @@ import { InternalPolicyService } from "@bitwarden/common/admin-console/abstracti import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { mockAccountInfoWith } from "../../../../spec"; import { AccountService } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; import { AuthenticationStatus } from "../../../auth/enums/authentication-status"; @@ -163,9 +164,10 @@ describe("DefaultServerNotificationsService (multi-user)", () => { } else { activeUserAccount$.next({ id: userId, - email: "email", - name: "Test Name", - emailVerified: true, + ...mockAccountInfoWith({ + email: "email", + name: "Test Name", + }), }); } } @@ -174,7 +176,10 @@ describe("DefaultServerNotificationsService (multi-user)", () => { const currentAccounts = (userAccounts$.getValue() as Record) ?? {}; userAccounts$.next({ ...currentAccounts, - [userId]: { email: "email", name: "Test Name", emailVerified: true }, + [userId]: mockAccountInfoWith({ + email: "email", + name: "Test Name", + }), } as any); } diff --git a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts index 4a9b0809ac9..9c84981b7f9 100644 --- a/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts +++ b/libs/common/src/platform/server-notifications/internal/default-server-notifications.service.spec.ts @@ -8,7 +8,7 @@ import { InternalPolicyService } from "@bitwarden/common/admin-console/abstracti import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AuthRequestAnsweringServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth-request-answering/auth-request-answering.service.abstraction"; -import { awaitAsync } from "../../../../spec"; +import { awaitAsync, mockAccountInfoWith } from "../../../../spec"; import { Matrix } from "../../../../spec/matrix"; import { AccountService } from "../../../auth/abstractions/account.service"; import { AuthService } from "../../../auth/abstractions/auth.service"; @@ -139,11 +139,18 @@ describe("NotificationsService", () => { activeAccount.next(null); accounts.next({} as any); } else { - activeAccount.next({ id: userId, email: "email", name: "Test Name", emailVerified: true }); + const accountInfo = mockAccountInfoWith({ + email: "email", + name: "Test Name", + }); + activeAccount.next({ + id: userId, + ...accountInfo, + }); const current = (accounts.getValue() as Record) ?? {}; accounts.next({ ...current, - [userId]: { email: "email", name: "Test Name", emailVerified: true }, + [userId]: accountInfo, } as any); } } @@ -349,7 +356,13 @@ describe("NotificationsService", () => { describe("processNotification", () => { beforeEach(async () => { appIdService.getAppId.mockResolvedValue("test-app-id"); - activeAccount.next({ id: mockUser1, email: "email", name: "Test Name", emailVerified: true }); + activeAccount.next({ + id: mockUser1, + ...mockAccountInfoWith({ + email: "email", + name: "Test Name", + }), + }); }); describe("NotificationType.LogOut", () => { diff --git a/libs/common/src/platform/services/default-environment.service.spec.ts b/libs/common/src/platform/services/default-environment.service.spec.ts index 553f80f83b8..9e8a41616a3 100644 --- a/libs/common/src/platform/services/default-environment.service.spec.ts +++ b/libs/common/src/platform/services/default-environment.service.spec.ts @@ -1,6 +1,6 @@ import { firstValueFrom } from "rxjs"; -import { FakeStateProvider, awaitAsync } from "../../../spec"; +import { FakeStateProvider, awaitAsync, mockAccountInfoWith } from "../../../spec"; import { FakeAccountService } from "../../../spec/fake-account-service"; import { UserId } from "../../types/guid"; import { CloudRegion, Region } from "../abstractions/environment.service"; @@ -28,16 +28,14 @@ describe("EnvironmentService", () => { beforeEach(async () => { accountService = new FakeAccountService({ - [testUser]: { + [testUser]: mockAccountInfoWith({ name: "name", email: "email", - emailVerified: false, - }, - [alternateTestUser]: { + }), + [alternateTestUser]: mockAccountInfoWith({ name: "name", email: "email", - emailVerified: false, - }, + }), }); stateProvider = new FakeStateProvider(accountService); @@ -47,9 +45,10 @@ describe("EnvironmentService", () => { const switchUser = async (userId: UserId) => { accountService.activeAccountSubject.next({ id: userId, - email: "test@example.com", - name: `Test Name ${userId}`, - emailVerified: false, + ...mockAccountInfoWith({ + email: "test@example.com", + name: `Test Name ${userId}`, + }), }); await awaitAsync(); }; diff --git a/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts b/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts index fef64399b40..9c50bd1ab65 100644 --- a/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts +++ b/libs/common/src/platform/services/fido2/fido2-authenticator.service.spec.ts @@ -3,7 +3,7 @@ import { TextEncoder } from "util"; import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, of } from "rxjs"; -import { mockAccountServiceWith } from "../../../../spec"; +import { mockAccountServiceWith, mockAccountInfoWith } from "../../../../spec"; import { Account } from "../../../auth/abstractions/account.service"; import { CipherId, UserId } from "../../../types/guid"; import { CipherService, EncryptionContext } from "../../../vault/abstractions/cipher.service"; @@ -40,9 +40,10 @@ describe("FidoAuthenticatorService", () => { const userId = "testId" as UserId; const activeAccountSubject = new BehaviorSubject({ id: userId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); let cipherService!: MockProxy; diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts index 1286ea7b7f9..fb9c1fae77e 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts @@ -12,9 +12,9 @@ import { FakeAccountService, FakeStateProvider, mockAccountServiceWith, + mockAccountInfoWith, } from "../../../../spec"; import { ApiService } from "../../../abstractions/api.service"; -import { AccountInfo } from "../../../auth/abstractions/account.service"; import { EncryptedString } from "../../../key-management/crypto/models/enc-string"; import { UserId } from "../../../types/guid"; import { UserKey } from "../../../types/key"; @@ -92,7 +92,10 @@ describe("DefaultSdkService", () => { .calledWith(userId) .mockReturnValue(new BehaviorSubject(mock())); accountService.accounts$ = of({ - [userId]: { email: "email", emailVerified: true, name: "name" } as AccountInfo, + [userId]: mockAccountInfoWith({ + email: "email", + name: "name", + }), }); kdfConfigService.getKdfConfig$ .calledWith(userId) diff --git a/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts index 0a05ac8dbf4..1f4d086f729 100644 --- a/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/register-sdk.service.spec.ts @@ -8,9 +8,9 @@ import { FakeAccountService, FakeStateProvider, mockAccountServiceWith, + mockAccountInfoWith, } from "../../../../spec"; import { ApiService } from "../../../abstractions/api.service"; -import { AccountInfo } from "../../../auth/abstractions/account.service"; import { UserId } from "../../../types/guid"; import { ConfigService } from "../../abstractions/config/config.service"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; @@ -76,7 +76,10 @@ describe("DefaultRegisterSdkService", () => { .calledWith(userId) .mockReturnValue(new BehaviorSubject(mock())); accountService.accounts$ = of({ - [userId]: { email: "email", emailVerified: true, name: "name" } as AccountInfo, + [userId]: mockAccountInfoWith({ + email: "email", + name: "name", + }), }); }); @@ -125,7 +128,10 @@ describe("DefaultRegisterSdkService", () => { it("destroys the internal SDK client when the account is removed (logout)", async () => { const accounts$ = new BehaviorSubject({ - [userId]: { email: "email", emailVerified: true, name: "name" } as AccountInfo, + [userId]: mockAccountInfoWith({ + email: "email", + name: "name", + }), }); accountService.accounts$ = accounts$; diff --git a/libs/common/src/platform/sync/default-sync.service.ts b/libs/common/src/platform/sync/default-sync.service.ts index 910702bddd0..8d2ccaffa18 100644 --- a/libs/common/src/platform/sync/default-sync.service.ts +++ b/libs/common/src/platform/sync/default-sync.service.ts @@ -272,6 +272,7 @@ export class DefaultSyncService extends CoreSyncService { await this.tokenService.setSecurityStamp(response.securityStamp, response.id); await this.accountService.setAccountEmailVerified(response.id, response.emailVerified); await this.accountService.setAccountVerifyNewDeviceLogin(response.id, response.verifyDevices); + await this.accountService.setAccountCreationDate(response.id, response.creationDate); await this.billingAccountProfileStateService.setHasPremium( response.premiumPersonally, diff --git a/libs/common/src/services/api.service.spec.ts b/libs/common/src/services/api.service.spec.ts index 1fb8f86697f..9ab84ecb16b 100644 --- a/libs/common/src/services/api.service.spec.ts +++ b/libs/common/src/services/api.service.spec.ts @@ -6,6 +6,7 @@ import { ObservedValueOf, of } from "rxjs"; import { LogoutReason } from "@bitwarden/auth/common"; import { UserId } from "@bitwarden/user-core"; +import { mockAccountInfoWith } from "../../spec"; import { AccountService } from "../auth/abstractions/account.service"; import { TokenService } from "../auth/abstractions/token.service"; import { DeviceType } from "../enums"; @@ -55,9 +56,10 @@ describe("ApiService", () => { accountService.activeAccount$ = of({ id: testActiveUser, - email: "user1@example.com", - emailVerified: true, - name: "Test Name", + ...mockAccountInfoWith({ + email: "user1@example.com", + name: "Test Name", + }), } satisfies ObservedValueOf); httpOperations = mock(); diff --git a/libs/common/src/tools/extension/extension.service.spec.ts b/libs/common/src/tools/extension/extension.service.spec.ts index 9959488feca..c0dec8728fe 100644 --- a/libs/common/src/tools/extension/extension.service.spec.ts +++ b/libs/common/src/tools/extension/extension.service.spec.ts @@ -1,7 +1,12 @@ import { mock } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom } from "rxjs"; -import { FakeAccountService, FakeStateProvider, awaitAsync } from "../../../spec"; +import { + FakeAccountService, + FakeStateProvider, + awaitAsync, + mockAccountInfoWith, +} from "../../../spec"; import { Account } from "../../auth/abstractions/account.service"; import { EXTENSION_DISK, UserKeyDefinition } from "../../platform/state"; import { UserId } from "../../types/guid"; @@ -21,9 +26,10 @@ import { SimpleLogin } from "./vendor/simplelogin"; const SomeUser = "some user" as UserId; const SomeAccount = { id: SomeUser, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; const SomeAccount$ = new BehaviorSubject(SomeAccount); diff --git a/libs/common/src/tools/send/services/send.service.spec.ts b/libs/common/src/tools/send/services/send.service.spec.ts index 96fb2f43c88..397ae905e31 100644 --- a/libs/common/src/tools/send/services/send.service.spec.ts +++ b/libs/common/src/tools/send/services/send.service.spec.ts @@ -11,6 +11,7 @@ import { FakeStateProvider, awaitAsync, mockAccountServiceWith, + mockAccountInfoWith, } from "../../../../spec"; import { KeyGenerationService } from "../../../key-management/crypto"; import { EncryptService } from "../../../key-management/crypto/abstractions/encrypt.service"; @@ -71,9 +72,10 @@ describe("SendService", () => { accountService.activeAccountSubject.next({ id: mockUserId, - email: "email", - emailVerified: false, - name: "name", + ...mockAccountInfoWith({ + email: "email", + name: "name", + }), }); // Initial encrypted state diff --git a/libs/common/src/tools/state/user-state-subject.spec.ts b/libs/common/src/tools/state/user-state-subject.spec.ts index a6d452d37fd..b88c358b6ab 100644 --- a/libs/common/src/tools/state/user-state-subject.spec.ts +++ b/libs/common/src/tools/state/user-state-subject.spec.ts @@ -6,6 +6,7 @@ import { awaitAsync, FakeAccountService, FakeStateProvider, + mockAccountInfoWith, ObservableTracker, } from "../../../spec"; import { Account } from "../../auth/abstractions/account.service"; @@ -23,17 +24,19 @@ import { UserStateSubject } from "./user-state-subject"; const SomeUser = "some user" as UserId; const SomeAccount = { id: SomeUser, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; const SomeAccount$ = new BehaviorSubject(SomeAccount); const SomeOtherAccount = { id: "some other user" as UserId, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; type TestType = { foo: string }; diff --git a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts index 6e98b21977d..fdf92cac751 100644 --- a/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts +++ b/libs/importer/src/importers/bitwarden/bitwarden-password-protected-importer.spec.ts @@ -6,6 +6,7 @@ import { KeyGenerationService } from "@bitwarden/common/key-management/crypto"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { emptyGuid, OrganizationId } from "@bitwarden/common/types/guid"; import { OrgKey, UserKey } from "@bitwarden/common/types/key"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; @@ -41,9 +42,10 @@ describe("BitwardenPasswordProtectedImporter", () => { accountService.activeAccount$ = of({ id: emptyGuid as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); const mockOrgId = emptyGuid as OrganizationId; @@ -96,9 +98,10 @@ describe("BitwardenPasswordProtectedImporter", () => { beforeEach(() => { accountService.activeAccount$ = of({ id: emptyGuid as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }); importer = new BitwardenPasswordProtectedImporter( keyService, diff --git a/libs/key-management-ui/src/lock/components/master-password-lock/master-password-lock.component.spec.ts b/libs/key-management-ui/src/lock/components/master-password-lock/master-password-lock.component.spec.ts index d40cc98df11..71287e7684c 100644 --- a/libs/key-management-ui/src/lock/components/master-password-lock/master-password-lock.component.spec.ts +++ b/libs/key-management-ui/src/lock/components/master-password-lock/master-password-lock.component.spec.ts @@ -11,6 +11,7 @@ import { MasterPasswordUnlockService } from "@bitwarden/common/key-management/ma import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserKey } from "@bitwarden/common/types/key"; import { AsyncActionsModule, @@ -39,9 +40,10 @@ describe("MasterPasswordLockComponent", () => { const mockMasterPassword = "testExample"; const activeAccount: Account = { id: "user-id" as UserId, - email: "user@example.com", - emailVerified: true, - name: "User", + ...mockAccountInfoWith({ + email: "user@example.com", + name: "User", + }), }; const mockUserKey = new SymmetricCryptoKey(new Uint8Array(64)) as UserKey; diff --git a/libs/tools/generator/core/src/providers/generator-metadata-provider.spec.ts b/libs/tools/generator/core/src/providers/generator-metadata-provider.spec.ts index 376b46cd6e8..39ff74ad901 100644 --- a/libs/tools/generator/core/src/providers/generator-metadata-provider.spec.ts +++ b/libs/tools/generator/core/src/providers/generator-metadata-provider.spec.ts @@ -25,7 +25,11 @@ import { deepFreeze } from "@bitwarden/common/tools/util"; import { UserId } from "@bitwarden/common/types/guid"; import { BitwardenClient } from "@bitwarden/sdk-internal"; -import { FakeAccountService, FakeStateProvider } from "../../../../../common/spec"; +import { + FakeAccountService, + FakeStateProvider, + mockAccountInfoWith, +} from "../../../../../common/spec"; import { Algorithm, AlgorithmsByType, CredentialAlgorithm, Type, Types } from "../metadata"; import catchall from "../metadata/email/catchall"; import plusAddress from "../metadata/email/plus-address"; @@ -40,9 +44,10 @@ import { GeneratorMetadataProvider } from "./generator-metadata-provider"; const SomeUser = "some user" as UserId; const SomeAccount = { id: SomeUser, - email: "someone@example.com", - emailVerified: true, - name: "Someone", + ...mockAccountInfoWith({ + email: "someone@example.com", + name: "Someone", + }), }; const SomeAccount$ = new BehaviorSubject(SomeAccount); diff --git a/libs/tools/generator/core/src/providers/generator-profile-provider.spec.ts b/libs/tools/generator/core/src/providers/generator-profile-provider.spec.ts index 924849b1c22..088bf543fee 100644 --- a/libs/tools/generator/core/src/providers/generator-profile-provider.spec.ts +++ b/libs/tools/generator/core/src/providers/generator-profile-provider.spec.ts @@ -15,7 +15,12 @@ import { UserStateSubjectDependencyProvider } from "@bitwarden/common/tools/stat import { StateConstraints } from "@bitwarden/common/tools/types"; import { OrganizationId, PolicyId, UserId } from "@bitwarden/common/types/guid"; -import { FakeStateProvider, FakeAccountService, awaitAsync } from "../../../../../common/spec"; +import { + FakeStateProvider, + FakeAccountService, + awaitAsync, + mockAccountInfoWith, +} from "../../../../../common/spec"; import { CoreProfileMetadata, ProfileContext } from "../metadata/profile-metadata"; import { GeneratorConstraints } from "../types"; @@ -31,21 +36,25 @@ const UnverifiedEmailUser = "UnverifiedEmailUser" as UserId; const accounts: Record = { [SomeUser]: { id: SomeUser, - name: "some user", - email: "some.user@example.com", - emailVerified: true, + ...mockAccountInfoWith({ + name: "some user", + email: "some.user@example.com", + }), }, [AnotherUser]: { id: AnotherUser, - name: "some other user", - email: "some.other.user@example.com", - emailVerified: true, + ...mockAccountInfoWith({ + name: "some other user", + email: "some.other.user@example.com", + }), }, [UnverifiedEmailUser]: { id: UnverifiedEmailUser, - name: "a user with an unverfied email", - email: "unverified@example.com", - emailVerified: false, + ...mockAccountInfoWith({ + name: "a user with an unverfied email", + email: "unverified@example.com", + emailVerified: false, + }), }, }; const accountService = new FakeAccountService(accounts); diff --git a/libs/tools/generator/core/src/services/default-credential-generator.service.spec.ts b/libs/tools/generator/core/src/services/default-credential-generator.service.spec.ts index 81e7ae6ac63..e459bb47f47 100644 --- a/libs/tools/generator/core/src/services/default-credential-generator.service.spec.ts +++ b/libs/tools/generator/core/src/services/default-credential-generator.service.spec.ts @@ -8,7 +8,7 @@ import { Vendor } from "@bitwarden/common/tools/extension/vendor/data"; import { SemanticLogger, ifEnabledSemanticLoggerProvider } from "@bitwarden/common/tools/log"; import { UserId } from "@bitwarden/common/types/guid"; -import { awaitAsync } from "../../../../../common/spec"; +import { awaitAsync, mockAccountInfoWith } from "../../../../../common/spec"; import { Algorithm, CredentialAlgorithm, @@ -56,9 +56,10 @@ describe("DefaultCredentialGeneratorService", () => { // Use a hard-coded value for mockAccount account = { id: "test-account-id" as UserId, - emailVerified: true, - email: "test@example.com", - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), }; system = { diff --git a/libs/tools/send/send-ui/src/send-list-filters/send-list-filters.component.spec.ts b/libs/tools/send/send-ui/src/send-list-filters/send-list-filters.component.spec.ts index b832ac36caf..ca77c94898b 100644 --- a/libs/tools/send/send-ui/src/send-list-filters/send-list-filters.component.spec.ts +++ b/libs/tools/send/send-ui/src/send-list-filters/send-list-filters.component.spec.ts @@ -8,6 +8,7 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { ChipSelectComponent } from "@bitwarden/components"; @@ -31,9 +32,11 @@ describe("SendListFiltersComponent", () => { accountService.activeAccount$ = of({ id: userId, - email: "test@email.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@email.com", + name: "Test User", + emailVerified: true, + }), }); billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(true)); diff --git a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.spec.ts b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.spec.ts index 42144e646d4..9ff8f7c83da 100644 --- a/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.spec.ts +++ b/libs/vault/src/cipher-view/login-credentials/login-credentials-view.component.spec.ts @@ -11,6 +11,7 @@ import { EventType } from "@bitwarden/common/enums"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service"; import { CipherType } from "@bitwarden/common/vault/enums"; @@ -34,9 +35,10 @@ describe("LoginCredentialsViewComponent", () => { const hasPremiumFromAnySource$ = new BehaviorSubject(true); const mockAccount = { id: "test-user-id" as UserId, - email: "test@example.com", - emailVerified: true, - name: "Test User", + ...mockAccountInfoWith({ + email: "test@example.com", + name: "Test User", + }), type: 0, status: 0, kdf: 0, diff --git a/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts b/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts index 68b0d9dfcf5..9bf53826333 100644 --- a/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts +++ b/libs/vault/src/components/add-edit-folder-dialog/add-edit-folder-dialog.component.spec.ts @@ -2,9 +2,10 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { BehaviorSubject } from "rxjs"; -import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { mockAccountInfoWith } from "@bitwarden/common/spec"; import { UserId } from "@bitwarden/common/types/guid"; import { FolderApiServiceAbstraction } from "@bitwarden/common/vault/abstractions/folder/folder-api.service.abstraction"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; @@ -47,11 +48,7 @@ describe("AddEditFolderDialogComponent", () => { showToast.mockClear(); const userId = "" as UserId; - const accountInfo: AccountInfo = { - email: "", - emailVerified: true, - name: undefined, - }; + const accountInfo = mockAccountInfoWith(); await TestBed.configureTestingModule({ imports: [AddEditFolderDialogComponent, NoopAnimationsModule], diff --git a/tsconfig.base.json b/tsconfig.base.json index 2d105d4263d..ae4b9f5f601 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -29,6 +29,7 @@ "@bitwarden/browser/*": ["./apps/browser/src/*"], "@bitwarden/cli/*": ["./apps/cli/src/*"], "@bitwarden/client-type": ["libs/client-type/src/index.ts"], + "@bitwarden/common/spec": ["./libs/common/spec"], "@bitwarden/common/*": ["./libs/common/src/*"], "@bitwarden/components": ["./libs/components/src"], "@bitwarden/core-test-utils": ["libs/core-test-utils/src/index.ts"], From 944d324985d9b78059e6215f3cbdeaf19215e37f Mon Sep 17 00:00:00 2001 From: adudek-bw Date: Fri, 12 Dec 2025 12:38:35 -0500 Subject: [PATCH 03/16] [PM-27081] Fix chromium direct import for linux (#17894) * Fix chromium direct import for linux --- .../chromium_importer/src/chromium/platform/linux.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs b/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs index f542e23129a..6fb6e6134c7 100644 --- a/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs +++ b/apps/desktop/desktop_native/chromium_importer/src/chromium/platform/linux.rs @@ -18,7 +18,7 @@ use crate::{ pub(crate) const SUPPORTED_BROWSERS: &[BrowserConfig] = &[ BrowserConfig { name: "Chrome", - data_dir: &[".config/google-chrome"], + data_dir: &[".config/google-chrome", "snap/chromium/common/chromium"], }, BrowserConfig { name: "Chromium", From 14dd732b522eff9cc69d771f413af259aca51053 Mon Sep 17 00:00:00 2001 From: Alex Dragovich <46065570+itsadrago@users.noreply.github.com> Date: Fri, 12 Dec 2025 09:43:34 -0800 Subject: [PATCH 04/16] [PM-23258] changing verbiage from import data to import items (#17123) * [PM-23258] changing verbiage from import data to import items * [PM-23258] Removing vault and data from import and export titles, navs, and buttons * [PM-23258] more verbiage changes * [PM-23258] reverting unnecessary change * [PM-23258] removing unused text from messages json files * [PM-23258] small text changes from design * [PM-23258] including secrets manager changes --- apps/browser/src/_locales/en/messages.json | 18 +++++++----------- .../export/export-browser-v2.component.html | 4 ++-- .../import/import-browser-v2.component.html | 4 ++-- .../settings/vault-settings-v2.component.html | 6 +++--- .../tools/export/export-desktop.component.html | 4 ++-- .../tools/import/import-desktop.component.html | 4 ++-- apps/desktop/src/locales/en/messages.json | 15 +++++++-------- apps/desktop/src/main/menu/menu.file.ts | 12 ++++++------ .../layouts/organization-layout.component.html | 4 ++-- .../organization-settings-routing.module.ts | 4 ++-- .../src/app/layouts/user-layout.component.html | 4 ++-- apps/web/src/app/oss-routing.module.ts | 4 ++-- .../app/tools/import/import-web.component.html | 2 +- .../app/tools/import/org-import.component.html | 2 +- .../vault-export/export-web.component.html | 2 +- .../org-vault-export.component.html | 2 +- apps/web/src/locales/en/messages.json | 15 +++------------ .../layout/navigation.component.html | 4 ++-- .../settings/porting/sm-export.component.html | 2 +- .../settings/porting/sm-export.component.ts | 2 +- .../settings/porting/sm-import.component.html | 2 +- .../settings/settings-routing.module.ts | 4 ++-- .../dialog/file-password-prompt.component.html | 2 +- .../src/components/export.component.ts | 2 +- 24 files changed, 55 insertions(+), 69 deletions(-) diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 09ea964823c..36d69fb09f5 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -436,8 +436,8 @@ "sync": { "message": "Sync" }, - "syncVaultNow": { - "message": "Sync vault now" + "syncNow": { + "message": "Sync now" }, "lastSync": { "message": "Last sync:" @@ -455,9 +455,6 @@ "bitWebVaultApp": { "message": "Bitwarden web app" }, - "importItems": { - "message": "Import items" - }, "select": { "message": "Select" }, @@ -1325,8 +1322,11 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" + "export": { + "message": "Export" + }, + "import": { + "message": "Import" }, "fileFormat": { "message": "File format" @@ -4215,10 +4215,6 @@ "ignore": { "message": "Ignore" }, - "importData": { - "message": "Import data", - "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" - }, "importError": { "message": "Import error" }, diff --git a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html index d6bf3a3a253..5473bbe620e 100644 --- a/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html +++ b/apps/browser/src/tools/popup/settings/export/export-browser-v2.component.html @@ -1,5 +1,5 @@ - + @@ -21,7 +21,7 @@ bitFormButton buttonType="primary" > - {{ "exportVault" | i18n }} + {{ "export" | i18n }} diff --git a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html index 225640137e8..c042af8cbac 100644 --- a/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html +++ b/apps/browser/src/vault/popup/settings/vault-settings-v2.component.html @@ -15,7 +15,7 @@ diff --git a/apps/desktop/src/app/tools/export/export-desktop.component.html b/apps/desktop/src/app/tools/export/export-desktop.component.html index 9aa59c5a636..a969b86b950 100644 --- a/apps/desktop/src/app/tools/export/export-desktop.component.html +++ b/apps/desktop/src/app/tools/export/export-desktop.component.html @@ -1,5 +1,5 @@ - {{ "exportVault" | i18n }} + {{ "export" | i18n }} - {{ "exportVault" | i18n }} + {{ "export" | i18n }} diff --git a/apps/web/src/app/tools/import/org-import.component.html b/apps/web/src/app/tools/import/org-import.component.html index 25efa9ec0c7..00e4a7690a2 100644 --- a/apps/web/src/app/tools/import/org-import.component.html +++ b/apps/web/src/app/tools/import/org-import.component.html @@ -16,6 +16,6 @@ bitFormButton buttonType="primary" > - {{ "importData" | i18n }} + {{ "import" | i18n }} diff --git a/apps/web/src/app/tools/vault-export/export-web.component.html b/apps/web/src/app/tools/vault-export/export-web.component.html index e3d0ca75d25..1ff34f4c988 100644 --- a/apps/web/src/app/tools/vault-export/export-web.component.html +++ b/apps/web/src/app/tools/vault-export/export-web.component.html @@ -15,6 +15,6 @@ bitFormButton buttonType="primary" > - {{ "confirmFormat" | i18n }} + {{ "export" | i18n }} diff --git a/apps/web/src/app/tools/vault-export/org-vault-export.component.html b/apps/web/src/app/tools/vault-export/org-vault-export.component.html index 01975272e76..e781a839896 100644 --- a/apps/web/src/app/tools/vault-export/org-vault-export.component.html +++ b/apps/web/src/app/tools/vault-export/org-vault-export.component.html @@ -16,6 +16,6 @@ bitFormButton buttonType="primary" > - {{ "confirmFormat" | i18n }} + {{ "export" | i18n }} diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 3b0554547c5..0f8b0c1b466 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8757,9 +8751,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html index 0ea8caef4d6..ac70e1920ee 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.html @@ -52,12 +52,12 @@ [relativeTo]="route.parent" > diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html index 9e1f2e01591..113c51327b2 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.html @@ -17,6 +17,6 @@ diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts index e2b66d9ffa6..5e6f81d99d6 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts @@ -124,7 +124,7 @@ export class SecretsManagerExportComponent implements OnInit, OnDestroy { const ref = openUserVerificationPrompt(this.dialogService, { data: { confirmDescription: "exportSecretsWarningDesc", - confirmButtonText: "exportSecrets", + confirmButtonText: "export", modalTitle: "confirmSecretsExport", }, }); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html index 353d8d8c8ed..3a663dbcbe9 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.html @@ -36,6 +36,6 @@ {{ "acceptedFormats" | i18n }} Bitwarden (json) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts index ddc9964060e..31029d134fa 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/settings-routing.module.ts @@ -12,7 +12,7 @@ const routes: Routes = [ component: SecretsManagerImportComponent, canActivate: [organizationPermissionsGuard((org) => org.isAdmin)], data: { - titleId: "importData", + titleId: "import", }, }, { @@ -20,7 +20,7 @@ const routes: Routes = [ component: SecretsManagerExportComponent, canActivate: [organizationPermissionsGuard((org) => org.isAdmin)], data: { - titleId: "exportData", + titleId: "export", }, }, ]; diff --git a/libs/importer/src/components/dialog/file-password-prompt.component.html b/libs/importer/src/components/dialog/file-password-prompt.component.html index d663ec0f4d3..1c0bcdca31d 100644 --- a/libs/importer/src/components/dialog/file-password-prompt.component.html +++ b/libs/importer/src/components/dialog/file-password-prompt.component.html @@ -21,7 +21,7 @@ - - + @if (showCipherView) { + + } + + @if (loadForm) { + + + + + + } - - + @if (showRestore) { + + } + + @if (showEdit) { - + } + - - -
- -
+ + @if (showCancel) { + + } + + @if (showClose) { + + } + + @if (showDelete) { +
+ +
+ }
diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts index 6716cde629a..11862b569fc 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { provideNoopAnimations } from "@angular/platform-browser/animations"; import { ActivatedRoute, Router } from "@angular/router"; +import { of } from "rxjs"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; @@ -95,6 +96,10 @@ describe("VaultItemDialogComponent", () => { fixture = TestBed.createComponent(TestVaultItemDialogComponent); component = fixture.componentInstance; + Object.defineProperty(component, "userHasPremium$", { + get: () => of(false), + configurable: true, + }); fixture.detectChanges(); }); @@ -135,4 +140,35 @@ describe("VaultItemDialogComponent", () => { expect(component.getTestTitle()).toBe("newItemHeaderCard"); }); }); + describe("submitButtonText$", () => { + it("should return 'unArchiveAndSave' when premium is false and cipher is archived", (done) => { + jest.spyOn(component as any, "userHasPremium$", "get").mockReturnValue(of(false)); + component["cipherIsArchived"] = true; + + component["submitButtonText$"].subscribe((text) => { + expect(text).toBe("unArchiveAndSave"); + done(); + }); + }); + + it("should return 'save' when cipher is archived and user has premium", (done) => { + jest.spyOn(component as any, "userHasPremium$", "get").mockReturnValue(of(true)); + component["cipherIsArchived"] = true; + + component["submitButtonText$"].subscribe((text) => { + expect(text).toBe("save"); + done(); + }); + }); + + it("should return 'save' when cipher is not archived", (done) => { + jest.spyOn(component as any, "userHasPremium$", "get").mockReturnValue(of(false)); + component["cipherIsArchived"] = false; + + component["submitButtonText$"].subscribe((text) => { + expect(text).toBe("save"); + done(); + }); + }); + }); }); diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts index 8508596a67b..d7b9ee97123 100644 --- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts +++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts @@ -12,7 +12,7 @@ import { } from "@angular/core"; import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { Router } from "@angular/router"; -import { firstValueFrom, Subject, switchMap } from "rxjs"; +import { firstValueFrom, Observable, Subject, switchMap } from "rxjs"; import { map } from "rxjs/operators"; import { CollectionView } from "@bitwarden/admin-console/common"; @@ -222,10 +222,10 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { protected collections?: CollectionView[]; /** - * Flag to indicate if the user has access to attachments via a premium subscription. + * Flag to indicate if the user has a premium subscription. Using for access to attachments, and archives * @protected */ - protected canAccessAttachments$ = this.accountService.activeAccount$.pipe( + protected userHasPremium$ = this.accountService.activeAccount$.pipe( switchMap((account) => this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id), ), @@ -253,6 +253,8 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { protected showRestore: boolean; + protected cipherIsArchived: boolean; + protected get loadingForm() { return this.loadForm && !this.formReady; } @@ -278,6 +280,16 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { return this.cipher != undefined && (this.params.mode === "view" || this.loadingForm); } + protected get submitButtonText$(): Observable { + return this.userHasPremium$.pipe( + map((hasPremium) => + this.cipherIsArchived && !hasPremium + ? this.i18nService.t("unArchiveAndSave") + : this.i18nService.t("save"), + ), + ); + } + /** * Flag to initialize/attach the form component. */ @@ -363,6 +375,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { this.filter = await firstValueFrom(this.routedVaultFilterService.filter$); this.showRestore = await this.canUserRestore(); + this.cipherIsArchived = this.cipher.isArchived; this.performingInitialLoad = false; } @@ -392,6 +405,9 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { cipherView.collectionIds?.includes(c.id), ); + // Track cipher archive state for btn text and badge updates + this.cipherIsArchived = this.cipher.isArchived; + // If the cipher was newly created (via add/clone), switch the form to edit for subsequent edits. if (this._originalFormMode === "add" || this._originalFormMode === "clone") { this.formConfig.mode = "edit"; @@ -468,7 +484,7 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy { }; openAttachmentsDialog = async () => { - const canAccessAttachments = await firstValueFrom(this.canAccessAttachments$); + const canAccessAttachments = await firstValueFrom(this.userHasPremium$); if (!canAccessAttachments) { await this.premiumUpgradeService.promptForPremium(this.cipher?.organizationId); diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html index d56c9d15cff..5b9f9db3e62 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html @@ -172,7 +172,7 @@ @if (!viewingOrgVault) { - diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts index 92c49ac218a..a723f1e942b 100644 --- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts +++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts @@ -253,14 +253,6 @@ export class VaultCipherRowComponent implements OnInit ); } - protected get hasPasswordToCopy() { - return CipherViewLikeUtils.hasCopyableValue(this.cipher, "password"); - } - - protected get hasUsernameToCopy() { - return CipherViewLikeUtils.hasCopyableValue(this.cipher, "username"); - } - protected get permissionText() { if (!this.cipher.organizationId || this.cipher.collectionIds.length === 0) { return this.i18nService.t("manageCollection"); @@ -319,6 +311,9 @@ export class VaultCipherRowComponent implements OnInit } protected get isIdentityCipher() { + if (CipherViewLikeUtils.isArchived(this.cipher) && !this.userCanArchive) { + return false; + } return CipherViewLikeUtils.getType(this.cipher) === this.CipherType.Identity && !this.isDeleted; } @@ -394,6 +389,13 @@ export class VaultCipherRowComponent implements OnInit return this.organization.canEditAllCiphers || (this.cipher.edit && this.cipher.viewPassword); } + protected get showFavorite() { + if (CipherViewLikeUtils.isArchived(this.cipher) && !this.userCanArchive) { + return false; + } + return true; + } + protected toggleFavorite() { this.onEvent.emit({ type: "toggleFavorite", diff --git a/apps/web/src/app/vault/individual-vault/vault.component.html b/apps/web/src/app/vault/individual-vault/vault.component.html index 522b63c21fd..df1b727154f 100644 --- a/apps/web/src/app/vault/individual-vault/vault.component.html +++ b/apps/web/src/app/vault/individual-vault/vault.component.html @@ -31,19 +31,23 @@ >
- - {{ trashCleanupWarning }} - - -

{{ "premiumSubscriptionEndedDesc" | i18n }}

- {{ - "restartPremium" | i18n - }} -
+ @if (activeFilter.isDeleted) { + + {{ trashCleanupWarning }} + + } + + @if (showSubscriptionEndedMessaging$ | async) { + + +
+ {{ "premiumSubscriptionEndedDesc" | i18n }} +
+ {{ "restartPremium" | i18n }} +
+
+ } + implements OnInit, OnDestr this.vaultFilterService.clearOrganizationFilter(); } + async navigateToGetPremium() { + await this.router.navigate(["/settings/subscription/premium"]); + } + async onVaultItemsEvent(event: VaultItemEvent) { this.processingEvent = true; try { diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 0f8b0c1b466..680c28f0747 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -11591,6 +11591,9 @@ "unArchive": { "message": "Unarchive" }, + "unArchiveAndSave": { + "message": "Unarchive and save" + }, "itemsInArchive": { "message": "Items in archive" }, diff --git a/libs/components/src/dialog/dialog/dialog.component.html b/libs/components/src/dialog/dialog/dialog.component.html index be946c76a57..22aa99c44cb 100644 --- a/libs/components/src/dialog/dialog/dialog.component.html +++ b/libs/components/src/dialog/dialog/dialog.component.html @@ -34,16 +34,21 @@ } - @if (!this.dialogRef?.disableClose) { - - } + +
+ + + @if (!this.dialogRef?.disableClose) { + + } +
Foobar + Dialog body text goes here. @@ -292,3 +293,42 @@ export const WithCards: Story = { disableAnimations: true, }, }; + +export const HeaderEnd: Story = { + render: (args) => ({ + props: args, + template: /*html*/ ` + + + + Archived + + + Dialog body text goes here. + + + + + + + `, + }), + args: { + dialogSize: "small", + title: "Very Long Title That Should Be Truncated After Two Lines To Test Header End Slot", + subtitle: "Subtitle", + }, +}; From a7d3056f502ce9d27f84f2793bfd26bbe90a2d6f Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 09:20:53 +0100 Subject: [PATCH 16/16] Autosync the updated translations (#17972) Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com> --- apps/web/src/locales/af/messages.json | 15 +-- apps/web/src/locales/ar/messages.json | 15 +-- apps/web/src/locales/az/messages.json | 41 ++++---- apps/web/src/locales/be/messages.json | 15 +-- apps/web/src/locales/bg/messages.json | 15 +-- apps/web/src/locales/bn/messages.json | 15 +-- apps/web/src/locales/bs/messages.json | 15 +-- apps/web/src/locales/ca/messages.json | 15 +-- apps/web/src/locales/cs/messages.json | 15 +-- apps/web/src/locales/cy/messages.json | 15 +-- apps/web/src/locales/da/messages.json | 15 +-- apps/web/src/locales/de/messages.json | 77 +++++++-------- apps/web/src/locales/el/messages.json | 15 +-- apps/web/src/locales/en_GB/messages.json | 15 +-- apps/web/src/locales/en_IN/messages.json | 15 +-- apps/web/src/locales/eo/messages.json | 15 +-- apps/web/src/locales/es/messages.json | 15 +-- apps/web/src/locales/et/messages.json | 15 +-- apps/web/src/locales/eu/messages.json | 15 +-- apps/web/src/locales/fa/messages.json | 15 +-- apps/web/src/locales/fi/messages.json | 15 +-- apps/web/src/locales/fil/messages.json | 15 +-- apps/web/src/locales/fr/messages.json | 15 +-- apps/web/src/locales/gl/messages.json | 15 +-- apps/web/src/locales/he/messages.json | 15 +-- apps/web/src/locales/hi/messages.json | 15 +-- apps/web/src/locales/hr/messages.json | 15 +-- apps/web/src/locales/hu/messages.json | 15 +-- apps/web/src/locales/id/messages.json | 15 +-- apps/web/src/locales/it/messages.json | 15 +-- apps/web/src/locales/ja/messages.json | 15 +-- apps/web/src/locales/ka/messages.json | 15 +-- apps/web/src/locales/km/messages.json | 15 +-- apps/web/src/locales/kn/messages.json | 15 +-- apps/web/src/locales/ko/messages.json | 15 +-- apps/web/src/locales/lv/messages.json | 15 +-- apps/web/src/locales/ml/messages.json | 15 +-- apps/web/src/locales/mr/messages.json | 15 +-- apps/web/src/locales/my/messages.json | 15 +-- apps/web/src/locales/nb/messages.json | 15 +-- apps/web/src/locales/ne/messages.json | 15 +-- apps/web/src/locales/nl/messages.json | 15 +-- apps/web/src/locales/nn/messages.json | 15 +-- apps/web/src/locales/or/messages.json | 15 +-- apps/web/src/locales/pl/messages.json | 15 +-- apps/web/src/locales/pt_BR/messages.json | 77 +++++++-------- apps/web/src/locales/pt_PT/messages.json | 41 ++++---- apps/web/src/locales/ro/messages.json | 15 +-- apps/web/src/locales/ru/messages.json | 59 +++++------- apps/web/src/locales/si/messages.json | 15 +-- apps/web/src/locales/sk/messages.json | 15 +-- apps/web/src/locales/sl/messages.json | 15 +-- apps/web/src/locales/sr_CS/messages.json | 15 +-- apps/web/src/locales/sr_CY/messages.json | 115 +++++++++++------------ apps/web/src/locales/sv/messages.json | 15 +-- apps/web/src/locales/ta/messages.json | 15 +-- apps/web/src/locales/te/messages.json | 15 +-- apps/web/src/locales/th/messages.json | 15 +-- apps/web/src/locales/tr/messages.json | 15 +-- apps/web/src/locales/uk/messages.json | 15 +-- apps/web/src/locales/vi/messages.json | 15 +-- apps/web/src/locales/zh_CN/messages.json | 69 ++++++-------- apps/web/src/locales/zh_TW/messages.json | 15 +-- 63 files changed, 376 insertions(+), 943 deletions(-) diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json index b5701c01e86..d5314274775 100644 --- a/apps/web/src/locales/af/messages.json +++ b/apps/web/src/locales/af/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Stuur kluis uit" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Lêerformaat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bevestig hoofwagwoord" }, - "confirmFormat": { - "message": "Bevestig formaat" - }, "filePassword": { "message": "Lêerwagwoord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Nutsmiddels" }, + "import": { + "message": "Import" + }, "importData": { "message": "Voer data in" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Bediener" }, - "exportData": { - "message": "Stuur data uit" - }, "exportingOrganizationSecretDataTitle": { "message": "Stuur tans organisasiegeheimdata uit" }, diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json index 807689cebae..c85ad682d0a 100644 --- a/apps/web/src/locales/ar/messages.json +++ b/apps/web/src/locales/ar/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "التصدير من" }, - "exportVault": { - "message": "تصدير الخزانة" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "صيغة الملف" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "تأكيد كلمة المرور الرئيسية" }, - "confirmFormat": { - "message": "تأكيد التنسيق" - }, "filePassword": { "message": "كلمة مرور الملف" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "الأدوات" }, + "import": { + "message": "Import" + }, "importData": { "message": "استيراد البيانات" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json index 77df36f5c45..9068514ce55 100644 --- a/apps/web/src/locales/az/messages.json +++ b/apps/web/src/locales/az/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Buradan xaricə köçür" }, - "exportVault": { - "message": "Seyfi xaricə köçür" - }, - "exportSecrets": { - "message": "Sirləri xaricə köçür" - }, "fileFormat": { "message": "Fayl formatı" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Ana parolu təsdiqlə" }, - "confirmFormat": { - "message": "Formatı təsdiqlə" - }, "filePassword": { "message": "Fayl parolu" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alətlər" }, + "import": { + "message": "Daxilə köçür" + }, "importData": { "message": "Veriləri daxilə köçür" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Veriləri xaricə köçür" - }, "exportingOrganizationSecretDataTitle": { "message": "Təşkilatın Sirr Verilərini xaricə köçürmə" }, @@ -12238,43 +12229,43 @@ } }, "removeMasterPasswordForOrgUserKeyConnector": { - "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + "message": "Təşkilatınız, artıq Bitwarden-ə giriş etmək üçün ana parol istifadə etmir. Davam etmək üçün təşkilatı və domeni doğrulayın." }, "continueWithLogIn": { - "message": "Continue with log in" + "message": "Giriş etməyə davam" }, "doNotContinue": { - "message": "Do not continue" + "message": "Davam etmə" }, "domain": { - "message": "Domain" + "message": "Domen" }, "keyConnectorDomainTooltip": { - "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + "message": "Bu domen, hesabınızın şifrələmə açarlarını saxlayacaq, ona görə də, bu domenə güvəndiyinizə əmin olun. Əmin deyilsinizsə, adminizlə əlaqə saxlayın." }, "verifyYourOrganization": { - "message": "Verify your organization to log in" + "message": "Giriş etmək üçün təşkilatınızı doğrulayın" }, "organizationVerified": { - "message": "Organization verified" + "message": "Təşkilat doğrulandı" }, "domainVerified": { - "message": "Domain verified" + "message": "Domen doğrulandı" }, "leaveOrganizationContent": { - "message": "If you don't verify your organization, your access to the organization will be revoked." + "message": "Təşkilatınızı doğrulamasanız, təşkilata erişiminiz ləğv ediləcək." }, "leaveNow": { - "message": "Leave now" + "message": "İndi tərk et" }, "verifyYourDomainToLogin": { - "message": "Verify your domain to log in" + "message": "Giriş etmək üçün domeninizi doğrulayın" }, "verifyYourDomainDescription": { - "message": "To continue with log in, verify this domain." + "message": "Giriş prosesini davam etdirmək üçün bu domeni doğrulayın." }, "confirmKeyConnectorOrganizationUserDescription": { - "message": "To continue with log in, verify the organization and domain." + "message": "Giriş prosesini davam etdirmək üçün bu təşkilatı və domeni doğrulayın." }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Heç bir kritik tətbiq seçilməyib" diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json index c670f82a00d..b5f7a4dfa18 100644 --- a/apps/web/src/locales/be/messages.json +++ b/apps/web/src/locales/be/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Экспартаваць сховішча" - }, - "exportSecrets": { - "message": "Экспартаванне сакрэтаў" - }, "fileFormat": { "message": "Фармат файла" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Пацвердзіць асноўны пароль" }, - "confirmFormat": { - "message": "Пацвердзіць фармат" - }, "filePassword": { "message": "Пароль файла" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Інструменты" }, + "import": { + "message": "Import" + }, "importData": { "message": "Імпартаванне даных" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Экспартаванне даных" - }, "exportingOrganizationSecretDataTitle": { "message": "Экспартаванне сакрэтных даных арганізацыі" }, diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json index 3e3451084fc..a57f9bcebb2 100644 --- a/apps/web/src/locales/bg/messages.json +++ b/apps/web/src/locales/bg/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Изнасяне от" }, - "exportVault": { - "message": "Изнасяне на трезора" - }, - "exportSecrets": { - "message": "Изнасяне на тайните" - }, "fileFormat": { "message": "Формат на файла" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Потвърждаване на главната парола" }, - "confirmFormat": { - "message": "Потвърждаване на формата" - }, "filePassword": { "message": "Парола на файла" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Инструменти" }, + "import": { + "message": "Внасяне" + }, "importData": { "message": "Внасяне на данни" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Сървър" }, - "exportData": { - "message": "Изнасяне на данни" - }, "exportingOrganizationSecretDataTitle": { "message": "Изнасяне на тайните данни на организацията" }, diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json index 4e8c53b1598..f2ff447005c 100644 --- a/apps/web/src/locales/bn/messages.json +++ b/apps/web/src/locales/bn/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json index defb970c237..63c22b86251 100644 --- a/apps/web/src/locales/bs/messages.json +++ b/apps/web/src/locales/bs/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json index 9b8bb1fce7d..7e6c8e20085 100644 --- a/apps/web/src/locales/ca/messages.json +++ b/apps/web/src/locales/ca/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exporta des de" }, - "exportVault": { - "message": "Exporta la caixa forta" - }, - "exportSecrets": { - "message": "Exporta secrets" - }, "fileFormat": { "message": "Format de fitxer" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirma la contrasenya mestra" }, - "confirmFormat": { - "message": "Confirma el format" - }, "filePassword": { "message": "Contrasenya del fitxer" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Eines" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importa dades" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar dades" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportació de dades secretes de l’organització" }, diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json index 4eacb212138..923cfb66a14 100644 --- a/apps/web/src/locales/cs/messages.json +++ b/apps/web/src/locales/cs/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportovat z" }, - "exportVault": { - "message": "Exportovat trezor" - }, - "exportSecrets": { - "message": "Exportovat tajné klíče" - }, "fileFormat": { "message": "Formát souboru" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potvrzení hlavního hesla" }, - "confirmFormat": { - "message": "Potvrdit formát" - }, "filePassword": { "message": "Heslo souboru" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Nástroje" }, + "import": { + "message": "Importovat" + }, "importData": { "message": "Importovat data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Exportovat data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportování tajných dat organizace" }, diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json index f8839744e98..5a8845a48cc 100644 --- a/apps/web/src/locales/cy/messages.json +++ b/apps/web/src/locales/cy/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json index 3b583416b25..56ccbf6abdf 100644 --- a/apps/web/src/locales/da/messages.json +++ b/apps/web/src/locales/da/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Eksportér fra" }, - "exportVault": { - "message": "Eksportér boks" - }, - "exportSecrets": { - "message": "Eksportér hemmeligheder" - }, "fileFormat": { "message": "Filformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bekræft hovedadgangskode" }, - "confirmFormat": { - "message": "Bekræft format" - }, "filePassword": { "message": "Filadgangskode" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Værktøjer" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importér data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Eksportér data" - }, "exportingOrganizationSecretDataTitle": { "message": "Eksporterer organisations hemmelige data" }, diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json index 6eb0b1d5dc7..d4ccac0d49f 100644 --- a/apps/web/src/locales/de/messages.json +++ b/apps/web/src/locales/de/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportieren ab" }, - "exportVault": { - "message": "Tresor exportieren" - }, - "exportSecrets": { - "message": "Geheimnisse exportieren" - }, "fileFormat": { "message": "Dateiformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Master-Passwort bestätigen" }, - "confirmFormat": { - "message": "Format bestätigen" - }, "filePassword": { "message": "Dateipasswort" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Werkzeuge" }, + "import": { + "message": "Import" + }, "importData": { "message": "Daten importieren" }, @@ -6466,7 +6460,7 @@ "message": "Erfolgreich erneut eingeladen" }, "bulkReinviteSuccessToast": { - "message": "$COUNT$ users re-invited", + "message": "$COUNT$ Benutzer erneut eingeladen", "placeholders": { "count": { "content": "$1", @@ -6475,7 +6469,7 @@ } }, "bulkReinviteLimitedSuccessToast": { - "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "message": "$LIMIT$ von $SELECTEDCOUNT$ Benutzern erneut eingeladen. $EXCLUDEDCOUNT$ wurden wegen des Einladungslimits von $LIMIT$ nicht eingeladen.", "placeholders": { "limit": { "content": "$1", @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Daten exportieren" - }, "exportingOrganizationSecretDataTitle": { "message": "Geheimnisdaten der Organisation exportieren" }, @@ -12241,19 +12232,19 @@ "message": "Deine Organisation verwendet keine Master-Passwörter mehr, um sich bei Bitwarden anzumelden. Verifiziere die Organisation und Domain, um fortzufahren." }, "continueWithLogIn": { - "message": "Continue with log in" + "message": "Mit der Anmeldung fortfahren" }, "doNotContinue": { - "message": "Do not continue" + "message": "Nicht fortfahren" }, "domain": { "message": "Domain" }, "keyConnectorDomainTooltip": { - "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + "message": "Diese Domain speichert die Verschlüsselungsschlüssel deines Kontos. Stelle daher sicher, dass du ihr vertraust. Wenn du dir nicht sicher bist, wende dich an deinen Administrator." }, "verifyYourOrganization": { - "message": "Verify your organization to log in" + "message": "Verifiziere deine Organisation, um dich anzumelden" }, "organizationVerified": { "message": "Organisation verifiziert" @@ -12265,16 +12256,16 @@ "message": "Wenn du deine Organisation nicht verifizierst, wird dein Zugriff auf die Organisation widerrufen." }, "leaveNow": { - "message": "Leave now" + "message": "Jetzt verlassen" }, "verifyYourDomainToLogin": { - "message": "Verify your domain to log in" + "message": "Verifiziere deine Domain, um dich anzumelden" }, "verifyYourDomainDescription": { - "message": "To continue with log in, verify this domain." + "message": "Verifiziere diese Domain, um mit der Anmeldung fortzufahren." }, "confirmKeyConnectorOrganizationUserDescription": { - "message": "To continue with log in, verify the organization and domain." + "message": "Um mit der Anmeldung fortzufahren, verifiziere die Organisation und Domain." }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Es sind keine kritischen Anwendungen ausgewählt" @@ -12286,52 +12277,52 @@ "message": "Benutzerverifizierung fehlgeschlagen." }, "recoveryDeleteCiphersTitle": { - "message": "Delete unrecoverable vault items" + "message": "Nicht-wiederherstellbare Tresor-Einträge löschen" }, "recoveryDeleteCiphersDesc": { - "message": "Some of your vault items could not be recovered. Do you want to delete these unrecoverable items from your vault?" + "message": "Einige deiner Tresor-Einträge konnten nicht wiederhergestellt werden. Möchtest du diese nicht-wiederherstellbaren Einträge in deinem Tresor löschen?" }, "recoveryDeleteFoldersTitle": { - "message": "Delete unrecoverable folders" + "message": "Nicht-wiederherstellbare Ordner löschen" }, "recoveryDeleteFoldersDesc": { - "message": "Some of your folders could not be recovered. Do you want to delete these unrecoverable folders from your vault?" + "message": "Einige deiner Ordner konnten nicht wiederhergestellt werden. Möchtest du diese nicht-wiederherstellbaren Ordner in deinem Tresor löschen?" }, "recoveryReplacePrivateKeyTitle": { "message": "Verschlüsselungsschlüssel ersetzen" }, "recoveryReplacePrivateKeyDesc": { - "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." + "message": "Dein öffentliches Verschlüsselungsschlüsselpaar konnte nicht wiederhergestellt werden. Möchtest du deinen Verschlüsselungsschlüssel durch ein neues Schlüsselpaar ersetzen? Dazu musst du bestehenden Notfallzugänge und Organisationsmitgliedschaften erneut einrichten." }, "recoveryStepSyncTitle": { - "message": "Synchronizing data" + "message": "Daten werden synchronisiert" }, "recoveryStepPrivateKeyTitle": { - "message": "Verifying encryption key integrity" + "message": "Integrität des Verschlüsselungsschlüssels wird verifiziert" }, "recoveryStepUserInfoTitle": { - "message": "Verifying user information" + "message": "Benutzerinformationen werden verifiziert" }, "recoveryStepCipherTitle": { - "message": "Verifying vault item integrity" + "message": "Integrität des Tresoreintrags wird verifiziert" }, "recoveryStepFoldersTitle": { - "message": "Verifying folder integrity" + "message": "Ordnerintegrität wird verifiziert" }, "dataRecoveryTitle": { - "message": "Data Recovery and Diagnostics" + "message": "Datenwiederherstellung und Diagnose" }, "dataRecoveryDescription": { - "message": "Use the data recovery tool to diagnose and repair issues with your account. After running diagnostics you have the option to save diagnostic logs for support and the option to repair any detected issues." + "message": "Verwende das Werkzeug zur Datenwiederherstellung, um Probleme mit deinem Konto zu diagnostizieren und zu beheben. Nach dem Ausführen der Diagnose hast du die Möglichkeit, die Diagnoseprotokolle für den Support zu speichern und alle erkannten Probleme zu beheben." }, "runDiagnostics": { - "message": "Run Diagnostics" + "message": "Diagnose ausführen" }, "repairIssues": { - "message": "Repair Issues" + "message": "Probleme beheben" }, "saveDiagnosticLogs": { - "message": "Save Diagnostic Logs" + "message": "Diagnoseprotokolle speichern" }, "sessionTimeoutSettingsManagedByOrganization": { "message": "Diese Einstellung wird von deiner Organisation verwaltet." @@ -12372,16 +12363,16 @@ "message": "Stell eine Entsperrmethode ein, um deine Timeout-Aktion zu ändern" }, "leaveConfirmationDialogTitle": { - "message": "Are you sure you want to leave?" + "message": "Bist du sicher, dass du gehen willst?" }, "leaveConfirmationDialogContentOne": { "message": "Wenn du ablehnst, bleiben deine persönlichen Einträge in deinem Konto erhalten, aber du wirst den Zugriff auf geteilte Einträge und Organisationsfunktionen verlieren." }, "leaveConfirmationDialogContentTwo": { - "message": "Contact your admin to regain access." + "message": "Kontaktiere deinen Administrator, um wieder Zugriff zu erhalten." }, "leaveConfirmationDialogConfirmButton": { - "message": "Leave $ORGANIZATION$", + "message": "$ORGANIZATION$ verlassen", "placeholders": { "organization": { "content": "$1", @@ -12390,10 +12381,10 @@ } }, "howToManageMyVault": { - "message": "How do I manage my vault?" + "message": "Wie kann ich meinen Tresor verwalten?" }, "transferItemsToOrganizationTitle": { - "message": "Transfer items to $ORGANIZATION$", + "message": "Einträge zu $ORGANIZATION$ übertragen", "placeholders": { "organization": { "content": "$1", @@ -12402,7 +12393,7 @@ } }, "transferItemsToOrganizationContent": { - "message": "$ORGANIZATION$ is requiring all items to be owned by the organization for security and compliance. Click accept to transfer ownership of your items.", + "message": "$ORGANIZATION$ erfordert zur Sicherheit und Compliance, dass alle Einträge der Organisation gehören. Klicke auf Akzeptieren, um den Besitz deiner Einträge zu übertragen.", "placeholders": { "organization": { "content": "$1", diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json index f8efb8f78f8..92dd55f4c8b 100644 --- a/apps/web/src/locales/el/messages.json +++ b/apps/web/src/locales/el/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Εξαγωγή από" }, - "exportVault": { - "message": "Εξαγωγή Vault" - }, - "exportSecrets": { - "message": "Εξαγωγή μυστικών" - }, "fileFormat": { "message": "Μορφή Αρχείου" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Επιβεβαίωση κύριου κωδικού πρόσβασης" }, - "confirmFormat": { - "message": "Επιβεβαίωση μορφής" - }, "filePassword": { "message": "Κωδικός πρόσβασης αρχείου" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Εργαλεία" }, + "import": { + "message": "Import" + }, "importData": { "message": "Εισαγωγή Δεδομένων" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Διακομιστής" }, - "exportData": { - "message": "Εξαγωγή δεδομένων" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json index cdcf727df78..e49ac4ac0f6 100644 --- a/apps/web/src/locales/en_GB/messages.json +++ b/apps/web/src/locales/en_GB/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organisation Secret Data" }, diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json index ba0927f73fc..cfcfa1681c8 100644 --- a/apps/web/src/locales/en_IN/messages.json +++ b/apps/web/src/locales/en_IN/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json index dbccabfe6d7..8dd7923b58a 100644 --- a/apps/web/src/locales/eo/messages.json +++ b/apps/web/src/locales/eo/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Elporti el" }, - "exportVault": { - "message": "Elporti la trezorejon" - }, - "exportSecrets": { - "message": "Elporti la sekretojn" - }, "fileFormat": { "message": "Dosierformato" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Konfirmi la ĉefpasvorton" }, - "confirmFormat": { - "message": "Konfirmu formaton" - }, "filePassword": { "message": "Pasvorto de la dosiero" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Iloj" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importi Datumojn" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Servilo" }, - "exportData": { - "message": "Elporti datumon" - }, "exportingOrganizationSecretDataTitle": { "message": "En elportado de Sekretaj Datumoj de Organizo" }, diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json index 218cfea5617..b0778ef02cc 100644 --- a/apps/web/src/locales/es/messages.json +++ b/apps/web/src/locales/es/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportar desde" }, - "exportVault": { - "message": "Exportar caja fuerte" - }, - "exportSecrets": { - "message": "Exportar secretos" - }, "fileFormat": { "message": "Formato de archivo" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmar contraseña maestra" }, - "confirmFormat": { - "message": "Confirmar formato" - }, "filePassword": { "message": "Contraseña del archivo" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Herramientas" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importar datos" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar datos" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportando caja fuerte de la organización" }, diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json index df1baf98bc2..03e56857413 100644 --- a/apps/web/src/locales/et/messages.json +++ b/apps/web/src/locales/et/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Ekspordi asukohast" }, - "exportVault": { - "message": "Hoidla sisu eksportimine" - }, - "exportSecrets": { - "message": "Ekspordi saladused" - }, "fileFormat": { "message": "Failivorming" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Kinnita ülemparool" }, - "confirmFormat": { - "message": "Kinnita formaat" - }, "filePassword": { "message": "Faili parool" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tööriistad" }, + "import": { + "message": "Import" + }, "importData": { "message": "Andmete importimine" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json index e633cefdbf0..f28b334e9ff 100644 --- a/apps/web/src/locales/eu/messages.json +++ b/apps/web/src/locales/eu/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Esportatu kutxa gotorra" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Fitxategiaren formatua" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Pasahitz nagusia baieztatu" }, - "confirmFormat": { - "message": "Formatua baieztatu" - }, "filePassword": { "message": "Fitxategi pasahitza" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tresnak" }, + "import": { + "message": "Import" + }, "importData": { "message": "Inportatu datuak" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json index 5039584050d..75235dca1b3 100644 --- a/apps/web/src/locales/fa/messages.json +++ b/apps/web/src/locales/fa/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "برون ریزی از" }, - "exportVault": { - "message": "برون ریزی گاوصندوق" - }, - "exportSecrets": { - "message": "برون ریزی رازها" - }, "fileFormat": { "message": "فرمت پرونده" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "تأیید کلمه عبور اصلی" }, - "confirmFormat": { - "message": "فرمت را تأیید کنید" - }, "filePassword": { "message": "کلمه عبور پرونده" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ابزار" }, + "import": { + "message": "Import" + }, "importData": { "message": "درون ریزی داده" }, @@ -8753,9 +8747,6 @@ "server": { "message": "سرور" }, - "exportData": { - "message": "برون ریزی داده" - }, "exportingOrganizationSecretDataTitle": { "message": "برون ریزی داده‌های مخفی سازمان" }, diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json index 8a70ab58fde..adda39d725b 100644 --- a/apps/web/src/locales/fi/messages.json +++ b/apps/web/src/locales/fi/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Vie lähteestä" }, - "exportVault": { - "message": "Vie holvi" - }, - "exportSecrets": { - "message": "Vie salaisuudet" - }, "fileFormat": { "message": "Tiedostomuoto" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Vahvista pääsalasana" }, - "confirmFormat": { - "message": "Vahvista muoto" - }, "filePassword": { "message": "Tiedoston salasana" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Työkalut" }, + "import": { + "message": "Import" + }, "importData": { "message": "Tuo tietoja" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Palvelin" }, - "exportData": { - "message": "Vie tietoja" - }, "exportingOrganizationSecretDataTitle": { "message": "Organisaation salaisten tietojen vienti" }, diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json index cd201f852ef..1a4720094b9 100644 --- a/apps/web/src/locales/fil/messages.json +++ b/apps/web/src/locales/fil/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "I-export ang vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Format ng file" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Kumpirmahin ang master password" }, - "confirmFormat": { - "message": "Kumpirmahin ang pag-format" - }, "filePassword": { "message": "Password ng file" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Mga Kagamitan" }, + "import": { + "message": "Import" + }, "importData": { "message": "Mag-import ng data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "I-export ang mga datos" - }, "exportingOrganizationSecretDataTitle": { "message": "Pag-eexport ng Sekretong Data ng Organisasyon" }, diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json index 311f8912137..c2f107b9437 100644 --- a/apps/web/src/locales/fr/messages.json +++ b/apps/web/src/locales/fr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exporter à partir de" }, - "exportVault": { - "message": "Exporter le coffre" - }, - "exportSecrets": { - "message": "Exporter les secrets" - }, "fileFormat": { "message": "Format de fichier" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmer le mot de passe principal" }, - "confirmFormat": { - "message": "Confirmer le format" - }, "filePassword": { "message": "Mot de Passe du Fichier" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Outils" }, + "import": { + "message": "Importer" + }, "importData": { "message": "Importer des données" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Serveur" }, - "exportData": { - "message": "Exporter les données" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportation des Données Secrètes de l'Organisation" }, diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json index f882247b331..6e33295162c 100644 --- a/apps/web/src/locales/gl/messages.json +++ b/apps/web/src/locales/gl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json index 3a56db568a7..baf7bafeb7a 100644 --- a/apps/web/src/locales/he/messages.json +++ b/apps/web/src/locales/he/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "ייצא מ־" }, - "exportVault": { - "message": "ייצא כספת" - }, - "exportSecrets": { - "message": "ייצא סודות" - }, "fileFormat": { "message": "פורמט קובץ" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "אמת סיסמה ראשית" }, - "confirmFormat": { - "message": "אשר פורמט" - }, "filePassword": { "message": "סיסמת קובץ" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "כלים" }, + "import": { + "message": "Import" + }, "importData": { "message": "ייבא נתונים" }, @@ -8753,9 +8747,6 @@ "server": { "message": "שרת" }, - "exportData": { - "message": "ייצא נתונים" - }, "exportingOrganizationSecretDataTitle": { "message": "ייצוא נתונים ארגון סודיים" }, diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json index 5909b46ff33..bd4089e240f 100644 --- a/apps/web/src/locales/hi/messages.json +++ b/apps/web/src/locales/hi/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json index ff7cf0be88e..1716bdd25e8 100644 --- a/apps/web/src/locales/hr/messages.json +++ b/apps/web/src/locales/hr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Izvezi iz" }, - "exportVault": { - "message": "Izvezi trezor" - }, - "exportSecrets": { - "message": "Izvezi tajne" - }, "fileFormat": { "message": "Format datoteke" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potvrdi glavnu lozinku" }, - "confirmFormat": { - "message": "Potvrdi oblik" - }, "filePassword": { "message": "Lozinka datoteke" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alati" }, + "import": { + "message": "Import" + }, "importData": { "message": "Uvezi podatke" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Poslužitelj" }, - "exportData": { - "message": "Izvezi podatke" - }, "exportingOrganizationSecretDataTitle": { "message": "Izvoz tajnih podataka organizacije" }, diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json index eb437dcc678..38720b614fc 100644 --- a/apps/web/src/locales/hu/messages.json +++ b/apps/web/src/locales/hu/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportálás innen:" }, - "exportVault": { - "message": "Széf exportálása" - }, - "exportSecrets": { - "message": "Titkos adatok exportálása" - }, "fileFormat": { "message": "Fájlformátum" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Mesterjelszó megerősítése" }, - "confirmFormat": { - "message": "Formátum megerősítése" - }, "filePassword": { "message": "Fájl jelszó" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Eszközök" }, + "import": { + "message": "Importálás" + }, "importData": { "message": "Adatok importálása" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Szerver" }, - "exportData": { - "message": "Adatok exportálása" - }, "exportingOrganizationSecretDataTitle": { "message": "Szervezeti titkos adatok exportálása" }, diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json index 74804d5db8e..165deb7b917 100644 --- a/apps/web/src/locales/id/messages.json +++ b/apps/web/src/locales/id/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Ekspor dari" }, - "exportVault": { - "message": "Ekspor Brankas" - }, - "exportSecrets": { - "message": "Ekspor rahasia" - }, "fileFormat": { "message": "Format Berkas" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Konfirmasi sandi utama" }, - "confirmFormat": { - "message": "Konfirmasi format" - }, "filePassword": { "message": "Sandi berkas" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alat" }, + "import": { + "message": "Import" + }, "importData": { "message": "Impor Data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json index 3814df96b74..87015d32666 100644 --- a/apps/web/src/locales/it/messages.json +++ b/apps/web/src/locales/it/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Esporta da" }, - "exportVault": { - "message": "Esporta cassaforte" - }, - "exportSecrets": { - "message": "Esporta segreti" - }, "fileFormat": { "message": "Formato file" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Conferma password principale" }, - "confirmFormat": { - "message": "Conferma formato" - }, "filePassword": { "message": "Password del file" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Strumenti" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importa dati" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Esporta dati" - }, "exportingOrganizationSecretDataTitle": { "message": "Esportando dati segreti dell'organizzazione" }, diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json index 930b2ddd81d..b7f3426fa6e 100644 --- a/apps/web/src/locales/ja/messages.json +++ b/apps/web/src/locales/ja/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "エクスポート元" }, - "exportVault": { - "message": "保管庫のエクスポート" - }, - "exportSecrets": { - "message": "シークレットのエクスポート" - }, "fileFormat": { "message": "ファイル形式" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "マスターパスワードの確認" }, - "confirmFormat": { - "message": "フォーマットの確認" - }, "filePassword": { "message": "ファイルパスワード" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ツール" }, + "import": { + "message": "Import" + }, "importData": { "message": "データをインポート" }, @@ -8753,9 +8747,6 @@ "server": { "message": "サーバー" }, - "exportData": { - "message": "データのエクスポート" - }, "exportingOrganizationSecretDataTitle": { "message": "組織のシークレットデータのエクスポート" }, diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json index d1f614c61d7..1018f2255fc 100644 --- a/apps/web/src/locales/ka/messages.json +++ b/apps/web/src/locales/ka/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "ექსპორტი საცავის" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "ფაილის ფორმატი" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json index fd419fe7397..26f146809b5 100644 --- a/apps/web/src/locales/km/messages.json +++ b/apps/web/src/locales/km/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json index 5d5c07f2baa..9b4407e3ec6 100644 --- a/apps/web/src/locales/kn/messages.json +++ b/apps/web/src/locales/kn/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "ರಫ್ತು ವಾಲ್ಟ್" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "ಫೈಲ್ ಮಾದರಿ" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ಉಪಕರಣ" }, + "import": { + "message": "Import" + }, "importData": { "message": "ಡೇಟಾವನ್ನು ಆಮದು ಮಾಡಿ" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json index a3ea2982a4a..db88018ce26 100644 --- a/apps/web/src/locales/ko/messages.json +++ b/apps/web/src/locales/ko/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "보관함 내보내기" - }, - "exportSecrets": { - "message": "비밀 데이터 내보내기" - }, "fileFormat": { "message": "파일 형식" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "마스터 비밀번호 확인" }, - "confirmFormat": { - "message": "형식 확인" - }, "filePassword": { "message": "파일 암호" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "도구" }, + "import": { + "message": "Import" + }, "importData": { "message": "데이터 가져오기" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json index 42d8dc15f3c..4b1a5307179 100644 --- a/apps/web/src/locales/lv/messages.json +++ b/apps/web/src/locales/lv/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Izgūt no" }, - "exportVault": { - "message": "Izgūt glabātavas saturu" - }, - "exportSecrets": { - "message": "Izgūt noslēpumus" - }, "fileFormat": { "message": "Datnes veids" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Apstiprināt galveno paroli" }, - "confirmFormat": { - "message": "Apstiprināt veidolu" - }, "filePassword": { "message": "Datnes parole" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Rīki" }, + "import": { + "message": "Ievietot" + }, "importData": { "message": "Ievietot datus" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Serveris" }, - "exportData": { - "message": "Izgūt datus" - }, "exportingOrganizationSecretDataTitle": { "message": "Apvienības slepeno datu izgūšana" }, diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json index 907dd90fa2e..5943f3630a3 100644 --- a/apps/web/src/locales/ml/messages.json +++ b/apps/web/src/locales/ml/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "വാൾട് എക്സ്പോർട്" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "ഫയൽ ഫോർമാറ്റ്" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "ഉപകരണങ്ങൾ" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import Data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json index d8d7999dbe2..5d938996627 100644 --- a/apps/web/src/locales/mr/messages.json +++ b/apps/web/src/locales/mr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json index fd419fe7397..26f146809b5 100644 --- a/apps/web/src/locales/my/messages.json +++ b/apps/web/src/locales/my/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json index 444a13a68e1..9e5c0a6cbf4 100644 --- a/apps/web/src/locales/nb/messages.json +++ b/apps/web/src/locales/nb/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Eksport fra" }, - "exportVault": { - "message": "Eksporter hvelvet" - }, - "exportSecrets": { - "message": "Eksporter hemmeligheter" - }, "fileFormat": { "message": "Filformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bekreft hovedpassord" }, - "confirmFormat": { - "message": "Bekreft format" - }, "filePassword": { "message": "Filpassord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Verktøy" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importer data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Eksporter data" - }, "exportingOrganizationSecretDataTitle": { "message": "Eksporterer organisasjonens hemmelige data" }, diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json index 99f87c4fb75..9de1b17c391 100644 --- a/apps/web/src/locales/ne/messages.json +++ b/apps/web/src/locales/ne/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json index 0b648eaf204..51ac08fd814 100644 --- a/apps/web/src/locales/nl/messages.json +++ b/apps/web/src/locales/nl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exporteren vanuit" }, - "exportVault": { - "message": "Kluis exporteren" - }, - "exportSecrets": { - "message": "Geheimen exporteren" - }, "fileFormat": { "message": "Bestandsindeling" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Nieuw hoofdwachtwoord bevestigen" }, - "confirmFormat": { - "message": "Formaat bevestigen" - }, "filePassword": { "message": "Bestandswachtwoord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Hulpmiddelen" }, + "import": { + "message": "Importeren" + }, "importData": { "message": "Gegevens importeren" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Gegevens exporteren" - }, "exportingOrganizationSecretDataTitle": { "message": "Geheime gegevens van de organisatie exporteren" }, diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json index 8d1c2d1b394..389bf4516e3 100644 --- a/apps/web/src/locales/nn/messages.json +++ b/apps/web/src/locales/nn/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json index fd419fe7397..26f146809b5 100644 --- a/apps/web/src/locales/or/messages.json +++ b/apps/web/src/locales/or/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json index e90d3e1ab47..18207f16ca6 100644 --- a/apps/web/src/locales/pl/messages.json +++ b/apps/web/src/locales/pl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Eksportuj z" }, - "exportVault": { - "message": "Eksportuj sejf" - }, - "exportSecrets": { - "message": "Eksportuj sekrety" - }, "fileFormat": { "message": "Format pliku" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potwierdź hasło główne" }, - "confirmFormat": { - "message": "Potwierdź format" - }, "filePassword": { "message": "Hasło pliku" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Narzędzia" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importuj dane" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Serwer" }, - "exportData": { - "message": "Eksportuj dane" - }, "exportingOrganizationSecretDataTitle": { "message": "Eksportowanie sekretnych danych organizacji" }, diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json index 4c79ec5ecc4..297afd6f0bb 100644 --- a/apps/web/src/locales/pt_BR/messages.json +++ b/apps/web/src/locales/pt_BR/messages.json @@ -1519,7 +1519,7 @@ "message": "Pressione sua YubiKey para autenticar-se" }, "authenticationTimeout": { - "message": "Tempo limite da autenticação atingido" + "message": "Limite de tempo da autenticação atingido" }, "authenticationSessionTimedOut": { "message": "A sessão de autenticação expirou. Reinicie o processo de autenticação." @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportar de" }, - "exportVault": { - "message": "Exportar cofre" - }, - "exportSecrets": { - "message": "Exportar segredos" - }, "fileFormat": { "message": "Formato do arquivo" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmar senha principal" }, - "confirmFormat": { - "message": "Confirmar formato" - }, "filePassword": { "message": "Senha do arquivo" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Ferramentas" }, + "import": { + "message": "Importar" + }, "importData": { "message": "Importar dados" }, @@ -2871,7 +2865,7 @@ } }, "noExposedPasswords": { - "message": "Nenhum item em seu cofre tem senhas expostas em vazamentos de dados conhecidos." + "message": "Nenhum item no seu cofre tem senhas expostas em vazamentos de dados conhecidos." }, "checkExposedPasswords": { "message": "Conferir senhas expostas" @@ -3078,7 +3072,7 @@ "message": "Acesso de emergência" }, "premiumSignUpReports": { - "message": "Higiene de senhas, saúde da conta, e relatórios sobre vazamentos de dados para manter o seu cofre seguro." + "message": "Relatórios de higiene de senha, saúde da conta, e vazamentos de dados para manter o seu cofre seguro." }, "premiumSignUpTotp": { "message": "Gerador de código de verificação TOTP (2FA) para credenciais no seu cofre." @@ -5045,13 +5039,13 @@ "message": "Filtros" }, "vaultTimeout": { - "message": "Tempo limite do cofre" + "message": "Limite de tempo do cofre" }, "vaultTimeout1": { - "message": "Tempo limite" + "message": "Limite de tempo" }, "vaultTimeoutDesc": { - "message": "Escolha quando o seu cofre executará a ação do tempo limite do cofre." + "message": "Escolha quando o seu cofre executará a ação do limite de tempo do cofre." }, "vaultTimeoutLogoutDesc": { "message": "Escolha quando seu cofre será desconectado." @@ -5332,7 +5326,7 @@ "message": "Preferência do usuário" }, "vaultTimeoutAction": { - "message": "Ação do tempo limite do cofre" + "message": "Ação do limite de tempo do cofre" }, "vaultTimeoutActionLockDesc": { "message": "A senha principal ou outro método de desbloqueio é necessário para acessar seu cofre novamente." @@ -5409,10 +5403,10 @@ } }, "vaultTimeoutLogOutConfirmation": { - "message": "Desconectar-se irá remover todo o acesso ao seu cofre e requirirá autenticação on-line após o período de tempo limite. Tem certeza de que deseja usar esta configuração?" + "message": "Desconectar-se irá remover todo o acesso ao seu cofre e requirirá autenticação on-line após o período de limite de tempo. Tem certeza de que deseja usar esta configuração?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de ação do tempo limite" + "message": "Confirmação de ação do limite de tempo" }, "hidePasswords": { "message": "Ocultar senhas" @@ -6703,22 +6697,22 @@ "message": "Sua organização atualizou suas opções de descriptografia. Configure uma senha principal para acessar seu cofre." }, "sessionTimeoutPolicyTitle": { - "message": "Tempo limite da sessão" + "message": "Limite de tempo da sessão" }, "sessionTimeoutPolicyDescription": { - "message": "Configure um tempo limite máximo para a sessão de todos os membros, exceto os proprietários." + "message": "Configure um limite de tempo máximo para a sessão de todos os membros, exceto os proprietários." }, "maximumAllowedTimeout": { - "message": "Tempo limite máximo permitido" + "message": "Limite de tempo máximo permitido" }, "maximumAllowedTimeoutRequired": { - "message": "Tempo limite máximo permitido é necessário." + "message": "Limite de tempo máximo permitido é necessário." }, "sessionTimeoutPolicyInvalidTime": { "message": "Tempo é inválido. Altere pelo menos um valor." }, "sessionTimeoutAction": { - "message": "Ação do tempo limite da sessão" + "message": "Ação do limite de tempo da sessão" }, "immediately": { "message": "Imediatamente" @@ -6736,7 +6730,7 @@ "message": "Minutos" }, "sessionTimeoutConfirmationNeverTitle": { - "message": "Você tem certeza de que deseja permitir um tempo limite máximo de \"Nunca\" para todos os membros?" + "message": "Você tem certeza de que deseja permitir um limite de tempo máximo de \"Nunca\" para todos os membros?" }, "sessionTimeoutConfirmationNeverDescription": { "message": "Esta opção salvará as chaves criptográficas dos seus membros em seus dispositivos. Se escolher esta opção, certifique-se de que seus dispositivos estão adequadamente protegidos." @@ -6751,7 +6745,7 @@ "message": "O aplicativo móvel e web usarão \"no reinício do aplicativo\" como tempo máximo permitido, já que a opção não é suportada." }, "vaultTimeoutPolicyInEffect": { - "message": "As políticas da sua organização configuraram o seu máximo permitido do tempo limite do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", + "message": "As políticas da sua organização configuraram o seu máximo permitido do limite de tempo do cofre para $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { "hours": { "content": "$1", @@ -6777,7 +6771,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "As políticas da sua organização estão afetando o tempo limite do seu cofre. \nO tempo limite máximo permitido para o cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de tempo limite do seu cofre está configurada como $ACTION$.", + "message": "As políticas da sua organização estão afetando o limite de tempo do seu cofre. \nO limite de tempo máximo permitido para o cofre é $HOURS$ hora(s) e $MINUTES$ minuto(s). A ação de limite de tempo do seu cofre está configurada como $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -6794,7 +6788,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "As políticas da sua organização configuraram a ação do tempo limite do seu cofre para $ACTION$.", + "message": "As políticas da sua organização configuraram a ação do limite de tempo do seu cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -6803,13 +6797,13 @@ } }, "vaultTimeoutToLarge": { - "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." + "message": "O limite de tempo do seu cofre excede as restrições estabelecidas pela sua organização." }, "vaultCustomTimeoutMinimum": { - "message": "O mínimo do tempo limite personalizado é de 1 minuto." + "message": "O mínimo do limite de tempo personalizado é de 1 minuto." }, "vaultTimeoutRangeError": { - "message": "Tempo limite do cofre não está dentro do intervalo permitido." + "message": "Limite de tempo do cofre não está dentro do intervalo permitido." }, "disableExport": { "message": "Remover exportação" @@ -8753,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar dados" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportando dados de segredos da organização" }, @@ -9188,7 +9179,7 @@ "message": "Remover acesso" }, "checkForBreaches": { - "message": "Conferir vazamentos de dados conhecidos por esta senha" + "message": "Conferir se esta senha vazou ao público" }, "exposedMasterPassword": { "message": "Senha principal exposta" @@ -12204,28 +12195,28 @@ "message": "Um domínio deve ser reivindicado antes de ativar esta política." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Configure um método de desbloqueio para alterar a ação do tempo limite do cofre." + "message": "Configure um método de desbloqueio para alterar a ação do limite de tempo do cofre." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Os requisitos de política empresarial foram aplicados às suas opções de tempo limite" + "message": "Os requisitos de política empresarial foram aplicados às suas opções de limite de tempo" }, "vaultTimeoutTooLarge": { - "message": "O tempo limite do seu cofre excede as restrições estabelecidas pela sua organização." + "message": "O limite de tempo do seu cofre excede as restrições estabelecidas pela sua organização." }, "neverLockWarning": { "message": "Você tem certeza que deseja usar a opção \"Nunca\"? Ao usar o \"Nunca\", a chave de criptografia do seu cofre é armazenada no seu dispositivo. Se você usar esta opção, deve garantir que mantém seu dispositivo devidamente protegido." }, "sessionTimeoutSettingsAction": { - "message": "Ação do tempo limite" + "message": "Ação do limite de tempo" }, "sessionTimeoutHeader": { - "message": "Tempo limite da sessão" + "message": "Limite de tempo da sessão" }, "appearance": { "message": "Aparência" }, "vaultTimeoutPolicyMaximumError": { - "message": "O tempo limite excede a restrição configurada pela sua organização: máximo de $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "message": "O limite de tempo excede a restrição configurada pela sua organização: máximo de $HOURS$ hora(s) e $MINUTES$ minuto(s)", "placeholders": { "hours": { "content": "$1", @@ -12350,10 +12341,10 @@ } }, "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { - "message": "A sua organização configurou o tempo de limite máximo padrão da sessão para ser no recarregar do navegador." + "message": "A sua organização configurou o limite de tempo padrão da sessão para ser no recarregar do navegador." }, "sessionTimeoutSettingsPolicyMaximumError": { - "message": "O tempo limite máximo não pode exceder $HOURS$ hora(s) e $MINUTES$ minuto(s)", + "message": "O limite de tempo máximo não pode exceder $HOURS$ hora(s) e $MINUTES$ minuto(s)", "placeholders": { "hours": { "content": "$1", @@ -12369,7 +12360,7 @@ "message": "No recarregar do navegador" }, "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { - "message": "Configure um método de desbloqueio para alterar a ação do tempo limite" + "message": "Configure um método de desbloqueio para alterar a ação do limite de tempo" }, "leaveConfirmationDialogTitle": { "message": "Tem certeza de que quer sair?" diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json index 7b0e9e8a197..a3a5a627215 100644 --- a/apps/web/src/locales/pt_PT/messages.json +++ b/apps/web/src/locales/pt_PT/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportar de" }, - "exportVault": { - "message": "Exportar cofre" - }, - "exportSecrets": { - "message": "Exportar segredos" - }, "fileFormat": { "message": "Formato do ficheiro" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmar a palavra-passe mestra" }, - "confirmFormat": { - "message": "Confirmar formato" - }, "filePassword": { "message": "Palavra-passe do ficheiro" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Ferramentas" }, + "import": { + "message": "Importar" + }, "importData": { "message": "Importar dados" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Servidor" }, - "exportData": { - "message": "Exportar dados" - }, "exportingOrganizationSecretDataTitle": { "message": "A exportar dados secretos da organização" }, @@ -12238,43 +12229,43 @@ } }, "removeMasterPasswordForOrgUserKeyConnector": { - "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + "message": "A sua organização já não utiliza palavras-passe mestras para iniciar sessão no Bitwarden. Para continuar, verifique a organização e o domínio." }, "continueWithLogIn": { - "message": "Continue with log in" + "message": "Continuar com o início de sessão" }, "doNotContinue": { - "message": "Do not continue" + "message": "Não continuar" }, "domain": { - "message": "Domain" + "message": "Domínio" }, "keyConnectorDomainTooltip": { - "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + "message": "Este domínio armazenará as chaves de encriptação da sua conta, portanto certifique-se de que confia nele. Se não tiver a certeza, verifique com o seu administrador." }, "verifyYourOrganization": { - "message": "Verify your organization to log in" + "message": "Verifique a sua organização para iniciar sessão" }, "organizationVerified": { - "message": "Organization verified" + "message": "Organização verificada" }, "domainVerified": { - "message": "Domain verified" + "message": "Domínio verificado" }, "leaveOrganizationContent": { - "message": "If you don't verify your organization, your access to the organization will be revoked." + "message": "Se não verificar a sua organização, o seu acesso à organização será revogado." }, "leaveNow": { - "message": "Leave now" + "message": "Sair agora" }, "verifyYourDomainToLogin": { - "message": "Verify your domain to log in" + "message": "Verifique o seu domínio para iniciar sessão" }, "verifyYourDomainDescription": { - "message": "To continue with log in, verify this domain." + "message": "Para continuar com o início de sessão, verifique este domínio." }, "confirmKeyConnectorOrganizationUserDescription": { - "message": "To continue with log in, verify the organization and domain." + "message": "Para continuar com o início de sessão, verifique a organização e o domínio." }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "Não foram selecionadas aplicações críticas" diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json index 9ae83220ebd..1a573ef82fe 100644 --- a/apps/web/src/locales/ro/messages.json +++ b/apps/web/src/locales/ro/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export seif" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Format fișier" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirmare parolă principală" }, - "confirmFormat": { - "message": "Confirmare format" - }, "filePassword": { "message": "Parola fișierului" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Unelte" }, + "import": { + "message": "Import" + }, "importData": { "message": "Importare date" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json index 7637c2baab5..0d7ccc71c00 100644 --- a/apps/web/src/locales/ru/messages.json +++ b/apps/web/src/locales/ru/messages.json @@ -1522,7 +1522,7 @@ "message": "Таймаут аутентификации" }, "authenticationSessionTimedOut": { - "message": "Сеанс аутентификации завершился по времени. Пожалуйста, попробуйте войти еще раз." + "message": "Сессия аутентификации завершилась по времени. Пожалуйста, перезапустите процесс авторизации." }, "verifyYourIdentity": { "message": "Подтвердите вашу личность" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Экспорт из" }, - "exportVault": { - "message": "Экспорт хранилища" - }, - "exportSecrets": { - "message": "Экспорт секретов" - }, "fileFormat": { "message": "Формат файла" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Подтвердите мастер-пароль" }, - "confirmFormat": { - "message": "Подтвердить формат" - }, "filePassword": { "message": "Пароль к файлу" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Инструменты" }, + "import": { + "message": "Импорт" + }, "importData": { "message": "Импорт данных" }, @@ -4479,7 +4473,7 @@ "message": "Обновить браузер" }, "generatingYourAccessIntelligence": { - "message": "Generating your Access Intelligence..." + "message": "Ваша информация о доступе генерируется..." }, "fetchingMemberData": { "message": "Получение данных о пользователях..." @@ -5054,7 +5048,7 @@ "message": "Выберите тайм-аут для хранилища и действие, которое необходимо предпринять." }, "vaultTimeoutLogoutDesc": { - "message": "Выберите, когда сеанс хранилища будет завершен." + "message": "Выберите время выхода из хранилища." }, "oneMinute": { "message": "1 минута" @@ -6466,7 +6460,7 @@ "message": "Повторно приглашен успешно" }, "bulkReinviteSuccessToast": { - "message": "$COUNT$ users re-invited", + "message": "$COUNT$ пользователей снова приглашены", "placeholders": { "count": { "content": "$1", @@ -6475,7 +6469,7 @@ } }, "bulkReinviteLimitedSuccessToast": { - "message": "$LIMIT$ of $SELECTEDCOUNT$ users re-invited. $EXCLUDEDCOUNT$ were not invited due to the $LIMIT$ invite limit.", + "message": "$LIMIT$ из $SELECTEDCOUNT$ пользователей повторно приглашены. $EXCLUDEDCOUNT$ не был приглашен из-за лимита приглашений $LIMIT$.", "placeholders": { "limit": { "content": "$1", @@ -6685,7 +6679,7 @@ "message": "Мастер-пароль не соответствует требованиям политики этой организации. Чтобы присоединиться к организации, нужно обновить мастер-пароль. Текущая сессия будет завершена и потребуется повторная авторизация. Сессии на других устройствах могут оставаться активными в течение часа." }, "updateWeakMasterPasswordWarning": { - "message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущий сеанс будет завершен и потребуется повторная авторизация. Сеансы на других устройствах могут оставаться активными в течение часа." + "message": "Ваш мастер-пароль не соответствует требованиям политики вашей организации. Для доступа к хранилищу вы должны обновить свой мастер-пароль прямо сейчас. При этом текущая сессия будет завершена и потребуется повторная авторизация. Сессии на других устройствах могут оставаться активными в течение часа." }, "automaticAppLoginWithSSO": { "message": "Автовход с помощью SSO" @@ -6703,10 +6697,10 @@ "message": "Ваша организация обновила параметры расшифровки. Пожалуйста, установите мастер-пароль для доступа к вашему хранилищу." }, "sessionTimeoutPolicyTitle": { - "message": "Тайм-аут сеанса" + "message": "Тайм-аут сессии" }, "sessionTimeoutPolicyDescription": { - "message": "Установите максимальный тайм-аут сеанса для всех участников, кроме владельцев." + "message": "Установите максимальный тайм-аут сессии для всех участников, кроме владельцев." }, "maximumAllowedTimeout": { "message": "Максимально допустимый тайм-аут" @@ -6718,7 +6712,7 @@ "message": "Время указано неверно. Измените хотя бы одно значение." }, "sessionTimeoutAction": { - "message": "Действие при тайм-ауте сеанса" + "message": "Действие при тайм-ауте сессии" }, "immediately": { "message": "Немедленно" @@ -8753,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Экспорт данных" - }, "exportingOrganizationSecretDataTitle": { "message": "Экспорт секретных данных организации" }, @@ -12000,7 +11991,7 @@ "message": "Членство Families" }, "advancedOnlineSecurity": { - "message": "Advanced online security" + "message": "Расширенная онлайн-безопасность" }, "planDescFamiliesV2": { "message": "Премиальная защищенность \n для вашей семьи" @@ -12210,22 +12201,22 @@ "message": "К настройкам тайм-аута были применены требования корпоративной политики" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Тайм-аут вашего хранилища превышает ограничения, установленные вашей организацией." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Вы действительно хотите отключить блокировку хранилища? В этом случае ключ шифрования вашего хранилища будет сохранен на вашем устройстве. Отключая блокировку, вы должны убедиться, что ваше устройство надежно защищено." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Тайм-аут действия" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Тайм-аут сессии" }, "appearance": { - "message": "Appearance" + "message": "Внешний вид" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Время ожидания превышает установленное организацией максимальное ограничение: $HOURS$ час. $MINUTES$ мин.", "placeholders": { "hours": { "content": "$1", @@ -12334,10 +12325,10 @@ "message": "Сохранить журналы диагностики" }, "sessionTimeoutSettingsManagedByOrganization": { - "message": "This setting is managed by your organization." + "message": "Эта настройка управляется вашей организацией." }, "sessionTimeoutSettingsPolicySetMaximumTimeoutToHoursMinutes": { - "message": "Your organization has set the maximum session timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "В вашей организации максимальный тайм-аут сессии установлен равным $HOURS$ час. и $MINUTES$ мин.", "placeholders": { "hours": { "content": "$1", @@ -12350,10 +12341,10 @@ } }, "sessionTimeoutSettingsPolicySetDefaultTimeoutToOnRestart": { - "message": "Your organization has set the default session timeout to On browser refresh." + "message": "Ваша организация установила тайм-аут сессии по умолчанию на При обновлении браузера." }, "sessionTimeoutSettingsPolicyMaximumError": { - "message": "Maximum timeout cannot exceed $HOURS$ hour(s) and $MINUTES$ minute(s)", + "message": "Максимальный тайм-аут не может превышать $HOURS$ час. и $MINUTES$ мин.", "placeholders": { "hours": { "content": "$1", @@ -12366,10 +12357,10 @@ } }, "sessionTimeoutOnRestart": { - "message": "On browser refresh" + "message": "При обновлении браузера" }, "sessionTimeoutSettingsSetUnlockMethodToChangeTimeoutAction": { - "message": "Set an unlock method to change your timeout action" + "message": "Установите способ разблокировки для изменения действия при истечении тайм-аута" }, "leaveConfirmationDialogTitle": { "message": "Вы уверены, что хотите покинуть?" diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json index 432a61608b5..f896cc8c79a 100644 --- a/apps/web/src/locales/si/messages.json +++ b/apps/web/src/locales/si/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json index 698c71f458f..cb0adb25c0a 100644 --- a/apps/web/src/locales/sk/messages.json +++ b/apps/web/src/locales/sk/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportovať z" }, - "exportVault": { - "message": "Export trezoru" - }, - "exportSecrets": { - "message": "Exportovať položky" - }, "fileFormat": { "message": "Formát Súboru" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potvrdiť hlavné heslo" }, - "confirmFormat": { - "message": "Potvrdiť formát" - }, "filePassword": { "message": "Heslo súboru" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Nástroje" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import dát" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Exportovať dáta" - }, "exportingOrganizationSecretDataTitle": { "message": "Exportovať tajné dáta Organizácie" }, diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json index 97a3f12c606..8b86e7b6060 100644 --- a/apps/web/src/locales/sl/messages.json +++ b/apps/web/src/locales/sl/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Izvoz trezorja" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "Format datoteke" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Potrdite glavno geslo" }, - "confirmFormat": { - "message": "Potrdi format" - }, "filePassword": { "message": "Geslo datoteke" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Orodja" }, + "import": { + "message": "Import" + }, "importData": { "message": "Uvozi podatke" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json index 5527124ca73..1ff92f67064 100644 --- a/apps/web/src/locales/sr_CS/messages.json +++ b/apps/web/src/locales/sr_CS/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Izvezi trezor" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Alati" }, + "import": { + "message": "Import" + }, "importData": { "message": "Uvezi podatke" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/sr_CY/messages.json b/apps/web/src/locales/sr_CY/messages.json index 835e4081be3..e1d19054ac3 100644 --- a/apps/web/src/locales/sr_CY/messages.json +++ b/apps/web/src/locales/sr_CY/messages.json @@ -197,13 +197,13 @@ "message": "Assign at-risk members guided security tasks to update credentials." }, "feature3Title": { - "message": "Monitor progress" + "message": "Праћење напретка" }, "feature3Description": { - "message": "Track changes over time to show security improvements." + "message": "Пратите промене током времена да бисте показали безбедносна побољшања." }, "noReportsRunTitle": { - "message": "Generate report" + "message": "Генеришите извештај" }, "noReportsRunDescription": { "message": "You’re ready to start generating reports. Once you generate, you’ll be able to:" @@ -344,10 +344,10 @@ "message": "Апликације које треба прегледати" }, "newApplicationsCardTitle": { - "message": "Review new applications" + "message": "Прегледајте нове апликације" }, "newApplicationsWithCount": { - "message": "$COUNT$ new applications", + "message": "Нове апликације: $COUNT$", "placeholders": { "count": { "content": "$1", @@ -380,7 +380,7 @@ "message": "Review applications to secure the items most critical to your organization's security" }, "reviewApplications": { - "message": "Review applications" + "message": "Прегледајте апликације" }, "prioritizeCriticalApplications": { "message": "Дајте приоритет критичним апликацијама" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Извоз од" }, - "exportVault": { - "message": "Извоз сефа" - }, - "exportSecrets": { - "message": "Извоз тајне" - }, "fileFormat": { "message": "Формат датотеке" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Потрдити Главну Лозинку" }, - "confirmFormat": { - "message": "Потврдити формат" - }, "filePassword": { "message": "Лозинка датотеке" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Алатке" }, + "import": { + "message": "Увоз" + }, "importData": { "message": "Увези податке" }, @@ -3063,7 +3057,7 @@ "message": "1ГБ шифровано складиште за прилоге." }, "premiumSignUpStorageV2": { - "message": "$SIZE$ encrypted storage for file attachments.", + "message": "$SIZE$ шифровано складиште за прилоге.", "placeholders": { "size": { "content": "$1", @@ -3134,7 +3128,7 @@ } }, "premiumSubscriptionEnded": { - "message": "Your Premium subscription ended" + "message": "Ваша Премијум претплата је завршена" }, "premiumSubscriptionEndedDesc": { "message": "To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, it'll be moved back into your vault." @@ -3263,10 +3257,10 @@ "message": "Следеће пуњење" }, "nextChargeHeader": { - "message": "Next Charge" + "message": "Следеће пуњење" }, "plan": { - "message": "Plan" + "message": "План" }, "details": { "message": "Детаљи" @@ -4636,10 +4630,10 @@ "message": "The new recommended encryption settings will improve your account security. Enter your master password to update now." }, "confirmIdentityToContinue": { - "message": "Confirm your identity to continue" + "message": "Да бисте наставили потврдите ваш идентитет" }, "enterYourMasterPassword": { - "message": "Enter your master password" + "message": "Унети вашу главну лозинку" }, "updateSettings": { "message": "Ажурирај подешавања" @@ -5170,19 +5164,19 @@ "description": "This is a verb. ex. 'Fix The Car'" }, "fixEncryption": { - "message": "Fix encryption" + "message": "Поправи шифровање" }, "fixEncryptionTooltip": { - "message": "This file is using an outdated encryption method." + "message": "Ова датотека користи застарели метод шифровања." }, "attachmentUpdated": { - "message": "Attachment updated" + "message": "Прилог је ажуриран" }, "oldAttachmentsNeedFixDesc": { "message": "У вашем сефу постоје стари прилози који треба поправити да бисте могли да промените кључ за шифровање свог налога." }, "itemsTransferred": { - "message": "Items transferred" + "message": "Пренете ставке" }, "yourAccountsFingerprint": { "message": "Ваша Сигурносна Фраза Сефа", @@ -8753,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Увези податке" - }, "exportingOrganizationSecretDataTitle": { "message": "Извоз тајних података организације" }, @@ -11594,31 +11585,31 @@ "description": "Verb" }, "unArchive": { - "message": "Unarchive" + "message": "Врати из архиве" }, "itemsInArchive": { - "message": "Items in archive" + "message": "Ставке у архиви" }, "noItemsInArchive": { "message": "Нема ставка у архиви" }, "noItemsInArchiveDesc": { - "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions." + "message": "Архивиране ставке ће се овде појавити и бити искључени из општих резултата претраге и сугестија о ауто-пуњењу." }, "itemWasSentToArchive": { - "message": "Item was sent to archive" + "message": "Ставка је послата у архиву" }, "itemsWereSentToArchive": { - "message": "Items were sent to archive" + "message": "Ставке су послате у архиву" }, "itemUnarchived": { - "message": "Item was unarchived" + "message": "Ставка враћена из архиве" }, "bulkArchiveItems": { - "message": "Items archived" + "message": "Ставке у архиви" }, "bulkUnarchiveItems": { - "message": "Items unarchived" + "message": "Ставке враћене из архиве" }, "archiveItem": { "message": "Archive item", @@ -12126,7 +12117,7 @@ "message": "There was an error calculating tax for your location. Please try again." }, "individualUpgradeWelcomeMessage": { - "message": "Welcome to Bitwarden" + "message": "Добродошли у Bitwarden" }, "individualUpgradeDescriptionMessage": { "message": "Unlock more security features with Premium, or start sharing items with Families" @@ -12144,7 +12135,7 @@ "message": "Upgrade your plan" }, "upgradeNow": { - "message": "Upgrade now" + "message": "Надогради сада" }, "formWillCreateNewFamiliesOrgMessage": { "message": "Completing this form will create a new Families organization. You can upgrade your Free organization from the Admin Console." @@ -12204,28 +12195,28 @@ "message": "A domain must be claimed before activating this policy." }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Подесите метод откључавања да бисте променили радњу временског ограничења сефа." }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Захтеви политике предузећа су примењени на опције тајмаута" }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "Време истека вашег сефа је премашило дозвољена ограничења од стране ваше организације." }, "neverLockWarning": { - "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + "message": "Да ли сте сигурни да желите да користите опцију „Никад“? Ако поставите опције закључавања на „Никада“, на вашем уређају се чува кључ за шифровање сефа. Ако користите ову опцију, осигурајте да је уређај правилно заштићен." }, "sessionTimeoutSettingsAction": { - "message": "Timeout action" + "message": "Акција тајмаута" }, "sessionTimeoutHeader": { - "message": "Session timeout" + "message": "Истек сесије" }, "appearance": { - "message": "Appearance" + "message": "Изглед" }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Тајмаут је већи него што је решила организација: макимум $HOURS$ сат(а) и $MINUTES$ минут(а)", "placeholders": { "hours": { "content": "$1", @@ -12238,49 +12229,49 @@ } }, "removeMasterPasswordForOrgUserKeyConnector": { - "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + "message": "Ваша организација више не користи главне лозинке за пријаву на Bitwarden. Да бисте наставили, верификујте организацију и домен." }, "continueWithLogIn": { - "message": "Continue with log in" + "message": "Наставити са пријавом" }, "doNotContinue": { - "message": "Do not continue" + "message": "Не настави" }, "domain": { - "message": "Domain" + "message": "Домен" }, "keyConnectorDomainTooltip": { - "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + "message": "Овај домен ће чувати кључеве за шифровање вашег налога, па се уверите да му верујете. Ако нисте сигурни, проверите код свог администратора." }, "verifyYourOrganization": { - "message": "Verify your organization to log in" + "message": "Верификујте своју организацију да бисте се пријавили" }, "organizationVerified": { - "message": "Organization verified" + "message": "Организација верификована" }, "domainVerified": { - "message": "Domain verified" + "message": "Домен верификован" }, "leaveOrganizationContent": { - "message": "If you don't verify your organization, your access to the organization will be revoked." + "message": "Ако не верификујете своју организацију, ваш приступ организацији ће бити опозван." }, "leaveNow": { - "message": "Leave now" + "message": "Напусти сада" }, "verifyYourDomainToLogin": { - "message": "Verify your domain to log in" + "message": "Верификујте домен да бисте се пријавили" }, "verifyYourDomainDescription": { - "message": "To continue with log in, verify this domain." + "message": "Да бисте наставили са пријављивањем, верификујте овај домен." }, "confirmKeyConnectorOrganizationUserDescription": { - "message": "To continue with log in, verify the organization and domain." + "message": "Да бисте наставили са пријављивањем, верификујте организацију и домен." }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "No critical applications are selected" }, "confirmNoSelectedCriticalApplicationsDesc": { - "message": "Are you sure you want to continue?" + "message": "Желите ли заиста да наставите?" }, "userVerificationFailed": { "message": "User verification failed." @@ -12304,7 +12295,7 @@ "message": "Your public-key encryption key pair could not be recovered. Do you want to replace your encryption key with a new key pair? This will require you to set up existing emergency-access and organization memberships again." }, "recoveryStepSyncTitle": { - "message": "Synchronizing data" + "message": "Усклађивање података" }, "recoveryStepPrivateKeyTitle": { "message": "Verifying encryption key integrity" @@ -12381,7 +12372,7 @@ "message": "Contact your admin to regain access." }, "leaveConfirmationDialogConfirmButton": { - "message": "Leave $ORGANIZATION$", + "message": "Напустити $ORGANIZATION$", "placeholders": { "organization": { "content": "$1", diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json index 57495a63fa8..7cca1d484b7 100644 --- a/apps/web/src/locales/sv/messages.json +++ b/apps/web/src/locales/sv/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Exportera från" }, - "exportVault": { - "message": "Exportera valv" - }, - "exportSecrets": { - "message": "Exportera hemligheter" - }, "fileFormat": { "message": "Filformat" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Bekräfta huvudlösenord" }, - "confirmFormat": { - "message": "Bekräfta format" - }, "filePassword": { "message": "Fillösenord" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Verktyg" }, + "import": { + "message": "Importera" + }, "importData": { "message": "Importera data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Exportera data" - }, "exportingOrganizationSecretDataTitle": { "message": "Export av hemliga organisationsdata" }, diff --git a/apps/web/src/locales/ta/messages.json b/apps/web/src/locales/ta/messages.json index 5f2a1afba42..62e28d08097 100644 --- a/apps/web/src/locales/ta/messages.json +++ b/apps/web/src/locales/ta/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "இதிலிருந்து ஏற்றுமதி" }, - "exportVault": { - "message": "பெட்டகத்தை ஏற்றுமதி செய்" - }, - "exportSecrets": { - "message": "ரகசியங்களை ஏற்றுமதி செய்" - }, "fileFormat": { "message": "கோப்பு வடிவம்" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "முதன்மை கடவுச்சொல்லை உறுதிப்படுத்தவும்" }, - "confirmFormat": { - "message": "வடிவத்தை உறுதிப்படுத்தவும்" - }, "filePassword": { "message": "கோப்பு கடவுச்சொல்" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "கருவிகள்" }, + "import": { + "message": "Import" + }, "importData": { "message": "தரவை இம்போர்ட் செய்யவும்" }, @@ -8753,9 +8747,6 @@ "server": { "message": "சேவையகம்" }, - "exportData": { - "message": "தரவை ஏற்றுமதி செய்" - }, "exportingOrganizationSecretDataTitle": { "message": "நிறுவன இரகசிய தரவை ஏற்றுமதி செய்தல்" }, diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json index fd419fe7397..26f146809b5 100644 --- a/apps/web/src/locales/te/messages.json +++ b/apps/web/src/locales/te/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "File format" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json index 362db4faea2..431c7fc014c 100644 --- a/apps/web/src/locales/th/messages.json +++ b/apps/web/src/locales/th/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Export from" }, - "exportVault": { - "message": "Export vault" - }, - "exportSecrets": { - "message": "Export secrets" - }, "fileFormat": { "message": "รูปแบบไฟล์" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Confirm master password" }, - "confirmFormat": { - "message": "Confirm format" - }, "filePassword": { "message": "File password" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Tools" }, + "import": { + "message": "Import" + }, "importData": { "message": "Import data" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Server" }, - "exportData": { - "message": "Export data" - }, "exportingOrganizationSecretDataTitle": { "message": "Exporting Organization Secret Data" }, diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json index dbb8eb2d299..99e1225731f 100644 --- a/apps/web/src/locales/tr/messages.json +++ b/apps/web/src/locales/tr/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Dışa aktarılacak konum" }, - "exportVault": { - "message": "Kasayı dışa aktar" - }, - "exportSecrets": { - "message": "Sırları dışa aktar" - }, "fileFormat": { "message": "Dosya biçimi" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Ana parolayı onaylayın" }, - "confirmFormat": { - "message": "Biçimi onayla" - }, "filePassword": { "message": "Dosya parolası" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Araçlar" }, + "import": { + "message": "İçe aktar" + }, "importData": { "message": "Verileri içe aktar" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Sunucu" }, - "exportData": { - "message": "Verileri dışarı aktar" - }, "exportingOrganizationSecretDataTitle": { "message": "Kuruluş Gizli Verilerini Dışa Aktarma" }, diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json index 0cc96b69904..b269058799d 100644 --- a/apps/web/src/locales/uk/messages.json +++ b/apps/web/src/locales/uk/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Експортувати з" }, - "exportVault": { - "message": "Експортувати сховище" - }, - "exportSecrets": { - "message": "Експортувати секрети" - }, "fileFormat": { "message": "Формат файлу" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Підтвердьте головний пароль" }, - "confirmFormat": { - "message": "Підтвердити формат" - }, "filePassword": { "message": "Пароль файлу" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Інструменти" }, + "import": { + "message": "Import" + }, "importData": { "message": "Імпортувати дані" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Сервер" }, - "exportData": { - "message": "Експортувати дані" - }, "exportingOrganizationSecretDataTitle": { "message": "Експорт секретних даних організації" }, diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json index aa32aa4254c..7397aed6f94 100644 --- a/apps/web/src/locales/vi/messages.json +++ b/apps/web/src/locales/vi/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "Xuất từ" }, - "exportVault": { - "message": "Xuất kho" - }, - "exportSecrets": { - "message": "Xuất bí mật" - }, "fileFormat": { "message": "Định dạng tập tin" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "Nhập lại mật khẩu chính" }, - "confirmFormat": { - "message": "Xác nhận định dạng" - }, "filePassword": { "message": "Mật khẩu tập tin" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "Công cụ" }, + "import": { + "message": "Import" + }, "importData": { "message": "Nhập dữ liệu" }, @@ -8753,9 +8747,6 @@ "server": { "message": "Máy chủ" }, - "exportData": { - "message": "Xuất dữ liệu" - }, "exportingOrganizationSecretDataTitle": { "message": "Xuất dữ liệu bí mật của tổ chức" }, diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json index e6da8945be8..073afec7fe6 100644 --- a/apps/web/src/locales/zh_CN/messages.json +++ b/apps/web/src/locales/zh_CN/messages.json @@ -1375,7 +1375,7 @@ "message": "使用设备登录" }, "loginWithDeviceEnabledNote": { - "message": "必须在 Bitwarden App 的设置中启用设备登录。需要其他登录选项吗?" + "message": "必须在 Bitwarden App 的设置中启用设备登录。需要其他选项吗?" }, "needAnotherOptionV1": { "message": "需要其他选项吗?" @@ -1411,7 +1411,7 @@ "message": "通行密钥无效。请重试。" }, "twoFactorForPasskeysNotSupportedOnClientUpdateToLogIn": { - "message": "不支持通行密钥 2FA。请更新 App 再登录。" + "message": "不支持通行密钥 2FA。请更新 App 以登录。" }, "loginWithPasskeyInfo": { "message": "使用已生成的通行密钥,无需密码即可自动登录。生物识别(例如面部识别或指纹)或其他 FIDO2 安全方法将用于验证您的身份。" @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "导出自" }, - "exportVault": { - "message": "导出密码库" - }, - "exportSecrets": { - "message": "导出机密" - }, "fileFormat": { "message": "文件格式" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "确认主密码" }, - "confirmFormat": { - "message": "确认格式" - }, "filePassword": { "message": "文件密码" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "工具" }, + "import": { + "message": "导入" + }, "importData": { "message": "导入数据" }, @@ -3655,7 +3649,7 @@ "message": "确定要退出该组织吗?" }, "leftOrganization": { - "message": "您已经退出该组织。" + "message": "您已退出该组织" }, "defaultCollection": { "message": "默认集合" @@ -3718,7 +3712,7 @@ "message": "撤销成员后,他们将不再具有对组织数据的访问权限。要快速恢复此成员的访问权限,请转到「已撤销」标签页。" }, "removeUserConfirmationKeyConnector": { - "message": "警告!此用户需要 Key Connector 来管理他们的加密。从您的组织中移除此用户将永久停用他们的账户。此操作无法撤消。您要继续吗?" + "message": "警告!此用户需要 Key Connector 来管理他们的加密。从您的组织中移除此用户将永久停用他们的账户。此操作无法撤消。要继续吗?" }, "externalId": { "message": "外部 ID" @@ -4636,7 +4630,7 @@ "message": "新推荐的加密设置将提高您的账户安全性。输入您的主密码以立即更新。" }, "confirmIdentityToContinue": { - "message": "确认您的身份后继续" + "message": "确认您的身份以继续" }, "enterYourMasterPassword": { "message": "输入您的主密码" @@ -6475,7 +6469,7 @@ } }, "bulkReinviteLimitedSuccessToast": { - "message": "选中了 $SELECTEDCOUNT$ 位用户,已经重新邀请了 $LIMIT$ 位。由于邀请限制 $LIMIT$ 人,$EXCLUDEDCOUNT$ 位用户没有被邀请。", + "message": "已重新邀请 $SELECTEDCOUNT$ 位用户中的 $LIMIT$ 位。由于邀请限制为 $LIMIT$ 人,$EXCLUDEDCOUNT$ 位用户没有被邀请。", "placeholders": { "limit": { "content": "$1", @@ -8580,7 +8574,7 @@ "message": "您不能两次声明同一个域名。" }, "domainNotAvailable": { - "message": "别人正在使用 $DOMAIN$。请使用其他域名。", + "message": "别人正在使用 $DOMAIN$。请使用其他域名以继续。", "placeholders": { "DOMAIN": { "content": "$1", @@ -8753,9 +8747,6 @@ "server": { "message": "服务器" }, - "exportData": { - "message": "导出数据" - }, "exportingOrganizationSecretDataTitle": { "message": "正在导出组织机密数据" }, @@ -9484,7 +9475,7 @@ "message": "要求 SSO 登录" }, "emailRequiredForSsoLogin": { - "message": "Email is required for SSO" + "message": "SSO 要求使用电子邮箱" }, "selectedRegionFlag": { "message": "选择的区域旗帜" @@ -12238,43 +12229,43 @@ } }, "removeMasterPasswordForOrgUserKeyConnector": { - "message": "Your organization is no longer using master passwords to log into Bitwarden. To continue, verify the organization and domain." + "message": "您的组织已不再使用主密码登录 Bitwarden。要继续,请验证组织和域名。" }, "continueWithLogIn": { - "message": "Continue with log in" + "message": "继续登录" }, "doNotContinue": { - "message": "Do not continue" + "message": "不要继续" }, "domain": { - "message": "Domain" + "message": "域名" }, "keyConnectorDomainTooltip": { - "message": "This domain will store your account encryption keys, so make sure you trust it. If you're not sure, check with your admin." + "message": "此域名将存储您的账户加密密钥,所以请确保您信任它。如果您不确定,请与您的管理员联系。" }, "verifyYourOrganization": { - "message": "Verify your organization to log in" + "message": "验证您的组织以登录" }, "organizationVerified": { - "message": "Organization verified" + "message": "组织已验证" }, "domainVerified": { - "message": "Domain verified" + "message": "域名已验证" }, "leaveOrganizationContent": { - "message": "If you don't verify your organization, your access to the organization will be revoked." + "message": "如果不验证您的组织,您对组织的访问权限将被撤销。" }, "leaveNow": { - "message": "Leave now" + "message": "立即退出" }, "verifyYourDomainToLogin": { - "message": "Verify your domain to log in" + "message": "验证您的域名以登录" }, "verifyYourDomainDescription": { - "message": "To continue with log in, verify this domain." + "message": "要继续登录,请验证此域名。" }, "confirmKeyConnectorOrganizationUserDescription": { - "message": "To continue with log in, verify the organization and domain." + "message": "要继续登录,请验证组织和域名。" }, "confirmNoSelectedCriticalApplicationsTitle": { "message": "未选择任何关键应用程序" @@ -12353,7 +12344,7 @@ "message": "您的组织已将默认会话超时设置为「浏览器刷新时」。" }, "sessionTimeoutSettingsPolicyMaximumError": { - "message": "最大超时时间不能超过 $HOURS$ 小时 $MINUTES$ 分钟", + "message": "最大超时不能超过 $HOURS$ 小时 $MINUTES$ 分钟", "placeholders": { "hours": { "content": "$1", @@ -12372,7 +12363,7 @@ "message": "设置一个解锁方式以更改您的超时动作" }, "leaveConfirmationDialogTitle": { - "message": "确定要离开吗?" + "message": "确定要退出吗?" }, "leaveConfirmationDialogContentOne": { "message": "拒绝后,您的个人项目将保留在您的账户中,但您将失去对共享项目和组织功能的访问权限。" @@ -12381,7 +12372,7 @@ "message": "联系您的管理员以重新获取访问权限。" }, "leaveConfirmationDialogConfirmButton": { - "message": "离开 $ORGANIZATION$", + "message": "退出 $ORGANIZATION$", "placeholders": { "organization": { "content": "$1", @@ -12390,7 +12381,7 @@ } }, "howToManageMyVault": { - "message": "我如何管理我的密码库?" + "message": "我该如何管理我的密码库?" }, "transferItemsToOrganizationTitle": { "message": "传输项目到 $ORGANIZATION$", @@ -12402,7 +12393,7 @@ } }, "transferItemsToOrganizationContent": { - "message": "出于安全和合规考虑,$ORGANIZATION$ 要求所有项目的所有权均归组织所有。点击「接受」以传输您的项目的所有权。", + "message": "出于安全和合规考虑,$ORGANIZATION$ 要求所有项目归组织所有。点击「接受」以传输您的项目的所有权。", "placeholders": { "organization": { "content": "$1", @@ -12414,7 +12405,7 @@ "message": "接受传输" }, "declineAndLeave": { - "message": "拒绝并离开" + "message": "拒绝并退出" }, "whyAmISeeingThis": { "message": "为什么我会看到这个?" diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json index 3479ca48f27..364389a1535 100644 --- a/apps/web/src/locales/zh_TW/messages.json +++ b/apps/web/src/locales/zh_TW/messages.json @@ -1975,12 +1975,6 @@ "exportFrom": { "message": "匯出自" }, - "exportVault": { - "message": "匯出密碼庫" - }, - "exportSecrets": { - "message": "匯出機密" - }, "fileFormat": { "message": "檔案格式" }, @@ -1993,9 +1987,6 @@ "confirmMasterPassword": { "message": "確認主密碼" }, - "confirmFormat": { - "message": "確認格式" - }, "filePassword": { "message": "檔案密碼" }, @@ -2306,6 +2297,9 @@ "tools": { "message": "工具" }, + "import": { + "message": "Import" + }, "importData": { "message": "匯入資料" }, @@ -8753,9 +8747,6 @@ "server": { "message": "伺服器" }, - "exportData": { - "message": "匯出資料" - }, "exportingOrganizationSecretDataTitle": { "message": "匯出組織機密資料" },