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