1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-16 00:03:22 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
Federico Maccaroni
2cdb5a9c74 PM-7963 Fix vault timeout immediately on Android Fido2 autofill 2024-05-10 17:54:56 -03:00
25 changed files with 322 additions and 273 deletions

View File

@@ -24,7 +24,7 @@ jobs:
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
steps:
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
submodules: 'true'
@@ -80,7 +80,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
fetch-depth: 0
ref: ${{ inputs.ref }}

View File

@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Set up CLOC
run: |
@@ -40,7 +40,7 @@ jobs:
hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
steps:
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
submodules: 'true'
@@ -109,7 +109,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
fetch-depth: 0
@@ -335,7 +335,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Login to Azure - CI Subscription
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
@@ -470,7 +470,7 @@ jobs:
echo "GitHub event: $GITHUB_EVENT"
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
submodules: 'true'
@@ -718,7 +718,7 @@ jobs:
_CROWDIN_PROJECT_ID: "269690"
steps:
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Login to Azure - CI Subscription
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
@@ -733,7 +733,7 @@ jobs:
secrets: "crowdin-api-token"
- name: Upload Sources
uses: crowdin/github-action@8c663f791efc0498270241e9923a8853c99a3a8e # v1.20.3
uses: crowdin/github-action@67705afb6985401459cd143d5f5f00c9dc212f23 # v1.20.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}

View File

@@ -24,7 +24,7 @@ jobs:
secrets: "github-pat-bitwarden-devops-bot-repo-scope"
- name: Checkout main
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
ref: main
token: ${{ steps.retrieve-bot-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}

View File

@@ -15,7 +15,7 @@ jobs:
_CROWDIN_PROJECT_ID: "269690"
steps:
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Login to Azure - CI Subscription
uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0
@@ -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@8c663f791efc0498270241e9923a8853c99a3a8e # v1.20.3
uses: crowdin/github-action@67705afb6985401459cd143d5f5f00c9dc212f23 # v1.20.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}

View File

@@ -38,7 +38,7 @@ jobs:
fi
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Check Release Version
id: version
@@ -65,6 +65,7 @@ jobs:
description: 'Deployment ${{ steps.version.outputs.version }} from branch ${{ steps.branch.outputs.branch-name }}'
task: release
- name: Download all artifacts
if: ${{ inputs.release_type != 'Dry Run' }}
uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3.1.4
@@ -125,7 +126,7 @@ jobs:
if: inputs.fdroid_publish
steps:
- name: Checkout repo
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
- name: Download F-Droid .apk artifact
if: ${{ inputs.release_type != 'Dry Run' }}
@@ -151,7 +152,9 @@ jobs:
node-version: '16.x'
- name: Set up F-Droid server
run: pip install git+https://gitlab.com/fdroid/fdroidserver.git
run: |
sudo apt-get -qq update
sudo apt-get -qqy install --no-install-recommends fdroidserver wget
- name: Set up Git credentials
env:
@@ -164,10 +167,9 @@ jobs:
- name: Print environment
run: |
echo "Node Version: $(node --version)"
echo "NPM Version: $(npm --version)"
echo "Git Version: $(git --version)"
echo "F-Droid Server Version: $(fdroid --version)"
node --version
npm --version
git --version
echo "GitHub ref: $GITHUB_REF"
echo "GitHub event: $GITHUB_EVENT"
@@ -192,30 +194,27 @@ jobs:
env:
FDROID_STORE_KEYSTORE_PASSWORD: ${{ secrets.FDROID_STORE_KEYSTORE_PASSWORD }}
run: |
# Create required directories.
cd $GITHUB_WORKSPACE
mkdir dist
mkdir -p store/temp/fdroid
mkdir -p store/fdroid/repo
# Configure F-Droid server.
cp CNAME dist/
chmod 600 store/fdroid/config.yml store/fdroid/keystore.jks
cp CNAME ./dist
cd store
chmod 600 fdroid/config.py fdroid/keystore.jks
mkdir -p temp/fdroid
TEMP_DIR="$GITHUB_WORKSPACE/store/temp/fdroid"
echo "keypass: $FDROID_STORE_KEYSTORE_PASSWORD" >> store/fdroid/config.yml
echo "keystorepass: $FDROID_STORE_KEYSTORE_PASSWORD" >> store/fdroid/config.yml
echo "local_copy_dir: $TEMP_DIR" >> store/fdroid/config.yml
mv $GITHUB_WORKSPACE/com.x8bit.bitwarden-fdroid.apk store/fdroid/repo/
# Run update and deploy.
cd store/fdroid
cd fdroid
echo "keypass=\"$FDROID_STORE_KEYSTORE_PASSWORD\"" >>config.py
echo "keystorepass=\"$FDROID_STORE_KEYSTORE_PASSWORD\"" >>config.py
echo "local_copy_dir=\"$TEMP_DIR\"" >>config.py
mkdir -p repo
mv $GITHUB_WORKSPACE/com.x8bit.bitwarden-fdroid.apk ./repo/
fdroid update
fdroid deploy
cd ../..
# Move files for distribution.
rm -rf store/temp/fdroid/archive
mv -v store/temp/fdroid dist
cp store/fdroid/index.html store/fdroid/btn.png store/fdroid/qr.png dist/fdroid
fdroid server update
cd ..
rm -rf temp/fdroid/archive
mv -v temp/fdroid ../dist
cd fdroid
cp index.html btn.png qr.png ../../dist/fdroid
cd $GITHUB_WORKSPACE
- name: Deploy to gh-pages
if: ${{ inputs.release_type != 'Dry Run' }}

View File

@@ -27,7 +27,7 @@ jobs:
version: ${{ inputs.version_number_override }}
- name: Checkout Branch
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
ref: main
@@ -264,7 +264,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout Branch
uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5
uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
with:
ref: main

View File

@@ -1,26 +1,31 @@
using Android.App;
using System.Diagnostics;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using AndroidX.Activity.Result;
using AndroidX.Activity.Result.Contract;
using AndroidX.Credentials;
using AndroidX.Credentials.Exceptions;
using AndroidX.Credentials.Provider;
using AndroidX.Credentials.WebAuthn;
using Bit.App.Droid.Utilities;
using Bit.App.Abstractions;
using Bit.Core.Abstractions;
using Bit.Core.Utilities;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities.Fido2;
using Bit.Core.Services;
using Bit.App.Droid.Utilities;
using Bit.App.Platforms.Android.Autofill;
using AndroidX.Credentials.Exceptions;
using Bit.Core.Abstractions;
using Bit.Core.Resources.Localization;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Bit.Core.Utilities.Fido2;
using Org.Json;
namespace Bit.Droid.Autofill
{
[Activity(
NoHistory = true,
LaunchMode = LaunchMode.SingleTop)]
NoHistory = false,
LaunchMode = LaunchMode.SingleInstance)]
[Register("com.x8bit.bitwarden.CredentialProviderSelectionActivity")]
public class CredentialProviderSelectionActivity : MauiAppCompatActivity
{
private LazyResolve<IFido2MediatorService> _fido2MediatorService = new LazyResolve<IFido2MediatorService>();
@@ -31,6 +36,8 @@ namespace Bit.Droid.Autofill
private LazyResolve<IUserVerificationMediatorService> _userVerificationMediatorService = new LazyResolve<IUserVerificationMediatorService>();
private LazyResolve<IDeviceActionService> _deviceActionService = new LazyResolve<IDeviceActionService>();
private ActivityResultLauncher _activityResultLauncher;
protected override void OnCreate(Bundle bundle)
{
Intent?.Validate();
@@ -100,8 +107,14 @@ namespace Bit.Droid.Autofill
cipherId,
false,
() => hasVaultBeenUnlockedInThisTransaction,
RpId
);
RpId
);
_activityResultLauncher = RegisterForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback(result =>
{
_fido2GetAssertionUserInterface.Value.ConfirmVaultUnlocked(result.ResultCode == (int)Result.Ok);
}));
var clientAssertParams = new Fido2ClientAssertCredentialParams
{
@@ -171,6 +184,19 @@ namespace Bit.Droid.Autofill
}
}
public void LaunchToUnlock()
{
if (_activityResultLauncher is null)
{
throw new InvalidOperationException("There is no activity result launcher available");
}
var intent = new Intent(this, typeof(MainActivity));
intent.PutExtra(CredentialProviderConstants.Fido2CredentialAction, CredentialProviderConstants.Fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout);
_activityResultLauncher.Launch(intent);
}
private void FailAndFinish()
{
var result = new Intent();
@@ -180,4 +206,12 @@ namespace Bit.Droid.Autofill
Finish();
}
}
public class ActivityResultCallback : Java.Lang.Object, IActivityResultCallback
{
readonly Action<ActivityResult> _callback;
public ActivityResultCallback(Action<ActivityResult> callback) => _callback = callback;
public ActivityResultCallback(TaskCompletionSource<ActivityResult> tcs) => _callback = tcs.SetResult;
public void OnActivityResult(Java.Lang.Object p0) => _callback((ActivityResult)p0);
}
}

View File

@@ -1,6 +1,7 @@
using Bit.Core.Abstractions;
using Bit.Core.Services;
using Bit.Core.Utilities.Fido2;
using Bit.Droid.Autofill;
namespace Bit.App.Platforms.Android.Autofill
{
@@ -10,6 +11,11 @@ namespace Bit.App.Platforms.Android.Autofill
bool userVerified,
Func<bool> hasVaultBeenUnlockedInThisTransaction,
string rpId);
/// <summary>
/// Call this after the vault was unlocked so that Fido2 credential autofill can proceed.
/// </summary>
void ConfirmVaultUnlocked(bool unlocked);
}
public class Fido2GetAssertionUserInterface : Core.Utilities.Fido2.Fido2GetAssertionUserInterface, IFido2AndroidGetAssertionUserInterface
@@ -19,6 +25,8 @@ namespace Bit.App.Platforms.Android.Autofill
private readonly ICipherService _cipherService;
private readonly IUserVerificationMediatorService _userVerificationMediatorService;
private TaskCompletionSource<bool> _unlockVaultTcs;
public Fido2GetAssertionUserInterface(IStateService stateService,
IVaultTimeoutService vaultTimeoutService,
ICipherService cipherService,
@@ -46,11 +54,38 @@ namespace Bit.App.Platforms.Android.Autofill
{
if (!await _stateService.IsAuthenticatedAsync() || await _vaultTimeoutService.IsLockedAsync())
{
// this should never happen but just in case.
throw new InvalidOperationException("Not authed or vault locked");
if (await _stateService.GetVaultTimeoutAsync() != 0)
{
// this should never happen but just in case.
throw new InvalidOperationException("Not authed or vault locked");
}
// if vault timeout is immediate, then we need to unlock the vault
if (!await NavigateAndWaitForUnlockAsync())
{
throw new InvalidOperationException("Couldn't unlock with immediate timeout");
}
}
}
public void ConfirmVaultUnlocked(bool unlocked) => _unlockVaultTcs?.TrySetResult(unlocked);
private async Task<bool> NavigateAndWaitForUnlockAsync()
{
var credentialProviderSelectionActivity = Platform.CurrentActivity as CredentialProviderSelectionActivity;
if (credentialProviderSelectionActivity == null)
{
throw new InvalidOperationException("Can't get current activity");
}
_unlockVaultTcs?.TrySetCanceled();
_unlockVaultTcs = new TaskCompletionSource<bool>();
credentialProviderSelectionActivity.LaunchToUnlock();
return await _unlockVaultTcs.Task;
}
private async Task<bool> VerifyUserAsync(string selectedCipherId, Fido2UserVerificationPreference userVerificationPreference, string rpId, bool vaultUnlockedDuringThisTransaction)
{
try

View File

@@ -23,11 +23,14 @@ using Resource = Bit.Core.Resource;
using Application = Android.App.Application;
using Bit.Core.Services;
using Bit.Core.Utilities.Fido2;
using Bit.Core.Utilities;
namespace Bit.Droid.Services
{
public class DeviceActionService : IDeviceActionService
{
public const int DELAY_LOCK_LOGOUT_FOR_FIDO2_AUTOFILL_ON_IMMEDIATE_TIMEOUT_MS = 15000;
private readonly IStateService _stateService;
private readonly IMessagingService _messagingService;
private AlertDialog _progressDialog;
@@ -578,6 +581,15 @@ namespace Bit.Droid.Services
{
await ExecuteFido2GetCredentialAsync(appOptions);
}
else if (appOptions.Fido2CredentialAction == CredentialProviderConstants.Fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout
&&
ServiceContainer.TryResolve<IVaultTimeoutService>(out var vaultTimeoutService))
{
vaultTimeoutService.DelayLockAndLogoutMs = DELAY_LOCK_LOGOUT_FOR_FIDO2_AUTOFILL_ON_IMMEDIATE_TIMEOUT_MS;
activity.SetResult(Result.Ok);
activity.Finish();
}
else if (appOptions.Fido2CredentialAction == CredentialProviderConstants.Fido2CredentialCreate)
{
await ExecuteFido2CreateCredentialAsync();

View File

@@ -25,7 +25,6 @@ namespace Bit.App.Pages
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>();
_vm = BindingContext as LoginPageViewModel;
_vm.Page = this;
_vm.FromIosExtension = _appOptions?.IosExtension ?? false;
_vm.StartTwoFactorAction = () => MainThread.BeginInvokeOnMainThread(async () => await StartTwoFactorAsync());
_vm.LogInSuccessAction = () => MainThread.BeginInvokeOnMainThread(async () => await LogInSuccessAsync());
_vm.LogInWithDeviceAction = () => StartLoginWithDeviceAsync().FireAndForget();

View File

@@ -19,7 +19,6 @@ namespace Bit.App.Pages
_vm.Email = email;
_vm.AuthRequestType = authRequestType;
_vm.AuthingWithSso = authingWithSso;
_vm.FromIosExtension = _appOptions?.IosExtension ?? false;
_vm.StartTwoFactorAction = () => MainThread.BeginInvokeOnMainThread(async () => await StartTwoFactorAsync());
_vm.LogInSuccessAction = () => MainThread.BeginInvokeOnMainThread(async () => await LogInSuccessAsync());
_vm.UpdateTempPasswordAction = () => MainThread.BeginInvokeOnMainThread(async () => await UpdateTempPasswordAsync());

View File

@@ -1,6 +1,4 @@
using Bit.App.Models;
namespace Bit.App.Pages
namespace Bit.App.Pages
{
public partial class RegisterPage : BaseContentPage
{
@@ -8,12 +6,11 @@ namespace Bit.App.Pages
private bool _inputFocused;
public RegisterPage(HomePage homePage, AppOptions appOptions = null)
public RegisterPage(HomePage homePage)
{
InitializeComponent();
_vm = BindingContext as RegisterPageViewModel;
_vm.Page = this;
_vm.FromIosExtension = appOptions?.IosExtension ?? false;
_vm.RegistrationSuccess = () => MainThread.BeginInvokeOnMainThread(async () => await RegistrationSuccessAsync(homePage));
_vm.CloseAction = async () =>
{

View File

@@ -28,7 +28,6 @@ namespace Bit.App.Pages
_vm = BindingContext as TwoFactorPageViewModel;
_vm.Page = this;
_vm.AuthingWithSso = authingWithSso ?? false;
_vm.FromIosExtension = _appOptions?.IosExtension ?? false;
_vm.StartSetPasswordAction = () =>
MainThread.BeginInvokeOnMainThread(async () => await StartSetPasswordAsync());
_vm.TwoFactorAuthSuccessAction = () =>

View File

@@ -11,13 +11,6 @@ using Bit.Core.Models.Request;
using Bit.Core.Resources.Localization;
using Bit.Core.Utilities;
using Newtonsoft.Json;
using Bit.Core.Services;
#if IOS
using WebAuthenticator = Bit.Core.Utilities.MAUI.WebAuthenticator;
using WebAuthenticatorResult = Bit.Core.Utilities.MAUI.WebAuthenticatorResult;
using WebAuthenticatorOptions = Bit.Core.Utilities.MAUI.WebAuthenticatorOptions;
#endif
namespace Bit.App.Pages
{
@@ -143,7 +136,6 @@ namespace Bit.App.Pages
nameof(ShowTryAgain),
});
}
public ICommand SubmitCommand { get; }
public ICommand MoreCommand { get; }
public ICommand AuthenticateWithDuoFramelessCommand { get; }
@@ -269,11 +261,7 @@ namespace Bit.App.Pages
authResult = await WebAuthenticator.AuthenticateAsync(new WebAuthenticatorOptions
{
Url = new Uri(url),
CallbackUrl = new Uri(Constants.DuoCallback),
#if IOS
ShouldUseSharedApplicationKeyWindow = FromIosExtension
#endif
CallbackUrl = new Uri(Constants.DuoCallback)
});
}
catch (TaskCanceledException)
@@ -360,9 +348,6 @@ namespace Bit.App.Pages
Url = new Uri(url),
CallbackUrl = new Uri(callbackUri),
PrefersEphemeralWebBrowserSession = true,
#if IOS
ShouldUseSharedApplicationKeyWindow = FromIosExtension
#endif
};
authResult = await WebAuthenticator.AuthenticateAsync(options);
}

View File

@@ -6,12 +6,6 @@ using Bit.App.Utilities;
using Bit.Core.Abstractions;
using Microsoft.Maui.Authentication;
#if IOS
using WebAuthenticator = Bit.Core.Utilities.MAUI.WebAuthenticator;
using WebAuthenticatorResult = Bit.Core.Utilities.MAUI.WebAuthenticatorResult;
using WebAuthenticatorOptions = Bit.Core.Utilities.MAUI.WebAuthenticatorOptions;
#endif
namespace Bit.App.Pages
{
public abstract class CaptchaProtectedViewModel : BaseViewModel
@@ -22,8 +16,6 @@ namespace Bit.App.Pages
protected abstract IPlatformUtilsService platformUtilsService { get; }
protected string _captchaToken = null;
public bool FromIosExtension { get; set; }
protected async Task<bool> HandleCaptchaAsync(string captchaSiteKey, bool needsCaptcha, Func<Task> onSuccess)
{
if (!needsCaptcha)
@@ -69,9 +61,6 @@ namespace Bit.App.Pages
Url = new Uri(url),
CallbackUrl = new Uri(callbackUri),
PrefersEphemeralWebBrowserSession = false,
#if IOS
ShouldUseSharedApplicationKeyWindow = FromIosExtension
#endif
};
authResult = await WebAuthenticator.AuthenticateAsync(options);
}

View File

@@ -2140,10 +2140,10 @@ Scanning will happen automatically.</value>
<value>Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s)</value>
</data>
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
<value>Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value>
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value>
</data>
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
<value>Your organisation policies have set your vault timeout action to {0}.</value>
<value>Your organization policies have set your vault timeout action to {0}.</value>
</data>
<data name="VaultTimeoutToLarge" xml:space="preserve">
<value>Your vault timeout exceeds the restrictions set by your organisation.</value>
@@ -2626,7 +2626,7 @@ Do you want to switch to this account?</value>
<value>Region</value>
</data>
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
<value>Your master password does not meet one or more of your organisation policies. 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.</value>
<value>Your master password does not meet one or more of your organization policies. 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.</value>
</data>
<data name="CurrentMasterPassword" xml:space="preserve">
<value>Current master password</value>
@@ -2768,7 +2768,7 @@ Do you want to switch to this account?</value>
<value>Account security</value>
</data>
<data name="BitwardenHelpCenter" xml:space="preserve">
<value>Bitwarden Help Centre</value>
<value>Bitwarden Help Center</value>
</data>
<data name="ContactBitwardenSupport" xml:space="preserve">
<value>Contact Bitwarden support</value>
@@ -2827,7 +2827,7 @@ Do you want to switch to this account?</value>
<comment>The parameter is an URL, like bitwarden.com.</comment>
</data>
<data name="ContinueToHelpCenter" xml:space="preserve">
<value>Continue to Help centre?</value>
<value>Continue to Help center?</value>
</data>
<data name="ContinueToContactSupport" xml:space="preserve">
<value>Continue to contact support?</value>
@@ -2852,7 +2852,7 @@ Do you want to switch to this account?</value>
<comment>The parameter is an URL, like vault.bitwarden.com.</comment>
</data>
<data name="LearnMoreAboutHowToUseBitwardenOnTheHelpCenter" xml:space="preserve">
<value>Learn more about how to use Bitwarden on the Help centre.</value>
<value>Learn more about how to use Bitwarden on the Help center.</value>
</data>
<data name="ContactSupportDescriptionLong" xml:space="preserve">
<value>Cant find what you are looking for? Reach out to Bitwarden support on bitwarden.com.</value>
@@ -2864,7 +2864,7 @@ Do you want to switch to this account?</value>
<value>Explore more features of your Bitwarden account on the web app.</value>
</data>
<data name="LearnAboutOrganizationsDescriptionLong" xml:space="preserve">
<value>Bitwarden allows you to share your vault items with others by using an organisation. Learn more on the bitwarden.com website.</value>
<value>Bitwarden allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website.</value>
</data>
<data name="RateAppDescriptionLong" xml:space="preserve">
<value>Help others find out if Bitwarden is right for them. Visit the app store and leave a rating now.</value>
@@ -2883,10 +2883,10 @@ Do you want to switch to this account?</value>
<value>Account logged out.</value>
</data>
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
<value>Your organisation permissions were updated, requiring you to set a master password.</value>
<value>Your organization permissions were updated, requiring you to set a master password.</value>
</data>
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
<value>Your organisation requires you to set a master password.</value>
<value>Your organization requires you to set a master password.</value>
</data>
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
<value>Set up an unlock option to change your vault timeout action.</value>
@@ -2975,10 +2975,10 @@ Do you want to switch to this account?</value>
<value>Your passkey will be saved to your Bitwarden vault for {0}</value>
</data>
<data name="OrganizationUnassignedItemsMessageUSEUDescriptionLong" xml:space="preserve">
<value>Unassigned organisation items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
<value>Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
</data>
<data name="OrganizationUnassignedItemsMessageSelfHost041624DescriptionLong" xml:space="preserve">
<value>On May 16, 2024, unassigned organisation items will no longer be visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
<value>On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
</data>
<data name="RemindMeLater" xml:space="preserve">
<value>Remind me later</value>

View File

@@ -2154,10 +2154,10 @@ Scanning will happen automatically.</value>
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s)</value>
</data>
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
<value>Your organisation policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value>
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value>
</data>
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
<value>Your organisation policies have set your vault timeout action to {0}.</value>
<value>Your organization policies have set your vault timeout action to {0}.</value>
</data>
<data name="VaultTimeoutToLarge" xml:space="preserve">
<value>Your vault timeout exceeds the restrictions set by your organization.</value>
@@ -2610,7 +2610,7 @@ Do you want to switch to this account?</value>
<value>Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?</value>
</data>
<data name="OrganizationSsoIdentifierRequired" xml:space="preserve">
<value>Organisation SSO identifier required.</value>
<value>Organization SSO identifier required.</value>
</data>
<data name="AddTheKeyToAnExistingOrNewItem" xml:space="preserve">
<value>Add the key to an existing or new item</value>
@@ -2640,7 +2640,7 @@ Do you want to switch to this account?</value>
<value>Region</value>
</data>
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
<value>Your master password does not meet one or more of your organisation policies. 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.</value>
<value>Your master password does not meet one or more of your organization policies. 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.</value>
</data>
<data name="CurrentMasterPassword" xml:space="preserve">
<value>Current master password</value>
@@ -2782,7 +2782,7 @@ Do you want to switch to this account?</value>
<value>Account security</value>
</data>
<data name="BitwardenHelpCenter" xml:space="preserve">
<value>Bitwarden Help Centre</value>
<value>Bitwarden Help Center</value>
</data>
<data name="ContactBitwardenSupport" xml:space="preserve">
<value>Contact Bitwarden support</value>
@@ -2841,7 +2841,7 @@ Do you want to switch to this account?</value>
<comment>The parameter is an URL, like bitwarden.com.</comment>
</data>
<data name="ContinueToHelpCenter" xml:space="preserve">
<value>Continue to Help centre?</value>
<value>Continue to Help center?</value>
</data>
<data name="ContinueToContactSupport" xml:space="preserve">
<value>Continue to contact support?</value>
@@ -2866,7 +2866,7 @@ Do you want to switch to this account?</value>
<comment>The parameter is an URL, like vault.bitwarden.com.</comment>
</data>
<data name="LearnMoreAboutHowToUseBitwardenOnTheHelpCenter" xml:space="preserve">
<value>Learn more about how to use Bitwarden on the Help centre.</value>
<value>Learn more about how to use Bitwarden on the Help center.</value>
</data>
<data name="ContactSupportDescriptionLong" xml:space="preserve">
<value>Cant find what you are looking for? Reach out to Bitwarden support on bitwarden.com.</value>
@@ -2878,7 +2878,7 @@ Do you want to switch to this account?</value>
<value>Explore more features of your Bitwarden account on the web app.</value>
</data>
<data name="LearnAboutOrganizationsDescriptionLong" xml:space="preserve">
<value>Bitwarden allows you to share your vault items with others by using an organisation. Learn more on the bitwarden.com website.</value>
<value>Bitwarden allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website.</value>
</data>
<data name="RateAppDescriptionLong" xml:space="preserve">
<value>Help others find out if Bitwarden is right for them. Visit the app store and leave a rating now.</value>
@@ -2897,10 +2897,10 @@ Do you want to switch to this account?</value>
<value>Account logged out.</value>
</data>
<data name="YourOrganizationPermissionsWereUpdatedRequeringYouToSetAMasterPassword" xml:space="preserve">
<value>Your organisation permissions were updated, requiring you to set a master password.</value>
<value>Your organization permissions were updated, requiring you to set a master password.</value>
</data>
<data name="YourOrganizationRequiresYouToSetAMasterPassword" xml:space="preserve">
<value>Your organisation requires you to set a master password.</value>
<value>Your organization requires you to set a master password.</value>
</data>
<data name="SetUpAnUnlockOptionToChangeYourVaultTimeoutAction" xml:space="preserve">
<value>Set up an unlock option to change your vault timeout action.</value>
@@ -2989,10 +2989,10 @@ Do you want to switch to this account?</value>
<value>Your passkey will be saved to your Bitwarden vault for {0}</value>
</data>
<data name="OrganizationUnassignedItemsMessageUSEUDescriptionLong" xml:space="preserve">
<value>Unassigned organisation items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
<value>Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
</data>
<data name="OrganizationUnassignedItemsMessageSelfHost041624DescriptionLong" xml:space="preserve">
<value>On May 16, 2024, unassigned organisation items will no longer be visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
<value>On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
</data>
<data name="RemindMeLater" xml:space="preserve">
<value>Remind me later</value>

View File

@@ -118,25 +118,25 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<value>Acerca de</value>
<value>About</value>
</data>
<data name="Add" xml:space="preserve">
<value>Engadir</value>
<value>Add</value>
<comment>Add/create a new entity (verb).</comment>
</data>
<data name="AddFolder" xml:space="preserve">
<value>Engadir cartafol</value>
<value>Add Folder</value>
</data>
<data name="AddItem" xml:space="preserve">
<value>Engadir elemento</value>
<value>Add Item</value>
<comment>The title for the add item page.</comment>
</data>
<data name="AnErrorHasOccurred" xml:space="preserve">
<value>Produciuse un erro.</value>
<value>An error has occurred.</value>
<comment>Alert title when something goes wrong.</comment>
</data>
<data name="Back" xml:space="preserve">
<value>Atrás</value>
<value>Back</value>
<comment>Navigate back to the previous screen.</comment>
</data>
<data name="Bitwarden" xml:space="preserve">
@@ -144,155 +144,155 @@
<comment>App name. Shouldn't ever change.</comment>
</data>
<data name="Cancel" xml:space="preserve">
<value>Cancelar</value>
<value>Cancel</value>
<comment>Cancel an operation.</comment>
</data>
<data name="Copy" xml:space="preserve">
<value>Copiar</value>
<value>Copy</value>
<comment>Copy some value to your clipboard.</comment>
</data>
<data name="CopyPassword" xml:space="preserve">
<value>Copiar contrasinal</value>
<value>Copy password</value>
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
</data>
<data name="CopyUsername" xml:space="preserve">
<value>Copiar nome de usuario</value>
<value>Copy username</value>
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
</data>
<data name="Credits" xml:space="preserve">
<value>Créditos</value>
<value>Credits</value>
<comment>Title for page that we use to give credit to resources that we use.</comment>
</data>
<data name="Delete" xml:space="preserve">
<value>Borrar</value>
<value>Delete</value>
<comment>Delete an entity (verb).</comment>
</data>
<data name="Deleting" xml:space="preserve">
<value>Borrando...</value>
<value>Deleting...</value>
<comment>Message shown when interacting with the server</comment>
</data>
<data name="DoYouReallyWantToDelete" xml:space="preserve">
<value>Vostede realmente quere borrar? Isto non pode ser desfeito.</value>
<value>Do you really want to delete? This cannot be undone.</value>
<comment>Confirmation alert message when deleteing something.</comment>
</data>
<data name="Edit" xml:space="preserve">
<value>Editar</value>
<value>Edit</value>
</data>
<data name="EditFolder" xml:space="preserve">
<value>Editar cartafol</value>
<value>Edit folder</value>
</data>
<data name="Email" xml:space="preserve">
<value>Correo electrónico</value>
<value>Email</value>
<comment>Short label for an email address.</comment>
</data>
<data name="EmailAddress" xml:space="preserve">
<value>Enderezo de correo electrónico</value>
<value>Email address</value>
<comment>Full label for a email address.</comment>
</data>
<data name="EmailUs" xml:space="preserve">
<value>Envíanos un correo</value>
<value>Email us</value>
</data>
<data name="EmailUsDescription" xml:space="preserve">
<value>Envíanos un correo directamente para obter axuda ou deixar comentarios.</value>
<value>Email us directly to get help or leave feedback.</value>
</data>
<data name="EnterPIN" xml:space="preserve">
<value>Introduza o seu código PIN.</value>
<value>Enter your PIN code.</value>
</data>
<data name="Favorites" xml:space="preserve">
<value>Favoritos</value>
<value>Favorites</value>
<comment>Title for your favorite items in the vault.</comment>
</data>
<data name="FileBugReport" xml:space="preserve">
<value>Presentar un informe de fallo</value>
<value>File a bug report</value>
</data>
<data name="FileBugReportDescription" xml:space="preserve">
<value>Abrir unha incidencia no noso repositorio de GitHub.</value>
<value>Open an issue at our GitHub repository.</value>
</data>
<data name="FingerprintDirection" xml:space="preserve">
<value>Emprega a túa pegada dactilar para verificar.</value>
<value>Use your fingerprint to verify.</value>
</data>
<data name="Folder" xml:space="preserve">
<value>Cartafol</value>
<value>Folder</value>
<comment>Label for a folder.</comment>
</data>
<data name="FolderCreated" xml:space="preserve">
<value>Creouse un novo cartafol.</value>
<value>New folder created.</value>
</data>
<data name="FolderDeleted" xml:space="preserve">
<value>Cartafol eliminado.</value>
<value>Folder deleted.</value>
</data>
<data name="FolderNone" xml:space="preserve">
<value>Sen cartafois</value>
<value>No Folder</value>
<comment>Items that have no folder specified go in this special "catch-all" folder.</comment>
</data>
<data name="Folders" xml:space="preserve">
<value>Cartafois</value>
<value>Folders</value>
</data>
<data name="FolderUpdated" xml:space="preserve">
<value>Cartafol gardado</value>
<value>Folder saved</value>
</data>
<data name="GoToWebsite" xml:space="preserve">
<value>Ir á páxina web</value>
<value>Go to website</value>
<comment>The button text that allows user to launch the website to their web browser.</comment>
</data>
<data name="HelpAndFeedback" xml:space="preserve">
<value>Axuda e comentarios</value>
<value>Help and feedback</value>
</data>
<data name="Hide" xml:space="preserve">
<value>Agochar</value>
<value>Hide</value>
<comment>Hide a secret value that is currently shown (password).</comment>
</data>
<data name="InternetConnectionRequiredMessage" xml:space="preserve">
<value>Por favor conéctese a Internet antes de continuar.</value>
<value>Please connect to the internet before continuing.</value>
<comment>Description message for the alert when internet connection is required to continue.</comment>
</data>
<data name="InternetConnectionRequiredTitle" xml:space="preserve">
<value>Requírese unha conexión a Internet</value>
<value>Internet connection required</value>
<comment>Title for the alert when internet connection is required to continue.</comment>
</data>
<data name="InvalidMasterPassword" xml:space="preserve">
<value>Contrasinal mestre non válido. Téntao de novo.</value>
<value>Invalid master password. Try again.</value>
</data>
<data name="InvalidPIN" xml:space="preserve">
<value>PIN non válido. Téntao de novo.</value>
<value>Invalid PIN. Try again.</value>
</data>
<data name="Launch" xml:space="preserve">
<value>Abrir</value>
<value>Launch</value>
<comment>The button text that allows user to launch the website to their web browser.</comment>
</data>
<data name="LogIn" xml:space="preserve">
<value>Iniciar sesión</value>
<value>Log In</value>
<comment>The login button text (verb).</comment>
</data>
<data name="LogInNoun" xml:space="preserve">
<value>Inicio de sesión</value>
<value>Login</value>
<comment>Title for login page. (noun)</comment>
</data>
<data name="LogOut" xml:space="preserve">
<value>Pechar sesión</value>
<value>Log out</value>
<comment>The log out button text (verb).</comment>
</data>
<data name="LogoutConfirmation" xml:space="preserve">
<value>Estás seguro de que queres pechar a sesión?</value>
<value>Are you sure you want to log out?</value>
</data>
<data name="RemoveAccount" xml:space="preserve">
<value>Eliminar conta</value>
<value>Remove account</value>
</data>
<data name="RemoveAccountConfirmation" xml:space="preserve">
<value>Estás seguro de que queres eliminar a conta?</value>
<value>Are you sure you want to remove this account?</value>
</data>
<data name="AccountAlreadyAdded" xml:space="preserve">
<value>Conta xa engadida</value>
<value>Account already added</value>
</data>
<data name="SwitchToAlreadyAddedAccountConfirmation" xml:space="preserve">
<value>Gustaríache cambiar a ela agora?</value>
<value>Would you like to switch to it now?</value>
</data>
<data name="MasterPassword" xml:space="preserve">
<value>Contrasinal mestre</value>
<value>Master password</value>
<comment>Label for a master password.</comment>
</data>
<data name="More" xml:space="preserve">
<value>Máis</value>
<value>More</value>
<comment>Text to define that there are more options things to see.</comment>
</data>
<data name="MyVault" xml:space="preserve">

View File

@@ -2330,16 +2330,16 @@ pilih Tambahkan TOTP untuk menyimpan kunci dengan aman</value>
<value>Login attempt by {0} on {1}</value>
</data>
<data name="DeviceType" xml:space="preserve">
<value>Jenis perangkat</value>
<value>Device type</value>
</data>
<data name="IpAddress" xml:space="preserve">
<value>Alamat IP</value>
<value>IP address</value>
</data>
<data name="Time" xml:space="preserve">
<value>Waktu</value>
<value>Time</value>
</data>
<data name="Near" xml:space="preserve">
<value>Dekat</value>
<value>Near</value>
</data>
<data name="ConfirmLogIn" xml:space="preserve">
<value>Confirm login</value>
@@ -2348,10 +2348,10 @@ pilih Tambahkan TOTP untuk menyimpan kunci dengan aman</value>
<value>Deny login</value>
</data>
<data name="JustNow" xml:space="preserve">
<value>Baru saja</value>
<value>Just now</value>
</data>
<data name="XMinutesAgo" xml:space="preserve">
<value>{0} menit yang lalu</value>
<value>{0} minutes ago</value>
</data>
<data name="LogInAccepted" xml:space="preserve">
<value>Login confirmed</value>
@@ -2399,19 +2399,19 @@ pilih Tambahkan TOTP untuk menyimpan kunci dengan aman</value>
<value>Forwarded email alias</value>
</data>
<data name="RandomWord" xml:space="preserve">
<value>Kata acak</value>
<value>Random word</value>
</data>
<data name="EmailRequiredParenthesis" xml:space="preserve">
<value>Email (wajib)</value>
<value>Email (required)</value>
</data>
<data name="DomainNameRequiredParenthesis" xml:space="preserve">
<value>Domain name (required)</value>
</data>
<data name="APIKeyRequiredParenthesis" xml:space="preserve">
<value>Key API (wajib)</value>
<value>API key (required)</value>
</data>
<data name="Service" xml:space="preserve">
<value>Layanan</value>
<value>Service</value>
</data>
<data name="AddyIo" xml:space="preserve">
<value>addy.io</value>
@@ -2450,7 +2450,7 @@ pilih Tambahkan TOTP untuk menyimpan kunci dengan aman</value>
<value>Email Type</value>
</data>
<data name="WebsiteRequired" xml:space="preserve">
<value>Situs web (wajib)</value>
<value>Website (required)</value>
</data>
<data name="UnknownXErrorMessage" xml:space="preserve">
<value>Unknown {0} error occurred.</value>
@@ -2545,13 +2545,13 @@ Do you want to switch to this account?</value>
<value>No pending requests</value>
</data>
<data name="EnableCamerPermissionToUseTheScanner" xml:space="preserve">
<value>Aktifkan izin kamera untuk menggunakan pemindai</value>
<value>Enable camera permission to use the scanner</value>
</data>
<data name="Language" xml:space="preserve">
<value>Bahasa</value>
<value>Language</value>
</data>
<data name="LanguageChangeXDescription" xml:space="preserve">
<value>Bahasa telah diubah ke {0}. Silakan mulai ulang aplikasi untuk melihat perubahan</value>
<value>The language has been changed to {0}. Please restart the app to see the change</value>
</data>
<data name="LanguageChangeRequiresAppRestart" xml:space="preserve">
<value>Language change requires app restart</value>
@@ -2563,25 +2563,25 @@ Do you want to switch to this account?</value>
<value>Important</value>
</data>
<data name="YourMasterPasswordCannotBeRecoveredIfYouForgetItXCharactersMinimum" xml:space="preserve">
<value>Sandi utama Anda tidak akan bisa dipulihkan jika Anda lupa! Setidaknya {0} karakter.</value>
<value>Your master password cannot be recovered if you forget it! {0} characters minimum.</value>
</data>
<data name="WeakMasterPassword" xml:space="preserve">
<value>Sandi Utama Lemah</value>
<value>Weak Master Password</value>
</data>
<data name="WeakPasswordIdentifiedUseAStrongPasswordToProtectYourAccount" xml:space="preserve">
<value>Sandi lemah ditemukan. Gunakan sandi yang kuat untuk melindungi akun Anda. Apakah Anda yakin ingin menggunakan sandi yang lemah?</value>
<value>Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password?</value>
</data>
<data name="Weak" xml:space="preserve">
<value>Lemah</value>
<value>Weak</value>
</data>
<data name="Good" xml:space="preserve">
<value>Baik</value>
<value>Good</value>
</data>
<data name="Strong" xml:space="preserve">
<value>Kuat</value>
<value>Strong</value>
</data>
<data name="CheckKnownDataBreachesForThisPassword" xml:space="preserve">
<value>Periksa pelanggaran data yang diketahui untuk kata sandi ini</value>
<value>Check known data breaches for this password</value>
</data>
<data name="ExposedMasterPassword" xml:space="preserve">
<value>Exposed Master Password</value>
@@ -2611,7 +2611,7 @@ Do you want to switch to this account?</value>
<value>There are no items that match the search</value>
</data>
<data name="US" xml:space="preserve">
<value>AS</value>
<value>US</value>
</data>
<data name="EU" xml:space="preserve">
<value>EU</value>
@@ -2653,16 +2653,16 @@ Do you want to switch to this account?</value>
<value>Passkey</value>
</data>
<data name="Passkeys" xml:space="preserve">
<value>Passkey</value>
<value>Passkeys</value>
</data>
<data name="Application" xml:space="preserve">
<value>Aplikasi</value>
<value>Application</value>
</data>
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
<value>You cannot edit passkey application because it would invalidate the passkey</value>
</data>
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
<value>Passkey tidak akan disalin</value>
<value>Passkey will not be copied</value>
</data>
<data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve">
<value>The passkey will not be copied to the cloned item. Do you want to continue cloning this item?</value>
@@ -2759,25 +2759,25 @@ Do you want to switch to this account?</value>
<value>Logging in on</value>
</data>
<data name="Vault" xml:space="preserve">
<value>Brankas</value>
<value>Vault</value>
</data>
<data name="Appearance" xml:space="preserve">
<value>Tampilan</value>
<value>Appearance</value>
</data>
<data name="AccountSecurity" xml:space="preserve">
<value>Keamanan akun</value>
<value>Account security</value>
</data>
<data name="BitwardenHelpCenter" xml:space="preserve">
<value>Pusat Bantuan Bitwarden</value>
<value>Bitwarden Help Center</value>
</data>
<data name="ContactBitwardenSupport" xml:space="preserve">
<value>Hubungi dukungan Bitwarden</value>
<value>Contact Bitwarden support</value>
</data>
<data name="CopyAppInformation" xml:space="preserve">
<value>Salin informasi aplikasi</value>
<value>Copy app information</value>
</data>
<data name="SyncNow" xml:space="preserve">
<value>Sinkronkan sekarang</value>
<value>Sync now</value>
</data>
<data name="UnlockOptions" xml:space="preserve">
<value>Unlock options</value>
@@ -2793,25 +2793,25 @@ Do you want to switch to this account?</value>
<comment>A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing.</comment>
</data>
<data name="OneHourAndOneMinute" xml:space="preserve">
<value>Satu jam satu menit</value>
<value>One hour and one minute</value>
</data>
<data name="OneHourAndXMinute" xml:space="preserve">
<value>1 jam {0} menit</value>
<value>One hour and {0} minutes</value>
</data>
<data name="XHoursAndOneMinute" xml:space="preserve">
<value>{0} jam 1 menit</value>
<value>{0} hours and one minute</value>
</data>
<data name="XHoursAndYMinutes" xml:space="preserve">
<value>{0} jam {1} menit</value>
<value>{0} hours and {1} minutes</value>
</data>
<data name="XHours" xml:space="preserve">
<value>{0} jam</value>
<value>{0} hours</value>
</data>
<data name="PasskeyManagementExplanationLong" xml:space="preserve">
<value>Use Bitwarden to save new passkeys and log in with passkeys stored in your vault.</value>
</data>
<data name="AutofillServicesExplanationLong" xml:space="preserve">
<value>Android Autofill Framework digunakan untuk membantu Anda mengisi informasi login ke aplikasi lain di perangkat Anda.</value>
<value>The Android Autofill Framework is used to assist in filling login information into other apps on your device.</value>
</data>
<data name="UseInlineAutofillExplanationLong" xml:space="preserve">
<value>Use inline autofill if your selected keyboard supports it. Otherwise, use the default overlay.</value>

View File

@@ -1440,7 +1440,7 @@ Skanning skjer automatisk.</value>
<value>Vel ei samskipnad du ynskjer å flytta denne oppføringa til. Ved å flytta ei oppføring til ei samskipnad fører ein eigarskapen til oppføringa til den samskipnaden. Du vil ikkje lenger ha bein eigarskap til denne oppføringa etter ho er flytta.</value>
</data>
<data name="NumberOfWords" xml:space="preserve">
<value>Antal ord</value>
<value>Number of words</value>
</data>
<data name="Passphrase" xml:space="preserve">
<value>Passphrase</value>
@@ -1492,7 +1492,7 @@ Skanning skjer automatisk.</value>
<value>Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application.</value>
</data>
<data name="LoggedInAsOn" xml:space="preserve">
<value>Logga inn som {0} {1}.</value>
<value>Logged in as {0} on {1}.</value>
<comment>ex: Logged in as user@example.com on bitwarden.com.</comment>
</data>
<data name="VaultLockedMasterPassword" xml:space="preserve">
@@ -1550,13 +1550,13 @@ Skanning skjer automatisk.</value>
<value>Brigda fargetemaet på appen</value>
</data>
<data name="ThemeDefault" xml:space="preserve">
<value>Standard (System)</value>
<value>Default (System)</value>
</data>
<data name="DefaultDarkTheme" xml:space="preserve">
<value>Standard mørkt tema</value>
<value>Default dark theme</value>
</data>
<data name="CopyNotes" xml:space="preserve">
<value>Kopier notat</value>
<value>Copy note</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Far ut</value>
@@ -1565,7 +1565,7 @@ Skanning skjer automatisk.</value>
<value>Er du trygg på at du vil fara ut av Bitwarden?</value>
</data>
<data name="PINRequireMasterPasswordRestart" xml:space="preserve">
<value>Vil du krevje opplåsing med superpassordet ditt når programmet startast på nytt?</value>
<value>Do you want to require unlocking with your master password when the application is restarted?</value>
</data>
<data name="Black" xml:space="preserve">
<value>Svart</value>
@@ -1583,7 +1583,7 @@ Skanning skjer automatisk.</value>
<value>Auto-fill blocked URIs</value>
</data>
<data name="AskToAddLogin" xml:space="preserve">
<value>Spør om å leggje til innlogging</value>
<value>Ask to add login</value>
</data>
<data name="AskToAddLoginDescription" xml:space="preserve">
<value>Ask to add an item if one isn't found in your vault.</value>
@@ -1632,7 +1632,7 @@ Skanning skjer automatisk.</value>
<value>3. On the Android App Settings screen for Bitwarden, go to the "Display over other apps" options (under Advanced) and tap the toggle to allow overlay support.</value>
</data>
<data name="OverlayPermission" xml:space="preserve">
<value>Løyve</value>
<value>Permission</value>
</data>
<data name="BitwardenAutofillServiceOpenOverlayPermissionSettings" xml:space="preserve">
<value>Open Overlay Permission Settings</value>
@@ -1647,19 +1647,19 @@ Skanning skjer automatisk.</value>
<value>Granted</value>
</data>
<data name="FileFormat" xml:space="preserve">
<value>Filformat</value>
<value>File format</value>
</data>
<data name="ExportVaultMasterPasswordDescription" xml:space="preserve">
<value>Enter your master password to export your vault data.</value>
</data>
<data name="SendVerificationCodeToEmail" xml:space="preserve">
<value>Send ein stadfestingskode til e-posten din</value>
<value>Send a verification code to your email</value>
</data>
<data name="CodeSent" xml:space="preserve">
<value>Kode sendt!</value>
</data>
<data name="ConfirmYourIdentity" xml:space="preserve">
<value>Stadfest identiteten din for å fortsetje.</value>
<value>Confirm your identity to continue.</value>
</data>
<data name="ExportVaultWarning" xml:space="preserve">
<value>This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it.</value>
@@ -1671,7 +1671,7 @@ Skanning skjer automatisk.</value>
<value>Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account.</value>
</data>
<data name="ExportVaultConfirmationTitle" xml:space="preserve">
<value>Stadfest eksportering av kvelv</value>
<value>Confirm vault export</value>
<comment>Title for the alert to confirm vault exports.</comment>
</data>
<data name="Warning" xml:space="preserve">
@@ -1771,7 +1771,7 @@ Skanning skjer automatisk.</value>
<value>Currently unable to login with SSO</value>
</data>
<data name="SetMasterPassword" xml:space="preserve">
<value>Set hovudpassord</value>
<value>Set master password</value>
</data>
<data name="SetMasterPasswordSummary" xml:space="preserve">
<value>In order to complete logging in with SSO, please set a master password to access and protect your vault.</value>
@@ -1804,7 +1804,7 @@ Skanning skjer automatisk.</value>
<value>Passordet møter ikkje samskipnadskrava. Ver venleg og les retningslinene og freista om att.</value>
</data>
<data name="Loading" xml:space="preserve">
<value>Lastar</value>
<value>Loading</value>
</data>
<data name="AcceptPolicies" xml:space="preserve">
<value>By activating this switch you agree to the following:

View File

@@ -422,7 +422,7 @@
<value>Сервис Ауто-попуњавања</value>
</data>
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
<value>Поставити Bitwarden као добављача приступног кључа у подешавањима уређаја.</value>
<value>Set Bitwarden as your passkey provider in device settings.</value>
</data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
<value>Избегавај двосмислене карактере</value>
@@ -1195,7 +1195,7 @@
<value>Windows Hello</value>
</data>
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
<value>Нисмо успели да аутоматски отворимо мени за подешавања Андроид провајдера акредитива за вас. Можете да се крећете до менија подешавања добављача акредитива ручно из Андроид подешавања &gt; Систем &gt; Лозинке и налози &gt; Лозинке, приступни кључени.</value>
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings &gt; System &gt; Passwords &amp; accounts &gt; Passwords, passkeys and data services.</value>
</data>
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
<value>Нисмо могли аутоматски да отворимо мени за подешавања Ауто-пуњења. До менија подешавања ауто-пуњења можете ручно да дођете из Андроид подешавања &gt; Систем &gt; Језици и унос &gt; Напредно &gt; Сервис ауто-пуњења.</value>
@@ -1823,7 +1823,7 @@
<value>Bitwarden треба пажњу - Омогућите „Преко“ у „Сервиси Ауто-пуњења“ из подешавања Bitwarden-а</value>
</data>
<data name="PasskeyManagement" xml:space="preserve">
<value>Управљање приступачног кључа</value>
<value>Passkey management</value>
</data>
<data name="AutofillServices" xml:space="preserve">
<value>Сервиси Ауто-пуњења</value>
@@ -2810,7 +2810,7 @@
<value>{0} сати/а</value>
</data>
<data name="PasskeyManagementExplanationLong" xml:space="preserve">
<value>Употребити Bitwarden да сачувате нове приступне кључеве и пријавите се са приступним кључевима ускладиштеним у вашем трезору.</value>
<value>Use Bitwarden to save new passkeys and log in with passkeys stored in your vault.</value>
</data>
<data name="AutofillServicesExplanationLong" xml:space="preserve">
<value>Android Autofill Framework се користи за помоћ при попуњавању података за пријаву у друге апликације на вашем уређају.</value>
@@ -2841,7 +2841,7 @@
<value>Настави на радњу апликације?</value>
</data>
<data name="ContinueToDeviceSettings" xml:space="preserve">
<value>Желите ли да наставите на подешавања уређаја?</value>
<value>Continue to device Settings?</value>
</data>
<data name="TwoStepLoginDescriptionLong" xml:space="preserve">
<value>Учините свој налог сигурнијим подешавањем пријаве у два корака у Bitwarden веб апликацији.</value>
@@ -2894,25 +2894,25 @@
<value>Подесите опцију откључавања да бисте променили радњу временског ограничења сефа.</value>
</data>
<data name="ChooseALoginToSaveThisPasskeyTo" xml:space="preserve">
<value>Изаберите пријаву да бисте сачували овај приступни кључ</value>
<value>Choose a login to save this passkey to</value>
</data>
<data name="SavePasskeyAsNewLogin" xml:space="preserve">
<value>Сачувати приступни кључ као нову пријаву</value>
<value>Save passkey as new login</value>
</data>
<data name="SavePasskey" xml:space="preserve">
<value>Сачувати приступни кључ</value>
<value>Save passkey</value>
</data>
<data name="PasskeysForX" xml:space="preserve">
<value>Приступни кључ за {0}</value>
<value>Passkeys for {0}</value>
</data>
<data name="PasswordsForX" xml:space="preserve">
<value>Лозинке за {0}</value>
<value>Passwords for {0}</value>
</data>
<data name="OverwritePasskey" xml:space="preserve">
<value>Заменити приступни кључ?</value>
<value>Overwrite passkey?</value>
</data>
<data name="ThisItemAlreadyContainsAPasskeyAreYouSureYouWantToOverwriteTheCurrentPasskey" xml:space="preserve">
<value>Ова ставка већ садржи приступни кључ. Да ли сте сигурни да желите да замените тренутни приступни кључ?</value>
<value>This item already contains a passkey. Are you sure you want to overwrite the current passkey?</value>
</data>
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
<value>Duo пријава у два корака је потребна за ваш налог. </value>
@@ -2924,57 +2924,57 @@
<value>Покренути Duo</value>
</data>
<data name="VerificationRequiredByX" xml:space="preserve">
<value>Потребдна верификација {0}</value>
<value>Verification required by {0}</value>
</data>
<data name="VerificationRequiredForThisActionSetUpAnUnlockMethodInBitwardenToContinue" xml:space="preserve">
<value>За ову радњу је потребна верификација. Подесите метод откључавања у Bitwarden да би наставили.</value>
<value>Verification required for this action. Set up an unlock method in Bitwarden to continue.</value>
</data>
<data name="ErrorCreatingPasskey" xml:space="preserve">
<value>Грешка у креацији приступачног кључа</value>
<value>Error creating passkey</value>
</data>
<data name="ErrorReadingPasskey" xml:space="preserve">
<value>Грешка у читању приступачног кључа</value>
<value>Error reading passkey</value>
</data>
<data name="ThereWasAProblemCreatingAPasskeyForXTryAgainLater" xml:space="preserve">
<value>Дошло је до проблема при креирању приступачког кључа за {0}. Покушајте поново касније.</value>
<value>There was a problem creating a passkey for {0}. Try again later.</value>
<comment>The parameter is the RpId</comment>
</data>
<data name="ThereWasAProblemReadingAPasskeyForXTryAgainLater" xml:space="preserve">
<value>Дошло је до проблема при читању приступачког кључа за {0}. Покушајте поново касније.</value>
<value>There was a problem reading your passkey for {0}. Try again later.</value>
<comment>The parameter is the RpId</comment>
</data>
<data name="VerifyingIdentityEllipsis" xml:space="preserve">
<value>Верификација идентитета...</value>
<value>Verifying identity...</value>
</data>
<data name="Passwords" xml:space="preserve">
<value>Лозинке</value>
<value>Passwords</value>
</data>
<data name="UnknownAccount" xml:space="preserve">
<value>Непознат налог</value>
<value>Unknown account</value>
</data>
<data name="SetUpAutofill" xml:space="preserve">
<value>Подесити ауто-пуњење</value>
<value>Set up auto-fill</value>
</data>
<data name="GetInstantAccessToYourPasswordsAndPasskeys" xml:space="preserve">
<value>Имајте инстантни приступ Вашим лозинкама и приступачним кључевима!</value>
<value>Get instant access to your passwords and passkeys!</value>
</data>
<data name="SetUpAutoFillDescriptionLong" xml:space="preserve">
<value>Да бисте подесили ауто-пуњење лозинки и управљање приступним кључевима, подесите Bitwarden као ваш омиљени провајдер у подешавањима iOS-а.</value>
<value>To set up password auto-fill and passkey management, set Bitwarden as your preferred provider in the iOS Settings.</value>
</data>
<data name="FirstDotGoToYourDeviceSettingsPasswordsPasswordOptions" xml:space="preserve">
<value>1. Идите на подешавања уређаја &gt; Лозинке &gt; Опције лозинке</value>
<value>1. Go to your device's Settings &gt; Passwords &gt; Password Options</value>
</data>
<data name="SecondDotTurnOnAutoFill" xml:space="preserve">
<value>2. Омогућите ауто-пуњење</value>
<value>2. Turn on AutoFill</value>
</data>
<data name="ThirdDotSelectBitwardenToUseForPasswordsAndPasskeys" xml:space="preserve">
<value>3. Одабрати "Bitwarden" за употребу за лозинке</value>
<value>3. Select "Bitwarden" to use for passwords and passkeys</value>
</data>
<data name="YourPasskeyWillBeSavedToYourBitwardenVault" xml:space="preserve">
<value>Ваш приступни кључ ће бити сачуван у вашем Bitwarden сефу</value>
<value>Your passkey will be saved to your Bitwarden vault</value>
</data>
<data name="YourPasskeyWillBeSavedToYourBitwardenVaultForX" xml:space="preserve">
<value>Ваш приступни кључ ће бити сачуван у вашем Bitwarden сефу за {0}</value>
<value>Your passkey will be saved to your Bitwarden vault for {0}</value>
</data>
<data name="OrganizationUnassignedItemsMessageUSEUDescriptionLong" xml:space="preserve">
<value>Недодељене ставке организације више нису видљиве у приказу Сви сефови и доступне су само преко Админ конзоле. Доделите ове ставке колекцији са Админ конзолом да бисте их учинили видљивим.</value>
@@ -2989,21 +2989,21 @@
<value>Напомена</value>
</data>
<data name="PasskeysNotSupportedForThisApp" xml:space="preserve">
<value>Приступни кључеви нису подржани за ову апликацију</value>
<value>Passkeys not supported for this app</value>
</data>
<data name="PasskeyOperationFailedBecauseBrowserIsNotPrivileged" xml:space="preserve">
<value>Passkey operation failed because browser is not privileged</value>
</data>
<data name="PasskeyOperationFailedBecauseBrowserSignatureDoesNotMatch" xml:space="preserve">
<value>Операција лозинке није успела јер се потпис прегледача не подудара</value>
<value>Passkey operation failed because browser signature does not match</value>
</data>
<data name="PasskeyOperationFailedBecauseOfMissingAssetLinks" xml:space="preserve">
<value>Операција лозинке није успела због недостајућих веза средстава</value>
<value>Passkey operation failed because of missing asset links</value>
</data>
<data name="PasskeyOperationFailedBecauseAppNotFoundInAssetLinks" xml:space="preserve">
<value>Операција лозинке није успела јер апликација није пронађена у везама за средства</value>
<value>Passkey operation failed because app not found in asset links</value>
</data>
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
<value>Операција лозинке није успела јер апликација није могла да се верификује</value>
<value>Passkey operation failed because app could not be verified</value>
</data>
</root>

View File

@@ -5,6 +5,7 @@
public const string Fido2CredentialCreate = "fido2CredentialCreate";
public const string Fido2CredentialGet = "fido2CredentialGet";
public const string Fido2CredentialAction = "fido2CredentialAction";
public const string Fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout = "fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout";
public const string CredentialProviderCipherId = "credentialProviderCipherId";
public const string CredentialDataIntentExtra = "CREDENTIAL_DATA";
public const string CredentialIdIntentExtra = "credId";

View File

@@ -617,9 +617,8 @@ namespace Bit.iOS.Autofill
private void LaunchRegisterFlow()
{
var appOptions = new AppOptions { IosExtension = true };
var registerPage = new RegisterPage(null, appOptions);
var app = new App.App(appOptions);
var registerPage = new RegisterPage(null);
var app = new App.App(new AppOptions { IosExtension = true });
ThemeManager.SetTheme(app.Resources);
ThemeManager.ApplyResourcesTo(registerPage);
if (registerPage.BindingContext is RegisterPageViewModel vm)
@@ -697,9 +696,8 @@ namespace Bit.iOS.Autofill
private void LaunchTwoFactorFlow(bool authingWithSso)
{
var appOptions = new AppOptions { IosExtension = true };
var twoFactorPage = new TwoFactorPage(authingWithSso, appOptions);
var app = new App.App(appOptions);
var twoFactorPage = new TwoFactorPage(authingWithSso);
var app = new App.App(new AppOptions { IosExtension = true });
ThemeManager.SetTheme(app.Resources);
ThemeManager.ApplyResourcesTo(twoFactorPage);
if (twoFactorPage.BindingContext is TwoFactorPageViewModel vm)

20
store/fdroid/config.py Normal file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env python3
repo_url = "https://mobileapp.bitwarden.com/fdroid/repo"
repo_name = "Bitwarden F-Droid Repo"
repo_icon = "fdroid-icon.png"
repo_description = """
F-Droid repo for Bitwarden.
"""
archive_older = 2
archive_url = "https://does.not.exist"
archive_name = "Bitwarden Archive Repo"
archive_icon = "fdroid-icon.png"
archive_description = """
F-Droid archive repo for Bitwarden.
"""
repo_keyalias = "bitwarden-Virtual-Machine"
keystore = "keystore.jks"
keydname = "CN=bitwarden-Virtual-Machine, OU=F-Droid"

View File

@@ -1,18 +0,0 @@
---
repo_url: https://mobileapp.bitwarden.com/fdroid/repo
repo_name: Bitwarden F-Droid Repo
repo_icon: fdroid-icon.png
repo_description: >-
F-Droid repo for Bitwarden.
archive_older: 2
archive_url: https://does.not.exist/archive
archive_name: Bitwarden Archive Repo
archive_icon: fdroid-icon.png
archive_description: >-
F-Droid archive repo for Bitwarden.
repo_keyalias: bitwarden-Virtual-Machine
keystore: keystore.jks
keydname: CN=bitwarden-Virtual-Machine, OU=F-Droid