Merge branch 'main' of https://github.com/bitwarden/clients into PM-5014-Migrate-download-license-component
This commit is contained in:
commit
8530442c36
|
@ -57,6 +57,7 @@ libs/common/src/admin-console @bitwarden/team-admin-console-dev
|
|||
libs/admin-console @bitwarden/team-admin-console-dev
|
||||
|
||||
## Billing team files ##
|
||||
apps/browser/src/billing @bitwarden/team-billing-dev
|
||||
apps/web/src/app/billing @bitwarden/team-billing-dev
|
||||
libs/angular/src/billing @bitwarden/team-billing-dev
|
||||
libs/common/src/billing @bitwarden/team-billing-dev
|
||||
|
|
|
@ -164,6 +164,10 @@ jobs:
|
|||
run: npm run dist:mv3
|
||||
working-directory: browser-source/apps/browser
|
||||
|
||||
- name: Build Chrome Manifest v3 Beta
|
||||
run: npm run dist:chrome:beta
|
||||
working-directory: browser-source/apps/browser
|
||||
|
||||
- name: Gulp
|
||||
run: gulp ci
|
||||
working-directory: browser-source/apps/browser
|
||||
|
@ -196,6 +200,13 @@ jobs:
|
|||
path: browser-source/apps/browser/dist/dist-chrome-mv3.zip
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload Chrome MV3 Beta artifact (DO NOT USE FOR PROD)
|
||||
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
|
||||
with:
|
||||
name: DO-NOT-USE-FOR-PROD-dist-chrome-MV3-beta-${{ env._BUILD_NUMBER }}.zip
|
||||
path: browser-source/apps/browser/dist/dist-chrome-mv3-beta.zip
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload Firefox artifact
|
||||
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
|
||||
with:
|
||||
|
|
|
@ -230,6 +230,17 @@ jobs:
|
|||
url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }}
|
||||
AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||
|
||||
update-summary:
|
||||
name: Display commit
|
||||
needs: artifact-check
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Display commit SHA
|
||||
run: |
|
||||
REPO_URL="https://github.com/bitwarden/clients/commit"
|
||||
COMMIT_SHA="${{ needs.artifact-check.outputs.artifact-build-commit }}"
|
||||
echo ":steam_locomotive: View [commit]($REPO_URL/$COMMIT_SHA)" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
azure-deploy:
|
||||
name: Deploy Web Vault to ${{ inputs.environment }} Storage Account
|
||||
needs:
|
||||
|
|
|
@ -4,11 +4,14 @@ import remarkGfm from "remark-gfm";
|
|||
|
||||
const config: StorybookConfig = {
|
||||
stories: [
|
||||
"../libs/auth/src/**/*.mdx",
|
||||
"../libs/auth/src/**/*.stories.@(js|jsx|ts|tsx)",
|
||||
"../libs/components/src/**/*.mdx",
|
||||
"../libs/components/src/**/*.stories.@(js|jsx|ts|tsx)",
|
||||
"../apps/web/src/**/*.mdx",
|
||||
"../apps/web/src/**/*.stories.@(js|jsx|ts|tsx)",
|
||||
"../apps/browser/src/**/*.mdx",
|
||||
"../apps/browser/src/**/*.stories.@(js|jsx|ts|tsx)",
|
||||
"../bitwarden_license/bit-web/src/**/*.mdx",
|
||||
"../bitwarden_license/bit-web/src/**/*.stories.@(js|jsx|ts|tsx)",
|
||||
],
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
{
|
||||
"extends": "../tsconfig",
|
||||
"compilerOptions": {
|
||||
"types": ["node", "jest", "chrome"],
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"exclude": ["../src/test.setup.ts", "../apps/src/**/*.spec.ts", "../libs/**/*.spec.ts"],
|
||||
"exclude": ["../src/test.setup.ts", "../apps/**/*.spec.ts", "../libs/**/*.spec.ts"],
|
||||
"files": [
|
||||
"./typings.d.ts",
|
||||
"./preview.tsx",
|
||||
"../libs/components/src/main.ts",
|
||||
"../libs/components/src/polyfills.ts"
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
declare module "*.md" {
|
||||
const content: string;
|
||||
export default content;
|
||||
}
|
10
angular.json
10
angular.json
|
@ -142,7 +142,15 @@
|
|||
"configDir": ".storybook",
|
||||
"browserTarget": "components:build",
|
||||
"compodoc": true,
|
||||
"compodocArgs": ["-p", "./tsconfig.json", "-e", "json", "-d", "."],
|
||||
"compodocArgs": [
|
||||
"-p",
|
||||
"./tsconfig.json",
|
||||
"-e",
|
||||
"json",
|
||||
"-d",
|
||||
".",
|
||||
"--disableRoutesGraph"
|
||||
],
|
||||
"port": 6006
|
||||
}
|
||||
},
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"dev_flags": {},
|
||||
"devFlags": {},
|
||||
"flags": {
|
||||
"showPasswordless": true,
|
||||
"enableCipherKeyEncryption": false,
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
"devFlags": {
|
||||
"managedEnvironment": {
|
||||
"base": "https://localhost:8080"
|
||||
}
|
||||
},
|
||||
"skipWelcomeOnInstall": true
|
||||
},
|
||||
"flags": {
|
||||
"showPasswordless": true,
|
||||
|
|
|
@ -30,11 +30,27 @@ const filters = {
|
|||
safari: ["!build/safari/**/*"],
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a number to a tuple containing two Uint16's
|
||||
* @param num {number} This number is expected to be a integer style number with no decimals
|
||||
*
|
||||
* @returns {number[]} A tuple containing two elements that are both numbers.
|
||||
*/
|
||||
function numToUint16s(num) {
|
||||
var arr = new ArrayBuffer(4);
|
||||
var view = new DataView(arr);
|
||||
view.setUint32(0, num, false);
|
||||
return [view.getUint16(0), view.getUint16(2)];
|
||||
}
|
||||
|
||||
function buildString() {
|
||||
var build = "";
|
||||
if (process.env.MANIFEST_VERSION) {
|
||||
build = `-mv${process.env.MANIFEST_VERSION}`;
|
||||
}
|
||||
if (process.env.BETA_BUILD === "1") {
|
||||
build += "-beta";
|
||||
}
|
||||
if (process.env.BUILD_NUMBER && process.env.BUILD_NUMBER !== "") {
|
||||
build = `-${process.env.BUILD_NUMBER}`;
|
||||
}
|
||||
|
@ -65,6 +81,9 @@ function distFirefox() {
|
|||
manifest.optional_permissions = manifest.optional_permissions.filter(
|
||||
(permission) => permission !== "privacy",
|
||||
);
|
||||
if (process.env.BETA_BUILD === "1") {
|
||||
manifest = applyBetaLabels(manifest);
|
||||
}
|
||||
return manifest;
|
||||
});
|
||||
}
|
||||
|
@ -72,6 +91,9 @@ function distFirefox() {
|
|||
function distOpera() {
|
||||
return dist("opera", (manifest) => {
|
||||
delete manifest.applications;
|
||||
if (process.env.BETA_BUILD === "1") {
|
||||
manifest = applyBetaLabels(manifest);
|
||||
}
|
||||
return manifest;
|
||||
});
|
||||
}
|
||||
|
@ -81,6 +103,9 @@ function distChrome() {
|
|||
delete manifest.applications;
|
||||
delete manifest.sidebar_action;
|
||||
delete manifest.commands._execute_sidebar_action;
|
||||
if (process.env.BETA_BUILD === "1") {
|
||||
manifest = applyBetaLabels(manifest);
|
||||
}
|
||||
return manifest;
|
||||
});
|
||||
}
|
||||
|
@ -90,6 +115,9 @@ function distEdge() {
|
|||
delete manifest.applications;
|
||||
delete manifest.sidebar_action;
|
||||
delete manifest.commands._execute_sidebar_action;
|
||||
if (process.env.BETA_BUILD === "1") {
|
||||
manifest = applyBetaLabels(manifest);
|
||||
}
|
||||
return manifest;
|
||||
});
|
||||
}
|
||||
|
@ -210,6 +238,9 @@ async function safariCopyBuild(source, dest) {
|
|||
delete manifest.commands._execute_sidebar_action;
|
||||
delete manifest.optional_permissions;
|
||||
manifest.permissions.push("nativeMessaging");
|
||||
if (process.env.BETA_BUILD === "1") {
|
||||
manifest = applyBetaLabels(manifest);
|
||||
}
|
||||
return manifest;
|
||||
}),
|
||||
),
|
||||
|
@ -235,6 +266,30 @@ async function ciCoverage(cb) {
|
|||
.pipe(gulp.dest(paths.coverage));
|
||||
}
|
||||
|
||||
function applyBetaLabels(manifest) {
|
||||
manifest.name = "Bitwarden Password Manager BETA";
|
||||
manifest.short_name = "Bitwarden BETA";
|
||||
manifest.description = "THIS EXTENSION IS FOR BETA TESTING BITWARDEN.";
|
||||
if (process.env.GITHUB_RUN_ID) {
|
||||
const existingVersionParts = manifest.version.split("."); // 3 parts expected 2024.4.0
|
||||
|
||||
// GITHUB_RUN_ID is a number like: 8853654662
|
||||
// which will convert to [ 4024, 3206 ]
|
||||
// and a single incremented id of 8853654663 will become [ 4024, 3207 ]
|
||||
const runIdParts = numToUint16s(parseInt(process.env.GITHUB_RUN_ID));
|
||||
|
||||
// Only use the first 2 parts from the given version number and base the other 2 numbers from the GITHUB_RUN_ID
|
||||
// Example: 2024.4.4024.3206
|
||||
const betaVersion = `${existingVersionParts[0]}.${existingVersionParts[1]}.${runIdParts[0]}.${runIdParts[1]}`;
|
||||
|
||||
manifest.version_name = `${betaVersion} beta - ${process.env.GITHUB_SHA.slice(0, 8)}`;
|
||||
manifest.version = betaVersion;
|
||||
} else {
|
||||
manifest.version = `${manifest.version}.0`;
|
||||
}
|
||||
return manifest;
|
||||
}
|
||||
|
||||
exports["dist:firefox"] = distFirefox;
|
||||
exports["dist:chrome"] = distChrome;
|
||||
exports["dist:opera"] = distOpera;
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
{
|
||||
"name": "@bitwarden/browser",
|
||||
"version": "2024.4.2",
|
||||
"version": "2024.5.0",
|
||||
"scripts": {
|
||||
"build": "webpack",
|
||||
"build:mv3": "cross-env MANIFEST_VERSION=3 webpack",
|
||||
"build:watch": "webpack --watch",
|
||||
"build:watch:mv3": "cross-env MANIFEST_VERSION=3 webpack --watch",
|
||||
"build:prod": "cross-env NODE_ENV=production webpack",
|
||||
"build:prod:beta": "cross-env BETA_BUILD=1 NODE_ENV=production webpack",
|
||||
"build:prod:watch": "cross-env NODE_ENV=production webpack --watch",
|
||||
"dist": "npm run build:prod && gulp dist",
|
||||
"dist:beta": "npm run build:prod:beta && cross-env BETA_BUILD=1 gulp dist",
|
||||
"dist:mv3": "cross-env MANIFEST_VERSION=3 npm run build:prod && cross-env MANIFEST_VERSION=3 gulp dist",
|
||||
"dist:mv3:beta": "cross-env MANIFEST_VERSION=3 npm run build:prod:beta && cross-env MANIFEST_VERSION=3 BETA_BUILD=1 gulp dist",
|
||||
"dist:chrome": "npm run build:prod && gulp dist:chrome",
|
||||
"dist:chrome:beta": "cross-env MANIFEST_VERSION=3 npm run build:prod:beta && cross-env MANIFEST_VERSION=3 BETA_BUILD=1 gulp dist:chrome",
|
||||
"dist:firefox": "npm run build:prod && gulp dist:firefox",
|
||||
"dist:opera": "npm run build:prod && gulp dist:opera",
|
||||
"dist:safari": "npm run build:prod && gulp dist:safari",
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "قفل المخزن"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "دعم الوضع الخاص تجريبي وبعض الميزات محدودة."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "الحقول المخصصة"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Anbarı kilidlə"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Gizli rejim dəstəyi təcrübidir və bəzi özəlliklər limitlidir."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Özəl sahələr"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Заблакіраваць сховішча"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Прыватны рэжым - гэта эксперыментальная функцыя і некаторыя магчымасці ў ім абмежаваны."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Карыстальніцкія палі"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Заключване на трезора"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Поддръжката на частния режим е експериментална и някои функционалности са ограничени."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Допълнителни полета"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "ভল্ট লক করুন"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "পছন্দসই ক্ষেত্র"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Bitwarden - Gestor de contrasenyes",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "A casa, a la feina o en moviment, Bitwarden protegeix totes les contrasenyes, claus de pas i informació sensible",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -173,10 +173,10 @@
|
|||
"message": "Canvia la contrasenya mestra"
|
||||
},
|
||||
"continueToWebApp": {
|
||||
"message": "Continue to web app?"
|
||||
"message": "Continua cap a l'aplicació web?"
|
||||
},
|
||||
"changeMasterPasswordOnWebConfirmation": {
|
||||
"message": "You can change your master password on the Bitwarden web app."
|
||||
"message": "Podeu canviar la vostra contrasenya mestra a l'aplicació web de Bitwarden."
|
||||
},
|
||||
"fingerprintPhrase": {
|
||||
"message": "Frase d'empremta digital",
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Tanca la caixa forta"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "El suport del mode privat és experimental i algunes funcions són limitades."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Camps personalitzats"
|
||||
},
|
||||
|
@ -3001,7 +2998,7 @@
|
|||
"description": "Notification message for when saving credentials has failed."
|
||||
},
|
||||
"success": {
|
||||
"message": "Success"
|
||||
"message": "Èxit"
|
||||
},
|
||||
"removePasskey": {
|
||||
"message": "Suprimeix la clau de pas"
|
||||
|
@ -3010,26 +3007,26 @@
|
|||
"message": "Clau de pas suprimida"
|
||||
},
|
||||
"unassignedItemsBannerNotice": {
|
||||
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console."
|
||||
"message": "Avís: els elements de l'organització no assignats ja no són visibles a la visualització de Totes les caixes fortes i només es poden accedir des de la Consola d'administració."
|
||||
},
|
||||
"unassignedItemsBannerSelfHostNotice": {
|
||||
"message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
|
||||
"message": "Avís: el 16 de maig de 2024, els elements de l'organització no assignats deixaran de ser visibles a la visualització de Totes les caixes fortes i només es podran accedir des de la Consola d'administració."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartOne": {
|
||||
"message": "Assign these items to a collection from the",
|
||||
"message": "Assigna aquests elements a una col·lecció de",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartTwo": {
|
||||
"message": "to make them visible.",
|
||||
"message": "per fer-los visibles.",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"adminConsole": {
|
||||
"message": "Admin Console"
|
||||
"message": "Consola d'administració"
|
||||
},
|
||||
"errorAssigningTargetCollection": {
|
||||
"message": "Error assigning target collection."
|
||||
"message": "S'ha produït un error en assignar la col·lecció de destinació."
|
||||
},
|
||||
"errorAssigningTargetFolder": {
|
||||
"message": "Error assigning target folder."
|
||||
"message": "S'ha produït un error en assignar la carpeta de destinació."
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Bitwarden - Správce hesel",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Bitwarden zabezpečí všechna Vaše hesla, přístupové klíče a citlivé informace doma, v práci nebo na cestách",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Zamkne trezor."
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Podpora soukromého režimu je experimentální a některé funkce jsou omezené."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Vlastní pole"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Cloi'r gell"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Meysydd addasedig"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lås boksen"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Understøttelse af privat tilstand er eksperimentel, og nogle funktioner er begrænsede."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Brugerdefinerede felter"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Den Tresor sperren"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Die Unterstützung des privaten Modus ist experimentell und einige Funktionen sind eingeschränkt."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Benutzerdefinierte Felder"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Κλειδώστε το vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Η υποστήριξη ιδιωτικής λειτουργίας είναι πειραματική και ορισμένες δυνατότητες είναι περιορισμένες."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Προσαρμοσμένα Πεδία"
|
||||
},
|
||||
|
|
|
@ -374,12 +374,21 @@
|
|||
"other": {
|
||||
"message": "Other"
|
||||
},
|
||||
"unlockMethods": {
|
||||
"message": "Unlock options"
|
||||
},
|
||||
"unlockMethodNeededToChangeTimeoutActionDesc": {
|
||||
"message": "Set up an unlock method to change your vault timeout action."
|
||||
},
|
||||
"unlockMethodNeeded": {
|
||||
"message": "Set up an unlock method in Settings"
|
||||
},
|
||||
"sessionTimeoutHeader": {
|
||||
"message": "Session timeout"
|
||||
},
|
||||
"otherOptions": {
|
||||
"message": "Other options"
|
||||
},
|
||||
"rateExtension": {
|
||||
"message": "Rate the extension"
|
||||
},
|
||||
|
@ -1120,9 +1129,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
@ -3026,6 +3032,15 @@
|
|||
"adminConsole": {
|
||||
"message": "Admin Console"
|
||||
},
|
||||
"accountSecurity": {
|
||||
"message": "Account security"
|
||||
},
|
||||
"notifications": {
|
||||
"message": "Notifications"
|
||||
},
|
||||
"appearance": {
|
||||
"message": "Appearance"
|
||||
},
|
||||
"errorAssigningTargetCollection": {
|
||||
"message": "Error assigning target collection."
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -226,7 +226,7 @@
|
|||
"message": "Help & feedback"
|
||||
},
|
||||
"helpCenter": {
|
||||
"message": "Bitwarden Help center"
|
||||
"message": "Bitwarden Help centre"
|
||||
},
|
||||
"communityForums": {
|
||||
"message": "Explore Bitwarden community forums"
|
||||
|
@ -728,7 +728,7 @@
|
|||
"message": "Change the application's colour theme."
|
||||
},
|
||||
"themeDescAlt": {
|
||||
"message": "Change the application's color theme. Applies to all logged in accounts."
|
||||
"message": "Change the application's colour theme. Applies to all logged in accounts."
|
||||
},
|
||||
"dark": {
|
||||
"message": "Dark",
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
@ -1168,7 +1165,7 @@
|
|||
"message": "Show a recognizable image next to each login."
|
||||
},
|
||||
"faviconDescAlt": {
|
||||
"message": "Show a recognizable image next to each login. Applies to all logged in accounts."
|
||||
"message": "Show a recognisable image next to each login. Applies to all logged in accounts."
|
||||
},
|
||||
"enableBadgeCounter": {
|
||||
"message": "Show badge counter"
|
||||
|
@ -1733,7 +1730,7 @@
|
|||
"message": "An organization policy is affecting your ownership options."
|
||||
},
|
||||
"personalOwnershipPolicyInEffectImports": {
|
||||
"message": "An organization policy has blocked importing items into your individual vault."
|
||||
"message": "An organisation policy has blocked importing items into your individual vault."
|
||||
},
|
||||
"excludedDomains": {
|
||||
"message": "Excluded Domains"
|
||||
|
@ -1993,7 +1990,7 @@
|
|||
"message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
|
||||
},
|
||||
"updateWeakMasterPasswordWarning": {
|
||||
"message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
|
||||
"message": "Your master password does not meet one or more of your organisation policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
|
||||
},
|
||||
"resetPasswordPolicyAutoEnroll": {
|
||||
"message": "Automatic Enrollment"
|
||||
|
@ -2009,11 +2006,11 @@
|
|||
"description": "Used as a message within the notification bar when no folders are found"
|
||||
},
|
||||
"orgPermissionsUpdatedMustSetPassword": {
|
||||
"message": "Your organization permissions were updated, requiring you to set a master password.",
|
||||
"message": "Your organisation permissions were updated, requiring you to set a master password.",
|
||||
"description": "Used as a card title description on the set password page to explain why the user is there"
|
||||
},
|
||||
"orgRequiresYouToSetPassword": {
|
||||
"message": "Your organization requires you to set a master password.",
|
||||
"message": "Your organisation requires you to set a master password.",
|
||||
"description": "Used as a card title description on the set password page to explain why the user is there"
|
||||
},
|
||||
"verificationRequired": {
|
||||
|
@ -2040,7 +2037,7 @@
|
|||
}
|
||||
},
|
||||
"vaultTimeoutPolicyWithActionInEffect": {
|
||||
"message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
|
||||
"message": "Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.",
|
||||
"placeholders": {
|
||||
"hours": {
|
||||
"content": "$1",
|
||||
|
@ -2057,7 +2054,7 @@
|
|||
}
|
||||
},
|
||||
"vaultTimeoutActionPolicyInEffect": {
|
||||
"message": "Your organization policies have set your vault timeout action to $ACTION$.",
|
||||
"message": "Your organisation policies have set your vault timeout action to $ACTION$.",
|
||||
"placeholders": {
|
||||
"action": {
|
||||
"content": "$1",
|
||||
|
@ -2114,7 +2111,7 @@
|
|||
"message": "Exporting Personal Vault"
|
||||
},
|
||||
"exportingIndividualVaultDescription": {
|
||||
"message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.",
|
||||
"message": "Only the individual vault items associated with $EMAIL$ will be exported. Organisation vault items will not be included. Only vault item information will be exported and will not include associated attachments.",
|
||||
"placeholders": {
|
||||
"email": {
|
||||
"content": "$1",
|
||||
|
@ -2308,7 +2305,7 @@
|
|||
}
|
||||
},
|
||||
"autofillPageLoadPolicyActivated": {
|
||||
"message": "Your organization policies have turned on auto-fill on page load."
|
||||
"message": "Your organisation policies have turned on auto-fill on page load."
|
||||
},
|
||||
"howToAutofill": {
|
||||
"message": "How to auto-fill"
|
||||
|
@ -2380,7 +2377,7 @@
|
|||
"message": "Approve with master password"
|
||||
},
|
||||
"ssoIdentifierRequired": {
|
||||
"message": "Organization SSO identifier is required."
|
||||
"message": "Organisation SSO identifier is required."
|
||||
},
|
||||
"eu": {
|
||||
"message": "EU",
|
||||
|
@ -2691,7 +2688,7 @@
|
|||
"message": "Total"
|
||||
},
|
||||
"importWarning": {
|
||||
"message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?",
|
||||
"message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organisation. Do you want to proceed?",
|
||||
"placeholders": {
|
||||
"organization": {
|
||||
"content": "$1",
|
||||
|
@ -3010,10 +3007,10 @@
|
|||
"message": "Passkey removed"
|
||||
},
|
||||
"unassignedItemsBannerNotice": {
|
||||
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console."
|
||||
"message": "Notice: Unassigned organisation items are no longer visible in the All Vaults view and only accessible via the Admin Console."
|
||||
},
|
||||
"unassignedItemsBannerSelfHostNotice": {
|
||||
"message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
|
||||
"message": "Notice: On May 16, 2024, unassigned organisation items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartOne": {
|
||||
"message": "Assign these items to a collection from the",
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Bitwarden - Administrador de contraseñas",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Bloquear la caja fuerte"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "El soporte en modo privado es experimental y algunas características son limitadas."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Campos personalizados"
|
||||
},
|
||||
|
@ -2965,27 +2962,27 @@
|
|||
"description": "Label indicating the most common import formats"
|
||||
},
|
||||
"overrideDefaultBrowserAutofillTitle": {
|
||||
"message": "¿Quiere hacer de Bitwarden su gestor de contraseñas predeterminado?",
|
||||
"message": "¿Hacer de Bitwarden su administrador de contraseñas predeterminado?",
|
||||
"description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior"
|
||||
},
|
||||
"overrideDefaultBrowserAutofillDescription": {
|
||||
"message": "Pasar por alto esta opción puede causar conflictos entre el menú de relleno automático de Bitwarden y el del navegador.",
|
||||
"message": "Pasar por alto esta opción puede causar conflictos entre el menú de autocompletar de Bitwarden y el de tu navegador.",
|
||||
"description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior"
|
||||
},
|
||||
"overrideDefaultBrowserAutoFillSettings": {
|
||||
"message": "Hacer de Bitwarden su gestor de contraseñas predeterminado",
|
||||
"message": "Hacer de Bitwarden tu administrador de contraseñas predeterminado",
|
||||
"description": "Label for the setting that allows overriding the default browser autofill settings"
|
||||
},
|
||||
"privacyPermissionAdditionNotGrantedTitle": {
|
||||
"message": "No se pudo establecer Bitwarden como el gestor de contraseñas predeterminado",
|
||||
"message": "No se puede establecer Bitwarden como el administrador de contraseñas predeterminado",
|
||||
"description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings"
|
||||
},
|
||||
"privacyPermissionAdditionNotGrantedDescription": {
|
||||
"message": "Debe otorgar los permisos de privacidad del navegador a Bitwarden para establecerlo como gestor de contraseñas predeterminado.",
|
||||
"message": "Debes otorgar permisos de privacidad del navegador a Bitwarden para establecerlo como administrador de contraseñas predeterminado.",
|
||||
"description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings"
|
||||
},
|
||||
"makeDefault": {
|
||||
"message": "Predeterminar",
|
||||
"message": "Establecer como predeterminado",
|
||||
"description": "Button text for the setting that allows overriding the default browser autofill settings"
|
||||
},
|
||||
"saveCipherAttemptSuccess": {
|
||||
|
@ -3001,7 +2998,7 @@
|
|||
"description": "Notification message for when saving credentials has failed."
|
||||
},
|
||||
"success": {
|
||||
"message": "Success"
|
||||
"message": "Éxito"
|
||||
},
|
||||
"removePasskey": {
|
||||
"message": "Eliminar passkey"
|
||||
|
@ -3016,20 +3013,20 @@
|
|||
"message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartOne": {
|
||||
"message": "Assign these items to a collection from the",
|
||||
"message": "Asignar estos elementos a una colección de",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartTwo": {
|
||||
"message": "to make them visible.",
|
||||
"message": "para hcerlos visibles.",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"adminConsole": {
|
||||
"message": "Admin Console"
|
||||
"message": "Consola de administrador"
|
||||
},
|
||||
"errorAssigningTargetCollection": {
|
||||
"message": "Error assigning target collection."
|
||||
"message": "Error al asignar la colección de destino."
|
||||
},
|
||||
"errorAssigningTargetFolder": {
|
||||
"message": "Error assigning target folder."
|
||||
"message": "Error al asignar la carpeta de destino."
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lukusta hoidla"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Privaatrežiimi toetus on katsejärgus, mistõttu mõned funktsioonid on piiratud."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Kohandatud väljad"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Blokeatu kutxa gotorra"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Modu pribatuko euskarria esperimentala da eta ezaugarri batzuk mugatuak dira."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Eremu pertsonalizatuak"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "قفل گاوصندوق"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "پشتیبانی حالت خصوصی آزمایشی است و برخی از ویژگیها محدود هستند."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "فیلدهای سفارشی"
|
||||
},
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden – Salasanahallinta",
|
||||
"message": "Bitwarden Salasanahallinta",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Kotona, töissä tai reissussa, Bitwarden suojaa helposti salasanasi, suojausavaimesi ja arkaluonteiset tietosi.",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lukitse holvi"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Yksityisen tilan tuki on kokeellinen ja jotkin ominaisuudet toimivat rajoitetusti."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Lisäkentät"
|
||||
},
|
||||
|
@ -2828,7 +2825,7 @@
|
|||
"message": "Korvataanko suojausavain?"
|
||||
},
|
||||
"overwritePasskeyAlert": {
|
||||
"message": "Kohde sisältää jo suojausavaimen. Haluatko varmasti korvata nykyisen salasanan?"
|
||||
"message": "Kohde sisältää jo suojausavaimen. Haluatko varmasti korvata nykyisen suojausavaimen?"
|
||||
},
|
||||
"featureNotSupported": {
|
||||
"message": "Ominaisuutta ei vielä tueta"
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "I-lock ang vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Ang suporta sa private mode ay eksperimental at limitado ang ilang mga tampok."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Pasadyang mga patlang"
|
||||
},
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Gestionnaire de mots de passe Bitwarden",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Chez vous, au travail, n'importe où, Bitwarden sécurise mots de passe, clés d'accès et informations sensibles",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Verrouiller le coffre"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "La prise en charge de la navigation privée est expérimentale et certaines fonctionnalités sont limitées."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Champs personnalisés"
|
||||
},
|
||||
|
@ -3001,7 +2998,7 @@
|
|||
"description": "Notification message for when saving credentials has failed."
|
||||
},
|
||||
"success": {
|
||||
"message": "Success"
|
||||
"message": "Succès"
|
||||
},
|
||||
"removePasskey": {
|
||||
"message": "Retirer la clé d'identification (passkey)"
|
||||
|
@ -3016,15 +3013,15 @@
|
|||
"message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartOne": {
|
||||
"message": "Assign these items to a collection from the",
|
||||
"message": "Ajouter ces éléments à une collection depuis la",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartTwo": {
|
||||
"message": "to make them visible.",
|
||||
"message": "pour les rendre visibles.",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"adminConsole": {
|
||||
"message": "Admin Console"
|
||||
"message": "Console Admin"
|
||||
},
|
||||
"errorAssigningTargetCollection": {
|
||||
"message": "Error assigning target collection."
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "נעל את הכספת"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "המצב הפרטי הוא במסגרת ניסוי וחלק מהיכולות מוגבלות."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "שדות מותאמים אישית"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "वॉल्ट लॉक करें"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "निजी मोड समर्थन प्रायोगिक है और कुछ सुविधाएँ सीमित हैं।"
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom Fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Zaključaj trezor"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Podrška za privatni način rada je eksperimentalna, a neke su značajke ograničene."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Prilagođena polja"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "A széf zárolása"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "A privát mód támogatása kísérleti és néhány funkció korlátozott."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Egyedi mezők"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Kunci brankas"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Dukungan mode pribadi bersifat eksperimental dan beberapa fitur terbatas."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Ruas Khusus"
|
||||
},
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "A casa, al lavoro, o in viaggio, Bitwarden protegge tutte le tue password, passkey, e informazioni sensibili",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Blocca la cassaforte"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Il supporto della modalità privata è sperimentale e alcune funzionalità sono limitate."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Campi personalizzati"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "保管庫をロック"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "プライベートモードのサポートは実験的であり、一部機能は制限されています。"
|
||||
},
|
||||
"customFields": {
|
||||
"message": "カスタムフィールド"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "ವಾಲ್ಟ್ ಅನ್ನು ಲಾಕ್ ಮಾಡಿ"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "ಕಸ್ಟಮ್ ಕ್ಷೇತ್ರಗಳು"
|
||||
},
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
"message": "웹 앱에서 계속하시겠용?"
|
||||
},
|
||||
"changeMasterPasswordOnWebConfirmation": {
|
||||
"message": "You can change your master password on the Bitwarden web app."
|
||||
"message": "Bitwarden 웹 앱에서 마스터 비밀번호를 변경할 수 있습니다."
|
||||
},
|
||||
"fingerprintPhrase": {
|
||||
"message": "지문 구절",
|
||||
|
@ -229,10 +229,10 @@
|
|||
"message": "Bitwarden 도움말 센터"
|
||||
},
|
||||
"communityForums": {
|
||||
"message": "Explore Bitwarden community forums"
|
||||
"message": "Bitwarden 커뮤니티 포럼 탐색하기"
|
||||
},
|
||||
"contactSupport": {
|
||||
"message": "Contact Bitwarden support"
|
||||
"message": "Bitwarden 지원에 문의하기"
|
||||
},
|
||||
"sync": {
|
||||
"message": "동기화"
|
||||
|
@ -275,7 +275,7 @@
|
|||
"message": "길이"
|
||||
},
|
||||
"passwordMinLength": {
|
||||
"message": "Minimum password length"
|
||||
"message": "최소 비밀번호 길이"
|
||||
},
|
||||
"uppercase": {
|
||||
"message": "대문자 (A-Z)"
|
||||
|
@ -333,7 +333,7 @@
|
|||
"message": "비밀번호"
|
||||
},
|
||||
"totp": {
|
||||
"message": "Authenticator secret"
|
||||
"message": "인증기 비밀 키"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "패스프레이즈"
|
||||
|
@ -375,10 +375,10 @@
|
|||
"message": "기타"
|
||||
},
|
||||
"unlockMethodNeededToChangeTimeoutActionDesc": {
|
||||
"message": "Set up an unlock method to change your vault timeout action."
|
||||
"message": "잠금 해제 방법을 설정하여 보관함의 시간 초과 동작을 변경하세요."
|
||||
},
|
||||
"unlockMethodNeeded": {
|
||||
"message": "Set up an unlock method in Settings"
|
||||
"message": "설정에서 잠금 해제 수단 설정하기"
|
||||
},
|
||||
"rateExtension": {
|
||||
"message": "확장 프로그램 평가"
|
||||
|
@ -421,7 +421,7 @@
|
|||
"message": "지금 잠그기"
|
||||
},
|
||||
"lockAll": {
|
||||
"message": "Lock all"
|
||||
"message": "모두 잠그기"
|
||||
},
|
||||
"immediately": {
|
||||
"message": "즉시"
|
||||
|
@ -484,7 +484,7 @@
|
|||
"message": "마스터 비밀번호를 재입력해야 합니다."
|
||||
},
|
||||
"masterPasswordMinlength": {
|
||||
"message": "Master password must be at least $VALUE$ characters long.",
|
||||
"message": "마스터 비밀번호는 최소 $VALUE$자 이상이어야 합니다.",
|
||||
"description": "The Master Password must be at least a specific number of characters long.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
|
@ -500,10 +500,10 @@
|
|||
"message": "계정 생성이 완료되었습니다! 이제 로그인하실 수 있습니다."
|
||||
},
|
||||
"youSuccessfullyLoggedIn": {
|
||||
"message": "You successfully logged in"
|
||||
"message": "로그인에 성공했습니다."
|
||||
},
|
||||
"youMayCloseThisWindow": {
|
||||
"message": "You may close this window"
|
||||
"message": "이제 창을 닫으실 수 있습니다."
|
||||
},
|
||||
"masterPassSent": {
|
||||
"message": "마스터 비밀번호 힌트가 담긴 이메일을 보냈습니다."
|
||||
|
@ -528,16 +528,16 @@
|
|||
"message": "선택한 항목을 이 페이지에서 자동 완성할 수 없습니다. 대신 정보를 직접 복사 / 붙여넣기하여 사용하십시오."
|
||||
},
|
||||
"totpCaptureError": {
|
||||
"message": "Unable to scan QR code from the current webpage"
|
||||
"message": "현재 웹페이지에서 QR 코드를 스캔할 수 없습니다"
|
||||
},
|
||||
"totpCaptureSuccess": {
|
||||
"message": "Authenticator key added"
|
||||
"message": "인증 키를 추가했습니다"
|
||||
},
|
||||
"totpCapture": {
|
||||
"message": "Scan authenticator QR code from current webpage"
|
||||
"message": "현재 웹페이지에서 QR 코드 스캔하기"
|
||||
},
|
||||
"copyTOTP": {
|
||||
"message": "Copy Authenticator key (TOTP)"
|
||||
"message": "인증서 키 (TOTP) 복사"
|
||||
},
|
||||
"loggedOut": {
|
||||
"message": "로그아웃됨"
|
||||
|
@ -644,7 +644,7 @@
|
|||
"description": "This is the folder for uncategorized items"
|
||||
},
|
||||
"enableAddLoginNotification": {
|
||||
"message": "Ask to add login"
|
||||
"message": "로그인을 추가할 건지 물어보기"
|
||||
},
|
||||
"addLoginNotificationDesc": {
|
||||
"message": "\"로그인 추가 알림\"을 사용하면 새 로그인을 사용할 때마다 보관함에 그 로그인을 추가할 것인지 물어봅니다."
|
||||
|
@ -653,7 +653,7 @@
|
|||
"message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts."
|
||||
},
|
||||
"showCardsCurrentTab": {
|
||||
"message": "Show cards on Tab page"
|
||||
"message": "탭 페이지에 카드 표시"
|
||||
},
|
||||
"showCardsCurrentTabDesc": {
|
||||
"message": "List card items on the Tab page for easy auto-fill."
|
||||
|
@ -679,7 +679,7 @@
|
|||
"message": "예, 지금 저장하겠습니다."
|
||||
},
|
||||
"enableChangedPasswordNotification": {
|
||||
"message": "Ask to update existing login"
|
||||
"message": "현재 로그인으로 업데이트할 건지 묻기"
|
||||
},
|
||||
"changedPasswordNotificationDesc": {
|
||||
"message": "Ask to update a login's password when a change is detected on a website."
|
||||
|
@ -703,7 +703,7 @@
|
|||
"message": "Unlock your Bitwarden vault to complete the auto-fill request."
|
||||
},
|
||||
"notificationUnlock": {
|
||||
"message": "Unlock"
|
||||
"message": "잠금 해제"
|
||||
},
|
||||
"enableContextMenuItem": {
|
||||
"message": "Show context menu options"
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "보관함 잠그기"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "시크릿 모드 지원은 실험적이며 일부 기능이 제한됩니다."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "사용자 지정 필드"
|
||||
},
|
||||
|
|
|
@ -173,10 +173,10 @@
|
|||
"message": "Keisti pagrindinį slaptažodį"
|
||||
},
|
||||
"continueToWebApp": {
|
||||
"message": "Continue to web app?"
|
||||
"message": "Tęsti į žiniatinklio programėlę?"
|
||||
},
|
||||
"changeMasterPasswordOnWebConfirmation": {
|
||||
"message": "You can change your master password on the Bitwarden web app."
|
||||
"message": "Pagrindinį slaptažodį galite pakeisti „Bitwarden“ žiniatinklio programėlėje."
|
||||
},
|
||||
"fingerprintPhrase": {
|
||||
"message": "Pirštų atspaudų frazė",
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Užrakinti saugyklą"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Privataus režimo palaikymas yra eksperimentinis, o kai kurios funkcijos yra ribotos."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Pasirinktiniai laukai"
|
||||
},
|
||||
|
@ -3001,7 +2998,7 @@
|
|||
"description": "Notification message for when saving credentials has failed."
|
||||
},
|
||||
"success": {
|
||||
"message": "Success"
|
||||
"message": "Sėkmė"
|
||||
},
|
||||
"removePasskey": {
|
||||
"message": "Pašalinti slaptaraktį"
|
||||
|
@ -3010,26 +3007,26 @@
|
|||
"message": "Pašalintas slaptaraktis"
|
||||
},
|
||||
"unassignedItemsBannerNotice": {
|
||||
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console."
|
||||
"message": "Pranešimas: nepriskirti organizacijos elementai nebėra matomi peržiūros rodinyje Visi saugyklos ir yra pasiekiami tik per Administratoriaus konsolę."
|
||||
},
|
||||
"unassignedItemsBannerSelfHostNotice": {
|
||||
"message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
|
||||
"message": "Pranešimas: 2024 m. gegužės 16 d. nepriskirti organizacijos elementai nebėra matomi peržiūros rodinyje Visi saugyklos ir yra pasiekiami tik per Administratoriaus konsolę."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartOne": {
|
||||
"message": "Assign these items to a collection from the",
|
||||
"message": "Priskirkite šiuos elementus kolekcijai iš",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartTwo": {
|
||||
"message": "to make them visible.",
|
||||
"message": ", kad jie būtų matomi.",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"adminConsole": {
|
||||
"message": "Admin Console"
|
||||
"message": "Administratoriaus konsolės"
|
||||
},
|
||||
"errorAssigningTargetCollection": {
|
||||
"message": "Error assigning target collection."
|
||||
"message": "Klaida priskiriant tikslinę kolekciją."
|
||||
},
|
||||
"errorAssigningTargetFolder": {
|
||||
"message": "Error assigning target folder."
|
||||
"message": "Klaida priskiriant tikslinį aplanką."
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Aizslēgt glabātavu"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Personiskā stāvokļa atbalsts ir izmēģinājuma, un dažas iespējas ir ierobežotas."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Pielāgoti lauki"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "നിലവറ പൂട്ടുക"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "ഇഷ്ടാനുസൃത ഫീൽഡുകൾ"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lås hvelvet"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Støtte for privatmodus er eksperimentelt, og noen funksjoner er begrenset."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Tilpassede felter"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Kluis vergrendelen"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode ondersteuning is experimenteel en sommige functies zijn beperkt."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Aangepaste velden"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "W domu, w pracy, lub w ruchu, Bitwarden z łatwością zabezpiecza Twoje hasła, passkeys i poufne informacje",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Zablokuj sejf"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Obsługa trybu prywatnego jest eksperymentalna, a niektóre funkcje są ograniczone."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Pola niestandardowe"
|
||||
},
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Em qual lugar for, o Bitwarden protege suas senhas, chaves de acesso, e informações confidenciais",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Bloquear o cofre"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "O suporte para modo privado é experimental e alguns recursos são limitados."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Campos Personalizados"
|
||||
},
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Bitwarden - Gestor de Palavras-passe",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Em casa, no trabalho, em todo o lado, o Bitwarden protege todas as suas palavras-passe e informações sensíveis",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -303,10 +303,10 @@
|
|||
"message": "Incluir número"
|
||||
},
|
||||
"minNumbers": {
|
||||
"message": "Números mínimos"
|
||||
"message": "Mínimo de números"
|
||||
},
|
||||
"minSpecial": {
|
||||
"message": "Caracteres especiais minímos"
|
||||
"message": "Mínimo de caracteres especiais"
|
||||
},
|
||||
"avoidAmbChar": {
|
||||
"message": "Evitar caracteres ambíguos"
|
||||
|
@ -1064,7 +1064,7 @@
|
|||
"message": "Editar as definições do navegador."
|
||||
},
|
||||
"autofillOverlayVisibilityOff": {
|
||||
"message": "Desligado",
|
||||
"message": "Desativado",
|
||||
"description": "Overlay setting select option for disabling autofill overlay"
|
||||
},
|
||||
"autofillOverlayVisibilityOnFieldFocus": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Bloquear o cofre"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "O suporte do modo privado é experimental e algumas funcionalidades são limitadas."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Campos personalizados"
|
||||
},
|
||||
|
@ -1279,7 +1276,7 @@
|
|||
"message": "Número do passaporte"
|
||||
},
|
||||
"licenseNumber": {
|
||||
"message": "Número da licença"
|
||||
"message": "Número da carta de condução"
|
||||
},
|
||||
"email": {
|
||||
"message": "E-mail"
|
||||
|
@ -1303,7 +1300,7 @@
|
|||
"message": "Cidade / Localidade"
|
||||
},
|
||||
"stateProvince": {
|
||||
"message": "Estado / Província"
|
||||
"message": "Estado / Região"
|
||||
},
|
||||
"zipPostalCode": {
|
||||
"message": "Código postal"
|
||||
|
@ -1443,7 +1440,7 @@
|
|||
"description": "ex. Date this item was updated"
|
||||
},
|
||||
"dateCreated": {
|
||||
"message": "Criado a",
|
||||
"message": "Criado",
|
||||
"description": "ex. Date this item was created"
|
||||
},
|
||||
"datePasswordUpdated": {
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Blocare seif"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Suportul pentru modul privat este experimental, iar unele caracteristici sunt limitate."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Câmpuri particularizate"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Заблокировать хранилище"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Частный режим - экспериментальный, некоторые функции ограничены."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Пользовательские поля"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "සුරක්ෂිතාගාරය ලොක් කරන්න"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "අභිරුචි ක්ෂේත්ර"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Zamknúť trezor"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Podpora privátneho režimu je experimentálna a niektoré funkcie sú obmedzené."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Vlastné polia"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Zakleni trezor"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Polja po meri"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Закључај сеф"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Подршка за приватни режим је експериментална и неке функције су ограничене."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Прилагођена Поља"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lås valvet"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Stöd för privat läge är experimentellt och vissa funktioner är begränsade."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Anpassade fält"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Lock the vault"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom fields"
|
||||
},
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "ล็อกตู้เซฟ"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Private mode support is experimental and some features are limited."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Custom Fields"
|
||||
},
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Bitwarden Parola Yöneticisi",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Bitwarden tüm parolalarınızı, geçiş anahtarlarınızı ve hassas bilgilerinizi güvenle saklar",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -173,10 +173,10 @@
|
|||
"message": "Ana parolayı değiştir"
|
||||
},
|
||||
"continueToWebApp": {
|
||||
"message": "Continue to web app?"
|
||||
"message": "Web uygulamasına devam edilsin mi?"
|
||||
},
|
||||
"changeMasterPasswordOnWebConfirmation": {
|
||||
"message": "You can change your master password on the Bitwarden web app."
|
||||
"message": "Ana parolanızı Bitwarden web uygulamasında değiştirebilirsiniz."
|
||||
},
|
||||
"fingerprintPhrase": {
|
||||
"message": "Parmak izi ifadesi",
|
||||
|
@ -333,7 +333,7 @@
|
|||
"message": "Parola"
|
||||
},
|
||||
"totp": {
|
||||
"message": "Authenticator secret"
|
||||
"message": "Kimlik doğrulama sırrı"
|
||||
},
|
||||
"passphrase": {
|
||||
"message": "Uzun söz"
|
||||
|
@ -528,16 +528,16 @@
|
|||
"message": "Seçilen hesap bu sayfada otomatik olarak doldurulamadı. Lütfen bilgileri elle kopyalayıp yapıştırın."
|
||||
},
|
||||
"totpCaptureError": {
|
||||
"message": "Mevcut web sayfasından QR kodu taranamıyor"
|
||||
"message": "Mevcut web sayfasındaki QR kodu taranamıyor"
|
||||
},
|
||||
"totpCaptureSuccess": {
|
||||
"message": "Kimlik doğrulama anahtarı eklendi"
|
||||
},
|
||||
"totpCapture": {
|
||||
"message": "Mevcut web sayfasından kimlik doğrulayıcı QR kodunu tarayın"
|
||||
"message": "Mevcut web sayfasındaki kimlik doğrulayıcı QR kodunu tarayın"
|
||||
},
|
||||
"copyTOTP": {
|
||||
"message": "Kimlik Doğrulayıcı anahtarını kopyala (TOTP)"
|
||||
"message": "Kimlik doğrulama anahtarını kopyala (TOTP)"
|
||||
},
|
||||
"loggedOut": {
|
||||
"message": "Çıkış yapıldı"
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Kasayı kilitle"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Gizli mod desteği deneyseldir ve bazı özellikler kısıtlıdır."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Özel alanlar"
|
||||
},
|
||||
|
@ -2005,7 +2002,7 @@
|
|||
"message": "Klasör seç..."
|
||||
},
|
||||
"noFoldersFound": {
|
||||
"message": "Herhangi bir klasör bulunamadı",
|
||||
"message": "Hiçbir klasör bulunamadı",
|
||||
"description": "Used as a message within the notification bar when no folders are found"
|
||||
},
|
||||
"orgPermissionsUpdatedMustSetPassword": {
|
||||
|
@ -2652,13 +2649,13 @@
|
|||
}
|
||||
},
|
||||
"tryAgain": {
|
||||
"message": "Tekrar deneyin"
|
||||
"message": "Yeniden dene"
|
||||
},
|
||||
"verificationRequiredForActionSetPinToContinue": {
|
||||
"message": "Bu işlem için doğrulama gerekiyor. Devam etmek için bir PIN ayarlayın."
|
||||
"message": "Bu işlem için doğrulama gerekiyor. Devam etmek için bir PIN belirleyin."
|
||||
},
|
||||
"setPin": {
|
||||
"message": "PIN Belirle"
|
||||
"message": "PIN belirle"
|
||||
},
|
||||
"verifyWithBiometrics": {
|
||||
"message": "Biyometri ile doğrula"
|
||||
|
@ -2673,7 +2670,7 @@
|
|||
"message": "Farklı bir yönteme mi ihtiyacınız var?"
|
||||
},
|
||||
"useMasterPassword": {
|
||||
"message": "Ana parolayı kullanın"
|
||||
"message": "Ana parolayı kullan"
|
||||
},
|
||||
"usePin": {
|
||||
"message": "PIN kullan"
|
||||
|
@ -2685,7 +2682,7 @@
|
|||
"message": "E-posta adresinize gönderilen doğrulama kodunu girin."
|
||||
},
|
||||
"resendCode": {
|
||||
"message": "Kodu tekrar gönder"
|
||||
"message": "Kodu yeniden gönder"
|
||||
},
|
||||
"total": {
|
||||
"message": "Toplam"
|
||||
|
@ -2700,19 +2697,19 @@
|
|||
}
|
||||
},
|
||||
"launchDuoAndFollowStepsToFinishLoggingIn": {
|
||||
"message": "DUO'yu başlatın ve oturum açmayı tamamlamak için adımları izleyin."
|
||||
"message": "Duo'yu başlatın ve oturum açmayı tamamlamak için adımları izleyin."
|
||||
},
|
||||
"duoRequiredForAccount": {
|
||||
"message": "Hesabınız için Duo'ya iki adımlı giriş yapmanız gerekiyor."
|
||||
"message": "Hesabınız için Duo iki adımlı giriş gereklidir."
|
||||
},
|
||||
"popoutTheExtensionToCompleteLogin": {
|
||||
"message": "Oturum açma işlemini tamamlamak için uzantıyı açın."
|
||||
"message": "Giriş işlemini tamamlamak için uzantıyı dışarı alın."
|
||||
},
|
||||
"popoutExtension": {
|
||||
"message": "Popout uzantısı"
|
||||
"message": "Uzantıyı dışarı al"
|
||||
},
|
||||
"launchDuo": {
|
||||
"message": "DUO'yu başlat"
|
||||
"message": "Duo'yu başlat"
|
||||
},
|
||||
"importFormatError": {
|
||||
"message": "Veriler doğru biçimlendirilmemiş. Lütfen içe aktarma dosyanızı kontrol edin ve tekrar deneyin."
|
||||
|
@ -2795,7 +2792,7 @@
|
|||
"message": "Geçiş anahtarı klonlanan öğeye kopyalanmayacaktır. Bu öğeyi klonlamaya devam etmek istiyor musunuz?"
|
||||
},
|
||||
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
|
||||
"message": "Açılan sitenin gerektirdiği doğrulama. Bu özellik henüz ana şifresi olmayan hesaplara uygulanmamaktadır."
|
||||
"message": "Site kimlik doğrulaması gerektiriyor. Bu özellik henüz ana parolası olmayan hesaplarda kullanılamaz."
|
||||
},
|
||||
"logInWithPasskey": {
|
||||
"message": "Geçiş anahtarı ile giriş yapılsın mı?"
|
||||
|
@ -2828,13 +2825,13 @@
|
|||
"message": "Geçiş anahtarının üzerine yazılsın mı?"
|
||||
},
|
||||
"overwritePasskeyAlert": {
|
||||
"message": "Bu öğe zaten bir şifre anahtarı içeriyor. Geçerli şifrenin üzerine yazmak istediğinizden emin misiniz?"
|
||||
"message": "Bu kayıt zaten bir geçiş anahtarı içeriyor. Mevcut geçiş anahtarının üzerine yazmak istediğinizden emin misiniz?"
|
||||
},
|
||||
"featureNotSupported": {
|
||||
"message": "Bu özellik henüz desteklenmiyor"
|
||||
},
|
||||
"yourPasskeyIsLocked": {
|
||||
"message": "Şifreyi kullanmak için kimlik doğrulama gerekiyor. Devam etmek için kimliğinizi doğrulayın."
|
||||
"message": "Geçiş anahtarını kullanmak için kimlik doğrulama gerekiyor. Devam etmek için kimliğinizi doğrulayın."
|
||||
},
|
||||
"multifactorAuthenticationCancelled": {
|
||||
"message": "Çok faktörlü kimlik doğrulama iptal edildi"
|
||||
|
@ -2943,10 +2940,10 @@
|
|||
"message": "konum"
|
||||
},
|
||||
"useDeviceOrHardwareKey": {
|
||||
"message": "Cihazınızı veya donanım anahtarınızı kullanın"
|
||||
"message": "Cihazınızı veya donanımsal anahtarınızı kullanın"
|
||||
},
|
||||
"justOnce": {
|
||||
"message": "Yalnızca bir kez"
|
||||
"message": "Yalnızca bir defa"
|
||||
},
|
||||
"alwaysForThisSite": {
|
||||
"message": "Bu site için her zaman"
|
||||
|
@ -2961,23 +2958,23 @@
|
|||
}
|
||||
},
|
||||
"commonImportFormats": {
|
||||
"message": "Ortak formatlar",
|
||||
"message": "Sık kullanılan biçimler",
|
||||
"description": "Label indicating the most common import formats"
|
||||
},
|
||||
"overrideDefaultBrowserAutofillTitle": {
|
||||
"message": "Bitwarden varsayılan şifre yöneticiniz yapılsın mı?",
|
||||
"message": "Bitwarden varsayılan parola yöneticiniz yapılsın mı?",
|
||||
"description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior"
|
||||
},
|
||||
"overrideDefaultBrowserAutofillDescription": {
|
||||
"message": "Bu seçeneğin göz ardı edilmesi, Bitwarden otomatik doldurma menüsü ile tarayıcınızınki arasında çakışmalara neden olabilir.",
|
||||
"message": "Bu seçeneği göz ardı ederseniz Bitwarden otomatik doldurma menüsüyle tarayıcınızınki arasında çakışma yaşanabilir.",
|
||||
"description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior"
|
||||
},
|
||||
"overrideDefaultBrowserAutoFillSettings": {
|
||||
"message": "Bitwarden'ı varsayılan şifre yöneticiniz yapın",
|
||||
"message": "Bitwarden'ı varsayılan parola yöneticiniz yapın",
|
||||
"description": "Label for the setting that allows overriding the default browser autofill settings"
|
||||
},
|
||||
"privacyPermissionAdditionNotGrantedTitle": {
|
||||
"message": "Bitwarden varsayılan parola yöneticisi olarak ayarlanamıyor",
|
||||
"message": "Bitwarden varsayılan parola yöneticisi olarak ayarlanamadı",
|
||||
"description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings"
|
||||
},
|
||||
"privacyPermissionAdditionNotGrantedDescription": {
|
||||
|
@ -3001,13 +2998,13 @@
|
|||
"description": "Notification message for when saving credentials has failed."
|
||||
},
|
||||
"success": {
|
||||
"message": "Success"
|
||||
"message": "Başarılı"
|
||||
},
|
||||
"removePasskey": {
|
||||
"message": "Remove passkey"
|
||||
"message": "Geçiş anahtarını kaldır"
|
||||
},
|
||||
"passkeyRemoved": {
|
||||
"message": "Passkey removed"
|
||||
"message": "Geçiş anahtarı kaldırıldı"
|
||||
},
|
||||
"unassignedItemsBannerNotice": {
|
||||
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console."
|
||||
|
@ -3024,7 +3021,7 @@
|
|||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"adminConsole": {
|
||||
"message": "Admin Console"
|
||||
"message": "Yönetici Konsolu"
|
||||
},
|
||||
"errorAssigningTargetCollection": {
|
||||
"message": "Error assigning target collection."
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Заблокувати сховище"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Приватний режим - це експериментальна функція і деякі можливості обмежені."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Власні поля"
|
||||
},
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
"message": "Bitwarden"
|
||||
},
|
||||
"extName": {
|
||||
"message": "Bitwarden Password Manager",
|
||||
"message": "Bitwarden - Trình Quản lý Mật khẩu",
|
||||
"description": "Extension name, MUST be less than 40 characters (Safari restriction)"
|
||||
},
|
||||
"extDesc": {
|
||||
"message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information",
|
||||
"message": "Ở nhà, ở cơ quan, hay trên đường đi, Bitwarden sẽ bảo mật tất cả mật khẩu, passkey, và thông tin cá nhân của bạn",
|
||||
"description": "Extension description, MUST be less than 112 characters (Safari restriction)"
|
||||
},
|
||||
"loginOrCreateNewAccount": {
|
||||
|
@ -650,7 +650,7 @@
|
|||
"message": "'Thông báo Thêm đăng nhập' sẽ tự động nhắc bạn lưu các đăng nhập mới vào hầm an toàn của bạn bất cứ khi nào bạn đăng nhập trang web lần đầu tiên."
|
||||
},
|
||||
"addLoginNotificationDescAlt": {
|
||||
"message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts."
|
||||
"message": "Đưa ra lựa chọn để thêm một mục nếu không tìm thấy mục đó trong hòm của bạn. Áp dụng với mọi tài khoản đăng nhập trên thiết bị."
|
||||
},
|
||||
"showCardsCurrentTab": {
|
||||
"message": "Hiển thị thẻ trên trang Tab"
|
||||
|
@ -685,13 +685,13 @@
|
|||
"message": "Yêu cầu cập nhật mật khẩu đăng nhập khi phát hiện thay đổi trên trang web."
|
||||
},
|
||||
"changedPasswordNotificationDescAlt": {
|
||||
"message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts."
|
||||
"message": "Đưa ra lựa chọn để cập nhật mật khẩu khi phát hiện có sự thay đổi trên trang web. Áp dụng với mọi tài khoản đăng nhập trên thiết bị."
|
||||
},
|
||||
"enableUsePasskeys": {
|
||||
"message": "Ask to save and use passkeys"
|
||||
"message": "Đưa ra lựa chọn để lưu và sử dụng passkey"
|
||||
},
|
||||
"usePasskeysDesc": {
|
||||
"message": "Ask to save new passkeys or log in with passkeys stored in your vault. Applies to all logged in accounts."
|
||||
"message": "Đưa ra lựa chọn để lưu passkey mới hoặc đăng nhập bằng passkey đã lưu trong hòm. Áp dụng với mọi tài khoản đăng nhập trên thiết bị."
|
||||
},
|
||||
"notificationChangeDesc": {
|
||||
"message": "Bạn có muốn cập nhật mật khẩu này trên Bitwarden không?"
|
||||
|
@ -712,7 +712,7 @@
|
|||
"message": "Sử dụng một đúp chuột để truy cập vào việc tạo mật khẩu và thông tin đăng nhập phù hợp cho trang web. "
|
||||
},
|
||||
"contextMenuItemDescAlt": {
|
||||
"message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts."
|
||||
"message": "Truy cập trình khởi tạo mật khẩu và các mục đăng nhập đã lưu của trang web bằng cách nhấn đúp chuột. Áp dụng với mọi tài khoản đăng nhập trên thiết bị."
|
||||
},
|
||||
"defaultUriMatchDetection": {
|
||||
"message": "Phương thức kiểm tra URI mặc định",
|
||||
|
@ -728,7 +728,7 @@
|
|||
"message": "Thay đổi màu sắc ứng dụng."
|
||||
},
|
||||
"themeDescAlt": {
|
||||
"message": "Change the application's color theme. Applies to all logged in accounts."
|
||||
"message": "Thay đổi tông màu giao diện của ứng dụng. Áp dụng với mọi tài khoản đăng nhập trên thiết bị."
|
||||
},
|
||||
"dark": {
|
||||
"message": "Tối",
|
||||
|
@ -1061,10 +1061,10 @@
|
|||
"message": "Tắt cài đặt trình quản lý mật khẩu tích hợp trong trình duyệt của bạn để tránh xung đột."
|
||||
},
|
||||
"turnOffBrowserBuiltInPasswordManagerSettingsLink": {
|
||||
"message": "Edit browser settings."
|
||||
"message": "Thay đổi cài đặt của trình duyệt."
|
||||
},
|
||||
"autofillOverlayVisibilityOff": {
|
||||
"message": "Off",
|
||||
"message": "Tắt",
|
||||
"description": "Overlay setting select option for disabling autofill overlay"
|
||||
},
|
||||
"autofillOverlayVisibilityOnFieldFocus": {
|
||||
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "Khoá kho lưu trữ"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "Hỗ trợ cho chế độ riêng tư đang được thử nghiệm và hạn chế một số tính năng."
|
||||
},
|
||||
"customFields": {
|
||||
"message": "Trường tùy chỉnh"
|
||||
},
|
||||
|
@ -1168,7 +1165,7 @@
|
|||
"message": "Hiển thị một ảnh nhận dạng bên cạnh mỗi lần đăng nhập."
|
||||
},
|
||||
"faviconDescAlt": {
|
||||
"message": "Show a recognizable image next to each login. Applies to all logged in accounts."
|
||||
"message": "Hiển thị một biểu tượng dễ nhận dạng bên cạnh mỗi mục đăng nhập. Áp dụng với mọi tài khoản đăng nhập trên thiết bị."
|
||||
},
|
||||
"enableBadgeCounter": {
|
||||
"message": "Hiển thị biểu tượng bộ đếm"
|
||||
|
@ -1500,7 +1497,7 @@
|
|||
"message": "Mã PIN không hợp lệ."
|
||||
},
|
||||
"tooManyInvalidPinEntryAttemptsLoggingOut": {
|
||||
"message": "Too many invalid PIN entry attempts. Logging out."
|
||||
"message": "Mã PIN bị gõ sai quá nhiều lần. Đang đăng xuất."
|
||||
},
|
||||
"unlockWithBiometrics": {
|
||||
"message": "Mở khóa bằng sinh trắc học"
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "锁定密码库"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "私密模式的支持是实验性的,某些功能会受到限制。"
|
||||
},
|
||||
"customFields": {
|
||||
"message": "自定义字段"
|
||||
},
|
||||
|
@ -3016,11 +3013,11 @@
|
|||
"message": "注意:从 2024 年 5 月 16 日起,未分配的组织项目在「所有密码库」视图中将不再可见,只能通过管理控制台访问。"
|
||||
},
|
||||
"unassignedItemsBannerCTAPartOne": {
|
||||
"message": "Assign these items to a collection from the",
|
||||
"message": "将这些项目分配到集合,通过",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"unassignedItemsBannerCTAPartTwo": {
|
||||
"message": "以使其可见。",
|
||||
"message": ",以使其可见。",
|
||||
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
|
||||
},
|
||||
"adminConsole": {
|
||||
|
|
|
@ -1120,9 +1120,6 @@
|
|||
"commandLockVaultDesc": {
|
||||
"message": "鎖定密碼庫"
|
||||
},
|
||||
"privateModeWarning": {
|
||||
"message": "私密模式的支援是實驗性功能,部分功能無法完全發揮作用。"
|
||||
},
|
||||
"customFields": {
|
||||
"message": "自訂欄位"
|
||||
},
|
||||
|
|
|
@ -34,6 +34,7 @@ import {
|
|||
KeyGenerationServiceInitOptions,
|
||||
keyGenerationServiceFactory,
|
||||
} from "../../../platform/background/service-factories/key-generation-service.factory";
|
||||
import { logServiceFactory } from "../../../platform/background/service-factories/log-service.factory";
|
||||
import {
|
||||
PlatformUtilsServiceInitOptions,
|
||||
platformUtilsServiceFactory,
|
||||
|
@ -88,6 +89,7 @@ export function deviceTrustServiceFactory(
|
|||
await stateProviderFactory(cache, opts),
|
||||
await secureStorageServiceFactory(cache, opts),
|
||||
await userDecryptionOptionsServiceFactory(cache, opts),
|
||||
await logServiceFactory(cache, opts),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -4,20 +4,35 @@ import {
|
|||
} from "@bitwarden/common/auth/abstractions/master-password.service.abstraction";
|
||||
import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service";
|
||||
|
||||
import {
|
||||
encryptServiceFactory,
|
||||
EncryptServiceInitOptions,
|
||||
} from "../../../platform/background/service-factories/encrypt-service.factory";
|
||||
import {
|
||||
CachedServices,
|
||||
factory,
|
||||
FactoryOptions,
|
||||
} from "../../../platform/background/service-factories/factory-options";
|
||||
import {
|
||||
keyGenerationServiceFactory,
|
||||
KeyGenerationServiceInitOptions,
|
||||
} from "../../../platform/background/service-factories/key-generation-service.factory";
|
||||
import {
|
||||
stateProviderFactory,
|
||||
StateProviderInitOptions,
|
||||
} from "../../../platform/background/service-factories/state-provider.factory";
|
||||
import {
|
||||
stateServiceFactory,
|
||||
StateServiceInitOptions,
|
||||
} from "../../../platform/background/service-factories/state-service.factory";
|
||||
|
||||
type MasterPasswordServiceFactoryOptions = FactoryOptions;
|
||||
|
||||
export type MasterPasswordServiceInitOptions = MasterPasswordServiceFactoryOptions &
|
||||
StateProviderInitOptions;
|
||||
StateProviderInitOptions &
|
||||
StateServiceInitOptions &
|
||||
KeyGenerationServiceInitOptions &
|
||||
EncryptServiceInitOptions;
|
||||
|
||||
export function internalMasterPasswordServiceFactory(
|
||||
cache: { masterPasswordService?: InternalMasterPasswordServiceAbstraction } & CachedServices,
|
||||
|
@ -27,7 +42,13 @@ export function internalMasterPasswordServiceFactory(
|
|||
cache,
|
||||
"masterPasswordService",
|
||||
opts,
|
||||
async () => new MasterPasswordService(await stateProviderFactory(cache, opts)),
|
||||
async () =>
|
||||
new MasterPasswordService(
|
||||
await stateProviderFactory(cache, opts),
|
||||
await stateServiceFactory(cache, opts),
|
||||
await keyGenerationServiceFactory(cache, opts),
|
||||
await encryptServiceFactory(cache, opts),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
import { PinCryptoServiceAbstraction, PinCryptoService } from "@bitwarden/auth/common";
|
||||
|
||||
import {
|
||||
VaultTimeoutSettingsServiceInitOptions,
|
||||
vaultTimeoutSettingsServiceFactory,
|
||||
} from "../../../background/service-factories/vault-timeout-settings-service.factory";
|
||||
import {
|
||||
CryptoServiceInitOptions,
|
||||
cryptoServiceFactory,
|
||||
} from "../../../platform/background/service-factories/crypto-service.factory";
|
||||
import {
|
||||
FactoryOptions,
|
||||
CachedServices,
|
||||
factory,
|
||||
} from "../../../platform/background/service-factories/factory-options";
|
||||
import {
|
||||
LogServiceInitOptions,
|
||||
logServiceFactory,
|
||||
} from "../../../platform/background/service-factories/log-service.factory";
|
||||
import {
|
||||
StateServiceInitOptions,
|
||||
stateServiceFactory,
|
||||
} from "../../../platform/background/service-factories/state-service.factory";
|
||||
|
||||
import { KdfConfigServiceInitOptions, kdfConfigServiceFactory } from "./kdf-config-service.factory";
|
||||
|
||||
type PinCryptoServiceFactoryOptions = FactoryOptions;
|
||||
|
||||
export type PinCryptoServiceInitOptions = PinCryptoServiceFactoryOptions &
|
||||
StateServiceInitOptions &
|
||||
CryptoServiceInitOptions &
|
||||
VaultTimeoutSettingsServiceInitOptions &
|
||||
LogServiceInitOptions &
|
||||
KdfConfigServiceInitOptions;
|
||||
|
||||
export function pinCryptoServiceFactory(
|
||||
cache: { pinCryptoService?: PinCryptoServiceAbstraction } & CachedServices,
|
||||
opts: PinCryptoServiceInitOptions,
|
||||
): Promise<PinCryptoServiceAbstraction> {
|
||||
return factory(
|
||||
cache,
|
||||
"pinCryptoService",
|
||||
opts,
|
||||
async () =>
|
||||
new PinCryptoService(
|
||||
await stateServiceFactory(cache, opts),
|
||||
await cryptoServiceFactory(cache, opts),
|
||||
await vaultTimeoutSettingsServiceFactory(cache, opts),
|
||||
await logServiceFactory(cache, opts),
|
||||
await kdfConfigServiceFactory(cache, opts),
|
||||
),
|
||||
);
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
import { PinServiceAbstraction, PinService } from "@bitwarden/auth/common";
|
||||
|
||||
import {
|
||||
CryptoFunctionServiceInitOptions,
|
||||
cryptoFunctionServiceFactory,
|
||||
} from "../../../platform/background/service-factories/crypto-function-service.factory";
|
||||
import {
|
||||
EncryptServiceInitOptions,
|
||||
encryptServiceFactory,
|
||||
} from "../../../platform/background/service-factories/encrypt-service.factory";
|
||||
import {
|
||||
FactoryOptions,
|
||||
CachedServices,
|
||||
factory,
|
||||
} from "../../../platform/background/service-factories/factory-options";
|
||||
import {
|
||||
KeyGenerationServiceInitOptions,
|
||||
keyGenerationServiceFactory,
|
||||
} from "../../../platform/background/service-factories/key-generation-service.factory";
|
||||
import {
|
||||
LogServiceInitOptions,
|
||||
logServiceFactory,
|
||||
} from "../../../platform/background/service-factories/log-service.factory";
|
||||
import {
|
||||
StateProviderInitOptions,
|
||||
stateProviderFactory,
|
||||
} from "../../../platform/background/service-factories/state-provider.factory";
|
||||
import {
|
||||
StateServiceInitOptions,
|
||||
stateServiceFactory,
|
||||
} from "../../../platform/background/service-factories/state-service.factory";
|
||||
|
||||
import { AccountServiceInitOptions, accountServiceFactory } from "./account-service.factory";
|
||||
import { KdfConfigServiceInitOptions, kdfConfigServiceFactory } from "./kdf-config-service.factory";
|
||||
import {
|
||||
MasterPasswordServiceInitOptions,
|
||||
masterPasswordServiceFactory,
|
||||
} from "./master-password-service.factory";
|
||||
|
||||
type PinServiceFactoryOptions = FactoryOptions;
|
||||
|
||||
export type PinServiceInitOptions = PinServiceFactoryOptions &
|
||||
AccountServiceInitOptions &
|
||||
CryptoFunctionServiceInitOptions &
|
||||
EncryptServiceInitOptions &
|
||||
KdfConfigServiceInitOptions &
|
||||
KeyGenerationServiceInitOptions &
|
||||
LogServiceInitOptions &
|
||||
MasterPasswordServiceInitOptions &
|
||||
StateProviderInitOptions &
|
||||
StateServiceInitOptions;
|
||||
|
||||
export function pinServiceFactory(
|
||||
cache: { pinService?: PinServiceAbstraction } & CachedServices,
|
||||
opts: PinServiceInitOptions,
|
||||
): Promise<PinServiceAbstraction> {
|
||||
return factory(
|
||||
cache,
|
||||
"pinService",
|
||||
opts,
|
||||
async () =>
|
||||
new PinService(
|
||||
await accountServiceFactory(cache, opts),
|
||||
await cryptoFunctionServiceFactory(cache, opts),
|
||||
await encryptServiceFactory(cache, opts),
|
||||
await kdfConfigServiceFactory(cache, opts),
|
||||
await keyGenerationServiceFactory(cache, opts),
|
||||
await logServiceFactory(cache, opts),
|
||||
await masterPasswordServiceFactory(cache, opts),
|
||||
await stateProviderFactory(cache, opts),
|
||||
await stateServiceFactory(cache, opts),
|
||||
),
|
||||
);
|
||||
}
|
|
@ -37,7 +37,7 @@ import {
|
|||
internalMasterPasswordServiceFactory,
|
||||
MasterPasswordServiceInitOptions,
|
||||
} from "./master-password-service.factory";
|
||||
import { PinCryptoServiceInitOptions, pinCryptoServiceFactory } from "./pin-crypto-service.factory";
|
||||
import { PinServiceInitOptions, pinServiceFactory } from "./pin-service.factory";
|
||||
import {
|
||||
userDecryptionOptionsServiceFactory,
|
||||
UserDecryptionOptionsServiceInitOptions,
|
||||
|
@ -57,7 +57,7 @@ export type UserVerificationServiceInitOptions = UserVerificationServiceFactoryO
|
|||
I18nServiceInitOptions &
|
||||
UserVerificationApiServiceInitOptions &
|
||||
UserDecryptionOptionsServiceInitOptions &
|
||||
PinCryptoServiceInitOptions &
|
||||
PinServiceInitOptions &
|
||||
LogServiceInitOptions &
|
||||
VaultTimeoutSettingsServiceInitOptions &
|
||||
PlatformUtilsServiceInitOptions &
|
||||
|
@ -80,7 +80,7 @@ export function userVerificationServiceFactory(
|
|||
await i18nServiceFactory(cache, opts),
|
||||
await userVerificationApiServiceFactory(cache, opts),
|
||||
await userDecryptionOptionsServiceFactory(cache, opts),
|
||||
await pinCryptoServiceFactory(cache, opts),
|
||||
await pinServiceFactory(cache, opts),
|
||||
await logServiceFactory(cache, opts),
|
||||
await vaultTimeoutSettingsServiceFactory(cache, opts),
|
||||
await platformUtilsServiceFactory(cache, opts),
|
||||
|
|
|
@ -26,7 +26,9 @@ export const fido2AuthGuard: CanActivateFn = async (
|
|||
const authStatus = await authService.getAuthStatus();
|
||||
|
||||
if (authStatus === AuthenticationStatus.Locked) {
|
||||
routerService.setPreviousUrl(state.url);
|
||||
// Appending fromLock=true to the query params to indicate that the user is being redirected from the lock screen, this is used for user verification.
|
||||
const previousUrl = `${state.url}&fromLock=true`;
|
||||
routerService.setPreviousUrl(previousUrl);
|
||||
return router.createUrlTree(["/lock"], { queryParams: route.queryParams });
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
<button
|
||||
type="button"
|
||||
class="account-switcher-row tw-flex tw-w-full tw-items-center tw-gap-3 tw-rounded-md tw-p-3 disabled:tw-cursor-not-allowed disabled:tw-border-text-muted/60 disabled:!tw-text-muted/60"
|
||||
(click)="lock()"
|
||||
(click)="lock(currentAccount.id)"
|
||||
[disabled]="currentAccount.status === lockedStatus || !activeUserCanLock"
|
||||
[title]="!activeUserCanLock ? ('unlockMethodNeeded' | i18n) : ''"
|
||||
>
|
||||
|
@ -59,7 +59,7 @@
|
|||
<button
|
||||
type="button"
|
||||
class="account-switcher-row tw-flex tw-w-full tw-items-center tw-gap-3 tw-rounded-md tw-p-3"
|
||||
(click)="logOut()"
|
||||
(click)="logOut(currentAccount.id)"
|
||||
>
|
||||
<i class="bwi bwi-sign-out tw-text-2xl" aria-hidden="true"></i>
|
||||
{{ "logOut" | i18n }}
|
||||
|
|
|
@ -10,6 +10,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
|
|||
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
|
||||
import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum";
|
||||
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
|
||||
import { UserId } from "@bitwarden/common/types/guid";
|
||||
import { DialogService } from "@bitwarden/components";
|
||||
|
||||
import { AccountSwitcherService } from "./services/account-switcher.service";
|
||||
|
@ -64,9 +65,9 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy {
|
|||
this.location.back();
|
||||
}
|
||||
|
||||
async lock(userId?: string) {
|
||||
async lock(userId: string) {
|
||||
this.loading = true;
|
||||
await this.vaultTimeoutService.lock(userId ? userId : null);
|
||||
await this.vaultTimeoutService.lock(userId);
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
this.router.navigate(["lock"]);
|
||||
|
@ -96,7 +97,7 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy {
|
|||
.subscribe(() => this.router.navigate(["lock"]));
|
||||
}
|
||||
|
||||
async logOut() {
|
||||
async logOut(userId: UserId) {
|
||||
this.loading = true;
|
||||
const confirmed = await this.dialogService.openSimpleDialog({
|
||||
title: { key: "logOut" },
|
||||
|
@ -105,7 +106,7 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy {
|
|||
});
|
||||
|
||||
if (confirmed) {
|
||||
this.messagingService.send("logout");
|
||||
this.messagingService.send("logout", { userId });
|
||||
}
|
||||
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
|
|
|
@ -58,6 +58,7 @@ describe("AccountSwitcherService", () => {
|
|||
const accountInfo: AccountInfo = {
|
||||
name: "Test User 1",
|
||||
email: "test1@email.com",
|
||||
emailVerified: true,
|
||||
};
|
||||
|
||||
avatarService.getUserAvatarColor$.mockReturnValue(of("#cccccc"));
|
||||
|
@ -89,6 +90,7 @@ describe("AccountSwitcherService", () => {
|
|||
for (let i = 0; i < numberOfAccounts; i++) {
|
||||
seedAccounts[`${i}` as UserId] = {
|
||||
email: `test${i}@email.com`,
|
||||
emailVerified: true,
|
||||
name: "Test User ${i}",
|
||||
};
|
||||
seedStatuses[`${i}` as UserId] = AuthenticationStatus.Unlocked;
|
||||
|
@ -113,6 +115,7 @@ describe("AccountSwitcherService", () => {
|
|||
const user1AccountInfo: AccountInfo = {
|
||||
name: "Test User 1",
|
||||
email: "",
|
||||
emailVerified: true,
|
||||
};
|
||||
accountsSubject.next({ ["1" as UserId]: user1AccountInfo });
|
||||
authStatusSubject.next({ ["1" as UserId]: AuthenticationStatus.LoggedOut });
|
||||
|
|
|
@ -110,7 +110,7 @@ export class AccountSwitcherService {
|
|||
}),
|
||||
);
|
||||
|
||||
// Create a reusable observable that listens to the the switchAccountFinish message and returns the userId from the message
|
||||
// Create a reusable observable that listens to the switchAccountFinish message and returns the userId from the message
|
||||
this.switchAccountFinished$ = fromChromeEvent<[message: { command: string; userId: string }]>(
|
||||
chrome.runtime.onMessage,
|
||||
).pipe(
|
||||
|
|
|
@ -12,8 +12,16 @@
|
|||
<input class="tw-font-mono" bitInput type="password" formControlName="pin" />
|
||||
<button type="button" bitIconButton bitSuffix bitPasswordInputToggle></button>
|
||||
</bit-form-field>
|
||||
<label class="tw-flex tw-items-start tw-gap-2" *ngIf="showMasterPassOnRestart">
|
||||
<input class="tw-mt-1" type="checkbox" bitCheckbox formControlName="masterPassOnRestart" />
|
||||
<label
|
||||
class="tw-flex tw-items-start tw-gap-2"
|
||||
*ngIf="showMasterPasswordOnClientRestartOption"
|
||||
>
|
||||
<input
|
||||
class="tw-mt-1"
|
||||
type="checkbox"
|
||||
bitCheckbox
|
||||
formControlName="requireMasterPasswordOnClientRestart"
|
||||
/>
|
||||
<span>{{ "lockWithMasterPassOnRestart" | i18n }}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
|
|
@ -89,7 +89,6 @@
|
|||
<p class="text-center" *ngIf="!fido2Data.isFido2Session">
|
||||
<button type="button" appStopClick (click)="logOut()">{{ "logOut" | i18n }}</button>
|
||||
</p>
|
||||
<app-private-mode-warning></app-private-mode-warning>
|
||||
<app-callout *ngIf="biometricError" type="error">{{ biometricError }}</app-callout>
|
||||
<p class="text-center text-muted" *ngIf="pendingBiometric">
|
||||
<i class="bwi bwi-spinner bwi-spin" aria-hidden="true"></i> {{ "awaitDesktop" | i18n }}
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Router } from "@angular/router";
|
|||
import { firstValueFrom } from "rxjs";
|
||||
|
||||
import { LockComponent as BaseLockComponent } from "@bitwarden/angular/auth/components/lock.component";
|
||||
import { PinCryptoServiceAbstraction } from "@bitwarden/auth/common";
|
||||
import { PinServiceAbstraction } from "@bitwarden/auth/common";
|
||||
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
||||
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
|
||||
import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service";
|
||||
|
@ -59,11 +59,11 @@ export class LockComponent extends BaseLockComponent {
|
|||
policyApiService: PolicyApiServiceAbstraction,
|
||||
policyService: InternalPolicyService,
|
||||
passwordStrengthService: PasswordStrengthServiceAbstraction,
|
||||
private authService: AuthService,
|
||||
authService: AuthService,
|
||||
dialogService: DialogService,
|
||||
deviceTrustService: DeviceTrustServiceAbstraction,
|
||||
userVerificationService: UserVerificationService,
|
||||
pinCryptoService: PinCryptoServiceAbstraction,
|
||||
pinService: PinServiceAbstraction,
|
||||
private routerService: BrowserRouterService,
|
||||
biometricStateService: BiometricStateService,
|
||||
accountService: AccountService,
|
||||
|
@ -89,9 +89,10 @@ export class LockComponent extends BaseLockComponent {
|
|||
dialogService,
|
||||
deviceTrustService,
|
||||
userVerificationService,
|
||||
pinCryptoService,
|
||||
pinService,
|
||||
biometricStateService,
|
||||
accountService,
|
||||
authService,
|
||||
kdfConfigService,
|
||||
);
|
||||
this.successRoute = "/tabs/current";
|
||||
|
@ -142,15 +143,17 @@ export class LockComponent extends BaseLockComponent {
|
|||
try {
|
||||
success = await super.unlockBiometric();
|
||||
} catch (e) {
|
||||
const error = BiometricErrors[e as BiometricErrorTypes];
|
||||
const error = BiometricErrors[e?.message as BiometricErrorTypes];
|
||||
|
||||
if (error == null) {
|
||||
this.logService.error("Unknown error: " + e);
|
||||
return false;
|
||||
}
|
||||
|
||||
this.biometricError = this.i18nService.t(error.description);
|
||||
} finally {
|
||||
this.pendingBiometric = false;
|
||||
}
|
||||
this.pendingBiometric = false;
|
||||
|
||||
return success;
|
||||
}
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<app-private-mode-warning></app-private-mode-warning>
|
||||
<div class="content login-buttons">
|
||||
<button type="submit" class="btn primary block" [disabled]="form.loading">
|
||||
<span [hidden]="form.loading"
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
<app-header>
|
||||
<div class="left">
|
||||
<button type="button" routerLink="/tabs/settings">
|
||||
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
|
||||
<span>{{ "back" | i18n }}</span>
|
||||
</button>
|
||||
</div>
|
||||
<h1 class="center">
|
||||
<span class="title">{{ "accountSecurity" | i18n }}</span>
|
||||
</h1>
|
||||
<div class="right">
|
||||
<app-pop-out></app-pop-out>
|
||||
</div>
|
||||
</app-header>
|
||||
<main tabindex="-1" [formGroup]="form">
|
||||
<div class="box list">
|
||||
<h2 class="box-header">{{ "unlockMethods" | i18n }}</h2>
|
||||
<div class="box-content single-line">
|
||||
<div class="box-content-row box-content-row-checkbox" appBoxRow *ngIf="supportsBiometric">
|
||||
<label for="biometric">{{ "unlockWithBiometrics" | i18n }}</label>
|
||||
<input id="biometric" type="checkbox" formControlName="biometric" />
|
||||
</div>
|
||||
<div
|
||||
class="box-content-row box-content-row-checkbox"
|
||||
appBoxRow
|
||||
*ngIf="supportsBiometric && this.form.value.biometric"
|
||||
>
|
||||
<label for="autoBiometricsPrompt">{{ "enableAutoBiometricsPrompt" | i18n }}</label>
|
||||
<input
|
||||
id="autoBiometricsPrompt"
|
||||
type="checkbox"
|
||||
(change)="updateAutoBiometricsPrompt()"
|
||||
formControlName="enableAutoBiometricsPrompt"
|
||||
/>
|
||||
</div>
|
||||
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
||||
<label for="pin">{{ "unlockWithPin" | i18n }}</label>
|
||||
<input id="pin" type="checkbox" formControlName="pin" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box list">
|
||||
<h2 class="box-header">{{ "sessionTimeoutHeader" | i18n }}</h2>
|
||||
<div class="box-content single-line">
|
||||
<app-callout type="info" *ngIf="vaultTimeoutPolicyCallout | async as policy">
|
||||
<span *ngIf="policy.timeout && policy.action">
|
||||
{{
|
||||
"vaultTimeoutPolicyWithActionInEffect"
|
||||
| i18n: policy.timeout.hours : policy.timeout.minutes : (policy.action | i18n)
|
||||
}}
|
||||
</span>
|
||||
<span *ngIf="policy.timeout && !policy.action">
|
||||
{{ "vaultTimeoutPolicyInEffect" | i18n: policy.timeout.hours : policy.timeout.minutes }}
|
||||
</span>
|
||||
<span *ngIf="!policy.timeout && policy.action">
|
||||
{{ "vaultTimeoutActionPolicyInEffect" | i18n: (policy.action | i18n) }}
|
||||
</span>
|
||||
</app-callout>
|
||||
<app-vault-timeout-input
|
||||
[vaultTimeoutOptions]="vaultTimeoutOptions"
|
||||
[formControl]="form.controls.vaultTimeout"
|
||||
ngDefaultControl
|
||||
>
|
||||
</app-vault-timeout-input>
|
||||
<div class="box-content-row display-block" appBoxRow>
|
||||
<label for="vaultTimeoutAction">{{ "vaultTimeoutAction" | i18n }}</label>
|
||||
<select
|
||||
id="vaultTimeoutAction"
|
||||
name="VaultTimeoutActions"
|
||||
formControlName="vaultTimeoutAction"
|
||||
>
|
||||
<option *ngFor="let action of availableVaultTimeoutActions" [ngValue]="action">
|
||||
{{ action | i18n }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div
|
||||
*ngIf="!availableVaultTimeoutActions.includes(VaultTimeoutAction.Lock)"
|
||||
id="unlockMethodHelp"
|
||||
class="box-footer"
|
||||
>
|
||||
{{ "unlockMethodNeededToChangeTimeoutActionDesc" | i18n }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box list">
|
||||
<h2 class="box-header">{{ "otherOptions" | i18n }}</h2>
|
||||
<div class="box-content single-line">
|
||||
<button
|
||||
type="button"
|
||||
class="box-content-row box-content-row-flex text-default"
|
||||
appStopClick
|
||||
(click)="fingerprint()"
|
||||
>
|
||||
<div class="row-main">{{ "fingerprintPhrase" | i18n }}</div>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="box-content-row box-content-row-flex text-default"
|
||||
appStopClick
|
||||
(click)="twoStep()"
|
||||
>
|
||||
<div class="row-main">{{ "twoStepLogin" | i18n }}</div>
|
||||
<i class="bwi bwi-external-link bwi-lg row-sub-icon" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="box-content-row box-content-row-flex text-default"
|
||||
appStopClick
|
||||
(click)="changePassword()"
|
||||
*ngIf="showChangeMasterPass"
|
||||
>
|
||||
<div class="row-main">{{ "changeMasterPassword" | i18n }}</div>
|
||||
<i class="bwi bwi-external-link bwi-lg row-sub-icon" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button
|
||||
*ngIf="
|
||||
!accountSwitcherEnabled && availableVaultTimeoutActions.includes(VaultTimeoutAction.Lock)
|
||||
"
|
||||
type="button"
|
||||
class="box-content-row box-content-row-flex text-default"
|
||||
appStopClick
|
||||
(click)="lock()"
|
||||
>
|
||||
<div class="row-main">{{ "lockNow" | i18n }}</div>
|
||||
<i class="bwi bwi-angle-right bwi-lg row-sub-icon" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button
|
||||
*ngIf="!accountSwitcherEnabled"
|
||||
type="button"
|
||||
class="box-content-row box-content-row-flex text-default"
|
||||
appStopClick
|
||||
(click)="logOut()"
|
||||
>
|
||||
<div class="row-main">{{ "logOut" | i18n }}</div>
|
||||
<i class="bwi bwi-angle-right bwi-lg row-sub-icon" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
|
@ -1,6 +1,5 @@
|
|||
import { ChangeDetectorRef, Component, OnInit } from "@angular/core";
|
||||
import { FormBuilder } from "@angular/forms";
|
||||
import { Router } from "@angular/router";
|
||||
import {
|
||||
BehaviorSubject,
|
||||
combineLatest,
|
||||
|
@ -17,12 +16,13 @@ import {
|
|||
} from "rxjs";
|
||||
|
||||
import { FingerprintDialogComponent } from "@bitwarden/auth/angular";
|
||||
import { PinServiceAbstraction } from "@bitwarden/auth/common";
|
||||
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
|
||||
import { VaultTimeoutService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout.service";
|
||||
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
|
||||
import { PolicyType } from "@bitwarden/common/admin-console/enums";
|
||||
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
||||
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
|
||||
import { DeviceType } from "@bitwarden/common/enums";
|
||||
import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum";
|
||||
import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
|
||||
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
||||
|
@ -33,35 +33,20 @@ import { StateService } from "@bitwarden/common/platform/abstractions/state.serv
|
|||
import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service";
|
||||
import { DialogService } from "@bitwarden/components";
|
||||
|
||||
import { SetPinComponent } from "../../auth/popup/components/set-pin.component";
|
||||
import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors";
|
||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||
import { enableAccountSwitching } from "../../platform/flags";
|
||||
import BrowserPopupUtils from "../../platform/popup/browser-popup-utils";
|
||||
import { BiometricErrors, BiometricErrorTypes } from "../../../models/biometricErrors";
|
||||
import { BrowserApi } from "../../../platform/browser/browser-api";
|
||||
import { enableAccountSwitching } from "../../../platform/flags";
|
||||
import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils";
|
||||
import { SetPinComponent } from "../components/set-pin.component";
|
||||
|
||||
import { AboutComponent } from "./about.component";
|
||||
import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component";
|
||||
|
||||
const RateUrls = {
|
||||
[DeviceType.ChromeExtension]:
|
||||
"https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews",
|
||||
[DeviceType.FirefoxExtension]:
|
||||
"https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews",
|
||||
[DeviceType.OperaExtension]:
|
||||
"https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container",
|
||||
[DeviceType.EdgeExtension]:
|
||||
"https://microsoftedge.microsoft.com/addons/detail/jbkfoedolllekgbhcbcoahefnbanhhlh",
|
||||
[DeviceType.VivaldiExtension]:
|
||||
"https://chromewebstore.google.com/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews",
|
||||
[DeviceType.SafariExtension]: "https://apps.apple.com/app/bitwarden/id1352778147",
|
||||
};
|
||||
|
||||
@Component({
|
||||
selector: "app-settings",
|
||||
templateUrl: "settings.component.html",
|
||||
selector: "auth-account-security",
|
||||
templateUrl: "account-security.component.html",
|
||||
})
|
||||
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
||||
export class SettingsComponent implements OnInit {
|
||||
export class AccountSecurityComponent implements OnInit {
|
||||
protected readonly VaultTimeoutAction = VaultTimeoutAction;
|
||||
|
||||
availableVaultTimeoutActions: VaultTimeoutAction[] = [];
|
||||
|
@ -86,6 +71,8 @@ export class SettingsComponent implements OnInit {
|
|||
private destroy$ = new Subject<void>();
|
||||
|
||||
constructor(
|
||||
private accountService: AccountService,
|
||||
private pinService: PinServiceAbstraction,
|
||||
private policyService: PolicyService,
|
||||
private formBuilder: FormBuilder,
|
||||
private platformUtilsService: PlatformUtilsService,
|
||||
|
@ -93,7 +80,6 @@ export class SettingsComponent implements OnInit {
|
|||
private vaultTimeoutService: VaultTimeoutService,
|
||||
private vaultTimeoutSettingsService: VaultTimeoutSettingsService,
|
||||
public messagingService: MessagingService,
|
||||
private router: Router,
|
||||
private environmentService: EnvironmentService,
|
||||
private cryptoService: CryptoService,
|
||||
private stateService: StateService,
|
||||
|
@ -147,7 +133,6 @@ export class SettingsComponent implements OnInit {
|
|||
if (timeout === -2 && !showOnLocked) {
|
||||
timeout = -1;
|
||||
}
|
||||
const pinStatus = await this.vaultTimeoutSettingsService.isPinLockSet();
|
||||
|
||||
this.form.controls.vaultTimeout.valueChanges
|
||||
.pipe(
|
||||
|
@ -169,12 +154,14 @@ export class SettingsComponent implements OnInit {
|
|||
)
|
||||
.subscribe();
|
||||
|
||||
const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id;
|
||||
|
||||
const initialValues = {
|
||||
vaultTimeout: timeout,
|
||||
vaultTimeoutAction: await firstValueFrom(
|
||||
this.vaultTimeoutSettingsService.vaultTimeoutAction$(),
|
||||
),
|
||||
pin: pinStatus !== "DISABLED",
|
||||
pin: await this.pinService.isPinSet(userId),
|
||||
biometric: await this.vaultTimeoutSettingsService.isBiometricLockSet(),
|
||||
enableAutoBiometricsPrompt: await firstValueFrom(
|
||||
this.biometricStateService.promptAutomatically$,
|
||||
|
@ -423,22 +410,6 @@ export class SettingsComponent implements OnInit {
|
|||
);
|
||||
}
|
||||
|
||||
async lock() {
|
||||
await this.vaultTimeoutService.lock();
|
||||
}
|
||||
|
||||
async logOut() {
|
||||
const confirmed = await this.dialogService.openSimpleDialog({
|
||||
title: { key: "logOut" },
|
||||
content: { key: "logOutConfirmation" },
|
||||
type: "info",
|
||||
});
|
||||
|
||||
if (confirmed) {
|
||||
this.messagingService.send("logout");
|
||||
}
|
||||
}
|
||||
|
||||
async changePassword() {
|
||||
const confirmed = await this.dialogService.openSimpleDialog({
|
||||
title: { key: "continueToWebApp" },
|
||||
|
@ -465,44 +436,6 @@ export class SettingsComponent implements OnInit {
|
|||
}
|
||||
}
|
||||
|
||||
async share() {
|
||||
const confirmed = await this.dialogService.openSimpleDialog({
|
||||
title: { key: "learnOrg" },
|
||||
content: { key: "learnOrgConfirmation" },
|
||||
type: "info",
|
||||
});
|
||||
if (confirmed) {
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
BrowserApi.createNewTab("https://bitwarden.com/help/about-organizations/");
|
||||
}
|
||||
}
|
||||
|
||||
async webVault() {
|
||||
const env = await firstValueFrom(this.environmentService.environment$);
|
||||
const url = env.getWebVaultUrl();
|
||||
await BrowserApi.createNewTab(url);
|
||||
}
|
||||
|
||||
async import() {
|
||||
await this.router.navigate(["/import"]);
|
||||
if (await BrowserApi.isPopupOpen()) {
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
BrowserPopupUtils.openCurrentPagePopout(window);
|
||||
}
|
||||
}
|
||||
|
||||
export() {
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
this.router.navigate(["/export"]);
|
||||
}
|
||||
|
||||
about() {
|
||||
this.dialogService.open(AboutComponent);
|
||||
}
|
||||
|
||||
async fingerprint() {
|
||||
const fingerprint = await this.cryptoService.getFingerprint(
|
||||
await this.stateService.getUserId(),
|
||||
|
@ -515,11 +448,21 @@ export class SettingsComponent implements OnInit {
|
|||
return firstValueFrom(dialogRef.closed);
|
||||
}
|
||||
|
||||
rate() {
|
||||
const deviceType = this.platformUtilsService.getDevice();
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
BrowserApi.createNewTab((RateUrls as any)[deviceType]);
|
||||
async lock() {
|
||||
await this.vaultTimeoutService.lock();
|
||||
}
|
||||
|
||||
async logOut() {
|
||||
const confirmed = await this.dialogService.openSimpleDialog({
|
||||
title: { key: "logOut" },
|
||||
content: { key: "logOutConfirmation" },
|
||||
type: "info",
|
||||
});
|
||||
|
||||
const userId = (await firstValueFrom(this.accountService.activeAccount$))?.id;
|
||||
if (confirmed) {
|
||||
this.messagingService.send("logout", { userId: userId });
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
|
@ -4,40 +4,29 @@ import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service
|
|||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
|
||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||
|
||||
export default class WebRequestBackground {
|
||||
private pendingAuthRequests: any[] = [];
|
||||
private webRequest: any;
|
||||
private pendingAuthRequests: Set<string> = new Set<string>([]);
|
||||
private isFirefox: boolean;
|
||||
|
||||
constructor(
|
||||
platformUtilsService: PlatformUtilsService,
|
||||
private cipherService: CipherService,
|
||||
private authService: AuthService,
|
||||
private readonly webRequest: typeof chrome.webRequest,
|
||||
) {
|
||||
if (BrowserApi.isManifestVersion(2)) {
|
||||
this.webRequest = chrome.webRequest;
|
||||
}
|
||||
this.isFirefox = platformUtilsService.isFirefox();
|
||||
}
|
||||
|
||||
async init() {
|
||||
if (!this.webRequest || !this.webRequest.onAuthRequired) {
|
||||
return;
|
||||
}
|
||||
|
||||
startListening() {
|
||||
this.webRequest.onAuthRequired.addListener(
|
||||
async (details: any, callback: any) => {
|
||||
if (!details.url || this.pendingAuthRequests.indexOf(details.requestId) !== -1) {
|
||||
async (details, callback) => {
|
||||
if (!details.url || this.pendingAuthRequests.has(details.requestId)) {
|
||||
if (callback) {
|
||||
callback();
|
||||
callback(null);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
this.pendingAuthRequests.push(details.requestId);
|
||||
|
||||
this.pendingAuthRequests.add(details.requestId);
|
||||
if (this.isFirefox) {
|
||||
// eslint-disable-next-line
|
||||
return new Promise(async (resolve, reject) => {
|
||||
|
@ -51,7 +40,7 @@ export default class WebRequestBackground {
|
|||
[this.isFirefox ? "blocking" : "asyncBlocking"],
|
||||
);
|
||||
|
||||
this.webRequest.onCompleted.addListener((details: any) => this.completeAuthRequest(details), {
|
||||
this.webRequest.onCompleted.addListener((details) => this.completeAuthRequest(details), {
|
||||
urls: ["http://*/*"],
|
||||
});
|
||||
this.webRequest.onErrorOccurred.addListener(
|
||||
|
@ -91,10 +80,7 @@ export default class WebRequestBackground {
|
|||
}
|
||||
}
|
||||
|
||||
private completeAuthRequest(details: any) {
|
||||
const i = this.pendingAuthRequests.indexOf(details.requestId);
|
||||
if (i > -1) {
|
||||
this.pendingAuthRequests.splice(i, 1);
|
||||
}
|
||||
private completeAuthRequest(details: chrome.webRequest.WebResponseCacheDetails) {
|
||||
this.pendingAuthRequests.delete(details.requestId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,8 @@ import {
|
|||
GENERATE_PASSWORD_ID,
|
||||
NOOP_COMMAND_SUFFIX,
|
||||
} from "@bitwarden/common/autofill/constants";
|
||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec";
|
||||
import { UserId } from "@bitwarden/common/types/guid";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service";
|
||||
import { CipherType } from "@bitwarden/common/vault/enums";
|
||||
|
@ -65,7 +66,7 @@ describe("ContextMenuClickedHandler", () => {
|
|||
let autofill: AutofillAction;
|
||||
let authService: MockProxy<AuthService>;
|
||||
let cipherService: MockProxy<CipherService>;
|
||||
let stateService: MockProxy<StateService>;
|
||||
let accountService: FakeAccountService;
|
||||
let totpService: MockProxy<TotpService>;
|
||||
let eventCollectionService: MockProxy<EventCollectionService>;
|
||||
let userVerificationService: MockProxy<UserVerificationService>;
|
||||
|
@ -78,7 +79,7 @@ describe("ContextMenuClickedHandler", () => {
|
|||
autofill = jest.fn<Promise<void>, [tab: chrome.tabs.Tab, cipher: CipherView]>();
|
||||
authService = mock();
|
||||
cipherService = mock();
|
||||
stateService = mock();
|
||||
accountService = mockAccountServiceWith("userId" as UserId);
|
||||
totpService = mock();
|
||||
eventCollectionService = mock();
|
||||
|
||||
|
@ -88,10 +89,10 @@ describe("ContextMenuClickedHandler", () => {
|
|||
autofill,
|
||||
authService,
|
||||
cipherService,
|
||||
stateService,
|
||||
totpService,
|
||||
eventCollectionService,
|
||||
userVerificationService,
|
||||
accountService,
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
import { firstValueFrom, map } from "rxjs";
|
||||
|
||||
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
|
||||
import { 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";
|
||||
|
@ -17,7 +20,6 @@ import {
|
|||
NOOP_COMMAND_SUFFIX,
|
||||
} from "@bitwarden/common/autofill/constants";
|
||||
import { EventType } from "@bitwarden/common/enums";
|
||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
|
@ -26,6 +28,7 @@ import { CipherType } from "@bitwarden/common/vault/enums";
|
|||
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
|
||||
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||
|
||||
import { accountServiceFactory } from "../../auth/background/service-factories/account-service.factory";
|
||||
import {
|
||||
authServiceFactory,
|
||||
AuthServiceInitOptions,
|
||||
|
@ -37,7 +40,6 @@ import { autofillSettingsServiceFactory } from "../../autofill/background/servic
|
|||
import { eventCollectionServiceFactory } from "../../background/service-factories/event-collection-service.factory";
|
||||
import { Account } from "../../models/account";
|
||||
import { CachedServices } from "../../platform/background/service-factories/factory-options";
|
||||
import { stateServiceFactory } from "../../platform/background/service-factories/state-service.factory";
|
||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||
import { passwordGenerationServiceFactory } from "../../tools/background/service_factories/password-generation-service.factory";
|
||||
import {
|
||||
|
@ -71,10 +73,10 @@ export class ContextMenuClickedHandler {
|
|||
private autofillAction: AutofillAction,
|
||||
private authService: AuthService,
|
||||
private cipherService: CipherService,
|
||||
private stateService: StateService,
|
||||
private totpService: TotpService,
|
||||
private eventCollectionService: EventCollectionService,
|
||||
private userVerificationService: UserVerificationService,
|
||||
private accountService: AccountService,
|
||||
) {}
|
||||
|
||||
static async mv3Create(cachedServices: CachedServices) {
|
||||
|
@ -128,10 +130,10 @@ export class ContextMenuClickedHandler {
|
|||
(tab, cipher) => autofillCommand.doAutofillTabWithCipherCommand(tab, cipher),
|
||||
await authServiceFactory(cachedServices, serviceOptions),
|
||||
await cipherServiceFactory(cachedServices, serviceOptions),
|
||||
await stateServiceFactory(cachedServices, serviceOptions),
|
||||
await totpServiceFactory(cachedServices, serviceOptions),
|
||||
await eventCollectionServiceFactory(cachedServices, serviceOptions),
|
||||
await userVerificationServiceFactory(cachedServices, serviceOptions),
|
||||
await accountServiceFactory(cachedServices, serviceOptions),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -239,9 +241,10 @@ export class ContextMenuClickedHandler {
|
|||
return;
|
||||
}
|
||||
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
this.stateService.setLastActive(new Date().getTime());
|
||||
const activeUserId = await firstValueFrom(
|
||||
this.accountService.activeAccount$.pipe(map((a) => a?.id)),
|
||||
);
|
||||
await this.accountService.setAccountActivity(activeUserId, new Date());
|
||||
switch (info.parentMenuItemId) {
|
||||
case AUTOFILL_ID:
|
||||
case AUTOFILL_IDENTITY_ID:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<form #form (ngSubmit)="submit()">
|
||||
<header>
|
||||
<div class="left">
|
||||
<button type="button" routerLink="/tabs/settings">
|
||||
<button type="button" routerLink="/notifications">
|
||||
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
|
||||
<span>{{ "back" | i18n }}</span>
|
||||
</button>
|
|
@ -8,8 +8,8 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic
|
|||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||
|
||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||
import { enableAccountSwitching } from "../../platform/flags";
|
||||
import { BrowserApi } from "../../../platform/browser/browser-api";
|
||||
import { enableAccountSwitching } from "../../../platform/flags";
|
||||
|
||||
interface ExcludedDomain {
|
||||
uri: string;
|
|
@ -0,0 +1,89 @@
|
|||
<header>
|
||||
<div class="left">
|
||||
<button type="button" routerLink="/tabs/settings">
|
||||
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
|
||||
<span>{{ "back" | i18n }}</span>
|
||||
</button>
|
||||
</div>
|
||||
<h1 class="center">
|
||||
<span class="title">{{ "notifications" | i18n }}</span>
|
||||
</h1>
|
||||
<div class="right">
|
||||
<app-pop-out></app-pop-out>
|
||||
</div>
|
||||
</header>
|
||||
<main tabindex="-1">
|
||||
<div class="box">
|
||||
<div class="box-content">
|
||||
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
||||
<label for="use-passkeys">{{ "enableUsePasskeys" | i18n }}</label>
|
||||
<input
|
||||
id="use-passkeys"
|
||||
type="checkbox"
|
||||
aria-describedby="use-passkeysHelp"
|
||||
(change)="updateEnablePasskeys()"
|
||||
[(ngModel)]="enablePasskeys"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="use-passkeysHelp" class="box-footer">
|
||||
{{ "usePasskeysDesc" | i18n }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="box-content">
|
||||
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
||||
<label for="addlogin-notification-bar">{{ "enableAddLoginNotification" | i18n }}</label>
|
||||
<input
|
||||
id="addlogin-notification-bar"
|
||||
type="checkbox"
|
||||
aria-describedby="addlogin-notification-barHelp"
|
||||
(change)="updateAddLoginNotification()"
|
||||
[(ngModel)]="enableAddLoginNotification"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="addlogin-notification-barHelp" class="box-footer">
|
||||
{{
|
||||
accountSwitcherEnabled
|
||||
? ("addLoginNotificationDescAlt" | i18n)
|
||||
: ("addLoginNotificationDesc" | i18n)
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="box-content">
|
||||
<div class="box-content-row box-content-row-checkbox" appBoxRow>
|
||||
<label for="changedpass-notification-bar">{{
|
||||
"enableChangedPasswordNotification" | i18n
|
||||
}}</label>
|
||||
<input
|
||||
id="changedpass-notification-bar"
|
||||
type="checkbox"
|
||||
aria-describedby="changedpass-notification-barHelp"
|
||||
(change)="updateChangedPasswordNotification()"
|
||||
[(ngModel)]="enableChangedPasswordNotification"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="changedpass-notification-barHelp" class="box-footer">
|
||||
{{
|
||||
accountSwitcherEnabled
|
||||
? ("changedPasswordNotificationDescAlt" | i18n)
|
||||
: ("changedPasswordNotificationDesc" | i18n)
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="box list">
|
||||
<div class="box-content single-line">
|
||||
<button
|
||||
type="button"
|
||||
class="box-content-row box-content-row-flex text-default"
|
||||
routerLink="/excluded-domains"
|
||||
>
|
||||
<div class="row-main">{{ "excludedDomains" | i18n }}</div>
|
||||
<i class="bwi bwi-angle-right bwi-lg row-sub-icon" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
|
@ -0,0 +1,53 @@
|
|||
import { Component, OnInit } from "@angular/core";
|
||||
import { firstValueFrom } from "rxjs";
|
||||
|
||||
import { UserNotificationSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/user-notification-settings.service";
|
||||
import { VaultSettingsService } from "@bitwarden/common/vault/abstractions/vault-settings/vault-settings.service";
|
||||
|
||||
import { enableAccountSwitching } from "../../../platform/flags";
|
||||
|
||||
@Component({
|
||||
selector: "autofill-notification-settings",
|
||||
templateUrl: "notifications.component.html",
|
||||
})
|
||||
export class NotifcationsSettingsComponent implements OnInit {
|
||||
enableAddLoginNotification = false;
|
||||
enableChangedPasswordNotification = false;
|
||||
enablePasskeys = true;
|
||||
accountSwitcherEnabled = false;
|
||||
|
||||
constructor(
|
||||
private userNotificationSettingsService: UserNotificationSettingsServiceAbstraction,
|
||||
private vaultSettingsService: VaultSettingsService,
|
||||
) {
|
||||
this.accountSwitcherEnabled = enableAccountSwitching();
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
this.enableAddLoginNotification = await firstValueFrom(
|
||||
this.userNotificationSettingsService.enableAddedLoginPrompt$,
|
||||
);
|
||||
|
||||
this.enableChangedPasswordNotification = await firstValueFrom(
|
||||
this.userNotificationSettingsService.enableChangedPasswordPrompt$,
|
||||
);
|
||||
|
||||
this.enablePasskeys = await firstValueFrom(this.vaultSettingsService.enablePasskeys$);
|
||||
}
|
||||
|
||||
async updateAddLoginNotification() {
|
||||
await this.userNotificationSettingsService.setEnableAddedLoginPrompt(
|
||||
this.enableAddLoginNotification,
|
||||
);
|
||||
}
|
||||
|
||||
async updateChangedPasswordNotification() {
|
||||
await this.userNotificationSettingsService.setEnableChangedPasswordPrompt(
|
||||
this.enableChangedPasswordNotification,
|
||||
);
|
||||
}
|
||||
|
||||
async updateEnablePasskeys() {
|
||||
await this.vaultSettingsService.setEnablePasskeys(this.enablePasskeys);
|
||||
}
|
||||
}
|
|
@ -12,6 +12,7 @@ import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abs
|
|||
import { EventType } from "@bitwarden/common/enums";
|
||||
import { UriMatchStrategy } from "@bitwarden/common/models/domain/domain-service";
|
||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||
import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service";
|
||||
import {
|
||||
|
@ -74,9 +75,10 @@ describe("AutofillService", () => {
|
|||
const logService = mock<LogService>();
|
||||
const userVerificationService = mock<UserVerificationService>();
|
||||
const billingAccountProfileStateService = mock<BillingAccountProfileStateService>();
|
||||
const platformUtilsService = mock<PlatformUtilsService>();
|
||||
|
||||
beforeEach(() => {
|
||||
scriptInjectorService = new BrowserScriptInjectorService();
|
||||
scriptInjectorService = new BrowserScriptInjectorService(platformUtilsService, logService);
|
||||
autofillService = new AutofillService(
|
||||
cipherService,
|
||||
autofillSettingsService,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue