mirror of
https://github.com/bitwarden/mobile
synced 2026-01-11 21:13:37 +00:00
Compare commits
7 Commits
feature/pa
...
v2022.8.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27b8c952e4 | ||
|
|
8df68a5606 | ||
|
|
c0f04fd94d | ||
|
|
1c3ade8152 | ||
|
|
f36f60dc22 | ||
|
|
e2b6e99a0c | ||
|
|
263aeef030 |
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -57,7 +57,7 @@ jobs:
|
||||
|
||||
android:
|
||||
name: Android
|
||||
runs-on: windows-2019
|
||||
runs-on: windows-2022
|
||||
needs: setup
|
||||
steps:
|
||||
- name: Setup NuGet
|
||||
@@ -212,7 +212,7 @@ jobs:
|
||||
|
||||
f-droid:
|
||||
name: F-Droid Build
|
||||
runs-on: windows-2019
|
||||
runs-on: windows-2022
|
||||
steps:
|
||||
- name: Setup NuGet
|
||||
uses: nuget/setup-nuget@b2bc17b761a1d88cab755a776c7922eb26eefbfa # v1.0.6
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2022.6.2" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2022.8.0" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/>
|
||||
|
||||
@@ -54,4 +54,4 @@
|
||||
</intent>
|
||||
</queries>
|
||||
|
||||
</manifest>
|
||||
</manifest>
|
||||
@@ -122,9 +122,6 @@
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Remove="Pages\Accounts\AccountsPopupPage.xaml.cs" />
|
||||
<Compile Update="Pages\Accounts\LoginPasswordlessPage.xaml.cs">
|
||||
<DependentUpon>LoginPasswordlessPage.xaml</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<pages:BaseContentPage
|
||||
xmlns="http://xamarin.com/schemas/2014/forms"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||
x:Class="Bit.App.Pages.LoginPasswordlessPage"
|
||||
xmlns:pages="clr-namespace:Bit.App.Pages"
|
||||
xmlns:controls="clr-namespace:Bit.App.Controls"
|
||||
xmlns:u="clr-namespace:Bit.App.Utilities"
|
||||
x:DataType="pages:LoginPasswordlessViewModel"
|
||||
Title="{Binding PageTitle}">
|
||||
|
||||
<ContentPage.BindingContext>
|
||||
<pages:LoginPasswordlessViewModel />
|
||||
</ContentPage.BindingContext>
|
||||
|
||||
<ContentPage.ToolbarItems>
|
||||
<ToolbarItem Text="{u:I18n Close}" Clicked="Close_Clicked" Order="Primary" />
|
||||
</ContentPage.ToolbarItems>
|
||||
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<u:InverseBoolConverter x:Key="inverseBool" />
|
||||
<u:StringHasValueConverter x:Key="stringHasValue" />
|
||||
<u:IsNotNullConverter x:Key="notNull" />
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ScrollView x:Name="_scrollView" Padding="7, 0, 7, 20">
|
||||
<StackLayout>
|
||||
<Label
|
||||
Text="{u:I18n AreYouTryingToLogIn}"
|
||||
FontSize="Title"
|
||||
FontAttributes="Bold"
|
||||
Margin="0,14,0,21"/>
|
||||
<Label
|
||||
Text="{Binding LogInAttempByLabel}"
|
||||
FontSize="Small"
|
||||
Margin="0,0,0,24"/>
|
||||
<Label
|
||||
Text="{u:I18n FingerprintPhrase}"
|
||||
FontSize="Small"
|
||||
FontAttributes="Bold"/>
|
||||
<controls:MonoLabel
|
||||
FormattedText="{Binding FingerprintPhraseFormatted}"
|
||||
FontSize="Medium"
|
||||
Margin="0,0,0,27"/>
|
||||
<Label
|
||||
Text="{u:I18n DeviceType}"
|
||||
FontSize="Small"
|
||||
FontAttributes="Bold"/>
|
||||
<Label
|
||||
Text="{Binding DeviceType}"
|
||||
FontSize="Small"
|
||||
Margin="0,0,0,21"/>
|
||||
<Label
|
||||
Text="{u:I18n IpAddress}"
|
||||
FontSize="Small"
|
||||
FontAttributes="Bold"/>
|
||||
<Label
|
||||
Text="{Binding IpAddress}"
|
||||
FontSize="Small"
|
||||
Margin="0,0,0,21"/>
|
||||
<Label
|
||||
Text="{u:I18n Near}"
|
||||
FontSize="Small"
|
||||
FontAttributes="Bold"/>
|
||||
<Label
|
||||
Text="{Binding NearLocation}"
|
||||
FontSize="Small"
|
||||
Margin="0,0,0,21"/>
|
||||
<Label
|
||||
Text="{u:I18n Time}"
|
||||
FontSize="Small"
|
||||
FontAttributes="Bold"/>
|
||||
<Label
|
||||
Text="{Binding TimeOfRequestText}"
|
||||
FontSize="Small"
|
||||
Margin="0,0,0,57"/>
|
||||
<Button
|
||||
Text="{u:I18n ConfirmLogIn}"
|
||||
Command="{Binding AcceptRequestCommand}"
|
||||
Margin="0,0,0,17"
|
||||
StyleClass="btn-primary"/>
|
||||
<Button
|
||||
Text="{u:I18n DenyLogIn}"
|
||||
Command="{Binding RejectRequestCommand}"
|
||||
StyleClass="btn-secundary"/>
|
||||
</StackLayout>
|
||||
</ScrollView>
|
||||
|
||||
</pages:BaseContentPage>
|
||||
@@ -1,36 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Bit.App.Pages
|
||||
{
|
||||
public partial class LoginPasswordlessPage : BaseContentPage
|
||||
{
|
||||
private LoginPasswordlessViewModel _vm;
|
||||
|
||||
public LoginPasswordlessPage(string fingerprintPhrase, string email, string deviceType, string ipAddress, string location, DateTime requestDate)
|
||||
{
|
||||
InitializeComponent();
|
||||
_vm = BindingContext as LoginPasswordlessViewModel;
|
||||
_vm.Page = this;
|
||||
_vm.Email = email;
|
||||
_vm.DeviceType = deviceType;
|
||||
_vm.IpAddress = ipAddress;
|
||||
_vm.NearLocation = location;
|
||||
_vm.FingerprintPhrase = fingerprintPhrase;
|
||||
_vm.RequestDate = requestDate;
|
||||
}
|
||||
|
||||
private async void Close_Clicked(object sender, System.EventArgs e)
|
||||
{
|
||||
await Close();
|
||||
}
|
||||
|
||||
public async Task Close()
|
||||
{
|
||||
if (DoOnce())
|
||||
{
|
||||
await Navigation.PopModalAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,189 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.App.Resources;
|
||||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Utilities;
|
||||
using Xamarin.Forms;
|
||||
using Bit.App.Utilities;
|
||||
using System.Linq;
|
||||
using Xamarin.CommunityToolkit.ObjectModel;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Bit.App.Pages
|
||||
{
|
||||
public class LoginPasswordlessViewModel : BaseViewModel
|
||||
{
|
||||
private IAuthService _authService;
|
||||
private IPlatformUtilsService _platformUtilsService;
|
||||
private ILogger _logger;
|
||||
private string _logInAttempByLabel;
|
||||
private string _deviceType;
|
||||
private FormattedString _fingerprintPhraseFormatted;
|
||||
private string _fingerprintPhrase;
|
||||
private string _email;
|
||||
private string _timeOfRequest;
|
||||
private DateTime _requestDate;
|
||||
private string _nearLocation;
|
||||
private string _ipAddress;
|
||||
|
||||
public LoginPasswordlessViewModel()
|
||||
{
|
||||
_authService = ServiceContainer.Resolve<IAuthService>("authService");
|
||||
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
|
||||
_logger = ServiceContainer.Resolve<ILogger>("logger");
|
||||
|
||||
PageTitle = AppResources.LogInRequested;
|
||||
|
||||
AcceptRequestCommand = new AsyncCommand(AcceptRequestAsync,
|
||||
onException: ex => _logger.Exception(ex),
|
||||
allowsMultipleExecutions: false);
|
||||
RejectRequestCommand = new AsyncCommand(RejectRequestAsync,
|
||||
onException: ex => _logger.Exception(ex),
|
||||
allowsMultipleExecutions: false);
|
||||
}
|
||||
|
||||
public ICommand AcceptRequestCommand { get; }
|
||||
|
||||
public ICommand RejectRequestCommand { get; }
|
||||
|
||||
public string Email
|
||||
{
|
||||
get => _email;
|
||||
set
|
||||
{
|
||||
LogInAttempByLabel = string.Format(AppResources.LogInAttemptByOn, value, "bitwarden login test");
|
||||
SetProperty(ref _email, value);
|
||||
}
|
||||
}
|
||||
|
||||
public string FingerprintPhrase
|
||||
{
|
||||
get => _fingerprintPhrase;
|
||||
set
|
||||
{
|
||||
FingerprintPhraseFormatted = CreateFingerprintPhrase(value);
|
||||
SetProperty(ref _fingerprintPhrase, value);
|
||||
}
|
||||
}
|
||||
|
||||
public FormattedString FingerprintPhraseFormatted
|
||||
{
|
||||
get => _fingerprintPhraseFormatted;
|
||||
set => SetProperty(ref _fingerprintPhraseFormatted, value);
|
||||
}
|
||||
|
||||
public string LogInAttempByLabel
|
||||
{
|
||||
get => _logInAttempByLabel;
|
||||
set => SetProperty(ref _logInAttempByLabel, value);
|
||||
}
|
||||
|
||||
public string DeviceType
|
||||
{
|
||||
get => _deviceType;
|
||||
set => SetProperty(ref _deviceType, value);
|
||||
}
|
||||
|
||||
public string IpAddress
|
||||
{
|
||||
get => _ipAddress;
|
||||
set => SetProperty(ref _ipAddress, value);
|
||||
}
|
||||
|
||||
public string NearLocation
|
||||
{
|
||||
get => _nearLocation;
|
||||
set => SetProperty(ref _nearLocation, value);
|
||||
}
|
||||
|
||||
public DateTime RequestDate
|
||||
{
|
||||
get => _requestDate;
|
||||
set
|
||||
{
|
||||
TimeOfRequestText = CreateRequestDate();
|
||||
SetProperty(ref _requestDate, value);
|
||||
}
|
||||
}
|
||||
|
||||
public string TimeOfRequestText
|
||||
{
|
||||
get => _timeOfRequest;
|
||||
set
|
||||
{
|
||||
SetProperty(ref _timeOfRequest, value);
|
||||
}
|
||||
}
|
||||
|
||||
private FormattedString CreateFingerprintPhrase(string fingerprintPhrase)
|
||||
{
|
||||
var fingerprintList = fingerprintPhrase.Split('-').ToList();
|
||||
var fs = new FormattedString();
|
||||
var lastFingerprint = fingerprintList.LastOrDefault();
|
||||
|
||||
foreach (var fingerprint in fingerprintList)
|
||||
{
|
||||
fs.Spans.Add(new Span
|
||||
{
|
||||
Text = fingerprint
|
||||
});
|
||||
|
||||
if(fingerprint == lastFingerprint)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
fs.Spans.Add(new Span
|
||||
{
|
||||
Text = "-",
|
||||
TextColor = ThemeManager.GetResourceColor("DangerColor")
|
||||
});
|
||||
}
|
||||
|
||||
return fs;
|
||||
}
|
||||
|
||||
private string CreateRequestDate()
|
||||
{
|
||||
var minutesSinceRequest = RequestDate.ToUniversalTime().Minute - DateTime.UtcNow.Minute;
|
||||
if(minutesSinceRequest < 5)
|
||||
{
|
||||
return AppResources.JustNow;
|
||||
}
|
||||
if(minutesSinceRequest < 59)
|
||||
{
|
||||
return $"{minutesSinceRequest} {AppResources.MinutesAgo}";
|
||||
}
|
||||
|
||||
return RequestDate.ToShortTimeString();
|
||||
}
|
||||
|
||||
private async Task AcceptRequestAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var res = await _authService.LogInPasswordlessAcceptAsync();
|
||||
await ((LoginPasswordlessPage)this.Page).Close();
|
||||
_platformUtilsService.ShowToast("info", null, AppResources.LogInAccepted);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Exception(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task RejectRequestAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var res = await _authService.LogInPasswordlessRejectAsync();
|
||||
await ((LoginPasswordlessPage)this.Page).Close();
|
||||
_platformUtilsService.ShowToast("info", null, AppResources.LogInDenied);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Exception(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -132,20 +132,20 @@
|
||||
<StackLayout StyleClass="box" IsVisible="{Binding ShowAndroidAutofillSettings}">
|
||||
<StackLayout StyleClass="box-row, box-row-input">
|
||||
<Label
|
||||
Text="{u:I18n BlacklistedUris}"
|
||||
Text="{u:I18n AutofillBlockedUris}"
|
||||
StyleClass="box-label" />
|
||||
<Editor
|
||||
x:Name="_blacklistedUrisEditor"
|
||||
Text="{Binding AutofillBlacklistedUris}"
|
||||
x:Name="_autofillBlockedUrisEditor"
|
||||
Text="{Binding AutofillBlockedUris}"
|
||||
StyleClass="box-value"
|
||||
AutoSize="TextChanges"
|
||||
IsSpellCheckEnabled="False"
|
||||
IsTextPredictionEnabled="False"
|
||||
Keyboard="Url"
|
||||
Unfocused="BlacklistedUrisEditor_Unfocused" />
|
||||
Unfocused="AutofillBlockedUrisEditor_Unfocused" />
|
||||
</StackLayout>
|
||||
<Label
|
||||
Text="{u:I18n BlacklistedUrisDescription}"
|
||||
Text="{u:I18n AutofillBlockedUrisDescription}"
|
||||
StyleClass="box-footer-label" />
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
|
||||
@@ -45,12 +45,12 @@ namespace Bit.App.Pages
|
||||
protected async override void OnDisappearing()
|
||||
{
|
||||
base.OnDisappearing();
|
||||
await _vm.UpdateAutofillBlacklistedUris();
|
||||
await _vm.UpdateAutofillBlockedUris();
|
||||
}
|
||||
|
||||
private async void BlacklistedUrisEditor_Unfocused(object sender, FocusEventArgs e)
|
||||
private async void AutofillBlockedUrisEditor_Unfocused(object sender, FocusEventArgs e)
|
||||
{
|
||||
await _vm.UpdateAutofillBlacklistedUris();
|
||||
await _vm.UpdateAutofillBlockedUris();
|
||||
}
|
||||
|
||||
private async void Close_Clicked(object sender, System.EventArgs e)
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace Bit.App.Pages
|
||||
|
||||
|
||||
private bool _autofillSavePrompt;
|
||||
private string _autofillBlacklistedUris;
|
||||
private string _autofillBlockedUris;
|
||||
private bool _favicon;
|
||||
private bool _autoTotpCopy;
|
||||
private int _clearClipboardSelectedIndex;
|
||||
@@ -167,10 +167,10 @@ namespace Bit.App.Pages
|
||||
}
|
||||
}
|
||||
|
||||
public string AutofillBlacklistedUris
|
||||
public string AutofillBlockedUris
|
||||
{
|
||||
get => _autofillBlacklistedUris;
|
||||
set => SetProperty(ref _autofillBlacklistedUris, value);
|
||||
get => _autofillBlockedUris;
|
||||
set => SetProperty(ref _autofillBlockedUris, value);
|
||||
}
|
||||
|
||||
public bool ShowAndroidAutofillSettings
|
||||
@@ -182,8 +182,8 @@ namespace Bit.App.Pages
|
||||
public async Task InitAsync()
|
||||
{
|
||||
AutofillSavePrompt = !(await _stateService.GetAutofillDisableSavePromptAsync()).GetValueOrDefault();
|
||||
var blacklistedUrisList = await _stateService.GetAutofillBlacklistedUrisAsync();
|
||||
AutofillBlacklistedUris = blacklistedUrisList != null ? string.Join(", ", blacklistedUrisList) : null;
|
||||
var blockedUrisList = await _stateService.GetAutofillBlacklistedUrisAsync();
|
||||
AutofillBlockedUris = blockedUrisList != null ? string.Join(", ", blockedUrisList) : null;
|
||||
AutoTotpCopy = !(await _stateService.GetDisableAutoTotpCopyAsync() ?? false);
|
||||
Favicon = !(await _stateService.GetDisableFaviconAsync()).GetValueOrDefault();
|
||||
var theme = await _stateService.GetThemeAsync();
|
||||
@@ -252,19 +252,19 @@ namespace Bit.App.Pages
|
||||
}
|
||||
}
|
||||
|
||||
public async Task UpdateAutofillBlacklistedUris()
|
||||
public async Task UpdateAutofillBlockedUris()
|
||||
{
|
||||
if (_inited)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(AutofillBlacklistedUris))
|
||||
if (string.IsNullOrWhiteSpace(AutofillBlockedUris))
|
||||
{
|
||||
await _stateService.SetAutofillBlacklistedUrisAsync(null);
|
||||
AutofillBlacklistedUris = null;
|
||||
AutofillBlockedUris = null;
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
var csv = AutofillBlacklistedUris;
|
||||
var csv = AutofillBlockedUris;
|
||||
var urisList = new List<string>();
|
||||
foreach (var uri in csv.Split(','))
|
||||
{
|
||||
@@ -281,7 +281,7 @@ namespace Bit.App.Pages
|
||||
urisList.Add(cleanedUri);
|
||||
}
|
||||
await _stateService.SetAutofillBlacklistedUrisAsync(urisList);
|
||||
AutofillBlacklistedUris = string.Join(", ", urisList);
|
||||
AutofillBlockedUris = string.Join(", ", urisList);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace Bit.App.Pages
|
||||
public bool UseFrame { get; set; }
|
||||
public Func<Task> ExecuteAsync { get; set; }
|
||||
|
||||
public bool SubLabelTextEnabled => SubLabel == AppResources.Enabled;
|
||||
public bool SubLabelTextEnabled => SubLabel == AppResources.On;
|
||||
public string LineBreakMode => SubLabel == null ? "TailTruncation" : "";
|
||||
public bool ShowSubLabel => SubLabel.Length != 0;
|
||||
public bool ShowTimeInput => Time != null;
|
||||
|
||||
@@ -450,7 +450,7 @@ namespace Bit.App.Pages
|
||||
autofillItems.Add(new SettingsPageListItem
|
||||
{
|
||||
Name = AppResources.AutofillServices,
|
||||
SubLabel = _deviceActionService.AutofillServicesEnabled() ? AppResources.Enabled : AppResources.Disabled,
|
||||
SubLabel = _deviceActionService.AutofillServicesEnabled() ? AppResources.On : AppResources.Off,
|
||||
ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new AutofillServicesPage(Page as SettingsPage)))
|
||||
});
|
||||
}
|
||||
@@ -500,7 +500,7 @@ namespace Bit.App.Pages
|
||||
new SettingsPageListItem
|
||||
{
|
||||
Name = AppResources.UnlockWithPIN,
|
||||
SubLabel = _pin ? AppResources.Enabled : AppResources.Disabled,
|
||||
SubLabel = _pin ? AppResources.On : AppResources.Off,
|
||||
ExecuteAsync = () => UpdatePinAsync()
|
||||
},
|
||||
new SettingsPageListItem
|
||||
@@ -525,7 +525,7 @@ namespace Bit.App.Pages
|
||||
var item = new SettingsPageListItem
|
||||
{
|
||||
Name = string.Format(AppResources.UnlockWith, biometricName),
|
||||
SubLabel = _biometric ? AppResources.Enabled : AppResources.Disabled,
|
||||
SubLabel = _biometric ? AppResources.On : AppResources.Off,
|
||||
ExecuteAsync = () => UpdateBiometricAsync()
|
||||
};
|
||||
securityItems.Insert(2, item);
|
||||
@@ -554,7 +554,7 @@ namespace Bit.App.Pages
|
||||
securityItems.Add(new SettingsPageListItem
|
||||
{
|
||||
Name = AppResources.AllowScreenCapture,
|
||||
SubLabel = _screenCaptureAllowed ? AppResources.Enabled : AppResources.Disabled,
|
||||
SubLabel = _screenCaptureAllowed ? AppResources.On : AppResources.Off,
|
||||
ExecuteAsync = () => SetScreenCaptureAllowedAsync()
|
||||
});
|
||||
}
|
||||
@@ -627,7 +627,7 @@ namespace Bit.App.Pages
|
||||
new SettingsPageListItem
|
||||
{
|
||||
Name = AppResources.SubmitCrashLogs,
|
||||
SubLabel = _reportLoggingEnabled ? AppResources.Enabled : AppResources.Disabled,
|
||||
SubLabel = _reportLoggingEnabled ? AppResources.On : AppResources.Off,
|
||||
ExecuteAsync = () => LoggerReportingAsync()
|
||||
},
|
||||
#endif
|
||||
|
||||
@@ -571,6 +571,8 @@
|
||||
IsVisible="{Binding IsLinkedType}" />
|
||||
<controls:IconLabel
|
||||
Text="{Binding ValueText, Mode=OneWay}"
|
||||
AutomationProperties.IsInAccessibleTree="true"
|
||||
AutomationProperties.Name="{Binding ValueAccessibilityText, Mode=OneWay}"
|
||||
StyleClass="box-value"
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
|
||||
@@ -727,6 +727,7 @@ namespace Bit.App.Pages
|
||||
additionalPropertyNames: new string[]
|
||||
{
|
||||
nameof(ValueText),
|
||||
nameof(ValueAccessibilityText),
|
||||
nameof(IsBooleanType),
|
||||
nameof(IsHiddenType),
|
||||
nameof(IsTextType),
|
||||
@@ -750,7 +751,7 @@ namespace Bit.App.Pages
|
||||
{
|
||||
if (IsBooleanType)
|
||||
{
|
||||
return _field.Value == "true" ? BitwardenIcons.CheckSquare : BitwardenIcons.Square;
|
||||
return _field.BoolValue ? BitwardenIcons.CheckSquare : BitwardenIcons.Square;
|
||||
}
|
||||
else if (IsLinkedType)
|
||||
{
|
||||
@@ -764,6 +765,19 @@ namespace Bit.App.Pages
|
||||
}
|
||||
}
|
||||
|
||||
public string ValueAccessibilityText
|
||||
{
|
||||
get
|
||||
{
|
||||
if (IsBooleanType)
|
||||
{
|
||||
return _field.BoolValue ? AppResources.Enabled : AppResources.Disabled;
|
||||
}
|
||||
|
||||
return ValueText;
|
||||
}
|
||||
}
|
||||
|
||||
public FormattedString ColoredHiddenValue => PasswordFormatter.FormatPassword(_field.Value);
|
||||
|
||||
public Command ToggleHiddenValueCommand { get; set; }
|
||||
|
||||
98
src/App/Resources/AppResources.Designer.cs
generated
98
src/App/Resources/AppResources.Designer.cs
generated
@@ -1235,6 +1235,18 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
public static string Off {
|
||||
get {
|
||||
return ResourceManager.GetString("Off", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string On {
|
||||
get {
|
||||
return ResourceManager.GetString("On", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string Status {
|
||||
get {
|
||||
return ResourceManager.GetString("Status", resourceCulture);
|
||||
@@ -2747,15 +2759,15 @@ namespace Bit.App.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
public static string BlacklistedUris {
|
||||
public static string AutofillBlockedUris {
|
||||
get {
|
||||
return ResourceManager.GetString("BlacklistedUris", resourceCulture);
|
||||
return ResourceManager.GetString("AutofillBlockedUris", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string BlacklistedUrisDescription {
|
||||
public static string AutofillBlockedUrisDescription {
|
||||
get {
|
||||
return ResourceManager.GetString("BlacklistedUrisDescription", resourceCulture);
|
||||
return ResourceManager.GetString("AutofillBlockedUrisDescription", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4066,83 +4078,5 @@ namespace Bit.App.Resources {
|
||||
return ResourceManager.GetString("AreYouSureYouWantToEnableScreenCapture", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string LogInRequested {
|
||||
get {
|
||||
return ResourceManager.GetString("LogInRequested", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string AreYouTryingToLogIn {
|
||||
get {
|
||||
return ResourceManager.GetString("AreYouTryingToLogIn", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string LogInAttemptByOn {
|
||||
get {
|
||||
return ResourceManager.GetString("LogInAttemptByOn", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string DeviceType {
|
||||
get {
|
||||
return ResourceManager.GetString("DeviceType", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string IpAddress {
|
||||
get {
|
||||
return ResourceManager.GetString("IpAddress", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string Time {
|
||||
get {
|
||||
return ResourceManager.GetString("Time", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string Near {
|
||||
get {
|
||||
return ResourceManager.GetString("Near", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string ConfirmLogIn {
|
||||
get {
|
||||
return ResourceManager.GetString("ConfirmLogIn", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string DenyLogIn {
|
||||
get {
|
||||
return ResourceManager.GetString("DenyLogIn", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string JustNow {
|
||||
get {
|
||||
return ResourceManager.GetString("JustNow", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string MinutesAgo {
|
||||
get {
|
||||
return ResourceManager.GetString("MinutesAgo", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string LogInAccepted {
|
||||
get {
|
||||
return ResourceManager.GetString("LogInAccepted", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public static string LogInDenied {
|
||||
get {
|
||||
return ResourceManager.GetString("LogInDenied", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
@@ -418,7 +418,7 @@
|
||||
<value>Use the Bitwarden accessibility service to auto-fill your logins across apps and the web.</value>
|
||||
</data>
|
||||
<data name="AutofillService" xml:space="preserve">
|
||||
<value>Auto-fill Service</value>
|
||||
<value>Auto-fill service</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>Avoid Ambiguous Characters</value>
|
||||
@@ -445,7 +445,7 @@
|
||||
<value>You can change your email address on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
||||
</data>
|
||||
<data name="ChangeMasterPassword" xml:space="preserve">
|
||||
<value>Change Master Password</value>
|
||||
<value>Change master password</value>
|
||||
</data>
|
||||
<data name="ChangePasswordConfirmation" xml:space="preserve">
|
||||
<value>You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?</value>
|
||||
@@ -473,13 +473,13 @@
|
||||
<value>Enter your account email address to receive your master password hint.</value>
|
||||
</data>
|
||||
<data name="ExntesionReenable" xml:space="preserve">
|
||||
<value>Re-enable App Extension</value>
|
||||
<value>Re-enable app extension</value>
|
||||
</data>
|
||||
<data name="ExtensionAlmostDone" xml:space="preserve">
|
||||
<value>Almost done!</value>
|
||||
</data>
|
||||
<data name="ExtensionEnable" xml:space="preserve">
|
||||
<value>Enable App Extension</value>
|
||||
<value>Enable app extension</value>
|
||||
</data>
|
||||
<data name="ExtensionInSafari" xml:space="preserve">
|
||||
<value>In Safari, find Bitwarden using the share icon (hint: scroll to the right on the bottom row of the menu).</value>
|
||||
@@ -694,7 +694,7 @@
|
||||
<value>Syncing failed.</value>
|
||||
</data>
|
||||
<data name="SyncVaultNow" xml:space="preserve">
|
||||
<value>Sync Vault Now</value>
|
||||
<value>Sync vault now</value>
|
||||
</data>
|
||||
<data name="TouchID" xml:space="preserve">
|
||||
<value>Touch ID</value>
|
||||
@@ -723,7 +723,7 @@
|
||||
<value>View Item</value>
|
||||
</data>
|
||||
<data name="WebVault" xml:space="preserve">
|
||||
<value>Bitwarden Web Vault</value>
|
||||
<value>Bitwarden web vault</value>
|
||||
</data>
|
||||
<data name="Lost2FAApp" xml:space="preserve">
|
||||
<value>Lost authenticator app?</value>
|
||||
@@ -733,7 +733,7 @@
|
||||
<comment>Screen title</comment>
|
||||
</data>
|
||||
<data name="ExtensionActivated" xml:space="preserve">
|
||||
<value>Extension Activated!</value>
|
||||
<value>Extension activated!</value>
|
||||
</data>
|
||||
<data name="Icons" xml:space="preserve">
|
||||
<value>Icons</value>
|
||||
@@ -770,6 +770,12 @@
|
||||
<data name="Enabled" xml:space="preserve">
|
||||
<value>Enabled</value>
|
||||
</data>
|
||||
<data name="Off" xml:space="preserve">
|
||||
<value>Off</value>
|
||||
</data>
|
||||
<data name="On" xml:space="preserve">
|
||||
<value>On</value>
|
||||
</data>
|
||||
<data name="Status" xml:space="preserve">
|
||||
<value>Status</value>
|
||||
</data>
|
||||
@@ -798,7 +804,7 @@
|
||||
<value>You are searching for an auto-fill item for "{0}".</value>
|
||||
</data>
|
||||
<data name="LearnOrg" xml:space="preserve">
|
||||
<value>Learn About Organizations</value>
|
||||
<value>Learn about organizations</value>
|
||||
</data>
|
||||
<data name="CannotOpenApp" xml:space="preserve">
|
||||
<value>Cannot open the app "{0}".</value>
|
||||
@@ -1542,10 +1548,10 @@
|
||||
<value>Default (System)</value>
|
||||
</data>
|
||||
<data name="DefaultDarkTheme" xml:space="preserve">
|
||||
<value>Default Dark Theme</value>
|
||||
<value>Default dark theme</value>
|
||||
</data>
|
||||
<data name="DefaultDarkThemeDescription" xml:space="preserve">
|
||||
<value>Choose the dark theme to use when using Default (System) theme while your device's dark mode is enabled</value>
|
||||
<value>Choose the dark theme to use when using Default (System) theme while your device's dark mode is enabled.</value>
|
||||
</data>
|
||||
<data name="CopyNotes" xml:space="preserve">
|
||||
<value>Copy Note</value>
|
||||
@@ -1567,11 +1573,11 @@
|
||||
<value>Nord</value>
|
||||
<comment>'Nord' is the name of a specific color scheme. It should not be translated.</comment>
|
||||
</data>
|
||||
<data name="BlacklistedUris" xml:space="preserve">
|
||||
<value>Blacklisted URIs</value>
|
||||
<data name="AutofillBlockedUris" xml:space="preserve">
|
||||
<value>Auto-fill blocked URIs</value>
|
||||
</data>
|
||||
<data name="BlacklistedUrisDescription" xml:space="preserve">
|
||||
<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 name="AutofillBlockedUrisDescription" xml:space="preserve">
|
||||
<value>Auto-fill will not be offered for blocked URIs. Separate multiple URIs with a comma. For example: "https://twitter.com, androidapp://com.twitter.android".</value>
|
||||
</data>
|
||||
<data name="AskToAddLogin" xml:space="preserve">
|
||||
<value>Ask to add login</value>
|
||||
@@ -1814,16 +1820,16 @@
|
||||
<value>Bitwarden needs attention - Enable "Draw-Over" in "Auto-fill Services" from Bitwarden Settings</value>
|
||||
</data>
|
||||
<data name="AutofillServices" xml:space="preserve">
|
||||
<value>Auto-fill Services</value>
|
||||
<value>Auto-fill services</value>
|
||||
</data>
|
||||
<data name="InlineAutofill" xml:space="preserve">
|
||||
<value>Use Inline Autofill</value>
|
||||
<value>Use inline autofill</value>
|
||||
</data>
|
||||
<data name="InlineAutofillDescription" xml:space="preserve">
|
||||
<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>Use Accessibility</value>
|
||||
<value>Use accessibility</value>
|
||||
</data>
|
||||
<data name="AccessibilityDescription" xml:space="preserve">
|
||||
<value>Use the Bitwarden Accessibility Service to auto-fill your logins across apps and the web. When enabled, we'll display a popup when login fields are selected.</value>
|
||||
@@ -1838,7 +1844,7 @@
|
||||
<value>Required to use the Autofill Quick-Action Tile, or to augment the Autofill Service by using Draw-Over (if enabled).</value>
|
||||
</data>
|
||||
<data name="DrawOver" xml:space="preserve">
|
||||
<value>Use Draw-Over</value>
|
||||
<value>Use draw-over</value>
|
||||
</data>
|
||||
<data name="DrawOverDescription" xml:space="preserve">
|
||||
<value>When enabled, allows the Bitwarden Accessibility Service to display a popup when login fields are selected.</value>
|
||||
@@ -2264,51 +2270,9 @@
|
||||
<value>We were unable to process your request. Please try again or contact us.</value>
|
||||
</data>
|
||||
<data name="AllowScreenCapture" xml:space="preserve">
|
||||
<value>Allow Screen Capture</value>
|
||||
<value>Allow screen capture</value>
|
||||
</data>
|
||||
<data name="AreYouSureYouWantToEnableScreenCapture" xml:space="preserve">
|
||||
<value>Are you sure you want to enable Screen Capture?</value>
|
||||
</data>
|
||||
<data name="LogInRequested" xml:space="preserve">
|
||||
<value>Log in requested</value>
|
||||
</data>
|
||||
<data name="AreYouTryingToLogIn" xml:space="preserve">
|
||||
<value>Are you trying to log in?</value>
|
||||
</data>
|
||||
<data name="LogInAttemptByOn" xml:space="preserve">
|
||||
<value>Log in attempt by {0} on {1}</value>
|
||||
</data>
|
||||
<data name="FingerprintPhrase" xml:space="preserve">
|
||||
<value>Fingerprint phrase</value>
|
||||
</data>
|
||||
<data name="DeviceType" xml:space="preserve">
|
||||
<value>Device Type</value>
|
||||
</data>
|
||||
<data name="IpAddress" xml:space="preserve">
|
||||
<value>IP Address</value>
|
||||
</data>
|
||||
<data name="Time" xml:space="preserve">
|
||||
<value>Time</value>
|
||||
</data>
|
||||
<data name="Near" xml:space="preserve">
|
||||
<value>Near</value>
|
||||
</data>
|
||||
<data name="ConfirmLogIn" xml:space="preserve">
|
||||
<value>Confirm Log In</value>
|
||||
</data>
|
||||
<data name="DenyLogIn" xml:space="preserve">
|
||||
<value>Deny Log In</value>
|
||||
</data>
|
||||
<data name="JustNow" xml:space="preserve">
|
||||
<value>Just Now</value>
|
||||
</data>
|
||||
<data name="MinutesAgo" xml:space="preserve">
|
||||
<value>minutes ago</value>
|
||||
</data>
|
||||
<data name="LogInAccepted" xml:space="preserve">
|
||||
<value>Log in accepted</value>
|
||||
</data>
|
||||
<data name="LogInDenied" xml:space="preserve">
|
||||
<value>Log in denied</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -25,11 +25,6 @@ namespace Bit.Core.Abstractions
|
||||
Task<AuthResult> LogInSsoAsync(string code, string codeVerifier, string redirectUrl, string orgId);
|
||||
Task<AuthResult> LogInCompleteAsync(string email, string masterPassword, TwoFactorProviderType twoFactorProvider, string twoFactorToken, bool? remember = null);
|
||||
Task<AuthResult> LogInTwoFactorAsync(TwoFactorProviderType twoFactorProvider, string twoFactorToken, string captchaToken, bool? remember = null);
|
||||
|
||||
Task<AuthResult> GetLogInPasswordlessRequestsAsync();
|
||||
Task<AuthResult> LogInPasswordlessAcceptAsync();
|
||||
Task<AuthResult> LogInPasswordlessRejectAsync();
|
||||
|
||||
void LogOut(Action callback);
|
||||
void Init();
|
||||
}
|
||||
|
||||
@@ -19,5 +19,6 @@ namespace Bit.Core.Models.View
|
||||
public string MaskedValue => Value != null ? "••••••••" : null;
|
||||
public bool NewField { get; set; }
|
||||
public LinkedIdType? LinkedId { get; set; }
|
||||
public bool BoolValue => bool.TryParse(Value, out var b) && b;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -468,9 +468,5 @@ namespace Bit.Core.Services
|
||||
TwoFactorProvidersData = null;
|
||||
SelectedTwoFactorProviderType = null;
|
||||
}
|
||||
|
||||
public async Task<AuthResult> GetLogInPasswordlessRequestsAsync() => await Task.FromResult<AuthResult>(new AuthResult());
|
||||
public async Task<AuthResult> LogInPasswordlessAcceptAsync() => await Task.FromResult<AuthResult>(new AuthResult());
|
||||
public async Task<AuthResult> LogInPasswordlessRejectAsync() => await Task.FromResult<AuthResult>(new AuthResult());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden.autofill</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2022.6.2</string>
|
||||
<string>2022.8.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleLocalizations</key>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden.find-login-action-extension</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2022.6.2</string>
|
||||
<string>2022.8.0</string>
|
||||
<key>CFBundleLocalizations</key>
|
||||
<array>
|
||||
<string>en</string>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2022.6.2</string>
|
||||
<string>2022.8.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2022.6.2</string>
|
||||
<string>2022.8.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleIconName</key>
|
||||
|
||||
Reference in New Issue
Block a user