2019-05-27 17:57:10 +02:00
|
|
|
|
using Bit.App.Controls;
|
2019-05-28 15:54:08 +02:00
|
|
|
|
using Bit.Core.Abstractions;
|
|
|
|
|
using Bit.Core.Utilities;
|
2019-05-27 17:57:10 +02:00
|
|
|
|
using System;
|
2019-05-28 15:04:20 +02:00
|
|
|
|
using System.Threading.Tasks;
|
2019-05-28 15:54:08 +02:00
|
|
|
|
using Xamarin.Forms;
|
2019-05-24 03:19:45 +02:00
|
|
|
|
|
|
|
|
|
namespace Bit.App.Pages
|
|
|
|
|
{
|
|
|
|
|
public partial class TwoFactorPage : BaseContentPage
|
|
|
|
|
{
|
2019-05-28 15:54:08 +02:00
|
|
|
|
private readonly IBroadcasterService _broadcasterService;
|
|
|
|
|
private readonly IMessagingService _messagingService;
|
|
|
|
|
|
2019-05-24 03:19:45 +02:00
|
|
|
|
private TwoFactorPageViewModel _vm;
|
2019-06-10 16:45:22 +02:00
|
|
|
|
private bool _inited;
|
2019-05-24 03:19:45 +02:00
|
|
|
|
|
|
|
|
|
public TwoFactorPage()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2019-05-28 15:54:08 +02:00
|
|
|
|
SetActivityIndicator();
|
|
|
|
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
|
|
|
|
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
|
2019-05-24 03:19:45 +02:00
|
|
|
|
_vm = BindingContext as TwoFactorPageViewModel;
|
|
|
|
|
_vm.Page = this;
|
2019-05-27 17:57:10 +02:00
|
|
|
|
DuoWebView = _duoWebView;
|
2019-06-12 03:31:51 +02:00
|
|
|
|
if(Device.RuntimePlatform == Device.Android)
|
|
|
|
|
{
|
2019-06-15 00:08:08 +02:00
|
|
|
|
ToolbarItems.Remove(_cancelItem);
|
2019-06-12 03:31:51 +02:00
|
|
|
|
}
|
2019-05-24 03:19:45 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-05-27 17:57:10 +02:00
|
|
|
|
public HybridWebView DuoWebView { get; set; }
|
|
|
|
|
|
2019-05-28 15:12:05 +02:00
|
|
|
|
public void AddContinueButton()
|
|
|
|
|
{
|
2019-06-15 00:08:08 +02:00
|
|
|
|
if(!ToolbarItems.Contains(_continueItem))
|
2019-05-28 15:12:05 +02:00
|
|
|
|
{
|
|
|
|
|
ToolbarItems.Add(_continueItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RemoveContinueButton()
|
|
|
|
|
{
|
2019-06-15 00:08:08 +02:00
|
|
|
|
if(ToolbarItems.Contains(_continueItem))
|
2019-05-28 15:12:05 +02:00
|
|
|
|
{
|
|
|
|
|
ToolbarItems.Remove(_continueItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-28 15:54:08 +02:00
|
|
|
|
|
2019-05-28 15:04:20 +02:00
|
|
|
|
protected async override void OnAppearing()
|
2019-05-24 03:19:45 +02:00
|
|
|
|
{
|
|
|
|
|
base.OnAppearing();
|
2019-05-30 17:40:33 +02:00
|
|
|
|
_broadcasterService.Subscribe(nameof(TwoFactorPage), (message) =>
|
2019-05-28 15:54:08 +02:00
|
|
|
|
{
|
|
|
|
|
if(message.Command == "gotYubiKeyOTP")
|
|
|
|
|
{
|
2019-07-07 03:59:13 +02:00
|
|
|
|
var token = (string)message.Data;
|
2019-07-07 04:09:20 +02:00
|
|
|
|
if(_vm.YubikeyMethod && !string.IsNullOrWhiteSpace(token) &&
|
2019-07-22 19:59:12 +02:00
|
|
|
|
token.Length == 44 && !token.Contains(" "))
|
2019-05-28 15:54:08 +02:00
|
|
|
|
{
|
2019-05-30 17:40:33 +02:00
|
|
|
|
Device.BeginInvokeOnMainThread(async () =>
|
|
|
|
|
{
|
2019-07-07 03:59:13 +02:00
|
|
|
|
_vm.Token = token;
|
2019-05-30 17:40:33 +02:00
|
|
|
|
await _vm.SubmitAsync();
|
|
|
|
|
});
|
2019-05-28 15:54:08 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(message.Command == "resumeYubiKey")
|
|
|
|
|
{
|
|
|
|
|
if(_vm.YubikeyMethod)
|
|
|
|
|
{
|
|
|
|
|
_messagingService.Send("listenYubiKeyOTP", true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
2019-06-10 16:45:22 +02:00
|
|
|
|
|
|
|
|
|
if(!_inited)
|
2019-05-28 15:04:20 +02:00
|
|
|
|
{
|
2019-06-10 16:45:22 +02:00
|
|
|
|
_inited = true;
|
|
|
|
|
await LoadOnAppearedAsync(_scrollView, true, () =>
|
2019-05-28 16:12:51 +02:00
|
|
|
|
{
|
2019-06-10 16:45:22 +02:00
|
|
|
|
_vm.Init();
|
|
|
|
|
if(_vm.TotpMethod)
|
|
|
|
|
{
|
|
|
|
|
RequestFocus(_totpEntry);
|
|
|
|
|
}
|
|
|
|
|
return Task.FromResult(0);
|
|
|
|
|
});
|
|
|
|
|
}
|
2019-05-24 03:19:45 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-05-28 15:54:08 +02:00
|
|
|
|
protected override void OnDisappearing()
|
|
|
|
|
{
|
|
|
|
|
base.OnDisappearing();
|
|
|
|
|
if(!_vm.YubikeyMethod)
|
|
|
|
|
{
|
|
|
|
|
_messagingService.Send("listenYubiKeyOTP", false);
|
2019-06-10 16:53:11 +02:00
|
|
|
|
_broadcasterService.Unsubscribe(nameof(TwoFactorPage));
|
2019-05-28 15:54:08 +02:00
|
|
|
|
}
|
2019-06-10 16:53:11 +02:00
|
|
|
|
}
|
|
|
|
|
protected override bool OnBackButtonPressed()
|
|
|
|
|
{
|
|
|
|
|
if(_vm.YubikeyMethod)
|
|
|
|
|
{
|
|
|
|
|
_messagingService.Send("listenYubiKeyOTP", false);
|
|
|
|
|
_broadcasterService.Unsubscribe(nameof(TwoFactorPage));
|
|
|
|
|
}
|
|
|
|
|
return base.OnBackButtonPressed();
|
2019-05-28 15:54:08 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-05-27 16:28:38 +02:00
|
|
|
|
private async void Continue_Clicked(object sender, EventArgs e)
|
2019-05-24 03:19:45 +02:00
|
|
|
|
{
|
|
|
|
|
if(DoOnce())
|
|
|
|
|
{
|
2019-05-27 16:28:38 +02:00
|
|
|
|
await _vm.SubmitAsync();
|
2019-05-24 03:19:45 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-27 16:28:38 +02:00
|
|
|
|
private async void Methods_Clicked(object sender, EventArgs e)
|
2019-05-24 03:19:45 +02:00
|
|
|
|
{
|
|
|
|
|
if(DoOnce())
|
|
|
|
|
{
|
2019-05-27 16:28:38 +02:00
|
|
|
|
await _vm.AnotherMethodAsync();
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-24 03:19:45 +02:00
|
|
|
|
|
2019-05-27 16:28:38 +02:00
|
|
|
|
private async void ResendEmail_Clicked(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(DoOnce())
|
|
|
|
|
{
|
|
|
|
|
await _vm.SendEmailAsync(true, true);
|
2019-05-24 03:19:45 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-06-12 03:31:51 +02:00
|
|
|
|
|
|
|
|
|
private async void Close_Clicked(object sender, System.EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(DoOnce())
|
|
|
|
|
{
|
|
|
|
|
await Navigation.PopModalAsync();
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-07-07 03:59:13 +02:00
|
|
|
|
|
|
|
|
|
private void TryAgain_Clicked(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(DoOnce())
|
|
|
|
|
{
|
|
|
|
|
if(_vm.YubikeyMethod)
|
|
|
|
|
{
|
|
|
|
|
_messagingService.Send("listenYubiKeyOTP", true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-24 03:19:45 +02:00
|
|
|
|
}
|
|
|
|
|
}
|