1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-16 16:23:44 +00:00

Merge branch 'feature/org-admin-refresh' into EC-8-restructure-tabs

This commit is contained in:
Shane Melton
2022-07-26 15:27:33 -07:00
422 changed files with 22952 additions and 23987 deletions

View File

@@ -14,7 +14,7 @@
], ],
"rules": { "rules": {
"@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled
"@typescript-eslint/no-unused-vars": ["warn", { "args": "none" }], "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }],
"@typescript-eslint/explicit-member-accessibility": [ "@typescript-eslint/explicit-member-accessibility": [
"error", "error",
{ {
@@ -27,7 +27,7 @@
"allowedNames": ["self"] "allowedNames": ["self"]
} }
], ],
"no-console": "warn", "no-console": "error",
"import/no-unresolved": "off", // TODO: Look into turning off once each package is an actual package. "import/no-unresolved": "off", // TODO: Look into turning off once each package is an actual package.
"import/order": [ "import/order": [
"error", "error",

View File

@@ -16,7 +16,7 @@ on:
branches: branches:
- 'master' - 'master'
- 'rc' - 'rc'
- 'hotfix-rc/**' - 'hotfix-rc'
paths: paths:
- 'apps/browser/**' - 'apps/browser/**'
- 'libs/**' - 'libs/**'
@@ -347,7 +347,7 @@ jobs:
trigger-desktop-build: trigger-desktop-build:
name: Trigger desktop build name: Trigger desktop build
if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') || contains(github.ref, 'hotfix-rc') }} if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') || github.ref != 'refs/heads/hotfix-rc' }}
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: needs:
- build - build

View File

@@ -17,7 +17,7 @@ on:
branches: branches:
- 'master' - 'master'
- 'rc' - 'rc'
- 'hotfix-rc/**' - 'hotfix-rc'
paths: paths:
- 'apps/cli/**' - 'apps/cli/**'
- 'libs/**' - 'libs/**'

View File

@@ -159,7 +159,7 @@ jobs:
- name: Set up environment - name: Set up environment
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm musl-dev musl-tools
- name: Set up Snap - name: Set up Snap
run: sudo snap install snapcraft --classic run: sudo snap install snapcraft --classic
@@ -175,6 +175,27 @@ jobs:
run: npm ci run: npm ci
working-directory: ./ working-directory: ./
- name: Cache Native Module
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
id: cache
with:
path: |
apps/desktop/desktop_native/*.node
${{ env.RUNNER_TEMP }}/.cargo/registry
${{ env.RUNNER_TEMP }}/.cargo/git
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
- name: Build Native Module
if: steps.cache.outputs.cache-hit != 'true'
working-directory: apps/desktop/desktop_native
env:
PKG_CONFIG_ALLOW_CROSS: true
PKG_CONFIG_ALL_STATIC: true
TARGET: musl
run: |
rustup target add x86_64-unknown-linux-musl
npm run build:cross-platform
- name: Build application - name: Build application
run: npm run dist:lin run: npm run dist:lin
@@ -256,11 +277,18 @@ jobs:
- name: Set up environment - name: Set up environment
run: choco install checksum --no-progress run: choco install checksum --no-progress
- name: Rust
shell: pwsh
run: |
rustup target install i686-pc-windows-msvc
rustup target install aarch64-pc-windows-msvc
- name: Print environment - name: Print environment
run: | run: |
node --version node --version
npm --version npm --version
choco --version choco --version
rustup show
- name: Login to Azure - name: Login to Azure
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
@@ -282,6 +310,19 @@ jobs:
run: npm ci run: npm ci
working-directory: ./ working-directory: ./
- name: Cache Native Module
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
id: cache
with:
path: apps/desktop/desktop_native/*.node
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
- name: Build Native Module
if: steps.cache.outputs.cache-hit != 'true'
working-directory: apps/desktop/desktop_native
run: |
npm run build:cross-platform
- name: Build & Sign (dev) - name: Build & Sign (dev)
env: env:
ELECTRON_BUILDER_SIGN: 1 ELECTRON_BUILDER_SIGN: 1
@@ -443,10 +484,15 @@ jobs:
npm install -g node-gyp npm install -g node-gyp
node-gyp install $(node -v) node-gyp install $(node -v)
- name: Rust
shell: pwsh
run: rustup target install aarch64-apple-darwin
- name: Print environment - name: Print environment
run: | run: |
node --version node --version
npm --version npm --version
rustup show
echo "GitHub ref: $GITHUB_REF" echo "GitHub ref: $GITHUB_REF"
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
@@ -536,6 +582,19 @@ jobs:
run: npm ci run: npm ci
working-directory: ./ working-directory: ./
- name: Cache Native Module
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
id: cache
with:
path: apps/desktop/desktop_native/*.node
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
- name: Build Native Module
if: steps.cache.outputs.cache-hit != 'true'
working-directory: apps/desktop/desktop_native
run: |
npm run build:cross-platform
- name: Build application (dev) - name: Build application (dev)
run: npm run build run: npm run build
@@ -570,10 +629,15 @@ jobs:
npm install -g node-gyp npm install -g node-gyp
node-gyp install $(node -v) node-gyp install $(node -v)
- name: Rust
shell: pwsh
run: rustup target install aarch64-apple-darwin
- name: Print environment - name: Print environment
run: | run: |
node --version node --version
npm --version npm --version
rustup show
echo "GitHub ref: $GITHUB_REF" echo "GitHub ref: $GITHUB_REF"
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
@@ -663,23 +727,30 @@ jobs:
run: npm ci run: npm ci
working-directory: ./ working-directory: ./
- name: Cache Native Module
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
id: cache
with:
path: apps/desktop/desktop_native/*.node
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
- name: Build Native Module
if: steps.cache.outputs.cache-hit != 'true'
working-directory: apps/desktop/desktop_native
run: |
npm run build:cross-platform
- name: Build - name: Build
if: steps.build-cache.outputs.cache-hit != 'true' if: steps.build-cache.outputs.cache-hit != 'true'
run: npm run build run: npm run build
- name: Extract branch name
if: contains(github.ref, 'hotfix-rc')
id: extract_branch
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
- name: Download artifact from hotfix-rc - name: Download artifact from hotfix-rc
if: contains(github.ref, 'hotfix-rc') if: github.ref == 'refs/heads/hotfix-rc'
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
workflow_conclusion: success workflow_conclusion: success
branch: ${{ steps.extract_branch.outputs.branch }} branch: hotfix-rc
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from rc - name: Download artifact from rc
@@ -692,7 +763,7 @@ jobs:
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from master - name: Download artifact from master
if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }} if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }}
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
@@ -776,10 +847,15 @@ jobs:
npm install -g node-gyp npm install -g node-gyp
node-gyp install $(node -v) node-gyp install $(node -v)
- name: Rust
shell: pwsh
run: rustup target install aarch64-apple-darwin
- name: Print environment - name: Print environment
run: | run: |
node --version node --version
npm --version npm --version
rustup show
echo "GitHub ref: $GITHUB_REF" echo "GitHub ref: $GITHUB_REF"
echo "GitHub event: $GITHUB_EVENT" echo "GitHub event: $GITHUB_EVENT"
@@ -869,23 +945,30 @@ jobs:
run: npm ci run: npm ci
working-directory: ./ working-directory: ./
- name: Cache Native Module
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
id: cache
with:
path: apps/desktop/desktop_native/*.node
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
- name: Build Native Module
if: steps.cache.outputs.cache-hit != 'true'
working-directory: apps/desktop/desktop_native
run: |
npm run build:cross-platform
- name: Build - name: Build
if: steps.build-cache.outputs.cache-hit != 'true' if: steps.build-cache.outputs.cache-hit != 'true'
run: npm run build run: npm run build
- name: Extract branch name
if: contains(github.ref, 'hotfix-rc')
id: extract_branch
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
- name: Download artifact from hotfix-rc - name: Download artifact from hotfix-rc
if: contains(github.ref, 'hotfix-rc') if: github.ref == 'refs/heads/hotfix-rc'
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
workflow_conclusion: success workflow_conclusion: success
branch: ${{ steps.extract_branch.outputs.branch }} branch: hotfix-rc
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from rc - name: Download artifact from rc
@@ -898,7 +981,7 @@ jobs:
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from master - name: Download artifact from master
if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }} if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }}
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
@@ -1067,6 +1150,19 @@ jobs:
run: npm ci run: npm ci
working-directory: ./ working-directory: ./
- name: Cache Native Module
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
id: cache
with:
path: apps/desktop/desktop_native/*.node
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
- name: Build Native Module
if: steps.cache.outputs.cache-hit != 'true'
working-directory: apps/desktop/desktop_native
run: |
npm run build:cross-platform
- name: Build - name: Build
if: steps.build-cache.outputs.cache-hit != 'true' if: steps.build-cache.outputs.cache-hit != 'true'
run: npm run build run: npm run build

View File

@@ -17,7 +17,7 @@ on:
branches: branches:
- 'master' - 'master'
- 'rc' - 'rc'
- 'hotfix-rc/**' - 'hotfix-rc'
paths: paths:
- 'apps/web/**' - 'apps/web/**'
- 'libs/**' - 'libs/**'

View File

@@ -31,9 +31,9 @@ jobs:
- name: Branch check - name: Branch check
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
run: | run: |
if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc ]]; then
echo "===================================" echo "==================================="
echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches" echo "[!] Can only release from the 'rc' or 'hotfix-rc' branches"
echo "===================================" echo "==================================="
exit 1 exit 1
fi fi
@@ -90,6 +90,22 @@ jobs:
- setup - setup
- locales-test - locales-test
steps: steps:
- name: Create GitHub deployment
uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
id: deployment
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment: 'Browser - Production'
description: 'Deployment ${{ needs.setup.outputs.release-version }} from branch ${{ github.ref_name }}'
task: release
- name: Update deployment status to In Progress
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'in_progress'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Download latest Release build artifacts - name: Download latest Release build artifacts
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
@@ -141,3 +157,19 @@ jobs:
body: "<insert release notes here>" body: "<insert release notes here>"
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
draft: true draft: true
- name: Update deployment status to Success
if: success()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'success'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Update deployment status to Failure
if: failure()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'failure'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}

View File

@@ -47,9 +47,9 @@ jobs:
- name: Branch check - name: Branch check
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
run: | run: |
if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc ]]; then
echo "===================================" echo "==================================="
echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches" echo "[!] Can only release from the 'rc' or 'hotfix-rc' branches"
echo "===================================" echo "==================================="
exit 1 exit 1
fi fi
@@ -64,6 +64,22 @@ jobs:
monorepo: true monorepo: true
monorepo-project: cli monorepo-project: cli
- name: Create GitHub deployment for Snap
uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
id: deployment
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment: 'CLI - Production'
description: 'Deployment ${{ steps.version.outputs.version }} from branch ${{ github.ref_name }}'
task: release
- name: Update deployment status to In Progress
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'in_progress'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Download all Release artifacts - name: Download all Release artifacts
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
@@ -104,6 +120,21 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
draft: true draft: true
- name: Update deployment status to Success
if: success()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'success'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Update deployment status to Failure
if: failure()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'failure'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
snap: snap:
name: Deploy Snap name: Deploy Snap
@@ -159,7 +190,6 @@ jobs:
snapcraft push bw_${{ env._PKG_VERSION }}_amd64.snap --release stable snapcraft push bw_${{ env._PKG_VERSION }}_amd64.snap --release stable
snapcraft logout snapcraft logout
choco: choco:
name: Deploy Choco name: Deploy Choco
runs-on: windows-2019 runs-on: windows-2019
@@ -219,7 +249,6 @@ jobs:
cd dist cd dist
choco push choco push
npm: npm:
name: Publish NPM name: Publish NPM
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
@@ -274,3 +303,4 @@ jobs:
- name: Publish NPM - name: Publish NPM
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
run: npm publish --access public run: npm publish --access public

View File

@@ -25,9 +25,9 @@ jobs:
# - name: Branch check # - name: Branch check
# run: | # run: |
# if [[ "$GITHUB_REF" != "refs/heads/master" ]] && [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then # if [[ "$GITHUB_REF" != "refs/heads/master" ]] && [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != "refs/heads/hotfix-rc" ]]; then
# echo "===================================" # echo "==================================="
# echo "[!] Can only release from the 'master', 'rc' or 'hotfix-rc/*' branches" # echo "[!] Can only release from the 'master', 'rc' or 'hotfix-rc' branches"
# echo "===================================" # echo "==================================="
# exit 1 # exit 1
# fi # fi
@@ -609,19 +609,13 @@ jobs:
if: steps.build-cache.outputs.cache-hit != 'true' if: steps.build-cache.outputs.cache-hit != 'true'
run: npm run build run: npm run build
- name: Extract branch name
if: contains(github.ref, 'hotfix-rc')
id: extract_branch
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
- name: Download artifact from hotfix-rc - name: Download artifact from hotfix-rc
if: contains(github.ref, 'hotfix-rc') if: github.ref == 'refs/heads/hotfix-rc')
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
workflow_conclusion: success workflow_conclusion: success
branch: ${{ steps.extract_branch.outputs.branch }} branch: hotfix-rc
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from rc - name: Download artifact from rc
@@ -634,7 +628,7 @@ jobs:
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from master - name: Download artifact from master
if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }} if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }}
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
@@ -815,19 +809,13 @@ jobs:
if: steps.build-cache.outputs.cache-hit != 'true' if: steps.build-cache.outputs.cache-hit != 'true'
run: npm run build run: npm run build
- name: Extract branch name
if: contains(github.ref, 'hotfix-rc')
id: extract_branch
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
- name: Download artifact from hotfix-rc - name: Download artifact from hotfix-rc
if: contains(github.ref, 'hotfix-rc') if: github.ref == 'refs/heads/hotfix-rc')
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml
workflow_conclusion: success workflow_conclusion: success
branch: ${{ steps.extract_branch.outputs.branch }} branch: hotfix-rc
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from rc - name: Download artifact from rc
@@ -840,7 +828,7 @@ jobs:
path: ${{ github.workspace }}/browser-build-artifacts path: ${{ github.workspace }}/browser-build-artifacts
- name: Download artifact from master - name: Download artifact from master
if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }} if: ${{ github.ref != 'refs/heads/rc' && github.ref != 'refs/heads/hotfix-rc' }}
uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0 uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
with: with:
workflow: build-browser.yml workflow: build-browser.yml

View File

@@ -42,9 +42,9 @@ jobs:
- name: Branch check - name: Branch check
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
run: | run: |
if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc ]]; then
echo "===================================" echo "==================================="
echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches" echo "[!] Can only release from the 'rc' or 'hotfix-rc' branches"
echo "===================================" echo "==================================="
exit 1 exit 1
fi fi
@@ -76,6 +76,22 @@ jobs:
;; ;;
esac esac
- name: Create GitHub deployment
uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
id: deployment
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment: 'Desktop - Production'
description: 'Deployment ${{ steps.version.outputs.version }} to channel ${{ steps.release-channel.outputs.channel }} from branch ${{ github.ref_name }}'
task: release
- name: Update deployment status to In Progress
uses: chrnorm/deployment-status@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'failure'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Login to Azure - name: Login to Azure
uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010
with: with:
@@ -164,6 +180,21 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
draft: true draft: true
- name: Update deployment status to Success
if: success()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'success'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Update deployment status to Failure
if: failure()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
state: 'failure'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
snap: snap:
name: Deploy Snap name: Deploy Snap

View File

@@ -72,6 +72,23 @@ jobs:
name: Deploy Web Vault to QA CloudFlare Pages branch name: Deploy Web Vault to QA CloudFlare Pages branch
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- name: Create GitHub deployment
uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
id: deployment
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.qa.bitwarden.pw
environment: 'Web Vault - QA'
description: 'Deployment from branch ${{ github.ref_name }}'
- name: Update deployment status to In Progress
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.qa.bitwarden.pw
state: 'in_progress'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Checkout Repo - name: Checkout Repo
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
@@ -118,3 +135,21 @@ jobs:
echo "No changes to commit!"; echo "No changes to commit!";
fi fi
working-directory: deployment working-directory: deployment
- name: Update deployment status to Success
if: success()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.qa.bitwarden.pw
state: 'success'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Update deployment status to Failure
if: failure()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.qa.bitwarden.pw
state: 'failure'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}

View File

@@ -28,9 +28,9 @@ jobs:
- name: Branch check - name: Branch check
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
run: | run: |
if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != "refs/heads/hotfix-rc" ]]; then
echo "===================================" echo "==================================="
echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches" echo "[!] Can only release from the 'rc' or 'hotfix-rc' branches"
echo "===================================" echo "==================================="
exit 1 exit 1
fi fi
@@ -227,6 +227,24 @@ jobs:
- self-host - self-host
- cfpages-deploy - cfpages-deploy
steps: steps:
- name: Create GitHub deployment
uses: chrnorm/deployment-action@1b599fe41a0ef1f95191e7f2eec4743f2d7dfc48
id: deployment
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.bitwarden.com
environment: 'Web Vault - Production'
description: 'Deployment ${{ needs.setup.outputs.release_version }} from branch ${{ github.ref_name }}'
task: release
- name: Update deployment status to In Progress
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.bitwarden.com
state: 'in_progress'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Download latest build artifacts - name: Download latest build artifacts
if: ${{ github.event.inputs.release_type != 'Dry Run' }} if: ${{ github.event.inputs.release_type != 'Dry Run' }}
uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
@@ -267,3 +285,21 @@ jobs:
apps/web/artifacts/web-${{ needs.setup.outputs.release_version }}-selfhosted-open-source.zip" apps/web/artifacts/web-${{ needs.setup.outputs.release_version }}-selfhosted-open-source.zip"
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
draft: true draft: true
- name: Update deployment status to Success
if: success()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.bitwarden.com
state: 'success'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}
- name: Update deployment status to Failure
if: failure()
uses: chrnorm/deployment-status@07b3930847f65e71c9c6802ff5a402f6dfb46b86
with:
token: '${{ secrets.GITHUB_TOKEN }}'
environment-url: http://vault.bitwarden.com
state: 'failure'
deployment-id: ${{ steps.deployment.outputs.deployment_id }}

1
.gitignore vendored
View File

@@ -26,6 +26,7 @@ npm-debug.log
# Build directories # Build directories
dist dist
build build
.angular/cache
# Testing # Testing
coverage coverage

View File

@@ -4,7 +4,10 @@
"types": ["node"], "types": ["node"],
"allowSyntheticDefaultImports": true "allowSyntheticDefaultImports": true
}, },
"exclude": ["../src/test.setup.ts", "../src/**/*.spec.ts", "../projects/**/*.spec.ts"], "exclude": ["../src/test.setup.ts", "../apps/src/**/*.spec.ts", "../libs/**/*.spec.ts"],
"include": ["../src/**/*", "../projects/**/*"], "files": [
"files": ["./typings.d.ts"] "./typings.d.ts",
"../libs/components/src/main.ts",
"../libs/components/src/polyfills.ts"
]
} }

View File

@@ -3,6 +3,83 @@
"version": 1, "version": 1,
"newProjectRoot": "apps", "newProjectRoot": "apps",
"projects": { "projects": {
"web": {
"projectType": "application",
"schematics": {
"@schematics/angular:application": {
"strict": true
}
},
"root": "apps/web",
"sourceRoot": "apps/web/src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/web",
"index": "apps/web/src/index.html",
"main": "apps/web/src/app/main.ts",
"polyfills": "apps/web/src/app/polyfills.ts",
"tsConfig": "apps/web/tsconfig.json",
"assets": ["apps/web/src/favicon.ico"],
"styles": [],
"scripts": []
}
}
}
},
"browser": {
"projectType": "application",
"schematics": {
"@schematics/angular:application": {
"strict": true
}
},
"root": "apps/browser",
"sourceRoot": "apps/browser/src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/browser",
"index": "apps/browser/src/popup/index.html",
"main": "apps/browser/src/popup/main.ts",
"polyfills": "apps/browser/src/popup/polyfills.ts",
"tsConfig": "apps/browser/tsconfig.json",
"assets": [],
"styles": [],
"scripts": []
}
}
}
},
"desktop": {
"projectType": "application",
"schematics": {
"@schematics/angular:application": {
"strict": true
}
},
"root": "apps/desktop",
"sourceRoot": "apps/desktop/src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/desktop",
"index": "apps/desktop/src/index.html",
"main": "apps/desktop/src/app/main.ts",
"tsConfig": "apps/desktop/tsconfig.json",
"assets": [],
"styles": [],
"scripts": []
}
}
}
},
"components": { "components": {
"projectType": "application", "projectType": "application",
"schematics": { "schematics": {
@@ -10,9 +87,9 @@
"strict": true "strict": true
} }
}, },
"root": "./libs/components", "root": "libs/components",
"sourceRoot": "libs/components/src", "sourceRoot": "libs/components/src",
"prefix": "components", "prefix": "bit",
"architect": { "architect": {
"build": { "build": {
"builder": "@angular-devkit/build-angular:browser", "builder": "@angular-devkit/build-angular:browser",
@@ -31,18 +108,6 @@
}, },
"configurations": { "configurations": {
"production": { "production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kb",
"maximumError": "1mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "2kb",
"maximumError": "4kb"
}
],
"outputHashing": "all" "outputHashing": "all"
}, },
"development": { "development": {
@@ -60,22 +125,42 @@
"builder": "@angular-devkit/build-angular:dev-server", "builder": "@angular-devkit/build-angular:dev-server",
"configurations": { "configurations": {
"production": { "production": {
"browserTarget": "components:build:production" "browserTarget": "test-storybook:build:production"
}, },
"development": { "development": {
"browserTarget": "components:build:development" "browserTarget": "test-storybook:build:development"
} }
}, },
"defaultConfiguration": "development" "defaultConfiguration": "development"
}, }
"extract-i18n": { }
"builder": "@angular-devkit/build-angular:extract-i18n", },
"storybook": {
"projectType": "application",
"root": "libs/components",
"sourceRoot": "libs/components/src",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": { "options": {
"browserTarget": "components:build" "tsConfig": ".storybook/tsconfig.json",
"styles": ["libs/components/src/styles.scss", "libs/components/src/styles.css"],
"scripts": []
} }
} }
} }
},
"angular": {
"projectType": "library",
"root": "libs/angular",
"sourceRoot": "libs/angular/src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:ng-packagr",
"defaultConfiguration": "production"
}
}
} }
}, }
"defaultProject": "components"
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Sıradan çıxarılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." "message": "Sıradan çıxarılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -430,7 +430,7 @@
"message": "Повторното въвеждане на главната парола е задължително." "message": "Повторното въвеждане на главната парола е задължително."
}, },
"masterPasswordMinlength": { "masterPasswordMinlength": {
"message": "Master password must be at least 8 characters long." "message": "Главната парола трябва да е дълга поне 8 знака."
}, },
"masterPassDoesntMatch": { "masterPassDoesntMatch": {
"message": "Главната парола и потвърждението ѝ не съвпадат." "message": "Главната парола и потвърждението ѝ не съвпадат."
@@ -1969,9 +1969,12 @@
"message": "Грешка с конектора за ключове: уверете се, че конекторът за ключове е наличен и работи правилно." "message": "Грешка с конектора за ключове: уверете се, че конекторът за ключове е наличен и работи правилно."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "Организацията е изключена."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Записите в изключени организации не са достъпни. Свържете се със собственика на организацията си за помощ."
},
"cardBrandMir": {
"message": "Мир"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -11,28 +11,28 @@
"description": "Extension description" "description": "Extension description"
}, },
"loginOrCreateNewAccount": { "loginOrCreateNewAccount": {
"message": "Log in or create a new account to access your secure vault." "message": "Prijavite se ili napravite novi račun da biste pristupili svom sigurnom trezoru."
}, },
"createAccount": { "createAccount": {
"message": "Create Account" "message": "Napravi račun"
}, },
"login": { "login": {
"message": "Log In" "message": "Prijavite se"
}, },
"enterpriseSingleSignOn": { "enterpriseSingleSignOn": {
"message": "Enterprise Single Sign-On" "message": "Enterprise Single Sign-On"
}, },
"cancel": { "cancel": {
"message": "Cancel" "message": "Otkaži"
}, },
"close": { "close": {
"message": "Close" "message": "Zatvori"
}, },
"submit": { "submit": {
"message": "Submit" "message": "Potvrdi"
}, },
"emailAddress": { "emailAddress": {
"message": "Email Address" "message": "E-Mail adresa"
}, },
"masterPass": { "masterPass": {
"message": "Master Password" "message": "Master Password"
@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1969,9 +1969,12 @@
"message": "Error del connector de claus: assegureu-vos que el connector de claus està disponible i funcionant correctament." "message": "Error del connector de claus: assegureu-vos que el connector de claus està disponible i funcionant correctament."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "L'organització està inhabilitada."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "No es pot accedir als elements de les organitzacions inhabilitades. Poseu-vos en contacte amb el propietari de la vostra organització per obtenir ajuda."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -424,13 +424,13 @@
"message": "Ugyldig e-mailadresse." "message": "Ugyldig e-mailadresse."
}, },
"masterPasswordRequired": { "masterPasswordRequired": {
"message": "Master password is required." "message": "Hovedadgangskode er påkrævet."
}, },
"confirmMasterPasswordRequired": { "confirmMasterPasswordRequired": {
"message": "Master password retype is required." "message": "Hovedadgangskode kræves angivet igen."
}, },
"masterPasswordMinlength": { "masterPasswordMinlength": {
"message": "Master password must be at least 8 characters long." "message": "Hovedadgangskode skal være mindst 8 tegn."
}, },
"masterPassDoesntMatch": { "masterPassDoesntMatch": {
"message": "De to adgangskoder matcher ikke." "message": "De to adgangskoder matcher ikke."
@@ -571,10 +571,10 @@
"description": "This is the folder for uncategorized items" "description": "This is the folder for uncategorized items"
}, },
"enableAddLoginNotification": { "enableAddLoginNotification": {
"message": "Bed om at tilføje login" "message": "Spørg om at tilføje login"
}, },
"addLoginNotificationDesc": { "addLoginNotificationDesc": {
"message": "Bed om at tilføje et element, hvis et ikke findes i din boks." "message": "Spørg om at tilføje et element, hvis et ikke findes i din boks."
}, },
"showCardsCurrentTab": { "showCardsCurrentTab": {
"message": "Vis kort på fanebladet" "message": "Vis kort på fanebladet"
@@ -1484,7 +1484,7 @@
"message": "Ved at markere dette felt accepterer du følgende:" "message": "Ved at markere dette felt accepterer du følgende:"
}, },
"acceptPoliciesRequired": { "acceptPoliciesRequired": {
"message": "Terms of Service and Privacy Policy have not been acknowledged." "message": "Tjenestevilkår og fortrolighedspolitik er ikke blevet accepteret."
}, },
"termsOfService": { "termsOfService": {
"message": "Servicevilkår" "message": "Servicevilkår"
@@ -1969,9 +1969,12 @@
"message": "Key Connector-fejl: Sørg for, at Key Connector er tilgængelig og fungerer korrekt." "message": "Key Connector-fejl: Sørg for, at Key Connector er tilgængelig og fungerer korrekt."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "Organisationen er deaktiveret."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Elementer i deaktiverede organisationer kan ikke tilgås. Kontakt din organisationsejer for at få hjælp."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung." "message": "Auf Einträge in deaktivierten Organisationen kann nicht zugegriffen werden. Kontaktiere deinen Organisationseigentümer für Unterstützung."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organisations cannot be accessed. Contact your Organisation owner for assistance." "message": "Items in disabled Organisations cannot be accessed. Contact your Organisation owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1969,9 +1969,12 @@
"message": "Error en el conector de claves: asegúrate de que el conector de claves está disponible y que funciona correctamente." "message": "Error en el conector de claves: asegúrate de que el conector de claves está disponible y que funciona correctamente."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "La organización está desactivada."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "No se puede acceder a los elementos de las organizaciones desactivadas. Póngase en contacto con el personal propietario de la organización para obtener ayuda."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga." "message": "Organisatsiooni alla kuuluvatele kirjetele ei ole ligipääsu. Kontakteeru oma organisatsiooni omanikuga."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -157,7 +157,7 @@
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
}, },
"twoStepLogin": { "twoStepLogin": {
"message": "Bi urratseko egiaztatzea" "message": "Bi urratseko saio hasiera"
}, },
"logOut": { "logOut": {
"message": "Itxi saioa" "message": "Itxi saioa"
@@ -491,7 +491,7 @@
"message": "Zure pasahitz nagusia alda dezakezu bitwarden.com webgunean. Orain joan nahi duzu webgunera?" "message": "Zure pasahitz nagusia alda dezakezu bitwarden.com webgunean. Orain joan nahi duzu webgunera?"
}, },
"twoStepLoginConfirmation": { "twoStepLoginConfirmation": {
"message": "Bi urratseko egiaztatzea dela eta, zure kontua seguruagoa da, beste aplikazio/gailu batekin saioa hastea eskatzen baitizu; adibidez, segurtasun kode, baimentze aplikazio, SMS, telefono dei edo posta elektroniko bidez. Bi urratseko egiaztatzea bitwarden.com webgunean aktibatu daiteke. Orain joan nahi duzu webgunera?" "message": "Bi urratseko saio hasiera dela eta, zure kontua seguruagoa da, beste aplikazio/gailu batekin saioa hastea eskatzen baitizu; adibidez, segurtasun kode, autentifikazio aplikazio, SMS, telefono dei edo email bidez. Bi urratseko saio hasiera bitwarden.com webgunean aktibatu daiteke. Orain joan nahi duzu webgunera?"
}, },
"editedFolder": { "editedFolder": {
"message": "Karpeta editatuta" "message": "Karpeta editatuta"
@@ -705,7 +705,7 @@
"message": "Gehiago ikasi" "message": "Gehiago ikasi"
}, },
"authenticatorKeyTotp": { "authenticatorKeyTotp": {
"message": "Baimentze kodea (TOTP)" "message": "Autentifikazio giltza (TOTP)"
}, },
"verificationCodeTotp": { "verificationCodeTotp": {
"message": "Egiaztatze kodea" "message": "Egiaztatze kodea"
@@ -771,7 +771,7 @@
"message": "Eranskinentzako 1GB-eko enkriptatutako biltegia." "message": "Eranskinentzako 1GB-eko enkriptatutako biltegia."
}, },
"ppremiumSignUpTwoStep": { "ppremiumSignUpTwoStep": {
"message": "YubiKey, FIDO U2F eta Duo bezalako saio-hasieratarako bi urratseko egiaztatze aukerak." "message": "YubiKey, FIDO U2F eta Duo bezalako bi urratseko saio hasierarako aukera gehigarriak."
}, },
"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."
@@ -813,7 +813,7 @@
"message": "Kopiatu TOTO automatikoki" "message": "Kopiatu TOTO automatikoki"
}, },
"disableAutoTotpCopyDesc": { "disableAutoTotpCopyDesc": {
"message": "Saio-hasiera batek baimentze-kodea badu, TOTP egiaztatze-kodea arbelean automatikoki kopiatuko da saio-hasiera bat auto-betetzean." "message": "Saio hasiera batek autentifikazio giltza badu, TOTP egiaztatze kodea arbelean automatikoki kopiatuko da saio hasiera bat auto-betetzean."
}, },
"enableAutoBiometricsPrompt": { "enableAutoBiometricsPrompt": {
"message": "Biometria eskatu saioa hastean" "message": "Biometria eskatu saioa hastean"
@@ -825,7 +825,7 @@
"message": "Premium bazkidetza beharrezkoa da ezaugarri hau erabiltzeko." "message": "Premium bazkidetza beharrezkoa da ezaugarri hau erabiltzeko."
}, },
"enterVerificationCodeApp": { "enterVerificationCodeApp": {
"message": "Sartu zure baimentze-aplikazioaren 6 digituko egiaztatze-kodea." "message": "Sartu zure autentifikazio aplikazioaren 6 digituko egiaztatze kodea."
}, },
"enterVerificationCodeEmail": { "enterVerificationCodeEmail": {
"message": "Sartu $EMAIL$-era bidalitako 6 digituko egiaztatze-kodea.", "message": "Sartu $EMAIL$-era bidalitako 6 digituko egiaztatze-kodea.",
@@ -852,13 +852,13 @@
"message": "Berbidali email bidezko egiaztatze-kodea." "message": "Berbidali email bidezko egiaztatze-kodea."
}, },
"useAnotherTwoStepMethod": { "useAnotherTwoStepMethod": {
"message": "Erabili bi urratseko egiaztatzeko beste modu bat." "message": "Erabili bi urratseko saio hasierarako beste modu bat"
}, },
"insertYubiKey": { "insertYubiKey": {
"message": "Sartu zure YubiKey-a ordenagailuko USB portuan, ondoren, sakatu bere botoia." "message": "Sartu zure YubiKey-a ordenagailuko USB atakan, ondoren, sakatu bere botoia."
}, },
"insertU2f": { "insertU2f": {
"message": "Sartu zure segurtasun giltza ordenagailuaren USB portuan. Botoia badu, sakatu ezazu." "message": "Sartu zure segurtasun giltza ordenagailuaren USB atakan. Botoia badu, sakatu ezazu."
}, },
"webAuthnNewTab": { "webAuthnNewTab": {
"message": "WebAuthn 2FA egiaztatzea hasteko. Egin klik beheko botoian fitxa berria irekitzeko eta jarraitu fitxa berriko jarraibideei." "message": "WebAuthn 2FA egiaztatzea hasteko. Egin klik beheko botoian fitxa berria irekitzeko eta jarraitu fitxa berriko jarraibideei."
@@ -867,19 +867,19 @@
"message": "Ireki fitxa berria" "message": "Ireki fitxa berria"
}, },
"webAuthnAuthenticate": { "webAuthnAuthenticate": {
"message": "WebAuthn baimendu" "message": "WebAuthn autentifikatu"
}, },
"loginUnavailable": { "loginUnavailable": {
"message": "Ez dago eskuragarri saio-hasierarik" "message": "Ez dago eskuragarri saio-hasierarik"
}, },
"noTwoStepProviders": { "noTwoStepProviders": {
"message": "Kontu honek bi urratseko egiaztatzea du gaituta, baina konfiguratutako bi urratseko egiaztatzea ez da web-nabigatzaile honekin bateragarria." "message": "Kontu honek bi urratseko saio hasiera du gaituta, baina ezarritako bi urratserako hornitzailea ez da web-nabigatzaile honekin bateragarria."
}, },
"noTwoStepProviders2": { "noTwoStepProviders2": {
"message": "Mesedez, erabili nabigatzaile bateragarri bat (adibidez, Chrome) eta/edo gehitu bateragarritasun obea duten nabigatzaile bidezko (baimentze-aplikazio gisa) baimentze modu gehigarriak." "message": "Mesedez, erabili nabigatzaile bateragarri bat (adibidez, Chrome) eta/edo gehitu bateragarritasun obea duten nabigatzaile bidezko (autentifikazio aplikazio gisa) autentifikazio modu gehigarriak."
}, },
"twoStepOptions": { "twoStepOptions": {
"message": "Bi urratseko egiaztatzearen aukerak" "message": "Bi urratseko saio hasieraren aukerak"
}, },
"recoveryCodeDesc": { "recoveryCodeDesc": {
"message": "Bi urratseko egiaztatzeko modu guztietarako sarbidea galdu duzu? Erabili zure berreskuratze-kodea zure kontuko bi urratseko egiaztatze hornitzaile guztiak desaktibatzeko." "message": "Bi urratseko egiaztatzeko modu guztietarako sarbidea galdu duzu? Erabili zure berreskuratze-kodea zure kontuko bi urratseko egiaztatze hornitzaile guztiak desaktibatzeko."
@@ -888,10 +888,10 @@
"message": "Berreskuratze-kodea" "message": "Berreskuratze-kodea"
}, },
"authenticatorAppTitle": { "authenticatorAppTitle": {
"message": "Baimentze aplikazioa" "message": "Autentifikazio aplikazioa"
}, },
"authenticatorAppDesc": { "authenticatorAppDesc": {
"message": "Erabili baimentze-aplikazio bat (adibidez, Authy edo Google Authenticator) denboran oinarritutako egiaztatze-kodeak sortzeko.", "message": "Erabili autentifikazio aplikazio bat (adibidez, Authy edo Google Authenticator) denboran oinarritutako egiaztatze-kodeak sortzeko.",
"description": "'Authy' and 'Google Authenticator' are product names and should not be translated." "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
}, },
"yubiKeyTitle": { "yubiKeyTitle": {
@@ -1421,7 +1421,7 @@
"message": "Elementua berreskuratua" "message": "Elementua berreskuratua"
}, },
"vaultTimeoutLogOutConfirmation": { "vaultTimeoutLogOutConfirmation": {
"message": "Saioa ixteak kutxa gotorreko sarrera guztia kenduko du eta itxaronaldiaren ondoren lineako baimentzea eskatuko du. Ziur zaude hau egin nahi duzula?" "message": "Saioa ixteak kutxa gotorreko sarrera guztia kenduko du eta itxaronaldiaren ondoren lineako autentifikazioa eskatuko du. Ziur zaude hau egin nahi duzula?"
}, },
"vaultTimeoutLogOutConfirmationTitle": { "vaultTimeoutLogOutConfirmationTitle": {
"message": "Baieztatu itxarote denboraren ekintza" "message": "Baieztatu itxarote denboraren ekintza"
@@ -1886,7 +1886,7 @@
"message": "Ziur al zaude erakundea utzi nahi duzula?" "message": "Ziur al zaude erakundea utzi nahi duzula?"
}, },
"leftOrganization": { "leftOrganization": {
"message": "Erakundea utzi egin duzu." "message": "Erakundea utzi duzu."
}, },
"toggleCharacterCount": { "toggleCharacterCount": {
"message": "Karaktere kontaketak txandakatu" "message": "Karaktere kontaketak txandakatu"
@@ -1969,9 +1969,12 @@
"message": "Errore bat gertatu da konektore giltzan: ziurtatu giltza konektorea erabilgarri dagoela eta behar bezala dabilela." "message": "Errore bat gertatu da konektore giltzan: ziurtatu giltza konektorea erabilgarri dagoela eta behar bezala dabilela."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "Erakundea desgaituta dago."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Ezin da sartu desgaitutako erakundeetako elementuetara. Laguntza lortzeko, jarri harremanetan zure erakundearekin."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -430,7 +430,7 @@
"message": "تایپ مجدد گذرواژه اصلی نیاز است." "message": "تایپ مجدد گذرواژه اصلی نیاز است."
}, },
"masterPasswordMinlength": { "masterPasswordMinlength": {
"message": "Master password must be at least 8 characters long." "message": "طول کلمه عبور اصلی باید حداقل ۸ کاراکتر باشد."
}, },
"masterPassDoesntMatch": { "masterPassDoesntMatch": {
"message": "کلمه عبور اصلی با تکرار کلمه عبور اصلی مطابقت ندارد." "message": "کلمه عبور اصلی با تکرار کلمه عبور اصلی مطابقت ندارد."
@@ -1969,9 +1969,12 @@
"message": "خطای Key Connector: مطمئن شوید که Key Connector در دسترس است و به درستی کار می کند." "message": "خطای Key Connector: مطمئن شوید که Key Connector در دسترس است و به درستی کار می کند."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "سازمان از کار افتاده است."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "موارد موجود در سازمان‌های غیرفعال، قابل دسترسی نیستند. برای دریافت کمک با مالک سازمان خود تماس بگیرید."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Käytöstä poistettujen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua." "message": "Käytöstä poistettujen organisaatioiden kohteet eivät ole käytettävissä. Ole yhteydessä organisaation omistajaan saadaksesi apua."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "A letiltott szervezetek elemei nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért." "message": "A letiltott szervezetek elemei nem érhetők el. Vegyük fel a kapcsolatot a szervezet tulajdonosával segítségért."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Non è possibile accedere agli oggetti nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per ricevere assistenza." "message": "Non è possibile accedere agli oggetti nelle organizzazioni disabilitate. Contatta il proprietario della tua organizzazione per ricevere assistenza."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "無効な組織のアイテムにアクセスすることはできません。組織の所有者に連絡してください。" "message": "無効な組織のアイテムにアクセスすることはできません。組織の所有者に連絡してください。"
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Atspējotu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību." "message": "Atspējotu apvienību vienumiem nevar piekļūt. Jāsazinās ar apvienības īpašnieku, lai iegūtu palīdzību."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp." "message": "Je kunt uitgeschakelde items in een organisatie niet benaderen. Neem contact op met de eigenaar van je organisatie voor hulp."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Nie można uzyskać dostępu do elementów w wyłączonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." "message": "Nie można uzyskać dostępu do elementów w wyłączonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Articolele din Organizațiile dezactivate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență." "message": "Articolele din Organizațiile dezactivate nu pot fi accesate. Contactați proprietarul Organizației pentru asistență."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации." "message": "Доступ к элементам в отключенных организациях невозможен. Обратитесь за помощью к владельцу организации."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "K položkám vo vypnutej organizácii nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie." "message": "K položkám vo vypnutej organizácii nie je možné pristupovať. Požiadajte o pomoc vlastníka organizácie."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1969,9 +1969,12 @@
"message": "Key Connector грешка: будите сигурни да је Key Connector доступан и да ради." "message": "Key Connector грешка: будите сигурни да је Key Connector доступан и да ради."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "Организација је онемогућена."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Није могуће приступити ставкама у онемогућене организације. Обратите се власнику организације за помоћ."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -424,13 +424,13 @@
"message": "Ogiltig e-postadress." "message": "Ogiltig e-postadress."
}, },
"masterPasswordRequired": { "masterPasswordRequired": {
"message": "Master password is required." "message": "Huvudlösenord krävs."
}, },
"confirmMasterPasswordRequired": { "confirmMasterPasswordRequired": {
"message": "Master password retype is required." "message": "Huvudlösenord måste anges igen."
}, },
"masterPasswordMinlength": { "masterPasswordMinlength": {
"message": "Master password must be at least 8 characters long." "message": "Huvudlösenordet måste vara minst 8 tecken långt."
}, },
"masterPassDoesntMatch": { "masterPassDoesntMatch": {
"message": "Bekräftelsen för huvudlösenordet stämde ej." "message": "Bekräftelsen för huvudlösenordet stämde ej."
@@ -571,7 +571,7 @@
"description": "This is the folder for uncategorized items" "description": "This is the folder for uncategorized items"
}, },
"enableAddLoginNotification": { "enableAddLoginNotification": {
"message": "Ask to add login" "message": "Be om att lägga till inloggning"
}, },
"addLoginNotificationDesc": { "addLoginNotificationDesc": {
"message": "Aviseringar för nya inloggningar frågar dig om du vill lägga till en inloggning automatiskt till ditt valv, när du använder en inloggning som inte redan finns i ditt valv." "message": "Aviseringar för nya inloggningar frågar dig om du vill lägga till en inloggning automatiskt till ditt valv, när du använder en inloggning som inte redan finns i ditt valv."
@@ -603,10 +603,10 @@
"message": "Spara" "message": "Spara"
}, },
"enableChangedPasswordNotification": { "enableChangedPasswordNotification": {
"message": "Ask to update existing login" "message": "Be om att uppdatera befintlig inloggning"
}, },
"changedPasswordNotificationDesc": { "changedPasswordNotificationDesc": {
"message": "Ask to update a login's password when a change is detected on a website." "message": "Be om att uppdatera ett lösenord när en ändring upptäcks på en webbplats."
}, },
"notificationChangeDesc": { "notificationChangeDesc": {
"message": "Vill du uppdatera det här lösenordet i Bitwarden?" "message": "Vill du uppdatera det här lösenordet i Bitwarden?"
@@ -615,7 +615,7 @@
"message": "Uppdatera" "message": "Uppdatera"
}, },
"enableContextMenuItem": { "enableContextMenuItem": {
"message": "Show context menu options" "message": "Visa alternativ för snabbmenyn"
}, },
"contextMenuItemDesc": { "contextMenuItemDesc": {
"message": "Use a secondary click to access password generation and matching logins for the website. " "message": "Use a secondary click to access password generation and matching logins for the website. "
@@ -810,13 +810,13 @@
"message": "Uppdatering färdig" "message": "Uppdatering färdig"
}, },
"enableAutoTotpCopy": { "enableAutoTotpCopy": {
"message": "Copy TOTP automatically" "message": "Kopiera TOTP automatiskt"
}, },
"disableAutoTotpCopyDesc": { "disableAutoTotpCopyDesc": {
"message": "Om din inloggning har en autentiseringsnyckel kopplad till den, kommer TOTP-verifieringskoden att automatiskt kopieras till urklipp när du automatiskt fyller i inloggningen." "message": "Om din inloggning har en autentiseringsnyckel kopplad till den, kommer TOTP-verifieringskoden att automatiskt kopieras till urklipp när du automatiskt fyller i inloggningen."
}, },
"enableAutoBiometricsPrompt": { "enableAutoBiometricsPrompt": {
"message": "Ask for biometrics on launch" "message": "Be om biometri vid start"
}, },
"premiumRequired": { "premiumRequired": {
"message": "Premium krävs" "message": "Premium krävs"
@@ -1037,16 +1037,16 @@
"message": "Den här webbläsaren kan inte bearbeta U2F-förfrågningar i detta popup-fönster. Vill du öppna ett nytt fönster så att du kan logga in med U2F?" "message": "Den här webbläsaren kan inte bearbeta U2F-förfrågningar i detta popup-fönster. Vill du öppna ett nytt fönster så att du kan logga in med U2F?"
}, },
"enableFavicon": { "enableFavicon": {
"message": "Show website icons" "message": "Visa webbplatsikoner"
}, },
"faviconDesc": { "faviconDesc": {
"message": "Show a recognizable image next to each login." "message": "Visa en identifierbar bild bredvid varje inloggning."
}, },
"enableBadgeCounter": { "enableBadgeCounter": {
"message": "Show badge counter" "message": "Visa aktivitetsräknaren"
}, },
"badgeCounterDesc": { "badgeCounterDesc": {
"message": "Indicate how many logins you have for the current web page." "message": "Visa hur många inloggningar du har för den aktuella webbsidan."
}, },
"cardholderName": { "cardholderName": {
"message": "Kortinnehavarens namn" "message": "Kortinnehavarens namn"
@@ -1484,7 +1484,7 @@
"message": "Genom att markera denna ruta godkänner du följande:" "message": "Genom att markera denna ruta godkänner du följande:"
}, },
"acceptPoliciesRequired": { "acceptPoliciesRequired": {
"message": "Terms of Service and Privacy Policy have not been acknowledged." "message": "Användarvillkoren och Integritetspolicyn har inte accepterats."
}, },
"termsOfService": { "termsOfService": {
"message": "Användarvillkor" "message": "Användarvillkor"
@@ -1850,7 +1850,7 @@
} }
}, },
"vaultTimeoutTooLarge": { "vaultTimeoutTooLarge": {
"message": "Your vault timeout exceeds the restrictions set by your organization." "message": "Ditt valvs tidsgräns överskrider de begränsningar som fastställts av din organisation."
}, },
"vaultExportDisabled": { "vaultExportDisabled": {
"message": "Valvexport inaktiverad" "message": "Valvexport inaktiverad"
@@ -1969,9 +1969,12 @@
"message": "Key Connector-fel: säkerställ att Key Connector är tillgänglig och fungerar korrekt." "message": "Key Connector-fel: säkerställ att Key Connector är tillgänglig och fungerar korrekt."
}, },
"organizationIsDisabled": { "organizationIsDisabled": {
"message": "Organization is disabled." "message": "Organisationen är inaktiverad."
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Objekt i inaktiverade organisationer är inte åtkomliga. Kontakta organisationens ägare för att få hjälp."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Devre dışı kuruluşlardaki kayıtlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin." "message": "Devre dışı kuruluşlardaki kayıtlara erişilemez. Destek almak için kuruluş sahibinizle iletişime geçin."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Записи у вимкнених організаціях недоступні. Зверніться до власника вашої організації для отримання допомоги." "message": "Записи у вимкнених організаціях недоступні. Зверніться до власника вашої організації для отримання допомоги."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance." "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -618,7 +618,7 @@
"message": "显示上下文菜单选项" "message": "显示上下文菜单选项"
}, },
"contextMenuItemDesc": { "contextMenuItemDesc": {
"message": "使用辅助点击来访问网站的密码生成和匹配的登录项目。 " "message": "使用辅助点击来访问密码生成和匹配的网站登录项目。 "
}, },
"defaultUriMatchDetection": { "defaultUriMatchDetection": {
"message": "默认 URI 匹配检测", "message": "默认 URI 匹配检测",
@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "无法访问已禁用组织中的项目。请联系您的组织所有者获取协助。" "message": "无法访问已禁用组织中的项目。请联系您的组织所有者获取协助。"
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -618,7 +618,7 @@
"message": "顯示內容選單選項" "message": "顯示內容選單選項"
}, },
"contextMenuItemDesc": { "contextMenuItemDesc": {
"message": "使用輔助點選(右鍵選單)來存取網站的密碼產生和匹配的登入項目。 " "message": "使用輔助點選(右鍵選單)來存取密碼產生和匹配的網站登入項目。 "
}, },
"defaultUriMatchDetection": { "defaultUriMatchDetection": {
"message": "預設的 URI 一致性偵測", "message": "預設的 URI 一致性偵測",
@@ -1973,5 +1973,8 @@
}, },
"disabledOrganizationFilterError": { "disabledOrganizationFilterError": {
"message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。" "message": "無法存取已停用組織中的項目。請聯絡您組織的擁有者以獲取協助。"
},
"cardBrandMir": {
"message": "Mir"
} }
} }

View File

@@ -517,7 +517,7 @@ export default class MainBackground {
} }
async bootstrap() { async bootstrap() {
this.containerService.attachToWindow(window); this.containerService.attachToGlobal(window);
await this.stateService.init(); await this.stateService.init();

View File

@@ -156,7 +156,7 @@ export class BrowserApi {
static reloadExtension(win: Window) { static reloadExtension(win: Window) {
if (win != null) { if (win != null) {
return win.location.reload(true); return (win.location as any).reload(true);
} else { } else {
return chrome.runtime.reload(); return chrome.runtime.reload();
} }

View File

@@ -87,7 +87,7 @@ button.neutral {
} }
} }
@media (print) { @media print {
body { body {
display: none; display: none;
} }

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()"> <form #form (ngSubmit)="submit()">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/home">{{ "close" | i18n }}</a> <button type="button" routerLink="/home">{{ "close" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "appName" | i18n }}</span> <span class="title">{{ "appName" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "save" | i18n }}</span> <span [hidden]="form.loading">{{ "save" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/login">{{ "cancel" | i18n }}</a> <button type="button" routerLink="/login">{{ "cancel" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "passwordHint" | i18n }}</span> <span class="title">{{ "passwordHint" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "submit" | i18n }}</span> <span [hidden]="form.loading">{{ "submit" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>

View File

@@ -2,15 +2,17 @@
<div class="content"> <div class="content">
<div class="logo-image"></div> <div class="logo-image"></div>
<p class="lead text-center">{{ "loginOrCreateNewAccount" | i18n }}</p> <p class="lead text-center">{{ "loginOrCreateNewAccount" | i18n }}</p>
<a class="btn primary block" routerLink="/login" <button type="button" class="btn primary block" routerLink="/login">
><b>{{ "login" | i18n }}</b></a <b>{{ "login" | i18n }}</b>
> </button>
<button type="button" (click)="launchSsoBrowser()" class="btn block"> <button type="button" (click)="launchSsoBrowser()" class="btn block">
<i class="bwi bwi-bank" aria-hidden="true"></i> {{ "enterpriseSingleSignOn" | i18n }} <i class="bwi bwi-bank" aria-hidden="true"></i> {{ "enterpriseSingleSignOn" | i18n }}
</button> </button>
<a class="btn block" routerLink="/register">{{ "createAccount" | i18n }}</a> <button type="button" class="btn block" routerLink="/register">
{{ "createAccount" | i18n }}
</button>
</div> </div>
</div> </div>
<a routerLink="/environment" class="settings-icon"> <button type="button" routerLink="/environment" class="settings-icon">
<i class="bwi bwi-cog-f bwi-lg" aria-hidden="true"></i><span>&nbsp;{{ "settings" | i18n }}</span> <i class="bwi bwi-cog-f bwi-lg" aria-hidden="true"></i><span>&nbsp;{{ "settings" | i18n }}</span>
</a> </button>

View File

@@ -5,7 +5,7 @@
<span class="title">{{ "verifyIdentity" | i18n }}</span> <span class="title">{{ "verifyIdentity" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick *ngIf="!hideInput">{{ "unlock" | i18n }}</button> <button type="submit" *ngIf="!hideInput">{{ "unlock" | i18n }}</button>
</div> </div>
</header> </header>
<main tabindex="-1"> <main tabindex="-1">
@@ -41,7 +41,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword()" (click)="togglePassword()"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/home">{{ "cancel" | i18n }}</a> <button type="button" routerLink="/home">{{ "cancel" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "appName" | i18n }}</span> <span class="title">{{ "appName" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "login" | i18n }}</span> <span [hidden]="form.loading">{{ "login" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>
@@ -46,7 +46,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword()" (click)="togglePassword()"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"
@@ -65,7 +64,7 @@
</div> </div>
</div> </div>
<p class="text-center"> <p class="text-center">
<a routerLink="/hint">{{ "getMasterPasswordHint" | i18n }}</a> <button type="button" routerLink="/hint">{{ "getMasterPasswordHint" | i18n }}</button>
</p> </p>
<app-private-mode-warning></app-private-mode-warning> <app-private-mode-warning></app-private-mode-warning>
</main> </main>

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise" [formGroup]="formGroup"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise" [formGroup]="formGroup">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/home">{{ "cancel" | i18n }}</a> <button type="button" routerLink="/home">{{ "cancel" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "createAccount" | i18n }}</span> <span class="title">{{ "createAccount" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "submit" | i18n }}</span> <span [hidden]="form.loading">{{ "submit" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>
@@ -46,7 +46,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword()" (click)="togglePassword()"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"
@@ -94,7 +93,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword()" (click)="togglePassword()"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"

View File

@@ -1,5 +1,5 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { FormBuilder } from "@angular/forms"; import { UntypedFormBuilder } from "@angular/forms";
import { Router } from "@angular/router"; import { Router } from "@angular/router";
import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/components/register.component"; import { RegisterComponent as BaseRegisterComponent } from "@bitwarden/angular/components/register.component";
@@ -21,7 +21,7 @@ import { StateService } from "@bitwarden/common/abstractions/state.service";
export class RegisterComponent extends BaseRegisterComponent { export class RegisterComponent extends BaseRegisterComponent {
constructor( constructor(
formValidationErrorService: FormValidationErrorsService, formValidationErrorService: FormValidationErrorsService,
formBuilder: FormBuilder, formBuilder: UntypedFormBuilder,
authService: AuthService, authService: AuthService,
router: Router, router: Router,
i18nService: I18nService, i18nService: I18nService,

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/home">{{ "cancel" | i18n }}</a> <button type="button" routerLink="/home">{{ "cancel" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "setMasterPassword" | i18n }}</span> <span class="title">{{ "setMasterPassword" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "submit" | i18n }}</span> <span [hidden]="form.loading">{{ "submit" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>
@@ -64,7 +64,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword(false)" (click)="togglePassword(false)"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"
@@ -116,7 +115,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword(true)" (click)="togglePassword(true)"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"

View File

@@ -1,6 +1,6 @@
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/2fa">{{ "close" | i18n }}</a> <button type="button" routerLink="/2fa">{{ "close" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "twoStepOptions" | i18n }}</span> <span class="title">{{ "twoStepOptions" | i18n }}</span>

View File

@@ -1,7 +1,7 @@
<form id="two-factor-page" #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form id="two-factor-page" #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/login">{{ "back" | i18n }}</a> <button type="button" routerLink="/login">{{ "back" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ title }}</span> <span class="title">{{ title }}</span>
@@ -9,7 +9,6 @@
<div class="right"> <div class="right">
<button <button
type="submit" type="submit"
appBlurClick
[disabled]="form.loading" [disabled]="form.loading"
*ngIf=" *ngIf="
selectedProviderType != null && selectedProviderType != null &&

View File

@@ -7,7 +7,7 @@
<span class="title">{{ "updateMasterPassword" | i18n }}</span> <span class="title">{{ "updateMasterPassword" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "submit" | i18n }}</span> <span [hidden]="form.loading">{{ "submit" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>
@@ -53,7 +53,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword(false)" (click)="togglePassword(false)"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"
@@ -100,7 +99,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword(true)" (click)="togglePassword(true)"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"

View File

@@ -239,7 +239,6 @@ registerLocaleData(localeZhTw, "zh-TW");
RemovePasswordComponent, RemovePasswordComponent,
VaultSelectComponent, VaultSelectComponent,
], ],
entryComponents: [],
providers: [CurrencyPipe, DatePipe], providers: [CurrencyPipe, DatePipe],
bootstrap: [AppComponent], bootstrap: [AppComponent],
}) })

View File

@@ -23,7 +23,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePassword()" (click)="togglePassword()"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"
@@ -43,7 +42,7 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" appBlurClick> <button type="submit" class="btn btn-primary btn-submit">
<span>{{ "ok" | i18n }}</span> <span>{{ "ok" | i18n }}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal"> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">

View File

@@ -25,7 +25,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="toggleVisibility()" (click)="toggleVisibility()"
[attr.aria-pressed]="showPin" [attr.aria-pressed]="showPin"
@@ -53,7 +52,7 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary btn-submit" appBlurClick> <button type="submit" class="btn btn-primary btn-submit">
<span>{{ "ok" | i18n }}</span> <span>{{ "ok" | i18n }}</span>
</button> </button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal"> <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">

View File

@@ -1,7 +1,7 @@
<header> <header>
<div class="left"> <div class="left">
<app-pop-out [show]="!comingFromAddEdit"></app-pop-out> <app-pop-out [show]="!comingFromAddEdit"></app-pop-out>
<button type="button" appBlurClick (click)="close()" *ngIf="comingFromAddEdit"> <button type="button" (click)="close()" *ngIf="comingFromAddEdit">
{{ "cancel" | i18n }} {{ "cancel" | i18n }}
</button> </button>
</div> </div>
@@ -9,7 +9,7 @@
<span class="title">{{ "generator" | i18n }}</span> <span class="title">{{ "generator" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="button" appBlurClick (click)="select()" *ngIf="comingFromAddEdit"> <button type="button" (click)="select()" *ngIf="comingFromAddEdit">
{{ "select" | i18n }} {{ "select" | i18n }}
</button> </button>
</div> </div>
@@ -33,7 +33,6 @@
<button <button
type="button" type="button"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'regeneratePassword' | i18n }}" appA11yTitle="{{ 'regeneratePassword' | i18n }}"
(click)="regenerate()" (click)="regenerate()"
> >
@@ -56,7 +55,6 @@
<button <button
type="button" type="button"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'regenerateUsername' | i18n }}" appA11yTitle="{{ 'regenerateUsername' | i18n }}"
(click)="regenerate()" (click)="regenerate()"
[disabled]="form.loading" [disabled]="form.loading"

View File

@@ -1,6 +1,6 @@
<header> <header>
<div class="left"> <div class="left">
<button type="button" appBlurClick type="button" (click)="close()"> <button type="button" type="button" (click)="close()">
<span class="header-icon" aria-hidden="true"><i class="bwi bwi-angle-left"></i></span> <span class="header-icon" aria-hidden="true"><i class="bwi bwi-angle-left"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</button> </button>
@@ -9,7 +9,7 @@
<span class="title">{{ "passwordHistory" | i18n }}</span> <span class="title">{{ "passwordHistory" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="button" appBlurClick type="button" (click)="clear()"> <button type="button" type="button" (click)="clear()">
{{ "clear" | i18n }} {{ "clear" | i18n }}
</button> </button>
</div> </div>

View File

@@ -1,4 +1,3 @@
import "core-js/stable"; import "core-js/stable";
import "date-input-polyfill"; import "date-input-polyfill";
import "web-animations-js";
import "zone.js/dist/zone"; import "zone.js/dist/zone";

View File

@@ -56,7 +56,7 @@ app-home {
margin-top: 10px; margin-top: 10px;
} }
a.settings-icon { button.settings-icon {
position: absolute; position: absolute;
top: 10px; top: 10px;
left: 10px; left: 10px;

View File

@@ -11,4 +11,4 @@
@import "plugins.scss"; @import "plugins.scss";
@import "environment.scss"; @import "environment.scss";
@import "pages.scss"; @import "pages.scss";
@import "~@angular/cdk/overlay-prebuilt.css"; @import "@angular/cdk/overlay-prebuilt.css";

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<header> <header>
<div class="left"> <div class="left">
<button type="button" appBlurClick (click)="cancel()">{{ "cancel" | i18n }}</button> <button type="button" (click)="cancel()">{{ "cancel" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ title }}</span> <span class="title">{{ title }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading || disableSend"> <button type="submit" [disabled]="form.loading || disableSend">
<span [hidden]="form.loading">{{ "save" | i18n }}</span> <span [hidden]="form.loading">{{ "save" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>
@@ -226,7 +226,6 @@
type="button" type="button"
class="row-btn" class="row-btn"
appStopClick appStopClick
appBlurClick
appA11yTitle="{{ 'toggleVisibility' | i18n }}" appA11yTitle="{{ 'toggleVisibility' | i18n }}"
(click)="togglePasswordVisible()" (click)="togglePasswordVisible()"
[attr.aria-pressed]="showPassword" [attr.aria-pressed]="showPassword"
@@ -300,7 +299,6 @@
type="button" type="button"
class="box-content-row" class="box-content-row"
appStopClick appStopClick
appBlurClick
(click)="delete()" (click)="delete()"
[appApiAction]="deletePromise" [appApiAction]="deletePromise"
#deleteBtn #deleteBtn

View File

@@ -18,7 +18,6 @@
<div class="right"> <div class="right">
<button <button
type="button" type="button"
appBlurClick
(click)="addSend()" (click)="addSend()"
appA11yTitle="{{ 'addSend' | i18n }}" appA11yTitle="{{ 'addSend' | i18n }}"
[disabled]="disableSend" [disabled]="disableSend"
@@ -56,7 +55,6 @@
type="button" type="button"
class="box-content-row" class="box-content-row"
appStopClick appStopClick
appBlurClick
(click)="selectType(sendType.Text)" (click)="selectType(sendType.Text)"
> >
<div class="row-main"> <div class="row-main">
@@ -70,7 +68,6 @@
type="button" type="button"
class="box-content-row" class="box-content-row"
appStopClick appStopClick
appBlurClick
(click)="selectType(sendType.File)" (click)="selectType(sendType.File)"
> >
<div class="row-main"> <div class="row-main">

View File

@@ -1,6 +1,6 @@
<header> <header>
<div class="left"> <div class="left">
<button type="button" appBlurClick (click)="back()"> <button type="button" (click)="back()">
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span> <span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</button> </button>
@@ -21,7 +21,6 @@
<div class="right"> <div class="right">
<button <button
type="button" type="button"
appBlurClick
(click)="addSend()" (click)="addSend()"
appA11yTitle="{{ 'addSend' | i18n }}" appA11yTitle="{{ 'addSend' | i18n }}"
[disabled]="disableSend" [disabled]="disableSend"

View File

@@ -1,16 +1,16 @@
<form #form (ngSubmit)="submit()"> <form #form (ngSubmit)="submit()">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/tabs/settings"> <button type="button" routerLink="/tabs/settings">
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span> <span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</a> </button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "excludedDomains" | i18n }}</span> <span class="title">{{ "excludedDomains" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick>{{ "save" | i18n }}</button> <button type="submit">{{ "save" | i18n }}</button>
</div> </div>
</header> </header>
<main tabindex="-1"> <main tabindex="-1">
@@ -73,7 +73,6 @@
<button <button
type="button" type="button"
appStopClick appStopClick
appBlurClick
(click)="addUri()" (click)="addUri()"
class="box-content-row box-content-row-newmulti" class="box-content-row box-content-row-newmulti"
> >

View File

@@ -22,6 +22,7 @@ const BroadcasterSubscriptionId = "excludedDomains";
}) })
export class ExcludedDomainsComponent implements OnInit, OnDestroy { export class ExcludedDomainsComponent implements OnInit, OnDestroy {
excludedDomains: ExcludedDomain[] = []; excludedDomains: ExcludedDomain[] = [];
existingExcludedDomains: ExcludedDomain[] = [];
currentUris: string[]; currentUris: string[];
loadCurrentUrisTimeout: number; loadCurrentUrisTimeout: number;
@@ -39,6 +40,7 @@ export class ExcludedDomainsComponent implements OnInit, OnDestroy {
if (savedDomains) { if (savedDomains) {
for (const uri of Object.keys(savedDomains)) { for (const uri of Object.keys(savedDomains)) {
this.excludedDomains.push({ uri: uri, showCurrentUris: false }); this.excludedDomains.push({ uri: uri, showCurrentUris: false });
this.existingExcludedDomains.push({ uri: uri, showCurrentUris: false });
} }
} }
@@ -78,20 +80,27 @@ export class ExcludedDomainsComponent implements OnInit, OnDestroy {
async submit() { async submit() {
const savedDomains: { [name: string]: null } = {}; const savedDomains: { [name: string]: null } = {};
const newExcludedDomains = this.getNewlyAddedDomians(this.excludedDomains);
for (const domain of this.excludedDomains) { for (const domain of this.excludedDomains) {
if (domain.uri && domain.uri !== "") { const resp = newExcludedDomains.filter((e) => e.uri === domain.uri);
const validDomain = Utils.getHostname(domain.uri); if (resp.length === 0) {
if (!validDomain) { savedDomains[domain.uri] = null;
this.platformUtilsService.showToast( } else {
"error", if (domain.uri && domain.uri !== "") {
null, const validDomain = Utils.getHostname(domain.uri);
this.i18nService.t("excludedDomainsInvalidDomain", domain.uri) if (!validDomain) {
); this.platformUtilsService.showToast(
return; "error",
null,
this.i18nService.t("excludedDomainsInvalidDomain", domain.uri)
);
return;
}
savedDomains[validDomain] = null;
} }
savedDomains[validDomain] = null;
} }
} }
await this.stateService.setNeverDomains(savedDomains); await this.stateService.setNeverDomains(savedDomains);
this.router.navigate(["/tabs/settings"]); this.router.navigate(["/tabs/settings"]);
} }
@@ -100,6 +109,14 @@ export class ExcludedDomainsComponent implements OnInit, OnDestroy {
return index; return index;
} }
getNewlyAddedDomians(domain: ExcludedDomain[]): ExcludedDomain[] {
const result = this.excludedDomains.filter(
(newDomain) =>
!this.existingExcludedDomains.some((oldDomain) => newDomain.uri === oldDomain.uri)
);
return result;
}
toggleUriInput(domain: ExcludedDomain) { toggleUriInput(domain: ExcludedDomain) {
domain.showCurrentUris = !domain.showCurrentUris; domain.showCurrentUris = !domain.showCurrentUris;
} }

View File

@@ -1,16 +1,16 @@
<form (ngSubmit)="submit()" [formGroup]="exportForm"> <form (ngSubmit)="submit()" [formGroup]="exportForm">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/tabs/settings"> <button type="button" routerLink="/tabs/settings">
<span class="header-icon" aria-hidden="true"><i class="bwi bwi-angle-left"></i></span> <span class="header-icon" aria-hidden="true"><i class="bwi bwi-angle-left"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</a> </button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "exportVault" | i18n }}</span> <span class="title">{{ "exportVault" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button appBlurClick type="submit" [disabled]="!exportForm.enabled"> <button type="submit" [disabled]="!exportForm.enabled">
{{ "submit" | i18n }} {{ "submit" | i18n }}
</button> </button>
</div> </div>

View File

@@ -1,5 +1,5 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { FormBuilder } from "@angular/forms"; import { UntypedFormBuilder } from "@angular/forms";
import { Router } from "@angular/router"; import { Router } from "@angular/router";
import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component"; import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component";
@@ -28,7 +28,7 @@ export class ExportComponent extends BaseExportComponent {
private router: Router, private router: Router,
logService: LogService, logService: LogService,
userVerificationService: UserVerificationService, userVerificationService: UserVerificationService,
formBuilder: FormBuilder, formBuilder: UntypedFormBuilder,
fileDownloadService: FileDownloadService fileDownloadService: FileDownloadService
) { ) {
super( super(

View File

@@ -1,13 +1,13 @@
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise"> <form #form (ngSubmit)="submit()" [appApiAction]="formPromise">
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/folders">{{ "cancel" | i18n }}</a> <button type="button" routerLink="/folders">{{ "cancel" | i18n }}</button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ title }}</span> <span class="title">{{ title }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button type="submit" appBlurClick [disabled]="form.loading"> <button type="submit" [disabled]="form.loading">
<span [hidden]="form.loading">{{ "save" | i18n }}</span> <span [hidden]="form.loading">{{ "save" | i18n }}</span>
<i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i> <i class="bwi bwi-spinner bwi-lg bwi-spin" [hidden]="!form.loading" aria-hidden="true"></i>
</button> </button>
@@ -34,7 +34,6 @@
type="button" type="button"
class="box-content-row" class="box-content-row"
appStopClick appStopClick
appBlurClick
(click)="delete()" (click)="delete()"
[appApiAction]="deletePromise" [appApiAction]="deletePromise"
#deleteBtn #deleteBtn

View File

@@ -1,20 +1,15 @@
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/tabs/settings"> <button type="button" routerLink="/tabs/settings">
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span> <span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</a> </button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "folders" | i18n }}</span> <span class="title">{{ "folders" | i18n }}</span>
</h1> </h1>
<div class="right"> <div class="right">
<button <button type="button" (click)="addFolder()" appA11yTitle="{{ 'addFolder' | i18n }}">
type="button"
appBlurClick
(click)="addFolder()"
appA11yTitle="{{ 'addFolder' | i18n }}"
>
<i class="bwi bwi-plus bwi-lg bwi-fw" aria-hidden="true"></i> <i class="bwi bwi-plus bwi-lg bwi-fw" aria-hidden="true"></i>
</button> </button>
</div> </div>

View File

@@ -1,9 +1,9 @@
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/tabs/settings"> <button type="button" routerLink="/tabs/settings">
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span> <span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</a> </button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "options" | i18n }}</span> <span class="title">{{ "options" | i18n }}</span>

View File

@@ -1,9 +1,9 @@
<header> <header>
<div class="left"> <div class="left">
<a routerLink="/tabs/settings"> <button type="button" routerLink="/tabs/settings">
<span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span> <span class="header-icon"><i class="bwi bwi-angle-left" aria-hidden="true"></i></span>
<span>{{ "back" | i18n }}</span> <span>{{ "back" | i18n }}</span>
</a> </button>
</div> </div>
<h1 class="center"> <h1 class="center">
<span class="title">{{ "premiumMembership" | i18n }}</span> <span class="title">{{ "premiumMembership" | i18n }}</span>
@@ -42,13 +42,12 @@
</li> </li>
</ul> </ul>
<p class="text-center lead">{{ priceString }}</p> <p class="text-center lead">{{ priceString }}</p>
<button type="button" class="btn primary block" appBlurClick (click)="purchase()"> <button type="button" class="btn primary block" (click)="purchase()">
<b>{{ "premiumPurchase" | i18n }}</b> <b>{{ "premiumPurchase" | i18n }}</b>
</button> </button>
<button <button
#refreshBtn #refreshBtn
type="button" type="button"
appBlurClick
(click)="refresh()" (click)="refresh()"
[disabled]="refreshBtn.loading" [disabled]="refreshBtn.loading"
[appApiAction]="refreshPromise" [appApiAction]="refreshPromise"
@@ -65,7 +64,7 @@
<ng-container *ngIf="isPremium"> <ng-container *ngIf="isPremium">
<p class="text-center lead">{{ "premiumCurrentMember" | i18n }}</p> <p class="text-center lead">{{ "premiumCurrentMember" | i18n }}</p>
<p class="text-center">{{ "premiumCurrentMemberThanks" | i18n }}</p> <p class="text-center">{{ "premiumCurrentMemberThanks" | i18n }}</p>
<button type="button" class="btn block primary" appBlurClick (click)="manage()"> <button type="button" class="btn block primary" (click)="manage()">
<b>{{ "premiumManage" | i18n }}</b> <b>{{ "premiumManage" | i18n }}</b>
</button> </button>
</ng-container> </ng-container>

Some files were not shown because too many files have changed in this diff Show More