mirror of
https://github.com/rmcrackan/Libation.git
synced 2026-03-25 02:13:27 -04:00
88 lines
2.5 KiB
C#
88 lines
2.5 KiB
C#
using AudibleApi;
|
|
using Dinah.Core;
|
|
using Microsoft.Web.WebView2.Core;
|
|
using Microsoft.Web.WebView2.WinForms;
|
|
using System;
|
|
using System.Windows.Forms;
|
|
|
|
namespace LibationWinForms.Login;
|
|
|
|
public partial class WebLoginDialog : Form
|
|
{
|
|
public string? ResponseUrl { get; private set; }
|
|
private readonly string? accountID;
|
|
private readonly WebView2 webView;
|
|
public WebLoginDialog()
|
|
{
|
|
InitializeComponent();
|
|
webView = new WebView2();
|
|
|
|
webView.Dock = DockStyle.Fill;
|
|
Controls.Add(webView);
|
|
|
|
webView.NavigationStarting += WebView_NavigationStarting;
|
|
this.SetLibationIcon();
|
|
}
|
|
|
|
public WebLoginDialog(string accountID, ChoiceIn choiceIn) : this()
|
|
{
|
|
this.accountID = ArgumentValidator.EnsureNotNullOrWhiteSpace(accountID, nameof(accountID));
|
|
ArgumentValidator.EnsureNotNullOrWhiteSpace(choiceIn?.LoginUrl, nameof(choiceIn));
|
|
this.Load += async (_, _) =>
|
|
{
|
|
//enable private browsing
|
|
var env = await CoreWebView2Environment.CreateAsync();
|
|
var options = env.CreateCoreWebView2ControllerOptions();
|
|
options.IsInPrivateModeEnabled = true;
|
|
await webView.EnsureCoreWebView2Async(env, options);
|
|
|
|
webView.CoreWebView2.Settings.UserAgent = Resources.User_Agent;
|
|
|
|
//Load init cookies
|
|
foreach (System.Net.Cookie cookie in choiceIn.SignInCookies ?? [])
|
|
{
|
|
if (string.IsNullOrEmpty(cookie.Value))
|
|
continue;
|
|
try
|
|
{
|
|
webView.CoreWebView2.CookieManager.AddOrUpdateCookie(webView.CoreWebView2.CookieManager.CreateCookieWithSystemNetCookie(cookie));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Serilog.Log.Logger.Error(ex, $"Failed to set cookie {cookie.Name} for domain {cookie.Domain}");
|
|
}
|
|
}
|
|
|
|
webView.CoreWebView2.DOMContentLoaded += CoreWebView2_DOMContentLoaded;
|
|
Invoke(() => webView.Source = new Uri(choiceIn.LoginUrl));
|
|
};
|
|
}
|
|
|
|
private void WebView_NavigationStarting(object? sender, CoreWebView2NavigationStartingEventArgs e)
|
|
{
|
|
if (e.Uri.Contains("/ap/maplanding") is true)
|
|
{
|
|
ResponseUrl = e.Uri;
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
}
|
|
}
|
|
|
|
private async void CoreWebView2_DOMContentLoaded(object? sender, CoreWebView2DOMContentLoadedEventArgs e)
|
|
{
|
|
await webView.ExecuteScriptAsync(getScript(accountID));
|
|
}
|
|
|
|
private static string getScript(string? accountID) => $$"""
|
|
(function() {
|
|
var email = document.querySelector("input[id='ap_email_login']");
|
|
if (email !== null)
|
|
email.value = '{{accountID}}';
|
|
|
|
var pass = document.querySelector("input[name='password']");
|
|
if (pass !== null)
|
|
pass.focus();
|
|
})()
|
|
""";
|
|
}
|