mirror of
https://github.com/bitwarden/browser
synced 2025-12-17 16:53:34 +00:00
Merge branch 'master' into ps/PM-2841/remove-swal
This commit is contained in:
2
.github/workflows/brew-bump-cli.yml
vendored
2
.github/workflows/brew-bump-cli.yml
vendored
@@ -38,4 +38,4 @@ jobs:
|
||||
formula: bitwarden-cli
|
||||
tag: ${{ github.ref }}
|
||||
revision: ${{ github.sha }}
|
||||
force: false
|
||||
force: true
|
||||
|
||||
2
.github/workflows/brew-bump-desktop.yml
vendored
2
.github/workflows/brew-bump-desktop.yml
vendored
@@ -38,5 +38,5 @@ jobs:
|
||||
cask: bitwarden
|
||||
tag: ${{ github.ref }}
|
||||
revision: ${{ github.sha }}
|
||||
force: false
|
||||
force: true
|
||||
dryrun: true
|
||||
|
||||
8
.github/workflows/build-cli.yml
vendored
8
.github/workflows/build-cli.yml
vendored
@@ -35,7 +35,7 @@ defaults:
|
||||
jobs:
|
||||
cloc:
|
||||
name: CLOC
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
setup:
|
||||
name: Setup
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
outputs:
|
||||
package_version: ${{ steps.retrieve-version.outputs.package_version }}
|
||||
steps:
|
||||
@@ -69,7 +69,7 @@ jobs:
|
||||
name: Build CLI ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-20.04, macos-11]
|
||||
os: [ubuntu-22.04, macos-11]
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs:
|
||||
- setup
|
||||
@@ -368,7 +368,7 @@ jobs:
|
||||
check-failures:
|
||||
name: Check for failures
|
||||
if: always()
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
needs:
|
||||
- cloc
|
||||
- setup
|
||||
|
||||
2
.github/workflows/release-cli.yml
vendored
2
.github/workflows/release-cli.yml
vendored
@@ -182,6 +182,8 @@ jobs:
|
||||
|
||||
- name: Publish Snap & logout
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }}
|
||||
run: |
|
||||
snapcraft push bw_${{ env._PKG_VERSION }}_amd64.snap --release stable
|
||||
snapcraft logout
|
||||
|
||||
46
.github/workflows/release-desktop.yml
vendored
46
.github/workflows/release-desktop.yml
vendored
@@ -47,7 +47,7 @@ defaults:
|
||||
jobs:
|
||||
setup:
|
||||
name: Setup
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
outputs:
|
||||
release-version: ${{ steps.version.outputs.version }}
|
||||
release-channel: ${{ steps.release-channel.outputs.channel }}
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
|
||||
- name: Branch check
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
run: |
|
||||
if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ "$GITHUB_REF" != "refs/heads/hotfix-rc-desktop" ]]; then
|
||||
echo "==================================="
|
||||
@@ -69,7 +69,7 @@ jobs:
|
||||
id: version
|
||||
uses: bitwarden/gh-actions/release-version-check@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
release-type: ${{ github.event.inputs.release_type }}
|
||||
release-type: ${{ inputs.release_type }}
|
||||
project-type: ts
|
||||
file: apps/desktop/src/package.json
|
||||
monorepo: true
|
||||
@@ -93,7 +93,7 @@ jobs:
|
||||
esac
|
||||
|
||||
- name: Create GitHub deployment
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5
|
||||
id: deployment
|
||||
with:
|
||||
@@ -122,7 +122,7 @@ jobs:
|
||||
cf-prod-account"
|
||||
|
||||
- name: Download all artifacts
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
workflow: build-desktop.yml
|
||||
@@ -131,7 +131,7 @@ jobs:
|
||||
path: apps/desktop/artifacts
|
||||
|
||||
- name: Dry Run - Download all artifacts
|
||||
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
||||
if: ${{ inputs.release_type == 'Dry Run' }}
|
||||
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
workflow: build-desktop.yml
|
||||
@@ -146,17 +146,17 @@ jobs:
|
||||
run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive
|
||||
|
||||
- name: Set staged rollout percentage
|
||||
if: ${{ github.event.inputs.electron_publish }}
|
||||
if: ${{ inputs.electron_publish == 'true' }}
|
||||
env:
|
||||
RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }}
|
||||
ROLLOUT_PCT: ${{ github.event.inputs.rollout_percentage }}
|
||||
ROLLOUT_PCT: ${{ inputs.rollout_percentage }}
|
||||
run: |
|
||||
echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}.yml
|
||||
echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-linux.yml
|
||||
echo "stagingPercentage: ${ROLLOUT_PCT}" >> apps/desktop/artifacts/${RELEASE_CHANNEL}-mac.yml
|
||||
|
||||
- name: Publish artifacts to S3
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' && github.event.inputs.electron_publish }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' && inputs.electron_publish == 'true' }}
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }}
|
||||
@@ -170,7 +170,7 @@ jobs:
|
||||
--quiet
|
||||
|
||||
- name: Publish artifacts to R2
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' && github.event.inputs.electron_publish }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' && inputs.electron_publish == 'true' }}
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.r2-electron-access-id }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.r2-electron-access-key }}
|
||||
@@ -185,14 +185,14 @@ jobs:
|
||||
--endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com
|
||||
|
||||
- name: Get checksum files
|
||||
uses: bitwarden/gh-actions/get-checksum@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
uses: bitwarden/gh-actions/get-checksum@82cfceb235b308c2eb63923824e61d8350d280db
|
||||
with:
|
||||
packages_dir: "apps/desktop/artifacts"
|
||||
file_path: "apps/desktop/artifacts/sha256-checksums.txt"
|
||||
|
||||
- name: Create Release
|
||||
uses: ncipollo/release-action@a2e71bdd4e7dab70ca26a852f29600c98b33153e # v1.12.0
|
||||
if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' && inputs.github_release }}
|
||||
if: ${{ steps.release-channel.outputs.channel == 'latest' && inputs.release_type != 'Dry Run' && inputs.github_release == 'true' }}
|
||||
env:
|
||||
PKG_VERSION: ${{ steps.version.outputs.version }}
|
||||
RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }}
|
||||
@@ -230,7 +230,7 @@ jobs:
|
||||
draft: true
|
||||
|
||||
- name: Update deployment status to Success
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' && success() }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' && success() }}
|
||||
uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1
|
||||
with:
|
||||
token: '${{ secrets.GITHUB_TOKEN }}'
|
||||
@@ -238,7 +238,7 @@ jobs:
|
||||
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
|
||||
|
||||
- name: Update deployment status to Failure
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' && failure() }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' && failure() }}
|
||||
uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1
|
||||
with:
|
||||
token: '${{ secrets.GITHUB_TOKEN }}'
|
||||
@@ -247,9 +247,9 @@ jobs:
|
||||
|
||||
snap:
|
||||
name: Deploy Snap
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
needs: setup
|
||||
if: inputs.snap_publish
|
||||
if: ${{ inputs.snap_publish == 'true' }}
|
||||
env:
|
||||
_PKG_VERSION: ${{ needs.setup.outputs.release-version }}
|
||||
steps:
|
||||
@@ -278,7 +278,7 @@ jobs:
|
||||
working-directory: apps/desktop
|
||||
|
||||
- name: Download Snap artifact
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
workflow: build-desktop.yml
|
||||
@@ -288,7 +288,7 @@ jobs:
|
||||
path: apps/desktop/dist
|
||||
|
||||
- name: Dry Run - Download Snap artifact
|
||||
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
||||
if: ${{ inputs.release_type == 'Dry Run' }}
|
||||
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
workflow: build-desktop.yml
|
||||
@@ -298,7 +298,7 @@ jobs:
|
||||
path: apps/desktop/dist
|
||||
|
||||
- name: Deploy to Snap Store
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }}
|
||||
run: |
|
||||
@@ -310,7 +310,7 @@ jobs:
|
||||
name: Deploy Choco
|
||||
runs-on: windows-2019
|
||||
needs: setup
|
||||
if: inputs.choco_publish
|
||||
if: ${{ inputs.choco_publish == 'true' }}
|
||||
env:
|
||||
_PKG_VERSION: ${{ needs.setup.outputs.release-version }}
|
||||
steps:
|
||||
@@ -346,7 +346,7 @@ jobs:
|
||||
working-directory: apps/desktop
|
||||
|
||||
- name: Download choco artifact
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
workflow: build-desktop.yml
|
||||
@@ -356,7 +356,7 @@ jobs:
|
||||
path: apps/desktop/dist
|
||||
|
||||
- name: Dry Run - Download choco artifact
|
||||
if: ${{ github.event.inputs.release_type == 'Dry Run' }}
|
||||
if: ${{ inputs.release_type == 'Dry Run' }}
|
||||
uses: bitwarden/gh-actions/download-artifacts@67ab95d7a466bcefdedf3f93cbc10bcff436edfe
|
||||
with:
|
||||
workflow: build-desktop.yml
|
||||
@@ -366,7 +366,7 @@ jobs:
|
||||
path: apps/desktop/dist
|
||||
|
||||
- name: Push to Chocolatey
|
||||
if: ${{ github.event.inputs.release_type != 'Dry Run' }}
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
shell: pwsh
|
||||
run: choco push --source=https://push.chocolatey.org/
|
||||
working-directory: apps/desktop/dist
|
||||
|
||||
2
.github/workflows/version-auto-bump.yml
vendored
2
.github/workflows/version-auto-bump.yml
vendored
@@ -42,8 +42,6 @@ jobs:
|
||||
name: Bump version to ${{ needs.setup.outputs.version_number }}
|
||||
needs: setup
|
||||
uses: ./.github/workflows/version-bump.yml
|
||||
secrets:
|
||||
AZURE_PROD_KV_CREDENTIALS: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||
with:
|
||||
version_number: ${{ needs.setup.outputs.version_number }}
|
||||
client: "Desktop"
|
||||
|
||||
3
.github/workflows/version-bump.yml
vendored
3
.github/workflows/version-bump.yml
vendored
@@ -26,9 +26,6 @@ on:
|
||||
client:
|
||||
required: true
|
||||
type: string
|
||||
secrets:
|
||||
AZURE_PROD_KV_CREDENTIALS:
|
||||
required: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "خيارات تسجيل الدخول الإضافية من خطوتين مثل YubiKey و FIDO U2F و Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "نظافة كلمة المرور، صحة الحساب، وتقارير خرق البيانات للحفاظ على سلامة خزنتك."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi"
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey, FIDO U2F və Duo kimi iki mərhələli giriş seçimləri"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Anbarınızın təhlükəsiyini təmin etmək üçün parol gigiyenası, hesab sağlamlığı və verilənlərin pozulması hesabatları."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 ГБ зашыфраванага сховішча для далучаных файлаў."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Дадатковыя варыянты двухэтапнага ўваходу, такія як YubiKey, FIDO U2F і Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Гігіена пароляў, здароўе ўліковага запісу і справаздачы аб уцечках даных для забеспячэння бяспекі вашага сховішча."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB пространство за файлове, които се шифрират."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Двустепенно удостоверяване чрез YubiKey, FIDO U2F и Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Проверки в списъците с публикувани пароли, проверка на регистрациите и доклади за пробивите в сигурността, което спомага трезорът ви да е допълнително защитен."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।"
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey, FIDO U2F, ও Duo এর মতো অতিরিক্ত দ্বি-পদক্ষেপ লগইন বিকল্পগুলি।"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "আপনার ভল্টটি সুরক্ষিত রাখতে পাসওয়ার্ড স্বাস্থ্যকরন, অ্যাকাউন্ট স্বাস্থ্য এবং ডেটা লঙ্ঘনের প্রতিবেদন।"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB d'emmagatzematge xifrat per als fitxers adjunts."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Opcions addicionals d'inici de sessió en dues passes com ara YubiKey, FIDO U2F i Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Opcions propietàries de doble factor com ara YubiKey i Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Requisits d'higiene de la contrasenya, salut del compte i informe d'infraccions de dades per mantenir la seguretat de la vostra caixa forta."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB šifrovaného úložiště pro přílohy."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Další možnosti dvoufázového přihlášení, jako je například YubiKey, FIDO U2F a Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Volby proprietálních dvoufázových přihlášení jako je YubiKey a Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Reporty o hygieně Vašich hesel, zdraví účtu a narušeních bezpečnosti."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB krypteret lager til vedhæftede filer."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Yderligere to-trins login muligheder såsom YubiKey, FIDO U2F og Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietære totrins-login muligheder, såsom YubiKey og Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Adgangskodehygiejne, kontosundhed og rapporter om datalæk til at holde din boks sikker."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB verschlüsselter Speicherplatz für Dateianhänge."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Zusätzliche Zweifaktor-Anmeldung über YubiKey, FIDO U2F, und Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietäre Optionen für die Zwei-Faktor Authentifizierung wie YubiKey und Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Berichte über Kennworthygiene, Kontostatus und Datenschutzverletzungen, um deinen Tresor sicher zu halten."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB κρυπτογραφημένο αποθηκευτικό χώρο για συνημμένα αρχεία."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Πρόσθετες επιλογές σύνδεσης δύο βημάτων, όπως το YubiKey, το FIDO U2F και το Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Ασφάλεια κωδικών, υγεία λογαριασμού και αναφορές παραβίασης δεδομένων για να διατηρήσετε ασφαλές το vault σας."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB de espacio cifrado en disco para adjuntos."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Métodos de autenticación en dos pasos adicionales como YubiKey, FIDO U2F y Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Higiene de contraseña, salud de la cuenta e informes de violaciones de datos para mantener su caja fuerte segura."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB ulatuses krüpteeritud salvestusruum."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Lisavõimalused kaheastmeliseks kinnitamiseks, näiteks YubiKey, FIDO U2F ja Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Parooli hügieen, konto seisukord ja andmelekete raportid aitavad hoidlat turvalisena hoida."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "Eranskinentzako 1GB-eko zifratutako biltegia."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey, FIDO U2F eta Duo bezalako bi urratseko saio hasierarako aukera gehigarriak."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Pasahitzaren higienea, kontuaren egoera eta datu-bortxaketen txostenak, kutxa gotorra seguru mantentzeko."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "گزینههای ورود دو مرحلهای اضافی مانند YubiKey, FIDO U2F و Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "گزارشهای بهداشت رمز عبور، سلامت حساب و نقض دادهها برای ایمن نگهداشتن گاوصندوق شما."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 Gt salattua tallennustilaa tiedostoliitteille."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Muita kaksivaiheisen kirjautumisen todennusmenetelmiä kuten YubiKey, FIDO U2F ja Duo Security."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Salasanahygienian, tilin terveyden ja tietovuotojen raportointitoiminnot pitävät holvisi turvassa."
|
||||
@@ -2310,7 +2310,7 @@
|
||||
"message": "pakollinen"
|
||||
},
|
||||
"search": {
|
||||
"message": "Etsi"
|
||||
"message": "Hae"
|
||||
},
|
||||
"inputMinLength": {
|
||||
"message": "Syötteen tulee sisältää ainakin $COUNT$ merkkiä.",
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage para sa mga file attachment."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Dagdag na dalawang hakbang na login option gaya ng YubiKey, FIDO U2F, at Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Pasahod higiyena, kalusugan ng account, at mga ulat sa data breach upang panatilihing ligtas ang iyong vault."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 Go de stockage chiffré pour les fichiers joints."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Options additionnelles d'identification à deux étapes telles que YubiKey, FIDO U2F et Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Options de connexion propriétaires à deux facteurs telles que YubiKey et Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Hygiène du mot de passe, santé du compte et rapports sur les brèches de données pour assurer la sécurité de votre coffre."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 ג'יגה של מקום אחסון עבור קבצים מצורפים."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "אפשרויות כניסה דו שלבית מתקדמות כמו YubiKey, FIDO U2F, וגם Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "היגיינת סיסמאות, מצב בריאות החשבון, ודיווחים מעודכנים על פרצות חדשות בכדי לשמור על הכספת שלך בטוחה."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB of encrypted file storage."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "अतिरिक्त दो-चरण लॉगिन विकल्प जैसे YubiKey, FIDO U2F, और डुओ।"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "अपनी वॉल्ट को सुरक्षित रखने के लिए पासवर्ड स्वच्छता, खाता स्वास्थ्य और डेटा उल्लंघन रिपोर्ट।"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB šifriranog prostora za pohranu podataka."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Dodatne mogućnosti za prijavu dvostrukom autentifikacijom kao što su YubiKey, FIDO U2F i Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Higijenu lozinki, zdravlje računa i izvještaje o krađi podatak radi zaštite svojeg trezora."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB titkosított tárhely a fájlmellékleteknek."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "További két lépcsős bejelentkezés lehetőségek, mint például YubiKey, FIDO U2F és Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Jelszó higiénia, fiók biztonság és adatszivárgási jelentések a széf biztonsága érdekében."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB penyimpanan berkas yang dienkripsi."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Pilihan info masuk dua langkah tambahan seperti YubiKey, FIDO U2F, dan Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Kebersihan kata sandi, kesehatan akun, dan laporan kebocoran data untuk tetap menjaga keamanan brankas Anda."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB di spazio di archiviazione criptato per gli allegati."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Più opzioni di verifica in due passaggi come YubiKey, FIDO U2F, e Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Sicurezza delle password, integrità dell'account, e rapporti su violazioni di dati per mantenere sicura la tua cassaforte."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1GB の暗号化されたファイルストレージ"
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey、FIDO U2F、Duoなどの追加の2段階認証ログインオプション"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "YubiKey、Duo などのプロプライエタリな2段階認証オプション。"
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "保管庫を安全に保つための、パスワードやアカウントの健全性、データ侵害に関するレポート"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "ಫೈಲ್ ಲಗತ್ತುಗಳಿಗಾಗಿ 1 ಜಿಬಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಗ್ರಹ."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "ಹೆಚ್ಚುವರಿ ಎರಡು-ಹಂತದ ಲಾಗಿನ್ ಆಯ್ಕೆಗಳಾದ ಯೂಬಿಕೆ, ಎಫ್ಐಡಿಒ ಯು 2 ಎಫ್, ಮತ್ತು ಡ್ಯುವೋ."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "ನಿಮ್ಮ ವಾಲ್ಟ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು ಪಾಸ್ವರ್ಡ್ ನೈರ್ಮಲ್ಯ, ಖಾತೆ ಆರೋಗ್ಯ ಮತ್ತು ಡೇಟಾ ಉಲ್ಲಂಘನೆ ವರದಿಗಳು."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1GB의 암호화된 파일 저장소."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey나 FIDO U2F, Duo 등의 추가적인 2단계 인증 옵션."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "보관함을 안전하게 유지하기 위한 암호 위생, 계정 상태, 데이터 유출 보고서"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB užšifruotos vietos diske bylų prisegimams."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Papildomos dviejų žingsių prisijungimo opcijos, tokios kaip YubiKey, FIDO U2F ir Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Patentuotos dviejų žingsnių prisijungimo parinktys, tokios kaip YubiKey ir Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Slaptažodžio higiena, prieigos sveikata ir duomenų nutekinimo ataskaitos, kad tavo saugyklas būtų saugus."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB šifrētas krātuves datņu pielikumiem."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Tādas papildu divpakāpju pieteikšanās iespējas kā YubiKey, FIDO U2F un Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Tādas slēgtā pirmavota divpakāpju pieteikšanās iespējas kā YubiKey un Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Paroļu higiēnas, konta veselības un datu noplūžu pārskati, lai uzturētu glabātavu drošu."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "ഫയൽ അറ്റാച്ചുമെന്റുകൾക്കായി 1 ജിബി എൻക്രിപ്റ്റുചെയ്ത സംഭരണം."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "രണ്ട്-ഘട്ട പ്രവേശന ഓപ്ഷനുകളായ Yubikey, FIDO U2F, Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "നിങ്ങളുടെ വാൾട് സൂക്ഷിക്കുന്നതിന്. പാസ്വേഡ് ശുചിത്വം, അക്കൗണ്ട് ആരോഗ്യം, ഡാറ്റ ലംഘന റിപ്പോർട്ടുകൾ."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB med kryptert fillagring for filvedlegg."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Ytterligere 2-trinnsinnloggingsmuligheter, slik som YubiKey, FIDO U2F, og Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Passordhygiene, kontohelse, og databruddsrapporter som holder hvelvet ditt trygt."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB versleutelde opslag voor bijlagen."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Extra opties voor tweestapsaanmelding zoals YubiKey, FIDO U2F en Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Eigen opties voor tweestapsaanmelding zoals YubiKey en Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Wachtwoordhygiëne, gezondheid van je account en datalekken om je kluis veilig te houden."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB miejsca na zaszyfrowane załączniki."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Dodatkowe opcje logowania dwustopniowego, takie jak klucze YubiKey, FIDO U2F oraz Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Własnościowe opcje logowania dwuetapowego, takie jak YubiKey i Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Raporty bezpieczeństwa haseł, stanu konta i raporty wycieków danych, aby Twoje dane były bezpieczne."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB de armazenamento de arquivos encriptados."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Opções de autenticação de duas etapas adicionais como YubiKey, FIDO U2F, e Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Higiene de senha, saúde da conta, e relatórios sobre violação de dados para manter o seu cofre seguro."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB de armazenamento encriptado para anexos de ficheiros."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Opções adicionais de verificação de dois passos, como YubiKey, FIDO U2F e Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Higiene de palavras-passe, saúde da conta e relatórios de violação de dados para manter o seu cofre seguro."
|
||||
|
||||
@@ -196,13 +196,13 @@
|
||||
"message": "Ajutor și feedback"
|
||||
},
|
||||
"helpCenter": {
|
||||
"message": "Bitwarden Help center"
|
||||
"message": "Centrul de Ajutor Bitwarden"
|
||||
},
|
||||
"communityForums": {
|
||||
"message": "Explore Bitwarden community forums"
|
||||
"message": "Explorează forumurile comunității Bitwarden"
|
||||
},
|
||||
"contactSupport": {
|
||||
"message": "Contact Bitwarden support"
|
||||
"message": "Contactați asistența Bitwarden"
|
||||
},
|
||||
"sync": {
|
||||
"message": "Sincronizare"
|
||||
@@ -442,7 +442,7 @@
|
||||
"message": "Este necesară rescrierea parolei principale."
|
||||
},
|
||||
"masterPasswordMinlength": {
|
||||
"message": "Master password must be at least $VALUE$ characters long.",
|
||||
"message": "Parola principală trebuie să aibă cel puțin $VALUE$ caractere.",
|
||||
"description": "The Master Password must be at least a specific number of characters long.",
|
||||
"placeholders": {
|
||||
"value": {
|
||||
@@ -634,10 +634,10 @@
|
||||
"message": "Actualizare"
|
||||
},
|
||||
"notificationUnlockDesc": {
|
||||
"message": "Unlock your Bitwarden vault to complete the auto-fill request."
|
||||
"message": "Deblochează seiful Bitwarden pentru a finaliza solicitarea de completare automată."
|
||||
},
|
||||
"notificationUnlock": {
|
||||
"message": "Unlock"
|
||||
"message": "Deblocare"
|
||||
},
|
||||
"enableContextMenuItem": {
|
||||
"message": "Afișați opțiunile meniului contextual"
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB spațiu de stocare criptat pentru atașamente de fișiere."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Opțiuni adiționale de conectare în două etape, cum ar fi YubiKey, FIDO U2F și Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Rapoarte privind igiena parolelor, sănătatea contului și breșele de date pentru a vă păstra seiful în siguranță."
|
||||
@@ -985,7 +985,7 @@
|
||||
"message": "Dacă se detectează un formular de autentificare, completați-l automat la încărcarea paginii web."
|
||||
},
|
||||
"experimentalFeature": {
|
||||
"message": "Compromised or untrusted websites can exploit auto-fill on page load."
|
||||
"message": "Site-urile web compromise sau nesigure pot exploata funcția de autocompletare la încărcarea paginii."
|
||||
},
|
||||
"learnMoreAboutAutofill": {
|
||||
"message": "Learn more about auto-fill"
|
||||
@@ -1468,7 +1468,7 @@
|
||||
"message": "Articolul s-a completat automat "
|
||||
},
|
||||
"insecurePageWarning": {
|
||||
"message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page."
|
||||
"message": "Avertisment: Aceasta este o pagină HTTP nesecurizată și orice informație pe care o trimiteți poate fi văzută și modificată de alte persoane. Această Parolă a fost salvată inițial pe o pagină securizată (HTTPS)."
|
||||
},
|
||||
"insecurePageWarningFillPrompt": {
|
||||
"message": "Do you still wish to fill this login?"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 ГБ зашифрованного хранилища для вложенных файлов."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Дополнительные варианты двухэтапной аутентификации, такие как YubiKey, FIDO U2F и Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Проприетарные варианты двухэтапной аутентификации, такие как YubiKey или Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Гигиена паролей, здоровье аккаунта и отчеты об утечках данных для обеспечения безопасности вашего хранилища."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "ගොනු ඇමුණුම් සඳහා 1 GB සංකේතාත්මක ගබඩා."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "එවැනි YuBiKey, FIDO U2F, සහ Duo ලෙස අතිරේක පියවර දෙකක් පිවිසුම් විකල්ප."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "ඔබගේ සුරක්ෂිතාගාරය ආරක්ෂිතව තබා ගැනීම සඳහා මුරපදය සනීපාරක්ෂාව, ගිණුම් සෞඛ්යය සහ දත්ත උල්ලං ach නය වාර්තා කරයි."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB šifrovaného úložiska."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Ďalšie možnosti dvojstupňového prihlásenia ako YubiKey, FIDO U2F a Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Správy o sile hesla, zabezpečení účtov a únikoch dát ktoré vám pomôžu udržať vaše kontá v bezpečí."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB šifriranega prostora za shrambo podatkov."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Dodatne možnosti za prijavo v dveh korakih, n.pr. YubiKey, FIDO U2F in Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Higiena gesel, zdravje računa in poročila o kraji podatkov, ki vam pomagajo ohraniti varnost vašega trezorja."
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
"message": "Остало"
|
||||
},
|
||||
"unlockMethodNeededToChangeTimeoutActionDesc": {
|
||||
"message": "Set up an unlock method to change your vault timeout action."
|
||||
"message": "Подесите метод откључавања да бисте променили радњу временског ограничења сефа."
|
||||
},
|
||||
"rateExtension": {
|
||||
"message": "Оцени овај додатак"
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1ГБ шифровано складиште за прилоге."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Додатне опције пријаве у два корака као што су YubiKey, FIDO U2F, и Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Извештаји о хигијени лозинки, здравственом стању налога и кршењу података да бисте заштитили сеф."
|
||||
@@ -1606,10 +1606,10 @@
|
||||
"message": "Биометрија прегледача није подржана на овом уређају."
|
||||
},
|
||||
"biometricsFailedTitle": {
|
||||
"message": "Biometrics failed"
|
||||
"message": "Биометрија није успела"
|
||||
},
|
||||
"biometricsFailedDesc": {
|
||||
"message": "Biometrics cannot be completed, consider using a master password or logging out. If this persists, please contact Bitwarden support."
|
||||
"message": "Биометрија се не може завршити, размислите о коришћењу главне лозинке или одјавите се. Ако се ово настави, контактирајте подршку Bitwarden-а."
|
||||
},
|
||||
"nativeMessaginPermissionErrorTitle": {
|
||||
"message": "Дозвола није дата"
|
||||
@@ -2153,7 +2153,7 @@
|
||||
"message": "Обавештење је послато на ваш уређај."
|
||||
},
|
||||
"loginInitiated": {
|
||||
"message": "Login initiated"
|
||||
"message": "Пријава је покренута"
|
||||
},
|
||||
"exposedMasterPassword": {
|
||||
"message": "Изложена главна лозинка"
|
||||
@@ -2240,25 +2240,25 @@
|
||||
"message": "Отвара се у новом прозору"
|
||||
},
|
||||
"deviceApprovalRequired": {
|
||||
"message": "Device approval required. Select an approval option below:"
|
||||
"message": "Потребно је одобрење уређаја. Изаберите опцију одобрења испод:"
|
||||
},
|
||||
"rememberThisDevice": {
|
||||
"message": "Remember this device"
|
||||
"message": "Запамти овај уређај"
|
||||
},
|
||||
"uncheckIfPublicDevice": {
|
||||
"message": "Uncheck if using a public device"
|
||||
"message": "Искључите ако се користи јавни уређај"
|
||||
},
|
||||
"approveFromYourOtherDevice": {
|
||||
"message": "Approve from your other device"
|
||||
"message": "Одобри са мојим другим уређајем"
|
||||
},
|
||||
"requestAdminApproval": {
|
||||
"message": "Request admin approval"
|
||||
"message": "Затражити одобрење администратора"
|
||||
},
|
||||
"approveWithMasterPassword": {
|
||||
"message": "Approve with master password"
|
||||
"message": "Одобрити са главном лозинком"
|
||||
},
|
||||
"ssoIdentifierRequired": {
|
||||
"message": "Organization SSO identifier is required."
|
||||
"message": "Потребан је SSO идентификатор организације."
|
||||
},
|
||||
"eu": {
|
||||
"message": "EU",
|
||||
@@ -2280,40 +2280,40 @@
|
||||
"message": "Приказ"
|
||||
},
|
||||
"accountSuccessfullyCreated": {
|
||||
"message": "Account successfully created!"
|
||||
"message": "Налог је успешно креиран!"
|
||||
},
|
||||
"adminApprovalRequested": {
|
||||
"message": "Admin approval requested"
|
||||
"message": "Захтевано је одобрење администратора"
|
||||
},
|
||||
"adminApprovalRequestSentToAdmins": {
|
||||
"message": "Your request has been sent to your admin."
|
||||
"message": "Ваш захтев је послат вашем администратору."
|
||||
},
|
||||
"youWillBeNotifiedOnceApproved": {
|
||||
"message": "You will be notified once approved."
|
||||
"message": "Бићете обавештени када буде одобрено."
|
||||
},
|
||||
"troubleLoggingIn": {
|
||||
"message": "Trouble logging in?"
|
||||
"message": "Имате проблема са пријављивањем?"
|
||||
},
|
||||
"loginApproved": {
|
||||
"message": "Login approved"
|
||||
"message": "Пријава је одобрена"
|
||||
},
|
||||
"userEmailMissing": {
|
||||
"message": "User email missing"
|
||||
"message": "Недостаје имејл корисника"
|
||||
},
|
||||
"deviceTrusted": {
|
||||
"message": "Device trusted"
|
||||
"message": "Уређај поуздан"
|
||||
},
|
||||
"inputRequired": {
|
||||
"message": "Input is required."
|
||||
"message": "Унос је потребан."
|
||||
},
|
||||
"required": {
|
||||
"message": "required"
|
||||
"message": "обавезно"
|
||||
},
|
||||
"search": {
|
||||
"message": "Search"
|
||||
"message": "Тражи"
|
||||
},
|
||||
"inputMinLength": {
|
||||
"message": "Input must be at least $COUNT$ characters long.",
|
||||
"message": "Унос трба имати најмање $COUNT$ слова.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -2322,7 +2322,7 @@
|
||||
}
|
||||
},
|
||||
"inputMaxLength": {
|
||||
"message": "Input must not exceed $COUNT$ characters in length.",
|
||||
"message": "Унос не сме бити већи од $COUNT$ карактера.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -2331,7 +2331,7 @@
|
||||
}
|
||||
},
|
||||
"inputForbiddenCharacters": {
|
||||
"message": "The following characters are not allowed: $CHARACTERS$",
|
||||
"message": "Следећи знакови нису дозвољени: $CHARACTERS$",
|
||||
"placeholders": {
|
||||
"characters": {
|
||||
"content": "$1",
|
||||
@@ -2340,7 +2340,7 @@
|
||||
}
|
||||
},
|
||||
"inputMinValue": {
|
||||
"message": "Input value must be at least $MIN$.",
|
||||
"message": "Вредност мора бити најмање $MIN$.",
|
||||
"placeholders": {
|
||||
"min": {
|
||||
"content": "$1",
|
||||
@@ -2349,7 +2349,7 @@
|
||||
}
|
||||
},
|
||||
"inputMaxValue": {
|
||||
"message": "Input value must not exceed $MAX$.",
|
||||
"message": "Вредност не сме бити већа од $MAX$.",
|
||||
"placeholders": {
|
||||
"max": {
|
||||
"content": "$1",
|
||||
@@ -2358,17 +2358,17 @@
|
||||
}
|
||||
},
|
||||
"multipleInputEmails": {
|
||||
"message": "1 or more emails are invalid"
|
||||
"message": "1 или више имејлова су неважећи"
|
||||
},
|
||||
"inputTrimValidator": {
|
||||
"message": "Input must not contain only whitespace.",
|
||||
"message": "Унос не сме да садржи само размак.",
|
||||
"description": "Notification to inform the user that a form's input can't contain only whitespace."
|
||||
},
|
||||
"inputEmail": {
|
||||
"message": "Input is not an email address."
|
||||
"message": "Унос није имејл."
|
||||
},
|
||||
"fieldsNeedAttention": {
|
||||
"message": "$COUNT$ field(s) above need your attention.",
|
||||
"message": "$COUNT$ поље(а) изнад захтевај(у) вашу пажњу.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -2377,22 +2377,22 @@
|
||||
}
|
||||
},
|
||||
"selectPlaceholder": {
|
||||
"message": "-- Select --"
|
||||
"message": "-- Одабрати --"
|
||||
},
|
||||
"multiSelectPlaceholder": {
|
||||
"message": "-- Type to filter --"
|
||||
"message": "-- Тип за филтрирање --"
|
||||
},
|
||||
"multiSelectLoading": {
|
||||
"message": "Retrieving options..."
|
||||
"message": "Преузимање опција..."
|
||||
},
|
||||
"multiSelectNotFound": {
|
||||
"message": "No items found"
|
||||
"message": "Нема предмета"
|
||||
},
|
||||
"multiSelectClearAll": {
|
||||
"message": "Clear all"
|
||||
"message": "Обриши све"
|
||||
},
|
||||
"plusNMore": {
|
||||
"message": "+ $QUANTITY$ more",
|
||||
"message": "+ још $QUANTITY$",
|
||||
"placeholders": {
|
||||
"quantity": {
|
||||
"content": "$1",
|
||||
@@ -2401,10 +2401,10 @@
|
||||
}
|
||||
},
|
||||
"submenu": {
|
||||
"message": "Submenu"
|
||||
"message": "Под-мени"
|
||||
},
|
||||
"toggleCollapse": {
|
||||
"message": "Toggle collapse",
|
||||
"message": "Промени проширење",
|
||||
"description": "Toggling an expand/collapse state."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB lagring av krypterade filer."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Ytterligare alternativ för tvåstegsverifiering såsom YubiKey, FIDO U2F och Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Lösenordshygien, kontohälsa och dataintrångsrapporter för att hålla ditt valv säkert."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB encrypted storage for file attachments."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Password hygiene, account health, and data breach reports to keep your vault safe."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB of encrypted file storage."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "ตัวเลือกการเข้าสู่ระบบแบบสองขั้นตอนเพิ่มเติม เช่น YubiKey, FIDO U2F และ Duo"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "สุขอนามัยของรหัสผ่าน ความสมบูรณ์ของบัญชี และรายงานการละเมิดข้อมูลเพื่อให้ตู้นิรภัยของคุณปลอดภัย"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "Dosya ekleri için 1 GB şifrelenmiş depolama."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey, FIDO U2F ve Duo gibi iki aşamalı giriş seçenekleri."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "YubiKey ve Duo gibi marka bazlı iki aşamalı giriş seçenekleri."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Kasanızı güvende tutmak için parola hijyeni, hesap sağlığı ve veri ihlali raporları."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 ГБ зашифрованого сховища для файлів."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Додаткові можливості двоетапної перевірки, наприклад, YubiKey, FIDO U2F та Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Гігієна паролів, здоров'я облікового запису, а також звіти про вразливості даних, щоб зберігати ваше сховище в безпеці."
|
||||
@@ -2304,16 +2304,16 @@
|
||||
"message": "Довірений пристрій"
|
||||
},
|
||||
"inputRequired": {
|
||||
"message": "Input is required."
|
||||
"message": "Необхідно ввести дані."
|
||||
},
|
||||
"required": {
|
||||
"message": "required"
|
||||
"message": "обов'язково"
|
||||
},
|
||||
"search": {
|
||||
"message": "Search"
|
||||
"message": "Пошук"
|
||||
},
|
||||
"inputMinLength": {
|
||||
"message": "Input must be at least $COUNT$ characters long.",
|
||||
"message": "Введені дані мають бути довжиною принаймні $COUNT$ символів.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -2322,7 +2322,7 @@
|
||||
}
|
||||
},
|
||||
"inputMaxLength": {
|
||||
"message": "Input must not exceed $COUNT$ characters in length.",
|
||||
"message": "Вхідне значення не повинно перевищувати $COUNT$ символів.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -2331,7 +2331,7 @@
|
||||
}
|
||||
},
|
||||
"inputForbiddenCharacters": {
|
||||
"message": "The following characters are not allowed: $CHARACTERS$",
|
||||
"message": "Вказані символи заборонені: $CHARACTERS$",
|
||||
"placeholders": {
|
||||
"characters": {
|
||||
"content": "$1",
|
||||
@@ -2340,7 +2340,7 @@
|
||||
}
|
||||
},
|
||||
"inputMinValue": {
|
||||
"message": "Input value must be at least $MIN$.",
|
||||
"message": "Значення має бути принаймні $MIN$.",
|
||||
"placeholders": {
|
||||
"min": {
|
||||
"content": "$1",
|
||||
@@ -2349,7 +2349,7 @@
|
||||
}
|
||||
},
|
||||
"inputMaxValue": {
|
||||
"message": "Input value must not exceed $MAX$.",
|
||||
"message": "Значення не може перевищувати $MAX$.",
|
||||
"placeholders": {
|
||||
"max": {
|
||||
"content": "$1",
|
||||
@@ -2358,17 +2358,17 @@
|
||||
}
|
||||
},
|
||||
"multipleInputEmails": {
|
||||
"message": "1 or more emails are invalid"
|
||||
"message": "1 або більше адрес е-пошти недійсні"
|
||||
},
|
||||
"inputTrimValidator": {
|
||||
"message": "Input must not contain only whitespace.",
|
||||
"message": "Введене значення не повинно містити лише пробіл.",
|
||||
"description": "Notification to inform the user that a form's input can't contain only whitespace."
|
||||
},
|
||||
"inputEmail": {
|
||||
"message": "Input is not an email address."
|
||||
"message": "Введені дані не є адресою е-пошти."
|
||||
},
|
||||
"fieldsNeedAttention": {
|
||||
"message": "$COUNT$ field(s) above need your attention.",
|
||||
"message": "$COUNT$ поле (поля) вище потребують вашої уваги.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1",
|
||||
@@ -2377,22 +2377,22 @@
|
||||
}
|
||||
},
|
||||
"selectPlaceholder": {
|
||||
"message": "-- Select --"
|
||||
"message": "-- Оберіть--"
|
||||
},
|
||||
"multiSelectPlaceholder": {
|
||||
"message": "-- Type to filter --"
|
||||
"message": "-- Введіть для фільтрування --"
|
||||
},
|
||||
"multiSelectLoading": {
|
||||
"message": "Retrieving options..."
|
||||
"message": "Параметри отримання..."
|
||||
},
|
||||
"multiSelectNotFound": {
|
||||
"message": "No items found"
|
||||
"message": "Нічого не знайдено"
|
||||
},
|
||||
"multiSelectClearAll": {
|
||||
"message": "Clear all"
|
||||
"message": "Очистити все"
|
||||
},
|
||||
"plusNMore": {
|
||||
"message": "+ $QUANTITY$ more",
|
||||
"message": "+ ще $QUANTITY$",
|
||||
"placeholders": {
|
||||
"quantity": {
|
||||
"content": "$1",
|
||||
@@ -2401,10 +2401,10 @@
|
||||
}
|
||||
},
|
||||
"submenu": {
|
||||
"message": "Submenu"
|
||||
"message": "Підменю"
|
||||
},
|
||||
"toggleCollapse": {
|
||||
"message": "Toggle collapse",
|
||||
"message": "Згорнути/розгорнути",
|
||||
"description": "Toggling an expand/collapse state."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1GB bộ nhớ lưu trữ tập tin được mã hóa."
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "Tuỳ chọn đăng nhập 2 bước bổ sung như YubiKey, FIDO U2F, và Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "Thanh lọc mật khẩu, kiểm tra an toàn tài khoản và các báo cáo rò rĩ dữ liệu là để giữ cho kho của bạn an toàn."
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "1 GB 文件附件加密存储。"
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "额外的两步登录选项,如 YubiKey、FIDO U2F 和 Duo。"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "密码健康、账户体检以及数据泄露报告,保障您的密码库安全。"
|
||||
|
||||
@@ -795,8 +795,8 @@
|
||||
"ppremiumSignUpStorage": {
|
||||
"message": "用於檔案附件的 1 GB 加密儲存空間。"
|
||||
},
|
||||
"ppremiumSignUpTwoStep": {
|
||||
"message": "YubiKey、FIDO U2F 和 Duo 等額外的兩步驟登入選項。"
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"ppremiumSignUpReports": {
|
||||
"message": "密碼健康度檢查、提供帳戶體檢以及資料外洩報告,以保障您的密碼庫安全。"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { mock, MockProxy } from "jest-mock-extended";
|
||||
|
||||
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";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
|
||||
@@ -14,7 +13,6 @@ describe("CipherContextMenuHandler", () => {
|
||||
let mainContextMenuHandler: MockProxy<MainContextMenuHandler>;
|
||||
let authService: MockProxy<AuthService>;
|
||||
let cipherService: MockProxy<CipherService>;
|
||||
let userVerificationService: MockProxy<UserVerificationService>;
|
||||
|
||||
let sut: CipherContextMenuHandler;
|
||||
|
||||
@@ -22,17 +20,10 @@ describe("CipherContextMenuHandler", () => {
|
||||
mainContextMenuHandler = mock();
|
||||
authService = mock();
|
||||
cipherService = mock();
|
||||
userVerificationService = mock();
|
||||
userVerificationService.hasMasterPassword.mockResolvedValue(true);
|
||||
|
||||
jest.spyOn(MainContextMenuHandler, "removeAll").mockResolvedValue();
|
||||
|
||||
sut = new CipherContextMenuHandler(
|
||||
mainContextMenuHandler,
|
||||
authService,
|
||||
cipherService,
|
||||
userVerificationService
|
||||
);
|
||||
sut = new CipherContextMenuHandler(mainContextMenuHandler, authService, cipherService);
|
||||
});
|
||||
|
||||
afterEach(() => jest.resetAllMocks());
|
||||
@@ -78,7 +69,7 @@ describe("CipherContextMenuHandler", () => {
|
||||
expect(mainContextMenuHandler.noLogins).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it("only adds valid ciphers", async () => {
|
||||
it("only adds login ciphers including ciphers that require reprompt", async () => {
|
||||
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
|
||||
|
||||
mainContextMenuHandler.init.mockResolvedValue(true);
|
||||
@@ -90,47 +81,6 @@ describe("CipherContextMenuHandler", () => {
|
||||
name: "Test Cipher",
|
||||
login: { username: "Test Username" },
|
||||
};
|
||||
|
||||
cipherService.getAllDecryptedForUrl.mockResolvedValue([
|
||||
null, // invalid cipher
|
||||
undefined, // invalid cipher
|
||||
{ type: CipherType.Card }, // invalid cipher
|
||||
{ type: CipherType.Login, reprompt: CipherRepromptType.Password }, // invalid cipher
|
||||
realCipher, // valid cipher
|
||||
] as any[]);
|
||||
|
||||
await sut.update("https://test.com");
|
||||
|
||||
expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1);
|
||||
|
||||
expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com");
|
||||
|
||||
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(2);
|
||||
|
||||
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith(
|
||||
"Test Cipher (Test Username)",
|
||||
"5",
|
||||
"https://test.com",
|
||||
realCipher
|
||||
);
|
||||
});
|
||||
|
||||
it("adds ciphers with master password reprompt if the user does not have a master password", async () => {
|
||||
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
|
||||
|
||||
// User does not have a master password, or has one but hasn't logged in with it (key connector user or TDE user)
|
||||
userVerificationService.hasMasterPasswordAndMasterKeyHash.mockResolvedValue(false);
|
||||
|
||||
mainContextMenuHandler.init.mockResolvedValue(true);
|
||||
|
||||
const realCipher = {
|
||||
id: "5",
|
||||
type: CipherType.Login,
|
||||
reprompt: CipherRepromptType.None,
|
||||
name: "Test Cipher",
|
||||
login: { username: "Test Username" },
|
||||
};
|
||||
|
||||
const repromptCipher = {
|
||||
id: "6",
|
||||
type: CipherType.Login,
|
||||
@@ -143,8 +93,8 @@ describe("CipherContextMenuHandler", () => {
|
||||
null, // invalid cipher
|
||||
undefined, // invalid cipher
|
||||
{ type: CipherType.Card }, // invalid cipher
|
||||
repromptCipher, // valid cipher
|
||||
realCipher, // valid cipher
|
||||
repromptCipher,
|
||||
] as any[]);
|
||||
|
||||
await sut.update("https://test.com");
|
||||
@@ -153,7 +103,6 @@ describe("CipherContextMenuHandler", () => {
|
||||
|
||||
expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com");
|
||||
|
||||
// Should call this twice, once for each valid cipher
|
||||
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(2);
|
||||
|
||||
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith(
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
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";
|
||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||
@@ -12,7 +11,6 @@ import {
|
||||
authServiceFactory,
|
||||
AuthServiceInitOptions,
|
||||
} from "../../auth/background/service-factories/auth-service.factory";
|
||||
import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory";
|
||||
import { Account } from "../../models/account";
|
||||
import { CachedServices } from "../../platform/background/service-factories/factory-options";
|
||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||
@@ -39,8 +37,7 @@ export class CipherContextMenuHandler {
|
||||
constructor(
|
||||
private mainContextMenuHandler: MainContextMenuHandler,
|
||||
private authService: AuthService,
|
||||
private cipherService: CipherService,
|
||||
private userVerificationService: UserVerificationService
|
||||
private cipherService: CipherService
|
||||
) {}
|
||||
|
||||
static async create(cachedServices: CachedServices) {
|
||||
@@ -69,9 +66,6 @@ export class CipherContextMenuHandler {
|
||||
clipboardWriteCallback: NOT_IMPLEMENTED,
|
||||
win: self,
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
stateServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
@@ -79,8 +73,7 @@ export class CipherContextMenuHandler {
|
||||
return new CipherContextMenuHandler(
|
||||
await MainContextMenuHandler.mv3Create(cachedServices),
|
||||
await authServiceFactory(cachedServices, serviceOptions),
|
||||
await cipherServiceFactory(cachedServices, serviceOptions),
|
||||
await userVerificationServiceFactory(cachedServices, serviceOptions)
|
||||
await cipherServiceFactory(cachedServices, serviceOptions)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -180,11 +173,7 @@ export class CipherContextMenuHandler {
|
||||
}
|
||||
|
||||
private async updateForCipher(url: string, cipher: CipherView) {
|
||||
if (
|
||||
cipher == null ||
|
||||
cipher.type !== CipherType.Login ||
|
||||
(await this.userVerificationService.hasMasterPasswordAndMasterKeyHash())
|
||||
) {
|
||||
if (cipher == null || cipher.type !== CipherType.Login) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import { mock, MockProxy } from "jest-mock-extended";
|
||||
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
|
||||
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
|
||||
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
|
||||
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
|
||||
import { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
|
||||
@@ -63,6 +64,7 @@ describe("ContextMenuClickedHandler", () => {
|
||||
let cipherService: MockProxy<CipherService>;
|
||||
let totpService: MockProxy<TotpService>;
|
||||
let eventCollectionService: MockProxy<EventCollectionService>;
|
||||
let userVerificationService: MockProxy<UserVerificationService>;
|
||||
|
||||
let sut: ContextMenuClickedHandler;
|
||||
|
||||
@@ -82,7 +84,8 @@ describe("ContextMenuClickedHandler", () => {
|
||||
authService,
|
||||
cipherService,
|
||||
totpService,
|
||||
eventCollectionService
|
||||
eventCollectionService,
|
||||
userVerificationService
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
|
||||
import { TotpService } from "@bitwarden/common/abstractions/totp.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";
|
||||
import { EventType } from "@bitwarden/common/enums";
|
||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
||||
@@ -14,6 +15,7 @@ import {
|
||||
AuthServiceInitOptions,
|
||||
} from "../../auth/background/service-factories/auth-service.factory";
|
||||
import { totpServiceFactory } from "../../auth/background/service-factories/totp-service.factory";
|
||||
import { userVerificationServiceFactory } from "../../auth/background/service-factories/user-verification-service.factory";
|
||||
import LockedVaultPendingNotificationsItem from "../../background/models/lockedVaultPendingNotificationsItem";
|
||||
import { eventCollectionServiceFactory } from "../../background/service-factories/event-collection-service.factory";
|
||||
import { Account } from "../../models/account";
|
||||
@@ -56,7 +58,8 @@ export class ContextMenuClickedHandler {
|
||||
private authService: AuthService,
|
||||
private cipherService: CipherService,
|
||||
private totpService: TotpService,
|
||||
private eventCollectionService: EventCollectionService
|
||||
private eventCollectionService: EventCollectionService,
|
||||
private userVerificationService: UserVerificationService
|
||||
) {}
|
||||
|
||||
static async mv3Create(cachedServices: CachedServices) {
|
||||
@@ -85,9 +88,6 @@ export class ContextMenuClickedHandler {
|
||||
clipboardWriteCallback: NOT_IMPLEMENTED,
|
||||
win: self,
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
stateServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
@@ -109,7 +109,8 @@ export class ContextMenuClickedHandler {
|
||||
await authServiceFactory(cachedServices, serviceOptions),
|
||||
await cipherServiceFactory(cachedServices, serviceOptions),
|
||||
await totpServiceFactory(cachedServices, serviceOptions),
|
||||
await eventCollectionServiceFactory(cachedServices, serviceOptions)
|
||||
await eventCollectionServiceFactory(cachedServices, serviceOptions),
|
||||
await userVerificationServiceFactory(cachedServices, serviceOptions)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -204,7 +205,7 @@ export class ContextMenuClickedHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cipher.reprompt !== CipherRepromptType.None) {
|
||||
if (await this.isPasswordRepromptRequired(cipher)) {
|
||||
await BrowserApi.tabSendMessageData(tab, "passwordReprompt", {
|
||||
cipherId: cipher.id,
|
||||
action: AUTOFILL_ID,
|
||||
@@ -218,7 +219,7 @@ export class ContextMenuClickedHandler {
|
||||
this.copyToClipboard({ text: cipher.login.username, tab: tab });
|
||||
break;
|
||||
case COPY_PASSWORD_ID:
|
||||
if (cipher.reprompt !== CipherRepromptType.None) {
|
||||
if (await this.isPasswordRepromptRequired(cipher)) {
|
||||
await BrowserApi.tabSendMessageData(tab, "passwordReprompt", {
|
||||
cipherId: cipher.id,
|
||||
action: COPY_PASSWORD_ID,
|
||||
@@ -230,7 +231,7 @@ export class ContextMenuClickedHandler {
|
||||
|
||||
break;
|
||||
case COPY_VERIFICATIONCODE_ID:
|
||||
if (cipher.reprompt !== CipherRepromptType.None) {
|
||||
if (await this.isPasswordRepromptRequired(cipher)) {
|
||||
await BrowserApi.tabSendMessageData(tab, "passwordReprompt", {
|
||||
cipherId: cipher.id,
|
||||
action: COPY_VERIFICATIONCODE_ID,
|
||||
@@ -246,6 +247,13 @@ export class ContextMenuClickedHandler {
|
||||
}
|
||||
}
|
||||
|
||||
private async isPasswordRepromptRequired(cipher: CipherView): Promise<boolean> {
|
||||
return (
|
||||
cipher.reprompt === CipherRepromptType.Password &&
|
||||
(await this.userVerificationService.hasMasterPasswordAndMasterKeyHash())
|
||||
);
|
||||
}
|
||||
|
||||
private async getIdentifier(tab: chrome.tabs.Tab, info: chrome.contextMenus.OnClickData) {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
BrowserApi.sendTabsMessage(
|
||||
|
||||
@@ -79,9 +79,6 @@ export class MainContextMenuHandler {
|
||||
logServiceOptions: {
|
||||
isDev: false,
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
stateServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
|
||||
@@ -769,7 +769,15 @@
|
||||
// Detect if within an iframe, and the iframe is sandboxed
|
||||
function isSandboxed() {
|
||||
// self.origin is 'null' if inside a frame with sandboxed csp or iframe tag
|
||||
return self.origin == null || self.origin === 'null';
|
||||
if (String(self.origin).toLowerCase() === "null") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (window.frameElement?.hasAttribute("sandbox")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return location.hostname === "";
|
||||
}
|
||||
|
||||
function doFill(fillScript) {
|
||||
|
||||
@@ -849,7 +849,15 @@ function fill(document: Document, fillScript: AutofillScript) {
|
||||
// Detect if within an iframe, and the iframe is sandboxed
|
||||
function isSandboxed() {
|
||||
// self.origin is 'null' if inside a frame with sandboxed csp or iframe tag
|
||||
return self.origin == null || self.origin === "null";
|
||||
if (String(self.origin).toLowerCase() === "null") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (window.frameElement?.hasAttribute("sandbox")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return location.hostname === "";
|
||||
}
|
||||
|
||||
function doFill(fillScript: AutofillScript) {
|
||||
|
||||
@@ -59,7 +59,6 @@ import { EncryptServiceImplementation } from "@bitwarden/common/platform/service
|
||||
import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/platform/services/cryptography/multithread-encrypt.service.implementation";
|
||||
import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service";
|
||||
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
|
||||
import { StateMigrationService } from "@bitwarden/common/platform/services/state-migration.service";
|
||||
import { SystemService } from "@bitwarden/common/platform/services/system.service";
|
||||
import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service";
|
||||
import { AvatarUpdateService } from "@bitwarden/common/services/account/avatar-update.service";
|
||||
@@ -177,7 +176,6 @@ export default class MainBackground {
|
||||
searchService: SearchServiceAbstraction;
|
||||
notificationsService: NotificationsServiceAbstraction;
|
||||
stateService: StateServiceAbstraction;
|
||||
stateMigrationService: StateMigrationService;
|
||||
systemService: SystemServiceAbstraction;
|
||||
eventCollectionService: EventCollectionServiceAbstraction;
|
||||
eventUploadService: EventUploadServiceAbstraction;
|
||||
@@ -262,17 +260,11 @@ export default class MainBackground {
|
||||
new KeyGenerationService(this.cryptoFunctionService)
|
||||
)
|
||||
: new MemoryStorageService();
|
||||
this.stateMigrationService = new StateMigrationService(
|
||||
this.storageService,
|
||||
this.secureStorageService,
|
||||
new StateFactory(GlobalState, Account)
|
||||
);
|
||||
this.stateService = new BrowserStateService(
|
||||
this.storageService,
|
||||
this.secureStorageService,
|
||||
this.memoryStorageService,
|
||||
this.logService,
|
||||
this.stateMigrationService,
|
||||
new StateFactory(GlobalState, Account)
|
||||
);
|
||||
this.platformUtilsService = new BrowserPlatformUtilsService(
|
||||
@@ -635,7 +627,8 @@ export default class MainBackground {
|
||||
this.authService,
|
||||
this.cipherService,
|
||||
this.totpService,
|
||||
this.eventCollectionService
|
||||
this.eventCollectionService,
|
||||
this.userVerificationService
|
||||
);
|
||||
|
||||
this.contextMenusBackground = new ContextMenusBackground(contextMenuClickedHandler);
|
||||
@@ -670,8 +663,7 @@ export default class MainBackground {
|
||||
this.cipherContextMenuHandler = new CipherContextMenuHandler(
|
||||
this.mainContextMenuHandler,
|
||||
this.authService,
|
||||
this.cipherService,
|
||||
this.userVerificationService
|
||||
this.cipherService
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
||||
import { StateMigrationService } from "@bitwarden/common/platform/services/state-migration.service";
|
||||
|
||||
import { Account } from "../../../models/account";
|
||||
|
||||
import { CachedServices, factory, FactoryOptions } from "./factory-options";
|
||||
import {
|
||||
diskStorageServiceFactory,
|
||||
DiskStorageServiceInitOptions,
|
||||
secureStorageServiceFactory,
|
||||
SecureStorageServiceInitOptions,
|
||||
} from "./storage-service.factory";
|
||||
|
||||
type StateMigrationServiceFactoryOptions = FactoryOptions & {
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: StateFactory<GlobalState, Account>;
|
||||
};
|
||||
};
|
||||
|
||||
export type StateMigrationServiceInitOptions = StateMigrationServiceFactoryOptions &
|
||||
DiskStorageServiceInitOptions &
|
||||
SecureStorageServiceInitOptions;
|
||||
|
||||
export function stateMigrationServiceFactory(
|
||||
cache: { stateMigrationService?: StateMigrationService } & CachedServices,
|
||||
opts: StateMigrationServiceInitOptions
|
||||
): Promise<StateMigrationService> {
|
||||
return factory(
|
||||
cache,
|
||||
"stateMigrationService",
|
||||
opts,
|
||||
async () =>
|
||||
new StateMigrationService(
|
||||
await diskStorageServiceFactory(cache, opts),
|
||||
await secureStorageServiceFactory(cache, opts),
|
||||
opts.stateMigrationServiceOptions.stateFactory
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -6,10 +6,6 @@ import { BrowserStateService } from "../../services/browser-state.service";
|
||||
|
||||
import { CachedServices, factory, FactoryOptions } from "./factory-options";
|
||||
import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory";
|
||||
import {
|
||||
stateMigrationServiceFactory,
|
||||
StateMigrationServiceInitOptions,
|
||||
} from "./state-migration-service.factory";
|
||||
import {
|
||||
diskStorageServiceFactory,
|
||||
secureStorageServiceFactory,
|
||||
@@ -30,8 +26,7 @@ export type StateServiceInitOptions = StateServiceFactoryOptions &
|
||||
DiskStorageServiceInitOptions &
|
||||
SecureStorageServiceInitOptions &
|
||||
MemoryStorageServiceInitOptions &
|
||||
LogServiceInitOptions &
|
||||
StateMigrationServiceInitOptions;
|
||||
LogServiceInitOptions;
|
||||
|
||||
export async function stateServiceFactory(
|
||||
cache: { stateService?: BrowserStateService } & CachedServices,
|
||||
@@ -47,7 +42,6 @@ export async function stateServiceFactory(
|
||||
await secureStorageServiceFactory(cache, opts),
|
||||
await memoryStorageServiceFactory(cache, opts),
|
||||
await logServiceFactory(cache, opts),
|
||||
await stateMigrationServiceFactory(cache, opts),
|
||||
opts.stateServiceOptions.stateFactory,
|
||||
opts.stateServiceOptions.useAccountCache
|
||||
)
|
||||
|
||||
@@ -47,9 +47,6 @@ const doAutoFillLogin = async (tab: chrome.tabs.Tab): Promise<void> => {
|
||||
stateServiceOptions: {
|
||||
stateFactory: new StateFactory(GlobalState, Account),
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: new StateFactory(GlobalState, Account),
|
||||
},
|
||||
apiServiceOptions: {
|
||||
logoutCallback: () => Promise.resolve(),
|
||||
},
|
||||
@@ -94,9 +91,6 @@ const doGeneratePasswordToClipboard = async (tab: chrome.tabs.Tab): Promise<void
|
||||
clipboardWriteCallback: () => Promise.resolve(),
|
||||
win: self,
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
stateServiceOptions: {
|
||||
stateFactory: stateFactory,
|
||||
},
|
||||
|
||||
@@ -23,9 +23,6 @@ export async function onInstallListener(details: chrome.runtime.InstalledDetails
|
||||
stateServiceOptions: {
|
||||
stateFactory: new StateFactory(GlobalState, Account),
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: new StateFactory(GlobalState, Account),
|
||||
},
|
||||
};
|
||||
const environmentService = await environmentServiceFactory(cache, opts);
|
||||
|
||||
|
||||
@@ -272,9 +272,6 @@ export class UpdateBadge {
|
||||
stateServiceOptions: {
|
||||
stateFactory: new StateFactory(GlobalState, Account),
|
||||
},
|
||||
stateMigrationServiceOptions: {
|
||||
stateFactory: new StateFactory(GlobalState, Account),
|
||||
},
|
||||
apiServiceOptions: {
|
||||
logoutCallback: () => Promise.reject("not implemented"),
|
||||
},
|
||||
|
||||
@@ -12,7 +12,6 @@ class BrowserPopoutWindowService implements BrowserPopupWindowServiceInterface {
|
||||
};
|
||||
|
||||
async openUnlockPrompt(senderWindowId: number) {
|
||||
await this.closeUnlockPrompt();
|
||||
await this.openSingleActionPopout(
|
||||
senderWindowId,
|
||||
"popup/index.html?uilocation=popout",
|
||||
@@ -36,8 +35,6 @@ class BrowserPopoutWindowService implements BrowserPopupWindowServiceInterface {
|
||||
action: string;
|
||||
}
|
||||
) {
|
||||
await this.closePasswordRepromptPrompt();
|
||||
|
||||
const promptWindowPath =
|
||||
"popup/index.html#/view-cipher" +
|
||||
"?uilocation=popout" +
|
||||
@@ -73,18 +70,16 @@ class BrowserPopoutWindowService implements BrowserPopupWindowServiceInterface {
|
||||
|
||||
const popupWindow = await BrowserApi.createWindow(windowOptions);
|
||||
|
||||
if (!singleActionPopoutKey) {
|
||||
return;
|
||||
}
|
||||
await this.closeSingleActionPopout(singleActionPopoutKey);
|
||||
this.singleActionPopoutTabIds[singleActionPopoutKey] = popupWindow?.tabs[0].id;
|
||||
}
|
||||
|
||||
private async closeSingleActionPopout(popoutKey: string) {
|
||||
const tabId = this.singleActionPopoutTabIds[popoutKey];
|
||||
if (!tabId) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tabId) {
|
||||
await BrowserApi.removeTab(tabId);
|
||||
}
|
||||
this.singleActionPopoutTabIds[popoutKey] = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import {
|
||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
||||
import { State } from "@bitwarden/common/platform/models/domain/state";
|
||||
import { StateMigrationService } from "@bitwarden/common/platform/services/state-migration.service";
|
||||
import { SendType } from "@bitwarden/common/tools/send/enums/send-type";
|
||||
import { SendView } from "@bitwarden/common/tools/send/models/view/send.view";
|
||||
|
||||
@@ -26,7 +25,6 @@ describe("Browser State Service", () => {
|
||||
let secureStorageService: MockProxy<AbstractStorageService>;
|
||||
let diskStorageService: MockProxy<AbstractStorageService>;
|
||||
let logService: MockProxy<LogService>;
|
||||
let stateMigrationService: MockProxy<StateMigrationService>;
|
||||
let stateFactory: MockProxy<StateFactory<GlobalState, Account>>;
|
||||
let useAccountCache: boolean;
|
||||
|
||||
@@ -39,7 +37,6 @@ describe("Browser State Service", () => {
|
||||
secureStorageService = mock();
|
||||
diskStorageService = mock();
|
||||
logService = mock();
|
||||
stateMigrationService = mock();
|
||||
stateFactory = mock();
|
||||
// turn off account cache for tests
|
||||
useAccountCache = false;
|
||||
@@ -64,7 +61,6 @@ describe("Browser State Service", () => {
|
||||
secureStorageService,
|
||||
memoryStorageService,
|
||||
logService,
|
||||
stateMigrationService,
|
||||
stateFactory,
|
||||
useAccountCache
|
||||
);
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { BehaviorSubject } from "rxjs";
|
||||
|
||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||
import { StateMigrationService } from "@bitwarden/common/platform/abstractions/state-migration.service";
|
||||
import {
|
||||
AbstractStorageService,
|
||||
AbstractMemoryStorageService,
|
||||
@@ -41,7 +40,6 @@ export class BrowserStateService
|
||||
secureStorageService: AbstractStorageService,
|
||||
memoryStorageService: AbstractMemoryStorageService,
|
||||
logService: LogService,
|
||||
stateMigrationService: StateMigrationService,
|
||||
stateFactory: StateFactory<GlobalState, Account>,
|
||||
useAccountCache = true
|
||||
) {
|
||||
@@ -50,7 +48,6 @@ export class BrowserStateService
|
||||
secureStorageService,
|
||||
memoryStorageService,
|
||||
logService,
|
||||
stateMigrationService,
|
||||
stateFactory,
|
||||
useAccountCache
|
||||
);
|
||||
|
||||
@@ -24,10 +24,10 @@ $gray-light: #777;
|
||||
$text-muted: $gray-light;
|
||||
|
||||
$brand-primary: #175ddc;
|
||||
$brand-danger: #dd4b39;
|
||||
$brand-success: #00a65a;
|
||||
$brand-danger: #c83522;
|
||||
$brand-success: #017e45;
|
||||
$brand-info: #555555;
|
||||
$brand-warning: #bf7e16;
|
||||
$brand-warning: #8b6609;
|
||||
$brand-primary-accent: #1252a3;
|
||||
|
||||
$background-color: #f0f0f0;
|
||||
@@ -43,6 +43,10 @@ $button-color: lighten($text-color, 40%);
|
||||
$button-color-primary: darken($brand-primary, 8%);
|
||||
$button-color-danger: darken($brand-danger, 10%);
|
||||
|
||||
$code-color: #c01176;
|
||||
$code-color-dark: #f08dc7;
|
||||
$code-color-nord: #dbb1d5;
|
||||
|
||||
$solarizedDarkBase03: #002b36;
|
||||
$solarizedDarkBase02: #073642;
|
||||
$solarizedDarkBase01: #586e75;
|
||||
@@ -122,7 +126,7 @@ $themes: (
|
||||
// light has no hover so use same color
|
||||
webkitCalendarPickerHoverFilter: invert(46%) sepia(69%) saturate(6397%) hue-rotate(211deg)
|
||||
brightness(85%) contrast(103%),
|
||||
codeColor: #e83e8c,
|
||||
codeColor: $code-color,
|
||||
),
|
||||
dark: (
|
||||
textColor: #ffffff,
|
||||
@@ -184,7 +188,7 @@ $themes: (
|
||||
hue-rotate(184deg) brightness(87%) contrast(93%),
|
||||
webkitCalendarPickerHoverFilter: brightness(0) saturate(100%) invert(100%) sepia(0%)
|
||||
saturate(0%) hue-rotate(93deg) brightness(103%) contrast(103%),
|
||||
codeColor: #e83e8c,
|
||||
codeColor: $code-color-dark,
|
||||
),
|
||||
nord: (
|
||||
textColor: $nord5,
|
||||
@@ -237,7 +241,7 @@ $themes: (
|
||||
passwordCountText: $nord5,
|
||||
calloutBorderColor: $nord0,
|
||||
calloutBackgroundColor: $nord2,
|
||||
toastTextColor: #ffffff,
|
||||
toastTextColor: #000000,
|
||||
svgSuffix: "-dark.svg",
|
||||
transparentColor: rgba(0, 0, 0, 0),
|
||||
dateInputColorScheme: dark,
|
||||
@@ -246,7 +250,7 @@ $themes: (
|
||||
// has no hover so use same color
|
||||
webkitCalendarPickerHoverFilter: brightness(0) saturate(100%) invert(94%) sepia(5%)
|
||||
saturate(454%) hue-rotate(185deg) brightness(93%) contrast(96%),
|
||||
codeColor: #e83e8c,
|
||||
codeColor: $code-color-nord,
|
||||
),
|
||||
solarizedDark: (
|
||||
textColor: $solarizedDarkBase2,
|
||||
@@ -299,7 +303,7 @@ $themes: (
|
||||
passwordCountText: $solarizedDarkBase2,
|
||||
calloutBorderColor: $solarizedDarkBase03,
|
||||
calloutBackgroundColor: $solarizedDarkBase01,
|
||||
toastTextColor: #ffffff,
|
||||
toastTextColor: #000000,
|
||||
svgSuffix: "-solarized.svg",
|
||||
transparentColor: rgba(0, 0, 0, 0),
|
||||
dateInputColorScheme: dark,
|
||||
@@ -307,7 +311,7 @@ $themes: (
|
||||
hue-rotate(138deg) brightness(92%) contrast(90%),
|
||||
webkitCalendarPickerHoverFilter: brightness(0) saturate(100%) invert(94%) sepia(10%)
|
||||
saturate(462%) hue-rotate(345deg) brightness(103%) contrast(87%),
|
||||
codeColor: #e83e8c,
|
||||
codeColor: $code-color-dark,
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platfor
|
||||
import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service";
|
||||
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
|
||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { StateMigrationService } from "@bitwarden/common/platform/abstractions/state-migration.service";
|
||||
import {
|
||||
StateService as BaseStateServiceAbstraction,
|
||||
StateService,
|
||||
@@ -442,36 +441,23 @@ function getBgService<T>(service: keyof MainBackground) {
|
||||
provide: MEMORY_STORAGE,
|
||||
useFactory: getBgService<AbstractStorageService>("memoryStorageService"),
|
||||
},
|
||||
{
|
||||
provide: StateMigrationService,
|
||||
useFactory: getBgService<StateMigrationService>("stateMigrationService"),
|
||||
deps: [],
|
||||
},
|
||||
{
|
||||
provide: StateServiceAbstraction,
|
||||
useFactory: (
|
||||
storageService: AbstractStorageService,
|
||||
secureStorageService: AbstractStorageService,
|
||||
memoryStorageService: AbstractMemoryStorageService,
|
||||
logService: LogServiceAbstraction,
|
||||
stateMigrationService: StateMigrationService
|
||||
logService: LogServiceAbstraction
|
||||
) => {
|
||||
return new BrowserStateService(
|
||||
storageService,
|
||||
secureStorageService,
|
||||
memoryStorageService,
|
||||
logService,
|
||||
stateMigrationService,
|
||||
new StateFactory(GlobalState, Account)
|
||||
);
|
||||
},
|
||||
deps: [
|
||||
AbstractStorageService,
|
||||
SECURE_STORAGE,
|
||||
MEMORY_STORAGE,
|
||||
LogServiceAbstraction,
|
||||
StateMigrationService,
|
||||
],
|
||||
deps: [AbstractStorageService, SECURE_STORAGE, MEMORY_STORAGE, LogServiceAbstraction],
|
||||
},
|
||||
{
|
||||
provide: UsernameGenerationServiceAbstraction,
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</li>
|
||||
<li>
|
||||
<i class="bwi bwi-li bwi-check text-success" aria-hidden="true"></i>
|
||||
{{ "ppremiumSignUpTwoStep" | i18n }}
|
||||
{{ "premiumSignUpTwoStepOptions" | i18n }}
|
||||
</li>
|
||||
<li>
|
||||
<i class="bwi bwi-li bwi-check text-success" aria-hidden="true"></i>
|
||||
|
||||
@@ -170,8 +170,8 @@ export class ViewComponent extends BaseViewComponent {
|
||||
|
||||
switch (this.loadAction) {
|
||||
case AUTOFILL_ID:
|
||||
this.fillCipher();
|
||||
return;
|
||||
await this.fillCipher();
|
||||
break;
|
||||
case COPY_USERNAME_ID:
|
||||
await this.copy(this.cipher.login.username, "username", "Username");
|
||||
break;
|
||||
@@ -186,7 +186,7 @@ export class ViewComponent extends BaseViewComponent {
|
||||
}
|
||||
|
||||
if (this.inPopout && this.loadAction) {
|
||||
this.close();
|
||||
setTimeout(() => this.close(), 1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,10 +238,6 @@ export class ViewComponent extends BaseViewComponent {
|
||||
const didAutofill = await this.doAutofill();
|
||||
if (didAutofill) {
|
||||
this.platformUtilsService.showToast("success", null, this.i18nService.t("autoFillSuccess"));
|
||||
|
||||
if (this.inPopout) {
|
||||
this.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@ import { EnvironmentService } from "@bitwarden/common/platform/services/environm
|
||||
import { FileUploadService } from "@bitwarden/common/platform/services/file-upload/file-upload.service";
|
||||
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
|
||||
import { NoopMessagingService } from "@bitwarden/common/platform/services/noop-messaging.service";
|
||||
import { StateMigrationService } from "@bitwarden/common/platform/services/state-migration.service";
|
||||
import { StateService } from "@bitwarden/common/platform/services/state.service";
|
||||
import { AuditService } from "@bitwarden/common/services/audit.service";
|
||||
import { OrganizationUserServiceImplementation } from "@bitwarden/common/services/organization-user/organization-user.service.implementation";
|
||||
@@ -136,7 +135,6 @@ export class Main {
|
||||
keyConnectorService: KeyConnectorService;
|
||||
userVerificationService: UserVerificationService;
|
||||
stateService: StateService;
|
||||
stateMigrationService: StateMigrationService;
|
||||
organizationService: OrganizationService;
|
||||
providerService: ProviderService;
|
||||
twoFactorService: TwoFactorService;
|
||||
@@ -188,18 +186,11 @@ export class Main {
|
||||
|
||||
this.memoryStorageService = new MemoryStorageService();
|
||||
|
||||
this.stateMigrationService = new StateMigrationService(
|
||||
this.storageService,
|
||||
this.secureStorageService,
|
||||
new StateFactory(GlobalState, Account)
|
||||
);
|
||||
|
||||
this.stateService = new StateService(
|
||||
this.storageService,
|
||||
this.secureStorageService,
|
||||
this.memoryStorageService,
|
||||
this.logService,
|
||||
this.stateMigrationService,
|
||||
new StateFactory(GlobalState, Account)
|
||||
);
|
||||
|
||||
|
||||
@@ -298,9 +298,12 @@ export class Program {
|
||||
.option("-p, --passphrase", "Generate a passphrase.")
|
||||
.option("--length <length>", "Length of the password.")
|
||||
.option("--words <words>", "Number of words.")
|
||||
.option("--minNumber <count>", "Minimum number of numeric characters.")
|
||||
.option("--minSpecial <count>", "Minimum number of special characters.")
|
||||
.option("--separator <separator>", "Word separator.")
|
||||
.option("-c, --capitalize", "Title case passphrase.")
|
||||
.option("--includeNumber", "Passphrase includes number.")
|
||||
.option("--ambiguous", "Avoid ambiguous characters.")
|
||||
.on("--help", () => {
|
||||
writeLn("\n Notes:");
|
||||
writeLn("");
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
|
||||
import { PasswordGeneratorOptions } from "@bitwarden/common/tools/generator/password/password-generator-options";
|
||||
|
||||
import { Response } from "../models/response";
|
||||
import { StringResponse } from "../models/response/string.response";
|
||||
@@ -13,7 +14,7 @@ export class GenerateCommand {
|
||||
|
||||
async run(cmdOptions: Record<string, any>): Promise<Response> {
|
||||
const normalizedOptions = new Options(cmdOptions);
|
||||
const options = {
|
||||
const options: PasswordGeneratorOptions = {
|
||||
uppercase: normalizedOptions.uppercase,
|
||||
lowercase: normalizedOptions.lowercase,
|
||||
number: normalizedOptions.number,
|
||||
@@ -24,6 +25,9 @@ export class GenerateCommand {
|
||||
numWords: normalizedOptions.words,
|
||||
capitalize: normalizedOptions.capitalize,
|
||||
includeNumber: normalizedOptions.includeNumber,
|
||||
minNumber: normalizedOptions.minNumber,
|
||||
minSpecial: normalizedOptions.minSpecial,
|
||||
ambiguous: normalizedOptions.ambiguous,
|
||||
};
|
||||
|
||||
const enforcedOptions = (await this.stateService.getIsAuthenticated())
|
||||
@@ -47,6 +51,9 @@ class Options {
|
||||
words: number;
|
||||
capitalize: boolean;
|
||||
includeNumber: boolean;
|
||||
minNumber: number;
|
||||
minSpecial: number;
|
||||
ambiguous: boolean;
|
||||
|
||||
constructor(passedOptions: Record<string, any>) {
|
||||
this.uppercase = CliUtils.convertBooleanOption(passedOptions?.uppercase);
|
||||
@@ -55,10 +62,13 @@ class Options {
|
||||
this.special = CliUtils.convertBooleanOption(passedOptions?.special);
|
||||
this.capitalize = CliUtils.convertBooleanOption(passedOptions?.capitalize);
|
||||
this.includeNumber = CliUtils.convertBooleanOption(passedOptions?.includeNumber);
|
||||
this.length = passedOptions?.length != null ? parseInt(passedOptions?.length, null) : 14;
|
||||
this.ambiguous = CliUtils.convertBooleanOption(passedOptions?.ambiguous);
|
||||
this.length = CliUtils.convertNumberOption(passedOptions?.length, 14);
|
||||
this.type = passedOptions?.passphrase ? "passphrase" : "password";
|
||||
this.separator = passedOptions?.separator == null ? "-" : passedOptions.separator + "";
|
||||
this.words = passedOptions?.words != null ? parseInt(passedOptions.words, null) : 3;
|
||||
this.separator = CliUtils.convertStringOption(passedOptions?.separator, "-");
|
||||
this.words = CliUtils.convertNumberOption(passedOptions?.words, 3);
|
||||
this.minNumber = CliUtils.convertNumberOption(passedOptions?.minNumber, 1);
|
||||
this.minSpecial = CliUtils.convertNumberOption(passedOptions?.minSpecial, 1);
|
||||
|
||||
if (!this.uppercase && !this.lowercase && !this.special && !this.number) {
|
||||
this.lowercase = true;
|
||||
|
||||
@@ -253,4 +253,20 @@ export class CliUtils {
|
||||
static convertBooleanOption(optionValue: any) {
|
||||
return optionValue || optionValue === "" ? true : false;
|
||||
}
|
||||
|
||||
static convertNumberOption(optionValue: any, defaultValue: number) {
|
||||
try {
|
||||
if (optionValue != null) {
|
||||
const numVal = parseInt(optionValue);
|
||||
return !Number.isNaN(numVal) ? numVal : defaultValue;
|
||||
}
|
||||
return defaultValue;
|
||||
} catch {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
static convertStringOption(optionValue: any, defaultValue: string) {
|
||||
return optionValue != null ? String(optionValue) : defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@bitwarden/desktop",
|
||||
"description": "A secure and free password manager for all of your devices.",
|
||||
"version": "2023.8.2",
|
||||
"version": "2023.8.3",
|
||||
"keywords": [
|
||||
"bitwarden",
|
||||
"password",
|
||||
|
||||
@@ -28,7 +28,6 @@ import {
|
||||
} from "@bitwarden/common/platform/abstractions/log.service";
|
||||
import { MessagingService as MessagingServiceAbstraction } from "@bitwarden/common/platform/abstractions/messaging.service";
|
||||
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { StateMigrationService as StateMigrationServiceAbstraction } from "@bitwarden/common/platform/abstractions/state-migration.service";
|
||||
import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
||||
import { SystemService as SystemServiceAbstraction } from "@bitwarden/common/platform/abstractions/system.service";
|
||||
@@ -134,7 +133,6 @@ const RELOAD_CALLBACK = new InjectionToken<() => any>("RELOAD_CALLBACK");
|
||||
SECURE_STORAGE,
|
||||
MEMORY_STORAGE,
|
||||
LogService,
|
||||
StateMigrationServiceAbstraction,
|
||||
STATE_FACTORY,
|
||||
STATE_SERVICE_USE_CACHE,
|
||||
],
|
||||
|
||||
@@ -182,6 +182,6 @@ export class LoginComponent extends BaseLoginComponent implements OnDestroy {
|
||||
|
||||
private focusInput() {
|
||||
const email = this.loggedEmail;
|
||||
document.getElementById(email == null || email === "" ? "email" : "masterPassword").focus();
|
||||
document.getElementById(email == null || email === "" ? "email" : "masterPassword")?.focus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1077,8 +1077,8 @@
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 GG geënkripteerde berging vir lêeraanhegsels."
|
||||
},
|
||||
"premiumSignUpTwoStep": {
|
||||
"message": "Bykomende tweestapaantekenopsies soos YubiKey, FIDO U2F en Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"premiumSignUpReports": {
|
||||
"message": "Wagwoordhigiëne, rekeningwelstand en databreukverslae om u kluis veilig te hou."
|
||||
|
||||
@@ -1077,8 +1077,8 @@
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 جيغابايت وحدة تخزين مشفرة لمرفقات الملفات."
|
||||
},
|
||||
"premiumSignUpTwoStep": {
|
||||
"message": "خيارات تسجيل الدخول الإضافية من خطوتين مثل YubiKey و FIDO U2F و Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"premiumSignUpReports": {
|
||||
"message": "نظافة كلمة المرور، صحة الحساب، وتقارير خرق البيانات للحفاظ على سلامة خزنتك."
|
||||
|
||||
@@ -1077,8 +1077,8 @@
|
||||
"premiumSignUpStorage": {
|
||||
"message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi."
|
||||
},
|
||||
"premiumSignUpTwoStep": {
|
||||
"message": "YubiKey, FIDO U2F və Duo kimi iki mərhələli giriş seçimləri."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"premiumSignUpReports": {
|
||||
"message": "Anbarınızın təhlükəsiyini təmin etmək üçün parol gigiyenası, hesab sağlamlığı və verilənlərin pozulması hesabatları."
|
||||
|
||||
@@ -1077,8 +1077,8 @@
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 ГБ зашыфраванага сховішча для далучаных файлаў."
|
||||
},
|
||||
"premiumSignUpTwoStep": {
|
||||
"message": "Дадатковыя варыянты двухэтапнага ўваходу, такія як YubiKey, FIDO U2F і Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"premiumSignUpReports": {
|
||||
"message": "Гігіена пароляў, здароўе ўліковага запісу і справаздачы аб уцечках даных для забеспячэння бяспекі вашага сховішча."
|
||||
|
||||
@@ -1077,8 +1077,8 @@
|
||||
"premiumSignUpStorage": {
|
||||
"message": "1 ГБ пространство за файлове, които се шифроват."
|
||||
},
|
||||
"premiumSignUpTwoStep": {
|
||||
"message": "Двустепенно удостоверяване чрез YubiKey, FIDO U2F и Duo."
|
||||
"premiumSignUpTwoStepOptions": {
|
||||
"message": "Proprietary two-step login options such as YubiKey and Duo."
|
||||
},
|
||||
"premiumSignUpReports": {
|
||||
"message": "Проверки в списъците с публикувани пароли, проверка на регистрациите и доклади за пробивите в сигурността, което спомага трезорът ви да е допълнително защитен."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user