diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7dad4798d..a06a8fc6c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,12 +1,21 @@ -# Please sort lines alphabetically, this will ensure we don't accidentally add duplicates. +# Please sort into logical groups with comment headers. Sort groups in order of specificity. +# For example, default owners should always be the first group. +# Sort lines alphabetically within these groups to avoid accidentally adding duplicates. # # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners -# The following owners will be the default owners for everything in the repo. -# Unless a later match takes precedence -# @bitwarden/tech-leads +# Default file owners +* @bitwarden/dept-development-mobile -@bitwarden/dept-development-mobile +# DevOps for Actions and other workflow changes +.github/workflows @bitwarden/dept-devops + +# DevOps for Version Bumping +src/Android/Properties/AndroidManifest.xml +src/iOS.Autofill/Info.plist +src/iOS.Extension/Info.plist +src/iOS.ShareExtension/Info.plist +src/iOS/Info.plist ## Auth team files ## diff --git a/.github/renovate.json b/.github/renovate.json index 52e80afcf..2f6fafa4a 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -2,22 +2,21 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base", + "github>bitwarden/renovate-config:pin-actions", ":combinePatchMinorReleases", ":dependencyDashboard", ":maintainLockFilesWeekly", ":pinAllExceptPeerDependencies", ":prConcurrentLimit10", ":rebaseStalePrs", - "schedule:weekends", - ":separateMajorReleases" + ":separateMajorReleases", + "group:monorepos", + "schedule:weekends" ], - "enabledManagers": ["cargo", "github-actions", "npm", "nuget"], + "enabledManagers": ["github-actions", "npm", "nuget"], + "commitMessagePrefix": "[deps]:", + "commitMessageTopic": "{{depName}}", "packageRules": [ - { - "groupName": "cargo minor", - "matchManagers": ["cargo"], - "matchUpdateTypes": ["minor", "patch"] - }, { "groupName": "gh minor", "matchManagers": ["github-actions"], @@ -32,6 +31,6 @@ "groupName": "nuget minor", "matchManagers": ["nuget"], "matchUpdateTypes": ["minor", "patch"] - }, + } ] } diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fe6f6a176..f40ce596c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -75,12 +75,12 @@ jobs: nuget-version: 6.4.0 - name: Set up .NET - uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v3.2.0 + uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0 with: dotnet-version: '8.0.x' - name: Set up MSBuild - uses: microsoft/setup-msbuild@1ff57057b5cfdc39105cd07a01d78e9b0ea0c14c # v1.3.1 + uses: microsoft/setup-msbuild@ede762b26a2de8d110bb5a3db4d7e0e080c0e917 # v1.3.3 # This step might be obsolete at some point as .NET MAUI workloads # are starting to come pre-installed on the GH Actions build agents. @@ -157,7 +157,7 @@ jobs: run: dotnet test test/Core.Test/Core.Test.csproj --logger "trx;LogFileName=test-results.trx" /p:CustomConstants=UT - name: Report test results - uses: dorny/test-reporter@c9b3d0e2bd2a4e96aaf424dbaa31c46b42318226 # v1.6.0 + uses: dorny/test-reporter@eaa763f6ffc21c7a37837f56cd5f9737f27fc6c8 # v1.8.0 if: always() with: name: Test Results @@ -226,7 +226,7 @@ jobs: - name: Upload Prod .aab artifact if: ${{ matrix.variant == 'prod' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: com.x8bit.bitwarden.aab path: ./com.x8bit.bitwarden.aab @@ -234,7 +234,7 @@ jobs: - name: Upload Prod .apk artifact if: ${{ matrix.variant == 'prod' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: com.x8bit.bitwarden.apk path: ./com.x8bit.bitwarden.apk @@ -242,7 +242,7 @@ jobs: - name: Upload Other .apk artifact if: ${{ matrix.variant != 'prod' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: com.x8bit.bitwarden.${{ matrix.variant }}.apk path: ./com.x8bit.bitwarden.${{ matrix.variant }}.apk @@ -262,7 +262,7 @@ jobs: - name: Upload .apk sha file for prod if: ${{ matrix.variant == 'prod' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: bw-android-apk-sha256.txt path: ./bw-android-apk-sha256.txt @@ -270,7 +270,7 @@ jobs: - name: Upload .apk sha file for other if: ${{ matrix.variant != 'prod' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: bw-android-${{ matrix.variant }}-apk-sha256.txt path: ./bw-android-${{ matrix.variant }}-apk-sha256.txt @@ -310,7 +310,7 @@ jobs: dotnet-version: '8.0.x' - name: Set up MSBuild - uses: microsoft/setup-msbuild@1ff57057b5cfdc39105cd07a01d78e9b0ea0c14c # v1.3.1 + uses: microsoft/setup-msbuild@ede762b26a2de8d110bb5a3db4d7e0e080c0e917 # v1.3.3 # This step might be obsolete at some point as .NET MAUI workloads # are starting to come pre-installed on the GH Actions build agents. @@ -366,13 +366,6 @@ jobs: $androidManifest = $($env:GITHUB_WORKSPACE + "/${{ env.android_manifest_path }}"); - # Write-Output "########################################" - # Write-Output "##### Clean Android and App" - # Write-Output "########################################" - - # msbuild "$($androidPath)" "/t:Clean" "/p:Configuration=FDroid" - # msbuild "$($appPath)" "/t:Clean" "/p:Configuration=FDroid" - Write-Output "########################################" Write-Output "##### Backup project files" Write-Output "########################################" @@ -392,42 +385,6 @@ jobs: $xml.Save($androidManifest); - # Write-Output "########################################" - # Write-Output "##### Uninstall from App.csproj" - # Write-Output "########################################" - - # $xml=New-Object XML; - # $xml.Load($appPath); - - # $ns=New-Object System.Xml.XmlNamespaceManager($xml.NameTable); - # $ns.AddNamespace("ns", $xml.DocumentElement.NamespaceURI); - - # $firebaseNode=$xml.SelectSingleNode(` - # "/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Firebase.Messaging']", $ns); - # $firebaseNode.ParentNode.RemoveChild($firebaseNode); - - # $daggerNode=$xml.SelectSingleNode(` - # "/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Google.Dagger']", $ns); - # $daggerNode.ParentNode.RemoveChild($daggerNode); - - # $safetyNetNode=$xml.SelectSingleNode(` - # "/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.GooglePlayServices.SafetyNet']", $ns); - # $safetyNetNode.ParentNode.RemoveChild($safetyNetNode); - - # $xml.Save($appPath); - - # Write-Output "########################################" - # Write-Output "##### Uninstall from Core.csproj" - # Write-Output "########################################" - - # $xml=New-Object XML; - # $xml.Load($corePath); - - # $appCenterNode=$xml.SelectSingleNode("/Project/ItemGroup/PackageReference[@Include='Microsoft.AppCenter.Crashes']"); - # $appCenterNode.ParentNode.RemoveChild($appCenterNode); - - # $xml.Save($corePath); - - name: Restore packages run: dotnet restore @@ -465,7 +422,7 @@ jobs: Copy-Item $signedApkPath $signedApkDestPath - name: Upload F-Droid .apk artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: com.x8bit.bitwarden-fdroid.apk path: ./com.x8bit.bitwarden-fdroid.apk @@ -477,7 +434,7 @@ jobs: -t sha256 | Out-File -Encoding ASCII ./bw-fdroid-apk-sha256.txt - name: Upload F-Droid sha file - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: bw-fdroid-apk-sha256.txt path: ./bw-fdroid-apk-sha256.txt @@ -495,7 +452,7 @@ jobs: - name: Set XCode version uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: - xcode-version: 15.0.1 + xcode-version: 15.1 - name: Setup NuGet uses: nuget/setup-nuget@296fd3ccf8528660c91106efefe2364482f86d6f # v1.2.0 @@ -525,7 +482,7 @@ jobs: submodules: 'true' - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -705,7 +662,7 @@ jobs: cp -r -v $WATCH_ARCHIVE_DSYMS_PATH $WATCH_DSYMS_EXPORT_PATH - name: Upload App Store .ipa & dSYMs artifacts - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: Bitwarden iOS path: | @@ -714,7 +671,7 @@ jobs: if-no-files-found: error - name: Upload .app file for Automation CI - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 with: name: ${{ env.app_ci_output_filename }}.app.zip path: ./bitwarden-export/${{ env.app_ci_output_filename }}.app.zip @@ -799,7 +756,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -811,7 +768,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0 + uses: crowdin/github-action@97bef4fd3f1b853eb105bc99b8d0d563760e024c # v1.17.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -858,7 +815,7 @@ jobs: fi - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 if: failure() with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 7e90341a6..8424ca0e9 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -15,10 +15,10 @@ jobs: _CROWDIN_PROJECT_ID: "269690" steps: - name: Checkout repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.6 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -30,7 +30,7 @@ jobs: secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" - name: Download translations - uses: crowdin/github-action@965d501f160af7b1f88aed4c29154b0caf1e94b9 # v1.9.0 + uses: crowdin/github-action@97bef4fd3f1b853eb105bc99b8d0d563760e024c # v1.17.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8f5e1f757..fbcfe24cc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,7 +38,7 @@ jobs: fi - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - name: Check Release Version id: version @@ -68,7 +68,7 @@ jobs: - name: Download all artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d # v3.0.0 with: workflow: build.yml workflow_conclusion: success @@ -76,7 +76,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d # v3.0.0 with: workflow: build.yml workflow_conclusion: success @@ -126,11 +126,11 @@ jobs: if: inputs.fdroid_publish steps: - name: Checkout repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - name: Download F-Droid .apk artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d # v3.0.0 with: workflow: build.yml workflow_conclusion: success @@ -139,7 +139,7 @@ jobs: - name: Dry Run - Download F-Droid .apk artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.27.0 + uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d # v3.0.0 with: workflow: build.yml workflow_conclusion: success @@ -147,7 +147,7 @@ jobs: name: com.x8bit.bitwarden-fdroid.apk - name: Set up Node - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 with: node-version: '16.x' diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index ac05312ac..9c256187f 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: 'Run stale action' - uses: actions/stale@f7176fd3007623b69d27091f9b9d4ab7995f0a06 # v5.2.1 + uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 with: stale-issue-label: 'needs-reply' stale-pr-label: 'needs-changes' diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index dc7a16f1e..88b86acbd 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -14,7 +14,7 @@ jobs: version_number: ${{ steps.version.outputs.new-version }} steps: - name: Checkout Branch - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - name: Calculate bumped version id: version diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 1f58ffc55..bb24c76e2 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Login to Azure - CI Subscription - uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} @@ -33,13 +33,22 @@ jobs: github-pat-bitwarden-devops-bot-repo-scope" - name: Checkout Branch - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: ref: main - repository: bitwarden/mobile + + - name: Check if RC branch exists + if: ${{ inputs.cut_rc_branch == true }} + run: | + remote_rc_branch_check=$(git ls-remote --heads origin rc | wc -l) + if [[ "${remote_rc_branch_check}" -gt 0 ]]; then + echo "Remote RC branch exists." + echo "Please delete current RC branch before running again." + exit 1 + fi - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@d6f3f49f3345e29369fe57596a3ca8f94c4d2ca7 # v5.4.0 + uses: crazy-max/ghaction-import-gpg@01dd5d3ca463c7f10f7f4f7b4f177225ac661ee4 # v6.1.0 with: gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} @@ -183,14 +192,22 @@ jobs: with: ref: main - - name: Check if RC branch exists + - name: Verify version has been updated + env: + NEW_VERSION: ${{ inputs.version_number }} run: | - remote_rc_branch_check=$(git ls-remote --heads origin rc | wc -l) - if [[ "${remote_rc_branch_check}" -gt 0 ]]; then - echo "Remote RC branch exists." - echo "Please delete current RC branch before running again." - exit 1 - fi + CURRENT_VERSION=$(xmllint --xpath ' + string(/manifest/@*[local-name()="versionName" + and namespace-uri()="http://schemas.android.com/apk/res/android"]) + ' src/Android/Properties/AndroidManifest.xml) + + # Wait for version to change. + while [[ "$NEW_VERSION" != "$CURRENT_VERSION" ]] + do + echo "Waiting for version to be updated..." + sleep 10 + git pull --force + done - name: Cut RC branch run: | diff --git a/Directory.Build.props b/Directory.Build.props index 1be40c600..5a27c8b90 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,12 @@ 8.0.4-nightly.* + Automatic:AppStore + iPhone Distribution + True + True + -gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a" + diff --git a/package-lock.json b/package-lock.json index 32f51b928..b92128bf8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "bitwarden-mobile", "version": "0.0.0", "devDependencies": { - "gh-pages": "^3.2.3" + "gh-pages": "3.2.3" } }, "node_modules/array-union": { diff --git a/package.json b/package.json index 37d87bd2e..acaf22c51 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,6 @@ "clean:l10n": "git push origin --delete l10n_master" }, "devDependencies": { - "gh-pages": "^3.2.3" + "gh-pages": "3.2.3" } } diff --git a/src/App/App.csproj b/src/App/App.csproj index 3f7bac275..b40eae359 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -56,18 +56,20 @@ iPhone Developer Platforms\iOS\Entitlements.plist true - + + + $(Argon2IdLoadMtouchExtraArgs) - -gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a" + $(Argon2IdLoadMtouchExtraArgs) false - Automatic:AppStore - iPhone Distribution + $(ReleaseCodesignProvision) + $(ReleaseCodesignKey) Platforms\iOS\Entitlements.plist true - -gcc_flags "-L$(ProjectDir)../../lib/ios -largon2 -force_load $(ProjectDir)../../lib/ios/libargon2.a" + $(Argon2IdLoadMtouchExtraArgs) @@ -209,7 +211,7 @@ - + true false @@ -223,15 +225,15 @@ false - - $(Home)/Library/Developer/Xcode/DerivedData/bitwarden-acgkbpwvmebfiofokotvoerzkqcl/Build/Products - $([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..'))/watchOS/bitwarden.xcarchive/Products/Applications/bitwarden.app/Watch - Bitwarden.app - watchsimulator - watchos - $(WatchAppBuildPath)/$(Configuration)-$(WatchAppConfiguration)/$(WatchAppBundle) - $(WatchAppBuildPath)/$(WatchAppBundle) - + + $(Home)/Library/Developer/Xcode/DerivedData/bitwarden-acgkbpwvmebfiofokotvoerzkqcl/Build/Products + $([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..'))/watchOS/bitwarden.xcarchive/Products/Applications/bitwarden.app/Watch + Bitwarden.app + watchsimulator + watchos + $(WatchAppBuildPath)/$(Configuration)-$(WatchAppConfiguration)/$(WatchAppBundle) + $(WatchAppBuildPath)/$(WatchAppBundle) + <_ResolvedWatchAppReferences Include="$(WatchAppBundleFullPath)" /> diff --git a/src/App/Platforms/Android/AndroidManifest.xml b/src/App/Platforms/Android/AndroidManifest.xml index fe5203eab..2f3d812e2 100644 --- a/src/App/Platforms/Android/AndroidManifest.xml +++ b/src/App/Platforms/Android/AndroidManifest.xml @@ -1,5 +1,5 @@  - + diff --git a/src/App/Platforms/Android/Handlers/CustomTabbedPageHandler.cs b/src/App/Platforms/Android/Handlers/CustomTabbedPageHandler.cs index 8d863e003..1a734eeb6 100644 --- a/src/App/Platforms/Android/Handlers/CustomTabbedPageHandler.cs +++ b/src/App/Platforms/Android/Handlers/CustomTabbedPageHandler.cs @@ -1,5 +1,6 @@ using AndroidX.AppCompat.View.Menu; using Bit.Core.Abstractions; +using Bit.Core.Services; using Bit.Core.Utilities; using Google.Android.Material.BottomNavigation; using Microsoft.Maui.Handlers; @@ -90,7 +91,17 @@ namespace Bit.App.Handlers if(e.Item is MenuItemImpl item) { System.Diagnostics.Debug.WriteLine($"Tab '{item.Title}' was reselected so we'll PopToRoot."); - MainThread.BeginInvokeOnMainThread(async () => await _tabbedPage.CurrentPage.Navigation.PopToRootAsync()); + MainThread.BeginInvokeOnMainThread(async () => + { + try + { + await _tabbedPage.CurrentPage.Navigation.PopToRootAsync(); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } + }); } } diff --git a/src/App/Platforms/Android/MainActivity.cs b/src/App/Platforms/Android/MainActivity.cs index 88fbceb8c..fe852fc7e 100644 --- a/src/App/Platforms/Android/MainActivity.cs +++ b/src/App/Platforms/Android/MainActivity.cs @@ -76,7 +76,8 @@ namespace Bit.Droid //We need to get and set the Options before calling OnCreate as that will "trigger" CreateWindow on App.xaml.cs _appOptions = GetOptions(); - ((Bit.App.App)Microsoft.Maui.Controls.Application.Current).SetOptions(_appOptions); + //This does not replace existing Options in App.xaml.cs if it exists already. It only updates properties in Options related with Autofill/CreateSend/etc.. + ((Bit.App.App)Microsoft.Maui.Controls.Application.Current).SetAndroidOptions(_appOptions); base.OnCreate(savedInstanceState); diff --git a/src/App/Platforms/Android/MainApplication.cs b/src/App/Platforms/Android/MainApplication.cs index d38aa2ed1..f23363b42 100644 --- a/src/App/Platforms/Android/MainApplication.cs +++ b/src/App/Platforms/Android/MainApplication.cs @@ -158,7 +158,7 @@ namespace Bit.Droid var autofillHandler = new AutofillHandler(stateService, messagingService, clipboardService, platformUtilsService, new LazyResolve()); var cryptoFunctionService = new PclCryptoFunctionService(cryptoPrimitiveService); - var cryptoService = new CryptoService(stateService, cryptoFunctionService); + var cryptoService = new CryptoService(stateService, cryptoFunctionService, logger); var biometricService = new BiometricService(stateService, cryptoService); var userPinService = new UserPinService(stateService, cryptoService); var passwordRepromptService = new MobilePasswordRepromptService(platformUtilsService, cryptoService, stateService); diff --git a/src/App/Platforms/iOS/AppDelegate.cs b/src/App/Platforms/iOS/AppDelegate.cs index 4961ab97b..066eb54bc 100644 --- a/src/App/Platforms/iOS/AppDelegate.cs +++ b/src/App/Platforms/iOS/AppDelegate.cs @@ -15,6 +15,7 @@ using CoreNFC; using Foundation; using Microsoft.Maui.Platform; using UIKit; +using UserNotifications; using WatchConnectivity; namespace Bit.iOS @@ -41,73 +42,78 @@ namespace Bit.iOS private IStateService _stateService; private IEventService _eventService; - private LazyResolve _deepLinkContext = new LazyResolve(); + private readonly LazyResolve _deepLinkContext = new LazyResolve(); public override bool FinishedLaunching(UIApplication app, NSDictionary options) { - InitApp(); - - _deviceActionService = ServiceContainer.Resolve("deviceActionService"); - _messagingService = ServiceContainer.Resolve("messagingService"); - _broadcasterService = ServiceContainer.Resolve("broadcasterService"); - _storageService = ServiceContainer.Resolve("storageService"); - _stateService = ServiceContainer.Resolve("stateService"); - _eventService = ServiceContainer.Resolve("eventService"); - - ConnectToWatchIfNeededAsync().FireAndForget(); - - _broadcasterService.Subscribe(nameof(AppDelegate), async (message) => + try { - try + InitApp(); + + _deviceActionService = ServiceContainer.Resolve("deviceActionService"); + _messagingService = ServiceContainer.Resolve("messagingService"); + _broadcasterService = ServiceContainer.Resolve("broadcasterService"); + _storageService = ServiceContainer.Resolve("storageService"); + _stateService = ServiceContainer.Resolve("stateService"); + _eventService = ServiceContainer.Resolve("eventService"); + + ConnectToWatchIfNeededAsync().FireAndForget(); + + _broadcasterService.Subscribe(nameof(AppDelegate), async (message) => { - if (message.Command == "startEventTimer") + try { - StartEventTimer(); - } - else if (message.Command == "stopEventTimer") - { - var task = StopEventTimerAsync(); - } - else if (message.Command is ThemeManager.UPDATED_THEME_MESSAGE_KEY) - { - MainThread.BeginInvokeOnMainThread(() => + if (message.Command == "startEventTimer") { - iOSCoreHelpers.AppearanceAdjustments(); - }); - } - else if (message.Command == "listenYubiKeyOTP") - { - iOSCoreHelpers.ListenYubiKey((bool)message.Data, _deviceActionService, _nfcSession, _nfcDelegate); - } - else if (message.Command == "unlocked") - { - var needsAutofillReplacement = await _storageService.GetAsync( - Core.Constants.AutofillNeedsIdentityReplacementKey); - if (needsAutofillReplacement.GetValueOrDefault()) - { - await ASHelpers.ReplaceAllIdentitiesAsync(); + StartEventTimer(); } - } - else if (message.Command == "showAppExtension") - { - MainThread.BeginInvokeOnMainThread(() => ShowAppExtension((ExtensionPageViewModel)message.Data)); - } - else if (message.Command == "syncCompleted") - { - if (message.Data is Dictionary data && data.ContainsKey("successfully")) + else if (message.Command == "stopEventTimer") { - var success = data["successfully"] as bool?; - if (success.GetValueOrDefault() && _deviceActionService.SystemMajorVersion() >= 12) + var task = StopEventTimerAsync(); + } + else if (message.Command is ThemeManager.UPDATED_THEME_MESSAGE_KEY) + { + await MainThread.InvokeOnMainThreadAsync(() => + { + iOSCoreHelpers.AppearanceAdjustments(); + }); + } + else if (message.Command == "listenYubiKeyOTP" && message.Data is bool listen) + { + iOSCoreHelpers.ListenYubiKey(listen, _deviceActionService, _nfcSession, _nfcDelegate); + } + else if (message.Command == "unlocked") + { + var needsAutofillReplacement = await _storageService.GetAsync( + Core.Constants.AutofillNeedsIdentityReplacementKey); + if (needsAutofillReplacement.GetValueOrDefault()) { await ASHelpers.ReplaceAllIdentitiesAsync(); } } - } - else if (message.Command == "addedCipher" || message.Command == "editedCipher" || - message.Command == "restoredCipher") - { - if (_deviceActionService.SystemMajorVersion() >= 12) + else if (message.Command == "showAppExtension") { + await MainThread.InvokeOnMainThreadAsync(() => ShowAppExtension((ExtensionPageViewModel)message.Data)); + } + else if (message.Command == "syncCompleted") + { + if (message.Data is Dictionary data && data.TryGetValue("successfully", out var value)) + { + var success = value as bool?; + if (success.GetValueOrDefault() && _deviceActionService.SystemMajorVersion() >= 12) + { + await ASHelpers.ReplaceAllIdentitiesAsync(); + } + } + } + else if (message.Command == "addedCipher" || message.Command == "editedCipher" || + message.Command == "restoredCipher") + { + if (!UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) + { + return; + } + if (await ASHelpers.IdentitiesSupportIncrementalAsync()) { var cipherId = message.Data as string; @@ -124,11 +130,13 @@ namespace Bit.iOS } await ASHelpers.ReplaceAllIdentitiesAsync(); } - } - else if (message.Command == "deletedCipher" || message.Command == "softDeletedCipher") - { - if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) + else if (message.Command == "deletedCipher" || message.Command == "softDeletedCipher") { + if (!UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) + { + return; + } + if (await ASHelpers.IdentitiesSupportIncrementalAsync()) { var identity = ASHelpers.ToPasswordCredentialIdentity( @@ -142,105 +150,145 @@ namespace Bit.iOS } await ASHelpers.ReplaceAllIdentitiesAsync(); } - } - else if (message.Command == "logout") - { - if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) + else if (message.Command == "logout" && UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) { await ASCredentialIdentityStore.SharedStore.RemoveAllCredentialIdentitiesAsync(); } - } - else if ((message.Command == "softDeletedCipher" || message.Command == "restoredCipher") - && UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) - { - await ASHelpers.ReplaceAllIdentitiesAsync(); - } - else if (message.Command == AppHelpers.VAULT_TIMEOUT_ACTION_CHANGED_MESSAGE_COMMAND) - { - var timeoutAction = await _stateService.GetVaultTimeoutActionAsync(); - if (timeoutAction == VaultTimeoutAction.Logout && UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) - { - await ASCredentialIdentityStore.SharedStore.RemoveAllCredentialIdentitiesAsync(); - } - else + else if ((message.Command == "softDeletedCipher" || message.Command == "restoredCipher") + && UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) { await ASHelpers.ReplaceAllIdentitiesAsync(); } + else if (message.Command == AppHelpers.VAULT_TIMEOUT_ACTION_CHANGED_MESSAGE_COMMAND) + { + var timeoutAction = await _stateService.GetVaultTimeoutActionAsync(); + if (timeoutAction == VaultTimeoutAction.Logout) + { + if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) + { + await ASCredentialIdentityStore.SharedStore.RemoveAllCredentialIdentitiesAsync(); + } + } + else + { + await ASHelpers.ReplaceAllIdentitiesAsync(); + } + } } - } - catch (Exception ex) - { - LoggerHelper.LogEvenIfCantBeResolved(ex); - } - }); + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } + }); - var finishedLaunching = base.FinishedLaunching(app, options); + var finishedLaunching = base.FinishedLaunching(app, options); - ThemeManager.SetTheme(Microsoft.Maui.Controls.Application.Current.Resources); - iOSCoreHelpers.AppearanceAdjustments(); + ThemeManager.SetTheme(Microsoft.Maui.Controls.Application.Current.Resources); + iOSCoreHelpers.AppearanceAdjustments(); - return finishedLaunching; + return finishedLaunching; + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; + } } public override void OnResignActivation(UIApplication uiApplication) { - if (UIApplication.SharedApplication.KeyWindow is null) + try { + if (UIApplication.SharedApplication.KeyWindow != null) + { + var view = new UIView(UIApplication.SharedApplication.KeyWindow.Frame) + { + Tag = SPLASH_VIEW_TAG + }; + var backgroundView = new UIView(UIApplication.SharedApplication.KeyWindow.Frame) + { + BackgroundColor = ThemeManager.GetResourceColor("SplashBackgroundColor").ToPlatform() + }; + var logo = new UIImage(!ThemeManager.UsingLightTheme ? "logo_white.png" : "logo.png"); + var frame = new CGRect(0, 0, 280, 100); //Setting image width to avoid it being larger and getting cropped on smaller devices. This harcoded size should be good even for very small devices. + var imageView = new UIImageView(frame) + { + Image = logo, + Center = new CGPoint(view.Center.X, view.Center.Y - 30), + ContentMode = UIViewContentMode.ScaleAspectFit + }; + view.AddSubview(backgroundView); + view.AddSubview(imageView); + UIApplication.SharedApplication.KeyWindow.AddSubview(view); + UIApplication.SharedApplication.KeyWindow.BringSubviewToFront(view); + UIApplication.SharedApplication.KeyWindow.EndEditing(true); + } base.OnResignActivation(uiApplication); - return; } - - var view = new UIView(UIApplication.SharedApplication.KeyWindow.Frame) + catch (Exception ex) { - Tag = SPLASH_VIEW_TAG - }; - var backgroundView = new UIView(UIApplication.SharedApplication.KeyWindow.Frame) - { - BackgroundColor = ThemeManager.GetResourceColor("SplashBackgroundColor").ToPlatform() - }; - var logo = new UIImage(!ThemeManager.UsingLightTheme ? "logo_white.png" : "logo.png"); - var frame = new CGRect(0, 0, 280, 100); //Setting image width to avoid it being larger and getting cropped on smaller devices. This harcoded size should be good even for very small devices. - var imageView = new UIImageView(frame) - { - Image = logo, - Center = new CGPoint(view.Center.X, view.Center.Y - 30), - ContentMode = UIViewContentMode.ScaleAspectFit - }; - view.AddSubview(backgroundView); - view.AddSubview(imageView); - UIApplication.SharedApplication.KeyWindow.AddSubview(view); - UIApplication.SharedApplication.KeyWindow.BringSubviewToFront(view); - UIApplication.SharedApplication.KeyWindow.EndEditing(true); - - base.OnResignActivation(uiApplication); + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; + } } public override void DidEnterBackground(UIApplication uiApplication) { - if (_stateService != null && _deviceActionService != null) + try { - _stateService.SetLastActiveTimeAsync(_deviceActionService.GetActiveTime()); - } + if (_stateService != null && _deviceActionService != null) + { + _stateService.SetLastActiveTimeAsync(_deviceActionService.GetActiveTime()); + } - _messagingService?.Send("slept"); - base.DidEnterBackground(uiApplication); + _messagingService?.Send("slept"); + base.DidEnterBackground(uiApplication); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; + } } - public override void OnActivated(UIApplication uiApplication) + public override async void OnActivated(UIApplication uiApplication) { - base.OnActivated(uiApplication); - UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0; - UIApplication.SharedApplication.KeyWindow? - .ViewWithTag(SPLASH_VIEW_TAG)? - .RemoveFromSuperview(); + try + { + base.OnActivated(uiApplication); - ThemeManager.UpdateThemeOnPagesAsync(); + if (UIDevice.CurrentDevice.CheckSystemVersion(17, 0)) + { + await UNUserNotificationCenter.Current.SetBadgeCountAsync(0); + } + else + { + UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0; + } + + UIApplication.SharedApplication.KeyWindow? + .ViewWithTag(SPLASH_VIEW_TAG)? + .RemoveFromSuperview(); + + ThemeManager.UpdateThemeOnPagesAsync(); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } public override void WillEnterForeground(UIApplication uiApplication) { - _messagingService?.Send(AppHelpers.RESUMED_MESSAGE_COMMAND); - base.WillEnterForeground(uiApplication); + try + { + _messagingService?.Send(AppHelpers.RESUMED_MESSAGE_COMMAND); + base.WillEnterForeground(uiApplication); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } [Export("application:openURL:sourceApplication:annotation:")] @@ -251,15 +299,30 @@ namespace Bit.iOS public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { - return _deepLinkContext.Value.OnNewUri(url) || base.OpenUrl(app, url, options); + try + { + return _deepLinkContext.Value.OnNewUri(url) || base.OpenUrl(app, url, options); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + return false; + } } public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler) { - if (Microsoft.Maui.ApplicationModel.Platform.ContinueUserActivity(application, userActivity, completionHandler)) + try { - return true; + if (Microsoft.Maui.ApplicationModel.Platform.ContinueUserActivity(application, userActivity, completionHandler)) + { + return true; + } + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); } return base.ContinueUserActivity(application, userActivity, completionHandler); } @@ -267,33 +330,68 @@ namespace Bit.iOS [Export("application:didFailToRegisterForRemoteNotificationsWithError:")] public void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error) { - _pushHandler?.OnErrorReceived(error); + try + { + _pushHandler?.OnErrorReceived(error); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } [Export("application:didRegisterForRemoteNotificationsWithDeviceToken:")] public void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) { - _pushHandler?.OnRegisteredSuccess(deviceToken); + try + { + _pushHandler?.OnRegisteredSuccess(deviceToken); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } [Export("application:didRegisterUserNotificationSettings:")] public void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings) { - application.RegisterForRemoteNotifications(); + try + { + application.RegisterForRemoteNotifications(); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } [Export("application:didReceiveRemoteNotification:fetchCompletionHandler:")] public void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action completionHandler) { - _pushHandler?.OnMessageReceived(userInfo); + try + { + _pushHandler?.OnMessageReceived(userInfo); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } [Export("application:didReceiveRemoteNotification:")] public void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo) { - _pushHandler?.OnMessageReceived(userInfo); + try + { + _pushHandler?.OnMessageReceived(userInfo); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } public void InitApp() @@ -319,7 +417,7 @@ namespace Bit.iOS _nfcDelegate = new Core.NFCReaderDelegate((success, message) => _messagingService.Send("gotYubiKeyOTP", message)); - iOSCoreHelpers.Bootstrap(async () => await ApplyManagedSettingsAsync()); + iOSCoreHelpers.Bootstrap(ApplyManagedSettingsAsync); } private void RegisterPush() @@ -364,31 +462,45 @@ namespace Bit.iOS _eventTimer = null; MainThread.BeginInvokeOnMainThread(() => { - _eventTimer = NSTimer.CreateScheduledTimer(60, true, timer => + try { - var task = Task.Run(() => _eventService.UploadEventsAsync()); - }); + _eventTimer = NSTimer.CreateScheduledTimer(60, true, timer => + { + _eventService?.UploadEventsAsync().FireAndForget(); + }); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } }); } private async Task StopEventTimerAsync() { - _eventTimer?.Invalidate(); - _eventTimer?.Dispose(); - _eventTimer = null; - if (_eventBackgroundTaskId > 0) + try { + _eventTimer?.Invalidate(); + _eventTimer?.Dispose(); + _eventTimer = null; + if (_eventBackgroundTaskId > 0) + { + UIApplication.SharedApplication.EndBackgroundTask(_eventBackgroundTaskId); + _eventBackgroundTaskId = 0; + } + _eventBackgroundTaskId = UIApplication.SharedApplication.BeginBackgroundTask(() => + { + UIApplication.SharedApplication.EndBackgroundTask(_eventBackgroundTaskId); + _eventBackgroundTaskId = 0; + }); + await _eventService.UploadEventsAsync(); UIApplication.SharedApplication.EndBackgroundTask(_eventBackgroundTaskId); _eventBackgroundTaskId = 0; } - _eventBackgroundTaskId = UIApplication.SharedApplication.BeginBackgroundTask(() => + catch (Exception ex) { - UIApplication.SharedApplication.EndBackgroundTask(_eventBackgroundTaskId); - _eventBackgroundTaskId = 0; - }); - await _eventService.UploadEventsAsync(); - UIApplication.SharedApplication.EndBackgroundTask(_eventBackgroundTaskId); - _eventBackgroundTaskId = 0; + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } private async Task ApplyManagedSettingsAsync() diff --git a/src/App/Platforms/iOS/Info.plist b/src/App/Platforms/iOS/Info.plist index da8dfd7d0..7fcff1107 100644 --- a/src/App/Platforms/iOS/Info.plist +++ b/src/App/Platforms/iOS/Info.plist @@ -11,7 +11,7 @@ CFBundleIdentifier com.8bit.bitwarden CFBundleShortVersionString - 2024.1.1 + 2024.2.0 CFBundleVersion 1 CFBundleIconName diff --git a/src/Core/Abstractions/ICryptoService.cs b/src/Core/Abstractions/ICryptoService.cs index 427179776..ffb9f4c31 100644 --- a/src/Core/Abstractions/ICryptoService.cs +++ b/src/Core/Abstractions/ICryptoService.cs @@ -63,5 +63,7 @@ namespace Bit.Core.Abstractions Task DecryptAndMigrateOldPinKeyAsync(bool masterPasswordOnRestart, string pin, string email, KdfConfig kdfConfig, EncString oldPinKey); Task GetOrDeriveMasterKeyAsync(string password, string userId = null); Task UpdateMasterKeyAndUserKeyAsync(MasterKey masterKey); + Task HashAsync(string value, CryptoHashAlgorithm hashAlgorithm); + Task ValidateUriChecksumAsync(EncString remoteUriChecksum, string rawUri, string orgId, SymmetricCryptoKey key); } } diff --git a/src/Core/App.xaml.cs b/src/Core/App.xaml.cs index 7deed659d..25b882d72 100644 --- a/src/Core/App.xaml.cs +++ b/src/Core/App.xaml.cs @@ -81,14 +81,31 @@ namespace Bit.App { get { - return Application.Current.Windows.OfType().FirstOrDefault(w => w.IsActive); + return Application.Current?.Windows.OfType().FirstOrDefault(w => w.IsActive); } } - //Allows setting Options from MainActivity before base.OnCreate - public void SetOptions(AppOptions appOptions) + /// + /// Allows setting Options from MainActivity before base.OnCreate + /// Note 1: This is only be used by Android due to way it's Lifecycle works + /// Note 2: This method does not replace existing Options in App.xaml.cs if it exists already. + /// It only updates properties in Options related with Autofill/CreateSend/etc.. + /// + /// Options created in Android MainActivity.cs + public void SetAndroidOptions(AppOptions appOptions) { - Options = appOptions ?? new AppOptions(); + if (Options == null) + { + Options = appOptions ?? new AppOptions(); + } + else if(appOptions != null) + { + Options.Uri = appOptions.Uri; + Options.MyVaultTile = appOptions.MyVaultTile; + Options.GeneratorTile = appOptions.GeneratorTile; + Options.FromAutofillFramework = appOptions.FromAutofillFramework; + Options.CreateSend = appOptions.CreateSend; + } } protected override Window CreateWindow(IActivationState activationState) @@ -145,11 +162,14 @@ namespace Bit.App { get { - return Application.Current.MainPage; + return Application.Current?.MainPage; } set { - Application.Current.MainPage = value; + if (Application.Current != null) + { + Application.Current.MainPage = value; + } } } #endif diff --git a/src/Core/Constants.cs b/src/Core/Constants.cs index 9b96deb4a..b628be1d0 100644 --- a/src/Core/Constants.cs +++ b/src/Core/Constants.cs @@ -70,10 +70,11 @@ namespace Bit.Core public const int Argon2Parallelism = 4; public const int MasterPasswordMinimumChars = 12; public const int CipherKeyRandomBytesLength = 64; - public const string CipherKeyEncryptionMinServerVersion = "2023.9.1"; + public const string CipherKeyEncryptionMinServerVersion = "2024.2.0"; public const string DefaultFido2CredentialType = "public-key"; public const string DefaultFido2CredentialAlgorithm = "ECDSA"; public const string DefaultFido2CredentialCurve = "P-256"; + public const int LatestStateVersion = 7; public static readonly string[] AndroidAllClearCipherCacheKeys = { diff --git a/src/Core/Controls/AccountSwitchingOverlay/AccountSwitchingOverlayView.xaml b/src/Core/Controls/AccountSwitchingOverlay/AccountSwitchingOverlayView.xaml index b95be2cb4..4c3e5f36f 100644 --- a/src/Core/Controls/AccountSwitchingOverlay/AccountSwitchingOverlayView.xaml +++ b/src/Core/Controls/AccountSwitchingOverlay/AccountSwitchingOverlayView.xaml @@ -12,12 +12,14 @@ BackgroundColor="#22000000" Padding="0" IsVisible="False"> - + HorizontalOptions="Fill" + BackgroundColor="Transparent" + RowDefinitions="Auto, *"> @@ -49,12 +51,13 @@ + VerticalOptions="Fill"> - + diff --git a/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml b/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml index a7a8a903a..99c56791c 100644 --- a/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml +++ b/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml @@ -1,5 +1,5 @@  - - + - - - + + + \ No newline at end of file + \ No newline at end of file diff --git a/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml.cs b/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml.cs index 297dc0e4b..2e3b4240a 100644 --- a/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml.cs +++ b/src/Core/Controls/AuthenticatorViewCell/AuthenticatorViewCell.xaml.cs @@ -1,10 +1,14 @@ namespace Bit.App.Controls { - public partial class AuthenticatorViewCell : ExtendedGrid + public partial class AuthenticatorViewCell : BaseCipherViewCell { public AuthenticatorViewCell() { InitializeComponent(); } + + protected override CachedImage Icon => _iconImage; + + protected override IconLabel IconPlaceholder => _iconPlaceholderImage; } } diff --git a/src/Core/Controls/Avatar/AvatarImageSource.cs b/src/Core/Controls/Avatar/AvatarImageSource.cs new file mode 100644 index 000000000..66682c7d0 --- /dev/null +++ b/src/Core/Controls/Avatar/AvatarImageSource.cs @@ -0,0 +1,62 @@ +using SkiaSharp; + +namespace Bit.App.Controls +{ + public class AvatarImageSource : StreamImageSource + { + private readonly string _text; + private readonly string _id; + private readonly string _color; + private readonly AvatarInfo _avatarInfo; + + public override bool Equals(object obj) + { + if (obj is null) + { + return false; + } + + if (obj is AvatarImageSource avatar) + { + return avatar._id == _id && avatar._text == _text && avatar._color == _color; + } + + return base.Equals(obj); + } + + public override int GetHashCode() => _id?.GetHashCode() ?? _text?.GetHashCode() ?? -1; + + public AvatarImageSource(string userId = null, string name = null, string email = null, string color = null) + { + _id = userId; + _text = name; + if (string.IsNullOrWhiteSpace(_text)) + { + _text = email; + } + _color = color; + + //Workaround: [MAUI-Migration] There is currently a bug in MAUI where the actual size of the image is used instead of the size it should occupy in the Toolbar. + //This causes some issues with the position of the icon. As a workaround we make the icon smaller until this is fixed. + //Github issues: https://github.com/dotnet/maui/issues/12359 and https://github.com/dotnet/maui/pull/17120 + _avatarInfo = new AvatarInfo(userId, name, email, color, DeviceInfo.Platform == DevicePlatform.iOS ? 20 : 50); + } + + public override Func> Stream => GetStreamAsync; + + private Task GetStreamAsync(CancellationToken userToken = new CancellationToken()) + { + var result = Draw(); + return Task.FromResult(result); + } + + private Stream Draw() + { + using (var img = SKAvatarImageHelper.Draw(_avatarInfo)) + { + var data = img.Encode(SKEncodedImageFormat.Png, 100); + return data?.AsStream(true); + } + } + } +} diff --git a/src/Core/Controls/AvatarImageSourcePool.cs b/src/Core/Controls/Avatar/AvatarImageSourcePool.cs similarity index 100% rename from src/Core/Controls/AvatarImageSourcePool.cs rename to src/Core/Controls/Avatar/AvatarImageSourcePool.cs diff --git a/src/Core/Controls/Avatar/AvatarInfo.cs b/src/Core/Controls/Avatar/AvatarInfo.cs new file mode 100644 index 000000000..0380e9d3d --- /dev/null +++ b/src/Core/Controls/Avatar/AvatarInfo.cs @@ -0,0 +1,63 @@ +using Bit.Core.Utilities; + +#nullable enable + +namespace Bit.App.Controls +{ + public struct AvatarInfo + { + private const string DEFAULT_BACKGROUND_COLOR = "#33ffffff"; + + public AvatarInfo(string? userId = null, string? name = null, string? email = null, string? color = null, int size = 50) + { + Size = size; + var text = string.IsNullOrWhiteSpace(name) ? email : name; + + string? upperCaseText = null; + + if (string.IsNullOrEmpty(text)) + { + CharsToDraw = ".."; + } + else if (text.Length > 1) + { + upperCaseText = text.ToUpper(); + CharsToDraw = GetFirstLetters(upperCaseText, 2); + } + else + { + CharsToDraw = upperCaseText = text.ToUpper(); + } + + BackgroundColor = color ?? CoreHelpers.StringToColor(userId ?? upperCaseText, DEFAULT_BACKGROUND_COLOR); + TextColor = CoreHelpers.TextColorFromBgColor(BackgroundColor); + } + + public string CharsToDraw { get; } + public string BackgroundColor { get; } + public string TextColor { get; } + public int Size { get; } + + private static string GetFirstLetters(string data, int charCount) + { + var sanitizedData = data.Trim(); + var parts = sanitizedData.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + + if (parts.Length > 1 && charCount <= 2) + { + var text = string.Empty; + for (var i = 0; i < charCount; i++) + { + text += parts[i][0]; + } + return text; + } + if (sanitizedData.Length > 2) + { + return sanitizedData.Substring(0, 2); + } + return sanitizedData; + } + } +} + diff --git a/src/Core/Controls/Avatar/SKAvatarImageHelper.cs b/src/Core/Controls/Avatar/SKAvatarImageHelper.cs new file mode 100644 index 000000000..3557e9a72 --- /dev/null +++ b/src/Core/Controls/Avatar/SKAvatarImageHelper.cs @@ -0,0 +1,63 @@ +using SkiaSharp; + +namespace Bit.App.Controls +{ + public static class SKAvatarImageHelper + { + public static SKImage Draw(AvatarInfo avatarInfo) + { + using (var bitmap = new SKBitmap(avatarInfo.Size * 2, + avatarInfo.Size * 2, + SKImageInfo.PlatformColorType, + SKAlphaType.Premul)) + { + using (var canvas = new SKCanvas(bitmap)) + { + canvas.Clear(SKColors.Transparent); + using (var paint = new SKPaint + { + IsAntialias = true, + Style = SKPaintStyle.Fill, + StrokeJoin = SKStrokeJoin.Miter, + Color = SKColor.Parse(avatarInfo.BackgroundColor) + }) + { + var midX = canvas.LocalClipBounds.Size.ToSizeI().Width / 2; + var midY = canvas.LocalClipBounds.Size.ToSizeI().Height / 2; + var radius = midX - midX / 5; + + using (var circlePaint = new SKPaint + { + IsAntialias = true, + Style = SKPaintStyle.Fill, + StrokeJoin = SKStrokeJoin.Miter, + Color = SKColor.Parse(avatarInfo.BackgroundColor) + }) + { + canvas.DrawCircle(midX, midY, radius, circlePaint); + + var typeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Normal); + var textSize = midX / 1.3f; + using (var textPaint = new SKPaint + { + IsAntialias = true, + Style = SKPaintStyle.Fill, + Color = SKColor.Parse(avatarInfo.TextColor), + TextSize = textSize, + TextAlign = SKTextAlign.Center, + Typeface = typeface + }) + { + var rect = new SKRect(); + textPaint.MeasureText(avatarInfo.CharsToDraw, ref rect); + canvas.DrawText(avatarInfo.CharsToDraw, midX, midY + rect.Height / 2, textPaint); + + return SKImage.FromBitmap(bitmap); + } + } + } + } + } + } + } +} diff --git a/src/Core/Controls/AvatarImageSource.cs b/src/Core/Controls/AvatarImageSource.cs deleted file mode 100644 index c20d61117..000000000 --- a/src/Core/Controls/AvatarImageSource.cs +++ /dev/null @@ -1,179 +0,0 @@ -using Bit.Core.Utilities; -using SkiaSharp; - -namespace Bit.App.Controls -{ - public class AvatarImageSource : StreamImageSource - { - private readonly string _text; - private readonly string _id; - private readonly string _color; - - public override bool Equals(object obj) - { - if (obj is null) - { - return false; - } - - if (obj is AvatarImageSource avatar) - { - return avatar._id == _id && avatar._text == _text && avatar._color == _color; - } - - return base.Equals(obj); - } - - public override int GetHashCode() => _id?.GetHashCode() ?? _text?.GetHashCode() ?? -1; - - public AvatarImageSource(string userId = null, string name = null, string email = null, string color = null) - { - _id = userId; - _text = name; - if (string.IsNullOrWhiteSpace(_text)) - { - _text = email; - } - _color = color; - } - - public override Func> Stream => GetStreamAsync; - - private Task GetStreamAsync(CancellationToken userToken = new CancellationToken()) - { - var result = Draw(); - return Task.FromResult(result); - } - - private Stream Draw() - { - string chars; - string upperCaseText = null; - - if (string.IsNullOrEmpty(_text)) - { - chars = ".."; - } - else if (_text?.Length > 1) - { - upperCaseText = _text.ToUpper(); - chars = GetFirstLetters(upperCaseText, 2); - } - else - { - chars = upperCaseText = _text.ToUpper(); - } - - var bgColor = _color ?? CoreHelpers.StringToColor(_id ?? upperCaseText, "#33ffffff"); - var textColor = CoreHelpers.TextColorFromBgColor(bgColor); - var size = 50; - - //Workaround: [MAUI-Migration] There is currently a bug in MAUI where the actual size of the image is used instead of the size it should occupy in the Toolbar. - //This causes some issues with the position of the icon. As a workaround we make the icon smaller until this is fixed. - //Github issues: https://github.com/dotnet/maui/issues/12359 and https://github.com/dotnet/maui/pull/17120 - if (DeviceInfo.Platform == DevicePlatform.iOS) - { - size = 20; - } - - using (var bitmap = new SKBitmap(size * 2, - size * 2, - SKImageInfo.PlatformColorType, - SKAlphaType.Premul)) - { - using (var canvas = new SKCanvas(bitmap)) - { - canvas.Clear(SKColors.Transparent); - using (var paint = new SKPaint - { - IsAntialias = true, - Style = SKPaintStyle.Fill, - StrokeJoin = SKStrokeJoin.Miter, - Color = SKColor.Parse(bgColor) - }) - { - var midX = canvas.LocalClipBounds.Size.ToSizeI().Width / 2; - var midY = canvas.LocalClipBounds.Size.ToSizeI().Height / 2; - var radius = midX - midX / 5; - - using (var circlePaint = new SKPaint - { - IsAntialias = true, - Style = SKPaintStyle.Fill, - StrokeJoin = SKStrokeJoin.Miter, - Color = SKColor.Parse(bgColor) - }) - { - canvas.DrawCircle(midX, midY, radius, circlePaint); - - var typeface = SKTypeface.FromFamilyName("Arial", SKFontStyle.Normal); - var textSize = midX / 1.3f; - using (var textPaint = new SKPaint - { - IsAntialias = true, - Style = SKPaintStyle.Fill, - Color = SKColor.Parse(textColor), - TextSize = textSize, - TextAlign = SKTextAlign.Center, - Typeface = typeface - }) - { - var rect = new SKRect(); - textPaint.MeasureText(chars, ref rect); - canvas.DrawText(chars, midX, midY + rect.Height / 2, textPaint); - - using (var img = SKImage.FromBitmap(bitmap)) - { - var data = img.Encode(SKEncodedImageFormat.Png, 100); - return data?.AsStream(true); - } - } - } - } - } - } - } - - private string GetFirstLetters(string data, int charCount) - { - var sanitizedData = data.Trim(); - var parts = sanitizedData.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - - if (parts.Length > 1 && charCount <= 2) - { - var text = string.Empty; - for (var i = 0; i < charCount; i++) - { - text += parts[i][0]; - } - return text; - } - if (sanitizedData.Length > 2) - { - return sanitizedData.Substring(0, 2); - } - return sanitizedData; - } - - private Color StringToColor(string str) - { - if (str == null) - { - return Color.FromArgb("#33ffffff"); - } - var hash = 0; - for (var i = 0; i < str.Length; i++) - { - hash = str[i] + ((hash << 5) - hash); - } - var color = "#FF"; - for (var i = 0; i < 3; i++) - { - var value = (hash >> (i * 8)) & 0xff; - var base16 = "00" + Convert.ToString(value, 16); - color += base16.Substring(base16.Length - 2); - } - return Color.FromArgb(color); - } - } -} diff --git a/src/Core/Controls/CipherViewCell/BaseCipherViewCell.cs b/src/Core/Controls/CipherViewCell/BaseCipherViewCell.cs new file mode 100644 index 000000000..15bd0dd7f --- /dev/null +++ b/src/Core/Controls/CipherViewCell/BaseCipherViewCell.cs @@ -0,0 +1,103 @@ +using Bit.App.Pages; + +namespace Bit.App.Controls +{ + public abstract class BaseCipherViewCell : ExtendedGrid + { + protected virtual CachedImage Icon { get; } + + protected virtual IconLabel IconPlaceholder { get; } + + // HACK: PM-5896 Fix for Background Crash on iOS + // While loading the cipher icon and the user sent the app to background + // the app was crashing sometimes when the "LoadingPlaceholder" or "ErrorPlaceholder" + // were being accessed, thus locked, and as soon the app got suspended by the OS + // the app would crash because there can't be any lock files by the app when it gets suspended. + // So, the approach has changed to reuse the IconLabel default icon to use it for these placeholders + // as well. In order to do that both icon controls change their visibility dynamically here reacting to + // CachedImage events and binding context changes. + + protected override void OnBindingContextChanged() + { + Icon.Source = null; + if (BindingContext is CipherItemViewModel cipherItemVM) + { + Icon.Source = cipherItemVM.IconImageSource; + if (!cipherItemVM.IconImageSuccesfullyLoaded) + { + UpdateIconImages(cipherItemVM.ShowIconImage); + } + } + + base.OnBindingContextChanged(); + } + + private void UpdateIconImages(bool showIcon) + { + MainThread.BeginInvokeOnMainThread(() => + { + if (!showIcon) + { + Icon.IsVisible = false; + IconPlaceholder.IsVisible = true; + return; + } + + IconPlaceholder.IsVisible = Icon.IsLoading; + }); + } + + public void Icon_Success(object sender, FFImageLoading.Maui.CachedImageEvents.SuccessEventArgs e) + { + if (BindingContext is CipherItemViewModel cipherItemVM) + { + cipherItemVM.IconImageSuccesfullyLoaded = true; + } + MainThread.BeginInvokeOnMainThread(() => + { + Icon.IsVisible = true; + IconPlaceholder.IsVisible = false; + }); + } + + public void Icon_Error(object sender, FFImageLoading.Maui.CachedImageEvents.ErrorEventArgs e) + { + if (BindingContext is CipherItemViewModel cipherItemVM) + { + cipherItemVM.IconImageSuccesfullyLoaded = false; + } + MainThread.BeginInvokeOnMainThread(() => + { + Icon.IsVisible = false; + IconPlaceholder.IsVisible = true; + }); + } + } + + public class StubBaseCipherViewCellSoLinkerDoesntRemoveMethods : BaseCipherViewCell + { + protected override CachedImage Icon => new CachedImage(); + protected override IconLabel IconPlaceholder => new IconLabel(); + + public static void CallThisSoLinkerDoesntRemoveMethods() + { + var stub = new StubBaseCipherViewCellSoLinkerDoesntRemoveMethods(); + + try + { + stub.Icon_Success(stub, new FFImageLoading.Maui.CachedImageEvents.SuccessEventArgs(new FFImageLoading.Work.ImageInformation(), FFImageLoading.Work.LoadingResult.Disk)); + } + catch (Exception) + { + } + + try + { + stub.Icon_Error(stub, new FFImageLoading.Maui.CachedImageEvents.ErrorEventArgs(new InvalidOperationException("stub"))); + } + catch (Exception) + { + } + } + } +} diff --git a/src/Core/Controls/CipherViewCell/CipherViewCell.xaml b/src/Core/Controls/CipherViewCell/CipherViewCell.xaml index d0d846d48..bbfdd41ee 100644 --- a/src/Core/Controls/CipherViewCell/CipherViewCell.xaml +++ b/src/Core/Controls/CipherViewCell/CipherViewCell.xaml @@ -1,5 +1,5 @@  - - - + + @@ -121,4 +119,4 @@ SemanticProperties.Description="{u:I18n Options}" AutomationId="CipherOptionsButton" /> - \ No newline at end of file + \ No newline at end of file diff --git a/src/Core/Controls/CipherViewCell/CipherViewCell.xaml.cs b/src/Core/Controls/CipherViewCell/CipherViewCell.xaml.cs index bea341a46..fd163bce3 100644 --- a/src/Core/Controls/CipherViewCell/CipherViewCell.xaml.cs +++ b/src/Core/Controls/CipherViewCell/CipherViewCell.xaml.cs @@ -5,7 +5,7 @@ using Bit.Core.Utilities; namespace Bit.App.Controls { - public partial class CipherViewCell : ExtendedGrid + public partial class CipherViewCell : BaseCipherViewCell { private const int ICON_COLUMN_DEFAULT_WIDTH = 40; private const int ICON_IMAGE_DEFAULT_WIDTH = 22; @@ -23,6 +23,10 @@ namespace Bit.App.Controls _iconImage.HeightRequest = ICON_IMAGE_DEFAULT_WIDTH * fontScale; } + protected override CachedImage Icon => _iconImage; + + protected override IconLabel IconPlaceholder => _iconPlaceholderImage; + public ICommand ButtonCommand { get => GetValue(ButtonCommandProperty) as ICommand; diff --git a/src/Core/Controls/ExternalLinkItemView.xaml b/src/Core/Controls/ExternalLinkItemView.xaml index 8a4252eea..9390d2ebb 100644 --- a/src/Core/Controls/ExternalLinkItemView.xaml +++ b/src/Core/Controls/ExternalLinkItemView.xaml @@ -1,4 +1,4 @@ - + + @@ -109,5 +110,6 @@ + \ No newline at end of file diff --git a/src/Core/ExternalLinksConstants.cs b/src/Core/ExternalLinksConstants.cs index 6db6292a2..ff0b09176 100644 --- a/src/Core/ExternalLinksConstants.cs +++ b/src/Core/ExternalLinksConstants.cs @@ -6,7 +6,7 @@ public const string HELP_ABOUT_ORGANIZATIONS = "https://bitwarden.com/help/about-organizations/"; public const string HELP_FINGERPRINT_PHRASE = "https://bitwarden.com/help/fingerprint-phrase/"; - public const string CONTACT_SUPPORT = "https://bitwarden.com/contact/"; + public const string PRIVACY_POLICY = "https://bitwarden.com/privacy/"; /// /// Link to go to settings website. Requires to pass website URL as parameter. diff --git a/src/Core/MauiProgram.cs b/src/Core/MauiProgram.cs index 275e31470..43fdfd843 100644 --- a/src/Core/MauiProgram.cs +++ b/src/Core/MauiProgram.cs @@ -1,4 +1,5 @@ -using Camera.MAUI; +using Bit.App.Controls; +using Camera.MAUI; using CommunityToolkit.Maui; #if !UT using FFImageLoading.Maui; @@ -62,6 +63,13 @@ public static class MauiProgram builder.Logging.AddDebug(); #endif + ExplicitlyPreventThingsGetRemovedBecauseOfLinker(); + return builder; } + + private static void ExplicitlyPreventThingsGetRemovedBecauseOfLinker() + { + StubBaseCipherViewCellSoLinkerDoesntRemoveMethods.CallThisSoLinkerDoesntRemoveMethods(); + } } diff --git a/src/Core/Models/Api/LoginUriApi.cs b/src/Core/Models/Api/LoginUriApi.cs index d9e59c65d..a1253f36d 100644 --- a/src/Core/Models/Api/LoginUriApi.cs +++ b/src/Core/Models/Api/LoginUriApi.cs @@ -6,5 +6,6 @@ namespace Bit.Core.Models.Api { public string Uri { get; set; } public UriMatchType? Match { get; set; } + public string UriChecksum { get; set; } } } diff --git a/src/Core/Models/Data/LoginUriData.cs b/src/Core/Models/Data/LoginUriData.cs index 52294c523..a27344f43 100644 --- a/src/Core/Models/Data/LoginUriData.cs +++ b/src/Core/Models/Data/LoginUriData.cs @@ -11,9 +11,11 @@ namespace Bit.Core.Models.Data { Uri = data.Uri; Match = data.Match; + UriChecksum = data.UriChecksum; } public string Uri { get; set; } public UriMatchType? Match { get; set; } + public string UriChecksum { get; set; } } } diff --git a/src/Core/Models/Domain/Cipher.cs b/src/Core/Models/Domain/Cipher.cs index 48aa3a761..a7a2d6943 100644 --- a/src/Core/Models/Domain/Cipher.cs +++ b/src/Core/Models/Domain/Cipher.cs @@ -115,7 +115,7 @@ namespace Bit.Core.Models.Domain switch (Type) { case Enums.CipherType.Login: - model.Login = await Login.DecryptAsync(OrganizationId, model.Key); + model.Login = await Login.DecryptAsync(OrganizationId, Key == null, model.Key); break; case Enums.CipherType.SecureNote: model.SecureNote = await SecureNote.DecryptAsync(OrganizationId, model.Key); diff --git a/src/Core/Models/Domain/Login.cs b/src/Core/Models/Domain/Login.cs index ed1822c13..26aecf840 100644 --- a/src/Core/Models/Domain/Login.cs +++ b/src/Core/Models/Domain/Login.cs @@ -2,8 +2,10 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Bit.Core.Abstractions; using Bit.Core.Models.Data; using Bit.Core.Models.View; +using Bit.Core.Utilities; namespace Bit.Core.Models.Domain { @@ -31,7 +33,7 @@ namespace Bit.Core.Models.Domain public EncString Totp { get; set; } public List Fido2Credentials { get; set; } - public async Task DecryptAsync(string orgId, SymmetricCryptoKey key = null) + public async Task DecryptAsync(string orgId, bool bypassUriChecksumValidation, SymmetricCryptoKey key = null) { var view = await DecryptObjAsync(new LoginView(this), this, new HashSet { @@ -41,10 +43,15 @@ namespace Bit.Core.Models.Domain }, orgId, key); if (Uris != null) { + var cryptoService = ServiceContainer.Resolve(); view.Uris = new List(); foreach (var uri in Uris) { - view.Uris.Add(await uri.DecryptAsync(orgId, key)); + var loginUriView = await uri.DecryptAsync(orgId, key); + if (bypassUriChecksumValidation || await cryptoService.ValidateUriChecksumAsync(uri.UriChecksum, loginUriView.Uri, orgId, key)) + { + view.Uris.Add(loginUriView); + } } } if (Fido2Credentials != null) diff --git a/src/Core/Models/Domain/LoginUri.cs b/src/Core/Models/Domain/LoginUri.cs index e9b26d6d1..896570d73 100644 --- a/src/Core/Models/Domain/LoginUri.cs +++ b/src/Core/Models/Domain/LoginUri.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Bit.Core.Enums; using Bit.Core.Models.Data; @@ -10,7 +11,8 @@ namespace Bit.Core.Models.Domain { private HashSet _map = new HashSet { - "Uri" + nameof(Uri), + nameof(UriChecksum) }; public LoginUri() { } @@ -23,10 +25,11 @@ namespace Bit.Core.Models.Domain public EncString Uri { get; set; } public UriMatchType? Match { get; set; } + public EncString UriChecksum { get; set; } public Task DecryptAsync(string orgId, SymmetricCryptoKey key = null) { - return DecryptObjAsync(new LoginUriView(this), this, _map, orgId, key); + return DecryptObjAsync(new LoginUriView(this), this, _map.Where(m => m != nameof(UriChecksum)).ToHashSet(), orgId, key); } public LoginUriData ToLoginUriData() diff --git a/src/Core/Models/Export/LoginUri.cs b/src/Core/Models/Export/LoginUri.cs index e3f215ff7..a4e161fed 100644 --- a/src/Core/Models/Export/LoginUri.cs +++ b/src/Core/Models/Export/LoginUri.cs @@ -17,10 +17,12 @@ namespace Bit.Core.Models.Export { Match = obj.Match; Uri = obj.Uri?.EncryptedString; + UriChecksum = obj.UriChecksum?.EncryptedString; } public UriMatchType? Match { get; set; } public string Uri { get; set; } + public string UriChecksum { get; set; } public static LoginUriView ToView(LoginUri req, LoginUriView view = null) { diff --git a/src/Core/Models/Request/CipherRequest.cs b/src/Core/Models/Request/CipherRequest.cs index f0b44d402..ae48b83b5 100644 --- a/src/Core/Models/Request/CipherRequest.cs +++ b/src/Core/Models/Request/CipherRequest.cs @@ -27,7 +27,7 @@ namespace Bit.Core.Models.Request Login = new LoginApi { Uris = cipher.Login.Uris?.Select( - u => new LoginUriApi { Match = u.Match, Uri = u.Uri?.EncryptedString }).ToList(), + u => new LoginUriApi { Match = u.Match, Uri = u.Uri?.EncryptedString, UriChecksum = u.UriChecksum?.EncryptedString }).ToList(), Username = cipher.Login.Username?.EncryptedString, Password = cipher.Login.Password?.EncryptedString, PasswordRevisionDate = cipher.Login.PasswordRevisionDate, diff --git a/src/Core/Pages/Accounts/EnvironmentPage.xaml b/src/Core/Pages/Accounts/EnvironmentPage.xaml index 28bfcaece..855c345a8 100644 --- a/src/Core/Pages/Accounts/EnvironmentPage.xaml +++ b/src/Core/Pages/Accounts/EnvironmentPage.xaml @@ -37,7 +37,7 @@ Text="{Binding BaseUrl}" Keyboard="Url" Placeholder="ex. https://bitwarden.company.com" - StyleClass="box-value" + StyleClass="box-value, no-keyboard-auto-help" ReturnType="Go" ReturnCommand="{Binding SubmitCommand}" AutomationId="ServerUrlEntry"/> @@ -59,7 +59,7 @@ x:Name="_webVaultEntry" Text="{Binding WebVaultUrl}" Keyboard="Url" - StyleClass="box-value" + StyleClass="box-value, no-keyboard-auto-help" AutomationId="WebVaultUrlEntry"/> @@ -70,7 +70,7 @@ x:Name="_apiEntry" Text="{Binding ApiUrl}" Keyboard="Url" - StyleClass="box-value" + StyleClass="box-value, no-keyboard-auto-help" AutomationId="ApiUrlEntry"/> @@ -81,7 +81,7 @@ x:Name="_identityEntry" Text="{Binding IdentityUrl}" Keyboard="Url" - StyleClass="box-value" + StyleClass="box-value, no-keyboard-auto-help" AutomationId="IdentityUrlEntry"/> @@ -92,7 +92,7 @@ x:Name="_iconsEntry" Text="{Binding IconsUrl}" Keyboard="Url" - StyleClass="box-value" + StyleClass="box-value, no-keyboard-auto-help" ReturnType="Go" ReturnCommand="{Binding SubmitCommand}" AutomationId="IconsUrlEntry"/> diff --git a/src/Core/Pages/Accounts/HomePage.xaml b/src/Core/Pages/Accounts/HomePage.xaml index fe6992155..950f7d75c 100644 --- a/src/Core/Pages/Accounts/HomePage.xaml +++ b/src/Core/Pages/Accounts/HomePage.xaml @@ -50,11 +50,10 @@ x:Name="_email" Text="{Binding Email}" Keyboard="Email" - StyleClass="box-value" + StyleClass="box-value, no-keyboard-auto-help" ReturnType="Go" ReturnCommand="{Binding ContinueCommand}" - AutomationId="EmailAddressEntry" - > + AutomationId="EmailAddressEntry"> diff --git a/src/Core/Pages/Accounts/HomePage.xaml.cs b/src/Core/Pages/Accounts/HomePage.xaml.cs index 11c5b36ba..9a418ac4d 100644 --- a/src/Core/Pages/Accounts/HomePage.xaml.cs +++ b/src/Core/Pages/Accounts/HomePage.xaml.cs @@ -153,7 +153,7 @@ namespace Bit.App.Pages private async Task StartEnvironmentAsync() { - await _accountListOverlay.HideAsync(); + await _accountListOverlay.HideAsync(); var page = new EnvironmentPage(); await Navigation.PushModalAsync(new NavigationPage(page)); } diff --git a/src/Core/Pages/Accounts/LockPage.xaml.cs b/src/Core/Pages/Accounts/LockPage.xaml.cs index 6861f7bc2..bd3be1858 100644 --- a/src/Core/Pages/Accounts/LockPage.xaml.cs +++ b/src/Core/Pages/Accounts/LockPage.xaml.cs @@ -81,7 +81,7 @@ namespace Bit.App.Pages { if (message.Command == Constants.ClearSensitiveFields) { - MainThread.BeginInvokeOnMainThread(_vm.ResetPinPasswordFields); + MainThread.BeginInvokeOnMainThread(() => _vm?.ResetPinPasswordFields()); } }); if (_appeared) diff --git a/src/Core/Pages/Accounts/LockPageViewModel.cs b/src/Core/Pages/Accounts/LockPageViewModel.cs index 2464524cf..b3bd61015 100644 --- a/src/Core/Pages/Accounts/LockPageViewModel.cs +++ b/src/Core/Pages/Accounts/LockPageViewModel.cs @@ -245,9 +245,9 @@ namespace Bit.App.Pages public async Task SubmitAsync() { - ShowPassword = false; try { + ShowPassword = false; var kdfConfig = await _stateService.GetActiveUserCustomDataAsync(a => new KdfConfig(a?.Profile)); if (PinEnabled) { @@ -257,12 +257,15 @@ namespace Bit.App.Pages { await UnlockWithMasterPasswordAsync(kdfConfig); } - } catch (LegacyUserException) { await HandleLegacyUserAsync(); } + catch (Exception ex) + { + HandleException(ex); + } } private async Task UnlockWithPinAsync(KdfConfig kdfConfig) diff --git a/src/Core/Pages/Accounts/LoginPage.xaml.cs b/src/Core/Pages/Accounts/LoginPage.xaml.cs index 84f62879f..7139e57b1 100644 --- a/src/Core/Pages/Accounts/LoginPage.xaml.cs +++ b/src/Core/Pages/Accounts/LoginPage.xaml.cs @@ -3,6 +3,7 @@ using Bit.App.Utilities; using Bit.Core; using Bit.Core.Abstractions; using Bit.Core.Enums; +using Bit.Core.Services; using Bit.Core.Utilities; namespace Bit.App.Pages @@ -74,7 +75,7 @@ namespace Bit.App.Pages { if (message.Command == Constants.ClearSensitiveFields) { - MainThread.BeginInvokeOnMainThread(_vm.ResetPasswordField); + MainThread.BeginInvokeOnMainThread(() => _vm?.ResetPasswordField()); } }); _mainContent.Content = _mainLayout; @@ -188,12 +189,20 @@ namespace Bit.App.Pages private async Task LogInSuccessAsync() { - if (AppHelpers.SetAlternateMainPage(_appOptions)) + try { - return; + if (AppHelpers.SetAlternateMainPage(_appOptions)) + { + return; + } + var previousPage = await AppHelpers.ClearPreviousPage(); + App.MainPage = new TabsPage(_appOptions, previousPage); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } - var previousPage = await AppHelpers.ClearPreviousPage(); - App.MainPage = new TabsPage(_appOptions, previousPage); } private async Task UpdateTempPasswordAsync() diff --git a/src/Core/Pages/Accounts/LoginPasswordlessRequestPage.xaml.cs b/src/Core/Pages/Accounts/LoginPasswordlessRequestPage.xaml.cs index ad5e3aba3..a88f27a03 100644 --- a/src/Core/Pages/Accounts/LoginPasswordlessRequestPage.xaml.cs +++ b/src/Core/Pages/Accounts/LoginPasswordlessRequestPage.xaml.cs @@ -1,6 +1,7 @@ using Bit.App.Models; using Bit.App.Utilities; using Bit.Core.Enums; +using Bit.Core.Services; namespace Bit.App.Pages { @@ -48,12 +49,20 @@ namespace Bit.App.Pages private async Task LogInSuccessAsync() { - if (AppHelpers.SetAlternateMainPage(_appOptions)) + try { - return; + if (AppHelpers.SetAlternateMainPage(_appOptions)) + { + return; + } + var previousPage = await AppHelpers.ClearPreviousPage(); + App.MainPage = new TabsPage(_appOptions, previousPage); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } - var previousPage = await AppHelpers.ClearPreviousPage(); - App.MainPage = new TabsPage(_appOptions, previousPage); } private async Task UpdateTempPasswordAsync() diff --git a/src/Core/Pages/Accounts/LoginPasswordlessViewModel.cs b/src/Core/Pages/Accounts/LoginPasswordlessViewModel.cs index a5809659c..95033c7e1 100644 --- a/src/Core/Pages/Accounts/LoginPasswordlessViewModel.cs +++ b/src/Core/Pages/Accounts/LoginPasswordlessViewModel.cs @@ -77,6 +77,7 @@ namespace Bit.App.Pages { _requestTimeCts?.Cancel(); _requestTimeCts?.Dispose(); + _requestTimeCts = null; } catch (Exception ex) { diff --git a/src/Core/Pages/Accounts/LoginSsoPage.xaml.cs b/src/Core/Pages/Accounts/LoginSsoPage.xaml.cs index 3760f961e..1c1402a8b 100644 --- a/src/Core/Pages/Accounts/LoginSsoPage.xaml.cs +++ b/src/Core/Pages/Accounts/LoginSsoPage.xaml.cs @@ -1,6 +1,7 @@ using Bit.App.Models; using Bit.App.Utilities; using Bit.Core.Abstractions; +using Bit.Core.Services; using Bit.Core.Utilities; namespace Bit.App.Pages @@ -89,16 +90,30 @@ namespace Bit.App.Pages private async Task StartTwoFactorAsync() { - RestoreAppOptionsFromCopy(); - var page = new TwoFactorPage(true, _appOptions, _vm.OrgIdentifier); - await Navigation.PushModalAsync(new NavigationPage(page)); + try + { + RestoreAppOptionsFromCopy(); + var page = new TwoFactorPage(true, _appOptions, _vm.OrgIdentifier); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } private async Task StartSetPasswordAsync() { - RestoreAppOptionsFromCopy(); - var page = new SetPasswordPage(_appOptions, _vm.OrgIdentifier); - await Navigation.PushModalAsync(new NavigationPage(page)); + try + { + RestoreAppOptionsFromCopy(); + var page = new SetPasswordPage(_appOptions, _vm.OrgIdentifier); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } } private async Task UpdateTempPasswordAsync() @@ -115,16 +130,23 @@ namespace Bit.App.Pages private async Task SsoAuthSuccessAsync() { - RestoreAppOptionsFromCopy(); - await AppHelpers.ClearPreviousPage(); + try + { + RestoreAppOptionsFromCopy(); + await AppHelpers.ClearPreviousPage(); - if (await _vaultTimeoutService.IsLockedAsync()) - { - App.MainPage = new NavigationPage(new LockPage(_appOptions)); + if (await _vaultTimeoutService.IsLockedAsync()) + { + App.MainPage = new NavigationPage(new LockPage(_appOptions)); + } + else + { + App.MainPage = new TabsPage(_appOptions, null); + } } - else + catch (Exception ex) { - App.MainPage = new TabsPage(_appOptions, null); + LoggerHelper.LogEvenIfCantBeResolved(ex); } } } diff --git a/src/Core/Pages/Accounts/SetPasswordPage.xaml.cs b/src/Core/Pages/Accounts/SetPasswordPage.xaml.cs index 5504b9d43..19013dba4 100644 --- a/src/Core/Pages/Accounts/SetPasswordPage.xaml.cs +++ b/src/Core/Pages/Accounts/SetPasswordPage.xaml.cs @@ -1,5 +1,6 @@ using Bit.App.Models; using Bit.App.Utilities; +using Bit.Core.Services; namespace Bit.App.Pages { @@ -64,12 +65,19 @@ namespace Bit.App.Pages private async Task SetPasswordSuccessAsync() { - if (AppHelpers.SetAlternateMainPage(_appOptions)) + try { - return; + if (AppHelpers.SetAlternateMainPage(_appOptions)) + { + return; + } + var previousPage = await AppHelpers.ClearPreviousPage(); + App.MainPage = new TabsPage(_appOptions, previousPage); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); } - var previousPage = await AppHelpers.ClearPreviousPage(); - App.MainPage = new TabsPage(_appOptions, previousPage); } } } diff --git a/src/Core/Pages/Accounts/TwoFactorPage.xaml b/src/Core/Pages/Accounts/TwoFactorPage.xaml index 7f953d901..ad0904ce8 100644 --- a/src/Core/Pages/Accounts/TwoFactorPage.xaml +++ b/src/Core/Pages/Accounts/TwoFactorPage.xaml @@ -133,12 +133,12 @@ + VerticalOptions="StartAndExpand"> + HeightRequest="{Binding DuoWebViewHeight, Mode=OneWay}" /> + public bool IconImageSuccesfullyLoaded { get; set; } } } diff --git a/src/Core/Pages/Vault/ScanPage.xaml b/src/Core/Pages/Vault/ScanPage.xaml index 99c71665f..d7cc34de9 100644 --- a/src/Core/Pages/Vault/ScanPage.xaml +++ b/src/Core/Pages/Vault/ScanPage.xaml @@ -47,6 +47,9 @@ Camera="{Binding Camera}" AutoStartPreview="{Binding AutoStartPreview}" NumCamerasDetected="{Binding NumCameras, Mode=OneWayToSource}" + WidthRequest="{OnPlatform Android=150}" + HeightRequest="{OnPlatform Android=150}" + Scale="{OnPlatform Android=4}" Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" /> diff --git a/src/Core/Resources/Localization/AppResources.Designer.cs b/src/Core/Resources/Localization/AppResources.Designer.cs index de776fbc0..755dff48e 100644 --- a/src/Core/Resources/Localization/AppResources.Designer.cs +++ b/src/Core/Resources/Localization/AppResources.Designer.cs @@ -1723,6 +1723,15 @@ namespace Bit.Core.Resources.Localization { } } + /// + /// Looks up a localized string similar to Continue to privacy policy?. + /// + public static string ContinueToPrivacyPolicy { + get { + return ResourceManager.GetString("ContinueToPrivacyPolicy", resourceCulture); + } + } + /// /// Looks up a localized string similar to Continue to web app?. /// @@ -5525,6 +5534,15 @@ namespace Bit.Core.Resources.Localization { } } + /// + /// Looks up a localized string similar to Check out our privacy policy on bitwarden.com.. + /// + public static string PrivacyPolicyDescriptionLong { + get { + return ResourceManager.GetString("PrivacyPolicyDescriptionLong", resourceCulture); + } + } + /// /// Looks up a localized string similar to Bitwarden keeps your vault automatically synced by using push notifications. For the best possible experience, please select "Allow" on the following prompt when asked to allow push notifications.. /// diff --git a/src/Core/Resources/Localization/AppResources.af.resx b/src/Core/Resources/Localization/AppResources.af.resx index ea50db841..b7c2ca369 100644 --- a/src/Core/Resources/Localization/AppResources.af.resx +++ b/src/Core/Resources/Localization/AppResources.af.resx @@ -2820,6 +2820,9 @@ Wil u na die rekening omskakel? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Wil u na die rekening omskakel? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.ar.resx b/src/Core/Resources/Localization/AppResources.ar.resx index 9cb76348d..70a815724 100644 --- a/src/Core/Resources/Localization/AppResources.ar.resx +++ b/src/Core/Resources/Localization/AppResources.ar.resx @@ -2821,6 +2821,9 @@ مواصلة الاتصال بالدعم؟ + + Continue to privacy policy? + هل تريد المتابعة إلى متجر التطبيقات؟ @@ -2840,6 +2843,9 @@ لا يمكن العثور على ما تبحث عنه؟ قم بالتواصل مع دعم Bitwarden على bitwarden.com. + + Check out our privacy policy on bitwarden.com. + استكشف المزيد من الميزات لحساب Bitwarden الخاص بك على تطبيق الويب. diff --git a/src/Core/Resources/Localization/AppResources.az.resx b/src/Core/Resources/Localization/AppResources.az.resx index a30511650..d94320aac 100644 --- a/src/Core/Resources/Localization/AppResources.az.resx +++ b/src/Core/Resources/Localization/AppResources.az.resx @@ -156,7 +156,7 @@ The button text that allows a user to copy the login's password to their clipboard. - İstifadəçi adını kopyalayın + İstifadəçi adını kopyala The button text that allows a user to copy the login's username to their clipboard. @@ -176,7 +176,7 @@ Confirmation alert message when deleteing something. - Redaktə edin + Düzəliş et Qovluğa düzəliş et @@ -349,7 +349,7 @@ Göndər - Eyniləşdirmə + Sinxr The title for the sync page. @@ -416,7 +416,7 @@ Tətbiq uzantısı - Tətbiq və veb saytda giriş məlumatlarının avto-doldurulması üçün Bitwarden əlçatımlılıq xidmətini istifadə edin. + Tətbiqlərdə və vebdə giriş məlumatlarının avto-doldurulması üçün Bitwarden əlçatımlılıq xidmətini istifadə edin. Avto-doldurma xidməti @@ -465,7 +465,7 @@ Elementə düzəliş et - Avto-eyniləşdirməni fəallaşdır + Avto-sinxr icazə ver Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin. @@ -523,7 +523,7 @@ Digər parol idarəetmə tətbiqlərindəki elementləri cəld və toplu formada daxilə köçürün. - Son eyniləşdirmə: + Son sinxr: Uzunluq @@ -641,7 +641,7 @@ Hazırkı parolun üzərinə yazmaq istədiyinizə əminsiniz? - Bitwarden, ani bildirişləri istifadə edərək anbarınızı avtomatik eyniləşdirir. Mümkün olan ən yaxşı təcrübəni təqdim etmək üçün, sizdən ani bildirişləri fəallaşdırmağı soruşanda növbəti ekranda "İcazə ver"i seçin. + Bitwarden, ani bildirişləri istifadə edərək anbarınızın avtomatik sinxronlaşdırılmasını təmin edir. Mümkün olan ən yaxşı təcrübəni təqdim etmək üçün, sizdən ani bildirişləri fəallaşdırmağı soruşduqda növbəti ekranda "İcazə ver"i seçin. Push notifications for apple products @@ -682,17 +682,17 @@ Message shown when interacting with the server - Eyniləşdirilir... + Sinxronlaşdırılır... Message shown when interacting with the server - Eyniləşdirmə tamamlandı. + Sinxr tamamlandı - Uğursuz eyniləşdirmə. + Sinxr uğursuz oldu - Anbarı indi eyniləşdir + Anbarı indi sinxronlaşdır Touch ID @@ -745,7 +745,7 @@ This is used for the autofill service. ex. "There are no items in your vault for twitter.com". - Bir giriş sahəsi seçəndə və Bitwarden avto-doldurma örtüyünü görəndə, avto-doldurma xidmətini başlatmaq üçün ona toxuna bilərsiniz. + Bir giriş xanası seçdikdə və Bitwarden avto-doldurma örtüyünü gördükdə, avto-doldurma xidmətini başlatmaq üçün buna toxuna bilərsiniz. Anbarınızdakı bir elementi avto-doldurmaq üçün bu bildirişə toxunun. @@ -1167,10 +1167,10 @@ Skan prosesi avtomatik baş tutacaq. Avto-doldurma əlçatımlılıq xidməti - Bitwarden avto-doldurma xidməti, giriş məlumatlarının, kredit kartlarının və kimlik məlumatlarının cihazınızdakı digər tətbiqlərdə doldurmasına kömək etməsi üçün Android avto-doldurma sistemini istifadə edir. + Bitwarden avto-doldurma xidməti, giriş məlumatlarının cihazınızdakı digər tətbiqlərdə doldurmasına kömək etməsi üçün Android Avto-doldurma Çərçivəsini istifadə edir. - Digər tətbiqlərdəki giriş məlumatlarının, kredit kartlarının və kimlik məlumatlarının doldurulması üçün Bitwarden avto-doldurma xidmətini istifadə edin. + Giriş məlumatlarını digər tətbiqlərdə doldurmaq üçün Bitwarden avto-doldurma xidmətini istifadə edin. Avto-doldurma ayarlarını aç @@ -1289,7 +1289,7 @@ Skan prosesi avtomatik baş tutacaq. Avto-doldurmanı istifadə edə bilmək üçün Bitwarden tətbiqində giriş etməlisiniz. - Tətbiqlərdə və veb saytlarda giriş edərkən giriş etmə məlumatlarınıza klaviaturadan asanlıqla müraciət edə bilərsiniz. + Tətbiqlərdə və veb saytlarda giriş edərkən giriş məlumatlarınıza klaviaturadan asanlıqla müraciət edə bilərsiniz. İstifadə etməyi düşünmürsünüzsə, digər Avto-doldurma tətbiqlərini Ayarlarda sıradan çıxartmağı tövsiyə edirik. @@ -1369,10 +1369,10 @@ Skan prosesi avtomatik baş tutacaq. Növlər - Siyahılanacaq parol yoxdur. + Sadalanacaq parol yoxdur. - Siyahılanacaq heç bir element yoxdur. + Sadalanacaq heç bir element yoxdur. Kolleksiya axtar @@ -1406,7 +1406,7 @@ Skan prosesi avtomatik baş tutacaq. Bu elementin sahibi kimdir? - Siyahılanacaq heç bir kolleksiya yoxdur. + Sadalanacaq heç bir kolleksiya yoxdur. {0}, {1} ünvanına daşındı. @@ -1428,7 +1428,7 @@ Skan prosesi avtomatik baş tutacaq. Təşkilata daşı - Siyahılanacaq heç bir təşkilat yoxdur. + Sadalanacaq heç bir təşkilat yoxdur. Bu elementi daşımaq istədiyiniz təşkilatı seçin. Bir təşkilata daşımaq, elementin sahibliyini də həmin təşkilata daşıyacaq. Daşıdıqdan sonra bu elementə birbaşa sahibliyiniz olmayacaq. @@ -1451,7 +1451,7 @@ Skan prosesi avtomatik baş tutacaq. Short for "Password Generator" - Siyahılanacaq heç bir qovluq yoxdur. + Sadalanacaq heç bir qovluq yoxdur. Barmaq izi ifadəsi @@ -1747,10 +1747,10 @@ Skan prosesi avtomatik baş tutacaq. Ana parolun doğrulanması gözlənildiyi üçün bu hesab üzrə avto-doldurma biometrik kilid açma sıradan çıxarıldı. - Təzələmə əsnasında eyniləşdirməni fəallaşdır + Təzələmə zamanı sinxr icazə ver - Barmağınızla aşağı çəkəndə anbarı eyniləşdir + Barmağınızla aşağı çəkdikdə anbarı sinxronlaşdır. Müəssisə üçün tək daxil olma @@ -1828,10 +1828,10 @@ Skan prosesi avtomatik baş tutacaq. Əlçatımlılığı istifadə et - Saytda və tətbiqlərdə giriş məlumatlarınızın avto-doldurulması üçün Bitwarden əlçatımlılıq xidmətini istifadə edə bilərsiniz. Fəal olanda, giriş məlumatlarını daxil edərkən açılan pəncərə görünəcək. + Saytda və vebdə giriş məlumatlarınızı avto-doldurmaq üçün Bitwarden Əlçatımlılıq Xidmətini istifadə edin. Qurulanda, giriş xanalarını seçərkən açılan pəncərə göstərəcəyik. - Saytda və tətbiqlərdə giriş məlumatlarınızın avto-doldurulması üçün Bitwarden əlçatımlılıq xidmətini istifadə edə bilərsiniz. ("Üzərində göstər" seçiminin fəal olması lazımdır) + Saytda və vebdə giriş məlumatlarınızı avto-doldurmaq üçün Bitwarden Əlçatımlılıq Xidmətini istifadə edin. ("Üzərində göstər" seçimi açıq olmalıdır) Avto-doldurma cəld əməliyyat qutusunu istifadə etmək üçün Bitwarden əlçatımlılıq xidmətini istifadə edin və/və ya "Üzərində göstər"i (əgər fəaldırsa) istifadə edərək açılan bir pəncərə göstərə bilərsiniz. @@ -1843,13 +1843,13 @@ Skan prosesi avtomatik baş tutacaq. "Üzərində göstər"i istifadə edin - Fəal olsa, giriş məlumatları daxil ediləndə Bitwarden əlçatımlılıq xidmətinə açılan pəncərə görüntüləməsinə icazə verilər. + Giriş xanalarını seçdikdə Bitwarden Əlçatımlılıq Xidmətinin açılan pəncərə göstərməsinə icazə verir. - Fəal olsa, giriş məlumatlarının avto-doldurmasına köməkçi olması üçün giriş sahələri seçiləndə Bitwarden əlçatımlılıq xidməti açılan bir pəncərə görüntüləyəcək. + İşə salındıqda Bitwarden Əlçatımlılıq Xidməti, giriş məlumatlarınızın avto-doldurmasına kömək etmək üçün giriş xanaları seçildikdə açılan pəncərə göstərəcək. - Fəal olsa, əlçatımlılıq, Android-in avto-doldurma sistemini dəstəkləməyən köhnə tətbiqlər üçün Avto-doldurma xidmətini təqlid etməsi üçün açılan bir pəncərə göstərəcək. + Fəal olsa, əlçatımlılıq, Android Avto-doldurma Çərçivəsini dəstəkləməyən köhnə tətbiqlərdə Avto-doldurma Xidmətini təqlid etməsi üçün açılan bir pəncərə göstərəcək. Müəssisə Siyasətinə görə, elementləri şəxsi anbarınızda saxlamağınız məhdudlaşdırılıb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mövcud kolleksiyalar arasından seçim edin. @@ -2464,7 +2464,7 @@ Skan prosesi avtomatik baş tutacaq. Əlçatımlılıq Xidməti açıqlaması - Bitwarden, tətbiqlərdə və veb saytlarda giriş sahələrini axtarmaq üçün Əlçatımlılıq Xidmətini istifadə edir, daha sonra tətbiq və ya sayt üçün uyuşma tapdıqda istifadəçi adı və parolun daxil edilməsi üçün müvafiq sahə kimliklərini yaradır. Xidmət tərəfindən bizə təqdim edilən məlumatların heç birini saxlamırıq, kimlik məlumatlarının daxil edilməsindən kənar ekrandakı hər hansısa elementə nəzarət etməyə cəhd etmirik. + Bitwarden, tətbiqlərdə və veb saytlarda giriş xanalarını axtarmaq üçün Əlçatımlılıq Xidmətini istifadə edir, daha sonra tətbiq və ya sayt üçün uyuşma tapdıqda istifadəçi adı və parolun daxil edilməsi üçün müvafiq sahə kimliklərini yaradır. Xidmət tərəfindən bizə təqdim edilən məlumatların heç birini saxlamırıq, kimlik məlumatlarının daxil edilməsindən kənar ekrandakı hər hansısa elementə nəzarət etməyə cəhd etmirik. Qəbul et @@ -2801,7 +2801,7 @@ Bu hesaba keçmək istəyirsiniz? Android Avto-doldurma Çərçivəsi, giriş məlumatlarını cihazınızdakı digər tətbiqlərə doldurmağa kömək etmək üçün istifadə olunur. - Seçdiyiniz klaviatura dəstəkləyirsə sətir daxili avto-doldurmani istifadə edin. Əks halda, ilkin örtük istifadə edin. + Seçdiyiniz klaviatura dəstəkləyirsə sətir daxili avto-doldurmanı istifadə edin. Əks halda, ilkin örtük istifadə edin. Əlavə seçimlər @@ -2819,6 +2819,9 @@ Bu hesaba keçmək istəyirsiniz? Dəstək komandası ilə əlaqə qurmağa davam edilsin? + + Gizlilik Siyasətinə davam edirsiniz? + Tətbiq mağazası ilə davam edilsin? @@ -2838,6 +2841,9 @@ Bu hesaba keçmək istəyirsiniz? Axtardığınızı tapa bilmirsiniz? bitwarden.com üzərindən Bitwarden dəstəyinə müraciət edin. + + bitwarden.com saytında gizlilik siyasətimizi nəzərdən keçirin. + Veb tətbiqində Bitwarden hesabınızın daha çox özəlliyini kəşf edin. diff --git a/src/Core/Resources/Localization/AppResources.be.resx b/src/Core/Resources/Localization/AppResources.be.resx index 4101d64f2..50d41faf2 100644 --- a/src/Core/Resources/Localization/AppResources.be.resx +++ b/src/Core/Resources/Localization/AppResources.be.resx @@ -2820,6 +2820,9 @@ Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.bg.resx b/src/Core/Resources/Localization/AppResources.bg.resx index d724bd3ac..354dcd39d 100644 --- a/src/Core/Resources/Localization/AppResources.bg.resx +++ b/src/Core/Resources/Localization/AppResources.bg.resx @@ -2820,6 +2820,9 @@ Продължаване към връзка с поддръжката? + + Продължаване към Политиката за поверителност? + Продължаване към магазина за приложения? @@ -2839,6 +2842,9 @@ Не намирате това, което търсите? Свържете се с поддръжката на Битуорден на bitwarden.com. + + Прегледайте нашата Политика за поверителност на bitwarden.com. + Разгледайте още от възможностите на регистрацията си в Битуорден в уеб приложението. diff --git a/src/Core/Resources/Localization/AppResources.bn.resx b/src/Core/Resources/Localization/AppResources.bn.resx index e7aeda589..fd8f9ff4a 100644 --- a/src/Core/Resources/Localization/AppResources.bn.resx +++ b/src/Core/Resources/Localization/AppResources.bn.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.bs.resx b/src/Core/Resources/Localization/AppResources.bs.resx index 01905c2a2..53bd193fd 100644 --- a/src/Core/Resources/Localization/AppResources.bs.resx +++ b/src/Core/Resources/Localization/AppResources.bs.resx @@ -2819,6 +2819,9 @@ Skeniranje će biti izvršeno automatski. Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2838,6 +2841,9 @@ Skeniranje će biti izvršeno automatski. Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.ca.resx b/src/Core/Resources/Localization/AppResources.ca.resx index 9b6799c3c..9e0156c30 100644 --- a/src/Core/Resources/Localization/AppResources.ca.resx +++ b/src/Core/Resources/Localization/AppResources.ca.resx @@ -2820,6 +2820,9 @@ Voleu canviar a aquest compte? Voleu continuar per contactar amb l'assistència? + + Voleu continuar amb la política de privadesa? + Voleu continuar cap a l'app store? @@ -2839,6 +2842,9 @@ Voleu canviar a aquest compte? No trobeu el que esteu buscant? Poseu-vos en contacte amb l'assistència de Bitwarden a bitwarden.com. + + Consulteu la nostra política de privadesa a bitwarden.com. + Exploreu més característiques del vostre compte Bitwarden a l'aplicació web. diff --git a/src/Core/Resources/Localization/AppResources.cs.resx b/src/Core/Resources/Localization/AppResources.cs.resx index 9f328ae27..815e2ef21 100644 --- a/src/Core/Resources/Localization/AppResources.cs.resx +++ b/src/Core/Resources/Localization/AppResources.cs.resx @@ -2819,6 +2819,9 @@ Chcete se přepnout na tento účet? Pokračovat v kontaktování podpory? + + Pokračovat na Zásady ochrany osobních údajů? + Pokračovat do obchodu s aplikacemi? @@ -2838,6 +2841,9 @@ Chcete se přepnout na tento účet? Nenašli jste to, co jste hledali? Na bitwarden.com získejte podporu. + + Podívejte se na naše Zásady ochrany osobních údajů na bitwarden.com. + Prozkoumejte další funkce Vašeho účtu Bitwarden ve webové aplikaci. diff --git a/src/Core/Resources/Localization/AppResources.cy.resx b/src/Core/Resources/Localization/AppResources.cy.resx index a7a01eb33..0e93680a6 100644 --- a/src/Core/Resources/Localization/AppResources.cy.resx +++ b/src/Core/Resources/Localization/AppResources.cy.resx @@ -144,7 +144,7 @@ App name. Shouldn't ever change. - Cancel + Yn ôl Cancel an operation. @@ -152,11 +152,11 @@ Copy some value to your clipboard. - Copy password + Copïo'r cyfrinair The button text that allows a user to copy the login's password to their clipboard. - Copy username + Copïo'r enw defnyddiwr The button text that allows a user to copy the login's username to their clipboard. @@ -265,7 +265,7 @@ The login button text (verb). - Login + Mewngofnodi Title for login page. (noun) @@ -282,7 +282,7 @@ Are you sure you want to remove this account? - Account already added + Wedi'i ychwanegu eisoes Would you like to switch to it now? @@ -308,7 +308,7 @@ Label for an entity name. - No + Na Nodiadau @@ -327,7 +327,7 @@ Button text for a save operation (verb). - Move + Symud Yn cadw... @@ -391,7 +391,7 @@ Fersiwn - View + Gweld Visit our website @@ -401,7 +401,7 @@ Label for a website. - Yes + Ydw Cyfrif @@ -455,7 +455,7 @@ Parhau - Creu cyfrif + Crëwch gyfrif Wrthi'n creu cyfrif... @@ -484,13 +484,13 @@ Safari is the name of apple's web browser - Get instant access to your passwords! + Mynnwch fynediad i'ch cyfrineiriau ar unwaith! Rydych chi'n barod i fewngofnodi! - Your logins are now easily accessible from Safari, Chrome, and other supported apps. + Mae eich manylion mewngofnodi bellach yn hawdd i'w canfod o Safari, Chrome, ac apiau eraill. In Safari and Chrome, find Bitwarden using the share icon (hint: scroll to the right on the bottom row of the share menu). @@ -502,7 +502,7 @@ To turn on Bitwarden in Safari and other apps, tap the "more" icon on the bottom row of the menu. - Favorite + Ffefryn Ôl bys @@ -511,7 +511,7 @@ Cynhyrchu cyfrinair - Get your master password hint + Anfon awgrym o'ch prif gyfrinair Mewnforio eitemau @@ -572,27 +572,27 @@ The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it. - Master password hint (optional) + Awgrym o'ch prif gyfrinair (dewisol) Gall awgrym o'ch prif gyfrinair eich helpu i'w gofio os ydych chi'n ei anghofio. - Master password must be at least {0} characters long. + Rhaid i'ch prif gyfrinair gynnwys o leiaf {0} nod. Isafswm rhifau Minimum numeric characters for password generator settings - Isafswm arbennig + Isafswm nodau arbennig Minimum special characters for password generator settings Mwy o osodiadau - You must log into the main Bitwarden app before you can use the extension. + Rhaid i chi fewngofnodi i brif ap Bitwarden cyn defnyddio'r estyniad. byth @@ -610,7 +610,7 @@ There are no items in your vault for this website/app. Tap to add one. - This login does not have a username or password configured. + Does dim enw defnyddiwr na chyfrinair i'r manylyn mewngofnodi hwn. Iawn, deall! @@ -623,7 +623,7 @@ Dewisiadau - Other + Gosodiadau eraill Password generated @@ -632,7 +632,7 @@ Cynhyrchydd cyfrineiriau - Password hint + Awgrym o'r cyfrinair Rydym ni wedi anfon ebost atoch gydag awgrym ar gyfer eich prif gyfrinair. @@ -654,7 +654,7 @@ Ailgynhyrchu cyfrinair - Re-type master password + Aildeipio'r prif gyfrinair Chwilio'r gell @@ -672,7 +672,7 @@ Rhowch god PIN 4 nod i'w ddefnyddio i ddatgloi'r ap. - Item information + Gwybodaeth am yr eitem Eitem wedi'i chadw @@ -699,7 +699,7 @@ What Apple calls their fingerprint reader. - Two-step login + Mewngofnodi dau agm Datgloi â {0} @@ -715,7 +715,7 @@ Verification code - View item + Gweld yr eitem Cell we Bitwarden @@ -837,10 +837,10 @@ For 2FA - Two-step login options + Dewisiadau mewngofnodi dau gam - Use another two-step login method + Defnyddio dull mewngofnodi dau gam arall Could not send verification email. Try again. @@ -1005,10 +1005,10 @@ Scanning will happen automatically. Cerdyn - Hunaniaeth + Eitem hunaniaeth - Login + Manylyn mewngofnodi Nodyn diogel @@ -1083,10 +1083,10 @@ Scanning will happen automatically. Mawrth - May + Mai - Middle name + Enw canol Mr @@ -1104,13 +1104,13 @@ Scanning will happen automatically. Tachwedd - October + Hydref Rhif pasbort - Phone + Ffôn Medi @@ -1137,7 +1137,7 @@ Scanning will happen automatically. Dangos eiconau gwefannau - Show a recognizable image next to each login. + Dangos delwedd adnabyddadwy wrth ymyl pob eitem. Icons server URL @@ -1158,10 +1158,10 @@ Scanning will happen automatically. There are no items in this collection. - There are no items in this folder. + Does dim eitemau yn y ffolder hon. - There are no items in the trash. + Does dim eitemau yn y bin sbwriel. Auto-fill Accessibility Service @@ -1266,7 +1266,7 @@ Scanning will happen automatically. Hold your Yubikey near the top of the device. - Try again + Ceisio eto To continue, hold your YubiKey NEO against the back of the device. @@ -1351,10 +1351,10 @@ Scanning will happen automatically. Gwirio a ydy'r cyfrinair wedi'i ddatgelu. - Mae'r cyfrinair hwn wedi cael ei ddatgelu {0} o weithiau mewn achosion o dorri data. Dylech chi ei newid. + Mae'r cyfrinair hwn wedi cael ei ddatgelu {0} o weithiau mewn achosion o ddatgelu data. Dylech chi ei newid. - This password was not found in any known data breaches. It should be safe to use. + Chafodd y cyfrinair hwn mo'i ganfod mewn unrhyw achos hysbys o ddatgelu data. Dylai fod yn iawn i'w ddefnyddio. Identity name @@ -1366,13 +1366,13 @@ Scanning will happen automatically. Password history - Types + Mathau - No passwords to list. + Dim cyfrineiriau i'w rhestru. - There are no items to list. + Does dim eitemau i'w rhestu. Search collection @@ -1384,7 +1384,7 @@ Scanning will happen automatically. Search text Sends - Search {0} + Chwilio {0} ex: Search Logins @@ -1451,7 +1451,7 @@ Scanning will happen automatically. Short for "Password Generator" - There are no folders to list. + Does dim ffolderi i'w rhestru. Fingerprint phrase @@ -1522,11 +1522,11 @@ Scanning will happen automatically. ar ôl 2 funud - Clear clipboard + Clirio'r clipfwrdd Clipboard is the operating system thing where you copy/paste data to on your device. - Automatically clear copied values from your clipboard. + Clirio eitemau a gopïwyd o'ch clipfwrdd yn awtomatig. Clipboard is the operating system thing where you copy/paste data to on your device. @@ -1541,7 +1541,7 @@ Scanning will happen automatically. Color theme - Change the application's color theme. + Newid thema liwiau'r ap. Rhagosodiad (system) @@ -1550,13 +1550,13 @@ Scanning will happen automatically. Default dark theme - Copy note + Copïo'r nodyn - Exit + Gadael - Are you sure you want to exit Bitwarden? + Ydych chi'n siŵr eich bod am adael Bitwarden? Do you want to require unlocking with your master password when the application is restarted? @@ -1599,7 +1599,7 @@ Scanning will happen automatically. Cynnwys rhif - Download + Lawrlwytho Shared @@ -1614,10 +1614,10 @@ Scanning will happen automatically. Biometric verification - Biometrics + biometreg - Use biometrics to unlock + Defnyddio biometreg i ddatgloi Bitwarden needs attention - See "Auto-fill Accessibility Service" from Bitwarden settings @@ -1641,7 +1641,7 @@ Scanning will happen automatically. Granted - File format + Fformat y ffeil Rhowch eich prif gyfrinair i allforio data eich cell. @@ -1692,7 +1692,7 @@ Scanning will happen automatically. There was a problem saving this attachment. If the problem persists, you can save it from the web vault. - Attachment saved successfully + Cadwyd yr atodiad yn llwyddiannus Please turn on "Auto-fill Accessibility Service" from Bitwarden Settings to use the Auto-fill tile. @@ -1701,11 +1701,11 @@ Scanning will happen automatically. No password fields detected - Sending to trash... + Yn anfon i'r bin sbwriel... Message shown when interacting with the server - Item has been sent to trash. + Anfonwyd yr eitem i'r bin sbwriel. Confirmation message after successfully soft-deleting a login @@ -1713,7 +1713,7 @@ Scanning will happen automatically. Restores an entity (verb). - Restoring... + Yn adfer... Message shown when interacting with the server @@ -1721,15 +1721,15 @@ Scanning will happen automatically. Confirmation message after successfully restoring a soft-deleted item - Trash + Bin sbwriel (noun) Location of deleted items which have not yet been permanently deleted - Search trash + Chwilio drwy'r bin sbwriel (action prompt) Label for the search text field when viewing the trash folder - Do you really want to permanently delete? This cannot be undone. + Ydych chi wir eisiau dileu'r eitem hon? Allwch chi ddim dadwneud hyn. Confirmation alert message when permanently deleteing a cipher. @@ -1737,7 +1737,7 @@ Scanning will happen automatically. Confirmation alert message when restoring a soft-deleted cipher. - Do you really want to send to the trash? + Ydych chi wir eisiau anfon yr eitem hon i'r bin sbwriel? Confirmation alert message when soft-deleting a cipher. @@ -1747,10 +1747,10 @@ Scanning will happen automatically. Autofill biometric unlock for this account is disabled pending verification of master password. - Allow sync on refresh + Caniatáu cysoni wrth adnewyddu - Syncing vault with pull down gesture. + Cysoni'r gell drwy dynnu i lawr. Enterprise single sign-on @@ -1765,7 +1765,7 @@ Scanning will happen automatically. Currently unable to login with SSO - Set master password + Gosod prif gyfrinair In order to complete logging in with SSO, please set a master password to access and protect your vault. @@ -1798,7 +1798,7 @@ Scanning will happen automatically. Password does not meet organization requirements. Please check the policy information and try again. - Loading + Llwytho By activating this switch you agree to the following: @@ -1808,16 +1808,16 @@ Scanning will happen automatically. Terms of Service and Privacy Policy have not been acknowledged. - Terms of Service + Telerau gwasanaeth - Privacy Policy + Polisi preifatrwydd Bitwarden needs attention - Turn on "Draw-Over" in "Auto-fill Services" from Bitwarden Settings - Auto-fill services + Gwasanaethau llenwi awtomatig Use inline autofill @@ -2044,11 +2044,11 @@ Scanning will happen automatically. 'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated. - About Send + Ynghylch Send 'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated. - Hide my email address from recipients + Cuddio fy nghyfeiriad ebost rhag derbynwyr One or more organization policies are affecting your Send options. @@ -2063,7 +2063,7 @@ Scanning will happen automatically. 'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated. - Master password re-prompt + Ailofyn am y prif gyfrinair Master password confirmation @@ -2078,16 +2078,16 @@ Scanning will happen automatically. Captcha failed. Please try again. - Updated master password + Diweddarwyd y prif gyfrinair - Update master password + Diweddaru'r prif gyfrinair Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. - Updating password + Yn diweddaru'r cyfrinair Currently unable to update password @@ -2105,7 +2105,7 @@ Scanning will happen automatically. Leave organization - Leave {0}? + Gadael {0}? FIDO2 WebAuthn @@ -2120,7 +2120,7 @@ Scanning will happen automatically. Authenticate WebAuthn - Return to app + Dychwelyd i'r ap Please make sure your default browser supports WebAuthn and try again. @@ -2144,7 +2144,7 @@ Scanning will happen automatically. One or more organization policies prevents your from exporting your individual vault. - Add account + Ychwanegu cyfrif Unlocked @@ -2168,19 +2168,19 @@ Scanning will happen automatically. Account removed successfully - Delete account + Dileu eich cyfrif Deleting your account is permanent - Your account and all vault data will be erased and unrecoverable. Are you sure you want to continue? + Caiff eich cyfrif a holl ddata'ch cell eu dileu mewn ffordd anadferadwy. Ydych chi'n siŵr yr hoffech chi barhau? Deleting your account - Your account has been permanently deleted + Mae eich cyfrif wedi cael ei ddileu'n barhaol Invalid verification code @@ -2249,7 +2249,7 @@ Scanning will happen automatically. Password is not visible, tap to show. - Filter items by vault + Hidlo eitemau yn ôl cell Pob cell @@ -2307,7 +2307,7 @@ select Add TOTP to store the key safely We were unable to process your request. Please try again or contact us. - Allow screen capture + Caniatáu sgrinluniau Are you sure you want to turn on screen capture? @@ -2316,46 +2316,46 @@ select Add TOTP to store the key safely Login requested - Are you trying to log in? + Ydych chi'n ceisio mewngofnodi? - Login attempt by {0} on {1} + Cais mewngofnodi gan {0} ar {1} - Device type + Math o ddyfais Cyfeiriad IP - Time + Amser - Near + Gerllaw - Confirm login + Cadarnhau'r mewngofnodi - Deny login + Gwrthod y mewngofnodi - Just now + Ychydig yn ôl - {0} minutes ago + {0} o funudau yn ôl - Login confirmed + Cadarnhawyd y mewngofnodi - Login denied + Gwrthodwyd y mewngofnodi - Approve login requests + Cymeradwyo ceisiadau mewngofnodi - Use this device to approve login requests made from other devices + Defnyddio'r ddyfais hon i gymeradwyo ceisiadau mewngofnodi gan ddyfeisiau eraill Caniatáu hysbysiadau @@ -2373,16 +2373,16 @@ select Add TOTP to store the key safely All notifications - Password type + Math o gyfrinair - What would you like to generate? + Beth hoffech chi ei gynhyrchu? Math o enw defnyddiwr - Plus addressed email + Is-gyfeiriad ebost Catch-all email @@ -2391,13 +2391,13 @@ select Add TOTP to store the key safely Forwarded email alias - Random word + Gair ar hap Email (required) - Domain name (required) + Enw parth (gofynnol) API key (required) @@ -2442,13 +2442,13 @@ select Add TOTP to store the key safely Math o ebost - Website (required) + Gwefan (gofynnol) - Unknown {0} error occurred. + Bu gwall anhysbys {0}. - Use your email provider's subaddress capabilities + Defnyddio galluoedd is-gyfeirio darparwr eich cyfeiriad ebost ('plus addressing') Use your domain's configured catch-all inbox. @@ -2457,7 +2457,7 @@ select Add TOTP to store the key safely Generate an email alias with an external forwarding service. - Random + Hap Connect to Watch @@ -2469,10 +2469,10 @@ select Add TOTP to store the key safely Bitwarden uses the Accessibility Service to search for login fields in apps and websites, then establish the appropriate field IDs for entering a username & password when a match for the app or site is found. We do not store any of the information presented to us by the service, nor do we make any attempt to control any on-screen elements beyond text entry of credentials. - Accept + Derbyn - Decline + Gwrthod Login request has already expired. @@ -2483,22 +2483,22 @@ select Add TOTP to store the key safely Do you want to switch to this account? - New around here? + Ydych chi'n newydd? - Get master password hint + Anfon awgrym o'ch prif gyfrinair - Logging in as {0} on {1} + Yn mewngofnodi fel {0} ar {1} - Not you? + Nid chi? - Log in with master password + Mewngofnodi â'ch prif gyfrinair - Log in with device + Mewngofnodi â dyfais Login initiated @@ -2513,13 +2513,13 @@ Do you want to switch to this account? Resend notification - Need another option? + Angen opsiwn arall? View all log in options - This request is no longer valid + Dyw'r cais hwn ddim yn ddilys bellach Pending login requests @@ -2540,13 +2540,13 @@ Do you want to switch to this account? Enable camera permission to use the scanner - Language + Iaith - The language has been changed to {0}. Please restart the app to see the change + Cafodd yr iaith ei newid i {0}. Ailgychwynnwch yr ap i weld newidiadau - Language change requires app restart + Bydd angen ailgychwyn yr ap Default (System) @@ -2573,7 +2573,7 @@ Do you want to switch to this account? Cryf - Check known data breaches for this password + Chwilio am achosion o ddatgelu data sy'n cynnwys y cyfrinair hwn Prif gyfrinair wedi'i ddatgelu @@ -2609,7 +2609,7 @@ Do you want to switch to this account? UE - Hunangynhaliol + Gweinydd hunangynhaliol Lleoliad y data @@ -2639,7 +2639,7 @@ Do you want to switch to this account? Turn off using a public device - Remember this device + Cofio'r ddyfais hon Passkey @@ -2690,7 +2690,7 @@ Do you want to switch to this account? Trouble logging in? - Logging in as {0} + Yn mewngofnodi fel {0} Vault timeout action changed to log out @@ -2745,19 +2745,19 @@ Do you want to switch to this account? Log in with device must be set up in the settings of the Bitwarden app. Need another option? - Log in with device + Mewngofnodi â dyfais - Logging in on + Mewngofnodi ar - Vault + Cell - Appearance + Golwg - Account security + Diogelwch eich cyfrif Bitwarden Help Center @@ -2769,10 +2769,10 @@ Do you want to switch to this account? Copy app information - Sync now + Cysoni nawr - Unlock options + Dewisiadau datgloi Session timeout @@ -2806,10 +2806,10 @@ Do you want to switch to this account? Use inline autofill if your selected keyboard supports it. Otherwise, use the default overlay. - Additional options + Dewisiadau ychwanegol - Continue to web app? + Parhau i'r ap gwe? Continue to {0}? @@ -2821,11 +2821,14 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? - Make your account more secure by setting up two-step login in the Bitwarden web app. + Gallwch wneud eich cyfrif yn fwy diogel drwy alluogi mewngofnodi dau gam yn ap gwe Bitwarden. You can change your master password on the Bitwarden web app. @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.da.resx b/src/Core/Resources/Localization/AppResources.da.resx index 2d0cdb3dc..34534613f 100644 --- a/src/Core/Resources/Localization/AppResources.da.resx +++ b/src/Core/Resources/Localization/AppResources.da.resx @@ -2820,6 +2820,9 @@ Vil du skifte til denne konto? Fortsæt med at kontakte support? + + Fortsæt til Fortrolighedspolitik? + Fortsæt til app-butik? @@ -2839,6 +2842,9 @@ Vil du skifte til denne konto? Kan ikke finde det, der søges efter? Kontakt Bitwarden-supporten via bitwarden.com. + + Tjek vores Fortrolighedspolitik på bitwarden.com. + Tjek flere funktioner ud i Bitwarden-kontoen på web-appen. diff --git a/src/Core/Resources/Localization/AppResources.de.resx b/src/Core/Resources/Localization/AppResources.de.resx index 7ef68b1e5..37ce33c0e 100644 --- a/src/Core/Resources/Localization/AppResources.de.resx +++ b/src/Core/Resources/Localization/AppResources.de.resx @@ -2819,6 +2819,9 @@ Möchtest du zu diesem Konto wechseln? Weiter, um den Support zu kontaktieren? + + Weiter zur Datenschutzerklärung? + Weiter zum App Store? @@ -2838,6 +2841,9 @@ Möchtest du zu diesem Konto wechseln? Du findest nicht, was du suchst? Kontaktiere den Bitwarden Support auf bitwarden.com. + + Lies unsere Datenschutzerklärung auf bitwarden.com. + Entdecke mehr Funktionen deines Bitwarden-Kontos in der Web-App. diff --git a/src/Core/Resources/Localization/AppResources.el.resx b/src/Core/Resources/Localization/AppResources.el.resx index b2a28cdd5..733591522 100644 --- a/src/Core/Resources/Localization/AppResources.el.resx +++ b/src/Core/Resources/Localization/AppResources.el.resx @@ -2819,6 +2819,9 @@ Συνέχεια στην επικοινωνία με την υποστήριξη; + + Continue to privacy policy? + Συνέχεια στο κατάστημα εφαρμογών; @@ -2838,6 +2841,9 @@ Δεν μπορείτε να βρείτε αυτό που ψάχνετε; Επικοινωνήστε με την υποστήριξη Bitwarden στο bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Εξερευνήστε περισσότερες δυνατότητες του Bitwarden λογαριασμού σας, στην εφαρμογή διαδικτύου. diff --git a/src/Core/Resources/Localization/AppResources.en-GB.resx b/src/Core/Resources/Localization/AppResources.en-GB.resx index 53ebf0336..7d5e88831 100644 --- a/src/Core/Resources/Localization/AppResources.en-GB.resx +++ b/src/Core/Resources/Localization/AppResources.en-GB.resx @@ -2820,6 +2820,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.en-IN.resx b/src/Core/Resources/Localization/AppResources.en-IN.resx index c56f1a6fd..3765c510b 100644 --- a/src/Core/Resources/Localization/AppResources.en-IN.resx +++ b/src/Core/Resources/Localization/AppResources.en-IN.resx @@ -2834,6 +2834,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2853,6 +2856,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.es.resx b/src/Core/Resources/Localization/AppResources.es.resx index 9336230ba..63cecf1ff 100644 --- a/src/Core/Resources/Localization/AppResources.es.resx +++ b/src/Core/Resources/Localization/AppResources.es.resx @@ -2822,6 +2822,9 @@ seleccione Agregar TOTP para almacenar la clave de forma segura ¿Continuar con el servicio de asistencia? + + Continue to privacy policy? + ¿Continuar a la App Store? @@ -2841,6 +2844,9 @@ seleccione Agregar TOTP para almacenar la clave de forma segura ¿No encuentras lo que estás buscando? Contacta con el soporte de Bitwarden en bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explora más características de tu cuenta de Bitwarden en la aplicación web. diff --git a/src/Core/Resources/Localization/AppResources.et.resx b/src/Core/Resources/Localization/AppResources.et.resx index bbc702cee..22f66841d 100644 --- a/src/Core/Resources/Localization/AppResources.et.resx +++ b/src/Core/Resources/Localization/AppResources.et.resx @@ -2820,6 +2820,9 @@ Soovid selle konto peale lülituda? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Soovid selle konto peale lülituda? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.eu.resx b/src/Core/Resources/Localization/AppResources.eu.resx index ba73d06dc..11ac0ffaf 100644 --- a/src/Core/Resources/Localization/AppResources.eu.resx +++ b/src/Core/Resources/Localization/AppResources.eu.resx @@ -2819,6 +2819,9 @@ Kontu honetara aldatu nahi duzu? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2838,6 +2841,9 @@ Kontu honetara aldatu nahi duzu? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.fa.resx b/src/Core/Resources/Localization/AppResources.fa.resx index 58931a9d6..5d4cf2d33 100644 --- a/src/Core/Resources/Localization/AppResources.fa.resx +++ b/src/Core/Resources/Localization/AppResources.fa.resx @@ -2821,6 +2821,9 @@ می‌خواهید با پشتیبانی تماس بگیرید؟ + + Continue to privacy policy? + به فروشگاه برنامه ادامه می‌دهید؟ @@ -2840,6 +2843,9 @@ چیزی را که به دنبالش هستید پیدا نمی‌کنید؟ با پشتیبانی Bitwarden در bitwarden.com تماس بگیرید. + + Check out our privacy policy on bitwarden.com. + ویژگی‌های بیشتر حساب Bitwarden خود را در برنامه وب کاوش کنید. diff --git a/src/Core/Resources/Localization/AppResources.fi.resx b/src/Core/Resources/Localization/AppResources.fi.resx index cee8da7bd..42c1c2f65 100644 --- a/src/Core/Resources/Localization/AppResources.fi.resx +++ b/src/Core/Resources/Localization/AppResources.fi.resx @@ -560,7 +560,7 @@ Message shown when interacting with the server - Kirjaudu tai luo uusi tili käyttääksesi salattua holviasi. + Käytä salattua holviasi kirjautumalla sisään tai tai luo uusi tili. Hallinta @@ -2821,6 +2821,9 @@ Haluatko vaihtaa tähän tiliin? Siirrytäänkö asiakaspalveluun? + + Jatketaanko tietosuojakäytäntöön? + Avataanko sovelluskauppa? @@ -2840,6 +2843,9 @@ Haluatko vaihtaa tähän tiliin? Etkö löydä etsimääsi? Tavoitat Bitwardenin asiakaspalvelun osoitteesta bitwarden.com. + + Tutustu tietosuojakäytäntöömme osoitteessa bitwarden.com. + Tutustu Bitwarden-tilisi muihin omimaisuuksiin verkkosovelluksessa. diff --git a/src/Core/Resources/Localization/AppResources.fil.resx b/src/Core/Resources/Localization/AppResources.fil.resx index 61f125f13..57a3b644d 100644 --- a/src/Core/Resources/Localization/AppResources.fil.resx +++ b/src/Core/Resources/Localization/AppResources.fil.resx @@ -2821,6 +2821,9 @@ Gusto mo bang pumunta sa account na ito? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Gusto mo bang pumunta sa account na ito? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.fr.resx b/src/Core/Resources/Localization/AppResources.fr.resx index c804fce4a..239cd3f56 100644 --- a/src/Core/Resources/Localization/AppResources.fr.resx +++ b/src/Core/Resources/Localization/AppResources.fr.resx @@ -2821,6 +2821,9 @@ Voulez-vous basculer vers ce compte ? Continuer vers le contact du support ? + + Poursuivre vers la politique de confidentialité ? + Continuer vers la boutique des applications ? @@ -2840,6 +2843,9 @@ Voulez-vous basculer vers ce compte ? Vous ne trouvez pas ce que vous cherchez ? Contactez le support de Bitwarden sur bitwarden.com. + + Consultez notre politique de confidentialité sur bitwarden.com. + Explorez plus de fonctionnalités de votre compte Bitwarden sur l'application Web. diff --git a/src/Core/Resources/Localization/AppResources.gl.resx b/src/Core/Resources/Localization/AppResources.gl.resx index 47405c13b..ef486a762 100644 --- a/src/Core/Resources/Localization/AppResources.gl.resx +++ b/src/Core/Resources/Localization/AppResources.gl.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.he.resx b/src/Core/Resources/Localization/AppResources.he.resx index 1a4ed925a..de7228d88 100644 --- a/src/Core/Resources/Localization/AppResources.he.resx +++ b/src/Core/Resources/Localization/AppResources.he.resx @@ -2823,6 +2823,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2842,6 +2845,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.hi.resx b/src/Core/Resources/Localization/AppResources.hi.resx index 977063eae..7d5bf8ad5 100644 --- a/src/Core/Resources/Localization/AppResources.hi.resx +++ b/src/Core/Resources/Localization/AppResources.hi.resx @@ -2820,6 +2820,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.hr.resx b/src/Core/Resources/Localization/AppResources.hr.resx index f2dc46fe4..743f77fca 100644 --- a/src/Core/Resources/Localization/AppResources.hr.resx +++ b/src/Core/Resources/Localization/AppResources.hr.resx @@ -2818,6 +2818,9 @@ Kontaktiraj podršku? + + Continue to privacy policy? + Nastavi u trgovinu aplikacijama? @@ -2837,6 +2840,9 @@ Ne možeš naći što te zanima? Kontaktiraj Bitwarden podršku na bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Pronađi viđe značajki svojeg Bitwarden računa u web aplikaciji. diff --git a/src/Core/Resources/Localization/AppResources.hu.resx b/src/Core/Resources/Localization/AppResources.hu.resx index ee800218f..c3547a5fd 100644 --- a/src/Core/Resources/Localization/AppResources.hu.resx +++ b/src/Core/Resources/Localization/AppResources.hu.resx @@ -2819,6 +2819,9 @@ Szeretnénk átváltani erre a fiókra? Tovább az ügyfélszolgálathoz? + + Tovább az adatvédelmi szabályzathoz? + Tovább az alkalmazásboltba? @@ -2838,6 +2841,9 @@ Szeretnénk átváltani erre a fiókra? Nem találjuk, amit keresünk? Lépjünk kapcsolatba a Bitwarden ügyfélszolgálatával a bitwarden.com oldalon. + + Az adatvédelmi szabályzat megtekintése a bitwarden.com webhelyen. + Fedezzük fel a Bitwarden-fiók további funkcióit a webalkalmazásban. diff --git a/src/Core/Resources/Localization/AppResources.id.resx b/src/Core/Resources/Localization/AppResources.id.resx index 00b069f4a..52559c5c1 100644 --- a/src/Core/Resources/Localization/AppResources.id.resx +++ b/src/Core/Resources/Localization/AppResources.id.resx @@ -2820,6 +2820,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.it.resx b/src/Core/Resources/Localization/AppResources.it.resx index 156467c8c..e5d6c19dd 100644 --- a/src/Core/Resources/Localization/AppResources.it.resx +++ b/src/Core/Resources/Localization/AppResources.it.resx @@ -2820,6 +2820,9 @@ Vuoi passare a questo account? Continua per contattare l'assistenza? + + Continuare alla privacy policy? + Continuare sull'App Store? @@ -2839,6 +2842,9 @@ Vuoi passare a questo account? Non riesci a trovare quello che stai cercando? Contatta il supporto Bitwarden su bitwarden.com. + + Consulta la nostra privacy policy su bitwarden.com. + Esplora altre funzionalità del tuo account Bitwarden sul sito web. diff --git a/src/Core/Resources/Localization/AppResources.ja.resx b/src/Core/Resources/Localization/AppResources.ja.resx index 3e50f0738..fd990c96b 100644 --- a/src/Core/Resources/Localization/AppResources.ja.resx +++ b/src/Core/Resources/Localization/AppResources.ja.resx @@ -2820,6 +2820,9 @@ サポートに連絡しますか? + + プライバシーポリシーを確認しますか? + アプリストアに進みますか? @@ -2839,6 +2842,9 @@ お探しのものが見つかりませんか? bitwarden.com で Bitwarden のサポートにご連絡ください。 + + bitwarden.com でプライバシーポリシーをご覧ください。 + Bitwarden アカウントの機能をウェブアプリでご確認ください。 diff --git a/src/Core/Resources/Localization/AppResources.ka.resx b/src/Core/Resources/Localization/AppResources.ka.resx index 47405c13b..ef486a762 100644 --- a/src/Core/Resources/Localization/AppResources.ka.resx +++ b/src/Core/Resources/Localization/AppResources.ka.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.kn.resx b/src/Core/Resources/Localization/AppResources.kn.resx index 07dcdc74f..fc53fac84 100644 --- a/src/Core/Resources/Localization/AppResources.kn.resx +++ b/src/Core/Resources/Localization/AppResources.kn.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.ko.resx b/src/Core/Resources/Localization/AppResources.ko.resx index 0c739e5e3..ee02a707c 100644 --- a/src/Core/Resources/Localization/AppResources.ko.resx +++ b/src/Core/Resources/Localization/AppResources.ko.resx @@ -2820,6 +2820,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.lt.resx b/src/Core/Resources/Localization/AppResources.lt.resx index b65502339..9f570744c 100644 --- a/src/Core/Resources/Localization/AppResources.lt.resx +++ b/src/Core/Resources/Localization/AppResources.lt.resx @@ -2821,6 +2821,9 @@ Ar norite pereiti prie šios paskyros? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Ar norite pereiti prie šios paskyros? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.lv.resx b/src/Core/Resources/Localization/AppResources.lv.resx index 38e8bb929..5ed33631e 100644 --- a/src/Core/Resources/Localization/AppResources.lv.resx +++ b/src/Core/Resources/Localization/AppResources.lv.resx @@ -2821,6 +2821,9 @@ Vai pārslēgties uz šo kontu? Pāriet uz sazināšanos ar atbalstu? + + Pāriet uz privātuma nosacījumiem? + Pāriet uz lietotņu veikalu? @@ -2840,6 +2843,9 @@ Vai pārslēgties uz šo kontu? Meklējamais nav atrodams? Ir iespēja sazināties ar Bitwarden atbalstu bitwarden.com. + + Mūsu privātuma nosacījumi ir pārskatāmi bitwarden.com. + Vairāk sava Bitwarden konta iespēju var izpētīt tīmekļa vietnē. diff --git a/src/Core/Resources/Localization/AppResources.ml.resx b/src/Core/Resources/Localization/AppResources.ml.resx index 5f38b7e82..6f45dd60e 100644 --- a/src/Core/Resources/Localization/AppResources.ml.resx +++ b/src/Core/Resources/Localization/AppResources.ml.resx @@ -2820,6 +2820,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.mr.resx b/src/Core/Resources/Localization/AppResources.mr.resx index 275185ac8..620dcfb17 100644 --- a/src/Core/Resources/Localization/AppResources.mr.resx +++ b/src/Core/Resources/Localization/AppResources.mr.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.my.resx b/src/Core/Resources/Localization/AppResources.my.resx index 47405c13b..ef486a762 100644 --- a/src/Core/Resources/Localization/AppResources.my.resx +++ b/src/Core/Resources/Localization/AppResources.my.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.nb.resx b/src/Core/Resources/Localization/AppResources.nb.resx index 2f8dd6b56..329f82d82 100644 --- a/src/Core/Resources/Localization/AppResources.nb.resx +++ b/src/Core/Resources/Localization/AppResources.nb.resx @@ -2821,6 +2821,9 @@ Vil du bytte til denne kontoen? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Vil du bytte til denne kontoen? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.ne.resx b/src/Core/Resources/Localization/AppResources.ne.resx index 47405c13b..ef486a762 100644 --- a/src/Core/Resources/Localization/AppResources.ne.resx +++ b/src/Core/Resources/Localization/AppResources.ne.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.nl.resx b/src/Core/Resources/Localization/AppResources.nl.resx index bb0fb7945..47974a496 100644 --- a/src/Core/Resources/Localization/AppResources.nl.resx +++ b/src/Core/Resources/Localization/AppResources.nl.resx @@ -2212,7 +2212,7 @@ Het scannen gebeurt automatisch. Er is een fout opgetreden tijdens het verzenden van een verificatiecode naar je e-mail. Probeer het opnieuw - Voer de verificatiecode in die we naar je e-mail is gestuurd + Voer de verificatiecode in die naar je e-mail is gestuurd Crashes rapporteren @@ -2820,6 +2820,9 @@ Wilt u naar dit account wisselen? Doorgaan met het contact opnemen met support? + + Doorgaan naar privacybeleid? + Doorgaan naar de app store? @@ -2839,6 +2842,9 @@ Wilt u naar dit account wisselen? Kan je niet vinden wat je zoekt? Neem contact op met Bitwarden-ondersteuning via bitwarden.com. + + Bekijk ons privacybeleid op bitwarden.com. + Ontdek meer functies van je Bitwarden-account in de webapp. diff --git a/src/Core/Resources/Localization/AppResources.nn.resx b/src/Core/Resources/Localization/AppResources.nn.resx index 6f0968396..0c1de4042 100644 --- a/src/Core/Resources/Localization/AppResources.nn.resx +++ b/src/Core/Resources/Localization/AppResources.nn.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Fortset til personvernerklæringa? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Sjekk ut personvernerklæringa vår på bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.or.resx b/src/Core/Resources/Localization/AppResources.or.resx index 08e4de27e..b696360ea 100644 --- a/src/Core/Resources/Localization/AppResources.or.resx +++ b/src/Core/Resources/Localization/AppResources.or.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.pl.resx b/src/Core/Resources/Localization/AppResources.pl.resx index a849de211..4a5f94625 100644 --- a/src/Core/Resources/Localization/AppResources.pl.resx +++ b/src/Core/Resources/Localization/AppResources.pl.resx @@ -2820,6 +2820,9 @@ Czy chcesz przełączyć się na to konto? Kontynuować kontakt z pomocą techniczną? + + Kontynuować do polityki prywatności? + Kontynuować do sklepu aplikacji? @@ -2839,6 +2842,9 @@ Czy chcesz przełączyć się na to konto? Nie możesz znaleźć tego, czego szukasz? Skontaktuj się z pomocą na bitwarden.com. + + Sprawdź naszą politykę prywatności na bitwarden.com. + Odkryj więcej funkcji swojego konta Bitwarden w aplikacji internetowej. diff --git a/src/Core/Resources/Localization/AppResources.pt-BR.resx b/src/Core/Resources/Localization/AppResources.pt-BR.resx index 65806fd17..d874b5a9a 100644 --- a/src/Core/Resources/Localization/AppResources.pt-BR.resx +++ b/src/Core/Resources/Localization/AppResources.pt-BR.resx @@ -2821,6 +2821,9 @@ Você deseja mudar para esta conta? Continuar e contatar o suporte? + + Continue to privacy policy? + Continuar para a loja de apps? @@ -2840,6 +2843,9 @@ Você deseja mudar para esta conta? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.pt-PT.resx b/src/Core/Resources/Localization/AppResources.pt-PT.resx index e853eb399..45ded2220 100644 --- a/src/Core/Resources/Localization/AppResources.pt-PT.resx +++ b/src/Core/Resources/Localization/AppResources.pt-PT.resx @@ -2819,6 +2819,9 @@ Deseja mudar para esta conta? Continuar a contactar o apoio ao cliente? + + Continuar para a política de privacidade? + Continuar para a loja de aplicações? @@ -2838,6 +2841,9 @@ Deseja mudar para esta conta? Não consegue encontrar o que está a procurar? Entre em contacto com o suporte da Bitwarden em bitwarden.com. + + Consulte a nossa política de privacidade em bitwarden.com. + Explore mais funcionalidades da sua conta Bitwarden na aplicação web. diff --git a/src/Core/Resources/Localization/AppResources.resx b/src/Core/Resources/Localization/AppResources.resx index 325984903..a04d4bcb8 100644 --- a/src/Core/Resources/Localization/AppResources.resx +++ b/src/Core/Resources/Localization/AppResources.resx @@ -2830,6 +2830,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2849,6 +2852,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.ro.resx b/src/Core/Resources/Localization/AppResources.ro.resx index 92baf1a70..bd6023a3b 100644 --- a/src/Core/Resources/Localization/AppResources.ro.resx +++ b/src/Core/Resources/Localization/AppResources.ro.resx @@ -2820,6 +2820,9 @@ Doriți să comutați la acest cont? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Doriți să comutați la acest cont? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.ru.resx b/src/Core/Resources/Localization/AppResources.ru.resx index 6a3822249..8438f0323 100644 --- a/src/Core/Resources/Localization/AppResources.ru.resx +++ b/src/Core/Resources/Localization/AppResources.ru.resx @@ -2822,6 +2822,9 @@ Обратиться в службу поддержки? + + Перейти к политике конфиденциальности? + Перейти в магазин приложений? @@ -2841,6 +2844,9 @@ Не можете найти то, что ищете? Обратитесь в службу поддержки Bitwarden на сайте bitwarden.com. + + Ознакомьтесь с нашей политикой конфиденциальности на сайте bitwarden.com. + Изучите дополнительные возможности вашего аккаунта Bitwarden в веб-приложении. diff --git a/src/Core/Resources/Localization/AppResources.si.resx b/src/Core/Resources/Localization/AppResources.si.resx index e40fac610..b0098f73d 100644 --- a/src/Core/Resources/Localization/AppResources.si.resx +++ b/src/Core/Resources/Localization/AppResources.si.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.sk.resx b/src/Core/Resources/Localization/AppResources.sk.resx index 0570f3fb9..1f181fca6 100644 --- a/src/Core/Resources/Localization/AppResources.sk.resx +++ b/src/Core/Resources/Localization/AppResources.sk.resx @@ -2820,6 +2820,9 @@ Chcete prepnúť na toto konto? Pokračovať v kontaktovaní podpory? + + Pokračovať na zásady ochrany osobných údajov? + Pokračovať v obchode s aplikáciami? @@ -2839,6 +2842,9 @@ Chcete prepnúť na toto konto? Nemôžete nájsť, čo hľadáte? Obráťte sa na podporu Bitwarden na stránke bitwarden.com. + + Pozrite si naše zásady ochrany osobných údajov na bitwarden.com. + Preskúmajte ďalšie funkcie svojho účtu na Bitwarden vo webovej aplikácii. diff --git a/src/Core/Resources/Localization/AppResources.sl.resx b/src/Core/Resources/Localization/AppResources.sl.resx index 4bf6e0186..ad03bc10b 100644 --- a/src/Core/Resources/Localization/AppResources.sl.resx +++ b/src/Core/Resources/Localization/AppResources.sl.resx @@ -2820,6 +2820,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2839,6 +2842,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.sr.resx b/src/Core/Resources/Localization/AppResources.sr.resx index 5d48477be..914204593 100644 --- a/src/Core/Resources/Localization/AppResources.sr.resx +++ b/src/Core/Resources/Localization/AppResources.sr.resx @@ -2822,6 +2822,9 @@ Настави на подршку? + + Желите ли да наставите са политиком приватности? + Настави на радњу апликације? @@ -2841,6 +2844,9 @@ Не можете да пронађете оно што тражите? Контактирајте Bitwarden подршку на bitwarden.com. + + Погледајте нашу политику приватности на bitwarden.com. + Истражите више својстава на Bitwarden налогу на веб апликаији. diff --git a/src/Core/Resources/Localization/AppResources.sv.resx b/src/Core/Resources/Localization/AppResources.sv.resx index 36dfbb272..d31586d4f 100644 --- a/src/Core/Resources/Localization/AppResources.sv.resx +++ b/src/Core/Resources/Localization/AppResources.sv.resx @@ -360,7 +360,7 @@ The title for the tools page. - URI (länk) + URI Label for a uri/url. @@ -862,7 +862,7 @@ Vänligen använd en enhet som stöds och/eller lägg till fler metoder som har Lägg till ny bilaga - Bifogade filer + Bilagor Kunde ej hämta fil. @@ -2822,6 +2822,9 @@ Vill du byta till detta konto? Fortsätt att kontakta supporten? + + Fortsätt till integritetspolicy? + Fortsätt till appbutiken? @@ -2841,6 +2844,9 @@ Vill du byta till detta konto? Hittar du inte det du söker? Hör av dig till Bitwardens support på bitwarden.com. + + Kolla in vår integritetspolicy på bitwarden.com. + Utforska fler funktioner i ditt Bitwarden-konto i webbappen. diff --git a/src/Core/Resources/Localization/AppResources.ta.resx b/src/Core/Resources/Localization/AppResources.ta.resx index aac414db1..94a1c3e23 100644 --- a/src/Core/Resources/Localization/AppResources.ta.resx +++ b/src/Core/Resources/Localization/AppResources.ta.resx @@ -2821,6 +2821,9 @@ ஆதரவைத் தொடர்புகொள்ளத் தொடரவா? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.te.resx b/src/Core/Resources/Localization/AppResources.te.resx index 47405c13b..ef486a762 100644 --- a/src/Core/Resources/Localization/AppResources.te.resx +++ b/src/Core/Resources/Localization/AppResources.te.resx @@ -2821,6 +2821,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2840,6 +2843,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.th.resx b/src/Core/Resources/Localization/AppResources.th.resx index 0ca241cd6..41992dcdc 100644 --- a/src/Core/Resources/Localization/AppResources.th.resx +++ b/src/Core/Resources/Localization/AppResources.th.resx @@ -2828,6 +2828,9 @@ Do you want to switch to this account? Continue to contact support? + + Continue to privacy policy? + Continue to app store? @@ -2847,6 +2850,9 @@ Do you want to switch to this account? Can’t find what you are looking for? Reach out to Bitwarden support on bitwarden.com. + + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. diff --git a/src/Core/Resources/Localization/AppResources.tr.resx b/src/Core/Resources/Localization/AppResources.tr.resx index 2770edfeb..8092c288c 100644 --- a/src/Core/Resources/Localization/AppResources.tr.resx +++ b/src/Core/Resources/Localization/AppResources.tr.resx @@ -2819,6 +2819,9 @@ Bu hesaba geçmek ister misiniz? Destek ekibiyle iletişim kurmak ister misiniz? + + Continue to privacy policy? + App Store'a gitmek ister misiniz? @@ -2838,6 +2841,9 @@ Bu hesaba geçmek ister misiniz? Aradığınızı bulamadınız mı? bitwarden.com sitesinden Bitwarden destek ekibine ulaşabilirsiniz. + + Check out our privacy policy on bitwarden.com. + Web uygulamasında Bitwarden hesabınızın diğer özelliklerini keşfedin. diff --git a/src/Core/Resources/Localization/AppResources.uk.resx b/src/Core/Resources/Localization/AppResources.uk.resx index ede3e1741..8dfcbe141 100644 --- a/src/Core/Resources/Localization/AppResources.uk.resx +++ b/src/Core/Resources/Localization/AppResources.uk.resx @@ -2820,6 +2820,9 @@ Перейти до зв'язку зі службою підтримки? + + Перейти до політики приватності? + Продовжити в App Store? @@ -2839,6 +2842,9 @@ Не вдалося знайти те, що шукаєте? Зверніться до служби підтримки на bitwarden.com. + + Ознайомтеся з нашою політикою приватності на bitwarden.com. + Ознайомтеся з іншими функціями вашого облікового запису Bitwarden у вебпрограмі. diff --git a/src/Core/Resources/Localization/AppResources.vi.resx b/src/Core/Resources/Localization/AppResources.vi.resx index 85ede1dc8..7f1cf476d 100644 --- a/src/Core/Resources/Localization/AppResources.vi.resx +++ b/src/Core/Resources/Localization/AppResources.vi.resx @@ -2821,6 +2821,9 @@ Bạn có muốn chuyển sang tài khoản này không? Vẫn liên hệ hỗ trợ? + + Đồng ý với chính sách bảo mật? + Vẫn tiếp tục đến cửa hàng ứng dụng? @@ -2840,6 +2843,9 @@ Bạn có muốn chuyển sang tài khoản này không? Không tìm thấy? Hãy liên hệ với bộ phận hỗ trợ của Bitwarden trên bitwarden.com. + + Đọc chính sách bảo mật trên bitwarden.com. + Khám phá thêm các tính năng của tài khoản Bitwarden của bạn trên bản web. diff --git a/src/Core/Resources/Localization/AppResources.zh-Hans.resx b/src/Core/Resources/Localization/AppResources.zh-Hans.resx index 0fa4bbbf9..eaa11b475 100644 --- a/src/Core/Resources/Localization/AppResources.zh-Hans.resx +++ b/src/Core/Resources/Localization/AppResources.zh-Hans.resx @@ -2820,6 +2820,9 @@ 接下来要联系支持吗? + + 接下来查看隐私政策吗? + 接下来前往 App Store 吗? @@ -2839,6 +2842,9 @@ 找不到您想要的吗?请在 bitwarden.com 上联系 Bitwarden 支持。 + + 在 bitwarden.com 上查看我们的隐私政策。 + 在网页应用上探索您的 Bitwarden 账户的更多功能。 diff --git a/src/Core/Resources/Localization/AppResources.zh-Hant.resx b/src/Core/Resources/Localization/AppResources.zh-Hant.resx index 1455e4e0b..9253fb692 100644 --- a/src/Core/Resources/Localization/AppResources.zh-Hant.resx +++ b/src/Core/Resources/Localization/AppResources.zh-Hant.resx @@ -2820,6 +2820,9 @@ 接下來聯絡支援嗎? + + Continue to privacy policy? + 接下來造訪 App Store 嗎? @@ -2839,6 +2842,9 @@ 不能找到你想要的?請在 bitwarden.com 上聯絡 Bitwarden 支援。 + + Check out our privacy policy on bitwarden.com. + 在 Web 應用程式上探索 Bitwarden 帳戶的更多功能。 @@ -2862,12 +2868,12 @@ 帳戶已登出。 - Your organization permissions were updated, requiring you to set a master password. + 您的組織權限已更新,需要您設定主密碼。 - Your organization requires you to set a master password. + 您的組織要求您設定主密碼。 - Set up an unlock option to change your vault timeout action. + 設定一個解鎖方式來變更您的密碼庫逾時動作。 diff --git a/src/Core/Resources/Styles/Base.xaml b/src/Core/Resources/Styles/Base.xaml index 34302c4d9..1eaed8e11 100644 --- a/src/Core/Resources/Styles/Base.xaml +++ b/src/Core/Resources/Styles/Base.xaml @@ -557,6 +557,12 @@ +