1
0
mirror of https://github.com/bitwarden/mobile synced 2026-01-25 05:43:15 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
Matt Portune
c1461ab16b FIDO2 implementation using Google Play Services on Android 2021-08-30 13:38:03 -04:00
61 changed files with 929 additions and 518 deletions

View File

@@ -1,81 +0,0 @@
name: Bug Report
description: File a bug report
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
Please do not submit feature requests. The [Community Forums](https://community.bitwarden.com) has a section for submitting, voting for, and discussing product feature requests.
- type: textarea
id: reproduce
attributes:
label: Steps To Reproduce
description: How can we reproduce the behavior.
value: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. Click on '...'
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Result
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual Result
description: A clear and concise description of what is happening.
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots or Videos
description: If applicable, add screenshots and/or a short video to help explain your problem.
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: Add any other context about the problem here.
- type: dropdown
id: os
attributes:
label: Operating System
description: What operating system are you seeing the problem on?
multiple: true
options:
- Android
- iOS
validations:
required: true
- type: input
id: os-version
attributes:
label: Operating System Version
description: What version of the operating system(s) are you seeing the problem on?
- type: input
id: device
attributes:
label: Device
description: Which device are you seeing the problem on?
placeholder: iPhone 12, Samsung Galaxy S10
- type: input
id: version
attributes:
label: Build Version
description: What version of our software are you running? (go to "Settings" → "About" in the app)
validations:
required: true
- type: checkboxes
id: beta
attributes:
label: Beta
options:
- label: Using a pre-release version of the application.

View File

@@ -1,17 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Report mobile autofill failure
url: https://docs.google.com/forms/d/e/1FAIpQLScMopHyN7KGJs8hW562VTzbIGL4KcFnx0wJcsW0GYE1BnPiGA/viewform
about: We are aware of some situations where the Bitwarden mobile app will not autofill information correctly. This is something the Bitwarden team is actively working on but need your help as a community and active Bitwarden users!
- name: Feature Requests
url: https://community.bitwarden.com/c/feature-requests/
about: Request new features using the Community Forums. Please search existing feature requests before making a new one.
- name: Bitwarden Community Forums
url: https://community.bitwarden.com
about: Please visit the community forums for general community discussion, support and the development roadmap.
- name: Customer Support
url: https://bitwarden.com/contact/
about: Please contact our customer support for account issues and general customer support.
- name: Security Issues
url: https://hackerone.com/bitwarden
about: We use HackerOne to manage security disclosures.

View File

@@ -1,4 +1,3 @@
---
name: Build
on:
@@ -13,7 +12,6 @@ on:
jobs:
cloc:
name: CLOC
runs-on: ubuntu-latest
steps:
@@ -29,7 +27,6 @@ jobs:
run: cloc --vcs git --exclude-dir Resources,store,test,Properties --include-lang C#,XAML
android:
name: Android
runs-on: windows-latest
steps:
@@ -140,9 +137,8 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
android-ubuntu:
name: Android Ubuntu
runs-on: ubuntu-latest
needs: android
@@ -213,7 +209,6 @@ jobs:
run: npm run deploy
ios:
name: Apple iOS
runs-on: macos-latest
steps:

View File

@@ -1,17 +1,16 @@
---
name: Crowdin Sync
on:
workflow_dispatch:
inputs: {}
# schedule:
# - cron: '0 0 * * *'
#schedule:
# - cron: '0 0 * * *'
jobs:
crowdin-sync:
name: Autosync
runs-on: ubuntu-20.04
env:
env:
_CROWDIN_PROJECT_ID: "269690"
steps:
- name: Checkout repo

View File

@@ -1,4 +1,3 @@
---
name: Release
on:
@@ -7,7 +6,6 @@ on:
jobs:
cloc:
name: CLOC
runs-on: ubuntu-latest
steps:

53
ISSUE_TEMPLATE.md Normal file
View File

@@ -0,0 +1,53 @@
<!-- Comment:
Please do not submit feature requests. The [Community Forums][1] has a
section for submitting, voting for, and discussing product feature requests.
[1]: https://community.bitwarden.com
-->
## Describe the Bug
<!-- Comment:
A clear and concise description of what the bug is.
-->
## Steps To Reproduce
<!-- Comment:
How can we reproduce the behavior:
-->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. Click on '...'
## Expected Result
<!-- Comment:
A clear and concise description of what you expected to happen.
-->
## Actual Result
<!-- Comment:
A clear and concise description of what is happening.
-->
## Screenshots or Videos
<!-- Comment:
If applicable, add screenshots and/or a short video to help explain your problem.
-->
## Environment
- Device: [e.g. iPhone6]
- Operating system: [e.g. iOS 8.1]
- Build Version (go to "Settings" → "About" in the app): [e.g. 2.3.0 (2221)]
- Is this a Beta release? [Y/N]
## Additional Context
<!-- Comment:
Add any other context about the problem here.
-->

View File

@@ -8,7 +8,7 @@
The Bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms.
<img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/mobile-android-myvault.png" alt="" width="325" height="650" /> <img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/mobile-ios-myvault.png" alt="" width="300" height="650" />
<img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/mobile-android-myvault.png" alt="" width="300" height="533" /> <img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/mobile-ios-myvault.png" alt="" width="300" height="533" />
# Build/Run

View File

@@ -92,6 +92,7 @@
</PackageReference>
<PackageReference Include="Xamarin.Google.Android.Material" Version="1.3.0.1" />
<PackageReference Include="Xamarin.Google.Dagger" Version="2.37.0" />
<PackageReference Include="Xamarin.GooglePlayServices.Fido" Version="118.1.0" />
<PackageReference Include="Xamarin.GooglePlayServices.SafetyNet">
<Version>117.0.0</Version>
</PackageReference>
@@ -115,6 +116,8 @@
<Compile Include="Effects\FixedSizeEffect.cs" />
<Compile Include="Effects\SelectableLabelEffect.cs" />
<Compile Include="Effects\TabBarEffect.cs" />
<Compile Include="Fido2System\Fido2BuilderObject.cs" />
<Compile Include="Fido2System\Fido2Service.cs" />
<Compile Include="Push\FirebaseMessagingService.cs" />
<Compile Include="Receivers\ClearClipboardAlarmReceiver.cs" />
<Compile Include="Receivers\RestrictionsChangedReceiver.cs" />

View File

@@ -0,0 +1,106 @@
#if !FDROID
using System.Collections.Generic;
using Android.Gms.Fido.Common;
using Android.Gms.Fido.Fido2.Api.Common;
using Bit.Core.Models.Data;
using Bit.Core.Models.Response;
using Bit.Core.Utilities;
using Java.Lang;
using Newtonsoft.Json.Linq;
namespace Bit.Droid.Fido2System
{
class Fido2BuilderObject
{
public static PublicKeyCredentialRequestOptions ParsePublicKeyCredentialRequestOptions(
Fido2AuthenticationChallengeResponse data)
{
if (data == null)
{
return null;
}
var builder = new PublicKeyCredentialRequestOptions.Builder();
if (!string.IsNullOrEmpty(data.Challenge))
{
builder.SetChallenge(CoreHelpers.Base64UrlDecode(data.Challenge));
}
if (data.AllowCredentials != null && data.AllowCredentials.Count > 0)
{
builder.SetAllowList(ParseCredentialDescriptors(data.AllowCredentials));
}
if (!string.IsNullOrEmpty(data.RpId))
{
builder.SetRpId(data.RpId);
}
if (data.Timeout > 0)
{
builder.SetTimeoutSeconds((Double)(data.Timeout / 1000));
}
if (data.Extensions != null)
{
builder.SetAuthenticationExtensions(ParseExtensions((JObject)data.Extensions));
}
return builder.Build();
}
private static List<PublicKeyCredentialDescriptor> ParseCredentialDescriptors(
List<Fido2CredentialDescriptor> listData)
{
if (listData == null || listData.Count == 0)
{
return new List<PublicKeyCredentialDescriptor>();
}
var credentials = new List<PublicKeyCredentialDescriptor>();
foreach (var data in listData)
{
string id = null;
string type = null;
var transports = new List<Transport>();
if (!string.IsNullOrEmpty(data.Id))
{
id = data.Id;
}
if (!string.IsNullOrEmpty(data.Type))
{
type = data.Type;
}
if (data.Transports != null && data.Transports.Count > 0)
{
foreach (var transport in data.Transports)
{
transports.Add(Transport.FromString(transport));
}
}
credentials.Add(new PublicKeyCredentialDescriptor(type, CoreHelpers.Base64UrlDecode(id), transports));
}
return credentials;
}
private static AuthenticationExtensions ParseExtensions(JObject extensions)
{
var builder = new AuthenticationExtensions.Builder();
if (extensions.ContainsKey("appid"))
{
var appId = new FidoAppIdExtension((string)extensions.GetValue("appid"));
builder.SetFido2Extension(appId);
}
if (extensions.ContainsKey("uvm"))
{
var uvm = new UserVerificationMethodExtension((bool)extensions.GetValue("uvm"));
builder.SetUserVerificationMethodExtension(uvm);
}
return builder.Build();
}
}
}
#endif

View File

@@ -0,0 +1,249 @@
#if !FDROID
using Android.App;
using Android.Content;
using Android.Gms.Fido;
using Android.Gms.Fido.Fido2;
using Android.Gms.Fido.Fido2.Api.Common;
using Android.Gms.Tasks;
using Android.Util;
using AndroidX.AppCompat.App;
using Bit.App.Services;
using Bit.Core.Abstractions;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.Models.Request;
using Bit.Core.Models.Response;
using Bit.Core.Utilities;
using Java.Lang;
using Newtonsoft.Json;
using Xamarin.Forms;
using Enum = System.Enum;
namespace Bit.Droid.Fido2System
{
public class Fido2Service
{
public static readonly string _tag_log = "Fido2Service";
public static Fido2Service INSTANCE = new Fido2Service();
private readonly MobileI18nService _i18nService;
private readonly IPlatformUtilsService _platformUtilsService;
private AppCompatActivity _activity;
private Fido2ApiClient _fido2ApiClient;
private Fido2CodesTypes _fido2CodesType;
public Fido2Service()
{
_i18nService = ServiceContainer.Resolve<II18nService>("i18nService") as MobileI18nService;
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
}
public void Start(AppCompatActivity activity)
{
_activity = activity;
_fido2ApiClient = Fido.GetFido2ApiClient(_activity);
}
public void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if (resultCode == Result.Ok && Enum.IsDefined(typeof(Fido2CodesTypes), requestCode))
{
switch ((Fido2CodesTypes)requestCode)
{
case Fido2CodesTypes.RequestSignInUser:
var errorExtra = data?.GetByteArrayExtra(Fido.Fido2KeyErrorExtra);
if (errorExtra != null)
{
HandleErrorCode(errorExtra);
}
else
{
if (data != null)
{
SignInUserResponse(data);
}
}
break;
// TODO: Key registration, should we ever choose to implement client-side
/*case Fido2CodesTypes.RequestRegisterNewKey:
errorExtra = data?.GetByteArrayExtra(Fido.Fido2KeyErrorExtra);
if (errorExtra != null)
{
HandleErrorCode(errorExtra);
}
else
{
if (data != null)
{
// begin registration flow
}
}
break;*/
}
}
else if (resultCode == Result.Canceled && Enum.IsDefined(typeof(Fido2CodesTypes), requestCode))
{
Log.Info(_tag_log, "cancelled");
_platformUtilsService.ShowDialogAsync(_i18nService.T("Fido2AbortError"),
_i18nService.T("Fido2Title"));
}
}
public void OnSuccess(Object result)
{
if (result != null && Enum.IsDefined(typeof(Fido2CodesTypes), _fido2CodesType))
{
try
{
_activity.StartIntentSenderForResult(((PendingIntent)result).IntentSender, (int)_fido2CodesType,
null, 0, 0, 0);
}
catch (System.Exception e)
{
Log.Error(_tag_log, e.Message);
_platformUtilsService.ShowDialogAsync(_i18nService.T("Fido2SomethingWentWrong"),
_i18nService.T("Fido2Title"));
}
}
}
public void OnFailure(Exception e)
{
Log.Error(_tag_log, e.Message ?? "OnFailure: No error message returned");
_platformUtilsService.ShowDialogAsync(_i18nService.T("Fido2SomethingWentWrong"),
_i18nService.T("Fido2Title"));
}
public void OnComplete(Task task)
{
Log.Debug(_tag_log, "OnComplete");
}
public async System.Threading.Tasks.Task SignInUserRequestAsync(string dataJson)
{
try
{
var dataObject = JsonConvert.DeserializeObject<Fido2AuthenticationChallengeResponse>(dataJson);
_fido2CodesType = Fido2CodesTypes.RequestSignInUser;
var options = Fido2BuilderObject.ParsePublicKeyCredentialRequestOptions(dataObject);
var task = _fido2ApiClient.GetSignPendingIntent(options);
task.AddOnSuccessListener((IOnSuccessListener)_activity)
.AddOnFailureListener((IOnFailureListener)_activity)
.AddOnCompleteListener((IOnCompleteListener)_activity);
}
catch (System.Exception e)
{
Log.Error(_tag_log, e.StackTrace);
await _platformUtilsService.ShowDialogAsync(_i18nService.T("Fido2SomethingWentWrong"),
_i18nService.T("Fido2Title"));
}
finally
{
Log.Info(_tag_log, "SignInUserRequest() -> finally()");
}
}
private void SignInUserResponse(Intent data)
{
try
{
var response =
AuthenticatorAssertionResponse.DeserializeFromBytes(
data.GetByteArrayExtra(Fido.Fido2KeyResponseExtra));
var responseJson = JsonConvert.SerializeObject(new Fido2AuthenticationChallengeRequest
{
Id = CoreHelpers.Base64UrlEncode(response.GetKeyHandle()),
RawId = CoreHelpers.Base64UrlEncode(response.GetKeyHandle()),
Type = "public-key",
Response = new Fido2AssertionResponse
{
AuthenticatorData = CoreHelpers.Base64UrlEncode(response.GetAuthenticatorData()),
ClientDataJson = CoreHelpers.Base64UrlEncode(response.GetClientDataJSON()),
Signature = CoreHelpers.Base64UrlEncode(response.GetSignature()),
UserHandle = (response.GetUserHandle() != null
? CoreHelpers.Base64UrlEncode(response.GetUserHandle()) : null),
},
Extensions = null
}
);
Device.BeginInvokeOnMainThread(() => ((MainActivity)_activity).Fido2Submission(responseJson));
}
catch (System.Exception e)
{
Log.Error(_tag_log, e.Message);
_platformUtilsService.ShowDialogAsync(_i18nService.T("Fido2SomethingWentWrong"),
_i18nService.T("Fido2Title"));
}
finally
{
Log.Info(_tag_log, "SignInUserResponse() -> finally()");
}
}
public void HandleErrorCode(byte[] errorExtra)
{
var error = AuthenticatorErrorResponse.DeserializeFromBytes(errorExtra);
if (error.ErrorMessage.Length > 0)
{
Log.Info(_tag_log, error.ErrorMessage);
}
string message = "";
if (error.ErrorCode == ErrorCode.AbortErr)
{
message = "Fido2AbortError";
}
else if (error.ErrorCode == ErrorCode.TimeoutErr)
{
message = "Fido2TimeoutError";
}
else if (error.ErrorCode == ErrorCode.AttestationNotPrivateErr)
{
message = "Fido2PrivacyError";
}
else if (error.ErrorCode == ErrorCode.ConstraintErr)
{
message = "Fido2SomethingWentWrong";
}
else if (error.ErrorCode == ErrorCode.DataErr)
{
message = "Fido2ServerDataFail";
}
else if (error.ErrorCode == ErrorCode.EncodingErr)
{
message = "Fido2SomethingWentWrong";
}
else if (error.ErrorCode == ErrorCode.InvalidStateErr)
{
message = "Fido2SomethingWentWrong";
}
else if (error.ErrorCode == ErrorCode.NetworkErr)
{
message = "Fido2NetworkFail";
}
else if (error.ErrorCode == ErrorCode.NotAllowedErr)
{
message = "Fido2NoPermission";
}
else if (error.ErrorCode == ErrorCode.NotSupportedErr)
{
message = "Fido2NotSupportedError";
}
else if (error.ErrorCode == ErrorCode.SecurityErr)
{
message = "Fido2SecurityError";
}
else if (error.ErrorCode == ErrorCode.UnknownErr)
{
message = "Fido2SomethingWentWrong";
}
else
{
message = "Fido2SomethingWentWrong";
}
_platformUtilsService.ShowDialogAsync(_i18nService.T(message), _i18nService.T("Fido2Title"));
}
}
}
#endif

View File

@@ -9,6 +9,7 @@ using Bit.Core.Utilities;
using Bit.Core.Abstractions;
using System.IO;
using System;
using System.Collections.Generic;
using Android.Content;
using Bit.Droid.Utilities;
using Bit.Droid.Receivers;
@@ -17,7 +18,11 @@ using Bit.Core.Enums;
using Android.Nfc;
using Bit.App.Utilities;
using System.Threading.Tasks;
using Android.Util;
using AndroidX.Core.Content;
#if !FDROID
using Bit.Droid.Fido2System;
#endif
using ZXing.Net.Mobile.Android;
namespace Bit.Droid
@@ -42,7 +47,10 @@ namespace Bit.Droid
@"text/*"
})]
[Register("com.x8bit.bitwarden.MainActivity")]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity,
Android.Gms.Tasks.IOnSuccessListener,
Android.Gms.Tasks.IOnCompleteListener,
Android.Gms.Tasks.IOnFailureListener
{
private IDeviceActionService _deviceActionService;
private IMessagingService _messagingService;
@@ -57,6 +65,7 @@ namespace Bit.Droid
private string _activityKey = $"{nameof(MainActivity)}_{Java.Lang.JavaSystem.CurrentTimeMillis().ToString()}";
private Java.Util.Regex.Pattern _otpPattern =
Java.Util.Regex.Pattern.Compile("^.*?([cbdefghijklnrtuv]{32,64})$");
private string _fidoDataJson;
protected override void OnCreate(Bundle savedInstanceState)
{
@@ -91,6 +100,7 @@ namespace Bit.Droid
#if !FDROID
var appCenterHelper = new AppCenterHelper(_appIdService, _userService);
var appCenterTask = appCenterHelper.InitAsync();
Fido2Service.INSTANCE.Start(this);
#endif
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
@@ -112,6 +122,14 @@ namespace Bit.Droid
{
Xamarin.Forms.Device.BeginInvokeOnMainThread(() => Finish());
}
else if (message.Command == "listenFido2")
{
ListenFido2((Dictionary<string, object>)message.Data);
}
else if (message.Command == "listenFido2TryAgain")
{
ListenFido2();
}
else if (message.Command == "listenYubiKeyOTP")
{
ListenYubiKey((bool)message.Data);
@@ -260,6 +278,34 @@ namespace Bit.Droid
return;
}
}
else if (resultCode == Result.Ok &&
Enum.IsDefined(typeof(Fido2CodesTypes), requestCode))
{
#if !FDROID
Fido2Service.INSTANCE.OnActivityResult(requestCode, resultCode, data);
#endif
}
}
public void OnSuccess(Java.Lang.Object result)
{
#if !FDROID
Fido2Service.INSTANCE.OnSuccess(result);
#endif
}
public void OnComplete(Android.Gms.Tasks.Task task)
{
#if !FDROID
Fido2Service.INSTANCE.OnComplete(task);
#endif
}
public void OnFailure(Java.Lang.Exception e)
{
#if !FDROID
Fido2Service.INSTANCE.OnFailure(e);
#endif
}
protected override void OnDestroy()
@@ -268,6 +314,41 @@ namespace Bit.Droid
_broadcasterService.Unsubscribe(_activityKey);
}
private void ListenFido2(Dictionary<string, object> data = null)
{
if (!_deviceActionService.SupportsFido2())
{
return;
}
#if !FDROID
RunOnUiThread(async () =>
{
try
{
if (data != null)
{
_fidoDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(data);
await Fido2Service.INSTANCE.SignInUserRequestAsync(_fidoDataJson);
}
else
{
await Fido2Service.INSTANCE.SignInUserRequestAsync(_fidoDataJson);
}
}
catch (Exception e)
{
Log.Error(Fido2Service._tag_log, e.Message);
}
});
#endif
}
public void Fido2Submission(string token)
{
_messagingService.Send("gotFido2Token", token);
}
private void ListenYubiKey(bool listen)
{
if (!_deviceActionService.SupportsNfc())

View File

@@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:versionCode="1"
android:versionName="2.13.0"
android:versionName="2.12.0"
android:installLocation="internalOnly"
package="com.x8bit.bitwarden">

View File

@@ -778,7 +778,13 @@ namespace Bit.Droid.Services
public bool SupportsFido2()
{
return true;
#if !FDROID
if ((int)Build.VERSION.SdkInt >= 21)
{
return true;
}
#endif
return false;
}
private bool DeleteDir(Java.IO.File dir)

View File

@@ -32,28 +32,6 @@
StyleClass="text-md"
HorizontalTextAlignment="Start"></Label>
</StackLayout>
<Grid IsVisible="{Binding ResetPasswordAutoEnroll}"
RowSpacing="0"
ColumnSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Frame Padding="10"
Margin="0, 12, 0, 0"
HasShadow="False"
BackgroundColor="Transparent"
BorderColor="Accent">
<Label
Text="{u:I18n ResetPasswordAutoEnrollInviteWarning}"
StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Start" />
</Frame>
</Grid>
<Grid IsVisible="{Binding IsPolicyInEffect}"
RowSpacing="0"
ColumnSpacing="0">
@@ -66,7 +44,7 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Frame Padding="10"
Margin="0, 12, 0, 0"
Margin="0"
HasShadow="False"
BackgroundColor="Transparent"
BorderColor="Accent">

View File

@@ -30,7 +30,6 @@ namespace Bit.App.Pages
private bool _showPassword;
private bool _isPolicyInEffect;
private bool _resetPasswordAutoEnroll;
private string _policySummary;
private MasterPasswordPolicyOptions _policy;
@@ -51,6 +50,7 @@ namespace Bit.App.Pages
ToggleConfirmPasswordCommand = new Command(ToggleConfirmPassword);
SubmitCommand = new Command(async () => await SubmitAsync());
}
public bool ShowPassword
{
get => _showPassword;
@@ -63,12 +63,6 @@ namespace Bit.App.Pages
get => _isPolicyInEffect;
set => SetProperty(ref _isPolicyInEffect, value);
}
public bool ResetPasswordAutoEnroll
{
get => _resetPasswordAutoEnroll;
set => SetProperty(ref _resetPasswordAutoEnroll, value);
}
public string PolicySummary
{
@@ -92,26 +86,10 @@ namespace Bit.App.Pages
public Action SetPasswordSuccessAction { get; set; }
public Action CloseAction { get; set; }
public string OrgIdentifier { get; set; }
public string OrgId { get; set; }
public async Task InitAsync()
{
await CheckPasswordPolicy();
try
{
var response = await _apiService.GetOrganizationAutoEnrollStatusAsync(OrgIdentifier);
OrgId = response.Id;
ResetPasswordAutoEnroll = response.ResetPasswordEnabled;
}
catch (ApiException e)
{
if (e?.Error != null)
{
await _platformUtilsService.ShowDialogAsync(e.Error.GetSingleMessage(),
AppResources.AnErrorHasOccurred);
}
}
}
public async Task SubmitAsync()
@@ -193,7 +171,6 @@ namespace Bit.App.Pages
try
{
await _deviceActionService.ShowLoadingAsync(AppResources.CreatingAccount);
// Set Password and relevant information
await _apiService.SetPasswordAsync(request);
await _userService.SetInformationAsync(await _userService.GetUserIdAsync(),
await _userService.GetEmailAsync(), kdf, kdfIterations);
@@ -201,25 +178,6 @@ namespace Bit.App.Pages
await _cryptoService.SetKeyHashAsync(localMasterPasswordHash);
await _cryptoService.SetEncKeyAsync(encKey.Item2.EncryptedString);
await _cryptoService.SetEncPrivateKeyAsync(keys.Item2.EncryptedString);
if (ResetPasswordAutoEnroll)
{
// Grab Organization Keys
var response = await _apiService.GetOrganizationKeysAsync(OrgId);
var publicKey = CoreHelpers.Base64UrlDecode(response.PublicKey);
// Grab user's Encryption Key and encrypt with Org Public Key
var userEncKey = await _cryptoService.GetEncKeyAsync();
var encryptedKey = await _cryptoService.RsaEncryptAsync(userEncKey.Key, publicKey);
// Request
var resetRequest = new OrganizationUserResetPasswordEnrollmentRequest
{
ResetPasswordKey = encryptedKey.EncryptedString
};
var userId = await _userService.GetUserIdAsync();
// Enroll user
await _apiService.PutOrganizationUserResetPasswordEnrollmentAsync(OrgId, userId, resetRequest);
}
await _deviceActionService.HideLoadingAsync();
SetPasswordSuccessAction?.Invoke();

View File

@@ -75,6 +75,18 @@ namespace Bit.App.Pages
});
}
}
else if (message.Command == "gotFido2Token")
{
var token = (string)message.Data;
if (!string.IsNullOrWhiteSpace(token))
{
Device.BeginInvokeOnMainThread(async () =>
{
_vm.Token = token;
await _vm.SubmitAsync();
});
}
}
else if (message.Command == "resumeYubiKey")
{
if (_vm.YubikeyMethod)
@@ -174,7 +186,14 @@ namespace Bit.App.Pages
{
if (_vm.Fido2Method)
{
await _vm.Fido2AuthenticateAsync();
if (Device.RuntimePlatform == Device.Android)
{
_messagingService.Send("listenFido2TryAgain", true);
}
else
{
await _vm.Fido2AuthenticateAsync();
}
}
else if (_vm.YubikeyMethod)
{

View File

@@ -10,6 +10,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Bit.App.Utilities;
using Newtonsoft.Json;
@@ -151,7 +153,14 @@ namespace Bit.App.Pages
switch (SelectedProviderType.Value)
{
case TwoFactorProviderType.Fido2WebAuthn:
Fido2AuthenticateAsync(providerData);
if (Device.RuntimePlatform == Device.Android)
{
_messagingService.Send("listenFido2", providerData);
}
else
{
Fido2AuthenticateAsync(providerData);
}
break;
case TwoFactorProviderType.YubiKey:
_messagingService.Send("listenYubiKeyOTP", true);
@@ -242,12 +251,11 @@ namespace Bit.App.Pages
await _deviceActionService.HideLoadingAsync();
if (authResult != null && authResult.Properties.TryGetValue("error", out var resultError))
{
var message = AppResources.Fido2CheckBrowser + "\n\n" + resultError;
await _platformUtilsService.ShowDialogAsync(message, AppResources.AnErrorHasOccurred);
await _platformUtilsService.ShowDialogAsync(resultError, AppResources.AnErrorHasOccurred);
}
else
{
await _platformUtilsService.ShowDialogAsync(AppResources.Fido2CheckBrowser,
await _platformUtilsService.ShowDialogAsync(AppResources.Fido2SomethingWentWrong,
AppResources.AnErrorHasOccurred);
}
}

View File

@@ -3585,15 +3585,57 @@ namespace Bit.App.Resources {
}
}
public static string Fido2CheckBrowser {
public static string Fido2SomethingWentWrong {
get {
return ResourceManager.GetString("Fido2CheckBrowser", resourceCulture);
return ResourceManager.GetString("Fido2SomethingWentWrong", resourceCulture);
}
}
public static string ResetPasswordAutoEnrollInviteWarning {
public static string Fido2AbortError {
get {
return ResourceManager.GetString("ResetPasswordAutoEnrollInviteWarning", resourceCulture);
return ResourceManager.GetString("Fido2AbortError", resourceCulture);
}
}
public static string Fido2NetworkFail {
get {
return ResourceManager.GetString("Fido2NetworkFail", resourceCulture);
}
}
public static string Fido2NoPermission {
get {
return ResourceManager.GetString("Fido2NoPermission", resourceCulture);
}
}
public static string Fido2NotSupportedError {
get {
return ResourceManager.GetString("Fido2NotSupportedError", resourceCulture);
}
}
public static string Fido2PrivacyError {
get {
return ResourceManager.GetString("Fido2PrivacyError", resourceCulture);
}
}
public static string Fido2SecurityError {
get {
return ResourceManager.GetString("Fido2SecurityError", resourceCulture);
}
}
public static string Fido2ServerDataFail {
get {
return ResourceManager.GetString("Fido2ServerDataFail", resourceCulture);
}
}
public static string Fido2TimeoutError {
get {
return ResourceManager.GetString("Fido2TimeoutError", resourceCulture);
}
}
}

View File

@@ -534,16 +534,16 @@
<value>Onmiddellik</value>
</data>
<data name="VaultTimeout" xml:space="preserve">
<value>Kluis-uittel</value>
<value>Vault Timeout</value>
</data>
<data name="VaultTimeoutAction" xml:space="preserve">
<value>Kluis-uittelaksie</value>
<value>Vault Timeout Action</value>
</data>
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
<value>Deur uit te teken word alle toegang tot u kluis verwyder en word waarmerking na die uitteltydperk vereis. Is u seker u wil hierdie instelling gebruik?</value>
<value>Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?</value>
</data>
<data name="LoggingIn" xml:space="preserve">
<value>Teken tans aan…</value>
<value>Logging in...</value>
<comment>Message shown when interacting with the server</comment>
</data>
<data name="LoginOrCreateNewAccount" xml:space="preserve">
@@ -568,11 +568,11 @@
<value>Hoofwagwoord moet ten minste 8 karakters lank wees.</value>
</data>
<data name="MinNumbers" xml:space="preserve">
<value>Min. aantal syfers</value>
<value>Minimum Numbers</value>
<comment>Minimum numeric characters for password generator settings</comment>
</data>
<data name="MinSpecial" xml:space="preserve">
<value>Min. aantal spesiaal</value>
<value>Minimum Special</value>
<comment>Minimum special characters for password generator settings</comment>
</data>
<data name="MoreSettings" xml:space="preserve">
@@ -604,7 +604,7 @@
<comment>Confirmation, like "Ok, I understand it"</comment>
</data>
<data name="OptionDefaults" xml:space="preserve">
<value>Opsieverstekke is vanaf die Bitwarden-toep se wagwoordgenereerder instelbaar.</value>
<value>Option defaults are set from the main Bitwarden app's password generator tool.</value>
</data>
<data name="Options" xml:space="preserve">
<value>Opsies</value>
@@ -665,7 +665,7 @@
<value>Item bygewerk.</value>
</data>
<data name="Submitting" xml:space="preserve">
<value>Word ingedien…</value>
<value>Submitting...</value>
<comment>Message shown when interacting with the server</comment>
</data>
<data name="Syncing" xml:space="preserve">
@@ -698,7 +698,7 @@
<value>Ontgrendel met PIN-kode</value>
</data>
<data name="Validating" xml:space="preserve">
<value>Validering</value>
<value>Validating</value>
<comment>Message shown when interacting with the server</comment>
</data>
<data name="VerificationCode" xml:space="preserve">
@@ -735,7 +735,7 @@
<comment>This is used for the autofill service. ex. "There are no items in your vault for twitter.com".</comment>
</data>
<data name="BitwardenAutofillServiceOverlay" xml:space="preserve">
<value>Wanneer u n toevoerveld kies en n Bitwarden-outovuloorleg sien, kan u daarop tik om die outovuldiens te lanseer.</value>
<value>When you select an input field and see a Bitwarden auto-fill overlay, you can tap it to launch the auto-fill service.</value>
</data>
<data name="BitwardenAutofillServiceNotificationContent" xml:space="preserve">
<value>Tik hierdie kennisgewing om n item vanuit u kluis outomaties in te vul.</value>
@@ -759,7 +759,7 @@
<value>Status</value>
</data>
<data name="BitwardenAutofillServiceAlert2" xml:space="preserve">
<value>Die eenvoudigste manier om nuwe aantekeninge tot u kluis toe te voeg is vanuit die Bitwarden-outovuldiens. Leer meer oor die gebruik van die Bitwarden-outovuldiens in “Instellings”.</value>
<value>The easiest way to add new logins to your vault is from the Bitwarden Auto-fill Service. Learn more about using the Bitwarden Auto-fill Service by navigating to the "Settings" screen.</value>
</data>
<data name="Autofill" xml:space="preserve">
<value>Outovul</value>
@@ -806,10 +806,10 @@
<comment>For 2FA whenever there are no available providers on this device.</comment>
</data>
<data name="NoTwoStepAvailable" xml:space="preserve">
<value>Hierdie rekening het tweestapsaantekening geaktiveer, maar die toestel ondersteun geen van die gekonfigureerde aanbieders nie. Gebruik n ondersteunde toestel en/of voeg aanbieders toe wat beter ondersteuning bied vir meerdere toestelle (soos n waarmerktoep).</value>
<value>This account has two-step login enabled, however, none of the configured two-step providers are supported on this device. Please use a supported device and/or add additional providers that are better supported across devices (such as an authenticator app).</value>
</data>
<data name="RecoveryCodeTitle" xml:space="preserve">
<value>Terugstelkode</value>
<value>Recovery Code</value>
<comment>For 2FA</comment>
</data>
<data name="RememberMe" xml:space="preserve">
@@ -817,7 +817,7 @@
<comment>Remember my two-step login</comment>
</data>
<data name="SendVerificationCodeAgain" xml:space="preserve">
<value>Stuur weer e-pos met bevestigingskode</value>
<value>Send verification code email again</value>
<comment>For 2FA</comment>
</data>
<data name="TwoStepLoginOptions" xml:space="preserve">
@@ -827,11 +827,11 @@
<value>Gebruik n ander tweestapaantekenmetode</value>
</data>
<data name="VerificationEmailNotSent" xml:space="preserve">
<value>Kon nie die e-pos vir bevestiging stuur nie. Probeer weer.</value>
<value>Could not send verification email. Try again.</value>
<comment>For 2FA</comment>
</data>
<data name="VerificationEmailSent" xml:space="preserve">
<value>E-pos met bevesting is verstuur.</value>
<value>Verification email sent.</value>
<comment>For 2FA</comment>
</data>
<data name="YubiKeyInstruction" xml:space="preserve">
@@ -854,7 +854,7 @@
<value>U toestel kan nie hierdie tipe lêer open nie.</value>
</data>
<data name="Downloading" xml:space="preserve">
<value>Laai tans af…</value>
<value>Downloading...</value>
<comment>Message shown when downloading a file</comment>
</data>
<data name="AttachmentLargeWarning" xml:space="preserve">
@@ -862,14 +862,14 @@
<comment>The placeholder will show the file size of the attachment. Ex "25 MB"</comment>
</data>
<data name="AuthenticatorKey" xml:space="preserve">
<value>Waarmerkkode (TOTP)</value>
<value>Authenticator Key (TOTP)</value>
</data>
<data name="VerificationCodeTotp" xml:space="preserve">
<value>Bevestigingskode (TOTP)</value>
<value>Verification Code (TOTP)</value>
<comment>Totp code label</comment>
</data>
<data name="AuthenticatorKeyAdded" xml:space="preserve">
<value>Waarmerksleutel toegevoeg.</value>
<value>Authenticator key added.</value>
</data>
<data name="AuthenticatorKeyReadError" xml:space="preserve">
<value>Kan nie waarmerksleutel lees nie.</value>
@@ -890,16 +890,16 @@
<value>Fotos</value>
</data>
<data name="CopyTotp" xml:space="preserve">
<value>Kopieer TOTP</value>
<value>Copy TOTP</value>
</data>
<data name="DisableAutoTotpCopyDescription" xml:space="preserve">
<value>Indien u aantekening aan n bevestigingskode gekoppel is, word die TOTP-bevestigingskode outomaties na die knipbord gekopieer by die aantekening se outovul.</value>
<value>If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login.</value>
</data>
<data name="DisableAutoTotpCopy" xml:space="preserve">
<value>Deaktiveer outomatiese kopieëring van TOTP</value>
<value>Disable Automatic TOTP Copy</value>
</data>
<data name="PremiumRequired" xml:space="preserve">
<value>n Premie-lidmaatskap is nodig om hierdie funksie te gebruik.</value>
<value>A premium membership is required to use this feature.</value>
</data>
<data name="AttachementAdded" xml:space="preserve">
<value>Aanhegsel toegevoeg</value>
@@ -938,13 +938,13 @@
<value>API-bedienerbronadres</value>
</data>
<data name="CustomEnvironment" xml:space="preserve">
<value>Pasgemaakte omgewing</value>
<value>Custom Environment</value>
</data>
<data name="CustomEnvironmentFooter" xml:space="preserve">
<value>Vir gevorderde gebruikers. U kan die basisbronadres van elke diens onafhanklik instel.</value>
</data>
<data name="EnvironmentSaved" xml:space="preserve">
<value>Die omgewingbronadresse is bewaar.</value>
<value>The environment URLs have been saved.</value>
</data>
<data name="FormattedIncorrectly" xml:space="preserve">
<value>{0} is nie korrek geformatteer nie.</value>
@@ -955,10 +955,10 @@
<comment>"Identity" refers to an identity server. See more context here https://en.wikipedia.org/wiki/Identity_management</comment>
</data>
<data name="SelfHostedEnvironment" xml:space="preserve">
<value>Selfgehuisveste omgewing</value>
<value>Self-hosted Environment</value>
</data>
<data name="SelfHostedEnvironmentFooter" xml:space="preserve">
<value>Spesifiseer die basisbronadres van u selfgehuisveste Bitwarden-installasie.</value>
<value>Specify the base URL of your on-premise hosted Bitwarden installation.</value>
</data>
<data name="ServerUrl" xml:space="preserve">
<value>Bedienerbronadres</value>
@@ -1144,7 +1144,7 @@
<value>Outovul Toeganklikheidsdiens</value>
</data>
<data name="AutofillServiceDescription" xml:space="preserve">
<value>Die Bitwarden-outovuldiens gebruik die Android-outovulraamwerk om te help met die invul van aantekeninge, kredietkaarte en identiteitsinligting in ander toeps op u toestel.</value>
<value>The Bitwarden auto-fill service uses the Android Autofill Framework to assist in filling logins, credit cards, and identity information into other apps on your device.</value>
</data>
<data name="BitwardenAutofillServiceDescription" xml:space="preserve">
<value>Gebruik Bitwarden se outovuldiens om aantekeninge, kredietkaarte en identiteitsinligting in ander toeps in te vul.</value>
@@ -1169,13 +1169,13 @@
<value>Windows Hello</value>
</data>
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
<value>Ons kon nie die Android-outovulinstellingkieslys outomaties vir u open nie. U kan na die outovulinstellingkieslys navigeer dur te gaan na Android Instellings &gt; Stelsel &gt; Tale en toevoer &gt; Gevorderd &gt; Outovuldiens.</value>
<value>We were unable to automatically open the Android autofill settings menu for you. You can navigate to the autofill settings menu manually from Android Settings &gt; System &gt; Languages and input &gt; Advanced &gt; Autofill service.</value>
</data>
<data name="CustomFieldName" xml:space="preserve">
<value>Pasgemaakte veldnaam</value>
</data>
<data name="FieldTypeBoolean" xml:space="preserve">
<value>Booleaans</value>
<value>Boolean</value>
</data>
<data name="FieldTypeHidden" xml:space="preserve">
<value>Versteek</value>
@@ -1318,7 +1318,7 @@
<comment>Plural form of a URI</comment>
</data>
<data name="CheckingPassword" xml:space="preserve">
<value>Gaan tans wagwoord na…</value>
<value>Checking password...</value>
<comment>A loading message when doing an exposed password check.</comment>
</data>
<data name="CheckPassword" xml:space="preserve">
@@ -1446,7 +1446,7 @@
<value>Stel u PIN-kode in om Bitwarden te ontgrendel. U PIN-kode word heringestel indien u ooit volledig by die toep uitteken.</value>
</data>
<data name="LoggedInAsOn" xml:space="preserve">
<value>Op {0} aangeteken as {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">
@@ -1524,22 +1524,22 @@
<comment>The color black</comment>
</data>
<data name="BlacklistedUris" xml:space="preserve">
<value>Versperde URIs</value>
<value>Blacklisted URIs</value>
</data>
<data name="BlacklistedUrisDescription" xml:space="preserve">
<value>URIs op die swartlys word nie outomaties ingevul nie. Die lys moet met kommas geskei wees. Bv. “https://twitter.com, androidapp://com.twitter.android”.</value>
</data>
<data name="DisableSavePrompt" xml:space="preserve">
<value>Deaktiveer bewaarpor</value>
<value>Disable Save Prompt</value>
</data>
<data name="DisableSavePromptDescription" xml:space="preserve">
<value>Die “bewaarpor” vra u outomaties om nuwe items in u kluis te bewaar wanneer u dit vir die eerste maal invoer.</value>
<value>The "Save Prompt" automatically prompts you to save new items to your vault whenever you enter them for the first time.</value>
</data>
<data name="OnRestart" xml:space="preserve">
<value>Nadat toep herbegin is</value>
<value>On App Restart</value>
</data>
<data name="AutofillServiceNotEnabled" xml:space="preserve">
<value>Outovul vereenvoudig veilige toegang tot u Bitwarden-kluis vanuit ander webwerwe en toeps. Dit kom voor of u nog nie n outovuldiens vir Bitwarden geaktiveer het nie. Aktiveer outovul vir Bitwarden in die “Instellings”.</value>
<value>Auto-fill makes it easy to securely access your Bitwarden vault from other websites and apps. It looks like you have not enabled an auto-fill service for Bitwarden. Enable auto-fill for Bitwarden from the "Settings" screen.</value>
</data>
<data name="ThemeAppliedOnRestart" xml:space="preserve">
<value>U temaveranderinge word toegepas wanneer die toep herbegin word.</value>
@@ -1576,16 +1576,16 @@
<value>Bitwarden kort aandag - Sien “Outovul toeganklikheidsdienste” in Bitwarden Instellings</value>
</data>
<data name="BitwardenAutofillServiceOverlayPermission" xml:space="preserve">
<value>3. Op die Android-toepinstellingskerm vir Bitwarden, gaan na die “Gee weer oor ander toeps”-opsie (onder gevorderd) en tokkel die skakelaar om dit te aktiveer.</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 enable overlay support.</value>
</data>
<data name="OverlayPermission" xml:space="preserve">
<value>Toestemmings</value>
</data>
<data name="BitwardenAutofillServiceOpenOverlayPermissionSettings" xml:space="preserve">
<value>Open oorlegtoestemminginstellings</value>
<value>Open Overlay Permission Settings</value>
</data>
<data name="BitwardenAutofillServiceStep3" xml:space="preserve">
<value>3. Op die Android-toepinstellingskerm vir Bitwarden, kies die “Gee weer oor ander toeps”-opsie (onder “gevorderd”) en tokkel die skakelaar om oorleg toe te laat.</value>
<value>3. On the Android App Settings screen for Bitwarden, select "Display over other apps" (under "Advanced") and switch on the toggle to allow the overlay.</value>
</data>
<data name="Denied" xml:space="preserve">
<value>Geweier</value>
@@ -1609,7 +1609,7 @@
<value>Rekeningenkripsiesleutels is uniek tot elke Bitwarden-gebruikersrekening, daarom kan u nie n geënkripteerde uitstuur in n ander rekening invoer nie.</value>
</data>
<data name="ExportVaultConfirmationTitle" xml:space="preserve">
<value>Bevestig kluisuitstuur</value>
<value>Confirm Vault Export</value>
<comment>Title for the alert to confirm vault exports.</comment>
</data>
<data name="Warning" xml:space="preserve">
@@ -1639,7 +1639,7 @@
<value>Aanhegsel suksesvol bewaar</value>
</data>
<data name="AutofillTileAccessibilityRequired" xml:space="preserve">
<value>Aktiveer asb. “Outovultoeganklikheidsdiens” in Bitwarden-instellings om die outovulteël te gebruik.</value>
<value>Please enable "Auto-fill Accessibility Service" from Bitwarden Settings to use the Auto-fill tile.</value>
</data>
<data name="AutofillTileUriNotFound" xml:space="preserve">
<value>Geen wagwoordvelde bespeur</value>
@@ -1653,11 +1653,11 @@
<comment>Confirmation message after successfully soft-deleting a login</comment>
</data>
<data name="Restore" xml:space="preserve">
<value>Stel terug</value>
<value>Restore</value>
<comment>Restores an entity (verb).</comment>
</data>
<data name="Restoring" xml:space="preserve">
<value>Stel tans terug…</value>
<value>Restoring...</value>
<comment>Message shown when interacting with the server</comment>
</data>
<data name="ItemRestored" xml:space="preserve">
@@ -1691,28 +1691,28 @@
<value>Biometriese ontgrendeling vir outovul gedeaktiveer hangende bevestiging van hoofwagwoord.</value>
</data>
<data name="EnableSyncOnRefresh" xml:space="preserve">
<value>Aktiveer sinchronisering by verfrissing</value>
<value>Enable sync on refresh</value>
</data>
<data name="EnableSyncOnRefreshDescription" xml:space="preserve">
<value>Sinchroniseer kluis met aftreekgebaar.</value>
</data>
<data name="LogInSso" xml:space="preserve">
<value>Onderneming-enkelaanteken</value>
<value>Enterprise Single Sign-On</value>
</data>
<data name="LogInSsoSummary" xml:space="preserve">
<value>Teken vinnig aan d.m.v. u organisasie se enkelaantekenportaal (SSO). Voer u organisasie se identifiseerder in om te begin.</value>
<value>Quickly log in using your organization's single sign-on portal. Please enter your organization's identifier to begin.</value>
</data>
<data name="OrgIdentifier" xml:space="preserve">
<value>Organisasie-identifiseerder</value>
</data>
<data name="LoginSsoError" xml:space="preserve">
<value>Kan nie tans met SSO aanteken nie</value>
<value>Currently unable to login with SSO</value>
</data>
<data name="SetMasterPassword" xml:space="preserve">
<value>Stel Hoofwagwoord</value>
</data>
<data name="SetMasterPasswordSummary" xml:space="preserve">
<value>Om aantekening met SSO te voltooi moet u n hoofwagwoord instel vir toegang tot en beskerming van u kluis.</value>
<value>In order to complete logging in with SSO, please set a master password to access and protect your vault.</value>
</data>
<data name="MasterPasswordPolicyInEffect" xml:space="preserve">
<value>Een of meer organisasiebeleide stel die volgende eise aan u hoofwagwoord:</value>
@@ -1745,7 +1745,8 @@
<value>Laai tans</value>
</data>
<data name="AcceptPolicies" xml:space="preserve">
<value>Deur hierdie skuifknop te aktiveer stem u in tot die volgende:</value>
<value>By activating this switch you agree to the following:
</value>
</data>
<data name="AcceptPoliciesError" xml:space="preserve">
<value>Gebruiksvoorwaardes en privaatheidsbeleid is nie erken nie.</value>
@@ -1766,7 +1767,7 @@
<value>Gebruik inlyn outovul</value>
</data>
<data name="InlineAutofillDescription" xml:space="preserve">
<value>Gebruik inlyn outovul indien u gekose IME (toetsbord) dit ondersteun. Indien u konfigurasie nie ondersteun word nie (of die opsie is gedeaktiveer), sal die verstekoutovuloorleg gebruik word.</value>
<value>Use inline autofill if your selected IME (keyboard) supports it. If your configuration is not supported (or this option is disabled), the default Autofill overlay will be used.</value>
</data>
<data name="Accessibility" xml:space="preserve">
<value>Gebruik toeganklikheid</value>
@@ -1857,10 +1858,10 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="Expired" xml:space="preserve">
<value>Verstreke</value>
<value>Expired</value>
</data>
<data name="MaximumAccessCount" xml:space="preserve">
<value>Maksimum toegangsaantal</value>
<value>Maximum Access Count</value>
</data>
<data name="MaximumAccessCountInfo" xml:space="preserve">
<value>Indien ingestel het gebruikers ne meer toegang tot hierdie Send sodra die maksimum aantal toegang bereik is.</value>

View File

@@ -534,7 +534,7 @@
<value>Dərhal</value>
</data>
<data name="VaultTimeout" xml:space="preserve">
<value>Anbara müraciət bitəcək</value>
<value>Anbara müraciət vaxtı bitdi</value>
</data>
<data name="VaultTimeoutAction" xml:space="preserve">
<value>Anbara müraciət vaxtının bitmə əməliyyatı</value>

View File

@@ -209,7 +209,7 @@
<value>Стварыце тэму з праблемай у нашым рэпазіторыі GitHub.</value>
</data>
<data name="FingerprintDirection" xml:space="preserve">
<value>Выкарыстоўвайце свой адбітак пальца для праверкі.</value>
<value>Выкарыстоўвайце свой адбітак пальца для верыфікацыі.</value>
</data>
<data name="Folder" xml:space="preserve">
<value>Папка</value>
@@ -1163,7 +1163,7 @@
<value>Выкарыстоўваць Face ID для разблакіроўкі</value>
</data>
<data name="VerifyFaceID" xml:space="preserve">
<value>Праверка Face ID</value>
<value>Верыфікацыя Face ID</value>
</data>
<data name="WindowsHello" xml:space="preserve">
<value>Windows Hello</value>
@@ -1603,13 +1603,13 @@
<value>Экспартуемы файл утрымлівае даныя вашага сховішча ў незашыфраваным фармаце. Яго не варта захоўваць ці адпраўляць па небяспечным каналам (напрыклад, па электроннай пошце). Выдаліце яго адразу пасля выкарыстання.</value>
</data>
<data name="EncExportKeyWarning" xml:space="preserve">
<value>Пры экспарце даныя шыфруюцца з дапамогай ключа шыфравання ўліковага запісу. Калі вы калі-небудзь павернеце ключ шыфравання ўліковага запісу, вам належыць экспартаваць даныя паўторна, бо вы не зможаце расшыфраваць гэты файл экспарту.</value>
<value>This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file.</value>
</data>
<data name="EncExportAccountWarning" xml:space="preserve">
<value>Ключы шыфравання ўнікальныя для кожнага ўліковага запісу Bitwarden, таму нельга імпартаваць зашыфраванае сховішча ў іншы ўліковы запіс.</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>Пацвердзіць экспарт сховішча</value>
<value>Confirm Vault Export</value>
<comment>Title for the alert to confirm vault exports.</comment>
</data>
<data name="Warning" xml:space="preserve">
@@ -1688,7 +1688,7 @@
<value>Біяметрычныя даныя змяніліся, увайдзіце зноў праз асноўны пароль для ўключэння.</value>
</data>
<data name="BiometricInvalidatedExtension" xml:space="preserve">
<value>Біяметрычная разблакіроўка для аўтазапаўнення адключаная ў чаканні праверкі асноўнага пароля.</value>
<value>Biometric unlock for autofill disabled pending verification of master password.</value>
</data>
<data name="EnableSyncOnRefresh" xml:space="preserve">
<value>Уключыць сінхранізацыю па абнаўленні</value>
@@ -1712,7 +1712,7 @@
<value>Прызначыць асноўны пароль</value>
</data>
<data name="SetMasterPasswordSummary" xml:space="preserve">
<value>Для завяршэння ўваходу праз SSO, задайце асноўны пароль для доступу і абароны вашаго сховішча.</value>
<value>Для завяршэння ўваходу праз SSO, усталюйце галоўны пароль для доступу і абароны вашаго сховішча.</value>
</data>
<data name="MasterPasswordPolicyInEffect" xml:space="preserve">
<value>Згодна з адной або некалькімі палітыкамі арганізацыі неабходна, каб ваш асноўны пароль адказваў наступным патрабаванням:</value>
@@ -1796,10 +1796,10 @@
<value>Пры ўключэнні, служба спецыяльных магчымасцей Bitwarden пакажа ўсплывальнае апавяшчэнне, каб выклікаць службу аўтазапаўнення для старых праграм, якія не падтрымліваюць Android Autofill Framework.</value>
</data>
<data name="PersonalOwnershipSubmitError" xml:space="preserve">
<value>Паводле карпаратыўнай палітыкі вам забаронена захоўваць элементы ў асабістым сховішчы. Змяніце ўладальніка на арганізацыю і выберыце з даступных Калекцый.</value>
<value>Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections.</value>
</data>
<data name="PersonalOwnershipPolicyInEffect" xml:space="preserve">
<value>Палітыка арганізацыі ўплывае на вашы варыянты валодання.</value>
<value>An organization policy is affecting your ownership options.</value>
</data>
<data name="Send" xml:space="preserve">
<value>Адпраўленне</value>
@@ -1824,7 +1824,7 @@
<value>Тэкст, які вы хочаце адправіць.</value>
</data>
<data name="HideTextByDefault" xml:space="preserve">
<value>Пры доступе да адпраўлення хаваць тэкст па змаўчанні.</value>
<value>When accessing the Send, hide the text by default</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="TypeFile" xml:space="preserve">
@@ -1853,11 +1853,11 @@
<value>Час завяршэння</value>
</data>
<data name="ExpirationDateInfo" xml:space="preserve">
<value>Калі зададзена, доступ да гэтага адпраўлення скончыцца ў зададзеныя дату і час.</value>
<value>If set, access to this Send will expire on the specified date and time.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="Expired" xml:space="preserve">
<value>Тэрмін скончыўся</value>
<value>Expired</value>
</data>
<data name="MaximumAccessCount" xml:space="preserve">
<value>Maximum Access Count</value>
@@ -1873,23 +1873,23 @@
<value>Current Access Count</value>
</data>
<data name="NewPassword" xml:space="preserve">
<value>Новы пароль</value>
<value>New Password</value>
</data>
<data name="PasswordInfo" xml:space="preserve">
<value>Optionally require a password for users to access this Send.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="RemovePassword" xml:space="preserve">
<value>Выдаліць пароль</value>
<value>Remove Password</value>
</data>
<data name="AreYouSureRemoveSendPassword" xml:space="preserve">
<value>Вы ўпэўнены, што хочаце выдаліць пароль?</value>
<value>Are you sure you want to remove the password?</value>
</data>
<data name="RemovingSendPassword" xml:space="preserve">
<value>Вылаленне пароля</value>
<value>Removing password</value>
</data>
<data name="SendPasswordRemoved" xml:space="preserve">
<value>Пароль выдалены.</value>
<value>Password has been removed.</value>
</data>
<data name="NotesInfo" xml:space="preserve">
<value>Private notes about this Send.</value>
@@ -1991,12 +1991,12 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="PasswordPrompt" xml:space="preserve">
<value>Паўторны запыт асноўнага пароля</value>
<value>Паўторны запыт галоўнага пароля</value>
</data>
<data name="PasswordConfirmation" xml:space="preserve">
<value>Пацвярджэнне асноўнага пароля</value>
<value>Пацверджанне галоўнага пароля</value>
</data>
<data name="PasswordConfirmationDesc" xml:space="preserve">
<value>Гэтае дзеянне ахоўваецца, для працягу зноў увядзіце пароль для праверкі асобы.</value>
<value>Гэтае дзеянне ахоўваецца, для працягу зноў увядзіце пароль для верыфікацыі асобы.</value>
</data>
</root>

View File

@@ -1093,10 +1093,10 @@
<value>September</value>
</data>
<data name="SSN" xml:space="preserve">
<value>National Insurance number</value>
<value>Aadhar Number</value>
</data>
<data name="StateProvince" xml:space="preserve">
<value>County</value>
<value>State / Union territory</value>
</data>
<data name="Title" xml:space="preserve">
<value>Title</value>
@@ -1685,7 +1685,7 @@
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data>
<data name="BiometricInvalidated" xml:space="preserve">
<value>Biometric unlock disabled pending verification of master password.</value>
<value>Biometric change detected, login using master password to enable again.</value>
</data>
<data name="BiometricInvalidatedExtension" xml:space="preserve">
<value>Biometric unlock for autofill disabled pending verification of master password.</value>
@@ -1745,16 +1745,17 @@
<value>Loading</value>
</data>
<data name="AcceptPolicies" xml:space="preserve">
<value>By activating this switch you agree to the following:</value>
<value>By activating this switch you agree to the following:
</value>
</data>
<data name="AcceptPoliciesError" xml:space="preserve">
<value>Terms of Service and Privacy Policy have not been acknowledged.</value>
</data>
<data name="TermsOfService" xml:space="preserve">
<value>Terms of service</value>
<value>Terms of Service</value>
</data>
<data name="PrivacyPolicy" xml:space="preserve">
<value>Privacy policy</value>
<value>Privacy Policy</value>
</data>
<data name="AccessibilityDrawOverPermissionAlert" xml:space="preserve">
<value>Bitwarden needs attention - Enable "Draw-Over" in "Auto-fill Services" from Bitwarden Settings
@@ -1809,10 +1810,10 @@
</value>
</data>
<data name="PersonalOwnershipSubmitError" xml:space="preserve">
<value>Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organisation and choose from available Collections.</value>
<value>Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections.</value>
</data>
<data name="PersonalOwnershipPolicyInEffect" xml:space="preserve">
<value>An organisation policy is affecting your ownership options.</value>
<value>An organization policy is affecting your ownership options.</value>
</data>
<data name="Send" xml:space="preserve">
<value>Send</value>
@@ -1913,7 +1914,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="NoSends" xml:space="preserve">
<value>There are no Sends in your account.</value>
<value>There are no sends in your account.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AddASend" xml:space="preserve">
@@ -1992,7 +1993,7 @@
<value>Hide my email address from recipients.</value>
</data>
<data name="SendOptionsPolicyInEffect" xml:space="preserve">
<value>One or more organisation policies are affecting your Send options.</value>
<value>One or more organization policies are affecting your Send options.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendFilePremiumRequired" xml:space="preserve">

View File

@@ -1685,7 +1685,7 @@
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data>
<data name="BiometricInvalidated" xml:space="preserve">
<value>Automaattäite kinnitamine läbi biomeetria on keelatud. Oodatakse ülemparooli sisestamist.</value>
<value>Tuvastati biomeetriliste andmete muutus. Selle funktsiooni uuesti kasutamiseks on vajalik sisselogimine ülemparooliga. </value>
</data>
<data name="BiometricInvalidatedExtension" xml:space="preserve">
<value>Automaattäite kinnitamine läbi biomeetria on keelatud. Oodatakse ülemparooli sisestamist.</value>
@@ -1799,7 +1799,7 @@
<value>Ettevõtte poliitika tõttu ei saa sa andmeid oma personaalsesse Hoidlasse salvestada. Vali Omanikuks organisatsioon ja vali mõni saadavaolevatest Kogumikest.</value>
</data>
<data name="PersonalOwnershipPolicyInEffect" xml:space="preserve">
<value>Organisatsiooni poliitika piirab kirje omaniku valikuvõimalusi.</value>
<value>Organisatsiooni poliitika on seadnud omaniku valikutele piirangu.</value>
</data>
<data name="Send" xml:space="preserve">
<value>Send</value>
@@ -1987,7 +1987,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendFileEmailVerificationRequired" xml:space="preserve">
<value>Sendi kasutamiseks pead kinnitama oma e-posti aadressi. Saad seda teha veebihoidlas.</value>
<value>Failide saatmiseks läbi Sendi pead kinnitama oma e-posti.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="PasswordPrompt" xml:space="preserve">

View File

@@ -656,7 +656,7 @@
<value>Aseta PIN-koodi</value>
</data>
<data name="SetPINDirection" xml:space="preserve">
<value>Syötä 4-numeroinen PIN-koodi, jolla sovelluksen lukitus avataan.</value>
<value>Syötä 4-numeroinen PIN-koodi, jonka avulla voit avata sovelluksen lukituksen.</value>
</data>
<data name="ItemInformation" xml:space="preserve">
<value>Kohteen tiedot</value>
@@ -692,10 +692,10 @@
<value>Kaksivaiheinen kirjautuminen tekee tilistäsi turvallisemman edellyttämällä salasanan lisäksi kirjautumisen lisätodennusta todennuslaitteen, sovelluksen, tekstiviestin, puhelun tai sähköpostin avulla. Voit ottaa kaksivaiheisen kirjautumisen käyttöön bitwarden.comverkkoholvissa. Haluatko käydä sivustolla nyt?</value>
</data>
<data name="UnlockWith" xml:space="preserve">
<value>Avaa biometrialla: {0}</value>
<value>Lukituksen avaustapa on {0}</value>
</data>
<data name="UnlockWithPIN" xml:space="preserve">
<value>Avaa PIN-koodilla</value>
<value>Avaa lukitus PIN-koodilla</value>
</data>
<data name="Validating" xml:space="preserve">
<value>Vahvistetaan</value>
@@ -1160,7 +1160,7 @@
<value>Käytä todennukseen Face ID:tä.</value>
</data>
<data name="UseFaceIDToUnlock" xml:space="preserve">
<value>Avaa Face ID:llä</value>
<value>Avaa lukitus Face ID:llä</value>
</data>
<data name="VerifyFaceID" xml:space="preserve">
<value>Vahvista Face ID</value>
@@ -1437,13 +1437,13 @@
<value>PIN</value>
</data>
<data name="Unlock" xml:space="preserve">
<value>Avaa</value>
<value>Avaa lukitus</value>
</data>
<data name="ThirtyMinutes" xml:space="preserve">
<value>30 minuuttia</value>
</data>
<data name="SetPINDescription" xml:space="preserve">
<value>Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos sovelluksesta.</value>
<value>Aseta PIN-koodisi Bitwardenin avausta varten. PIN-asetukset tyhjentyvät, jos kirjaudut kokonaan ulos sovelluksesta.</value>
</data>
<data name="LoggedInAsOn" xml:space="preserve">
<value>Kirjautunut tunnuksella {0} palveluun {1}.</value>
@@ -1517,7 +1517,7 @@
<value>Haluatko varmasti poistua Bitwardenista?</value>
</data>
<data name="PINRequireMasterPasswordRestart" xml:space="preserve">
<value>Vaaditaanko lukituksen avaus pääsalasanalla, kun sovellus käynnistetään uudelleen?</value>
<value>Haluatko vaatia lukituksen avausta pääsalasanallasi sovelluksen uudelleenkäynnistyksen yhteydessä?</value>
</data>
<data name="Black" xml:space="preserve">
<value>Musta</value>
@@ -1570,7 +1570,7 @@
<value>Biometria</value>
</data>
<data name="UseBiometricsToUnlock" xml:space="preserve">
<value>Avaa biometrialla</value>
<value>Avaa lukitus biometrialla</value>
</data>
<data name="AccessibilityOverlayPermissionAlert" xml:space="preserve">
<value>Bitwarden vaatii huomiota - Katso "Automaattisen täytön esteettömyyspalvelu" Bitwardenin asetuksissa</value>
@@ -1685,10 +1685,10 @@
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data>
<data name="BiometricInvalidated" xml:space="preserve">
<value>Biometrinen avaus on poistettu käytöstä, kunnes pääsalasana on vahvistettu.</value>
<value>Biometrinen lukituksen avaus on poistettu käytöstä, kunnes pääsalasana on vahvistettu.</value>
</data>
<data name="BiometricInvalidatedExtension" xml:space="preserve">
<value>Automaattisen täytön biometrinen avaus on poistettu käytöstä, kunnes pääsalasana on vahvistettu.</value>
<value>Automaattisen täytön biometrinen lukituksen avaus on poistettu käytöstä, kunnes pääsalasana on vahvistettu.</value>
</data>
<data name="EnableSyncOnRefresh" xml:space="preserve">
<value>Synkronoi holvi päivityksen yhteydessä</value>

View File

@@ -1785,7 +1785,7 @@
<value>Påkrevd for å bruke Autofill Quick-Action Tile, eller for å utvide Autofill Service ved å bruke Draw-Over (hvis aktivert).</value>
</data>
<data name="DrawOver" xml:space="preserve">
<value>Bruk Tegning-Over</value>
<value>Use Draw-Over</value>
</data>
<data name="DrawOverDescription" xml:space="preserve">
<value>Når dette er aktivert, tillater Bitwarden å vise et sprettoppvindu når innloggingsfelt velges.</value>
@@ -1794,7 +1794,7 @@
<value>Dersom det er aktivert, vil Bitwarden sin tilgjengelighetstjeneste vise en popup når innloggingsfelt er valgt for å hjelpe deg med automatisk utfylling av dine innlogginger.</value>
</data>
<data name="DrawOverDescription3" xml:space="preserve">
<value>Hvis aktivert, vil tilgjengelighet vise en popup for å forsterke Autofill Service for eldre apper som ikke støtter Android Autofill Framework.</value>
<value>If enabled, accessibility will show a popup to augment the Autofill Service for older apps that don't support the Android Autofill Framework.</value>
</data>
<data name="PersonalOwnershipSubmitError" xml:space="preserve">
<value>På grunn av bedrifsretningslinjer er du begrenset fra å lagre objekter til ditt personlige hvelv. Endre alternativ for eierskap til en organisasjon og velg blant tilgjengelige samlinger.</value>
@@ -1811,7 +1811,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="Sends" xml:space="preserve">
<value>Sender</value>
<value>Sends</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="NameInfo" xml:space="preserve">
@@ -1905,7 +1905,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AddASend" xml:space="preserve">
<value>Legg til en sendt</value>
<value>Add a Send</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="CopyLink" xml:space="preserve">
@@ -1931,19 +1931,19 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AreYouSureDeleteSend" xml:space="preserve">
<value>Er du sikker på at du vil slette denne Send?</value>
<value>Are you sure you want to delete this Send?</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendDeleted" xml:space="preserve">
<value>Send har blitt slettet.</value>
<value>Send has been deleted.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendUpdated" xml:space="preserve">
<value>Send oppdatert.</value>
<value>Send updated.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="NewSendCreated" xml:space="preserve">
<value>Ny send opprettet.</value>
<value>New send created.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="OneDay" xml:space="preserve">
@@ -1965,7 +1965,7 @@
<value>Egendefinert</value>
</data>
<data name="ShareOnSave" xml:space="preserve">
<value>Del denne Send ved lagring.</value>
<value>Share this Send upon save.</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendDisabledWarning" xml:space="preserve">
@@ -1992,10 +1992,10 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="PasswordPrompt" xml:space="preserve">
<value>Forespørsel om hovedpassord på nytt</value>
<value>Master password re-prompt</value>
</data>
<data name="PasswordConfirmation" xml:space="preserve">
<value>Superpassord bekreftelse</value>
<value>Master password confirmation</value>
</data>
<data name="PasswordConfirmationDesc" xml:space="preserve">
<value>Denne handlingen er beskyttet, for å fortsette å skrive inn superpassordet på nytt for å verifisere din identitet.</value>

View File

@@ -1905,7 +1905,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AddASend" xml:space="preserve">
<value>Adicionar um Send</value>
<value>Add a Send</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="CopyLink" xml:space="preserve">
@@ -1992,12 +1992,12 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="PasswordPrompt" xml:space="preserve">
<value>Nova solicitação de senha mestra</value>
<value>Master password re-prompt</value>
</data>
<data name="PasswordConfirmation" xml:space="preserve">
<value>Confirmação de senha mestra</value>
<value>Master password confirmation</value>
</data>
<data name="PasswordConfirmationDesc" xml:space="preserve">
<value>Esta ação é protegida, para continuar por favor reinsira a sua senha mestra para verificar a sua identidade.</value>
<value>This action is protected, to continue please re-enter your master password to verify your identity.</value>
</data>
</root>

View File

@@ -2028,10 +2028,31 @@
<data name="Fido2AuthenticateWebAuthn" xml:space="preserve">
<value>Authenticate WebAuthn</value>
</data>
<data name="Fido2CheckBrowser" xml:space="preserve">
<value>Please make sure your default browser supports WebAuthn and try again.</value>
<data name="Fido2SomethingWentWrong" xml:space="preserve">
<value>Something Went Wrong. Try again.</value>
</data>
<data name="ResetPasswordAutoEnrollInviteWarning" xml:space="preserve">
<value>This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password.</value>
<data name="Fido2AbortError" xml:space="preserve">
<value>Aborted FIDO2 operation. Try again.</value>
</data>
<data name="Fido2NetworkFail" xml:space="preserve">
<value>No internet connection. Try again.</value>
</data>
<data name="Fido2NoPermission" xml:space="preserve">
<value>Permission was not given. Try again.</value>
</data>
<data name="Fido2NotSupportedError" xml:space="preserve">
<value>Unsupported device.</value>
</data>
<data name="Fido2PrivacyError" xml:space="preserve">
<value>Privacy issues encountered. Try again.</value>
</data>
<data name="Fido2SecurityError" xml:space="preserve">
<value>Security issues encountered.</value>
</data>
<data name="Fido2ServerDataFail" xml:space="preserve">
<value>The server returned invalid data. Try again.</value>
</data>
<data name="Fido2TimeoutError" xml:space="preserve">
<value>Timeout for FIDO2. Try again</value>
</data>
</root>

View File

@@ -1325,7 +1325,7 @@
<value>Проверьте, не скомпрометирован ли пароль.</value>
</data>
<data name="PasswordExposed" xml:space="preserve">
<value>Этот пароль был скомпрометирован {0} раз(а). Вам следует его изменить.</value>
<value>Этот пароль был скомпрометирован $VALUE$ раз(а). Вам следует его изменить.</value>
</data>
<data name="PasswordSafe" xml:space="preserve">
<value>Этот пароль не обнаружен в известных базах утечек. Можно продолжать его использовать.</value>

View File

@@ -806,7 +806,7 @@
<comment>For 2FA whenever there are no available providers on this device.</comment>
</data>
<data name="NoTwoStepAvailable" xml:space="preserve">
<value>இக்கணக்கில் இரு-படி சரிபார்ப்பு இயக்கத்திலுள்ளது, எனினும், உள்ளமைக்கப்பட்ட இரு-படி வழங்குநர் எவையும் இச்சாதனத்தில் ஆதரிக்கப்படவில்லை. ஆதரிக்கப்பட்ட சாதனம் மற்றும்/அ சாதனங்களுக்கிடையே நன்றாக ஆதரிக்கப்படும் கூடுதல் (அங்கீகார செயலி போன்ற) வழங்குநர்களைப் பயன்படுத்தவும்.</value>
<value>This account has two-step login enabled, however, none of the configured two-step providers are supported on this device. Please use a supported device and/or add additional providers that are better supported across devices (such as an authenticator app).</value>
</data>
<data name="RecoveryCodeTitle" xml:space="preserve">
<value>மீட்பு குறியீடு</value>
@@ -1170,7 +1170,7 @@
<value>விண்டோஸ் ஹலோ</value>
</data>
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
<value>உமக்காக எங்களால் தானாக Android தன்னிரப்பி அமைப்புகள் பட்டியை திறக்க இயலவில்லை. Android அமைப்புகள் &gt; சிஸ்டம் &gt; மொழிகள் மற்றும் உள்ளீடு &gt; மேம்பட்டவை &gt; தன்னிரப்பிச் சேவைக்கு கைமுறையாக நீங்களே தன்னிரப்பி அமைப்புகள் பட்டிக்கு வழிநடக்கலாம்.</value>
<value>We were unable to automatically open the Android autofill settings menu for you. You can navigate to the autofill settings menu manually from Android Settings &gt; System &gt; Languages and input &gt; Advanced &gt; Autofill service.</value>
</data>
<data name="CustomFieldName" xml:space="preserve">
<value>தனிப்பயன் புலத்தின் பெயர்</value>
@@ -1426,7 +1426,7 @@
<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="ShareVaultConfirmation" xml:space="preserve">
<value>நிறுவன கணக்கைப் பயன்படுத்தி உம் பெட்டகத்தைப் பிறருடன் பகிர உம்மை Bitwarden அனுமதிக்கிறது. மேலும் அறிய bitwarden.com வலைத்தளத்தை பார்வையிட விருப்பமா?</value>
<value>Bitwarden allows you to share your vault with others by using an organization account. Would you like to visit the bitwarden.com website to learn more?</value>
</data>
<data name="ExportVault" xml:space="preserve">
<value>பெட்டகத்தை ஏற்றுமதி செய்</value>
@@ -1528,7 +1528,7 @@
<value>தடுப்புப்பட்டியலிடப்பட்ட உரலிகள்</value>
</data>
<data name="BlacklistedUrisDescription" xml:space="preserve">
<value>கரும்பட்டியலிடப்பட்ட உரலிகள் தன்னிர்ப்பலை அளிக்காது. பட்டியல் காற்புள்ளியால் பிரிக்கப்பட்டிருக்க வேண்டும். எகா: "https://twitter.com, androidapp://com.twitter.android".</value>
<value>URIs that are blacklisted will not offer auto-fill. The list should be comma separated. Ex: "https://twitter.com, androidapp://com.twitter.android".</value>
</data>
<data name="DisableSavePrompt" xml:space="preserve">
<value>சேமிப்பு தூண்டியை முடக்கு</value>
@@ -1559,7 +1559,7 @@
<value>பகிர்ந்தவை</value>
</data>
<data name="ToggleVisibility" xml:space="preserve">
<value>புலப்பாட்டை நிலைமாற்று</value>
<value>Toggle Visibility</value>
</data>
<data name="LoginExpired" xml:space="preserve">
<value>உம் உள்நுழைவு அமர்வு காலாவதியானது.</value>
@@ -1604,7 +1604,7 @@
<value>இவ்வேற்றுமதி உம் பெட்டக தரவை மறையாக்கப்படா வடிவில் கொண்டுள்ளது. சேமிக்கவோ பாதுகாப்பற்ற தடங்களில் (மின்னஞ்சல் போன்றவை) அனுப்பவோ கூடாது. பயன்படுத்தியவுடன் அழித்துவிடவும்.</value>
</data>
<data name="EncExportKeyWarning" xml:space="preserve">
<value>இவ்வேற்றுமதி உம் கணக்கின் மறையாக்கவிசை கொண்டு உம் தரவை மறையாக்குகிறது. எப்போவாவது உமது கணக்கின் மறையாகவிசையை சுழற்றினால் இவ்வேற்றுமதிக் கோப்பை மறைநீக்க இயலாததால் மறு ஏற்றுமதி செய்ய வேண்டும்.</value>
<value>This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file.</value>
</data>
<data name="EncExportAccountWarning" xml:space="preserve">
<value>கணக்கு மறையாக்க விசைகள் ஒவ்வொரு Bitwarden பயனர் கணக்கிற்கும் தனித்துவமானது, ஆக ஒரு மறையாக்கப்பட்ட ஏற்றுமதியை வேறொரு கணக்கினுள்ளே இறக்க இயலாது.</value>
@@ -1788,7 +1788,7 @@
<value>மேலே-வரைதல் பயன்படுத்து</value>
</data>
<data name="DrawOverDescription" xml:space="preserve">
<value>இயக்கினால், உள்நுழைவு புலங்கள் தேர்ந்தெடுக்கப்படும்போது ஒரு popup காண்பிக்க Bitwarden அணுகல்தன்மை சேவையை அனுமதிக்கிறது.</value>
<value>When enabled, allows the Bitwarden Accessibility Service to display a popup when login fields are selected.</value>
</data>
<data name="DrawOverDescription2" xml:space="preserve">
<value>If enabled, the Bitwarden Accessibility Service will display a popup when login fields are selected to assist with auto-filling your logins.</value>

View File

@@ -1904,7 +1904,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AddASend" xml:space="preserve">
<value>新增 Send</value>
<value>Add a Send</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="CopyLink" xml:space="preserve">
@@ -1987,16 +1987,16 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendFileEmailVerificationRequired" xml:space="preserve">
<value>必須驗證您的電子郵件才能使用文檔 Send。你可以在網頁密碼庫中驗證您的電子郵件。</value>
<value>必須驗證您的電子郵件才能使用文檔 Send。</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="PasswordPrompt" xml:space="preserve">
<value>重新詢問主密碼</value>
<value>Master password re-prompt</value>
</data>
<data name="PasswordConfirmation" xml:space="preserve">
<value>確認主密碼</value>
<value>Master password confirmation</value>
</data>
<data name="PasswordConfirmationDesc" xml:space="preserve">
<value>此動作受到保護。若要繼續,請重新輸入您的主密碼以驗證您的身份。</value>
<value>This action is protected, to continue please re-enter your master password to verify your identity.</value>
</data>
</root>

View File

@@ -58,10 +58,6 @@ namespace Bit.Core.Abstractions
Task PostTwoFactorEmailAsync(TwoFactorEmailRequest request);
Task PutDeviceTokenAsync(string identifier, DeviceTokenRequest request);
Task PostEventsCollectAsync(IEnumerable<EventRequest> request);
Task<OrganizationKeysResponse> GetOrganizationKeysAsync(string id);
Task<OrganizationAutoEnrollStatusResponse> GetOrganizationAutoEnrollStatusAsync(string identifier);
Task PutOrganizationUserResetPasswordEnrollmentAsync(string orgId, string userId,
OrganizationUserResetPasswordEnrollmentRequest request);
Task<SendResponse> GetSendAsync(string id);
Task<SendResponse> PostSendAsync(SendRequest request);

View File

@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Bit.Core.Enums;
@@ -16,7 +15,5 @@ namespace Bit.Core.Abstractions
Task<MasterPasswordPolicyOptions> GetMasterPasswordPolicyOptions(IEnumerable<Policy> policies = null);
Task<bool> EvaluateMasterPassword(int passwordStrength, string newPassword,
MasterPasswordPolicyOptions enforcedPolicyOptions);
Tuple<ResetPasswordPolicyOptions, bool> GetResetPasswordPolicyOptions(IEnumerable<Policy> policies,
string orgId);
}
}

View File

@@ -16,7 +16,6 @@ namespace Bit.Core.Abstractions
Task<KdfType?> GetKdfAsync();
Task<int?> GetKdfIterationsAsync();
Task<Organization> GetOrganizationAsync(string id);
Task<Organization> GetOrganizationByIdentifierAsync(string identifier);
Task<string> GetSecurityStampAsync();
Task<bool> GetEmailVerifiedAsync();
Task<string> GetUserIdAsync();

View File

@@ -0,0 +1,8 @@
namespace Bit.Core.Enums
{
public enum Fido2CodesTypes
{
RequestSignInUser = 994,
RequestRegisterNewKey = 995,
}
}

View File

@@ -10,6 +10,5 @@
PersonalOwnership = 5, // Disables personal vault ownership for adding/cloning items
DisableSend = 6, // Disables the ability to create and edit Sends
SendOptions = 7, // Sets restrictions or defaults for Bitwarden Sends
ResetPassword = 8, // Allows orgs to use reset password : also can enable auto-enrollment during invite flow
}
}

View File

@@ -0,0 +1,16 @@
using Newtonsoft.Json;
namespace Bit.Core.Models.Data
{
public class Fido2AssertionResponse : Data
{
[JsonProperty("authenticatorData")]
public string AuthenticatorData { get; set; }
[JsonProperty("signature")]
public string Signature { get; set; }
[JsonProperty("clientDataJson")]
public string ClientDataJson { get; set; }
[JsonProperty("userHandle")]
public string UserHandle { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using Newtonsoft.Json;
namespace Bit.Core.Models.Data
{
public class Fido2AuthenticatorSelection : Data
{
[JsonProperty("authenticatorAttachment")]
public string AuthenticatorAttachment { get; set; }
[JsonProperty("userVerification")]
public string UserVerification { get; set; }
[JsonProperty("requireResidentKey")]
public string RequireResidentKey { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Bit.Core.Models.Data
{
public class Fido2CredentialDescriptor : Data
{
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("transports", NullValueHandling = NullValueHandling.Ignore)]
public List<string> Transports { get; set; }
}
}

View File

@@ -0,0 +1,12 @@
using Newtonsoft.Json;
namespace Bit.Core.Models.Data
{
public class Fido2PubKeyCredParam : Data
{
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("alg")]
public int Alg { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using Newtonsoft.Json;
namespace Bit.Core.Models.Data
{
public class Fido2RP : Data
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("icon")]
public string Icon { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
using Newtonsoft.Json;
namespace Bit.Core.Models.Data
{
public class Fido2User : Data
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("displayName")]
public string DisplayName { get; set; }
[JsonProperty("icon")]
public string Icon { get; set; }
}
}

View File

@@ -1,5 +1,4 @@
using System.Data.Common;
using Bit.Core.Enums;
using Bit.Core.Enums;
using Bit.Core.Models.Response;
namespace Bit.Core.Models.Data
@@ -28,7 +27,6 @@ namespace Bit.Core.Models.Data
MaxCollections = response.MaxCollections;
MaxStorageGb = response.MaxStorageGb;
Permissions = response.Permissions ?? new Permissions();
Identifier = response.Identifier;
}
public string Id { get; set; }
@@ -49,6 +47,5 @@ namespace Bit.Core.Models.Data
public short? MaxCollections { get; set; }
public short? MaxStorageGb { get; set; }
public Permissions Permissions { get; set; } = new Permissions();
public string Identifier { get; set; }
}
}

View File

@@ -1,5 +1,4 @@
using System.Data.Common;
using Bit.Core.Enums;
using Bit.Core.Enums;
using Bit.Core.Models.Data;
namespace Bit.Core.Models.Domain
@@ -28,7 +27,6 @@ namespace Bit.Core.Models.Domain
MaxCollections = obj.MaxCollections;
MaxStorageGb = obj.MaxStorageGb;
Permissions = obj.Permissions ?? new Permissions();
Identifier = obj.Identifier;
}
public string Id { get; set; }
@@ -49,7 +47,6 @@ namespace Bit.Core.Models.Domain
public short? MaxCollections { get; set; }
public short? MaxStorageGb { get; set; }
public Permissions Permissions { get; set; } = new Permissions();
public string Identifier { get; set; }
public bool CanAccess
{

View File

@@ -1,7 +0,0 @@
namespace Bit.Core.Models.Domain
{
public class ResetPasswordPolicyOptions
{
public bool AutoEnrollEnabled { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
using Bit.Core.Models.Data;
using Newtonsoft.Json;
namespace Bit.Core.Models.Request
{
public class Fido2AuthenticationChallengeRequest
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("rawId")]
public string RawId { get; set; }
[JsonProperty("response")]
public Fido2AssertionResponse Response { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("extensions", NullValueHandling = NullValueHandling.Ignore)]
public string Extensions { get; set; }
}
}

View File

@@ -1,7 +0,0 @@
namespace Bit.Core.Models.Request
{
public class OrganizationUserResetPasswordEnrollmentRequest
{
public string ResetPasswordKey { get; set; }
}
}

View File

@@ -0,0 +1,22 @@
using System.Collections.Generic;
using Bit.Core.Models.Data;
using Newtonsoft.Json;
namespace Bit.Core.Models.Response
{
public class Fido2AuthenticationChallengeResponse
{
[JsonProperty("challenge")]
public string Challenge { get; set; }
[JsonProperty("rpId")]
public string RpId { get; set; }
[JsonProperty("timeout")]
public double Timeout { get; set; }
[JsonProperty("allowCredentials")]
public List<Fido2CredentialDescriptor> AllowCredentials { get; set; }
[JsonProperty("userVerification")]
public string UserVerification { get; set; }
[JsonProperty("extensions", NullValueHandling = NullValueHandling.Ignore)]
public object Extensions { get; set; }
}
}

View File

@@ -0,0 +1,28 @@
using System.Collections.Generic;
using Bit.Core.Models.Data;
using Newtonsoft.Json;
namespace Bit.Core.Models.Response
{
public class Fido2RegistrationChallengeResponse
{
[JsonProperty("challenge")]
public string Challenge { get; set; }
[JsonProperty("timeout")]
public double Timeout { get; set; }
[JsonProperty("rp")]
public Fido2RP Rp { get; set; }
[JsonProperty("user")]
public Fido2User User { get; set; }
[JsonProperty("pubKeyCredParams")]
public List<Fido2PubKeyCredParam> PubKeyCredParams { get; set; }
[JsonProperty("excludeCredentials")]
public List<Fido2CredentialDescriptor> ExcludeCredentials { get; set; }
[JsonProperty("authenticatorSelection")]
public Fido2AuthenticatorSelection AuthenticatorSelection { get; set; }
[JsonProperty("attestation", NullValueHandling = NullValueHandling.Ignore)]
public object Attestation { get; set; }
[JsonProperty("extensions", NullValueHandling = NullValueHandling.Ignore)]
public object Extensions { get; set; }
}
}

View File

@@ -1,8 +0,0 @@
namespace Bit.Core.Models.Response
{
public class OrganizationAutoEnrollStatusResponse
{
public string Id { get; set; }
public bool ResetPasswordEnabled { get; set; }
}
}

View File

@@ -1,8 +0,0 @@
namespace Bit.Core.Models.Response
{
public class OrganizationKeysResponse
{
public string PrivateKey { get; set; }
public string PublicKey { get; set; }
}
}

View File

@@ -24,6 +24,5 @@ namespace Bit.Core.Models.Response
public OrganizationUserType Type { get; set; }
public bool Enabled { get; set; }
public Permissions Permissions { get; set; } = new Permissions();
public string Identifier { get; set; }
}
}

View File

@@ -177,7 +177,7 @@ namespace Bit.Core.Services
return SendAsync<PasswordVerificationRequest, object>(HttpMethod.Post, "/accounts/verify-password", request,
true, false);
}
#endregion
#region Folder APIs
@@ -402,32 +402,6 @@ namespace Bit.Core.Services
string.Concat("/hibp/breach?username=", username), null, true, true);
}
#endregion
#region Organizations APIs
public Task<OrganizationKeysResponse> GetOrganizationKeysAsync(string id)
{
return SendAsync<object, OrganizationKeysResponse>(HttpMethod.Get, $"/organizations/{id}/keys", null, true, true);
}
public Task<OrganizationAutoEnrollStatusResponse> GetOrganizationAutoEnrollStatusAsync(string identifier)
{
return SendAsync<object, OrganizationAutoEnrollStatusResponse>(HttpMethod.Get,
$"/organizations/{identifier}/auto-enroll-status", null, true, true);
}
#endregion
#region Organization User APIs
public Task PutOrganizationUserResetPasswordEnrollmentAsync(string orgId, string userId,
OrganizationUserResetPasswordEnrollmentRequest request)
{
return SendAsync<OrganizationUserResetPasswordEnrollmentRequest, object>(HttpMethod.Put,
$"/organizations/{orgId}/users/{userId}/reset-password-enrollment", request, true, false);
}
#endregion
#region Helpers

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
@@ -181,23 +180,6 @@ namespace Bit.Core.Services
return true;
}
public Tuple<ResetPasswordPolicyOptions, bool> GetResetPasswordPolicyOptions(IEnumerable<Policy> policies,
string orgId)
{
var resetPasswordPolicyOptions = new ResetPasswordPolicyOptions();
if (policies == null || orgId == null)
{
return new Tuple<ResetPasswordPolicyOptions, bool>(resetPasswordPolicyOptions, false);
}
var policy = policies.FirstOrDefault(p =>
p.OrganizationId == orgId && p.Type == PolicyType.ResetPassword && p.Enabled);
resetPasswordPolicyOptions.AutoEnrollEnabled = GetPolicyBool(policy, "autoEnrollEnabled") ?? false;
return new Tuple<ResetPasswordPolicyOptions, bool>(resetPasswordPolicyOptions, policy != null);
}
private int? GetPolicyInt(Policy policy, string key)
{
if (policy.Data.ContainsKey(key))

View File

@@ -167,19 +167,6 @@ namespace Bit.Core.Services
}
return new Organization(organizations[id]);
}
public async Task<Organization> GetOrganizationByIdentifierAsync(string identifier)
{
var userId = await GetUserIdAsync();
var organizations = await GetAllOrganizationAsync();
if (organizations == null || organizations.Count == 0)
{
return null;
}
return organizations.FirstOrDefault(o => o.Identifier == identifier);
}
public async Task<List<Organization>> GetAllOrganizationAsync()
{

View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key>
<string>com.8bit.bitwarden.autofill</string>
<key>CFBundleShortVersionString</key>
<string>2.13.0</string>
<string>2.12.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundleLocalizations</key>

View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key>
<string>com.8bit.bitwarden.find-login-action-extension</string>
<key>CFBundleShortVersionString</key>
<string>2.13.0</string>
<string>2.12.0</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>

View File

@@ -11,7 +11,7 @@
<key>CFBundleIdentifier</key>
<string>com.8bit.bitwarden</string>
<key>CFBundleShortVersionString</key>
<string>2.13.0</string>
<string>2.12.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundleIconName</key>
@@ -24,8 +24,6 @@
<string>bitwarden</string>
<string>org-appextension-feature-password-management</string>
</array>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>com.8bit.bitwarden.url</string>
</dict>

View File

@@ -122,32 +122,15 @@
<comment>Max 30 characters</comment>
</data>
<data name="Description" xml:space="preserve">
<value>Bitwarden, Inc. is the parent company of 8bit Solutions LLC.
<value>Bitwarden is the easiest and safest way to store all of your logins and passwords while conveniently keeping them synced between all of your devices. The Bitwarden app extension allows you to quickly log into any website through Safari or Chrome and is supported by hundreds of other popular apps.
NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS &amp; WORLD REPORT, CNET, AND MORE.
Password theft is a serious problem. The websites and apps that you use are under attack every day. Security breaches occur and your passwords are stolen. When you reuse the same passwords across apps and websites, hackers can easily access your email, bank, and other important accounts.
Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go.
Security experts recommend that you use a different, randomly generated password for every account that you create. But how do you manage all those passwords? Bitwarden makes it easy for you to create, store, and access your passwords.
Generate strong, unique, and random passwords based on security requirements for every website you frequent.
Bitwarden stores all of your logins in an encrypted vault that syncs across all of your devices. Since it's fully encrypted before it ever leaves your device, only you have access to your data. Not even the team at Bitwarden can read your data, even if we wanted to. Your data is sealed with AES-256 bit encryption, salted hashing, and PBKDF2 SHA-256.
Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone.
Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues.
Why Choose Bitwarden:
World-Class Encryption
Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private.
Built-in Password Generator
Generate strong, unique, and random passwords based on security requirements for every website you frequent.
Global Translations
Bitwarden translations exist in 40 languages and are growing, thanks to our global community.
Cross-Platform Applications
Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more.
</value>
Bitwarden is 100% open source software. The source code for Bitwarden is hosted on GitHub and everyone is free to review, audit, and contribute to the Bitwarden codebase.</value>
<comment>Max 4000 characters</comment>
</data>
<data name="Keywords" xml:space="preserve">

View File

@@ -122,31 +122,15 @@
<comment>Max 30 characters</comment>
</data>
<data name="Description" xml:space="preserve">
<value>Bitwarden, Inc. 是 8bit Solutions LLC 的母公司
<value>Bitwarden 簡單易用,可以安全地儲存您所有的帳戶和密碼,並在多部裝置之間同步
被 THE VERGE、U.S. NEWS &amp; WORLD REPORT、CNET 等評為最佳密碼管理器
帳戶被盜是個嚴重的問題,您造訪的網站和應用程式每天都遭受攻擊。每當發生安全漏洞,您的密碼可能就會被盜取。當您在不同網頁和程式用了同一組密碼,駭客就可以一舉獲得您的電子郵件帳戶,甚至銀行帳戶或其他重要帳戶
從任何地方不限制設備管理、存儲、保護和共享無限的密碼。Bitwarden 為每個人提供開源的密碼管理解決方案,無論是在家裡,在工作中,還是在旅途中
安全專家建議您在每個帳戶使用不同、隨機產生的密碼。但要如何管理這些密碼呢? Bitwarden 讓您輕鬆建立、儲存、存取您的密碼
基於安全要求,為你經常訪問的每個網站生成強大、唯一和隨機的密碼
Bitwarden 將您所有的登入資料儲存在加密的密碼庫中,並同步至您所有的裝置上。由於資料傳送前已經徹底加密,因此只有您可以存取這些資料,甚至連 Bitwarden 的開發者都無法讀取您的資料。所有資料均使用 AES-256 加密、加鹽雜湊加密以及 PBKDF2 SHA-256 函式加密
Bitwarden Send 快速傳輸加密的信息---文檔和文本---直接給任何人。
Bitwarden 為公司提供團隊和企業計劃,因此你可以安全地與同事共享密碼。
為何選擇 Bitwarden
世界級的加密技術
密碼受到先進的端到端加密AES-256 位、鹽化標籤和 PBKDF2 SHA-256的保護為您的數據保持安全和隱密。
內置密碼生成器
基於安全要求,為你經常訪問的每個網站生成強大、唯一和隨機的密碼。
全球翻譯
Bitwarden 的翻譯有 40 種語言,而且還在不斷增加,感謝我們的全球社區。
跨平台的應用程式
從任何瀏覽器、行動裝置或桌面作業系統,以及更多的地方,在您的 Bitwarden 密碼庫中保護和分享敏感數據。</value>
Bitwarden 為完全的開源軟體。Bitwarden 的原始碼託管於 GitHub 上,所有人都能夠自由檢閱、稽核與貢獻程式碼。</value>
<comment>Max 4000 characters</comment>
</data>
<data name="Keywords" xml:space="preserve">

View File

@@ -126,32 +126,15 @@
<comment>Max 80 characters</comment>
</data>
<data name="FullDesciption" xml:space="preserve">
<value>Bitwarden, Inc. is the parent company of 8bit Solutions LLC.
<value>Bitwarden is the easiest and safest way to store all of your logins and passwords while conveniently keeping them synced between all of your devices.
NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS &amp; WORLD REPORT, CNET, AND MORE.
Password theft is a serious problem. The websites and apps that you use are under attack every day. Security breaches occur and your passwords are stolen. When you reuse the same passwords across apps and websites, hackers can easily access your email, bank, and other important accounts.
Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go.
Security experts recommend that you use a different, randomly generated password for every account that you create. But how do you manage all those passwords? Bitwarden makes it easy for you to create, store, and access your passwords.
Generate strong, unique, and random passwords based on security requirements for every website you frequent.
Bitwarden stores all of your logins in an encrypted vault that syncs across all of your devices. Since it's fully encrypted before it ever leaves your device, only you have access to your data. Not even the team at Bitwarden can read your data, even if we wanted to. Your data is sealed with AES-256 bit encryption, salted hashing, and PBKDF2 SHA-256.
Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone.
Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues.
Why Choose Bitwarden:
World-Class Encryption
Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashtag, and PBKDF2 SHA-256) so your data stays secure and private.
Built-in Password Generator
Generate strong, unique, and random passwords based on security requirements for every website you frequent.
Global Translations
Bitwarden translations exist in 40 languages and are growing, thanks to our global community.
Cross-Platform Applications
Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more.
</value>
Bitwarden is 100% open source software. The source code for Bitwarden is hosted on GitHub and everyone is free to review, audit, and contribute to the Bitwarden codebase.</value>
<comment>Max 4000 characters</comment>
</data>
<data name="FeatureGraphic" xml:space="preserve">

View File

@@ -126,31 +126,13 @@
<comment>Max 80 characters</comment>
</data>
<data name="FullDesciption" xml:space="preserve">
<value>Bitwarden, Inc. 是 8bit Solutions LLC 的母公司
<value>bitwarden 簡單易用,可以安全地儲存你所有的帳戶和密碼,並在多部裝置之間同步
被 THE VERGE、U.S. NEWS &amp; WORLD REPORT、CNET 等評為最佳密碼管理器
帳戶被盜是個嚴重的問題,你用的網頁和應用程式每天都遭受攻擊。每當發生安全漏洞,你的密碼就會被盜取。當你在不同網頁和程式用了同一組密碼,駭客就可以一舉獲得你的電子郵件帳戶,甚至銀行帳戶或其他重要帳戶
從任何地方不限制設備管理、存儲、保護和共享無限的密碼。Bitwarden 為每個人提供開源的密碼管理解決方案,無論是在家裡,在工作中,還是在旅途中
安全專家建議你在每個帳戶使用不同、隨機產生的密碼。但要如何管理這些密碼呢? Bitwarden 讓你輕鬆建立、儲存、存取你的密碼
基於安全要求,為你經常訪問的每個網站生成強大、唯一和隨機的密碼。
Bitwarden Send 快速傳輸加密的信息---文檔和文本---直接給任何人。
Bitwarden 為公司提供團隊和企業計劃,因此你可以安全地與同事共享密碼。
為何選擇 Bitwarden
世界級的加密技術
密碼受到先進的端到端加密AES-256 位、鹽化標籤和 PBKDF2 SHA-256的保護為您的數據保持安全和隱密。
內置密碼生成器
基於安全要求,為你經常訪問的每個網站生成強大、唯一和隨機的密碼。
全球翻譯
Bitwarden 的翻譯有 40 種語言,而且還在不斷增加,感謝我們的全球社區。
跨平台的應用程式
從任何瀏覽器、行動裝置或桌面作業系統,以及更多的地方,在您的 Bitwarden 密碼庫中保護和分享敏感數據。</value>
bitwarden 將你所有登入資料儲存在加密的密碼庫中,並同步至你所有的裝置上。由於資料傳送前已經徹底加密,因此只有你可以存取這些資料,甚至連 bitwarden 的開發者都無法讀取你的資料。所有資料均使用 AES-256 加密、加鹽雜湊加密以及 PBKDF2 SHA-256 函式加密。</value>
<comment>Max 4000 characters</comment>
</data>
<data name="FeatureGraphic" xml:space="preserve">