From ffadf90f4fddf3b35012e22262a4da7dd92f9bbe Mon Sep 17 00:00:00 2001 From: Mbucari Date: Sun, 26 Feb 2023 12:03:22 -0700 Subject: [PATCH] Fix MFA and 2FA --- Source/AaxDecrypter/AudiobookDownloadBase.cs | 2 +- Source/AudibleUtilities/ApiExtended.cs | 38 +----- .../AudibleUtilities/AudibleUtilities.csproj | 2 +- Source/AudibleUtilities/Mkb79Auth.cs | 5 +- .../Dialogs/AccountsDialog.axaml | 1 + .../Dialogs/Login/AvaloniaLoginCallback.cs | 14 +- .../Dialogs/Login/CaptchaDialog.axaml | 38 ++++-- .../Dialogs/Login/CaptchaDialog.axaml.cs | 83 ++++++++++-- .../Login/LoginExternalDialog.axaml.cs | 3 +- .../Dialogs/Login/MfaDialog.axaml | 6 +- .../Dialogs/Login/_2faCodeDialog.axaml | 20 ++- .../Dialogs/Login/_2faCodeDialog.axaml.cs | 8 +- .../LibationAvalonia/LibationAvalonia.csproj | 3 +- .../Views/MainWindow.ScanAuto.cs | 11 +- .../Dialogs/Login/CaptchaDialog.Designer.cs | 123 +++++++++++------- .../Dialogs/Login/CaptchaDialog.cs | 20 ++- .../Dialogs/Login/WinformLoginCallback.cs | 14 +- .../Dialogs/Login/_2faCodeDialog.Designer.cs | 93 +++++++------ .../Dialogs/Login/_2faCodeDialog.cs | 5 +- .../Dialogs/Login/_2faCodeDialog.resx | 3 +- Source/LibationWinForms/Form1.ScanAuto.cs | 7 +- 21 files changed, 305 insertions(+), 194 deletions(-) diff --git a/Source/AaxDecrypter/AudiobookDownloadBase.cs b/Source/AaxDecrypter/AudiobookDownloadBase.cs index fff17d58..9f8bb535 100644 --- a/Source/AaxDecrypter/AudiobookDownloadBase.cs +++ b/Source/AaxDecrypter/AudiobookDownloadBase.cs @@ -3,7 +3,6 @@ using Dinah.Core.Net.Http; using Dinah.Core.StepRunner; using FileManager; using System; -using System.Diagnostics; using System.IO; using System.Threading.Tasks; @@ -225,6 +224,7 @@ namespace AaxDecrypter } finally { + nfsp.NetworkFileStream.RequestHeaders["User-Agent"] = DownloadOptions.UserAgent; nfsp.NetworkFileStream.SpeedLimit = DownloadOptions.DownloadSpeedBps; } diff --git a/Source/AudibleUtilities/ApiExtended.cs b/Source/AudibleUtilities/ApiExtended.cs index 46f173ac..78b7002b 100644 --- a/Source/AudibleUtilities/ApiExtended.cs +++ b/Source/AudibleUtilities/ApiExtended.cs @@ -18,7 +18,7 @@ namespace AudibleUtilities public class ApiExtended { public Api Api { get; private set; } - + private const string DeviceName = "Libation"; private ApiExtended(Api api) => Api = api; /// Get api from existing tokens else login with 'eager' choice. External browser url is provided. Response can be external browser login or continuing with native api callbacks. @@ -39,42 +39,6 @@ namespace AudibleUtilities return new ApiExtended(api); } - /// Get api from existing tokens else login with native api callbacks. - public static async Task CreateAsync(Account account, ILoginCallback loginCallback) - { - Serilog.Log.Logger.Information("{@DebugInfo}", new - { - LoginType = nameof(ILoginCallback), - Account = account?.MaskedLogEntry ?? "[null]", - LocaleName = account?.Locale?.Name - }); - - var api = await EzApiCreator.GetApiAsync( - loginCallback, - account.Locale, - AudibleApiStorage.AccountsSettingsFile, - account.GetIdentityTokensJsonPath()); - return new ApiExtended(api); - } - - /// Get api from existing tokens else login with external browser - public static async Task CreateAsync(Account account, ILoginExternal loginExternal) - { - Serilog.Log.Logger.Information("{@DebugInfo}", new - { - LoginType = nameof(ILoginExternal), - Account = account?.MaskedLogEntry ?? "[null]", - LocaleName = account?.Locale?.Name - }); - - var api = await EzApiCreator.GetApiAsync( - loginExternal, - account.Locale, - AudibleApiStorage.AccountsSettingsFile, - account.GetIdentityTokensJsonPath()); - return new ApiExtended(api); - } - /// Get api from existing tokens. Assumes you have valid login tokens. Else exception public static async Task CreateAsync(Account account) { diff --git a/Source/AudibleUtilities/AudibleUtilities.csproj b/Source/AudibleUtilities/AudibleUtilities.csproj index 95ffd248..48394512 100644 --- a/Source/AudibleUtilities/AudibleUtilities.csproj +++ b/Source/AudibleUtilities/AudibleUtilities.csproj @@ -5,7 +5,7 @@ - + diff --git a/Source/AudibleUtilities/Mkb79Auth.cs b/Source/AudibleUtilities/Mkb79Auth.cs index f3bc6db5..c1f06158 100644 --- a/Source/AudibleUtilities/Mkb79Auth.cs +++ b/Source/AudibleUtilities/Mkb79Auth.cs @@ -4,13 +4,14 @@ using System.Linq; using System.Threading.Tasks; using AudibleApi; using AudibleApi.Authorization; +using AudibleApi.Cryptography; using Dinah.Core; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace AudibleUtilities { - public partial class Mkb79Auth : IIdentityMaintainer + public partial class Mkb79Auth : IIdentityMaintainer { [JsonProperty("website_cookies")] private JObject _websiteCookies { get; set; } @@ -178,7 +179,7 @@ namespace AudibleUtilities LocaleCode = account.Locale.CountryCode, RefreshToken = account.IdentityTokens.RefreshToken.Value, StoreAuthenticationCookie = account.IdentityTokens.StoreAuthenticationCookie, - WebsiteCookies = new(account.IdentityTokens.Cookies.ToKeyValuePair()), + WebsiteCookies = new(account.IdentityTokens.Cookies), }; } diff --git a/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml b/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml index 8e63af27..c49b9dbb 100644 --- a/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml +++ b/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml @@ -36,6 +36,7 @@ Width="60" Height="30" Content="X" + HorizontalContentAlignment="Center" IsEnabled="{Binding !IsDefault}" Click="DeleteButton_Clicked" /> diff --git a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs index b12816ee..606af6ac 100644 --- a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs +++ b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs @@ -9,26 +9,28 @@ namespace LibationAvalonia.Dialogs.Login { private Account _account { get; } + public string DeviceName { get; } = "Libation"; + public AvaloniaLoginCallback(Account account) { _account = Dinah.Core.ArgumentValidator.EnsureNotNull(account, nameof(account)); } - public async Task Get2faCodeAsync() + public async Task Get2faCodeAsync(string prompt) { - var dialog = new _2faCodeDialog(); + var dialog = new _2faCodeDialog(prompt); if (await ShowDialog(dialog)) return dialog.Code; return null; } - public async Task GetCaptchaAnswerAsync(byte[] captchaImage) + public async Task<(string password, string guess)> GetCaptchaAnswerAsync(string password, byte[] captchaImage) { - var dialog = new CaptchaDialog(captchaImage); + var dialog = new CaptchaDialog(password, captchaImage); if (await ShowDialog(dialog)) - return dialog.Answer; - return null; + return (dialog.Password, dialog.Answer); + return (null,null); } public async Task<(string name, string value)> GetMfaChoiceAsync(MfaConfig mfaConfig) diff --git a/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml b/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml index 5fa498fe..0faaacf7 100644 --- a/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml +++ b/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml @@ -2,22 +2,22 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" d:DesignWidth="220" d:DesignHeight="180" - MinWidth="220" MinHeight="180" - MaxWidth="220" MaxHeight="180" + mc:Ignorable="d" d:DesignWidth="220" d:DesignHeight="250" + MinWidth="220" MinHeight="250" + MaxWidth="220" MaxHeight="250" x:Class="LibationAvalonia.Dialogs.Login.CaptchaDialog" Title="CAPTCHA" Icon="/Assets/libation.ico"> + RowDefinitions="Auto,Auto,Auto,Auto,*" + ColumnDefinitions="Auto,*" + Margin="10"> @@ -30,23 +30,39 @@ + + + + + Margin="0,10,0,0" + Text="{Binding Answer}" />