mirror of
https://github.com/bitwarden/android.git
synced 2024-12-28 11:58:30 +03:00
70 lines
2.6 KiB
C#
70 lines
2.6 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Bit.App.Abstractions;
|
|
using Bit.App.Resources;
|
|
using Bit.App.Utilities;
|
|
using Bit.Core.Abstractions;
|
|
using Xamarin.Essentials;
|
|
|
|
namespace Bit.App.Pages
|
|
{
|
|
public abstract class CaptchaProtectedViewModel : BaseViewModel
|
|
{
|
|
protected abstract II18nService i18nService { get; }
|
|
protected abstract IEnvironmentService environmentService { get; }
|
|
protected abstract IDeviceActionService deviceActionService { get; }
|
|
protected abstract IPlatformUtilsService platformUtilsService { get; }
|
|
protected string _captchaToken = null;
|
|
|
|
protected async Task<bool> HandleCaptchaAsync(string CaptchaSiteKey)
|
|
{
|
|
var callbackUri = "bitwarden://captcha-callback";
|
|
var data = AppHelpers.EncodeDataParameter(new
|
|
{
|
|
siteKey = CaptchaSiteKey,
|
|
locale = i18nService.Culture.TwoLetterISOLanguageName,
|
|
callbackUri = callbackUri,
|
|
captchaRequiredText = AppResources.CaptchaRequired,
|
|
});
|
|
|
|
var url = environmentService.GetWebVaultUrl() +
|
|
"/captcha-mobile-connector.html?" +
|
|
"data=" + data +
|
|
"&parent=" + Uri.EscapeDataString(callbackUri) +
|
|
"&v=1";
|
|
|
|
WebAuthenticatorResult authResult = null;
|
|
bool cancelled = false;
|
|
try
|
|
{
|
|
// PrefersEphemeralWebBrowserSession should be false to allow access to the hCaptcha accessibility
|
|
// cookie set in the default browser
|
|
// https://www.hcaptcha.com/accessibility
|
|
var options = new WebAuthenticatorOptions
|
|
{
|
|
Url = new Uri(url),
|
|
CallbackUrl = new Uri(callbackUri),
|
|
PrefersEphemeralWebBrowserSession = false,
|
|
};
|
|
authResult = await WebAuthenticator.AuthenticateAsync(options);
|
|
}
|
|
catch (TaskCanceledException)
|
|
{
|
|
await deviceActionService.HideLoadingAsync();
|
|
cancelled = true;
|
|
}
|
|
|
|
if (cancelled == false && authResult != null &&
|
|
authResult.Properties.TryGetValue("token", out _captchaToken))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
await platformUtilsService.ShowDialogAsync(AppResources.CaptchaFailed,
|
|
AppResources.CaptchaRequired);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|