From 5cf710756f66e22e2a7cca576cd892254fe4a182 Mon Sep 17 00:00:00 2001 From: rmcrackan Date: Wed, 11 Mar 2026 13:00:19 -0400 Subject: [PATCH] Bug fix #1664 - WebView breaks catastrophically under Linux Snap -- segfault with no logged errors --- .../Controls/Settings/Important.axaml | 14 +++++++++++--- .../Dialogs/Login/AvaloniaLoginChoiceEager.cs | 17 +++++++++++++++-- Source/LibationAvalonia/Program.cs | 1 + .../ViewModels/Settings/ImportantSettingsVM.cs | 5 ++++- .../Configuration.Environment.cs | 6 +++++- .../Configuration.PersistentSettings.cs | 8 ++++++-- global.json | 9 --------- 7 files changed, 42 insertions(+), 18 deletions(-) delete mode 100644 global.json diff --git a/Source/LibationAvalonia/Controls/Settings/Important.axaml b/Source/LibationAvalonia/Controls/Settings/Important.axaml index f5e0799e..25519460 100644 --- a/Source/LibationAvalonia/Controls/Settings/Important.axaml +++ b/Source/LibationAvalonia/Controls/Settings/Important.axaml @@ -72,10 +72,18 @@ - - - + + + + + BrowserLoginAsync(ChoiceIn shoiceIn) + { + try + { + return await BrowserLoginAsyncCore(shoiceIn); + } + catch (Exception ex) + { + Serilog.Log.Logger.Warning(ex, "In-app browser failed; falling back to external browser"); + return null; + } + } + + private async Task BrowserLoginAsyncCore(ChoiceIn shoiceIn) { TaskCompletionSource tcs = new(); diff --git a/Source/LibationAvalonia/Program.cs b/Source/LibationAvalonia/Program.cs index 5cd62b49..1862045e 100644 --- a/Source/LibationAvalonia/Program.cs +++ b/Source/LibationAvalonia/Program.cs @@ -52,6 +52,7 @@ static class Program if (config.LibationFiles.SettingsAreValid) { App.RunMigrations(config); + // When running inside Snap, UseWebView getter returns false to avoid portal/sandbox crashes (e.g. github ticket #1664). //Start loading the library before loading the main form App.LibraryTask = Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true)); } diff --git a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs index b77ac518..82c4be85 100644 --- a/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs +++ b/Source/LibationAvalonia/ViewModels/Settings/ImportantSettingsVM.cs @@ -1,4 +1,4 @@ -using Dinah.Core; +using Dinah.Core; using FileManager; using LibationFileManager; using LibationUiBase; @@ -83,6 +83,9 @@ public class ImportantSettingsVM : ViewModelBase .ToArray(); public string UseWebViewText { get; } = Configuration.GetDescription(nameof(Configuration.UseWebView)); + /// When true, the Use WebView setting is disabled (e.g. when running in Snap to avoid portal/sandbox crashes). + public bool UseWebViewSettingDisabled => Configuration.IsRunningUnderSnap; + public string UseWebViewSnapMessage { get; } = Configuration.IsRunningUnderSnap ? "Disabled when running in Snap (avoids login crash). Use external browser instead." : ""; public Serilog.Events.LogEventLevel[] LoggingLevels { get; } = Enum.GetValues(); public string GridScaleFactorText { get; } = Configuration.GetDescription(nameof(Configuration.GridScaleFactor)); public string GridFontScaleFactorText { get; } = Configuration.GetDescription(nameof(Configuration.GridFontScaleFactor)); diff --git a/Source/LibationFileManager/Configuration.Environment.cs b/Source/LibationFileManager/Configuration.Environment.cs index bf0443f5..b0091b39 100644 --- a/Source/LibationFileManager/Configuration.Environment.cs +++ b/Source/LibationFileManager/Configuration.Environment.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace LibationFileManager; @@ -24,6 +24,10 @@ public partial class Configuration public static bool IsWindows { get; } = OperatingSystem.IsWindows(); public static bool IsLinux { get; } = OperatingSystem.IsLinux(); public static bool IsMacOs { get; } = OperatingSystem.IsMacOS(); + + /// True when running inside a (Linux) Snap sandbox (e.g. snap run libation). WebView login is disabled in this environment to avoid portal/sandbox crashes. + public static bool IsRunningUnderSnap { get; } = IsLinux && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("SNAP")); + public static Version? LibationVersion { get; private set; } public static void SetLibationVersion(Version? version) => LibationVersion = version; diff --git a/Source/LibationFileManager/Configuration.PersistentSettings.cs b/Source/LibationFileManager/Configuration.PersistentSettings.cs index b4912def..3e9d03f5 100644 --- a/Source/LibationFileManager/Configuration.PersistentSettings.cs +++ b/Source/LibationFileManager/Configuration.PersistentSettings.cs @@ -1,4 +1,4 @@ -using FileManager; +using FileManager; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; @@ -344,7 +344,11 @@ public partial class Configuration public bool AutoScan { get => GetNonString(defaultValue: false); set => SetNonString(value); } [Description("Use Libation's built-in web browser to log into Audible?")] - public bool UseWebView { get => GetNonString(defaultValue: true); set => SetNonString(value); } + public bool UseWebView + { + get => Configuration.IsRunningUnderSnap ? false : GetNonString(defaultValue: true); + set { if (!Configuration.IsRunningUnderSnap) SetNonString(value); } + } [Description("Auto download books? After scan, download new books in 'checked' accounts.")] // poorly named setting. Should just be 'AutoDownload'. It is NOT episode specific diff --git a/global.json b/global.json deleted file mode 100644 index 6168d70b..00000000 --- a/global.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/global.json", - "sdk": { - "version": "10.0.101" - }, - "test": { - "runner": "Microsoft.Testing.Platform" - } -} \ No newline at end of file