mirror of
https://github.com/bitwarden/mobile
synced 2025-12-05 23:53:33 +00:00
Compare commits
13 Commits
vault/pm-7
...
v2024.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79da56d94e | ||
|
|
e918307a24 | ||
|
|
ecb0cbce14 | ||
|
|
5e549ff2a2 | ||
|
|
c60fc28289 | ||
|
|
ad308c97c9 | ||
|
|
7f92358d9b | ||
|
|
5338fdea79 | ||
|
|
36c32fbabd | ||
|
|
6bf7a492c6 | ||
|
|
6b54fadacc | ||
|
|
06fe3f78f8 | ||
|
|
250d40663b |
6
.github/CODEOWNERS
vendored
6
.github/CODEOWNERS
vendored
@@ -30,14 +30,14 @@ src/watchOS @bitwarden/team-vault-dev
|
|||||||
src/Core/Services/EmailForwarders @bitwarden/team-tools-dev
|
src/Core/Services/EmailForwarders @bitwarden/team-tools-dev
|
||||||
|
|
||||||
## Crowdin Sync files ##
|
## Crowdin Sync files ##
|
||||||
src/Core/Resources/Localization @bitwarden/team-tools-dev
|
src/App/Resources @bitwarden/team-tools-dev
|
||||||
src/watchOS/bitwarden/bitwarden\ WatchKit\ Extension/Localization @bitwarden/team-tools-dev
|
src/watchOS/bitwarden/bitwarden\ WatchKit\ Extension/Localization @bitwarden/team-tools-dev
|
||||||
store/apple @bitwarden/team-tools-dev
|
store/apple @bitwarden/team-tools-dev
|
||||||
store/google @bitwarden/team-tools-dev
|
store/google @bitwarden/team-tools-dev
|
||||||
|
|
||||||
## Locales ##
|
## Locales ##
|
||||||
src/Core/Resources/Localization/AppResources.Designer.cs
|
src/App/Resources/AppResources.Designer.cs
|
||||||
src/Core/Resources/Localization/AppResources.resx
|
src/App/Resources/AppResources.resx
|
||||||
src/watchOS/bitwarden/bitwarden\ WatchKit\ Extension/Localization/en.lproj
|
src/watchOS/bitwarden/bitwarden\ WatchKit\ Extension/Localization/en.lproj
|
||||||
store/apple/en
|
store/apple/en
|
||||||
store/google/en
|
store/google/en
|
||||||
|
|||||||
77
.github/workflows/build.yml
vendored
77
.github/workflows/build.yml
vendored
@@ -146,7 +146,10 @@ jobs:
|
|||||||
- name: Increment version
|
- name: Increment version
|
||||||
run: |
|
run: |
|
||||||
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER))
|
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER))
|
||||||
echo "##### Setting Android Version Code to $BUILD_NUMBER" | tee -a $GITHUB_STEP_SUMMARY
|
|
||||||
|
echo "########################################"
|
||||||
|
echo "##### Setting Version Code $BUILD_NUMBER"
|
||||||
|
echo "########################################"
|
||||||
|
|
||||||
sed -i "s/android:versionCode=\"1\"/android:versionCode=\"$BUILD_NUMBER\"/" \
|
sed -i "s/android:versionCode=\"1\"/android:versionCode=\"$BUILD_NUMBER\"/" \
|
||||||
./${{ env.android_folder_path_bash }}/AndroidManifest.xml
|
./${{ env.android_folder_path_bash }}/AndroidManifest.xml
|
||||||
@@ -295,8 +298,7 @@ jobs:
|
|||||||
name: F-Droid Build
|
name: F-Droid Build
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
env:
|
env:
|
||||||
android_folder_path: src\App\Platforms\Android
|
android_folder_path: src/App/Platforms/Android
|
||||||
android_folder_path_bash: src/App/Platforms/Android
|
|
||||||
android_manifest_path: src/App/Platforms/Android/AndroidManifest.xml
|
android_manifest_path: src/App/Platforms/Android/AndroidManifest.xml
|
||||||
steps:
|
steps:
|
||||||
- name: Setup NuGet
|
- name: Setup NuGet
|
||||||
@@ -348,14 +350,15 @@ jobs:
|
|||||||
CONTAINER_NAME: mobile
|
CONTAINER_NAME: mobile
|
||||||
FILE: app_fdroid-keystore.jks
|
FILE: app_fdroid-keystore.jks
|
||||||
run: |
|
run: |
|
||||||
|
mkdir -p $HOME/secrets
|
||||||
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME --name $FILE \
|
az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME --name $FILE \
|
||||||
--file ${{ env.android_folder_path_bash }}/$FILE --output none
|
--file $HOME/secrets/$FILE --output none
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Increment version
|
- name: Increment version
|
||||||
run: |
|
run: |
|
||||||
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER))
|
BUILD_NUMBER=$((3000 + $GITHUB_RUN_NUMBER))
|
||||||
echo "##### Setting F-Droid Version Code to $BUILD_NUMBER" | tee -a $GITHUB_STEP_SUMMARY
|
echo "##### Setting Version Code $BUILD_NUMBER"
|
||||||
|
|
||||||
sed -i "s/android:versionCode=\"1\"/android:versionCode=\"$BUILD_NUMBER\"/" \
|
sed -i "s/android:versionCode=\"1\"/android:versionCode=\"$BUILD_NUMBER\"/" \
|
||||||
./${{ env.android_manifest_path }}
|
./${{ env.android_manifest_path }}
|
||||||
@@ -363,14 +366,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Clean for F-Droid
|
- name: Clean for F-Droid
|
||||||
run: |
|
run: |
|
||||||
$directoryBuildProps = $($env:GITHUB_WORKSPACE + "/Directory.Build.props");
|
$appPath = $($env:GITHUB_WORKSPACE + "/${{ env.main_app_project_path }}");
|
||||||
|
$corePath = $($env:GITHUB_WORKSPACE + "/src/Core/Core.csproj");
|
||||||
|
|
||||||
$androidManifest = $($env:GITHUB_WORKSPACE + "/${{ env.android_manifest_path }}");
|
$androidManifest = $($env:GITHUB_WORKSPACE + "/${{ env.android_manifest_path }}");
|
||||||
|
|
||||||
Write-Output "##### Back up project files"
|
Write-Output "##### Back up project files"
|
||||||
|
|
||||||
Copy-Item $androidManifest $($androidManifest + ".original");
|
Copy-Item $androidManifest $($androidManifest + ".original");
|
||||||
Copy-Item $directoryBuildProps $($directoryBuildProps + ".original");
|
Copy-Item $appPath $($appPath + ".original");
|
||||||
|
|
||||||
Write-Output "##### Cleanup Android Manifest"
|
Write-Output "##### Cleanup Android Manifest"
|
||||||
|
|
||||||
@@ -382,34 +386,33 @@ jobs:
|
|||||||
|
|
||||||
$xml.Save($androidManifest);
|
$xml.Save($androidManifest);
|
||||||
|
|
||||||
Write-Output "##### Enabling FDROID constant"
|
|
||||||
|
|
||||||
(Get-Content $directoryBuildProps).Replace('<!-- <CustomConstants>FDROID</CustomConstants> -->', '<CustomConstants>FDROID</CustomConstants>') | Set-Content $directoryBuildProps
|
|
||||||
|
|
||||||
- name: Restore packages
|
- name: Restore packages
|
||||||
run: dotnet restore
|
run: dotnet restore
|
||||||
|
|
||||||
- name: Build & Sign F-Droid
|
- name: Build for F-Droid
|
||||||
|
run: |
|
||||||
|
$configuration = "Release";
|
||||||
|
$projToBuild = $($env:GITHUB_WORKSPACE + "/${{ env.main_app_project_path }}");
|
||||||
|
|
||||||
|
Write-Output "##### Build $configuration FDROID"
|
||||||
|
|
||||||
|
dotnet build $projToBuild -c $configuration -f ${{ env.target-net-version }}-android /p:CustomConstants="FDROID"
|
||||||
|
|
||||||
|
- name: Sign for F-Droid
|
||||||
env:
|
env:
|
||||||
FDROID_KEYSTORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }}
|
FDROID_KEYSTORE_PASSWORD: ${{ secrets.FDROID_KEYSTORE_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
$projToBuild = "$($env:GITHUB_WORKSPACE)\${{ env.main_app_project_path }}";
|
$projToBuild = $($env:GITHUB_WORKSPACE + "/${{ env.main_app_project_path }}");
|
||||||
$packageName = "com.x8bit.bitwarden";
|
$packageName = "com.x8bit.bitwarden";
|
||||||
|
|
||||||
Write-Output "##### Sign FDroid"
|
Write-Output "##### Sign FDroid"
|
||||||
|
|
||||||
$signingFdroidKeyStore = "$($env:GITHUB_WORKSPACE)\${{ env.android_folder_path }}\app_fdroid-keystore.jks"
|
dotnet publish $projToBuild -c Release -f ${{ env.target-net-version }}-android /p:AndroidKeyStore=true /p:AndroidSigningKeyStore=$("app_fdroid-keystore.jks") /p:AndroidSigningKeyAlias=bitwarden /p:AndroidSigningKeyPass="$($env:FDROID_KEYSTORE_PASSWORD)" /p:AndroidSigningStorePass="$($env:FDROID_KEYSTORE_PASSWORD)" /p:CustomConstants="FDROID" --no-restore
|
||||||
dotnet build $projToBuild -c Release -f ${{ env.target-net-version }}-android `
|
|
||||||
/p:AndroidKeyStore=true `
|
|
||||||
/p:AndroidSigningKeyStore=$signingFdroidKeyStore `
|
|
||||||
/p:AndroidSigningKeyAlias=bitwarden `
|
|
||||||
/p:AndroidSigningKeyPass="$($env:FDROID_KEYSTORE_PASSWORD)" `
|
|
||||||
/p:AndroidSigningStorePass="$($env:FDROID_KEYSTORE_PASSWORD)" ` --no-restore
|
|
||||||
|
|
||||||
Write-Output "##### Copy FDroid apk to project root"
|
Write-Output "##### Copy FDroid apk to project root"
|
||||||
|
|
||||||
$signedApkPath = "$($env:GITHUB_WORKSPACE)\${{ env.main_app_folder_path }}\bin\Release\${{ env.target-net-version }}-android\$($packageName)-Signed.apk";
|
$signedApkPath = $($env:GITHUB_WORKSPACE + "/${{ env.main_app_folder_path }}/bin/Release/${{ env.target-net-version }}-android/publish/$($packageName)-Signed.apk");
|
||||||
$signedApkDestPath = "$($env:GITHUB_WORKSPACE)\com.x8bit.bitwarden-fdroid.apk";
|
$signedApkDestPath = $($env:GITHUB_WORKSPACE + "/com.x8bit.bitwarden-fdroid.apk");
|
||||||
|
|
||||||
Copy-Item $signedApkPath $signedApkDestPath
|
Copy-Item $signedApkPath $signedApkDestPath
|
||||||
|
|
||||||
@@ -520,7 +523,9 @@ jobs:
|
|||||||
- name: Increment version
|
- name: Increment version
|
||||||
run: |
|
run: |
|
||||||
BUILD_NUMBER=$((100 + $GITHUB_RUN_NUMBER))
|
BUILD_NUMBER=$((100 + $GITHUB_RUN_NUMBER))
|
||||||
echo "##### Setting iOS CFBundleVersion to $BUILD_NUMBER" | tee -a $GITHUB_STEP_SUMMARY
|
|
||||||
|
echo "##### Setting CFBundleVersion $BUILD_NUMBER"
|
||||||
|
echo "### CFBundleVersion $BUILD_NUMBER" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
perl -0777 -pi.bak -e 's/<key>CFBundleVersion<\/key>\s*<string>1<\/string>/<key>CFBundleVersion<\/key>\n\t<string>'"$BUILD_NUMBER"'<\/string>/' ./${{ env.ios_folder_path }}/Info.plist
|
perl -0777 -pi.bak -e 's/<key>CFBundleVersion<\/key>\s*<string>1<\/string>/<key>CFBundleVersion<\/key>\n\t<string>'"$BUILD_NUMBER"'<\/string>/' ./${{ env.ios_folder_path }}/Info.plist
|
||||||
perl -0777 -pi.bak -e 's/<key>CFBundleVersion<\/key>\s*<string>1<\/string>/<key>CFBundleVersion<\/key>\n\t<string>'"$BUILD_NUMBER"'<\/string>/' ./src/iOS.Extension/Info.plist
|
perl -0777 -pi.bak -e 's/<key>CFBundleVersion<\/key>\s*<string>1<\/string>/<key>CFBundleVersion<\/key>\n\t<string>'"$BUILD_NUMBER"'<\/string>/' ./src/iOS.Extension/Info.plist
|
||||||
@@ -757,11 +762,27 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check if any job failed
|
- name: Check if any job failed
|
||||||
if: |
|
if: |
|
||||||
(github.ref == 'refs/heads/main'
|
(github.ref == 'refs/heads/main')
|
||||||
|| github.ref == 'refs/heads/rc'
|
|| (github.ref == 'refs/heads/rc')
|
||||||
|| github.ref == 'refs/heads/hotfix-rc')
|
|| (github.ref == 'refs/heads/hotfix-rc')
|
||||||
&& contains(needs.*.result, 'failure')
|
env:
|
||||||
run: exit 1
|
CLOC_STATUS: ${{ needs.cloc.result }}
|
||||||
|
ANDROID_STATUS: ${{ needs.android.result }}
|
||||||
|
F_DROID_STATUS: ${{ needs.f-droid.result }}
|
||||||
|
IOS_STATUS: ${{ needs.ios.result }}
|
||||||
|
CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }}
|
||||||
|
run: |
|
||||||
|
if [ "$CLOC_STATUS" = "failure" ]; then
|
||||||
|
exit 1
|
||||||
|
elif [ "$ANDROID_STATUS" = "failure" ]; then
|
||||||
|
exit 1
|
||||||
|
elif [ "$F_DROID_STATUS" = "failure" ]; then
|
||||||
|
exit 1
|
||||||
|
elif [ "$IOS_STATUS" = "failure" ]; then
|
||||||
|
exit 1
|
||||||
|
elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
||||||
|
|||||||
53
.github/workflows/cleanup-rc-branch.yml
vendored
53
.github/workflows/cleanup-rc-branch.yml
vendored
@@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
name: Cleanup RC Branch
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v**
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
delete-rc:
|
|
||||||
name: Delete RC Branch
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: Login to Azure - CI Subscription
|
|
||||||
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
|
||||||
with:
|
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
|
||||||
|
|
||||||
- name: Retrieve bot secrets
|
|
||||||
id: retrieve-bot-secrets
|
|
||||||
uses: bitwarden/gh-actions/get-keyvault-secrets@main
|
|
||||||
with:
|
|
||||||
keyvault: bitwarden-ci
|
|
||||||
secrets: "github-pat-bitwarden-devops-bot-repo-scope"
|
|
||||||
|
|
||||||
- name: Checkout main
|
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
|
||||||
with:
|
|
||||||
ref: main
|
|
||||||
token: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
|
||||||
|
|
||||||
- name: Check if a RC branch exists
|
|
||||||
id: branch-check
|
|
||||||
run: |
|
|
||||||
hotfix_rc_branch_check=$(git ls-remote --heads origin hotfix-rc | wc -l)
|
|
||||||
rc_branch_check=$(git ls-remote --heads origin rc | wc -l)
|
|
||||||
|
|
||||||
if [[ "${hotfix_rc_branch_check}" -gt 0 ]]; then
|
|
||||||
echo "hotfix-rc branch exists." | tee -a $GITHUB_STEP_SUMMARY
|
|
||||||
echo "name=hotfix-rc" >> $GITHUB_OUTPUT
|
|
||||||
elif [[ "${rc_branch_check}" -gt 0 ]]; then
|
|
||||||
echo "rc branch exists." | tee -a $GITHUB_STEP_SUMMARY
|
|
||||||
echo "name=rc" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Delete RC branch
|
|
||||||
env:
|
|
||||||
BRANCH_NAME: ${{ steps.branch-check.outputs.name }}
|
|
||||||
run: |
|
|
||||||
if ! [[ -z "$BRANCH_NAME" ]]; then
|
|
||||||
git push --quiet origin --delete $BRANCH_NAME
|
|
||||||
echo "Deleted $BRANCH_NAME branch." | tee -a $GITHUB_STEP_SUMMARY
|
|
||||||
fi
|
|
||||||
22
.github/workflows/version-auto-bump.yml
vendored
22
.github/workflows/version-auto-bump.yml
vendored
@@ -11,6 +11,24 @@ jobs:
|
|||||||
name: Bump Mobile Version
|
name: Bump Mobile Version
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
|
- name: Checkout Branch
|
||||||
|
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||||
|
|
||||||
|
- name: Calculate bumped version
|
||||||
|
id: version
|
||||||
|
env:
|
||||||
|
RELEASE_TAG: ${{ github.ref }}
|
||||||
|
run: |
|
||||||
|
CURR_MAJOR=$(echo $RELEASE_TAG | sed -r 's/refs\/tags\/v([0-9]{4}\.[0-9]{1,2})\.([0-9]{1,2})/\1/')
|
||||||
|
CURR_PATCH=$(echo $RELEASE_TAG | sed -r 's/refs\/tags\/v([0-9]{4}\.[0-9]{1,2})\.([0-9]{1,2})/\2/')
|
||||||
|
echo "Current Major: $CURR_MAJOR"
|
||||||
|
echo "Current Patch: $CURR_PATCH"
|
||||||
|
|
||||||
|
NEW_PATCH=$((CURR_PATCH+1))
|
||||||
|
NEW_VER=$CURR_MAJOR.$NEW_PATCH
|
||||||
|
echo "New Version: $NEW_VER"
|
||||||
|
echo "new_version=$NEW_VER" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
- name: Login to Azure - CI Subscription
|
||||||
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
||||||
with:
|
with:
|
||||||
@@ -23,9 +41,9 @@ jobs:
|
|||||||
keyvault: bitwarden-ci
|
keyvault: bitwarden-ci
|
||||||
secrets: "github-pat-bitwarden-devops-bot-repo-scope"
|
secrets: "github-pat-bitwarden-devops-bot-repo-scope"
|
||||||
|
|
||||||
- name: Trigger Version Bump workflow
|
- name: "Bump version to ${{ steps.version.outputs.new_version }}"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
GH_TOKEN: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
||||||
run: |
|
run: |
|
||||||
echo '{"cut_rc_branch": "false"}' | \
|
echo '{"cut_rc_branch": "false", "version_number": "${{ steps.version.outputs.new_version }}"}' | \
|
||||||
gh workflow run version-bump.yml --json --repo bitwarden/mobile
|
gh workflow run version-bump.yml --json --repo bitwarden/mobile
|
||||||
160
.github/workflows/version-bump.yml
vendored
160
.github/workflows/version-bump.yml
vendored
@@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
name: Version Bump
|
name: Version Bump
|
||||||
|
run-name: Version Bump - v${{ inputs.version_number }}
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version_number_override:
|
version_number:
|
||||||
description: "New version override (leave blank for automatic calculation, example: '2024.1.0')"
|
description: "New version (example: '2024.1.0')"
|
||||||
required: false
|
required: true
|
||||||
type: string
|
|
||||||
cut_rc_branch:
|
cut_rc_branch:
|
||||||
description: "Cut RC branch?"
|
description: "Cut RC branch?"
|
||||||
default: true
|
default: true
|
||||||
@@ -15,16 +15,22 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
bump_version:
|
bump_version:
|
||||||
name: Bump Version
|
name: "Bump Version to v${{ inputs.version_number }}"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
outputs:
|
|
||||||
version: ${{ steps.set-final-version-output.outputs.version }}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Validate version input
|
- name: Login to Azure - CI Subscription
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
||||||
uses: bitwarden/gh-actions/version-check@main
|
|
||||||
with:
|
with:
|
||||||
version: ${{ inputs.version_number_override }}
|
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
||||||
|
|
||||||
|
- name: Retrieve secrets
|
||||||
|
id: retrieve-secrets
|
||||||
|
uses: bitwarden/gh-actions/get-keyvault-secrets@main
|
||||||
|
with:
|
||||||
|
keyvault: "bitwarden-ci"
|
||||||
|
secrets: "github-gpg-private-key,
|
||||||
|
github-gpg-private-key-passphrase,
|
||||||
|
github-pat-bitwarden-devops-bot-repo-scope"
|
||||||
|
|
||||||
- name: Checkout Branch
|
- name: Checkout Branch
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||||
@@ -41,20 +47,6 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Login to Azure - CI Subscription
|
|
||||||
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
|
|
||||||
with:
|
|
||||||
creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }}
|
|
||||||
|
|
||||||
- name: Retrieve secrets
|
|
||||||
id: retrieve-secrets
|
|
||||||
uses: bitwarden/gh-actions/get-keyvault-secrets@main
|
|
||||||
with:
|
|
||||||
keyvault: "bitwarden-ci"
|
|
||||||
secrets: "github-gpg-private-key,
|
|
||||||
github-gpg-private-key-passphrase,
|
|
||||||
github-pat-bitwarden-devops-bot-repo-scope"
|
|
||||||
|
|
||||||
- name: Import GPG key
|
- name: Import GPG key
|
||||||
uses: crazy-max/ghaction-import-gpg@01dd5d3ca463c7f10f7f4f7b4f177225ac661ee4 # v6.1.0
|
uses: crazy-max/ghaction-import-gpg@01dd5d3ca463c7f10f7f4f7b4f177225ac661ee4 # v6.1.0
|
||||||
with:
|
with:
|
||||||
@@ -63,38 +55,25 @@ jobs:
|
|||||||
git_user_signingkey: true
|
git_user_signingkey: true
|
||||||
git_commit_gpgsign: true
|
git_commit_gpgsign: true
|
||||||
|
|
||||||
- name: Setup git
|
|
||||||
run: |
|
|
||||||
git config --local user.email "106330231+bitwarden-devops-bot@users.noreply.github.com"
|
|
||||||
git config --local user.name "bitwarden-devops-bot"
|
|
||||||
|
|
||||||
- name: Create Version Branch
|
- name: Create Version Branch
|
||||||
id: create-branch
|
id: create-branch
|
||||||
run: |
|
run: |
|
||||||
NAME=version_bump_${{ github.ref_name }}_$(date +"%Y-%m-%d")
|
NAME=version_bump_${{ github.ref_name }}_${{ inputs.version_number }}
|
||||||
git switch -c $NAME
|
git switch -c $NAME
|
||||||
echo "name=$NAME" >> $GITHUB_OUTPUT
|
echo "name=$NAME" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Install xmllint
|
- name: Install xmllint
|
||||||
run: |
|
run: sudo apt install -y libxml2-utils
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libxml2-utils
|
|
||||||
|
|
||||||
- name: Get current version
|
- name: Verify input version
|
||||||
id: current-version
|
env:
|
||||||
|
NEW_VERSION: ${{ inputs.version_number }}
|
||||||
run: |
|
run: |
|
||||||
CURRENT_VERSION=$(xmllint --xpath '
|
CURRENT_VERSION=$(xmllint --xpath '
|
||||||
string(/manifest/@*[local-name()="versionName"
|
string(/manifest/@*[local-name()="versionName"
|
||||||
and namespace-uri()="http://schemas.android.com/apk/res/android"])
|
and namespace-uri()="http://schemas.android.com/apk/res/android"])
|
||||||
' src/App/Platforms/Android/AndroidManifest.xml)
|
' src/App/Platforms/Android/AndroidManifest.xml)
|
||||||
echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Verify input version
|
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
|
||||||
env:
|
|
||||||
CURRENT_VERSION: ${{ steps.current-version.outputs.version }}
|
|
||||||
NEW_VERSION: ${{ inputs.version_number_override }}
|
|
||||||
run: |
|
|
||||||
# Error if version has not changed.
|
# Error if version has not changed.
|
||||||
if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then
|
if [[ "$NEW_VERSION" == "$CURRENT_VERSION" ]]; then
|
||||||
echo "Version has not changed."
|
echo "Version has not changed."
|
||||||
@@ -110,93 +89,40 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Calculate next release version
|
- name: Bump Version - Android XML
|
||||||
if: ${{ inputs.version_number_override == '' }}
|
|
||||||
id: calculate-next-version
|
|
||||||
uses: bitwarden/gh-actions/version-next@main
|
|
||||||
with:
|
|
||||||
version: ${{ steps.current-version.outputs.version }}
|
|
||||||
|
|
||||||
- name: Bump Version - Android XML - Version Override
|
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
|
||||||
id: bump-version-override
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
uses: bitwarden/gh-actions/version-bump@main
|
||||||
with:
|
with:
|
||||||
|
version: ${{ inputs.version_number }}
|
||||||
file_path: "src/App/Platforms/Android/AndroidManifest.xml"
|
file_path: "src/App/Platforms/Android/AndroidManifest.xml"
|
||||||
version: ${{ inputs.version_number_override }}
|
|
||||||
|
|
||||||
- name: Bump Version - Android XML - Automatic Calculation
|
- name: Bump Version - iOS.Autofill
|
||||||
if: ${{ inputs.version_number_override == '' }}
|
|
||||||
id: bump-version-automatic
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
|
||||||
with:
|
|
||||||
file_path: "src/App/Platforms/Android/AndroidManifest.xml"
|
|
||||||
version: ${{ steps.calculate-next-version.outputs.version }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS.Autofill - Version Override
|
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
uses: bitwarden/gh-actions/version-bump@main
|
||||||
with:
|
with:
|
||||||
|
version: ${{ inputs.version_number }}
|
||||||
file_path: "src/iOS.Autofill/Info.plist"
|
file_path: "src/iOS.Autofill/Info.plist"
|
||||||
version: ${{ inputs.version_number_override }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS.Autofill - Automatic Calculation
|
- name: Bump Version - iOS.Extension
|
||||||
if: ${{ inputs.version_number_override == '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
|
||||||
with:
|
|
||||||
file_path: "src/iOS.Autofill/Info.plist"
|
|
||||||
version: ${{ steps.calculate-next-version.outputs.version }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS.Extension - Version Override
|
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
uses: bitwarden/gh-actions/version-bump@main
|
||||||
with:
|
with:
|
||||||
|
version: ${{ inputs.version_number }}
|
||||||
file_path: "src/iOS.Extension/Info.plist"
|
file_path: "src/iOS.Extension/Info.plist"
|
||||||
version: ${{ inputs.version_number_override }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS.Extension - Automatic Calculation
|
- name: Bump Version - iOS.ShareExtension
|
||||||
if: ${{ inputs.version_number_override == '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
|
||||||
with:
|
|
||||||
file_path: "src/iOS.Extension/Info.plist"
|
|
||||||
version: ${{ steps.calculate-next-version.outputs.version }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS.ShareExtension - Version Override
|
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
uses: bitwarden/gh-actions/version-bump@main
|
||||||
with:
|
with:
|
||||||
|
version: ${{ inputs.version_number }}
|
||||||
file_path: "src/iOS.ShareExtension/Info.plist"
|
file_path: "src/iOS.ShareExtension/Info.plist"
|
||||||
version: ${{ inputs.version_number_override }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS.ShareExtension - Automatic Calculation
|
- name: Bump Version - iOS
|
||||||
if: ${{ inputs.version_number_override == '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
|
||||||
with:
|
|
||||||
file_path: "src/iOS.ShareExtension/Info.plist"
|
|
||||||
version: ${{ steps.calculate-next-version.outputs.version }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS - Version Override
|
|
||||||
if: ${{ inputs.version_number_override != '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
uses: bitwarden/gh-actions/version-bump@main
|
||||||
with:
|
with:
|
||||||
|
version: ${{ inputs.version_number }}
|
||||||
file_path: "src/App/Platforms/iOS/Info.plist"
|
file_path: "src/App/Platforms/iOS/Info.plist"
|
||||||
version: ${{ inputs.version_number_override }}
|
|
||||||
|
|
||||||
- name: Bump Version - iOS - Automatic Calculation
|
- name: Setup git
|
||||||
if: ${{ inputs.version_number_override == '' }}
|
|
||||||
uses: bitwarden/gh-actions/version-bump@main
|
|
||||||
with:
|
|
||||||
file_path: "src/App/Platforms/iOS/Info.plist"
|
|
||||||
version: ${{ steps.calculate-next-version.outputs.version }}
|
|
||||||
|
|
||||||
- name: Set Job output
|
|
||||||
id: set-final-version-output
|
|
||||||
run: |
|
run: |
|
||||||
if [[ "${{ steps.bump-version-override.outcome }}" == "success" ]]; then
|
git config --local user.email "106330231+bitwarden-devops-bot@users.noreply.github.com"
|
||||||
echo "version=${{ inputs.version_number_override }}" >> $GITHUB_OUTPUT
|
git config --local user.name "bitwarden-devops-bot"
|
||||||
elif [[ "${{ steps.bump-version-automatic.outcome }}" == "success" ]]; then
|
|
||||||
echo "version=${{ steps.calculate-next-version.outputs.version }}" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Check if version changed
|
- name: Check if version changed
|
||||||
id: version-changed
|
id: version-changed
|
||||||
@@ -210,7 +136,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Commit files
|
- name: Commit files
|
||||||
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
|
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
|
||||||
run: git commit -m "Bumped version to ${{ steps.set-final-version-output.outputs.version }}" -a
|
run: git commit -m "Bumped version to ${{ inputs.version_number }}" -a
|
||||||
|
|
||||||
- name: Push changes
|
- name: Push changes
|
||||||
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
|
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
|
||||||
@@ -224,7 +150,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
||||||
PR_BRANCH: ${{ steps.create-branch.outputs.name }}
|
PR_BRANCH: ${{ steps.create-branch.outputs.name }}
|
||||||
TITLE: "Bump version to ${{ steps.set-final-version-output.outputs.version }}"
|
TITLE: "Bump version to ${{ inputs.version_number }}"
|
||||||
run: |
|
run: |
|
||||||
PR_URL=$(gh pr create --title "$TITLE" \
|
PR_URL=$(gh pr create --title "$TITLE" \
|
||||||
--base "main" \
|
--base "main" \
|
||||||
@@ -240,18 +166,16 @@ jobs:
|
|||||||
- [X] Other
|
- [X] Other
|
||||||
|
|
||||||
## Objective
|
## Objective
|
||||||
Automated version bump to ${{ steps.set-final-version-output.outputs.version }}")
|
Automated version bump to ${{ inputs.version_number }}")
|
||||||
echo "pr_number=${PR_URL##*/}" >> $GITHUB_OUTPUT
|
echo "pr_number=${PR_URL##*/}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Approve PR
|
- name: Approve PR
|
||||||
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
|
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }}
|
PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }}
|
||||||
run: gh pr review $PR_NUMBER --approve
|
run: gh pr review $PR_NUMBER --approve
|
||||||
|
|
||||||
- name: Merge PR
|
- name: Merge PR
|
||||||
if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
|
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
|
||||||
PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }}
|
PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }}
|
||||||
@@ -259,8 +183,8 @@ jobs:
|
|||||||
|
|
||||||
cut_rc:
|
cut_rc:
|
||||||
name: Cut RC branch
|
name: Cut RC branch
|
||||||
if: ${{ inputs.cut_rc_branch == true }}
|
|
||||||
needs: bump_version
|
needs: bump_version
|
||||||
|
if: ${{ inputs.cut_rc_branch == true }}
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Branch
|
- name: Checkout Branch
|
||||||
@@ -269,13 +193,11 @@ jobs:
|
|||||||
ref: main
|
ref: main
|
||||||
|
|
||||||
- name: Install xmllint
|
- name: Install xmllint
|
||||||
run: |
|
run: sudo apt install -y libxml2-utils
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libxml2-utils
|
|
||||||
|
|
||||||
- name: Verify version has been updated
|
- name: Verify version has been updated
|
||||||
env:
|
env:
|
||||||
NEW_VERSION: ${{ needs.bump_version.outputs.version }}
|
NEW_VERSION: ${{ inputs.version_number }}
|
||||||
run: |
|
run: |
|
||||||
# Wait for version to change.
|
# Wait for version to change.
|
||||||
while : ; do
|
while : ; do
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -148,7 +148,6 @@ publish/
|
|||||||
|
|
||||||
# NuGet Packages
|
# NuGet Packages
|
||||||
*.nupkg
|
*.nupkg
|
||||||
!**/Xamarin.AndroidX.Credentials.1.0.0.nupkg
|
|
||||||
# The packages folder can be ignored because of Package Restore
|
# The packages folder can be ignored because of Package Restore
|
||||||
**/packages/*
|
**/packages/*
|
||||||
# except build/, which is used as an MSBuild target.
|
# except build/, which is used as an MSBuild target.
|
||||||
|
|||||||
@@ -9,8 +9,5 @@
|
|||||||
|
|
||||||
<!-- Uncomment this when Unit Testing-->
|
<!-- Uncomment this when Unit Testing-->
|
||||||
<!-- <CustomConstants>UT</CustomConstants> -->
|
<!-- <CustomConstants>UT</CustomConstants> -->
|
||||||
|
|
||||||
<!-- Uncomment this when building FDROID-->
|
|
||||||
<!-- <CustomConstants>FDROID</CustomConstants> -->
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<doc>
|
|
||||||
<assembly>
|
|
||||||
<name>Xamarin.AndroidX.Credentials</name>
|
|
||||||
</assembly>
|
|
||||||
<members>
|
|
||||||
</members>
|
|
||||||
</doc>
|
|
||||||
Binary file not shown.
@@ -2,6 +2,5 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key="MAUI Nightly builds" value="https://pkgs.dev.azure.com/xamarin/public/_packaging/maui-nightly/nuget/v3/index.json" />
|
<add key="MAUI Nightly builds" value="https://pkgs.dev.azure.com/xamarin/public/_packaging/maui-nightly/nuget/v3/index.json" />
|
||||||
<add key="Local AndroidX Credentials" value="lib/android/Xamarin.AndroidX.Credentials" />
|
|
||||||
</packageSources>
|
</packageSources>
|
||||||
</configuration>
|
</configuration>
|
||||||
@@ -121,7 +121,6 @@
|
|||||||
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
|
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
|
||||||
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" />
|
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" />
|
<PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.Credentials" Version="1.0.0" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' AND !$(DefineConstants.Contains(FDROID))">
|
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' AND !$(DefineConstants.Contains(FDROID))">
|
||||||
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet" Version="118.0.1.5" />
|
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet" Version="118.0.1.5" />
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2024.3.3" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2024.2.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.NFC" />
|
<uses-permission android:name="android.permission.NFC" />
|
||||||
@@ -43,9 +43,6 @@
|
|||||||
<!-- Support for Xamarin.Essentials.Browser.OpenAsync (for Android > 11) -->
|
<!-- Support for Xamarin.Essentials.Browser.OpenAsync (for Android > 11) -->
|
||||||
<!-- Related docs: https://learn.microsoft.com/en-us/xamarin/essentials/open-browser?tabs=android -->
|
<!-- Related docs: https://learn.microsoft.com/en-us/xamarin/essentials/open-browser?tabs=android -->
|
||||||
<queries>
|
<queries>
|
||||||
<intent>
|
|
||||||
<action android:name="android.support.customtabs.action.CustomTabsService" />
|
|
||||||
</intent>
|
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<data android:scheme="http" />
|
<data android:scheme="http" />
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ namespace Bit.Droid.Autofill
|
|||||||
// InlinePresentation requires nonNull pending intent (even though we only utilize one for the
|
// InlinePresentation requires nonNull pending intent (even though we only utilize one for the
|
||||||
// "my vault" presentation) so we're including an empty one here
|
// "my vault" presentation) so we're including an empty one here
|
||||||
pendingIntent = PendingIntent.GetService(context, 0, new Intent(),
|
pendingIntent = PendingIntent.GetService(context, 0, new Intent(),
|
||||||
AndroidHelpers.AddPendingIntentMutabilityFlag(PendingIntentFlags.OneShot | PendingIntentFlags.UpdateCurrent, false));
|
AndroidHelpers.AddPendingIntentMutabilityFlag(PendingIntentFlags.OneShot | PendingIntentFlags.UpdateCurrent, true));
|
||||||
}
|
}
|
||||||
var slice = CreateInlinePresentationSlice(
|
var slice = CreateInlinePresentationSlice(
|
||||||
inlinePresentationSpec,
|
inlinePresentationSpec,
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace Bit.Droid.Autofill
|
|
||||||
{
|
|
||||||
public class CredentialProviderConstants
|
|
||||||
{
|
|
||||||
public const string CredentialProviderCipherId = "credentialProviderCipherId";
|
|
||||||
public const string CredentialDataIntentExtra = "CREDENTIAL_DATA";
|
|
||||||
public const string CredentialIdIntentExtra = "credId";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using Android.App;
|
|
||||||
using Android.Content.PM;
|
|
||||||
using Android.OS;
|
|
||||||
using AndroidX.Credentials.Provider;
|
|
||||||
using AndroidX.Credentials.WebAuthn;
|
|
||||||
using Bit.Core.Abstractions;
|
|
||||||
using Bit.Core.Utilities;
|
|
||||||
using Bit.App.Droid.Utilities;
|
|
||||||
|
|
||||||
namespace Bit.Droid.Autofill
|
|
||||||
{
|
|
||||||
[Activity(
|
|
||||||
NoHistory = true,
|
|
||||||
LaunchMode = LaunchMode.SingleTop)]
|
|
||||||
public class CredentialProviderSelectionActivity : MauiAppCompatActivity
|
|
||||||
{
|
|
||||||
protected override void OnCreate(Bundle bundle)
|
|
||||||
{
|
|
||||||
Intent?.Validate();
|
|
||||||
base.OnCreate(bundle);
|
|
||||||
|
|
||||||
var cipherId = Intent?.GetStringExtra(CredentialProviderConstants.CredentialProviderCipherId);
|
|
||||||
if (string.IsNullOrEmpty(cipherId))
|
|
||||||
{
|
|
||||||
SetResult(Result.Canceled);
|
|
||||||
Finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetCipherAndPerformPasskeyAuthAsync(cipherId).FireAndForget();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task GetCipherAndPerformPasskeyAuthAsync(string cipherId)
|
|
||||||
{
|
|
||||||
// TODO this is a work in progress
|
|
||||||
// https://developer.android.com/training/sign-in/credential-provider#passkeys-implement
|
|
||||||
|
|
||||||
var getRequest = PendingIntentHandler.RetrieveProviderGetCredentialRequest(Intent);
|
|
||||||
// var publicKeyRequest = getRequest?.CredentialOptions as PublicKeyCredentialRequestOptions;
|
|
||||||
|
|
||||||
var requestInfo = Intent.GetBundleExtra(CredentialProviderConstants.CredentialDataIntentExtra);
|
|
||||||
var credIdEnc = requestInfo?.GetString(CredentialProviderConstants.CredentialIdIntentExtra);
|
|
||||||
|
|
||||||
var cipherService = ServiceContainer.Resolve<ICipherService>();
|
|
||||||
var cipher = await cipherService.GetAsync(cipherId);
|
|
||||||
var decCipher = await cipher.DecryptAsync();
|
|
||||||
|
|
||||||
var passkey = decCipher.Login.Fido2Credentials.Find(f => f.CredentialId == credIdEnc);
|
|
||||||
|
|
||||||
var credId = Convert.FromBase64String(credIdEnc);
|
|
||||||
// var privateKey = Convert.FromBase64String(passkey.PrivateKey);
|
|
||||||
// var uid = Convert.FromBase64String(passkey.uid);
|
|
||||||
|
|
||||||
var origin = getRequest?.CallingAppInfo.Origin;
|
|
||||||
var packageName = getRequest?.CallingAppInfo.PackageName;
|
|
||||||
|
|
||||||
// --- continue WIP here (save TOTP copy as last step) ---
|
|
||||||
|
|
||||||
// Copy TOTP if needed
|
|
||||||
var autofillHandler = ServiceContainer.Resolve<IAutofillHandler>();
|
|
||||||
autofillHandler.Autofill(decCipher);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
using Android;
|
|
||||||
using Android.App;
|
|
||||||
using Android.Content;
|
|
||||||
using Android.Graphics.Drawables;
|
|
||||||
using Android.OS;
|
|
||||||
using Android.Runtime;
|
|
||||||
using AndroidX.Credentials.Provider;
|
|
||||||
using Bit.Core.Abstractions;
|
|
||||||
using Bit.Core.Utilities;
|
|
||||||
using AndroidX.Credentials.Exceptions;
|
|
||||||
using AndroidX.Credentials.WebAuthn;
|
|
||||||
using Bit.Core.Models.View;
|
|
||||||
using Resource = Microsoft.Maui.Resource;
|
|
||||||
|
|
||||||
namespace Bit.Droid.Autofill
|
|
||||||
{
|
|
||||||
[Service(Permission = Manifest.Permission.BindCredentialProviderService, Label = "Bitwarden", Exported = true)]
|
|
||||||
[IntentFilter(new string[] { "android.service.credentials.CredentialProviderService" })]
|
|
||||||
[MetaData("android.credentials.provider", Resource = "@xml/provider")]
|
|
||||||
[Register("com.x8bit.bitwarden.Autofill.CredentialProviderService")]
|
|
||||||
public class CredentialProviderService : AndroidX.Credentials.Provider.CredentialProviderService
|
|
||||||
{
|
|
||||||
private const string GetPasskeyIntentAction = "PACKAGE_NAME.GET_PASSKEY";
|
|
||||||
private const int UniqueRequestCode = 94556023;
|
|
||||||
|
|
||||||
private ICipherService _cipherService;
|
|
||||||
private IUserVerificationService _userVerificationService;
|
|
||||||
private IVaultTimeoutService _vaultTimeoutService;
|
|
||||||
private LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger");
|
|
||||||
|
|
||||||
public override async void OnBeginCreateCredentialRequest(BeginCreateCredentialRequest request,
|
|
||||||
CancellationSignal cancellationSignal, IOutcomeReceiver callback) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public override async void OnBeginGetCredentialRequest(BeginGetCredentialRequest request,
|
|
||||||
CancellationSignal cancellationSignal, IOutcomeReceiver callback)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_vaultTimeoutService ??= ServiceContainer.Resolve<IVaultTimeoutService>();
|
|
||||||
|
|
||||||
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
|
||||||
var locked = await _vaultTimeoutService.IsLockedAsync();
|
|
||||||
if (!locked)
|
|
||||||
{
|
|
||||||
var response = await ProcessGetCredentialsRequestAsync(request);
|
|
||||||
callback.OnResult(response);
|
|
||||||
}
|
|
||||||
// TODO handle auth/unlock account flow
|
|
||||||
}
|
|
||||||
catch (GetCredentialException e)
|
|
||||||
{
|
|
||||||
_logger.Value.Exception(e);
|
|
||||||
callback.OnError(e.ErrorMessage ?? "Error getting credentials");
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
_logger.Value.Exception(e);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<BeginGetCredentialResponse> ProcessGetCredentialsRequestAsync(
|
|
||||||
BeginGetCredentialRequest request)
|
|
||||||
{
|
|
||||||
IList<CredentialEntry> credentialEntries = null;
|
|
||||||
|
|
||||||
foreach (var option in request.BeginGetCredentialOptions)
|
|
||||||
{
|
|
||||||
var credentialOption = option as BeginGetPublicKeyCredentialOption;
|
|
||||||
if (credentialOption != null)
|
|
||||||
{
|
|
||||||
credentialEntries ??= new List<CredentialEntry>();
|
|
||||||
((List<CredentialEntry>)credentialEntries).AddRange(
|
|
||||||
await PopulatePasskeyDataAsync(request.CallingAppInfo, credentialOption));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (credentialEntries == null)
|
|
||||||
{
|
|
||||||
return new BeginGetCredentialResponse();
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BeginGetCredentialResponse.Builder()
|
|
||||||
.SetCredentialEntries(credentialEntries)
|
|
||||||
.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<List<CredentialEntry>> PopulatePasskeyDataAsync(CallingAppInfo callingAppInfo,
|
|
||||||
BeginGetPublicKeyCredentialOption option)
|
|
||||||
{
|
|
||||||
var packageName = callingAppInfo.PackageName;
|
|
||||||
var origin = callingAppInfo.Origin;
|
|
||||||
var signingInfo = callingAppInfo.SigningInfo;
|
|
||||||
|
|
||||||
var request = new PublicKeyCredentialRequestOptions(option.RequestJson);
|
|
||||||
|
|
||||||
var passkeyEntries = new List<CredentialEntry>();
|
|
||||||
|
|
||||||
_cipherService ??= ServiceContainer.Resolve<ICipherService>();
|
|
||||||
var ciphers = await _cipherService.GetAllDecryptedForUrlAsync(origin);
|
|
||||||
if (ciphers == null)
|
|
||||||
{
|
|
||||||
return passkeyEntries;
|
|
||||||
}
|
|
||||||
|
|
||||||
var passkeyCiphers = ciphers.Where(cipher => cipher.HasFido2Credential).ToList();
|
|
||||||
if (!passkeyCiphers.Any())
|
|
||||||
{
|
|
||||||
return passkeyEntries;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var cipher in passkeyCiphers)
|
|
||||||
{
|
|
||||||
var passkeyEntry = GetPasskey(cipher, option);
|
|
||||||
passkeyEntries.Add(passkeyEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
return passkeyEntries;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PublicKeyCredentialEntry GetPasskey(CipherView cipher, BeginGetPublicKeyCredentialOption option)
|
|
||||||
{
|
|
||||||
var credDataBundle = new Bundle();
|
|
||||||
credDataBundle.PutString(CredentialProviderConstants.CredentialIdIntentExtra,
|
|
||||||
cipher.Login.MainFido2Credential.CredentialId);
|
|
||||||
|
|
||||||
var intent = new Intent(ApplicationContext, typeof(CredentialProviderSelectionActivity))
|
|
||||||
.SetAction(GetPasskeyIntentAction).SetPackage(Constants.PACKAGE_NAME);
|
|
||||||
intent.PutExtra(CredentialProviderConstants.CredentialDataIntentExtra, credDataBundle);
|
|
||||||
intent.PutExtra(CredentialProviderConstants.CredentialProviderCipherId, cipher.Id);
|
|
||||||
var pendingIntent = PendingIntent.GetActivity(ApplicationContext, UniqueRequestCode, intent,
|
|
||||||
PendingIntentFlags.Mutable | PendingIntentFlags.UpdateCurrent);
|
|
||||||
|
|
||||||
return new PublicKeyCredentialEntry.Builder(
|
|
||||||
ApplicationContext,
|
|
||||||
cipher.Login.Username ?? "No username",
|
|
||||||
pendingIntent,
|
|
||||||
option)
|
|
||||||
.SetDisplayName(cipher.Name)
|
|
||||||
.SetIcon(Icon.CreateWithResource(ApplicationContext, Resource.Drawable.icon))
|
|
||||||
.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnClearCredentialStateRequest(ProviderClearCredentialStateRequest request,
|
|
||||||
CancellationSignal cancellationSignal, IOutcomeReceiver callback) => throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -85,12 +85,6 @@ namespace Bit.Droid
|
|||||||
ServiceContainer.Resolve<IWatchDeviceService>(),
|
ServiceContainer.Resolve<IWatchDeviceService>(),
|
||||||
ServiceContainer.Resolve<IConditionedAwaiterManager>());
|
ServiceContainer.Resolve<IConditionedAwaiterManager>());
|
||||||
ServiceContainer.Register<IAccountsManager>("accountsManager", accountsManager);
|
ServiceContainer.Register<IAccountsManager>("accountsManager", accountsManager);
|
||||||
|
|
||||||
var userPinService = new UserPinService(
|
|
||||||
ServiceContainer.Resolve<IStateService>(),
|
|
||||||
ServiceContainer.Resolve<ICryptoService>(),
|
|
||||||
ServiceContainer.Resolve<IVaultTimeoutService>());
|
|
||||||
ServiceContainer.Register<IUserPinService>(userPinService);
|
|
||||||
}
|
}
|
||||||
#if !FDROID
|
#if !FDROID
|
||||||
if (Build.VERSION.SdkInt <= BuildVersionCodes.Kitkat)
|
if (Build.VERSION.SdkInt <= BuildVersionCodes.Kitkat)
|
||||||
@@ -166,6 +160,7 @@ namespace Bit.Droid
|
|||||||
var cryptoFunctionService = new PclCryptoFunctionService(cryptoPrimitiveService);
|
var cryptoFunctionService = new PclCryptoFunctionService(cryptoPrimitiveService);
|
||||||
var cryptoService = new CryptoService(stateService, cryptoFunctionService, logger);
|
var cryptoService = new CryptoService(stateService, cryptoFunctionService, logger);
|
||||||
var biometricService = new BiometricService(stateService, cryptoService);
|
var biometricService = new BiometricService(stateService, cryptoService);
|
||||||
|
var userPinService = new UserPinService(stateService, cryptoService);
|
||||||
var passwordRepromptService = new MobilePasswordRepromptService(platformUtilsService, cryptoService, stateService);
|
var passwordRepromptService = new MobilePasswordRepromptService(platformUtilsService, cryptoService, stateService);
|
||||||
|
|
||||||
ServiceContainer.Register<ISynchronousStorageService>(preferencesStorage);
|
ServiceContainer.Register<ISynchronousStorageService>(preferencesStorage);
|
||||||
@@ -189,6 +184,7 @@ namespace Bit.Droid
|
|||||||
ServiceContainer.Register<ICryptoService>("cryptoService", cryptoService);
|
ServiceContainer.Register<ICryptoService>("cryptoService", cryptoService);
|
||||||
ServiceContainer.Register<IPasswordRepromptService>("passwordRepromptService", passwordRepromptService);
|
ServiceContainer.Register<IPasswordRepromptService>("passwordRepromptService", passwordRepromptService);
|
||||||
ServiceContainer.Register<IAvatarImageSourcePool>("avatarImageSourcePool", new AvatarImageSourcePool());
|
ServiceContainer.Register<IAvatarImageSourcePool>("avatarImageSourcePool", new AvatarImageSourcePool());
|
||||||
|
ServiceContainer.Register<IUserPinService>(userPinService);
|
||||||
|
|
||||||
// Push
|
// Push
|
||||||
#if FDROID
|
#if FDROID
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<credential-provider xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<capabilities>
|
|
||||||
<capability name="androidx.credentials.TYPE_PUBLIC_KEY_CREDENTIAL" />
|
|
||||||
</capabilities>
|
|
||||||
</credential-provider>
|
|
||||||
@@ -37,23 +37,6 @@ namespace Bit.Droid.Services
|
|||||||
_eventService = eventService;
|
_eventService = eventService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CredentialProviderServiceEnabled()
|
|
||||||
{
|
|
||||||
if (Build.VERSION.SdkInt < BuildVersionCodes.UpsideDownCake)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// TODO - find a way to programmatically check if the credential provider service is enabled
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool AutofillServiceEnabled()
|
public bool AutofillServiceEnabled()
|
||||||
{
|
{
|
||||||
if (Build.VERSION.SdkInt < BuildVersionCodes.O)
|
if (Build.VERSION.SdkInt < BuildVersionCodes.O)
|
||||||
@@ -180,14 +163,7 @@ namespace Bit.Droid.Services
|
|||||||
return Accessibility.AccessibilityHelpers.OverlayPermitted();
|
return Accessibility.AccessibilityHelpers.OverlayPermitted();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisableCredentialProviderService()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// TODO - find a way to programmatically disable the provider service, or take the user to the settings page where they can do it
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DisableAutofillService()
|
public void DisableAutofillService()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ using Android.Text.Method;
|
|||||||
using Android.Views;
|
using Android.Views;
|
||||||
using Android.Views.InputMethods;
|
using Android.Views.InputMethods;
|
||||||
using Android.Widget;
|
using Android.Widget;
|
||||||
using AndroidX.Credentials;
|
|
||||||
using Bit.App.Abstractions;
|
using Bit.App.Abstractions;
|
||||||
using Bit.Core.Resources.Localization;
|
using Bit.Core.Resources.Localization;
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
@@ -72,8 +71,6 @@ namespace Bit.Droid.Services
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool LaunchApp(string appName)
|
public bool LaunchApp(string appName)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if ((int)Build.VERSION.SdkInt < 33)
|
if ((int)Build.VERSION.SdkInt < 33)
|
||||||
{
|
{
|
||||||
@@ -87,15 +84,6 @@ namespace Bit.Droid.Services
|
|||||||
launchIntentSender?.SendIntent(activity, Result.Ok, null, null, null);
|
launchIntentSender?.SendIntent(activity, Result.Ok, null, null, null);
|
||||||
return launchIntentSender != null;
|
return launchIntentSender != null;
|
||||||
}
|
}
|
||||||
catch (IntentSender.SendIntentException)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
catch (Android.Util.AndroidException)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task ShowLoadingAsync(string text)
|
public async Task ShowLoadingAsync(string text)
|
||||||
{
|
{
|
||||||
@@ -502,27 +490,6 @@ namespace Bit.Droid.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenCredentialProviderSettings()
|
|
||||||
{
|
|
||||||
var activity = (MainActivity)Microsoft.Maui.ApplicationModel.Platform.CurrentActivity;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var pendingIntent = CredentialManager.Create(activity).CreateSettingsPendingIntent();
|
|
||||||
pendingIntent.Send();
|
|
||||||
}
|
|
||||||
catch (ActivityNotFoundException)
|
|
||||||
{
|
|
||||||
var alertBuilder = new AlertDialog.Builder(activity);
|
|
||||||
alertBuilder.SetMessage(AppResources.BitwardenCredentialProviderGoToSettings);
|
|
||||||
alertBuilder.SetCancelable(true);
|
|
||||||
alertBuilder.SetPositiveButton(AppResources.Ok, (sender, args) =>
|
|
||||||
{
|
|
||||||
(sender as AlertDialog)?.Cancel();
|
|
||||||
});
|
|
||||||
alertBuilder.Create().Show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OpenAccessibilitySettings()
|
public void OpenAccessibilitySettings()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -581,8 +548,6 @@ namespace Bit.Droid.Services
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SupportsCredentialProviderService() => Build.VERSION.SdkInt >= BuildVersionCodes.UpsideDownCake;
|
|
||||||
|
|
||||||
public bool SupportsAutofillServices() => Build.VERSION.SdkInt >= BuildVersionCodes.O;
|
public bool SupportsAutofillServices() => Build.VERSION.SdkInt >= BuildVersionCodes.O;
|
||||||
|
|
||||||
public bool SupportsInlineAutofill() => Build.VERSION.SdkInt >= BuildVersionCodes.R;
|
public bool SupportsInlineAutofill() => Build.VERSION.SdkInt >= BuildVersionCodes.R;
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ using Bit.Core.Abstractions;
|
|||||||
using Bit.Core.Utilities;
|
using Bit.Core.Utilities;
|
||||||
using Bit.Droid.Accessibility;
|
using Bit.Droid.Accessibility;
|
||||||
using Java.Lang;
|
using Java.Lang;
|
||||||
using Bit.App.Droid.Utilities;
|
|
||||||
|
|
||||||
namespace Bit.Droid.Tile
|
namespace Bit.Droid.Tile
|
||||||
{
|
{
|
||||||
@@ -77,7 +76,7 @@ namespace Bit.Droid.Tile
|
|||||||
var intent = new Intent(this, typeof(AccessibilityActivity));
|
var intent = new Intent(this, typeof(AccessibilityActivity));
|
||||||
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
|
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
|
||||||
intent.PutExtra("autofillTileClicked", true);
|
intent.PutExtra("autofillTileClicked", true);
|
||||||
this.StartActivityAndCollapseWithIntent(intent, isMutable: true);
|
StartActivityAndCollapse(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowConfigErrorDialog()
|
private void ShowConfigErrorDialog()
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
using Android.App;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
using Android.App;
|
||||||
using Android.Content;
|
using Android.Content;
|
||||||
|
using Android.OS;
|
||||||
using Android.Runtime;
|
using Android.Runtime;
|
||||||
using Android.Service.QuickSettings;
|
using Android.Service.QuickSettings;
|
||||||
using Bit.App.Droid.Utilities;
|
using Android.Views;
|
||||||
|
using Android.Widget;
|
||||||
using Java.Lang;
|
using Java.Lang;
|
||||||
|
|
||||||
namespace Bit.Droid.Tile
|
namespace Bit.Droid.Tile
|
||||||
@@ -55,7 +62,7 @@ namespace Bit.Droid.Tile
|
|||||||
var intent = new Intent(this, typeof(MainActivity));
|
var intent = new Intent(this, typeof(MainActivity));
|
||||||
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
|
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
|
||||||
intent.PutExtra("generatorTile", true);
|
intent.PutExtra("generatorTile", true);
|
||||||
this.StartActivityAndCollapseWithIntent(intent, isMutable: false);
|
StartActivityAndCollapse(intent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
using Android.App;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
using Android.App;
|
||||||
using Android.Content;
|
using Android.Content;
|
||||||
|
using Android.OS;
|
||||||
using Android.Runtime;
|
using Android.Runtime;
|
||||||
using Android.Service.QuickSettings;
|
using Android.Service.QuickSettings;
|
||||||
using Bit.App.Droid.Utilities;
|
using Android.Views;
|
||||||
|
using Android.Widget;
|
||||||
using Java.Lang;
|
using Java.Lang;
|
||||||
|
|
||||||
namespace Bit.Droid.Tile
|
namespace Bit.Droid.Tile
|
||||||
@@ -56,7 +63,7 @@ namespace Bit.Droid.Tile
|
|||||||
var intent = new Intent(this, typeof(MainActivity));
|
var intent = new Intent(this, typeof(MainActivity));
|
||||||
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
|
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop);
|
||||||
intent.PutExtra("myVaultTile", true);
|
intent.PutExtra("myVaultTile", true);
|
||||||
this.StartActivityAndCollapseWithIntent(intent, isMutable: false);
|
StartActivityAndCollapse(intent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
using Android.Content;
|
using Android.Content;
|
||||||
using Android.OS;
|
using Android.OS;
|
||||||
using Android.Provider;
|
using Android.Provider;
|
||||||
using Android.Service.QuickSettings;
|
|
||||||
using Bit.App.Utilities;
|
using Bit.App.Utilities;
|
||||||
|
|
||||||
namespace Bit.App.Droid.Utilities
|
namespace Bit.App.Droid.Utilities
|
||||||
@@ -65,26 +64,5 @@ namespace Bit.App.Droid.Utilities
|
|||||||
|
|
||||||
return pendingIntentFlags;
|
return pendingIntentFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StartActivityAndCollapseWithIntent(this TileService service, Intent intent, bool isMutable)
|
|
||||||
{
|
|
||||||
//For Android 14+ We need to use PendingIntent instead of Intent directly. Older versions still need to use Intent.
|
|
||||||
if (Build.VERSION.SdkInt < BuildVersionCodes.UpsideDownCake)
|
|
||||||
{
|
|
||||||
service.StartActivityAndCollapse(intent);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var pendingIntent = PendingIntent.GetActivity(
|
|
||||||
service.ApplicationContext,
|
|
||||||
0,
|
|
||||||
intent,
|
|
||||||
AddPendingIntentMutabilityFlag(PendingIntentFlags.UpdateCurrent, isMutable)
|
|
||||||
);
|
|
||||||
if (pendingIntent == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
service.StartActivityAndCollapse(pendingIntent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ namespace Bit.iOS
|
|||||||
Core.Constants.AutofillNeedsIdentityReplacementKey);
|
Core.Constants.AutofillNeedsIdentityReplacementKey);
|
||||||
if (needsAutofillReplacement.GetValueOrDefault())
|
if (needsAutofillReplacement.GetValueOrDefault())
|
||||||
{
|
{
|
||||||
await ASHelpers.ReplaceAllIdentitiesAsync();
|
await ASHelpers.ReplaceAllIdentities();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (message.Command == "showAppExtension")
|
else if (message.Command == "showAppExtension")
|
||||||
@@ -102,7 +102,7 @@ namespace Bit.iOS
|
|||||||
var success = value as bool?;
|
var success = value as bool?;
|
||||||
if (success.GetValueOrDefault() && _deviceActionService.SystemMajorVersion() >= 12)
|
if (success.GetValueOrDefault() && _deviceActionService.SystemMajorVersion() >= 12)
|
||||||
{
|
{
|
||||||
await ASHelpers.ReplaceAllIdentitiesAsync();
|
await ASHelpers.ReplaceAllIdentities();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,21 +114,22 @@ namespace Bit.iOS
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await ASHelpers.IdentitiesSupportIncrementalAsync())
|
if (await ASHelpers.IdentitiesCanIncremental())
|
||||||
{
|
{
|
||||||
var cipherId = message.Data as string;
|
var cipherId = message.Data as string;
|
||||||
if (message.Command == "addedCipher" && !string.IsNullOrWhiteSpace(cipherId))
|
if (message.Command == "addedCipher" && !string.IsNullOrWhiteSpace(cipherId))
|
||||||
{
|
{
|
||||||
var identity = await ASHelpers.GetCipherPasswordIdentityAsync(cipherId);
|
var identity = await ASHelpers.GetCipherIdentityAsync(cipherId);
|
||||||
if (identity == null)
|
if (identity == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await ASCredentialIdentityStoreExtensions.SaveCredentialIdentitiesAsync(identity);
|
await ASCredentialIdentityStore.SharedStore?.SaveCredentialIdentitiesAsync(
|
||||||
|
new ASPasswordCredentialIdentity[] { identity });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await ASHelpers.ReplaceAllIdentitiesAsync();
|
await ASHelpers.ReplaceAllIdentities();
|
||||||
}
|
}
|
||||||
else if (message.Command == "deletedCipher" || message.Command == "softDeletedCipher")
|
else if (message.Command == "deletedCipher" || message.Command == "softDeletedCipher")
|
||||||
{
|
{
|
||||||
@@ -137,27 +138,28 @@ namespace Bit.iOS
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await ASHelpers.IdentitiesSupportIncrementalAsync())
|
if (await ASHelpers.IdentitiesCanIncremental())
|
||||||
{
|
{
|
||||||
var identity = ASHelpers.ToPasswordCredentialIdentity(
|
var identity = ASHelpers.ToCredentialIdentity(
|
||||||
message.Data as Bit.Core.Models.View.CipherView);
|
message.Data as Bit.Core.Models.View.CipherView);
|
||||||
if (identity == null)
|
if (identity == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await ASCredentialIdentityStoreExtensions.RemoveCredentialIdentitiesAsync(identity);
|
await ASCredentialIdentityStore.SharedStore?.RemoveCredentialIdentitiesAsync(
|
||||||
|
new ASPasswordCredentialIdentity[] { identity });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await ASHelpers.ReplaceAllIdentitiesAsync();
|
await ASHelpers.ReplaceAllIdentities();
|
||||||
}
|
}
|
||||||
else if (message.Command == "logout" && UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
|
else if (message.Command == "logout" && UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
|
||||||
{
|
{
|
||||||
await ASCredentialIdentityStore.SharedStore.RemoveAllCredentialIdentitiesAsync();
|
await ASCredentialIdentityStore.SharedStore?.RemoveAllCredentialIdentitiesAsync();
|
||||||
}
|
}
|
||||||
else if ((message.Command == "softDeletedCipher" || message.Command == "restoredCipher")
|
else if ((message.Command == "softDeletedCipher" || message.Command == "restoredCipher")
|
||||||
&& UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
|
&& UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
|
||||||
{
|
{
|
||||||
await ASHelpers.ReplaceAllIdentitiesAsync();
|
await ASHelpers.ReplaceAllIdentities();
|
||||||
}
|
}
|
||||||
else if (message.Command == AppHelpers.VAULT_TIMEOUT_ACTION_CHANGED_MESSAGE_COMMAND)
|
else if (message.Command == AppHelpers.VAULT_TIMEOUT_ACTION_CHANGED_MESSAGE_COMMAND)
|
||||||
{
|
{
|
||||||
@@ -166,12 +168,12 @@ namespace Bit.iOS
|
|||||||
{
|
{
|
||||||
if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
|
if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0))
|
||||||
{
|
{
|
||||||
await ASCredentialIdentityStore.SharedStore.RemoveAllCredentialIdentitiesAsync();
|
await ASCredentialIdentityStore.SharedStore?.RemoveAllCredentialIdentitiesAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await ASHelpers.ReplaceAllIdentitiesAsync();
|
await ASHelpers.ReplaceAllIdentities();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>com.8bit.bitwarden</string>
|
<string>com.8bit.bitwarden</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2024.3.3</string>
|
<string>2024.2.1</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>CFBundleIconName</key>
|
<key>CFBundleIconName</key>
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ namespace Bit.Core.Abstractions
|
|||||||
{
|
{
|
||||||
public interface IAutofillHandler
|
public interface IAutofillHandler
|
||||||
{
|
{
|
||||||
bool CredentialProviderServiceEnabled();
|
|
||||||
bool AutofillServicesEnabled();
|
bool AutofillServicesEnabled();
|
||||||
bool SupportsAutofillService();
|
bool SupportsAutofillService();
|
||||||
void Autofill(CipherView cipher);
|
void Autofill(CipherView cipher);
|
||||||
@@ -12,7 +11,6 @@ namespace Bit.Core.Abstractions
|
|||||||
bool AutofillAccessibilityServiceRunning();
|
bool AutofillAccessibilityServiceRunning();
|
||||||
bool AutofillAccessibilityOverlayPermitted();
|
bool AutofillAccessibilityOverlayPermitted();
|
||||||
bool AutofillServiceEnabled();
|
bool AutofillServiceEnabled();
|
||||||
void DisableCredentialProviderService();
|
|
||||||
void DisableAutofillService();
|
void DisableAutofillService();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using Bit.Core.Enums;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
@@ -34,7 +37,5 @@ namespace Bit.Core.Abstractions
|
|||||||
Task<byte[]> DownloadAndDecryptAttachmentAsync(string cipherId, AttachmentView attachment, string organizationId);
|
Task<byte[]> DownloadAndDecryptAttachmentAsync(string cipherId, AttachmentView attachment, string organizationId);
|
||||||
Task SoftDeleteWithServerAsync(string id);
|
Task SoftDeleteWithServerAsync(string id);
|
||||||
Task RestoreWithServerAsync(string id);
|
Task RestoreWithServerAsync(string id);
|
||||||
Task<string> CreateNewLoginForPasskeyAsync(Fido2ConfirmNewCredentialParams newPasskeyParams);
|
|
||||||
Task CopyTotpCodeIfNeededAsync(CipherView cipher);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
namespace Bit.Core.Abstractions
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Bit.Core.Abstractions
|
||||||
{
|
{
|
||||||
public enum AwaiterPrecondition
|
public enum AwaiterPrecondition
|
||||||
{
|
{
|
||||||
EnvironmentUrlsInited,
|
EnvironmentUrlsInited,
|
||||||
AndroidWindowCreated,
|
AndroidWindowCreated
|
||||||
AutofillIOSExtensionViewDidAppear
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IConditionedAwaiterManager
|
public interface IConditionedAwaiterManager
|
||||||
@@ -12,6 +14,5 @@
|
|||||||
Task GetAwaiterForPrecondition(AwaiterPrecondition awaiterPrecondition);
|
Task GetAwaiterForPrecondition(AwaiterPrecondition awaiterPrecondition);
|
||||||
void SetAsCompleted(AwaiterPrecondition awaiterPrecondition);
|
void SetAsCompleted(AwaiterPrecondition awaiterPrecondition);
|
||||||
void SetException(AwaiterPrecondition awaiterPrecondition, Exception ex);
|
void SetException(AwaiterPrecondition awaiterPrecondition, Exception ex);
|
||||||
void Recreate(AwaiterPrecondition awaiterPrecondition);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Domain;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
namespace Bit.Core.Abstractions
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ namespace Bit.App.Abstractions
|
|||||||
bool SupportsNfc();
|
bool SupportsNfc();
|
||||||
bool SupportsCamera();
|
bool SupportsCamera();
|
||||||
bool SupportsFido2();
|
bool SupportsFido2();
|
||||||
bool SupportsCredentialProviderService();
|
|
||||||
bool SupportsAutofillServices();
|
bool SupportsAutofillServices();
|
||||||
bool SupportsInlineAutofill();
|
bool SupportsInlineAutofill();
|
||||||
bool SupportsDrawOver();
|
bool SupportsDrawOver();
|
||||||
@@ -37,7 +36,6 @@ namespace Bit.App.Abstractions
|
|||||||
void RateApp();
|
void RateApp();
|
||||||
void OpenAccessibilitySettings();
|
void OpenAccessibilitySettings();
|
||||||
void OpenAccessibilityOverlayPermissionSettings();
|
void OpenAccessibilityOverlayPermissionSettings();
|
||||||
void OpenCredentialProviderSettings();
|
|
||||||
void OpenAutofillSettings();
|
void OpenAutofillSettings();
|
||||||
long GetActiveTime();
|
long GetActiveTime();
|
||||||
void CloseMainApp();
|
void CloseMainApp();
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
using Bit.Core.Utilities.Fido2;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
public interface IFido2AuthenticatorService
|
|
||||||
{
|
|
||||||
Task<Fido2AuthenticatorMakeCredentialResult> MakeCredentialAsync(Fido2AuthenticatorMakeCredentialParams makeCredentialParams, IFido2MakeCredentialUserInterface userInterface);
|
|
||||||
Task<Fido2AuthenticatorGetAssertionResult> GetAssertionAsync(Fido2AuthenticatorGetAssertionParams assertionParams, IFido2GetAssertionUserInterface userInterface);
|
|
||||||
// TODO: Should this return a List? Or maybe IEnumerable?
|
|
||||||
Task<Fido2AuthenticatorDiscoverableCredentialMetadata[]> SilentCredentialDiscoveryAsync(string rpId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
using Bit.Core.Utilities.Fido2;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// This class represents an abstraction of the WebAuthn Client as described by W3C:
|
|
||||||
/// https://www.w3.org/TR/webauthn-3/#webauthn-client
|
|
||||||
///
|
|
||||||
/// The WebAuthn Client is an intermediary entity typically implemented in the user agent
|
|
||||||
/// (in whole, or in part). Conceptually, it underlies the Web Authentication API and embodies
|
|
||||||
/// the implementation of the Web Authentication API's operations.
|
|
||||||
///
|
|
||||||
/// It is responsible for both marshalling the inputs for the underlying authenticator operations,
|
|
||||||
/// and for returning the results of the latter operations to the Web Authentication API's callers.
|
|
||||||
/// </summary>
|
|
||||||
public interface IFido2ClientService
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Allows WebAuthn Relying Party scripts to request the creation of a new public key credential source.
|
|
||||||
/// For more information please see: https://www.w3.org/TR/webauthn-3/#sctn-createCredential
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="createCredentialParams">The parameters for the credential creation operation</param>
|
|
||||||
/// <returns>The new credential</returns>
|
|
||||||
Task<Fido2ClientCreateCredentialResult> CreateCredentialAsync(Fido2ClientCreateCredentialParams createCredentialParams);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Allows WebAuthn Relying Party scripts to discover and use an existing public key credential, with the user’s consent.
|
|
||||||
/// Relying Party script can optionally specify some criteria to indicate what credential sources are acceptable to it.
|
|
||||||
/// For more information please see: https://www.w3.org/TR/webauthn-3/#sctn-getAssertion
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="assertCredentialParams">The parameters for the credential assertion operation</param>
|
|
||||||
/// <returns>The asserted credential</returns>
|
|
||||||
Task<Fido2ClientAssertCredentialResult> AssertCredentialAsync(Fido2ClientAssertCredentialParams assertCredentialParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
using Bit.Core.Utilities.Fido2;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
public struct Fido2GetAssertionUserInterfaceCredential
|
|
||||||
{
|
|
||||||
public string CipherId { get; set; }
|
|
||||||
public Fido2UserVerificationPreference UserVerificationPreference { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IFido2GetAssertionUserInterface : IFido2UserInterface
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Ask the user to pick a credential from a list of existing credentials.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="credentials">The credentials that the user can pick from, and if the user must be verified before completing the operation</param>
|
|
||||||
/// <returns>The ID of the cipher that contains the credentials the user picked, and if the user was verified before completing the operation</returns>
|
|
||||||
Task<(string CipherId, bool UserVerified)> PickCredentialAsync(Fido2GetAssertionUserInterfaceCredential[] credentials);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
using Bit.Core.Utilities.Fido2;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
public struct Fido2ConfirmNewCredentialParams
|
|
||||||
{
|
|
||||||
///<summary>
|
|
||||||
/// The name of the credential.
|
|
||||||
///</summary>
|
|
||||||
public string CredentialName { get; set; }
|
|
||||||
|
|
||||||
///<summary>
|
|
||||||
/// The name of the user.
|
|
||||||
///</summary>
|
|
||||||
public string UserName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The preference to whether or not the user must be verified before completing the operation.
|
|
||||||
/// </summary>
|
|
||||||
public Fido2UserVerificationPreference UserVerificationPreference { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The relying party identifier
|
|
||||||
/// </summary>
|
|
||||||
public string RpId { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IFido2MakeCredentialUserInterface : IFido2UserInterface
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Inform the user that the operation was cancelled because their vault contains excluded credentials.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="existingCipherIds">The IDs of the excluded credentials.</param>
|
|
||||||
/// <returns>When user has confirmed the message</returns>
|
|
||||||
Task InformExcludedCredentialAsync(string[] existingCipherIds);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Ask the user to confirm the creation of a new credential.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="confirmNewCredentialParams">The parameters to use when asking the user to confirm the creation of a new credential.</param>
|
|
||||||
/// <returns>The ID of the cipher where the new credential should be saved, and if the user was verified before completing the operation</returns>
|
|
||||||
Task<(string CipherId, bool UserVerified)> ConfirmNewCredentialAsync(Fido2ConfirmNewCredentialParams confirmNewCredentialParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
using Bit.Core.Utilities.Fido2;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
public interface IFido2MediatorService
|
|
||||||
{
|
|
||||||
Task<Fido2ClientCreateCredentialResult> CreateCredentialAsync(Fido2ClientCreateCredentialParams createCredentialParams);
|
|
||||||
Task<Fido2ClientAssertCredentialResult> AssertCredentialAsync(Fido2ClientAssertCredentialParams assertCredentialParams);
|
|
||||||
|
|
||||||
Task<Fido2AuthenticatorMakeCredentialResult> MakeCredentialAsync(Fido2AuthenticatorMakeCredentialParams makeCredentialParams, IFido2MakeCredentialUserInterface userInterface);
|
|
||||||
Task<Fido2AuthenticatorGetAssertionResult> GetAssertionAsync(Fido2AuthenticatorGetAssertionParams assertionParams, IFido2GetAssertionUserInterface userInterface);
|
|
||||||
Task<Fido2AuthenticatorDiscoverableCredentialMetadata[]> SilentCredentialDiscoveryAsync(string rpId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
public interface IFido2UserInterface
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Whether the vault has been unlocked during this transaction
|
|
||||||
/// </summary>
|
|
||||||
bool HasVaultBeenUnlockedInThisTransaction { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make sure that the vault is unlocked.
|
|
||||||
/// This should open a window and ask the user to login or unlock the vault if necessary.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>When vault has been unlocked.</returns>
|
|
||||||
Task EnsureUnlockedVaultAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Bit.Core.Enums;
|
using System.Threading.Tasks;
|
||||||
|
using Bit.Core.Enums;
|
||||||
|
|
||||||
namespace Bit.App.Abstractions
|
namespace Bit.App.Abstractions
|
||||||
{
|
{
|
||||||
@@ -9,7 +10,5 @@ namespace Bit.App.Abstractions
|
|||||||
Task<bool> PromptAndCheckPasswordIfNeededAsync(CipherRepromptType repromptType = CipherRepromptType.Password);
|
Task<bool> PromptAndCheckPasswordIfNeededAsync(CipherRepromptType repromptType = CipherRepromptType.Password);
|
||||||
|
|
||||||
Task<(string password, bool valid)> ShowPasswordPromptAndGetItAsync();
|
Task<(string password, bool valid)> ShowPasswordPromptAndGetItAsync();
|
||||||
|
|
||||||
Task<bool> ShouldByPassMasterPasswordRepromptAsync();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using Bit.Core.Enums;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Bit.Core.Enums;
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
namespace Bit.Core.Abstractions
|
||||||
{
|
{
|
||||||
@@ -26,7 +29,7 @@ namespace Bit.Core.Abstractions
|
|||||||
bool SupportsDuo();
|
bool SupportsDuo();
|
||||||
Task<bool> SupportsBiometricAsync();
|
Task<bool> SupportsBiometricAsync();
|
||||||
Task<bool> IsBiometricIntegrityValidAsync(string bioIntegritySrcKey = null);
|
Task<bool> IsBiometricIntegrityValidAsync(string bioIntegritySrcKey = null);
|
||||||
Task<bool?> AuthenticateBiometricAsync(string text = null, string fallbackText = null, Action fallback = null, bool logOutOnTooManyAttempts = false, bool allowAlternativeAuthentication = false);
|
Task<bool> AuthenticateBiometricAsync(string text = null, string fallbackText = null, Action fallback = null, bool logOutOnTooManyAttempts = false);
|
||||||
long GetActiveTime();
|
long GetActiveTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,7 +186,6 @@ namespace Bit.Core.Abstractions
|
|||||||
Task<BwRegion?> GetActiveUserRegionAsync();
|
Task<BwRegion?> GetActiveUserRegionAsync();
|
||||||
Task<BwRegion?> GetPreAuthRegionAsync();
|
Task<BwRegion?> GetPreAuthRegionAsync();
|
||||||
Task SetPreAuthRegionAsync(BwRegion value);
|
Task SetPreAuthRegionAsync(BwRegion value);
|
||||||
Task ReloadStateAsync();
|
|
||||||
[Obsolete("Use GetPinKeyEncryptedUserKeyAsync instead, left for migration purposes")]
|
[Obsolete("Use GetPinKeyEncryptedUserKeyAsync instead, left for migration purposes")]
|
||||||
Task<string> GetPinProtectedAsync(string userId = null);
|
Task<string> GetPinProtectedAsync(string userId = null);
|
||||||
[Obsolete("Use SetPinKeyEncryptedUserKeyAsync instead, left for migration purposes")]
|
[Obsolete("Use SetPinKeyEncryptedUserKeyAsync instead, left for migration purposes")]
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
using Bit.Core.Services;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
namespace Bit.Core.Abstractions
|
||||||
{
|
{
|
||||||
public interface IUserPinService
|
public interface IUserPinService
|
||||||
{
|
{
|
||||||
Task<bool> IsPinLockEnabledAsync();
|
|
||||||
Task SetupPinAsync(string pin, bool requireMasterPasswordOnRestart);
|
Task SetupPinAsync(string pin, bool requireMasterPasswordOnRestart);
|
||||||
Task<bool> VerifyPinAsync(string inputPin);
|
|
||||||
Task<bool> VerifyPinAsync(string inputPin, string email, KdfConfig kdfConfig, PinLockType pinLockType);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
using Bit.Core.Utilities;
|
|
||||||
using Bit.Core.Utilities.Fido2;
|
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
|
||||||
{
|
|
||||||
public interface IUserVerificationMediatorService
|
|
||||||
{
|
|
||||||
Task<CancellableResult<bool>> VerifyUserForFido2Async(Fido2UserVerificationOptions options);
|
|
||||||
Task<bool> CanPerformUserVerificationPreferredAsync(Fido2UserVerificationOptions options);
|
|
||||||
Task<bool> ShouldPerformMasterPasswordRepromptAsync(Fido2UserVerificationOptions options);
|
|
||||||
Task<bool> ShouldEnforceFido2RequiredUserVerificationAsync(Fido2UserVerificationOptions options);
|
|
||||||
Task<CancellableResult<UVResult>> PerformOSUnlockAsync();
|
|
||||||
Task<CancellableResult<UVResult>> VerifyPinCodeAsync();
|
|
||||||
Task<CancellableResult<UVResult>> VerifyMasterPasswordAsync(bool isMasterPasswordReprompt);
|
|
||||||
|
|
||||||
public struct UVResult
|
|
||||||
{
|
|
||||||
public UVResult(bool canPerform, bool isVerified)
|
|
||||||
{
|
|
||||||
CanPerform = canPerform;
|
|
||||||
IsVerified = isVerified;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool CanPerform { get; set; }
|
|
||||||
public bool IsVerified { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
using Bit.Core.Enums;
|
using System.Threading.Tasks;
|
||||||
|
using Bit.Core.Enums;
|
||||||
|
|
||||||
namespace Bit.Core.Abstractions
|
namespace Bit.Core.Abstractions
|
||||||
{
|
{
|
||||||
public interface IUserVerificationService
|
public interface IUserVerificationService
|
||||||
{
|
{
|
||||||
Task<bool> VerifyUser(string secret, VerificationType verificationType);
|
Task<bool> VerifyUser(string secret, VerificationType verificationType);
|
||||||
Task<bool> VerifyMasterPasswordAsync(string masterPassword);
|
|
||||||
Task<bool> HasMasterPasswordAsync(bool checkMasterKeyHash = false);
|
Task<bool> HasMasterPasswordAsync(bool checkMasterKeyHash = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ using Bit.Core;
|
|||||||
using Bit.Core.Abstractions;
|
using Bit.Core.Abstractions;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Core.Models.Domain;
|
|
||||||
using Bit.Core.Models.Response;
|
using Bit.Core.Models.Response;
|
||||||
using Bit.Core.Pages;
|
using Bit.Core.Pages;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
@@ -168,27 +167,18 @@ namespace Bit.App
|
|||||||
|
|
||||||
_accountsManager.Init(() => Options, this);
|
_accountsManager.Init(() => Options, this);
|
||||||
|
|
||||||
_broadcasterService.Subscribe(nameof(App), BroadcastServiceMessageCallbackAsync);
|
|
||||||
|
|
||||||
Bootstrap();
|
Bootstrap();
|
||||||
}
|
_broadcasterService.Subscribe(nameof(App), async (message) =>
|
||||||
|
|
||||||
private async void BroadcastServiceMessageCallbackAsync(Message message)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(message);
|
|
||||||
if (message.Command == "showDialog")
|
if (message.Command == "showDialog")
|
||||||
{
|
{
|
||||||
var details = message.Data as DialogDetails;
|
var details = message.Data as DialogDetails;
|
||||||
ArgumentNullException.ThrowIfNull(details);
|
|
||||||
ArgumentNullException.ThrowIfNull(MainPage);
|
|
||||||
|
|
||||||
var confirmed = true;
|
var confirmed = true;
|
||||||
var confirmText = string.IsNullOrWhiteSpace(details.ConfirmText) ?
|
var confirmText = string.IsNullOrWhiteSpace(details.ConfirmText) ?
|
||||||
AppResources.Ok : details.ConfirmText;
|
AppResources.Ok : details.ConfirmText;
|
||||||
await MainThread.InvokeOnMainThreadAsync(ShowDialogAction);
|
await MainThread.InvokeOnMainThreadAsync(async () =>
|
||||||
async Task ShowDialogAction()
|
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(details.CancelText))
|
if (!string.IsNullOrWhiteSpace(details.CancelText))
|
||||||
{
|
{
|
||||||
@@ -200,7 +190,7 @@ namespace Bit.App
|
|||||||
await MainPage.DisplayAlert(details.Title, details.Text, confirmText);
|
await MainPage.DisplayAlert(details.Title, details.Text, confirmText);
|
||||||
}
|
}
|
||||||
_messagingService.Send("showDialogResolve", new Tuple<int, bool>(details.DialogId, confirmed));
|
_messagingService.Send("showDialogResolve", new Tuple<int, bool>(details.DialogId, confirmed));
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
#if IOS
|
#if IOS
|
||||||
else if (message.Command == AppHelpers.RESUMED_MESSAGE_COMMAND)
|
else if (message.Command == AppHelpers.RESUMED_MESSAGE_COMMAND)
|
||||||
@@ -228,13 +218,10 @@ namespace Bit.App
|
|||||||
Options.OtpData = new OtpData((string)message.Data);
|
Options.OtpData = new OtpData((string)message.Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
await MainThread.InvokeOnMainThreadAsync(ExecuteNavigationAction);
|
await MainThread.InvokeOnMainThreadAsync(async () =>
|
||||||
async Task ExecuteNavigationAction()
|
|
||||||
{
|
{
|
||||||
if (MainPage is TabsPage tabsPage)
|
if (MainPage is TabsPage tabsPage)
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(tabsPage.Navigation);
|
|
||||||
ArgumentNullException.ThrowIfNull(tabsPage.Navigation.ModalStack);
|
|
||||||
while (tabsPage.Navigation.ModalStack.Count > 0)
|
while (tabsPage.Navigation.ModalStack.Count > 0)
|
||||||
{
|
{
|
||||||
await tabsPage.Navigation.PopModalAsync(false);
|
await tabsPage.Navigation.PopModalAsync(false);
|
||||||
@@ -260,41 +247,31 @@ namespace Bit.App
|
|||||||
else if (message.Command == DeepLinkContext.NEW_OTP_MESSAGE)
|
else if (message.Command == DeepLinkContext.NEW_OTP_MESSAGE)
|
||||||
{
|
{
|
||||||
tabsPage.ResetToVaultPage();
|
tabsPage.ResetToVaultPage();
|
||||||
ArgumentNullException.ThrowIfNull(tabsPage.Navigation);
|
|
||||||
await tabsPage.Navigation.PushModalAsync(new NavigationPage(new CipherSelectionPage(Options)));
|
await tabsPage.Navigation.PushModalAsync(new NavigationPage(new CipherSelectionPage(Options)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
else if (message.Command == "convertAccountToKeyConnector")
|
else if (message.Command == "convertAccountToKeyConnector")
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(MainPage);
|
await MainThread.InvokeOnMainThreadAsync(async () =>
|
||||||
await MainThread.InvokeOnMainThreadAsync(NavigateToRemoveMasterPasswordPageAction);
|
|
||||||
async Task NavigateToRemoveMasterPasswordPageAction()
|
|
||||||
{
|
{
|
||||||
await MainPage.Navigation.PushModalAsync(
|
await MainPage.Navigation.PushModalAsync(
|
||||||
new NavigationPage(new RemoveMasterPasswordPage()));
|
new NavigationPage(new RemoveMasterPasswordPage()));
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
else if (message.Command == Constants.ForceUpdatePassword)
|
else if (message.Command == Constants.ForceUpdatePassword)
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(MainPage);
|
await MainThread.InvokeOnMainThreadAsync(async () =>
|
||||||
await MainThread.InvokeOnMainThreadAsync(NavigateToUpdateTempPasswordPageAction);
|
|
||||||
async Task NavigateToUpdateTempPasswordPageAction()
|
|
||||||
{
|
{
|
||||||
await MainPage.Navigation.PushModalAsync(
|
await MainPage.Navigation.PushModalAsync(
|
||||||
new NavigationPage(new UpdateTempPasswordPage()));
|
new NavigationPage(new UpdateTempPasswordPage()));
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
else if (message.Command == Constants.ForceSetPassword)
|
else if (message.Command == Constants.ForceSetPassword)
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(MainPage);
|
await MainThread.InvokeOnMainThreadAsync(() => MainPage.Navigation.PushModalAsync(
|
||||||
await MainThread.InvokeOnMainThreadAsync(NavigateToSetPasswordPageAction);
|
new NavigationPage(new SetPasswordPage(orgIdentifier: (string)message.Data))));
|
||||||
void NavigateToSetPasswordPageAction()
|
|
||||||
{
|
|
||||||
MainPage.Navigation.PushModalAsync(
|
|
||||||
new NavigationPage(new SetPasswordPage(orgIdentifier: (string)message.Data)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (message.Command == "syncCompleted")
|
else if (message.Command == "syncCompleted")
|
||||||
{
|
{
|
||||||
@@ -315,6 +292,7 @@ namespace Bit.App
|
|||||||
{
|
{
|
||||||
LoggerHelper.LogEvenIfCantBeResolved(ex);
|
LoggerHelper.LogEvenIfCantBeResolved(ex);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task CheckPasswordlessLoginRequestsAsync()
|
private async Task CheckPasswordlessLoginRequestsAsync()
|
||||||
@@ -329,6 +307,7 @@ namespace Bit.App
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var notification = await _stateService.GetPasswordlessLoginNotificationAsync();
|
var notification = await _stateService.GetPasswordlessLoginNotificationAsync();
|
||||||
if (notification == null)
|
if (notification == null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
<PackageReference Include="CsvHelper" Version="30.0.1" />
|
<PackageReference Include="CsvHelper" Version="30.0.1" />
|
||||||
<PackageReference Include="LiteDB" Version="5.0.17" />
|
<PackageReference Include="LiteDB" Version="5.0.17" />
|
||||||
<PackageReference Include="PCLCrypto" Version="2.1.40-alpha" />
|
<PackageReference Include="PCLCrypto" Version="2.1.40-alpha" />
|
||||||
<PackageReference Include="System.Formats.Cbor" Version="8.0.0" />
|
|
||||||
<PackageReference Include="zxcvbn-core" Version="7.0.92" />
|
<PackageReference Include="zxcvbn-core" Version="7.0.92" />
|
||||||
<PackageReference Include="MessagePack.MSBuild.Tasks" Version="2.5.124">
|
<PackageReference Include="MessagePack.MSBuild.Tasks" Version="2.5.124">
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
@@ -53,7 +52,6 @@
|
|||||||
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
|
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
|
||||||
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" />
|
<PackageReference Include="Xamarin.AndroidX.AutoFill" Version="1.1.0.18" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" />
|
<PackageReference Include="Xamarin.AndroidX.Activity.Ktx" Version="1.7.2.1" />
|
||||||
<PackageReference Include="Xamarin.AndroidX.Credentials" Version="1.0.0" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' AND !$(DefineConstants.Contains(FDROID))">
|
<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android' AND !$(DefineConstants.Contains(FDROID))">
|
||||||
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet" Version="118.0.1.5" />
|
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet" Version="118.0.1.5" />
|
||||||
@@ -77,10 +75,8 @@
|
|||||||
<Folder Include="Utilities\Automation\" />
|
<Folder Include="Utilities\Automation\" />
|
||||||
<Folder Include="Utilities\Prompts\" />
|
<Folder Include="Utilities\Prompts\" />
|
||||||
<Folder Include="Resources\Localization\" />
|
<Folder Include="Resources\Localization\" />
|
||||||
<Folder Include="Utilities\Fido2\" />
|
|
||||||
<Folder Include="Controls\Picker\" />
|
<Folder Include="Controls\Picker\" />
|
||||||
<Folder Include="Controls\Avatar\" />
|
<Folder Include="Controls\Avatar\" />
|
||||||
<Folder Include="Services\UserVerification\" />
|
|
||||||
<Folder Include="Utilities\WebAuthenticatorMAUI\" />
|
<Folder Include="Utilities\WebAuthenticatorMAUI\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -110,10 +106,8 @@
|
|||||||
</MauiXaml>
|
</MauiXaml>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="Utilities\Fido2\" />
|
|
||||||
<None Remove="Controls\Picker\" />
|
<None Remove="Controls\Picker\" />
|
||||||
<None Remove="Controls\Avatar\" />
|
<None Remove="Controls\Avatar\" />
|
||||||
<None Remove="Services\UserVerification\" />
|
|
||||||
<None Remove="Utilities\WebAuthenticatorMAUI\" />
|
<None Remove="Utilities\WebAuthenticatorMAUI\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Bit.Core.Models.Domain;
|
using System;
|
||||||
|
using Bit.Core.Models.Domain;
|
||||||
|
|
||||||
namespace Bit.Core.Models.Api
|
namespace Bit.Core.Models.Api
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,6 @@ namespace Bit.Core.Models.Api
|
|||||||
RpName = fido2Key.RpName?.EncryptedString;
|
RpName = fido2Key.RpName?.EncryptedString;
|
||||||
UserHandle = fido2Key.UserHandle?.EncryptedString;
|
UserHandle = fido2Key.UserHandle?.EncryptedString;
|
||||||
UserName = fido2Key.UserName?.EncryptedString;
|
UserName = fido2Key.UserName?.EncryptedString;
|
||||||
UserDisplayName = fido2Key.UserDisplayName?.EncryptedString;
|
|
||||||
Counter = fido2Key.Counter?.EncryptedString;
|
Counter = fido2Key.Counter?.EncryptedString;
|
||||||
CreationDate = fido2Key.CreationDate;
|
CreationDate = fido2Key.CreationDate;
|
||||||
}
|
}
|
||||||
@@ -35,7 +35,6 @@ namespace Bit.Core.Models.Api
|
|||||||
public string RpName { get; set; }
|
public string RpName { get; set; }
|
||||||
public string UserHandle { get; set; }
|
public string UserHandle { get; set; }
|
||||||
public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
public string UserDisplayName { get; set; }
|
|
||||||
public string Counter { get; set; }
|
public string Counter { get; set; }
|
||||||
public DateTime CreationDate { get; set; }
|
public DateTime CreationDate { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ namespace Bit.Core.Models.Data
|
|||||||
RpName = apiData.RpName;
|
RpName = apiData.RpName;
|
||||||
UserHandle = apiData.UserHandle;
|
UserHandle = apiData.UserHandle;
|
||||||
UserName = apiData.UserName;
|
UserName = apiData.UserName;
|
||||||
UserDisplayName = apiData.UserDisplayName;
|
|
||||||
Counter = apiData.Counter;
|
Counter = apiData.Counter;
|
||||||
CreationDate = apiData.CreationDate;
|
CreationDate = apiData.CreationDate;
|
||||||
}
|
}
|
||||||
@@ -34,7 +33,6 @@ namespace Bit.Core.Models.Data
|
|||||||
public string RpName { get; set; }
|
public string RpName { get; set; }
|
||||||
public string UserHandle { get; set; }
|
public string UserHandle { get; set; }
|
||||||
public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
public string UserDisplayName { get; set; }
|
|
||||||
public string Counter { get; set; }
|
public string Counter { get; set; }
|
||||||
public DateTime CreationDate { get; set; }
|
public DateTime CreationDate { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
using Bit.Core.Models.Data;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Core.Models.View;
|
using Bit.Core.Models.View;
|
||||||
|
|
||||||
namespace Bit.Core.Models.Domain
|
namespace Bit.Core.Models.Domain
|
||||||
@@ -17,7 +21,6 @@ namespace Bit.Core.Models.Domain
|
|||||||
nameof(RpName),
|
nameof(RpName),
|
||||||
nameof(UserHandle),
|
nameof(UserHandle),
|
||||||
nameof(UserName),
|
nameof(UserName),
|
||||||
nameof(UserDisplayName),
|
|
||||||
nameof(Counter)
|
nameof(Counter)
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -45,7 +48,6 @@ namespace Bit.Core.Models.Domain
|
|||||||
public EncString RpName { get; set; }
|
public EncString RpName { get; set; }
|
||||||
public EncString UserHandle { get; set; }
|
public EncString UserHandle { get; set; }
|
||||||
public EncString UserName { get; set; }
|
public EncString UserName { get; set; }
|
||||||
public EncString UserDisplayName { get; set; }
|
|
||||||
public EncString Counter { get; set; }
|
public EncString Counter { get; set; }
|
||||||
public DateTime CreationDate { get; set; }
|
public DateTime CreationDate { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Bit.Core.Enums;
|
using System;
|
||||||
|
using Bit.Core.Enums;
|
||||||
|
|
||||||
namespace Bit.Core.Models.Domain
|
namespace Bit.Core.Models.Domain
|
||||||
{
|
{
|
||||||
@@ -8,7 +9,7 @@ namespace Bit.Core.Models.Domain
|
|||||||
{
|
{
|
||||||
if (key == null)
|
if (key == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentKeyNullException(nameof(key));
|
throw new Exception("Must provide key.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (encType == null)
|
if (encType == null)
|
||||||
@@ -23,7 +24,7 @@ namespace Bit.Core.Models.Domain
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new InvalidKeyOperationException("Unable to determine encType.");
|
throw new Exception("Unable to determine encType.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@ namespace Bit.Core.Models.Domain
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new InvalidKeyOperationException("Unsupported encType/key length.");
|
throw new Exception("Unsupported encType/key length.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Key != null)
|
if (Key != null)
|
||||||
@@ -71,32 +72,6 @@ namespace Bit.Core.Models.Domain
|
|||||||
public string KeyB64 { get; set; }
|
public string KeyB64 { get; set; }
|
||||||
public string EncKeyB64 { get; set; }
|
public string EncKeyB64 { get; set; }
|
||||||
public string MacKeyB64 { get; set; }
|
public string MacKeyB64 { get; set; }
|
||||||
|
|
||||||
public class ArgumentKeyNullException : ArgumentNullException
|
|
||||||
{
|
|
||||||
public ArgumentKeyNullException(string paramName) : base(paramName)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArgumentKeyNullException(string message, Exception innerException) : base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArgumentKeyNullException(string paramName, string message) : base(paramName, message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InvalidKeyOperationException : InvalidOperationException
|
|
||||||
{
|
|
||||||
public InvalidKeyOperationException(string message) : base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public InvalidKeyOperationException(string message, Exception innerException) : base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UserKey : SymmetricCryptoKey
|
public class UserKey : SymmetricCryptoKey
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using Bit.Core.Enums;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
|
|
||||||
namespace Bit.Core.Models.View
|
namespace Bit.Core.Models.View
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using System.Text.Json.Serialization;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Utilities;
|
|
||||||
|
|
||||||
namespace Bit.Core.Models.View
|
namespace Bit.Core.Models.View
|
||||||
{
|
{
|
||||||
@@ -26,42 +26,13 @@ namespace Bit.Core.Models.View
|
|||||||
public string RpName { get; set; }
|
public string RpName { get; set; }
|
||||||
public string UserHandle { get; set; }
|
public string UserHandle { get; set; }
|
||||||
public string UserName { get; set; }
|
public string UserName { get; set; }
|
||||||
public string UserDisplayName { get; set; }
|
|
||||||
public string Counter { get; set; }
|
public string Counter { get; set; }
|
||||||
public DateTime CreationDate { get; set; }
|
public DateTime CreationDate { get; set; }
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public int CounterValue {
|
|
||||||
get => int.TryParse(Counter, out var counter) ? counter : 0;
|
|
||||||
set => Counter = value.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public byte[] UserHandleValue {
|
|
||||||
get => UserHandle == null ? null : CoreHelpers.Base64UrlDecode(UserHandle);
|
|
||||||
set => UserHandle = value == null ? null : CoreHelpers.Base64UrlEncode(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public byte[] KeyBytes {
|
|
||||||
get => KeyValue == null ? null : CoreHelpers.Base64UrlDecode(KeyValue);
|
|
||||||
set => KeyValue = value == null ? null : CoreHelpers.Base64UrlEncode(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public bool DiscoverableValue {
|
|
||||||
get => bool.TryParse(Discoverable, out var discoverable) && discoverable;
|
|
||||||
set => Discoverable = value.ToString().ToLower();
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public override string SubTitle => UserName;
|
public override string SubTitle => UserName;
|
||||||
|
|
||||||
public override List<KeyValuePair<string, LinkedIdType>> LinkedFieldOptions => new List<KeyValuePair<string, LinkedIdType>>();
|
public override List<KeyValuePair<string, LinkedIdType>> LinkedFieldOptions => new List<KeyValuePair<string, LinkedIdType>>();
|
||||||
|
public bool IsDiscoverable => !string.IsNullOrWhiteSpace(Discoverable);
|
||||||
[JsonIgnore]
|
|
||||||
public bool CanLaunch => !string.IsNullOrEmpty(RpId);
|
public bool CanLaunch => !string.IsNullOrEmpty(RpId);
|
||||||
[JsonIgnore]
|
|
||||||
public string LaunchUri => $"https://{RpId}";
|
public string LaunchUri => $"https://{RpId}";
|
||||||
|
|
||||||
public bool IsUniqueAgainst(Fido2CredentialView fido2View) => fido2View?.RpId != RpId || fido2View?.UserName != UserName;
|
public bool IsUniqueAgainst(Fido2CredentialView fido2View) => fido2View?.RpId != RpId || fido2View?.UserName != UserName;
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
using Bit.Core.Enums;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Domain;
|
using Bit.Core.Models.Domain;
|
||||||
using Bit.Core.Resources.Localization;
|
|
||||||
using Bit.Core.Utilities;
|
|
||||||
|
|
||||||
namespace Bit.Core.Models.View
|
namespace Bit.Core.Models.View
|
||||||
{
|
{
|
||||||
@@ -39,15 +40,4 @@ namespace Bit.Core.Models.View
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class LoginViewExtensions
|
|
||||||
{
|
|
||||||
public static string GetMainFido2CredentialUsername(this LoginView loginView)
|
|
||||||
{
|
|
||||||
return loginView.MainFido2Credential.UserName
|
|
||||||
.FallbackOnNullOrWhiteSpace(loginView.MainFido2Credential.UserDisplayName)
|
|
||||||
.FallbackOnNullOrWhiteSpace(loginView.Username)
|
|
||||||
.FallbackOnNullOrWhiteSpace(AppResources.UnknownAccount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,10 +21,6 @@
|
|||||||
<ScrollView>
|
<ScrollView>
|
||||||
<StackLayout Spacing="20">
|
<StackLayout Spacing="20">
|
||||||
<StackLayout StyleClass="box">
|
<StackLayout StyleClass="box">
|
||||||
<StackLayout StyleClass="box-row-header">
|
|
||||||
<Label Text="MAUI APP"
|
|
||||||
StyleClass="box-header, box-header-platform" />
|
|
||||||
</StackLayout>
|
|
||||||
<StackLayout StyleClass="box-row-header">
|
<StackLayout StyleClass="box-row-header">
|
||||||
<Label Text="{u:I18n SelfHostedEnvironment, Header=True}"
|
<Label Text="{u:I18n SelfHostedEnvironment, Header=True}"
|
||||||
StyleClass="box-header, box-header-platform" />
|
StyleClass="box-header, box-header-platform" />
|
||||||
|
|||||||
@@ -515,7 +515,7 @@ namespace Bit.App.Pages
|
|||||||
var success = await _platformUtilsService.AuthenticateBiometricAsync(null,
|
var success = await _platformUtilsService.AuthenticateBiometricAsync(null,
|
||||||
PinEnabled ? AppResources.PIN : AppResources.MasterPassword,
|
PinEnabled ? AppResources.PIN : AppResources.MasterPassword,
|
||||||
() => _secretEntryFocusWeakEventManager.RaiseEvent((int?)null, nameof(FocusSecretEntry)),
|
() => _secretEntryFocusWeakEventManager.RaiseEvent((int?)null, nameof(FocusSecretEntry)),
|
||||||
!PinEnabled && !HasMasterPassword) ?? false;
|
!PinEnabled && !HasMasterPassword);
|
||||||
|
|
||||||
await _stateService.SetBiometricLockedAsync(!success);
|
await _stateService.SetBiometricLockedAsync(!success);
|
||||||
if (success)
|
if (success)
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
FontAttributes="Bold"/>
|
FontAttributes="Bold"/>
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding LoginRequest.FingerprintPhrase}"
|
FormattedText="{Binding LoginRequest.FingerprintPhrase}"
|
||||||
FontSize="Medium"
|
FontSize="Medium"
|
||||||
TextColor="{DynamicResource FingerprintPhrase}"
|
TextColor="{DynamicResource FingerprintPhrase}"
|
||||||
Margin="0,0,0,27"
|
Margin="0,0,0,27"
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
FontAttributes="Bold" />
|
FontAttributes="Bold" />
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding FingerprintPhrase}"
|
FormattedText="{Binding FingerprintPhrase}"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
TextColor="{DynamicResource FingerprintPhrase}"
|
TextColor="{DynamicResource FingerprintPhrase}"
|
||||||
AutomationId="FingerprintPhraseValue" />
|
AutomationId="FingerprintPhraseValue" />
|
||||||
|
|||||||
@@ -68,8 +68,7 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
// TODO: REMOVE WHEN MERGED INTO MAIN BRANCH
|
var appInfo = string.Format("{0}: {1} ({2})",
|
||||||
var appInfo = string.Format("MAUI {0}: {1} ({2})",
|
|
||||||
AppResources.Version,
|
AppResources.Version,
|
||||||
_platformUtilsService.GetApplicationVersion(),
|
_platformUtilsService.GetApplicationVersion(),
|
||||||
_deviceActionService.GetBuildNumber());
|
_deviceActionService.GetBuildNumber());
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
x:Class="Bit.App.Pages.AutofillPage"
|
x:Class="Bit.App.Pages.AutofillPage"
|
||||||
xmlns:pages="clr-namespace:Bit.App.Pages"
|
xmlns:pages="clr-namespace:Bit.App.Pages"
|
||||||
xmlns:u="clr-namespace:Bit.App.Utilities"
|
xmlns:u="clr-namespace:Bit.App.Utilities"
|
||||||
Title="{u:I18n SetUpAutofill}">
|
Title="{u:I18n PasswordAutofill}">
|
||||||
|
|
||||||
<ContentPage.ToolbarItems>
|
<ContentPage.ToolbarItems>
|
||||||
<ToolbarItem Text="{u:I18n Close}" Clicked="Close_Clicked" Order="Primary" Priority="-1" />
|
<ToolbarItem Text="{u:I18n Close}" Clicked="Close_Clicked" Order="Primary" Priority="-1" />
|
||||||
@@ -15,22 +15,26 @@
|
|||||||
<StackLayout Spacing="5"
|
<StackLayout Spacing="5"
|
||||||
Padding="20, 20, 20, 30"
|
Padding="20, 20, 20, 30"
|
||||||
VerticalOptions="FillAndExpand">
|
VerticalOptions="FillAndExpand">
|
||||||
<Label Text="{u:I18n GetInstantAccessToYourPasswordsAndPasskeys}"
|
<Label Text="{u:I18n ExtensionInstantAccess}"
|
||||||
HorizontalOptions="Center"
|
HorizontalOptions="Center"
|
||||||
HorizontalTextAlignment="Center"
|
HorizontalTextAlignment="Center"
|
||||||
LineBreakMode="WordWrap"
|
LineBreakMode="WordWrap"
|
||||||
StyleClass="text-lg"
|
StyleClass="text-lg"
|
||||||
Margin="0, 0, 0, 15" />
|
Margin="0, 0, 0, 15" />
|
||||||
<Label Text="{u:I18n SetUpAutoFillDescriptionLong}"
|
<Label Text="{u:I18n AutofillTurnOn}"
|
||||||
HorizontalOptions="Center"
|
HorizontalOptions="Center"
|
||||||
HorizontalTextAlignment="Center"
|
HorizontalTextAlignment="Center"
|
||||||
LineBreakMode="WordWrap"
|
LineBreakMode="WordWrap"
|
||||||
Margin="0, 0, 0, 15" />
|
Margin="0, 0, 0, 15" />
|
||||||
<Label Text="{u:I18n FirstDotGoToYourDeviceSettingsPasswordsPasswordOptions}"
|
<Label Text="{u:I18n AutofillTurnOn1}"
|
||||||
LineBreakMode="WordWrap" />
|
LineBreakMode="WordWrap" />
|
||||||
<Label Text="{u:I18n SecondDotTurnOnAutoFill}"
|
<Label Text="{u:I18n AutofillTurnOn2}"
|
||||||
LineBreakMode="WordWrap" />
|
LineBreakMode="WordWrap" />
|
||||||
<Label Text="{u:I18n ThirdDotSelectBitwardenToUseForPasswordsAndPasskeys}"
|
<Label Text="{u:I18n AutofillTurnOn3}"
|
||||||
|
LineBreakMode="WordWrap" />
|
||||||
|
<Label Text="{u:I18n AutofillTurnOn4}"
|
||||||
|
LineBreakMode="WordWrap" />
|
||||||
|
<Label Text="{u:I18n AutofillTurnOn5}"
|
||||||
LineBreakMode="WordWrap" />
|
LineBreakMode="WordWrap" />
|
||||||
<Image Source="autofill-kb.png"
|
<Image Source="autofill-kb.png"
|
||||||
VerticalOptions="CenterAndExpand"
|
VerticalOptions="CenterAndExpand"
|
||||||
|
|||||||
@@ -19,15 +19,6 @@
|
|||||||
Text="{u:I18n Autofill}"
|
Text="{u:I18n Autofill}"
|
||||||
StyleClass="settings-header" />
|
StyleClass="settings-header" />
|
||||||
|
|
||||||
<controls:SwitchItemView
|
|
||||||
Title="{u:I18n CredentialProviderService}"
|
|
||||||
Subtitle="{u:I18n CredentialProviderServiceExplanationLong}"
|
|
||||||
IsVisible="{Binding SupportsCredentialProviderService}"
|
|
||||||
IsToggled="{Binding UseCredentialProviderService}"
|
|
||||||
AutomationId="CredentialProviderServiceSwitch"
|
|
||||||
StyleClass="settings-item-view"
|
|
||||||
HorizontalOptions="FillAndExpand" />
|
|
||||||
|
|
||||||
<controls:SwitchItemView
|
<controls:SwitchItemView
|
||||||
Title="{u:I18n AutofillServices}"
|
Title="{u:I18n AutofillServices}"
|
||||||
Subtitle="{u:I18n AutofillServicesExplanationLong}"
|
Subtitle="{u:I18n AutofillServicesExplanationLong}"
|
||||||
|
|||||||
@@ -6,27 +6,12 @@ namespace Bit.App.Pages
|
|||||||
{
|
{
|
||||||
public partial class AutofillSettingsPageViewModel
|
public partial class AutofillSettingsPageViewModel
|
||||||
{
|
{
|
||||||
private bool _useCredentialProviderService;
|
|
||||||
private bool _useAutofillServices;
|
private bool _useAutofillServices;
|
||||||
private bool _useInlineAutofill;
|
private bool _useInlineAutofill;
|
||||||
private bool _useAccessibility;
|
private bool _useAccessibility;
|
||||||
private bool _useDrawOver;
|
private bool _useDrawOver;
|
||||||
private bool _askToAddLogin;
|
private bool _askToAddLogin;
|
||||||
|
|
||||||
public bool SupportsCredentialProviderService => DeviceInfo.Platform == DevicePlatform.Android && _deviceActionService.SupportsCredentialProviderService();
|
|
||||||
|
|
||||||
public bool UseCredentialProviderService
|
|
||||||
{
|
|
||||||
get => _useCredentialProviderService;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (SetProperty(ref _useCredentialProviderService, value))
|
|
||||||
{
|
|
||||||
((ICommand)ToggleUseCredentialProviderServiceCommand).Execute(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool SupportsAndroidAutofillServices => DeviceInfo.Platform == DevicePlatform.Android && _deviceActionService.SupportsAutofillServices();
|
public bool SupportsAndroidAutofillServices => DeviceInfo.Platform == DevicePlatform.Android && _deviceActionService.SupportsAutofillServices();
|
||||||
|
|
||||||
public bool UseAutofillServices
|
public bool UseAutofillServices
|
||||||
@@ -99,7 +84,6 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public AsyncRelayCommand ToggleUseCredentialProviderServiceCommand { get; private set; }
|
|
||||||
public AsyncRelayCommand ToggleUseAutofillServicesCommand { get; private set; }
|
public AsyncRelayCommand ToggleUseAutofillServicesCommand { get; private set; }
|
||||||
public AsyncRelayCommand ToggleUseInlineAutofillCommand { get; private set; }
|
public AsyncRelayCommand ToggleUseInlineAutofillCommand { get; private set; }
|
||||||
public AsyncRelayCommand ToggleUseAccessibilityCommand { get; private set; }
|
public AsyncRelayCommand ToggleUseAccessibilityCommand { get; private set; }
|
||||||
@@ -109,7 +93,6 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private void InitAndroidCommands()
|
private void InitAndroidCommands()
|
||||||
{
|
{
|
||||||
ToggleUseCredentialProviderServiceCommand = CreateDefaultAsyncRelayCommand(() => MainThread.InvokeOnMainThreadAsync(() => ToggleUseCredentialProviderService()), () => _inited, allowsMultipleExecutions: false);
|
|
||||||
ToggleUseAutofillServicesCommand = CreateDefaultAsyncRelayCommand(() => MainThread.InvokeOnMainThreadAsync(() => ToggleUseAutofillServices()), () => _inited, allowsMultipleExecutions: false);
|
ToggleUseAutofillServicesCommand = CreateDefaultAsyncRelayCommand(() => MainThread.InvokeOnMainThreadAsync(() => ToggleUseAutofillServices()), () => _inited, allowsMultipleExecutions: false);
|
||||||
ToggleUseInlineAutofillCommand = CreateDefaultAsyncRelayCommand(() => MainThread.InvokeOnMainThreadAsync(() => ToggleUseInlineAutofillEnabledAsync()), () => _inited, allowsMultipleExecutions: false);
|
ToggleUseInlineAutofillCommand = CreateDefaultAsyncRelayCommand(() => MainThread.InvokeOnMainThreadAsync(() => ToggleUseInlineAutofillEnabledAsync()), () => _inited, allowsMultipleExecutions: false);
|
||||||
ToggleUseAccessibilityCommand = CreateDefaultAsyncRelayCommand(ToggleUseAccessibilityAsync, () => _inited, allowsMultipleExecutions: false);
|
ToggleUseAccessibilityCommand = CreateDefaultAsyncRelayCommand(ToggleUseAccessibilityAsync, () => _inited, allowsMultipleExecutions: false);
|
||||||
@@ -132,9 +115,6 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private async Task UpdateAndroidAutofillSettingsAsync()
|
private async Task UpdateAndroidAutofillSettingsAsync()
|
||||||
{
|
{
|
||||||
// TODO - uncomment once _autofillHandler.CredentialProviderServiceEnabled() returns a real value
|
|
||||||
// _useCredentialProviderService =
|
|
||||||
// SupportsCredentialProviderService && _autofillHandler.CredentialProviderServiceEnabled();
|
|
||||||
_useAutofillServices =
|
_useAutofillServices =
|
||||||
_autofillHandler.SupportsAutofillService() && _autofillHandler.AutofillServiceEnabled();
|
_autofillHandler.SupportsAutofillService() && _autofillHandler.AutofillServiceEnabled();
|
||||||
_useAccessibility = _autofillHandler.AutofillAccessibilityServiceRunning();
|
_useAccessibility = _autofillHandler.AutofillAccessibilityServiceRunning();
|
||||||
@@ -143,7 +123,6 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
await MainThread.InvokeOnMainThreadAsync(() =>
|
await MainThread.InvokeOnMainThreadAsync(() =>
|
||||||
{
|
{
|
||||||
TriggerPropertyChanged(nameof(UseCredentialProviderService));
|
|
||||||
TriggerPropertyChanged(nameof(UseAutofillServices));
|
TriggerPropertyChanged(nameof(UseAutofillServices));
|
||||||
TriggerPropertyChanged(nameof(UseAccessibility));
|
TriggerPropertyChanged(nameof(UseAccessibility));
|
||||||
TriggerPropertyChanged(nameof(UseDrawOver));
|
TriggerPropertyChanged(nameof(UseDrawOver));
|
||||||
@@ -151,18 +130,6 @@ namespace Bit.App.Pages
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ToggleUseCredentialProviderService()
|
|
||||||
{
|
|
||||||
if (UseCredentialProviderService)
|
|
||||||
{
|
|
||||||
_deviceActionService.OpenCredentialProviderSettings();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_autofillHandler.DisableCredentialProviderService();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ToggleUseAutofillServices()
|
private void ToggleUseAutofillServices()
|
||||||
{
|
{
|
||||||
if (UseAutofillServices)
|
if (UseAutofillServices)
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
FontAttributes="Bold"/>
|
FontAttributes="Bold"/>
|
||||||
<controls:MonoLabel
|
<controls:MonoLabel
|
||||||
Text="{Binding FingerprintPhrase}"
|
FormattedText="{Binding FingerprintPhrase}"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.ColumnSpan="2"
|
Grid.ColumnSpan="2"
|
||||||
FontSize="Small"
|
FontSize="Small"
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if (!_supportsBiometric
|
if (!_supportsBiometric
|
||||||
||
|
||
|
||||||
await _platformUtilsService.AuthenticateBiometricAsync(null, DeviceInfo.Platform == DevicePlatform.Android ? "." : null) != true)
|
!await _platformUtilsService.AuthenticateBiometricAsync(null, DeviceInfo.Platform == DevicePlatform.Android ? "." : null))
|
||||||
{
|
{
|
||||||
_canUnlockWithBiometrics = false;
|
_canUnlockWithBiometrics = false;
|
||||||
MainThread.BeginInvokeOnMainThread(() => TriggerPropertyChanged(nameof(CanUnlockWithBiometrics)));
|
MainThread.BeginInvokeOnMainThread(() => TriggerPropertyChanged(nameof(CanUnlockWithBiometrics)));
|
||||||
|
|||||||
@@ -96,14 +96,6 @@ namespace Bit.App.Pages
|
|||||||
if (message.Command == "syncCompleted")
|
if (message.Command == "syncCompleted")
|
||||||
{
|
{
|
||||||
MainThread.BeginInvokeOnMainThread(async () => await UpdateVaultButtonTitleAsync());
|
MainThread.BeginInvokeOnMainThread(async () => await UpdateVaultButtonTitleAsync());
|
||||||
try
|
|
||||||
{
|
|
||||||
await ForcePasswordResetIfNeededAsync();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.Value.Exception(ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await UpdateVaultButtonTitleAsync();
|
await UpdateVaultButtonTitleAsync();
|
||||||
|
|||||||
225
src/Core/Resources/Localization/AppResources.Designer.cs
generated
225
src/Core/Resources/Localization/AppResources.Designer.cs
generated
@@ -1318,15 +1318,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services..
|
|
||||||
/// </summary>
|
|
||||||
public static string BitwardenCredentialProviderGoToSettings {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("BitwardenCredentialProviderGoToSettings", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Bitwarden Help Center.
|
/// Looks up a localized string similar to Bitwarden Help Center.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1543,15 +1534,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Choose a login to save this passkey to.
|
|
||||||
/// </summary>
|
|
||||||
public static string ChooseALoginToSaveThisPasskeyTo {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ChooseALoginToSaveThisPasskeyTo", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Choose file.
|
/// Looks up a localized string similar to Choose file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1912,24 +1894,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Credential Provider service.
|
|
||||||
/// </summary>
|
|
||||||
public static string CredentialProviderService {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("CredentialProviderService", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to The Android Credential Provider is used for managing passkeys for use with websites and other apps on your device..
|
|
||||||
/// </summary>
|
|
||||||
public static string CredentialProviderServiceExplanationLong {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("CredentialProviderServiceExplanationLong", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Credits.
|
/// Looks up a localized string similar to Credits.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2632,24 +2596,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Error creating passkey.
|
|
||||||
/// </summary>
|
|
||||||
public static string ErrorCreatingPasskey {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ErrorCreatingPasskey", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Error reading passkey.
|
|
||||||
/// </summary>
|
|
||||||
public static string ErrorReadingPasskey {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ErrorReadingPasskey", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to EU.
|
/// Looks up a localized string similar to EU.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3190,15 +3136,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to 1. Go to your device's Settings > Passwords > Password Options.
|
|
||||||
/// </summary>
|
|
||||||
public static string FirstDotGoToYourDeviceSettingsPasswordsPasswordOptions {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("FirstDotGoToYourDeviceSettingsPasswordsPasswordOptions", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to First name.
|
/// Looks up a localized string similar to First name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -3388,15 +3325,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Get instant access to your passwords and passkeys!.
|
|
||||||
/// </summary>
|
|
||||||
public static string GetInstantAccessToYourPasswordsAndPasskeys {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("GetInstantAccessToYourPasswordsAndPasskeys", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Get master password hint.
|
/// Looks up a localized string similar to Get master password hint.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5200,15 +5128,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Overwrite passkey?.
|
|
||||||
/// </summary>
|
|
||||||
public static string OverwritePasskey {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("OverwritePasskey", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Ownership.
|
/// Looks up a localized string similar to Ownership.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5236,15 +5155,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Passkeys for {0}.
|
|
||||||
/// </summary>
|
|
||||||
public static string PasskeysForX {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("PasskeysForX", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Passkey will not be copied.
|
/// Looks up a localized string similar to Passkey will not be copied.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5425,15 +5335,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Passwords.
|
|
||||||
/// </summary>
|
|
||||||
public static string Passwords {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("Passwords", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to This password was not found in any known data breaches. It should be safe to use..
|
/// Looks up a localized string similar to This password was not found in any known data breaches. It should be safe to use..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5443,15 +5344,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Passwords for {0}.
|
|
||||||
/// </summary>
|
|
||||||
public static string PasswordsForX {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("PasswordsForX", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Password type.
|
/// Looks up a localized string similar to Password type.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -5957,24 +5849,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Save passkey.
|
|
||||||
/// </summary>
|
|
||||||
public static string SavePasskey {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SavePasskey", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Save passkey as new login.
|
|
||||||
/// </summary>
|
|
||||||
public static string SavePasskeyAsNewLogin {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SavePasskeyAsNewLogin", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Saving....
|
/// Looks up a localized string similar to Saving....
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6083,15 +5957,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to 2. Turn on AutoFill.
|
|
||||||
/// </summary>
|
|
||||||
public static string SecondDotTurnOnAutoFill {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SecondDotTurnOnAutoFill", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Secure notes.
|
/// Looks up a localized string similar to Secure notes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6416,24 +6281,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Set up auto-fill.
|
|
||||||
/// </summary>
|
|
||||||
public static string SetUpAutofill {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SetUpAutofill", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to To set up password auto-fill and passkey management, set Bitwarden as your preferred provider in the iOS Settings..
|
|
||||||
/// </summary>
|
|
||||||
public static string SetUpAutoFillDescriptionLong {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SetUpAutoFillDescriptionLong", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Set up TOTP.
|
/// Looks up a localized string similar to Set up TOTP.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6839,24 +6686,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to There was a problem creating a passkey for {0}. Try again later..
|
|
||||||
/// </summary>
|
|
||||||
public static string ThereWasAProblemCreatingAPasskeyForXTryAgainLater {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ThereWasAProblemCreatingAPasskeyForXTryAgainLater", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to There was a problem reading your passkey for {0}. Try again later..
|
|
||||||
/// </summary>
|
|
||||||
public static string ThereWasAProblemReadingAPasskeyForXTryAgainLater {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ThereWasAProblemReadingAPasskeyForXTryAgainLater", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to The URI {0} is already blocked.
|
/// Looks up a localized string similar to The URI {0} is already blocked.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6866,15 +6695,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to 3. Select "Bitwarden" to use for passwords and passkeys.
|
|
||||||
/// </summary>
|
|
||||||
public static string ThirdDotSelectBitwardenToUseForPasswordsAndPasskeys {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ThirdDotSelectBitwardenToUseForPasswordsAndPasskeys", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to 30 days.
|
/// Looks up a localized string similar to 30 days.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -6902,15 +6722,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to This item already contains a passkey. Are you sure you want to overwrite the current passkey?.
|
|
||||||
/// </summary>
|
|
||||||
public static string ThisItemAlreadyContainsAPasskeyAreYouSureYouWantToOverwriteTheCurrentPasskey {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ThisItemAlreadyContainsAPasskeyAreYouSureYouWantToOverwriteTheCurrentPasskey", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to This request is no longer valid.
|
/// Looks up a localized string similar to This request is no longer valid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -7208,15 +7019,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Unknown account.
|
|
||||||
/// </summary>
|
|
||||||
public static string UnknownAccount {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("UnknownAccount", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Unknown {0} error occurred..
|
/// Looks up a localized string similar to Unknown {0} error occurred..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -7703,24 +7505,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Verification required by {0}.
|
|
||||||
/// </summary>
|
|
||||||
public static string VerificationRequiredByX {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("VerificationRequiredByX", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Verification required for this action. Set up an unlock method in Bitwarden to continue..
|
|
||||||
/// </summary>
|
|
||||||
public static string VerificationRequiredForThisActionSetUpAnUnlockMethodInBitwardenToContinue {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("VerificationRequiredForThisActionSetUpAnUnlockMethodInBitwardenToContinue", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Verify Face ID.
|
/// Looks up a localized string similar to Verify Face ID.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -7748,15 +7532,6 @@ namespace Bit.Core.Resources.Localization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Verifying identity....
|
|
||||||
/// </summary>
|
|
||||||
public static string VerifyingIdentityEllipsis {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("VerifyingIdentityEllipsis", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Verify master password.
|
/// Looks up a localized string similar to Verify master password.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Wil u na die rekening omskakel?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="About" xml:space="preserve">
|
<data name="About" xml:space="preserve">
|
||||||
<value>عن التطبيق</value>
|
<value>عن</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Add" xml:space="preserve">
|
<data name="Add" xml:space="preserve">
|
||||||
<value>أضِف</value>
|
<value>أضِف</value>
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
<value>هل أنت متأكد من أنك تريد تسجيل الخروج؟</value>
|
<value>هل أنت متأكد من أنك تريد تسجيل الخروج؟</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveAccount" xml:space="preserve">
|
<data name="RemoveAccount" xml:space="preserve">
|
||||||
<value>أزِل الحساب</value>
|
<value>إزالة الحساب</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveAccountConfirmation" xml:space="preserve">
|
<data name="RemoveAccountConfirmation" xml:space="preserve">
|
||||||
<value>هل أنت متأكد من أنك تريد إزالة هذا الحساب؟</value>
|
<value>هل أنت متأكد من أنك تريد إزالة هذا الحساب؟</value>
|
||||||
@@ -2877,13 +2877,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>أعدنّ ميزة إلغاء القُفْل لتغيير إجراء مهلة المخزن الخاص بك.</value>
|
<value>أعدنّ ميزة إلغاء القُفْل لتغيير إجراء مهلة المخزن الخاص بك.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>تسجيل الدخول لـ Duo من خطوتين مطلوب لحسابك. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>اتبع الخطوات من Duo لإنهاء تسجيل الدخول.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>تشغيل Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2875,13 +2875,4 @@ Bu hesaba keçmək istəyirsiniz?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Anbar vaxt bitməsi əməliyyatınızı dəyişdirmək üçün bir kilid açma seçimi qurun.</value>
|
<value>Anbar vaxt bitməsi əməliyyatınızı dəyişdirmək üçün bir kilid açma seçimi qurun.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Hesabınız üçün Duo iki addımlı giriş tələb olunur. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Giriş etməni tamamlamaq üçün Duo-dakı addımları izləyin.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Duo-nu başlat</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2623,22 +2623,22 @@
|
|||||||
<value>Бягучы асноўны пароль</value>
|
<value>Бягучы асноўны пароль</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggedIn" xml:space="preserve">
|
<data name="LoggedIn" xml:space="preserve">
|
||||||
<value>Вы ўвайшлі!</value>
|
<value>Logged in!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
|
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
|
||||||
<value>Approve with my other device</value>
|
<value>Approve with my other device</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RequestAdminApproval" xml:space="preserve">
|
<data name="RequestAdminApproval" xml:space="preserve">
|
||||||
<value>Запытаць ухваленне адміністратара</value>
|
<value>Request admin approval</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ApproveWithMasterPassword" xml:space="preserve">
|
<data name="ApproveWithMasterPassword" xml:space="preserve">
|
||||||
<value>Ухваліць з дапамогай асноўнага пароля</value>
|
<value>Approve with master password</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TurnOffUsingPublicDevice" xml:space="preserve">
|
<data name="TurnOffUsingPublicDevice" xml:space="preserve">
|
||||||
<value>Turn off using a public device</value>
|
<value>Turn off using a public device</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RememberThisDevice" xml:space="preserve">
|
<data name="RememberThisDevice" xml:space="preserve">
|
||||||
<value>Запомніць гэту прыладу</value>
|
<value>Remember this device</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Passkey" xml:space="preserve">
|
<data name="Passkey" xml:space="preserve">
|
||||||
<value>Passkey</value>
|
<value>Passkey</value>
|
||||||
@@ -2677,19 +2677,19 @@
|
|||||||
<value>Памылковы токен API</value>
|
<value>Памылковы токен API</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AdminApprovalRequested" xml:space="preserve">
|
<data name="AdminApprovalRequested" xml:space="preserve">
|
||||||
<value>Патрабуецца ўхваленне адміністратара</value>
|
<value>Admin approval requested</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
|
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
|
||||||
<value>Ваш запыт адпраўлены адміністратару.</value>
|
<value>Your request has been sent to your admin.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
|
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
|
||||||
<value>Вы атрымаеце апавяшчэння пасля яго ўхвалення. </value>
|
<value>You will be notified once approved. </value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TroubleLoggingIn" xml:space="preserve">
|
<data name="TroubleLoggingIn" xml:space="preserve">
|
||||||
<value>Праблемы з уваходам?</value>
|
<value>Trouble logging in?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInAsX" xml:space="preserve">
|
<data name="LoggingInAsX" xml:space="preserve">
|
||||||
<value>Увайсці як {0}</value>
|
<value>Logging in as {0}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
|
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
|
||||||
<value>Vault timeout action changed to log out</value>
|
<value>Vault timeout action changed to log out</value>
|
||||||
@@ -2738,7 +2738,7 @@
|
|||||||
<value>Немагчыма рэдагаваць некалькі URI адначасова</value>
|
<value>Немагчыма рэдагаваць некалькі URI адначасова</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginApproved" xml:space="preserve">
|
<data name="LoginApproved" xml:space="preserve">
|
||||||
<value>Уваход ухвалены</value>
|
<value>Login approved</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
|
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
|
||||||
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
|
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
|
||||||
@@ -2747,28 +2747,28 @@
|
|||||||
<value>Log in with device</value>
|
<value>Log in with device</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInOn" xml:space="preserve">
|
<data name="LoggingInOn" xml:space="preserve">
|
||||||
<value>Увайсці на</value>
|
<value>Logging in on</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Vault" xml:space="preserve">
|
<data name="Vault" xml:space="preserve">
|
||||||
<value>Сховішча</value>
|
<value>Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Appearance" xml:space="preserve">
|
<data name="Appearance" xml:space="preserve">
|
||||||
<value>Знешні выгляд</value>
|
<value>Appearance</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountSecurity" xml:space="preserve">
|
<data name="AccountSecurity" xml:space="preserve">
|
||||||
<value>Бяспеке акаўнта</value>
|
<value>Account security</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenHelpCenter" xml:space="preserve">
|
<data name="BitwardenHelpCenter" xml:space="preserve">
|
||||||
<value>Даведачны цэнтр Bitwarden</value>
|
<value>Bitwarden Help Center</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContactBitwardenSupport" xml:space="preserve">
|
<data name="ContactBitwardenSupport" xml:space="preserve">
|
||||||
<value>Звярніцеся ў службу падтрымкі Bitwarden</value>
|
<value>Contact Bitwarden support</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyAppInformation" xml:space="preserve">
|
<data name="CopyAppInformation" xml:space="preserve">
|
||||||
<value>Copy app information</value>
|
<value>Copy app information</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SyncNow" xml:space="preserve">
|
<data name="SyncNow" xml:space="preserve">
|
||||||
<value>Сінхранізаваць зараз</value>
|
<value>Sync now</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockOptions" xml:space="preserve">
|
<data name="UnlockOptions" xml:space="preserve">
|
||||||
<value>Unlock options</value>
|
<value>Unlock options</value>
|
||||||
@@ -2805,7 +2805,7 @@
|
|||||||
<value>Use inline autofill if your selected keyboard supports it. Otherwise, use the default overlay.</value>
|
<value>Use inline autofill if your selected keyboard supports it. Otherwise, use the default overlay.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AdditionalOptions" xml:space="preserve">
|
<data name="AdditionalOptions" xml:space="preserve">
|
||||||
<value>Дадатковы параметры</value>
|
<value>Additional options</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToWebApp" xml:space="preserve">
|
<data name="ContinueToWebApp" xml:space="preserve">
|
||||||
<value>Continue to web app?</value>
|
<value>Continue to web app?</value>
|
||||||
@@ -2876,13 +2876,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Задайте начин за отключване, за да може да промените действието при изтичане на времето за достъп до трезора.</value>
|
<value>Задайте начин за отключване, за да може да промените действието при изтичане на времето за достъп до трезора.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Вашата регистрация изисква двустепенно удостоверяване чрез Duo. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Следвайте стъпките от Duo, за да завършите вписването.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Стартиране на Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2875,13 +2875,4 @@ Skeniranje će biti izvršeno automatski.</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Voleu canviar a aquest compte?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Configura una opció de desbloqueig per canviar l'acció de temps d'espera de la caixa forta.</value>
|
<value>Configura una opció de desbloqueig per canviar l'acció de temps d'espera de la caixa forta.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Es requereix l'inici de sessió en dos passos de DUO al vostre compte. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Seguiu els passos de Duo per acabar d'iniciar la sessió.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Inicia DUO</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2875,13 +2875,4 @@ Chcete se přepnout na tento účet?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Nastavte volbu odemknutí, abyste změnili časový limit Vašeho trezoru.</value>
|
<value>Nastavte volbu odemknutí, abyste změnili časový limit Vašeho trezoru.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Pro Váš účet je vyžadováno dvoufázové přihlášení DUO. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Postupujte podle kroků od DUO pro dokončení přihlášení.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Spustit DUO</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -315,7 +315,7 @@
|
|||||||
<comment>Label for notes.</comment>
|
<comment>Label for notes.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Ok" xml:space="preserve">
|
<data name="Ok" xml:space="preserve">
|
||||||
<value>Iawn</value>
|
<value>Ok</value>
|
||||||
<comment>Acknowledgement.</comment>
|
<comment>Acknowledgement.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Password" xml:space="preserve">
|
<data name="Password" xml:space="preserve">
|
||||||
@@ -346,7 +346,7 @@
|
|||||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
<value>Cyflwyno</value>
|
<value>Submit</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sync" xml:space="preserve">
|
<data name="Sync" xml:space="preserve">
|
||||||
<value>Cysoni</value>
|
<value>Cysoni</value>
|
||||||
@@ -371,7 +371,7 @@
|
|||||||
<comment>Label for a username.</comment>
|
<comment>Label for a username.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ValidationFieldRequired" xml:space="preserve">
|
<data name="ValidationFieldRequired" xml:space="preserve">
|
||||||
<value>Mae'r maes {0} yn ofynnol.</value>
|
<value>The {0} field is required.</value>
|
||||||
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
|
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ValueHasBeenCopied" xml:space="preserve">
|
<data name="ValueHasBeenCopied" xml:space="preserve">
|
||||||
@@ -382,7 +382,7 @@
|
|||||||
<value>Verify fingerprint</value>
|
<value>Verify fingerprint</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyMasterPassword" xml:space="preserve">
|
<data name="VerifyMasterPassword" xml:space="preserve">
|
||||||
<value>Gwirio'r prif gyfrinair</value>
|
<value>Verify master password</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyPIN" xml:space="preserve">
|
<data name="VerifyPIN" xml:space="preserve">
|
||||||
<value>Verify PIN</value>
|
<value>Verify PIN</value>
|
||||||
@@ -407,7 +407,7 @@
|
|||||||
<value>Cyfrif</value>
|
<value>Cyfrif</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>Mae eich cyfrif newydd wedi cael ei greu! Gallwch bellach fewngofnodi.</value>
|
<value>Your new account has been created! You may now log in.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddAnItem" xml:space="preserve">
|
<data name="AddAnItem" xml:space="preserve">
|
||||||
<value>Ychwanegu eitem</value>
|
<value>Ychwanegu eitem</value>
|
||||||
@@ -784,10 +784,10 @@
|
|||||||
<value>Do you want to auto-fill or view this item?</value>
|
<value>Do you want to auto-fill or view this item?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceMatchConfirm" xml:space="preserve">
|
<data name="BitwardenAutofillServiceMatchConfirm" xml:space="preserve">
|
||||||
<value>Ydych chi'n siŵr eich bod am lenwi'r eitem hon? Dyw hi ddim yn cyfateb yn llwyr i "{0}".</value>
|
<value>Are you sure you want to auto-fill this item? It is not a complete match for "{0}".</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MatchingItems" xml:space="preserve">
|
<data name="MatchingItems" xml:space="preserve">
|
||||||
<value>Eitemau sy'n cyfateb</value>
|
<value>Matching items</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PossibleMatchingItems" xml:space="preserve">
|
<data name="PossibleMatchingItems" xml:space="preserve">
|
||||||
<value>Possible matching items</value>
|
<value>Possible matching items</value>
|
||||||
@@ -799,22 +799,22 @@
|
|||||||
<value>You are searching for an auto-fill item for "{0}".</value>
|
<value>You are searching for an auto-fill item for "{0}".</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LearnOrg" xml:space="preserve">
|
<data name="LearnOrg" xml:space="preserve">
|
||||||
<value>Dysgu am sefydliadau</value>
|
<value>Learn about organizations</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CannotOpenApp" xml:space="preserve">
|
<data name="CannotOpenApp" xml:space="preserve">
|
||||||
<value>Methu agor yr ap "{0}".</value>
|
<value>Cannot open the app "{0}".</value>
|
||||||
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
|
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorAppTitle" xml:space="preserve">
|
<data name="AuthenticatorAppTitle" xml:space="preserve">
|
||||||
<value>Ap dilysu</value>
|
<value>Authenticator app</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterVerificationCodeApp" xml:space="preserve">
|
<data name="EnterVerificationCodeApp" xml:space="preserve">
|
||||||
<value>Rhowch y cod dilysu 6 nod o'ch ap dilysu.</value>
|
<value>Enter the 6 digit verification code from your authenticator app.</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterVerificationCodeEmail" xml:space="preserve">
|
<data name="EnterVerificationCodeEmail" xml:space="preserve">
|
||||||
<value>Rhowch y cod dilysu 6 nod anfonwyd i {0}.</value>
|
<value>Enter the 6 digit verification code that was emailed to {0}.</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginUnavailable" xml:space="preserve">
|
<data name="LoginUnavailable" xml:space="preserve">
|
||||||
@@ -895,7 +895,7 @@
|
|||||||
Scanning will happen automatically.</value>
|
Scanning will happen automatically.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ScanQrTitle" xml:space="preserve">
|
<data name="ScanQrTitle" xml:space="preserve">
|
||||||
<value>Sganio cod QR</value>
|
<value>Scan QR Code</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Camera" xml:space="preserve">
|
<data name="Camera" xml:space="preserve">
|
||||||
<value>Camera</value>
|
<value>Camera</value>
|
||||||
@@ -1143,7 +1143,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Icons server URL</value>
|
<value>Icons server URL</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillWithBitwarden" xml:space="preserve">
|
<data name="AutofillWithBitwarden" xml:space="preserve">
|
||||||
<value>Llenwi'n awtomatig â Bitwarden</value>
|
<value>Auto-fill with Bitwarden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultIsLocked" xml:space="preserve">
|
<data name="VaultIsLocked" xml:space="preserve">
|
||||||
<value>Vault is locked</value>
|
<value>Vault is locked</value>
|
||||||
@@ -1173,7 +1173,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Use the Bitwarden auto-fill service to fill login information into other apps.</value>
|
<value>Use the Bitwarden auto-fill service to fill login information into other apps.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
|
<data name="BitwardenAutofillServiceOpenAutofillSettings" xml:space="preserve">
|
||||||
<value>Agor gosodiadau llenwi awtomatig</value>
|
<value>Open Autofill Settings</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FaceID" xml:space="preserve">
|
<data name="FaceID" xml:space="preserve">
|
||||||
<value>Face ID</value>
|
<value>Face ID</value>
|
||||||
@@ -1256,7 +1256,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Yes, and save</value>
|
<value>Yes, and save</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillAndSave" xml:space="preserve">
|
<data name="AutofillAndSave" xml:space="preserve">
|
||||||
<value>Llenwi'n awtomatig a chadw</value>
|
<value>Auto-fill and save</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Organization" xml:space="preserve">
|
<data name="Organization" xml:space="preserve">
|
||||||
<value>Sefydliad</value>
|
<value>Sefydliad</value>
|
||||||
@@ -1486,7 +1486,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application.</value>
|
<value>Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggedInAsOn" xml:space="preserve">
|
<data name="LoggedInAsOn" xml:space="preserve">
|
||||||
<value>Rydych wedi mewngofnodi fel {0} ar {1}.</value>
|
<value>Logged in as {0} on {1}.</value>
|
||||||
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
|
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultLockedMasterPassword" xml:space="preserve">
|
<data name="VaultLockedMasterPassword" xml:space="preserve">
|
||||||
@@ -1541,7 +1541,7 @@ Scanning will happen automatically.</value>
|
|||||||
<comment>Color theme</comment>
|
<comment>Color theme</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThemeDescription" xml:space="preserve">
|
<data name="ThemeDescription" xml:space="preserve">
|
||||||
<value>Newid thema liwiau'r ap</value>
|
<value>Newid thema liwiau'r ap.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThemeDefault" xml:space="preserve">
|
<data name="ThemeDefault" xml:space="preserve">
|
||||||
<value>Rhagosodiad (system)</value>
|
<value>Rhagosodiad (system)</value>
|
||||||
@@ -1577,7 +1577,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Auto-fill blocked URIs</value>
|
<value>Auto-fill blocked URIs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Gofyn i ychwanegu manylion mewngofnodi</value>
|
<value>Ask to add login</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AskToAddLoginDescription" xml:space="preserve">
|
<data name="AskToAddLoginDescription" xml:space="preserve">
|
||||||
<value>Ask to add an item if one isn't found in your vault.</value>
|
<value>Ask to add an item if one isn't found in your vault.</value>
|
||||||
@@ -1669,7 +1669,7 @@ Scanning will happen automatically.</value>
|
|||||||
<comment>Title for the alert to confirm vault exports.</comment>
|
<comment>Title for the alert to confirm vault exports.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Warning" xml:space="preserve">
|
<data name="Warning" xml:space="preserve">
|
||||||
<value>Rhybudd</value>
|
<value>Warning</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExportVaultFailure" xml:space="preserve">
|
<data name="ExportVaultFailure" xml:space="preserve">
|
||||||
<value>There was a problem exporting your vault. If the problem persists, you'll need to export from the web vault.</value>
|
<value>There was a problem exporting your vault. If the problem persists, you'll need to export from the web vault.</value>
|
||||||
@@ -1945,7 +1945,7 @@ Scanning will happen automatically.</value>
|
|||||||
<value>Current access count</value>
|
<value>Current access count</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewPassword" xml:space="preserve">
|
<data name="NewPassword" xml:space="preserve">
|
||||||
<value>Cyfrinair newydd</value>
|
<value>New password</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordInfo" xml:space="preserve">
|
<data name="PasswordInfo" xml:space="preserve">
|
||||||
<value>Optionally require a password for users to access this Send.</value>
|
<value>Optionally require a password for users to access this Send.</value>
|
||||||
@@ -2310,7 +2310,7 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Caniatáu sgrinluniau</value>
|
<value>Caniatáu sgrinluniau</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureYouWantToEnableScreenCapture" xml:space="preserve">
|
<data name="AreYouSureYouWantToEnableScreenCapture" xml:space="preserve">
|
||||||
<value>Ydych chi'n siŵr eich bod am ganiatáu sgrinluniau?</value>
|
<value>Are you sure you want to turn on screen capture?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInRequested" xml:space="preserve">
|
<data name="LogInRequested" xml:space="preserve">
|
||||||
<value>Login requested</value>
|
<value>Login requested</value>
|
||||||
@@ -2394,16 +2394,16 @@ select Add TOTP to store the key safely</value>
|
|||||||
<value>Gair ar hap</value>
|
<value>Gair ar hap</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailRequiredParenthesis" xml:space="preserve">
|
<data name="EmailRequiredParenthesis" xml:space="preserve">
|
||||||
<value>Ebost (gofynnol)</value>
|
<value>Email (required)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DomainNameRequiredParenthesis" xml:space="preserve">
|
<data name="DomainNameRequiredParenthesis" xml:space="preserve">
|
||||||
<value>Enw parth (gofynnol)</value>
|
<value>Enw parth (gofynnol)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="APIKeyRequiredParenthesis" xml:space="preserve">
|
<data name="APIKeyRequiredParenthesis" xml:space="preserve">
|
||||||
<value>Allwedd API (gofynnol)</value>
|
<value>API key (required)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Service" xml:space="preserve">
|
<data name="Service" xml:space="preserve">
|
||||||
<value>Gwasanaeth</value>
|
<value>Service</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddyIo" xml:space="preserve">
|
<data name="AddyIo" xml:space="preserve">
|
||||||
<value>addy.io</value>
|
<value>addy.io</value>
|
||||||
@@ -2549,7 +2549,7 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Bydd angen ailgychwyn yr ap</value>
|
<value>Bydd angen ailgychwyn yr ap</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DefaultSystem" xml:space="preserve">
|
<data name="DefaultSystem" xml:space="preserve">
|
||||||
<value>Rhagosodiad (system)</value>
|
<value>Default (System)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Important" xml:space="preserve">
|
<data name="Important" xml:space="preserve">
|
||||||
<value>Pwysig</value>
|
<value>Pwysig</value>
|
||||||
@@ -2624,7 +2624,7 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Prif gyfrinair presennol</value>
|
<value>Prif gyfrinair presennol</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggedIn" xml:space="preserve">
|
<data name="LoggedIn" xml:space="preserve">
|
||||||
<value>Wedi mewngofnodi!</value>
|
<value>Logged in!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
|
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
|
||||||
<value>Approve with my other device</value>
|
<value>Approve with my other device</value>
|
||||||
@@ -2812,17 +2812,17 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Parhau i'r ap gwe?</value>
|
<value>Parhau i'r ap gwe?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToX" xml:space="preserve">
|
<data name="ContinueToX" xml:space="preserve">
|
||||||
<value>Parhau i {0}?</value>
|
<value>Continue to {0}?</value>
|
||||||
<comment>The parameter is an URL, like bitwarden.com.</comment>
|
<comment>The parameter is an URL, like bitwarden.com.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToHelpCenter" xml:space="preserve">
|
<data name="ContinueToHelpCenter" xml:space="preserve">
|
||||||
<value>Parhau i'r ganolfan gymorth?</value>
|
<value>Continue to Help center?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToContactSupport" xml:space="preserve">
|
<data name="ContinueToContactSupport" xml:space="preserve">
|
||||||
<value>Continue to contact support?</value>
|
<value>Continue to contact support?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToPrivacyPolicy" xml:space="preserve">
|
<data name="ContinueToPrivacyPolicy" xml:space="preserve">
|
||||||
<value>Parhau i'r polisi preifatrwydd?</value>
|
<value>Continue to privacy policy?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToAppStore" xml:space="preserve">
|
<data name="ContinueToAppStore" xml:space="preserve">
|
||||||
<value>Continue to app store?</value>
|
<value>Continue to app store?</value>
|
||||||
@@ -2859,11 +2859,11 @@ Do you want to switch to this account?</value>
|
|||||||
<value>Choose the dark theme to use when your device’s dark mode is in use</value>
|
<value>Choose the dark theme to use when your device’s dark mode is in use</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CreatedXY" xml:space="preserve">
|
<data name="CreatedXY" xml:space="preserve">
|
||||||
<value>Crëwyd ar {0} am {1}</value>
|
<value>Created {0}, {1}</value>
|
||||||
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
|
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TooManyAttempts" xml:space="preserve">
|
<data name="TooManyAttempts" xml:space="preserve">
|
||||||
<value>Gormod o geisiadau</value>
|
<value>Too many attempts</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
|
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
|
||||||
<value>Account logged out.</value>
|
<value>Account logged out.</value>
|
||||||
@@ -2877,13 +2877,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Lansio Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Vil du skifte til denne konto?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Opsæt en oplåsningsmetode for at ændre Bokstimeouthandlingen.</value>
|
<value>Opsæt en oplåsningsmetode for at ændre Bokstimeouthandlingen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo-totrinsindlogning kræves for kontoen. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Følg trinnene fra Duo for at færdiggøre indlogningen.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Start Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2875,13 +2875,4 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Richte eine Entsperroption ein, um deine Aktion bei Tresor-Timeout zu ändern.</value>
|
<value>Richte eine Entsperroption ein, um deine Aktion bei Tresor-Timeout zu ändern.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Für dein Konto ist die Duo Zwei-Faktor-Authentifizierung erforderlich. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Folge den Schritten von Duo, um die Anmeldung abzuschließen.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Duo starten</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -152,11 +152,11 @@
|
|||||||
<comment>Copy some value to your clipboard.</comment>
|
<comment>Copy some value to your clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyPassword" xml:space="preserve">
|
<data name="CopyPassword" xml:space="preserve">
|
||||||
<value>Αντιγραφή κωδικού</value>
|
<value>Αντιγραφή Κωδικού</value>
|
||||||
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyUsername" xml:space="preserve">
|
<data name="CopyUsername" xml:space="preserve">
|
||||||
<value>Αντιγραφή ονόματος χρήστη</value>
|
<value>Αντιγραφή Ονόματος Χρήστη</value>
|
||||||
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
@@ -179,14 +179,14 @@
|
|||||||
<value>Επεξεργασία</value>
|
<value>Επεξεργασία</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditFolder" xml:space="preserve">
|
<data name="EditFolder" xml:space="preserve">
|
||||||
<value>Επεξεργασία φακέλου</value>
|
<value>Επεξεργασία Φακέλου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Email" xml:space="preserve">
|
<data name="Email" xml:space="preserve">
|
||||||
<value>Email</value>
|
<value>Email</value>
|
||||||
<comment>Short label for an email address.</comment>
|
<comment>Short label for an email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailAddress" xml:space="preserve">
|
<data name="EmailAddress" xml:space="preserve">
|
||||||
<value>Διεύθυνση email</value>
|
<value>Διεύθυνση Email</value>
|
||||||
<comment>Full label for a email address.</comment>
|
<comment>Full label for a email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EmailUs" xml:space="preserve">
|
<data name="EmailUs" xml:space="preserve">
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
<comment>Title for your favorite items in the vault.</comment>
|
<comment>Title for your favorite items in the vault.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileBugReport" xml:space="preserve">
|
<data name="FileBugReport" xml:space="preserve">
|
||||||
<value>Υποβολή αναφοράς σφάλματος</value>
|
<value>Υποβολή Αναφοράς Σφάλματος</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileBugReportDescription" xml:space="preserve">
|
<data name="FileBugReportDescription" xml:space="preserve">
|
||||||
<value>Αναφέρετε το προβλήμα στο GitHub.</value>
|
<value>Αναφέρετε το προβλήμα στο GitHub.</value>
|
||||||
@@ -229,14 +229,14 @@
|
|||||||
<value>Φάκελοι</value>
|
<value>Φάκελοι</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FolderUpdated" xml:space="preserve">
|
<data name="FolderUpdated" xml:space="preserve">
|
||||||
<value>Ο φάκελος ενημερώθηκε</value>
|
<value>Ο φάκελος ενημερώθηκε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GoToWebsite" xml:space="preserve">
|
<data name="GoToWebsite" xml:space="preserve">
|
||||||
<value>Μετάβαση στην ιστοσελίδα</value>
|
<value>Μετάβαση στην ιστοσελίδα</value>
|
||||||
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
<comment>The button text that allows user to launch the website to their web browser.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="HelpAndFeedback" xml:space="preserve">
|
<data name="HelpAndFeedback" xml:space="preserve">
|
||||||
<value>Βοήθεια και σχόλια</value>
|
<value>Βοήθεια και Σχόλια</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Hide" xml:space="preserve">
|
<data name="Hide" xml:space="preserve">
|
||||||
<value>Απόκρυψη</value>
|
<value>Απόκρυψη</value>
|
||||||
@@ -251,7 +251,7 @@
|
|||||||
<comment>Title for the alert when internet connection is required to continue.</comment>
|
<comment>Title for the alert when internet connection is required to continue.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="InvalidMasterPassword" xml:space="preserve">
|
<data name="InvalidMasterPassword" xml:space="preserve">
|
||||||
<value>Μη έγκυρος κύριος κωδικός. Δοκιμάστε ξανά.</value>
|
<value>Μη έγκυρος κύριος κωδικός, δοκιμάστε ξανά.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="InvalidPIN" xml:space="preserve">
|
<data name="InvalidPIN" xml:space="preserve">
|
||||||
<value>Μη έγκυρο PIN. Προσπάθηστε ξανά.</value>
|
<value>Μη έγκυρο PIN. Προσπάθηστε ξανά.</value>
|
||||||
@@ -282,7 +282,7 @@
|
|||||||
<value>Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτόν τον λογαριασμό?</value>
|
<value>Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτόν τον λογαριασμό?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountAlreadyAdded" xml:space="preserve">
|
<data name="AccountAlreadyAdded" xml:space="preserve">
|
||||||
<value>Ο λογαριασμός έχει ήδη προστεθεί</value>
|
<value>Ο Λογαριασμός Προστέθηκε Ήδη</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
|
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
|
||||||
<value>Θα θέλατε να το αλλάξετε τώρα?</value>
|
<value>Θα θέλατε να το αλλάξετε τώρα?</value>
|
||||||
@@ -296,11 +296,11 @@
|
|||||||
<comment>Text to define that there are more options things to see.</comment>
|
<comment>Text to define that there are more options things to see.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="MyVault" xml:space="preserve">
|
<data name="MyVault" xml:space="preserve">
|
||||||
<value>Το vault μου</value>
|
<value>Το Vault μου</value>
|
||||||
<comment>The title for the vault page.</comment>
|
<comment>The title for the vault page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Authenticator" xml:space="preserve">
|
<data name="Authenticator" xml:space="preserve">
|
||||||
<value>Αυθεντικοποιητής</value>
|
<value>Εφαρμογή Επαλήθευσης</value>
|
||||||
<comment>Authenticator TOTP feature</comment>
|
<comment>Authenticator TOTP feature</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Name" xml:space="preserve">
|
<data name="Name" xml:space="preserve">
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
<comment>Reveal a hidden value (password).</comment>
|
<comment>Reveal a hidden value (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemDeleted" xml:space="preserve">
|
<data name="ItemDeleted" xml:space="preserve">
|
||||||
<value>Το στοιχείο διαγράφτηκε</value>
|
<value>Το στοιχείο έχει διαγραφεί.</value>
|
||||||
<comment>Confirmation message after successfully deleting a login.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
@@ -375,14 +375,14 @@
|
|||||||
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
|
<comment>Validation message for when a form field is left blank and is required to be entered.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ValueHasBeenCopied" xml:space="preserve">
|
<data name="ValueHasBeenCopied" xml:space="preserve">
|
||||||
<value>{0} έχει αντιγραφεί</value>
|
<value>{0} έχει αντιγραφεί.</value>
|
||||||
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
|
<comment>Confirmation message after successfully copying a value to the clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyFingerprint" xml:space="preserve">
|
<data name="VerifyFingerprint" xml:space="preserve">
|
||||||
<value>Επαλήθευση δακτυλικού αποτυπώματος</value>
|
<value>Επαλήθευση Δακτυλικού Αποτυπώματος</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyMasterPassword" xml:space="preserve">
|
<data name="VerifyMasterPassword" xml:space="preserve">
|
||||||
<value>Επαλήθευση κύριου κωδικού</value>
|
<value>Επαλήθευση Κύριου Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerifyPIN" xml:space="preserve">
|
<data name="VerifyPIN" xml:space="preserve">
|
||||||
<value>Επαλήθευση PIN</value>
|
<value>Επαλήθευση PIN</value>
|
||||||
@@ -413,22 +413,22 @@
|
|||||||
<value>Προσθήκη στοιχείου</value>
|
<value>Προσθήκη στοιχείου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
<value>Επέκταση εφαρμογής</value>
|
<value>Επέκταση Εφαρμογής</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillAccessibilityDescription" xml:space="preserve">
|
<data name="AutofillAccessibilityDescription" xml:space="preserve">
|
||||||
<value>Χρησιμοποιείστε την υπηρεσία προσβασιμότητας Bitwarden, για την αυτόματη συμπλήρωση συνδέσεων σε εφαρμογές και στο διαδίκτυο.</value>
|
<value>Χρησιμοποιείστε την υπηρεσία προσβασιμότητας Bitwarden, για την αυτόματη συμπλήρωση συνδέσεων σε εφαρμογές και στο διαδίκτυο.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillService" xml:space="preserve">
|
<data name="AutofillService" xml:space="preserve">
|
||||||
<value>Υπηρεσία αυτόματης συμπλήρωσης</value>
|
<value>Υπηρεσία Αυτόματης Συμπλήρωσης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||||
<value>Αποφυγή αμφιλεγόμενων χαρακτήρων</value>
|
<value>Αποφυγή Αμφιλεγόμενων Χαρακτήρων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtension" xml:space="preserve">
|
<data name="BitwardenAppExtension" xml:space="preserve">
|
||||||
<value>Επέκταση εφαρμογής Bitwarden</value>
|
<value>Επέκταση Εφαρμογής Bitwarden</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtensionAlert2" xml:space="preserve">
|
<data name="BitwardenAppExtensionAlert2" xml:space="preserve">
|
||||||
<value>Ο ευκολότερος τρόπος για να προσθέστε νέες συνδέσεις στο vault σας, είναι μέσω της επέκτασης εφαρμογής Bitwarden. Μάθετε περισσότερα σχετικά με τη χρήση της επέκτασης εφαρμογής Bitwarden, μεταβαίνοντας στις "Ρυθμίσεις".</value>
|
<value>Ο ευκολότερος τρόπος για να προσθέστε νέες συνδέσεις στο vault σας, είναι μέσω της επέκτασης εφαρμογής Bitwarden. Μάθετε περισσότερα σχετικά με τη χρήση της επέκτασης, μεταβαίνοντας στις "Ρυθμίσεις".</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
||||||
<value>Χρήση του Bitwarden στο Safari και σε άλλες εφαρμογές για αυτόματη συμπλήρωση των συνδέσεων σας.</value>
|
<value>Χρήση του Bitwarden στο Safari και σε άλλες εφαρμογές για αυτόματη συμπλήρωση των συνδέσεων σας.</value>
|
||||||
@@ -440,13 +440,13 @@
|
|||||||
<value>Χρησιμοποιείστε την υπηρεσία προσβασιμότητας Bitwarden, για την αυτόματη συμπλήρωση συνδέσεων.</value>
|
<value>Χρησιμοποιείστε την υπηρεσία προσβασιμότητας Bitwarden, για την αυτόματη συμπλήρωση συνδέσεων.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmail" xml:space="preserve">
|
<data name="ChangeEmail" xml:space="preserve">
|
||||||
<value>Αλλαγή email</value>
|
<value>Αλλαγή Email</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
<data name="ChangeEmailConfirmation" xml:space="preserve">
|
||||||
<value>Μπορείτε να αλλάξετε τη διεύθυνση του email σας στο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;</value>
|
<value>Μπορείτε να αλλάξετε τη διεύθυνση του email σας στο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChangeMasterPassword" xml:space="preserve">
|
<data name="ChangeMasterPassword" xml:space="preserve">
|
||||||
<value>Αλλαγή κύριου κωδικού</value>
|
<value>Αλλαγή Κύριου Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Close" xml:space="preserve">
|
<data name="Close" xml:space="preserve">
|
||||||
<value>Κλείσιμο</value>
|
<value>Κλείσιμο</value>
|
||||||
@@ -455,29 +455,29 @@
|
|||||||
<value>Συνέχεια</value>
|
<value>Συνέχεια</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CreateAccount" xml:space="preserve">
|
<data name="CreateAccount" xml:space="preserve">
|
||||||
<value>Δημιουργία λογαριασμού</value>
|
<value>Δημιουργία Λογαριασμού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CreatingAccount" xml:space="preserve">
|
<data name="CreatingAccount" xml:space="preserve">
|
||||||
<value>Δημιουργία λογαριασμού...</value>
|
<value>Δημιουργία λογαριασμού...</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditItem" xml:space="preserve">
|
<data name="EditItem" xml:space="preserve">
|
||||||
<value>Επεξεργασία στοιχείου</value>
|
<value>Επεξεργασία Στοιχείου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
<value>Επιτρέψτε τον αυτόματο συγχρονισμό</value>
|
<value>Ενεργοποίηση Αυτόματου Συγχρονισμού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterEmailForHint" xml:space="preserve">
|
<data name="EnterEmailForHint" xml:space="preserve">
|
||||||
<value>Εισάγετε την διεύθυνση email του λογαριασμού σας, προκειμένου για να λάβετε υπόδειξη του κύριου κωδικού.</value>
|
<value>Εισάγετε την διεύθυνση email του λογαριασμού σας, προκειμένου για να λάβετε υπόδειξη του κύριου κωδικού.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExntesionReenable" xml:space="preserve">
|
<data name="ExntesionReenable" xml:space="preserve">
|
||||||
<value>Εκ νέου ενεργοποίηση επέκτασης εφαρμογής</value>
|
<value>Ενεργοποιείστε εκ νέου την Επέκτασης Εφαρμογής</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionAlmostDone" xml:space="preserve">
|
<data name="ExtensionAlmostDone" xml:space="preserve">
|
||||||
<value>Σχεδόν ολοκληρώθηκε!</value>
|
<value>Σχεδόν ολοκληρώθηκε!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionEnable" xml:space="preserve">
|
<data name="ExtensionEnable" xml:space="preserve">
|
||||||
<value>Ενεργοποίηση επέκτασης εφαρμογής</value>
|
<value>Ενεργοποίηση Επέκτασης Εφαρμογής</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionInSafari" xml:space="preserve">
|
<data name="ExtensionInSafari" xml:space="preserve">
|
||||||
<value>Στο Safari, βρείτε το Bitwarden χρησιμοποιώντας το εικονίδιο κοινής χρήσης (μετακινηθείτε προς τα δεξιά στην κάτω σειρά του μενού).</value>
|
<value>Στο Safari, βρείτε το Bitwarden χρησιμοποιώντας το εικονίδιο κοινής χρήσης (μετακινηθείτε προς τα δεξιά στην κάτω σειρά του μενού).</value>
|
||||||
@@ -508,13 +508,13 @@
|
|||||||
<value>Δακτυλικό αποτύπωμα</value>
|
<value>Δακτυλικό αποτύπωμα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GeneratePassword" xml:space="preserve">
|
<data name="GeneratePassword" xml:space="preserve">
|
||||||
<value>Παραγωγή κωδικού</value>
|
<value>Δημιουργία Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="GetPasswordHint" xml:space="preserve">
|
<data name="GetPasswordHint" xml:space="preserve">
|
||||||
<value>Λήψη υπόδειξης κύριου κωδικού</value>
|
<value>Λήψη υπόδειξης κύριου κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ImportItems" xml:space="preserve">
|
<data name="ImportItems" xml:space="preserve">
|
||||||
<value>Εισαγωγή στοιχείων</value>
|
<value>Εισαγωγή Στοιχείων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ImportItemsConfirmation" xml:space="preserve">
|
<data name="ImportItemsConfirmation" xml:space="preserve">
|
||||||
<value>Μπορείτε να εισαγάγετε μαζικά στοιχεία διαδικτυακά στο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;</value>
|
<value>Μπορείτε να εισαγάγετε μαζικά στοιχεία διαδικτυακά στο bitwarden.com. Θέλετε να επισκεφθείτε την ιστοσελίδα τώρα;</value>
|
||||||
@@ -523,7 +523,7 @@
|
|||||||
<value>Γρήγορη μαζική εισαγωγή των στοιχείων σας από άλλες εφαρμογές διαχείρισης κωδικών.</value>
|
<value>Γρήγορη μαζική εισαγωγή των στοιχείων σας από άλλες εφαρμογές διαχείρισης κωδικών.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LastSync" xml:space="preserve">
|
<data name="LastSync" xml:space="preserve">
|
||||||
<value>Τελευταίος συγχρονισμός:</value>
|
<value>Τελευταίος Συγχρονισμός:</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Length" xml:space="preserve">
|
<data name="Length" xml:space="preserve">
|
||||||
<value>Μήκος</value>
|
<value>Μήκος</value>
|
||||||
@@ -547,10 +547,10 @@
|
|||||||
<value>Άμεσα</value>
|
<value>Άμεσα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeout" xml:space="preserve">
|
<data name="VaultTimeout" xml:space="preserve">
|
||||||
<value>Χρόνος λήξης vault</value>
|
<value>Χρόνος Λήξης Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutAction" xml:space="preserve">
|
<data name="VaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Ενέργεια χρόνου λήξης vault</value>
|
<value>Ενέργεια Χρόνου Λήξης Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
|
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
|
||||||
<value>Η αποσύνδεση θα καταργήσει όλη την πρόσβαση στο vault σας και απαιτεί online έλεγχο ταυτότητας μετά το χρονικό όριο λήξης. Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε αυτήν τη ρύθμιση;</value>
|
<value>Η αποσύνδεση θα καταργήσει όλη την πρόσβαση στο vault σας και απαιτεί online έλεγχο ταυτότητας μετά το χρονικό όριο λήξης. Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε αυτήν τη ρύθμιση;</value>
|
||||||
@@ -572,7 +572,7 @@
|
|||||||
<value>Ο κύριος κωδικός χρησιμοποιείται για πρόσβαση στο vault σας. Είναι πολύ σημαντικό να μην τον ξεχάσετε. Δεν υπάρχει τρόπος να τον ανακτήσετε σε αυτή την περίπτωση.</value>
|
<value>Ο κύριος κωδικός χρησιμοποιείται για πρόσβαση στο vault σας. Είναι πολύ σημαντικό να μην τον ξεχάσετε. Δεν υπάρχει τρόπος να τον ανακτήσετε σε αυτή την περίπτωση.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordHint" xml:space="preserve">
|
<data name="MasterPasswordHint" xml:space="preserve">
|
||||||
<value>Υπόδειξη κύριου κωδικού (προαιρετικό)</value>
|
<value>Υπόδειξη Κύριου Κωδικού (προαιρετικό)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
<data name="MasterPasswordHintDescription" xml:space="preserve">
|
||||||
<value>Η υπόδειξη κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας αν τον ξεχάσετε.</value>
|
<value>Η υπόδειξη κύριου κωδικού μπορεί να σας βοηθήσει να θυμηθείτε τον κωδικό σας αν τον ξεχάσετε.</value>
|
||||||
@@ -581,15 +581,15 @@
|
|||||||
<value>Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες.</value>
|
<value>Ο κύριος κωδικός πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinNumbers" xml:space="preserve">
|
<data name="MinNumbers" xml:space="preserve">
|
||||||
<value>Ελάχιστα αριθμητικά ψηφία</value>
|
<value>Ελάχιστα Αριθμητικά Ψηφία</value>
|
||||||
<comment>Minimum numeric characters for password generator settings</comment>
|
<comment>Minimum numeric characters for password generator settings</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="MinSpecial" xml:space="preserve">
|
<data name="MinSpecial" xml:space="preserve">
|
||||||
<value>Ελάχιστοι ειδικοί χαρακτήρες</value>
|
<value>Ελάχιστο Ειδικών Χαρακτήρων</value>
|
||||||
<comment>Minimum special characters for password generator settings</comment>
|
<comment>Minimum special characters for password generator settings</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="MoreSettings" xml:space="preserve">
|
<data name="MoreSettings" xml:space="preserve">
|
||||||
<value>Περισσότερες ρυθμίσεις</value>
|
<value>Περισσότερες Ρυθμίσεις</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MustLogInMainApp" xml:space="preserve">
|
<data name="MustLogInMainApp" xml:space="preserve">
|
||||||
<value>Πρέπει να συνδεθείτε στην κύρια εφαρμογή Bitwarden για να μπορέσετε να χρησιμοποιήσετε την επέκταση.</value>
|
<value>Πρέπει να συνδεθείτε στην κύρια εφαρμογή Bitwarden για να μπορέσετε να χρησιμοποιήσετε την επέκταση.</value>
|
||||||
@@ -598,7 +598,7 @@
|
|||||||
<value>Ποτέ</value>
|
<value>Ποτέ</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewItemCreated" xml:space="preserve">
|
<data name="NewItemCreated" xml:space="preserve">
|
||||||
<value>Το στοιχείο προστέθηκε</value>
|
<value>Δημιουργήθηκε νέο στοιχείο.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoFavorites" xml:space="preserve">
|
<data name="NoFavorites" xml:space="preserve">
|
||||||
<value>Δεν υπάρχουν αγαπημένα στο vault σας.</value>
|
<value>Δεν υπάρχουν αγαπημένα στο vault σας.</value>
|
||||||
@@ -626,13 +626,13 @@
|
|||||||
<value>Άλλες</value>
|
<value>Άλλες</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordGenerated" xml:space="preserve">
|
<data name="PasswordGenerated" xml:space="preserve">
|
||||||
<value>Ο κωδικός δημιουργήθηκε</value>
|
<value>Ο κωδικός δημιουργήθηκε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordGenerator" xml:space="preserve">
|
<data name="PasswordGenerator" xml:space="preserve">
|
||||||
<value>Γεννήτρια κωδικού</value>
|
<value>Γεννήτρια Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordHint" xml:space="preserve">
|
<data name="PasswordHint" xml:space="preserve">
|
||||||
<value>Υπόδειξη κωδικού</value>
|
<value>Υπόδειξη Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordHintAlert" xml:space="preserve">
|
<data name="PasswordHintAlert" xml:space="preserve">
|
||||||
<value>Σας στείλαμε ένα email με υπόδειξη του κύριου κωδικού.</value>
|
<value>Σας στείλαμε ένα email με υπόδειξη του κύριου κωδικού.</value>
|
||||||
@@ -641,20 +641,20 @@
|
|||||||
<value>Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε τον τρέχον κωδικό;</value>
|
<value>Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε τον τρέχον κωδικό;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PushNotificationAlert" xml:space="preserve">
|
<data name="PushNotificationAlert" xml:space="preserve">
|
||||||
<value>Το Bitwarden κρατάει συγχρονισμένο το vault σας αυτόματα, με τη χρήση ειδοποιήσεων push. Για την καλύτερη δυνατή εμπειρία, επιλέξτε "Να επιτρέπεται" στην παρακάτω προτροπή όταν σας ζητηθεί να ενεργοποιήσετε τις ειδοποιήσεις push.</value>
|
<value>Το Bitwarden κρατάει αυτόματα το vault σας, με τη χρήση ειδοποιήσεων push. Για την καλύτερη δυνατή εμπειρία, επιλέξτε "Να επιτρέπεται" στην παρακάτω ερώτηση, όταν σας ζητηθεί να ενεργοποιήσετε τις ειδοποιήσεις push.</value>
|
||||||
<comment>Push notifications for apple products</comment>
|
<comment>Push notifications for apple products</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="RateTheApp" xml:space="preserve">
|
<data name="RateTheApp" xml:space="preserve">
|
||||||
<value>Αξιολογήστε την εφαρμογή</value>
|
<value>Αξιολογήστε την Εφαρμογή</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RateTheAppDescription" xml:space="preserve">
|
<data name="RateTheAppDescription" xml:space="preserve">
|
||||||
<value>Παρακαλούμε σκεφτείτε να μας βοηθήσετε με μια καλή κριτική!</value>
|
<value>Παρακαλούμε σκεφτείτε να μας βοηθήσετε με μια καλή κριτική!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RegeneratePassword" xml:space="preserve">
|
<data name="RegeneratePassword" xml:space="preserve">
|
||||||
<value>Επαναδημιουργία κωδικού</value>
|
<value>Επαναδημιουργία Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RetypeMasterPassword" xml:space="preserve">
|
<data name="RetypeMasterPassword" xml:space="preserve">
|
||||||
<value>Εισάγετε ξανά τον κύριο κωδικό</value>
|
<value>Εισάγετε Ξανά τον Κύριο Κωδικό</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SearchVault" xml:space="preserve">
|
<data name="SearchVault" xml:space="preserve">
|
||||||
<value>Αναζήτηση στο vault</value>
|
<value>Αναζήτηση στο vault</value>
|
||||||
@@ -672,10 +672,10 @@
|
|||||||
<value>Εισαγωγή τετραψήφιου αριθμού PIN για ξεκλείδωμα εφαρμογής.</value>
|
<value>Εισαγωγή τετραψήφιου αριθμού PIN για ξεκλείδωμα εφαρμογής.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemInformation" xml:space="preserve">
|
<data name="ItemInformation" xml:space="preserve">
|
||||||
<value>Πληροφορίες στοιχείου</value>
|
<value>Πληροφορίες Στοιχείου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ItemUpdated" xml:space="preserve">
|
<data name="ItemUpdated" xml:space="preserve">
|
||||||
<value>Το στοιχείο αποθηκεύτηκε</value>
|
<value>Το στοιχείο ενημερώθηκε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
<value>Υποβολή...</value>
|
<value>Υποβολή...</value>
|
||||||
@@ -686,39 +686,39 @@
|
|||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SyncingComplete" xml:space="preserve">
|
<data name="SyncingComplete" xml:space="preserve">
|
||||||
<value>Ο συγχρονισμός ολοκληρώθηκε</value>
|
<value>Ο συγχρονισμός ολοκληρώθηκε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SyncingFailed" xml:space="preserve">
|
<data name="SyncingFailed" xml:space="preserve">
|
||||||
<value>Ο συγχρονισμός απέτυχε</value>
|
<value>Ο συγχρονισμός απέτυχε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SyncVaultNow" xml:space="preserve">
|
<data name="SyncVaultNow" xml:space="preserve">
|
||||||
<value>Συγχρονισμός του vault τώρα</value>
|
<value>Συγχρονισμός Vault Τώρα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TouchID" xml:space="preserve">
|
<data name="TouchID" xml:space="preserve">
|
||||||
<value>Touch ID</value>
|
<value>Touch ID</value>
|
||||||
<comment>What Apple calls their fingerprint reader.</comment>
|
<comment>What Apple calls their fingerprint reader.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwoStepLogin" xml:space="preserve">
|
<data name="TwoStepLogin" xml:space="preserve">
|
||||||
<value>Σύνδεση δύο βημάτων</value>
|
<value>Σύνδεση σε δύο βήματα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockWith" xml:space="preserve">
|
<data name="UnlockWith" xml:space="preserve">
|
||||||
<value>Ξεκλείδωμα με {0}</value>
|
<value>Ξεκλείδωμα με {0}</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockWithPIN" xml:space="preserve">
|
<data name="UnlockWithPIN" xml:space="preserve">
|
||||||
<value>Ξεκλείδωμα με κωδικό PIN</value>
|
<value>Ξεκλείδωμα με PIN</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Validating" xml:space="preserve">
|
<data name="Validating" xml:space="preserve">
|
||||||
<value>Επαλήθευση</value>
|
<value>Επαλήθευση</value>
|
||||||
<comment>Message shown when interacting with the server</comment>
|
<comment>Message shown when interacting with the server</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerificationCode" xml:space="preserve">
|
<data name="VerificationCode" xml:space="preserve">
|
||||||
<value>Κωδικός επαλήθευσης</value>
|
<value>Κωδικός Επαλήθευσης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewItem" xml:space="preserve">
|
<data name="ViewItem" xml:space="preserve">
|
||||||
<value>Προβολή στοιχείου</value>
|
<value>Προβολή Στοιχείου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVault" xml:space="preserve">
|
<data name="WebVault" xml:space="preserve">
|
||||||
<value>Διαδικτυακό vault Bitwarden</value>
|
<value>Bitwarden Web Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Lost2FAApp" xml:space="preserve">
|
<data name="Lost2FAApp" xml:space="preserve">
|
||||||
<value>Χάσατε την εφαρμογή επαλήθευσης;</value>
|
<value>Χάσατε την εφαρμογή επαλήθευσης;</value>
|
||||||
@@ -728,7 +728,7 @@
|
|||||||
<comment>Screen title</comment>
|
<comment>Screen title</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionActivated" xml:space="preserve">
|
<data name="ExtensionActivated" xml:space="preserve">
|
||||||
<value>Η επέκταση ενεργοποιήθηκε!</value>
|
<value>Η Επέκταση Ενεργοποιήθηκε!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Icons" xml:space="preserve">
|
<data name="Icons" xml:space="preserve">
|
||||||
<value>Εικονίδια</value>
|
<value>Εικονίδια</value>
|
||||||
@@ -799,14 +799,14 @@
|
|||||||
<value>Αναζήτηση στοιχείου αυτόματης συμπλήρωσης για "{0}".</value>
|
<value>Αναζήτηση στοιχείου αυτόματης συμπλήρωσης για "{0}".</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LearnOrg" xml:space="preserve">
|
<data name="LearnOrg" xml:space="preserve">
|
||||||
<value>Μάθετε για τους οργανισμούς</value>
|
<value>Μάθετε για τους Οργανισμούς</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CannotOpenApp" xml:space="preserve">
|
<data name="CannotOpenApp" xml:space="preserve">
|
||||||
<value>Δεν είναι δυνατή η πρόσβαση στην εφαρμογή "{0}".</value>
|
<value>Δεν είναι δυνατή η πρόσβαση στην εφαρμογή "{0}".</value>
|
||||||
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
|
<comment>Message shown when trying to launch an app that does not exist on the user's device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorAppTitle" xml:space="preserve">
|
<data name="AuthenticatorAppTitle" xml:space="preserve">
|
||||||
<value>Εφαρμογή αυθεντικοποίησης</value>
|
<value>Εφαρμογή Επαλήθευσης</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnterVerificationCodeApp" xml:space="preserve">
|
<data name="EnterVerificationCodeApp" xml:space="preserve">
|
||||||
@@ -818,14 +818,14 @@
|
|||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginUnavailable" xml:space="preserve">
|
<data name="LoginUnavailable" xml:space="preserve">
|
||||||
<value>Μη διαθέσιμη σύνδεση</value>
|
<value>Μη Διαθέσιμη Σύνδεση</value>
|
||||||
<comment>For 2FA whenever there are no available providers on this device.</comment>
|
<comment>For 2FA whenever there are no available providers on this device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoTwoStepAvailable" xml:space="preserve">
|
<data name="NoTwoStepAvailable" xml:space="preserve">
|
||||||
<value>Αυτός ο λογαριασμός έχει ενεργοποιημένη τη σύνδεση δύο βημάτων, ωστόσο, σε αυτήν τη συσκευή δεν υποστηρίζεται κανένας από τους διαμορφωμένους παρόχους δύο βημάτων. Παρακαλώ χρησιμοποιήστε μια υποστηριζόμενη συσκευή και/ή προσθέστε επιπλέον παρόχους που υποστηρίζονται καλύτερα σε όλες τις συσκευές (όπως μια εφαρμογή αυθεντικοποίησης).</value>
|
<value>Αυτός ο λογαριασμός έχει ενεργοποιημένη τη σύνδεση σε δύο βήματα, ωστόσο, σε αυτήν τη συσκευή δεν υποστηρίζεται κανένας από τους διαμορφωμένους παροχείς δύο βημάτων. Χρησιμοποιήστε μια υποστηριζόμενη συσκευή και / ή προσθέστε επιπλέον παρόχους που υποστηρίζονται καλύτερα σε όλες τις συσκευές (όπως μια εφαρμογή επαλήθευσης).</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RecoveryCodeTitle" xml:space="preserve">
|
<data name="RecoveryCodeTitle" xml:space="preserve">
|
||||||
<value>Κωδικός ανάκτησης</value>
|
<value>Κωδικός Ανάκτησης</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="RememberMe" xml:space="preserve">
|
<data name="RememberMe" xml:space="preserve">
|
||||||
@@ -837,7 +837,7 @@
|
|||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TwoStepLoginOptions" xml:space="preserve">
|
<data name="TwoStepLoginOptions" xml:space="preserve">
|
||||||
<value>Επιλογές σύνδεσης δύο βημάτων</value>
|
<value>Επιλογές σύνδεσης δύο παραγόντων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UseAnotherTwoStepMethod" xml:space="preserve">
|
<data name="UseAnotherTwoStepMethod" xml:space="preserve">
|
||||||
<value>Χρήση άλλης μεθόδου δύο παραγόντων</value>
|
<value>Χρήση άλλης μεθόδου δύο παραγόντων</value>
|
||||||
@@ -847,18 +847,18 @@
|
|||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerificationEmailSent" xml:space="preserve">
|
<data name="VerificationEmailSent" xml:space="preserve">
|
||||||
<value>Το email επιβεβαίωσης στάλθηκε</value>
|
<value>Το email επιβεβαίωσης στάλθηκε.</value>
|
||||||
<comment>For 2FA</comment>
|
<comment>For 2FA</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="YubiKeyInstruction" xml:space="preserve">
|
<data name="YubiKeyInstruction" xml:space="preserve">
|
||||||
<value>Για να συνεχίσετε, κρατήστε το YubiKey NEO στο πίσω μέρος της συσκευής ή τοποθετήστε το YubiKey στη θύρα USB της συσκευής σας, και στη συνέχεια πατήστε το κουμπί του.</value>
|
<value>Για να συνεχίσετε, κρατήστε το YubiKey NEO στο πίσω μέρος της συσκευής ή τοποθετήστε το YubiKey στη θύρα USB της συσκευής σας, και στη συνέχεια πατήστε το κουμπί του.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YubiKeyTitle" xml:space="preserve">
|
<data name="YubiKeyTitle" xml:space="preserve">
|
||||||
<value>Κλειδί ασφαλείας YubiKey</value>
|
<value>Κλειδί Ασφαλείας YubiKey</value>
|
||||||
<comment>"YubiKey" is the product name and should not be translated.</comment>
|
<comment>"YubiKey" is the product name and should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddNewAttachment" xml:space="preserve">
|
<data name="AddNewAttachment" xml:space="preserve">
|
||||||
<value>Προσθήκη συνημμένου</value>
|
<value>Προσθήκη Νέου Συνημμένου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Attachments" xml:space="preserve">
|
<data name="Attachments" xml:space="preserve">
|
||||||
<value>Συνημμένα</value>
|
<value>Συνημμένα</value>
|
||||||
@@ -878,10 +878,10 @@
|
|||||||
<comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment>
|
<comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorKey" xml:space="preserve">
|
<data name="AuthenticatorKey" xml:space="preserve">
|
||||||
<value>Κλειδί αυθεντικοποίησης (TOTP)</value>
|
<value>Κλειδί επαλήθευσης (TOTP)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VerificationCodeTotp" xml:space="preserve">
|
<data name="VerificationCodeTotp" xml:space="preserve">
|
||||||
<value>Κωδικός επαλήθευσης (TOTP)</value>
|
<value>Κωδικός Επαλήθευσης (TOTP)</value>
|
||||||
<comment>Totp code label</comment>
|
<comment>Totp code label</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AuthenticatorKeyAdded" xml:space="preserve">
|
<data name="AuthenticatorKeyAdded" xml:space="preserve">
|
||||||
@@ -891,8 +891,7 @@
|
|||||||
<value>Αδυναμία ανάγνωσης κλειδιού επαλήθευσης.</value>
|
<value>Αδυναμία ανάγνωσης κλειδιού επαλήθευσης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PointYourCameraAtTheQRCode" xml:space="preserve">
|
<data name="PointYourCameraAtTheQRCode" xml:space="preserve">
|
||||||
<value>Σημαδέψτε με την κάμερα σας τον κωδικό QR.
|
<value>Σημαδέψτε τον κωδικό QR με τη κάμερα. Η σάρωση θα γίνει αυτόματα.</value>
|
||||||
Η σάρωση θα γίνει αυτόματα.</value>
|
|
||||||
</data>
|
</data>
|
||||||
<data name="ScanQrTitle" xml:space="preserve">
|
<data name="ScanQrTitle" xml:space="preserve">
|
||||||
<value>Σάρωση κώδικα QR</value>
|
<value>Σάρωση κώδικα QR</value>
|
||||||
@@ -907,7 +906,7 @@
|
|||||||
<value>Αντιγραφή TOTP</value>
|
<value>Αντιγραφή TOTP</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
|
<data name="CopyTotpAutomaticallyDescription" xml:space="preserve">
|
||||||
<value>Εάν η σύνδεση έχει κάποιο κλειδί αυθεντικοποίησης, αντιγράψτε τον κωδικό επαλήθευσης TOTP στο πρόχειρο σας όταν κάνετε με αυτόματη συμπλήρωση τη συνδεση.</value>
|
<value>Εάν η σύνδεση έχει κάποιο κλειδί επαλήθευσης, αντιγράψτε τον κωδικό επαλήθευσης TOTP στο πρόχειρο κάθε φορά που κάνετε αυτόματη συμπλήρωση τα στοιχεία σύνδεσης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyTotpAutomatically" xml:space="preserve">
|
<data name="CopyTotpAutomatically" xml:space="preserve">
|
||||||
<value>Αυτόματη αντιγραφή TOTP</value>
|
<value>Αυτόματη αντιγραφή TOTP</value>
|
||||||
@@ -922,7 +921,7 @@
|
|||||||
<value>Το συνημμένο διαγράφηκε</value>
|
<value>Το συνημμένο διαγράφηκε</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ChooseFile" xml:space="preserve">
|
<data name="ChooseFile" xml:space="preserve">
|
||||||
<value>Επιλογή αρχείου</value>
|
<value>Επιλογή Αρχείου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="File" xml:space="preserve">
|
<data name="File" xml:space="preserve">
|
||||||
<value>Αρχείο</value>
|
<value>Αρχείο</value>
|
||||||
@@ -946,16 +945,16 @@
|
|||||||
<value>Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη δυνατότητα μέχρι να ενημερώσετε το κλειδί κρυπτογράφησης.</value>
|
<value>Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη δυνατότητα μέχρι να ενημερώσετε το κλειδί κρυπτογράφησης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
|
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
|
||||||
<value>Απαιτείται μεταφορά του κλειδιού κρυπτογράφησης. Παρακαλούμε συνδεθείτε μέσω του διαδικτυακού vault για να ενημερώσετε το κλειδί κρυπτογράφησης.</value>
|
<value>Απαιτείται μεταφορά του κλειδιού κρυπτογράφησης. Παρακαλούμε συνδεθείτε μέσω του web vault για να ενημερώσετε το κλειδί κρυπτογράφησης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LearnMore" xml:space="preserve">
|
<data name="LearnMore" xml:space="preserve">
|
||||||
<value>Μάθετε περισσότερα</value>
|
<value>Μάθετε Περισσότερα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ApiUrl" xml:space="preserve">
|
<data name="ApiUrl" xml:space="preserve">
|
||||||
<value>URL διακομιστή API</value>
|
<value>URL Διακομιστή API</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomEnvironment" xml:space="preserve">
|
<data name="CustomEnvironment" xml:space="preserve">
|
||||||
<value>Προσαρμοσμένο περιβάλλον</value>
|
<value>Προσαρμοσμένο Περιβάλλον</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomEnvironmentFooter" xml:space="preserve">
|
<data name="CustomEnvironmentFooter" xml:space="preserve">
|
||||||
<value>Για προχωρημένους χρήστες. Μπορείτε να ορίσετε τo URL κάθε υπηρεσίας ανεξάρτητα.</value>
|
<value>Για προχωρημένους χρήστες. Μπορείτε να ορίσετε τo URL κάθε υπηρεσίας ανεξάρτητα.</value>
|
||||||
@@ -968,7 +967,7 @@
|
|||||||
<comment>Validation error when something is not formatted correctly, such as a URL or email address.</comment>
|
<comment>Validation error when something is not formatted correctly, such as a URL or email address.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="IdentityUrl" xml:space="preserve">
|
<data name="IdentityUrl" xml:space="preserve">
|
||||||
<value>URL διακομιστή ταυτότητας</value>
|
<value>URL Ταυτότητας Διακομιστή</value>
|
||||||
<comment>"Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management</comment>
|
<comment>"Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SelfHostedEnvironment" xml:space="preserve">
|
<data name="SelfHostedEnvironment" xml:space="preserve">
|
||||||
@@ -981,25 +980,25 @@
|
|||||||
<value>URL Διακομιστή</value>
|
<value>URL Διακομιστή</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVaultUrl" xml:space="preserve">
|
<data name="WebVaultUrl" xml:space="preserve">
|
||||||
<value>URL διακομιστή διαδικτυακού vault</value>
|
<value>URL Διακομιστή Web Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillServiceNotificationContentOld" xml:space="preserve">
|
<data name="BitwardenAutofillServiceNotificationContentOld" xml:space="preserve">
|
||||||
<value>Πατήστε στην ειδοποίηση για να συμπληρώσετε αυτόματα ένα στοιχείο από τη λίστα σας.</value>
|
<value>Πατήστε στην ειδοποίηση για να συμπληρώσετε αυτόματα ένα στοιχείο από τη λίστα σας.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomFields" xml:space="preserve">
|
<data name="CustomFields" xml:space="preserve">
|
||||||
<value>Προσαρμοσμένα πεδία</value>
|
<value>Προσαρμοσμένα Πεδία</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyNumber" xml:space="preserve">
|
<data name="CopyNumber" xml:space="preserve">
|
||||||
<value>Αντιγραφή αριθμού</value>
|
<value>Αντιγραφή Αριθμού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopySecurityCode" xml:space="preserve">
|
<data name="CopySecurityCode" xml:space="preserve">
|
||||||
<value>Αντιγραφή κωδικού ασφαλείας</value>
|
<value>Αντιγραφή Κωδικού Ασφαλείας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Number" xml:space="preserve">
|
<data name="Number" xml:space="preserve">
|
||||||
<value>Αριθμός</value>
|
<value>Αριθμός</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SecurityCode" xml:space="preserve">
|
<data name="SecurityCode" xml:space="preserve">
|
||||||
<value>Κωδικός ασφαλείας</value>
|
<value>Κωδικός Ασφαλείας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeCard" xml:space="preserve">
|
<data name="TypeCard" xml:space="preserve">
|
||||||
<value>Κάρτα</value>
|
<value>Κάρτα</value>
|
||||||
@@ -1011,7 +1010,7 @@
|
|||||||
<value>Σύνδεση</value>
|
<value>Σύνδεση</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TypeSecureNote" xml:space="preserve">
|
<data name="TypeSecureNote" xml:space="preserve">
|
||||||
<value>Ασφαλής σημείωση</value>
|
<value>Ασφαλής Σημείωση</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Address1" xml:space="preserve">
|
<data name="Address1" xml:space="preserve">
|
||||||
<value>Διεύθυνση 1</value>
|
<value>Διεύθυνση 1</value>
|
||||||
@@ -1050,10 +1049,10 @@
|
|||||||
<value>Dr</value>
|
<value>Dr</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExpirationMonth" xml:space="preserve">
|
<data name="ExpirationMonth" xml:space="preserve">
|
||||||
<value>Μήνας λήξης</value>
|
<value>Μήνας Λήξης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExpirationYear" xml:space="preserve">
|
<data name="ExpirationYear" xml:space="preserve">
|
||||||
<value>Έτος λήξης</value>
|
<value>Έτος Λήξης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="February" xml:space="preserve">
|
<data name="February" xml:space="preserve">
|
||||||
<value>Φεβρουάριος</value>
|
<value>Φεβρουάριος</value>
|
||||||
@@ -1077,7 +1076,7 @@
|
|||||||
<value>Ονοματεπώνυμο</value>
|
<value>Ονοματεπώνυμο</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LicenseNumber" xml:space="preserve">
|
<data name="LicenseNumber" xml:space="preserve">
|
||||||
<value>Αριθμός άδειας</value>
|
<value>Αριθμός Άδειας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="March" xml:space="preserve">
|
<data name="March" xml:space="preserve">
|
||||||
<value>Μάρτιος</value>
|
<value>Μάρτιος</value>
|
||||||
@@ -1086,7 +1085,7 @@
|
|||||||
<value>Μάιος</value>
|
<value>Μάιος</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MiddleName" xml:space="preserve">
|
<data name="MiddleName" xml:space="preserve">
|
||||||
<value>Μεσαίο όνομα</value>
|
<value>Μεσαίο Όνομα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Mr" xml:space="preserve">
|
<data name="Mr" xml:space="preserve">
|
||||||
<value>Κος</value>
|
<value>Κος</value>
|
||||||
@@ -1107,7 +1106,7 @@
|
|||||||
<value>Οκτώβριος</value>
|
<value>Οκτώβριος</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PassportNumber" xml:space="preserve">
|
<data name="PassportNumber" xml:space="preserve">
|
||||||
<value>Αριθμός διαβατηρίου</value>
|
<value>Αριθμός Διαβατηρίου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Phone" xml:space="preserve">
|
<data name="Phone" xml:space="preserve">
|
||||||
<value>Τηλέφωνο</value>
|
<value>Τηλέφωνο</value>
|
||||||
@@ -1125,7 +1124,7 @@
|
|||||||
<value>Τίτλος</value>
|
<value>Τίτλος</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ZipPostalCode" xml:space="preserve">
|
<data name="ZipPostalCode" xml:space="preserve">
|
||||||
<value>Ταχυδρομικός κώδικας</value>
|
<value>Ταχυδρομικός Κώδικας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Address" xml:space="preserve">
|
<data name="Address" xml:space="preserve">
|
||||||
<value>Διεύθυνση</value>
|
<value>Διεύθυνση</value>
|
||||||
@@ -1140,7 +1139,7 @@
|
|||||||
<value>Εμφάνιση μιας αναγνωρίσιμης εικόνας δίπλα σε κάθε σύνδεση.</value>
|
<value>Εμφάνιση μιας αναγνωρίσιμης εικόνας δίπλα σε κάθε σύνδεση.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IconsUrl" xml:space="preserve">
|
<data name="IconsUrl" xml:space="preserve">
|
||||||
<value>URL διακομιστή εικονιδίων</value>
|
<value>Εικονίδια Διακομιστή URL</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillWithBitwarden" xml:space="preserve">
|
<data name="AutofillWithBitwarden" xml:space="preserve">
|
||||||
<value>Αυτόματη συμπλήρωση με Bitwarden</value>
|
<value>Αυτόματη συμπλήρωση με Bitwarden</value>
|
||||||
@@ -1195,7 +1194,7 @@
|
|||||||
<value>Δεν ήταν δυνατό να ανοίξουμε αυτόματα το μενού ρυθμίσεων αυτόματης συμπλήρωσης Android για εσάς. Μπορείτε να πλοηγηθείτε στο μενού ρυθμίσεων αυτόματης συμπλήρωσης με μη αυτόματο τρόπο από τις Ρυθμίσεις Android > Σύστημα > Γλώσσες και εισαγωγή > Σύνθετες > Υπηρεσία αυτόματης συμπλήρωσης.</value>
|
<value>Δεν ήταν δυνατό να ανοίξουμε αυτόματα το μενού ρυθμίσεων αυτόματης συμπλήρωσης Android για εσάς. Μπορείτε να πλοηγηθείτε στο μενού ρυθμίσεων αυτόματης συμπλήρωσης με μη αυτόματο τρόπο από τις Ρυθμίσεις Android > Σύστημα > Γλώσσες και εισαγωγή > Σύνθετες > Υπηρεσία αυτόματης συμπλήρωσης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CustomFieldName" xml:space="preserve">
|
<data name="CustomFieldName" xml:space="preserve">
|
||||||
<value>Όνομα προσαρμοσμένου πεδίου</value>
|
<value>Όνομα Προσαρμοσμένου Πεδίου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FieldTypeBoolean" xml:space="preserve">
|
<data name="FieldTypeBoolean" xml:space="preserve">
|
||||||
<value>Δυαδικό</value>
|
<value>Δυαδικό</value>
|
||||||
@@ -1210,7 +1209,7 @@
|
|||||||
<value>Κείμενο</value>
|
<value>Κείμενο</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewCustomField" xml:space="preserve">
|
<data name="NewCustomField" xml:space="preserve">
|
||||||
<value>Νέο προσαρμοσμένο πεδίο</value>
|
<value>Νέο Προσαρμοσμένο Πεδίο</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SelectTypeField" xml:space="preserve">
|
<data name="SelectTypeField" xml:space="preserve">
|
||||||
<value>Τι τύπος προσαρμοσμένου πεδίου είναι αυτό που θέλετε να προσθέσετε;</value>
|
<value>Τι τύπος προσαρμοσμένου πεδίου είναι αυτό που θέλετε να προσθέσετε;</value>
|
||||||
@@ -1249,11 +1248,11 @@
|
|||||||
<value>Εντοπισμός Αντιστοίχισης URI</value>
|
<value>Εντοπισμός Αντιστοίχισης URI</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="MatchDetection" xml:space="preserve">
|
<data name="MatchDetection" xml:space="preserve">
|
||||||
<value>Εντοπισμός αντιστοίχισης</value>
|
<value>Εντοπισμός Αντιστοίχισης</value>
|
||||||
<comment>URI match detection for auto-fill.</comment>
|
<comment>URI match detection for auto-fill.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="YesAndSave" xml:space="preserve">
|
<data name="YesAndSave" xml:space="preserve">
|
||||||
<value>Ναι, και αποθήκευση</value>
|
<value>Αποδοχή και Αποθήκευση</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillAndSave" xml:space="preserve">
|
<data name="AutofillAndSave" xml:space="preserve">
|
||||||
<value>Αυτόματη συμπλήρωση και αποθήκευση</value>
|
<value>Αυτόματη συμπλήρωση και αποθήκευση</value>
|
||||||
@@ -1275,7 +1274,7 @@
|
|||||||
<value>Η υπηρεσία προσβασιμότητας μπορεί να είναι χρήσιμη όταν οι εφαρμογές δεν υποστηρίζουν την τυπική υπηρεσία αυτόματης συμπλήρωσης.</value>
|
<value>Η υπηρεσία προσβασιμότητας μπορεί να είναι χρήσιμη όταν οι εφαρμογές δεν υποστηρίζουν την τυπική υπηρεσία αυτόματης συμπλήρωσης.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DatePasswordUpdated" xml:space="preserve">
|
<data name="DatePasswordUpdated" xml:space="preserve">
|
||||||
<value>Ο κωδικός ενημερώθηκε</value>
|
<value>Ο Κωδικός Ενημερώθηκε</value>
|
||||||
<comment>ex. Date this password was updated</comment>
|
<comment>ex. Date this password was updated</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="DateUpdated" xml:space="preserve">
|
<data name="DateUpdated" xml:space="preserve">
|
||||||
@@ -1298,7 +1297,7 @@
|
|||||||
<value>Αποκτήστε πρόσβαση στη λίστα σας απευθείας από το πληκτρολόγιό σας για γρήγορη αυτόματη συμπλήρωση κωδικών.</value>
|
<value>Αποκτήστε πρόσβαση στη λίστα σας απευθείας από το πληκτρολόγιό σας για γρήγορη αυτόματη συμπλήρωση κωδικών.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillTurnOn" xml:space="preserve">
|
<data name="AutofillTurnOn" xml:space="preserve">
|
||||||
<value>Για να ενεργοποιήσετε την αυτόματη συμπλήρωση κωδικού στη συσκευή σας, ακολουθήστε αυτές τις οδηγίες:</value>
|
<value>Για να ενεργοποιήσετε την αυτόματη συμπλήρωση του κωδικού στη συσκευή σας, ακολουθήστε αυτές τις οδηγίες:</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillTurnOn1" xml:space="preserve">
|
<data name="AutofillTurnOn1" xml:space="preserve">
|
||||||
<value>1. Μεταβείτε στις "Ρυθμίσεις" του iOS</value>
|
<value>1. Μεταβείτε στις "Ρυθμίσεις" του iOS</value>
|
||||||
@@ -1316,7 +1315,7 @@
|
|||||||
<value>5. Επιλέξτε "Bitwarden"</value>
|
<value>5. Επιλέξτε "Bitwarden"</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordAutofill" xml:space="preserve">
|
<data name="PasswordAutofill" xml:space="preserve">
|
||||||
<value>Αυτόματη συμπλήρωση κωδικού</value>
|
<value>Αυτόματη Συμπλήρωση Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAutofillAlert2" xml:space="preserve">
|
<data name="BitwardenAutofillAlert2" xml:space="preserve">
|
||||||
<value>Ο ευκολότερος τρόπος για να προσθέσετε νέες συνδέσεις στο vault σας, είναι με την επέκταση αυτόματης συμπλήρωσης κωδικών Bitwarden. Μάθετε περισσότερα σχετικά με τη χρήση της επέκτασης αυτής, μεταβαίνοντας στις "Ρυθμίσεις".</value>
|
<value>Ο ευκολότερος τρόπος για να προσθέσετε νέες συνδέσεις στο vault σας, είναι με την επέκταση αυτόματης συμπλήρωσης κωδικών Bitwarden. Μάθετε περισσότερα σχετικά με τη χρήση της επέκτασης αυτής, μεταβαίνοντας στις "Ρυθμίσεις".</value>
|
||||||
@@ -1334,10 +1333,10 @@
|
|||||||
<value>Συνδέσεις</value>
|
<value>Συνδέσεις</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SecureNotes" xml:space="preserve">
|
<data name="SecureNotes" xml:space="preserve">
|
||||||
<value>Ασφαλείς σημειώσεις</value>
|
<value>Ασφαλείς Σημειώσεις</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AllItems" xml:space="preserve">
|
<data name="AllItems" xml:space="preserve">
|
||||||
<value>Όλα τα στοιχεία</value>
|
<value>Όλα τα Στοιχεία</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="URIs" xml:space="preserve">
|
<data name="URIs" xml:space="preserve">
|
||||||
<value>URIs</value>
|
<value>URIs</value>
|
||||||
@@ -1357,13 +1356,13 @@
|
|||||||
<value>Ο κωδικός αυτός δεν βρέθηκε σε γνωστές διαρροές δεδομένων. Είναι ασφαλής για χρήση.</value>
|
<value>Ο κωδικός αυτός δεν βρέθηκε σε γνωστές διαρροές δεδομένων. Είναι ασφαλής για χρήση.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="IdentityName" xml:space="preserve">
|
<data name="IdentityName" xml:space="preserve">
|
||||||
<value>Όνομα ταυτότητας</value>
|
<value>Όνομα Ταυτότητας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Value" xml:space="preserve">
|
<data name="Value" xml:space="preserve">
|
||||||
<value>Τιμή</value>
|
<value>Τιμή</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordHistory" xml:space="preserve">
|
<data name="PasswordHistory" xml:space="preserve">
|
||||||
<value>Ιστορικό κωδικού</value>
|
<value>Ιστορικό Κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Types" xml:space="preserve">
|
<data name="Types" xml:space="preserve">
|
||||||
<value>Τύποι</value>
|
<value>Τύποι</value>
|
||||||
@@ -1434,13 +1433,13 @@
|
|||||||
<value>Επιλέξτε έναν οργανισμό στον οποίο θέλετε να μετακινήσετε αυτό το στοιχείο. Η μετακίνηση σε έναν οργανισμό μεταβιβάζει την ιδιοκτησία του στοιχείου σε αυτό τον οργανισμό. Δεν θα είστε πλέον ο άμεσος ιδιοκτήτης αυτού του στοιχείου μόλις το μετακινήσετε.</value>
|
<value>Επιλέξτε έναν οργανισμό στον οποίο θέλετε να μετακινήσετε αυτό το στοιχείο. Η μετακίνηση σε έναν οργανισμό μεταβιβάζει την ιδιοκτησία του στοιχείου σε αυτό τον οργανισμό. Δεν θα είστε πλέον ο άμεσος ιδιοκτήτης αυτού του στοιχείου μόλις το μετακινήσετε.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NumberOfWords" xml:space="preserve">
|
<data name="NumberOfWords" xml:space="preserve">
|
||||||
<value>Αριθμός λέξεων</value>
|
<value>Αριθμός Λέξεων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Passphrase" xml:space="preserve">
|
<data name="Passphrase" xml:space="preserve">
|
||||||
<value>Συνθηματικό</value>
|
<value>Συνθηματικό</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WordSeparator" xml:space="preserve">
|
<data name="WordSeparator" xml:space="preserve">
|
||||||
<value>Διαχωριστής λέξεων</value>
|
<value>Διαχωριστής Λέξεων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Clear" xml:space="preserve">
|
<data name="Clear" xml:space="preserve">
|
||||||
<value>Εκκαθάριση</value>
|
<value>Εκκαθάριση</value>
|
||||||
@@ -1454,7 +1453,7 @@
|
|||||||
<value>Δεν υπάρχουν φάκελοι προς εμφάνιση.</value>
|
<value>Δεν υπάρχουν φάκελοι προς εμφάνιση.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FingerprintPhrase" xml:space="preserve">
|
<data name="FingerprintPhrase" xml:space="preserve">
|
||||||
<value>Φράση δακτυλικών αποτυπωμάτων</value>
|
<value>Φράση Δακτυλικών Αποτυπωμάτων</value>
|
||||||
<comment>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.</comment>
|
<comment>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.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="YourAccountsFingerprint" xml:space="preserve">
|
<data name="YourAccountsFingerprint" xml:space="preserve">
|
||||||
@@ -1465,10 +1464,10 @@
|
|||||||
<value>Το Bitwarden επιτρέπει να μοιράζεστε τα στοιχεία του vault σας με άλλους χρησιμοποιώντας ένα λογαριασμό οργανισμού. Θέλετε να επισκεφθείτε την ιστοσελίδα bitwarden.com για να μάθετε περισσότερα;</value>
|
<value>Το Bitwarden επιτρέπει να μοιράζεστε τα στοιχεία του vault σας με άλλους χρησιμοποιώντας ένα λογαριασμό οργανισμού. Θέλετε να επισκεφθείτε την ιστοσελίδα bitwarden.com για να μάθετε περισσότερα;</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExportVault" xml:space="preserve">
|
<data name="ExportVault" xml:space="preserve">
|
||||||
<value>Εξαγωγή του vault</value>
|
<value>Εξαγωγή Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockNow" xml:space="preserve">
|
<data name="LockNow" xml:space="preserve">
|
||||||
<value>Κλείδωμα τώρα</value>
|
<value>Κλείδωμα Τώρα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PIN" xml:space="preserve">
|
<data name="PIN" xml:space="preserve">
|
||||||
<value>PIN</value>
|
<value>PIN</value>
|
||||||
@@ -1477,7 +1476,7 @@
|
|||||||
<value>Ξεκλείδωμα</value>
|
<value>Ξεκλείδωμα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockVault" xml:space="preserve">
|
<data name="UnlockVault" xml:space="preserve">
|
||||||
<value>Ξεκλείδωμα του vault</value>
|
<value>Ξεκλείδωμα Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThirtyMinutes" xml:space="preserve">
|
<data name="ThirtyMinutes" xml:space="preserve">
|
||||||
<value>30 λεπτά</value>
|
<value>30 λεπτά</value>
|
||||||
@@ -1522,7 +1521,7 @@
|
|||||||
<value>2 λεπτά</value>
|
<value>2 λεπτά</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ClearClipboard" xml:space="preserve">
|
<data name="ClearClipboard" xml:space="preserve">
|
||||||
<value>Εκκαθάριση πρόχειρου</value>
|
<value>Εκκαθάριση Πρόχειρου</value>
|
||||||
<comment>Clipboard is the operating system thing where you copy/paste data to on your device.</comment>
|
<comment>Clipboard is the operating system thing where you copy/paste data to on your device.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ClearClipboardDescription" xml:space="preserve">
|
<data name="ClearClipboardDescription" xml:space="preserve">
|
||||||
@@ -1550,7 +1549,7 @@
|
|||||||
<value>Προεπιλεγμένο σκοτεινό θέμα</value>
|
<value>Προεπιλεγμένο σκοτεινό θέμα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyNotes" xml:space="preserve">
|
<data name="CopyNotes" xml:space="preserve">
|
||||||
<value>Αντιγραφή σημείωσης</value>
|
<value>Αντιγραφή Σημειώσεων</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Exit" xml:space="preserve">
|
<data name="Exit" xml:space="preserve">
|
||||||
<value>Έξοδος</value>
|
<value>Έξοδος</value>
|
||||||
@@ -1574,19 +1573,19 @@
|
|||||||
<comment>'Solarized Dark' is the name of a specific color scheme. It should not be translated.</comment>
|
<comment>'Solarized Dark' is the name of a specific color scheme. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||||
<value>Αυτόματη συμπλήρωση μπλοκαρισμένων URI</value>
|
<value>Αυτόματη συμπλήρωση μπλοκαρισμένων URIs</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AskToAddLogin" xml:space="preserve">
|
<data name="AskToAddLogin" xml:space="preserve">
|
||||||
<value>Ρωτήστε για να προσθέστε σύνδεση</value>
|
<value>Ζητήστε να προσθέστε σύνδεση</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AskToAddLoginDescription" xml:space="preserve">
|
<data name="AskToAddLoginDescription" xml:space="preserve">
|
||||||
<value>Ρωτήστε για να προσθέσετε ένα αντικείμενο αν δε βρεθεί στο vault σας.</value>
|
<value>Ζητήστε να προσθέσετε ένα αντικείμενο αν δε βρεθεί στην κρύπτη σας.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OnRestart" xml:space="preserve">
|
<data name="OnRestart" xml:space="preserve">
|
||||||
<value>Κατά την επανεκκίνηση της εφαρμογής</value>
|
<value>Κατά την Επανεκκίνηση Εφαρμογής</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AutofillServiceNotEnabled" xml:space="preserve">
|
<data name="AutofillServiceNotEnabled" xml:space="preserve">
|
||||||
<value>Η αυτόματη συμπλήρωση διευκολύνει την ασφαλή πρόσβαση στο vault του Bitwarden από άλλες ιστοσελίδες και εφαρμογές. Φαίνεται ότι δεν έχετε ενεργοποιήσει την υπηρεσία αυτόματης συμπλήρωσης για το Bitwarden. Ενεργοποιήστε την αυτόματη συμπλήρωση από τις "Ρυθμίσεις".</value>
|
<value>Η αυτόματη συμπλήρωση διευκολύνει την ασφαλή πρόσβαση στη λίστα από άλλες ιστοσελίδες και εφαρμογές. Φαίνεται ότι δεν έχετε ενεργοποιήσει την υπηρεσία αυτόματης συμπλήρωσης για το Bitwarden. Ενεργοποιήστε την από τις "Ρυθμίσεις".</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ThemeAppliedOnRestart" xml:space="preserve">
|
<data name="ThemeAppliedOnRestart" xml:space="preserve">
|
||||||
<value>Οι αλλαγές θεμάτων θα ισχύουν όταν γίνει επανεκκίνηση της εφαρμογής.</value>
|
<value>Οι αλλαγές θεμάτων θα ισχύουν όταν γίνει επανεκκίνηση της εφαρμογής.</value>
|
||||||
@@ -1596,7 +1595,7 @@
|
|||||||
<comment>ex. Uppercase the first character of a word.</comment>
|
<comment>ex. Uppercase the first character of a word.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="IncludeNumber" xml:space="preserve">
|
<data name="IncludeNumber" xml:space="preserve">
|
||||||
<value>Συμπερίληψη αριθμών</value>
|
<value>Συμπερίληψη Αριθμών</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Download" xml:space="preserve">
|
<data name="Download" xml:space="preserve">
|
||||||
<value>Λήψη</value>
|
<value>Λήψη</value>
|
||||||
@@ -1611,13 +1610,13 @@
|
|||||||
<value>Η περίοδος σύνδεσης σας έχει λήξει.</value>
|
<value>Η περίοδος σύνδεσης σας έχει λήξει.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BiometricsDirection" xml:space="preserve">
|
<data name="BiometricsDirection" xml:space="preserve">
|
||||||
<value>Βιομετρική επαλήθευση</value>
|
<value>Χρήση βιομετρικής μεθόδου για επαλήθευση.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Biometrics" xml:space="preserve">
|
<data name="Biometrics" xml:space="preserve">
|
||||||
<value>Βιομετρική</value>
|
<value>Βιομετρική</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UseBiometricsToUnlock" xml:space="preserve">
|
<data name="UseBiometricsToUnlock" xml:space="preserve">
|
||||||
<value>Χρήση βιομετρικών για ξεκλείδωμα</value>
|
<value>Χρήση βιομετρικής μεθόδου για ξεκλείδωμα</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
|
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
|
||||||
<value>Το Bitwarden χρειάζεται προσοχή - Ανατρέξτε στην ενότητα "Υπηρεσία προσβασιμότητας αυτόματης συμπλήρωσης" από τις ρυθμίσεις Bitwarden</value>
|
<value>Το Bitwarden χρειάζεται προσοχή - Ανατρέξτε στην ενότητα "Υπηρεσία προσβασιμότητας αυτόματης συμπλήρωσης" από τις ρυθμίσεις Bitwarden</value>
|
||||||
@@ -1641,7 +1640,7 @@
|
|||||||
<value>Χορηγήθηκε</value>
|
<value>Χορηγήθηκε</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="FileFormat" xml:space="preserve">
|
<data name="FileFormat" xml:space="preserve">
|
||||||
<value>Μορφή αρχείου</value>
|
<value>Μορφή Αρχείου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExportVaultMasterPasswordDescription" xml:space="preserve">
|
<data name="ExportVaultMasterPasswordDescription" xml:space="preserve">
|
||||||
<value>Εισαγάγετε τον κύριο κωδικό για εξαγωγή των δεδομένων vault.</value>
|
<value>Εισαγάγετε τον κύριο κωδικό για εξαγωγή των δεδομένων vault.</value>
|
||||||
@@ -1650,7 +1649,7 @@
|
|||||||
<value>Στείλτε έναν κωδικό επαλήθευσης στο email σας</value>
|
<value>Στείλτε έναν κωδικό επαλήθευσης στο email σας</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CodeSent" xml:space="preserve">
|
<data name="CodeSent" xml:space="preserve">
|
||||||
<value>Ο κωδικός στάλθηκε!</value>
|
<value>Ο Κωδικός Στάλθηκε</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ConfirmYourIdentity" xml:space="preserve">
|
<data name="ConfirmYourIdentity" xml:space="preserve">
|
||||||
<value>Επιβεβαιώστε την ταυτότητα σας για να συνεχίσετε.</value>
|
<value>Επιβεβαιώστε την ταυτότητα σας για να συνεχίσετε.</value>
|
||||||
@@ -1665,7 +1664,7 @@
|
|||||||
<value>Τα κλειδιά κρυπτογράφησης λογαριασμού είναι μοναδικά για κάθε λογαριασμό χρήστη Bitwarden, οπότε δεν μπορείτε να εισάγετε μια κρυπτογραφημένη εξαγωγή σε διαφορετικό λογαριασμό.</value>
|
<value>Τα κλειδιά κρυπτογράφησης λογαριασμού είναι μοναδικά για κάθε λογαριασμό χρήστη Bitwarden, οπότε δεν μπορείτε να εισάγετε μια κρυπτογραφημένη εξαγωγή σε διαφορετικό λογαριασμό.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExportVaultConfirmationTitle" xml:space="preserve">
|
<data name="ExportVaultConfirmationTitle" xml:space="preserve">
|
||||||
<value>Επιβεβαίωση εξαγωγής vault</value>
|
<value>Επιβεβαίωση εξαγωγής Vault</value>
|
||||||
<comment>Title for the alert to confirm vault exports.</comment>
|
<comment>Title for the alert to confirm vault exports.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Warning" xml:space="preserve">
|
<data name="Warning" xml:space="preserve">
|
||||||
@@ -1908,7 +1907,7 @@
|
|||||||
<value>Ημερομηνία διαγραφής</value>
|
<value>Ημερομηνία διαγραφής</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeletionTime" xml:space="preserve">
|
<data name="DeletionTime" xml:space="preserve">
|
||||||
<value>Χρόνος διαγραφής</value>
|
<value>Χρόνος Διαγραφής</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DeletionDateInfo" xml:space="preserve">
|
<data name="DeletionDateInfo" xml:space="preserve">
|
||||||
<value>Το Send θα διαγραφεί οριστικά την καθορισμένη ημερομηνία και ώρα.</value>
|
<value>Το Send θα διαγραφεί οριστικά την καθορισμένη ημερομηνία και ώρα.</value>
|
||||||
@@ -1918,7 +1917,7 @@
|
|||||||
<value>Εκκρεμεί διαγραφή</value>
|
<value>Εκκρεμεί διαγραφή</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExpirationDate" xml:space="preserve">
|
<data name="ExpirationDate" xml:space="preserve">
|
||||||
<value>Ημερομηνία λήξης</value>
|
<value>Ημερομηνία Λήξης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExpirationTime" xml:space="preserve">
|
<data name="ExpirationTime" xml:space="preserve">
|
||||||
<value>Χρόνος λήξης</value>
|
<value>Χρόνος λήξης</value>
|
||||||
@@ -1944,14 +1943,14 @@
|
|||||||
<value>Τρέχων Αριθμός Πρόσβασης</value>
|
<value>Τρέχων Αριθμός Πρόσβασης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewPassword" xml:space="preserve">
|
<data name="NewPassword" xml:space="preserve">
|
||||||
<value>Νέος κωδικός πρόσβασης</value>
|
<value>Νέος Κωδικός</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasswordInfo" xml:space="preserve">
|
<data name="PasswordInfo" xml:space="preserve">
|
||||||
<value>Προαιρετικά απαιτείται κωδικός πρόσβασης για τους χρήστες για να έχουν πρόσβαση σε αυτό το Send.</value>
|
<value>Προαιρετικά απαιτείται κωδικός πρόσβασης για τους χρήστες για να έχουν πρόσβαση σε αυτό το Send.</value>
|
||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemovePassword" xml:space="preserve">
|
<data name="RemovePassword" xml:space="preserve">
|
||||||
<value>Αφαίρεση κωδικού πρόσβασης</value>
|
<value>Αφαίρεση κωδικού</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AreYouSureRemoveSendPassword" xml:space="preserve">
|
<data name="AreYouSureRemoveSendPassword" xml:space="preserve">
|
||||||
<value>Είστε βέβαιοι ότι θέλετε να καταργήσετε τον κωδικό πρόσβασης;</value>
|
<value>Είστε βέβαιοι ότι θέλετε να καταργήσετε τον κωδικό πρόσβασης;</value>
|
||||||
@@ -1979,10 +1978,10 @@
|
|||||||
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyLink" xml:space="preserve">
|
<data name="CopyLink" xml:space="preserve">
|
||||||
<value>Αντιγραφή συνδέσμου</value>
|
<value>Αντιγραφή Συνδέσμου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ShareLink" xml:space="preserve">
|
<data name="ShareLink" xml:space="preserve">
|
||||||
<value>Κοινοποίηση συνδέσμου</value>
|
<value>Κοινοποίηση Συνδέσμου</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SendLink" xml:space="preserve">
|
<data name="SendLink" xml:space="preserve">
|
||||||
<value>Σύνδεσμος Send</value>
|
<value>Σύνδεσμος Send</value>
|
||||||
@@ -2077,7 +2076,7 @@
|
|||||||
<value>Το Captcha απέτυχε. Παρακαλώ προσπάθησε ξανα.</value>
|
<value>Το Captcha απέτυχε. Παρακαλώ προσπάθησε ξανα.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UpdatedMasterPassword" xml:space="preserve">
|
<data name="UpdatedMasterPassword" xml:space="preserve">
|
||||||
<value>Ενημερωμένος κύριος κωδικός πρόσβασης</value>
|
<value>Ενημερώθηκε ο κύριος κωδικός πρόσβασης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UpdateMasterPassword" xml:space="preserve">
|
<data name="UpdateMasterPassword" xml:space="preserve">
|
||||||
<value>Ενημερώστε τον κύριο κωδικό πρόσβασης</value>
|
<value>Ενημερώστε τον κύριο κωδικό πρόσβασης</value>
|
||||||
@@ -2092,7 +2091,7 @@
|
|||||||
<value>Δεν είναι δυνατή η ενημέρωση του κωδικού πρόσβασης</value>
|
<value>Δεν είναι δυνατή η ενημέρωση του κωδικού πρόσβασης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveMasterPassword" xml:space="preserve">
|
<data name="RemoveMasterPassword" xml:space="preserve">
|
||||||
<value>Αφαίρεση κύριου κωδικού πρόσβασης</value>
|
<value>Αφαίρεση Κύριου Κωδικού Πρόσβασης</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RemoveMasterPasswordWarning" xml:space="preserve">
|
<data name="RemoveMasterPasswordWarning" xml:space="preserve">
|
||||||
<value>{0} χρησιμοποιεί SSO με κρυπτογράφηση διαχείρισης πελατών. Συνεχίζοντας θα καταργήσετε τον Κύριο Κωδικό από το λογαριασμό σας και θα απαιτήσετε SSO για να συνδεθείτε.</value>
|
<value>{0} χρησιμοποιεί SSO με κρυπτογράφηση διαχείρισης πελατών. Συνεχίζοντας θα καταργήσετε τον Κύριο Κωδικό από το λογαριασμό σας και θα απαιτήσετε SSO για να συνδεθείτε.</value>
|
||||||
@@ -2876,13 +2875,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Ρυθμίστε μια επιλογή κλειδώματος για να αλλάξετε την ενέργεια στη λήξη χρόνου του vault σας.</value>
|
<value>Ρυθμίστε μια επιλογή κλειδώματος για να αλλάξετε την ενέργεια στη λήξη χρόνου του vault σας.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo σύνδεση δύο βημάτων απαιτείται για το λογαριασμό σας. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Ακολουθήστε τα βήματα από το Duo για να ολοκληρώσετε τη σύνδεση.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Εκκίνηση Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2890,13 +2890,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2823,7 +2823,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||||||
<value>¿Continuar con el servicio de asistencia?</value>
|
<value>¿Continuar con el servicio de asistencia?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToPrivacyPolicy" xml:space="preserve">
|
<data name="ContinueToPrivacyPolicy" xml:space="preserve">
|
||||||
<value>¿Continuar a la política de privacidad?</value>
|
<value>Continue to privacy policy?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ContinueToAppStore" xml:space="preserve">
|
<data name="ContinueToAppStore" xml:space="preserve">
|
||||||
<value>¿Continuar a la App Store?</value>
|
<value>¿Continuar a la App Store?</value>
|
||||||
@@ -2845,7 +2845,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||||||
<value>¿No encuentras lo que estás buscando? Contacta con el soporte de Bitwarden en bitwarden.com.</value>
|
<value>¿No encuentras lo que estás buscando? Contacta con el soporte de Bitwarden en bitwarden.com.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="PrivacyPolicyDescriptionLong" xml:space="preserve">
|
<data name="PrivacyPolicyDescriptionLong" xml:space="preserve">
|
||||||
<value>Revise nuestra política de privacidad en bitwarden.com.</value>
|
<value>Check out our privacy policy on bitwarden.com.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExploreMoreFeaturesOfYourBitwardenAccountOnTheWebApp" xml:space="preserve">
|
<data name="ExploreMoreFeaturesOfYourBitwardenAccountOnTheWebApp" xml:space="preserve">
|
||||||
<value>Explora más características de tu cuenta de Bitwarden en la aplicación web.</value>
|
<value>Explora más características de tu cuenta de Bitwarden en la aplicación web.</value>
|
||||||
@@ -2878,13 +2878,4 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Configura una opción de desbloqueo para cambiar tu acción de tiempo de espera de tu caja fuerte.</value>
|
<value>Configura una opción de desbloqueo para cambiar tu acción de tiempo de espera de tu caja fuerte.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Se requiere el inicio de sesión en dos pasos Duo para su cuenta. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Siga los pasos de Duo para terminar de iniciar sesión.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Iniciar Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Soovid selle konto peale lülituda?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2875,13 +2875,4 @@ Kontu honetara aldatu nahi duzu?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Haluatko vaihtaa tähän tiliin?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Muuta holvisi aikakatkaisutoimintoa määrittämällä lukituksen avaustapa.</value>
|
<value>Muuta holvisi aikakatkaisutoimintoa määrittämällä lukituksen avaustapa.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Tilillesi kirjautuminen vaatii Duo-vahvistuksen.</value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Viimeistele kirjautuminen seuraamalla Duon ohjeita.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Avaa Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Gusto mo bang pumunta sa account na ito?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Voulez-vous basculer vers ce compte ?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Configurez une méthode de déverrouillage pour modifier l'action après délai d'expiration de votre coffre.</value>
|
<value>Configurez une méthode de déverrouillage pour modifier l'action après délai d'expiration de votre coffre.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>L'authentification à deux facteurs Duo est requise pour votre compte. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Lancer Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2879,13 +2879,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2874,13 +2874,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Za promjenu vremena isteka trezora, odredi način otključavanja.</value>
|
<value>Za promjenu vremena isteka trezora, odredi način otključavanja.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2875,13 +2875,4 @@ Szeretnénk átváltani erre a fiókra?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Állítsunk be egy feloldási módot a széf időkifutási műveletének módosításához.</value>
|
<value>Állítsunk be egy feloldási módot a széf időkifutási műveletének módosításához.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>DUO kétlépéses bejelentkezés szükséges a fiókhoz. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Kövessük a Duo lépéseit a bejelentkezés befejezéséhez.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Duo indítása</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Vuoi passare a questo account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Imposta un metodo di sblocco per modificare l'azione timeout cassaforte.</value>
|
<value>Imposta un metodo di sblocco per modificare l'azione timeout cassaforte.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>保管庫のタイムアウト動作を変更するには、ロック解除方法を設定してください。</value>
|
<value>保管庫のタイムアウト動作を変更するには、ロック解除方法を設定してください。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>アカウントには Duo 二段階認証が必要です。</value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Duo の手順に従ってログインを完了してください。</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Duo を起動</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2877,13 +2877,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -2876,13 +2876,4 @@ Do you want to switch to this account?</value>
|
|||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Set up an unlock option to change your vault timeout action.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Launch Duo</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -946,7 +946,7 @@ Nuskaitymas vyks automatiškai.</value>
|
|||||||
<value>Negalite naudoti šios funkcijos, kol neatnaujinsite šifravimo raktą.</value>
|
<value>Negalite naudoti šios funkcijos, kol neatnaujinsite šifravimo raktą.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
|
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
|
||||||
<value>Privaloma migruoti šifravimo raktą. Prašome prisijungti per internetinę saugyklą norint jį atnaujinti.</value>
|
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LearnMore" xml:space="preserve">
|
<data name="LearnMore" xml:space="preserve">
|
||||||
<value>Sužinoti daugiau</value>
|
<value>Sužinoti daugiau</value>
|
||||||
@@ -1741,7 +1741,7 @@ Nuskaitymas vyks automatiškai.</value>
|
|||||||
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
<data name="AccountBiometricInvalidated" xml:space="preserve">
|
||||||
<value>Biometrinis atrakinimas išjungtas, kol neįvesite pagrindinio slaptažodžio.</value>
|
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
|
||||||
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
|
||||||
@@ -2739,7 +2739,7 @@ Ar norite pereiti prie šios paskyros?</value>
|
|||||||
<value>Cannot edit multiple URIs at once</value>
|
<value>Cannot edit multiple URIs at once</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoginApproved" xml:space="preserve">
|
<data name="LoginApproved" xml:space="preserve">
|
||||||
<value>Prisijungimas patvirtintas</value>
|
<value>Login approved</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
|
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
|
||||||
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
|
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
|
||||||
@@ -2748,13 +2748,13 @@ Ar norite pereiti prie šios paskyros?</value>
|
|||||||
<value>Log in with device</value>
|
<value>Log in with device</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LoggingInOn" xml:space="preserve">
|
<data name="LoggingInOn" xml:space="preserve">
|
||||||
<value>Prisijungiama prie</value>
|
<value>Logging in on</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Vault" xml:space="preserve">
|
<data name="Vault" xml:space="preserve">
|
||||||
<value>Vault</value>
|
<value>Vault</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Appearance" xml:space="preserve">
|
<data name="Appearance" xml:space="preserve">
|
||||||
<value>Išvaizda</value>
|
<value>Appearance</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountSecurity" xml:space="preserve">
|
<data name="AccountSecurity" xml:space="preserve">
|
||||||
<value>Account security</value>
|
<value>Account security</value>
|
||||||
@@ -2769,7 +2769,7 @@ Ar norite pereiti prie šios paskyros?</value>
|
|||||||
<value>Copy app information</value>
|
<value>Copy app information</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SyncNow" xml:space="preserve">
|
<data name="SyncNow" xml:space="preserve">
|
||||||
<value>Sinchronizuoti dabar</value>
|
<value>Sync now</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="UnlockOptions" xml:space="preserve">
|
<data name="UnlockOptions" xml:space="preserve">
|
||||||
<value>Unlock options</value>
|
<value>Unlock options</value>
|
||||||
@@ -2859,31 +2859,22 @@ Ar norite pereiti prie šios paskyros?</value>
|
|||||||
<value>Choose the dark theme to use when your device’s dark mode is in use</value>
|
<value>Choose the dark theme to use when your device’s dark mode is in use</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CreatedXY" xml:space="preserve">
|
<data name="CreatedXY" xml:space="preserve">
|
||||||
<value>Sukurta {0}, {1}</value>
|
<value>Created {0}, {1}</value>
|
||||||
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
|
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="TooManyAttempts" xml:space="preserve">
|
<data name="TooManyAttempts" xml:space="preserve">
|
||||||
<value>Viršytas bandymų skaičius</value>
|
<value>Too many attempts</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
|
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
|
||||||
<value>Atsijungta nuo paskyros.</value>
|
<value>Account logged out.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
|
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
|
||||||
<value>Dėl pasikeitusių Jūsų organizacijos nuostatų, Jums reikia nustatyti pagrindinį slaptažodį.</value>
|
<value>Your organization permissions were updated, requiring you to set a master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
|
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
|
||||||
<value>Jūsų organizacijos nuostatos reikalauja Jus nustatyti pagrindinį slaptažodį.</value>
|
<value>Your organization requires you to set a master password.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
|
||||||
<value>Nustatykite atrakinimo būdą, kad pakeistumėte Jūsų saugyklos laiko limito veiksmą.</value>
|
<value>Set up an unlock option to change your vault timeout action.</value>
|
||||||
</data>
|
|
||||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
|
||||||
<value>Duo two-step login is required for your account. </value>
|
|
||||||
</data>
|
|
||||||
<data name="FollowTheStepsFromDuoToFinishLoggingIn" xml:space="preserve">
|
|
||||||
<value>Follow the steps from Duo to finish logging in.</value>
|
|
||||||
</data>
|
|
||||||
<data name="LaunchDuo" xml:space="preserve">
|
|
||||||
<value>Paleisti „Duo“</value>
|
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user