Krzysztof Krysiński 3 месяцев назад
Родитель
Сommit
c86a564d45

+ 1 - 1
src/ColorPicker

@@ -1 +1 @@
-Subproject commit 56faff5afcc6fc96b44b5caa6f15d0b3a902cd0a
+Subproject commit 78237e9c5d70ebd878b34f4dd63f54b25bafea23

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit 6a22e1b5affd0906a949f97b755ae588eda7980a
+Subproject commit 06d7adbd41c53f0319c07b07d99faab57b376560

+ 1 - 1
src/PixiDocks

@@ -1 +1 @@
-Subproject commit c6778bd7a33f799263a64d4b39404e1aa05e9dd0
+Subproject commit 8c9a1f874ec8d1f7cd773a1f6b044deb0343ad1a

+ 6 - 81
src/PixiEditor.Extensions.Runtime/ExtensionLoader.cs

@@ -10,13 +10,12 @@ namespace PixiEditor.Extensions.Runtime;
 
 public class ExtensionLoader
 {
-    private readonly Dictionary<string, OfficialExtensionData> _officialExtensionsKeys =
-        new Dictionary<string, OfficialExtensionData>();
-
     public List<Extension> LoadedExtensions { get; } = new();
 
     public string[] PackagesPath { get; }
     public string UnpackedExtensionsPath { get; }
+    
+    public ExtensionServices Services { get; set; }
 
     private WasmRuntime.WasmRuntime _wasmRuntime = new WasmRuntime.WasmRuntime();
 
@@ -27,11 +26,6 @@ public class ExtensionLoader
         ValidateExtensionFolder();
     }
 
-    public void AddOfficialExtension(string uniqueName, OfficialExtensionData data)
-    {
-        _officialExtensionsKeys.Add(uniqueName, data);
-    }
-
     public void LoadExtensions()
     {
         foreach (var packagesPath in PackagesPath)
@@ -271,10 +265,11 @@ public class ExtensionLoader
 
         if (fixedUniqueName.StartsWith("pixieditor".Trim(), StringComparison.OrdinalIgnoreCase))
         {
-            if (!IsOfficialAssemblyLegit(fixedUniqueName, assembly))
+            // Validate within extension store
+            /*if (!IsOfficialAssemblyLegit(fixedUniqueName, assembly))
             {
                 throw new ForbiddenUniqueNameExtension();
-            }
+            }*/
 
             if (!IsAdditionalContentInstalled(fixedUniqueName))
             {
@@ -298,66 +293,9 @@ public class ExtensionLoader
 
     private bool IsAdditionalContentInstalled(string fixedUniqueName)
     {
-        if (!_officialExtensionsKeys.ContainsKey(fixedUniqueName)) return false;
-        AdditionalContentProduct? product = _officialExtensionsKeys[fixedUniqueName].Product;
-
-        if (product == null) return true;
-
-        return IPlatform.Current.AdditionalContentProvider?.IsContentInstalled(product.Value) ?? false;
-    }
-
-    private bool IsOfficialAssemblyLegit(string metadataUniqueName, ExtensionEntry entry)
-    {
-        if (entry == null) return false; // All official extensions must have a valid assembly
-        if (!_officialExtensionsKeys.ContainsKey(metadataUniqueName)) return false;
-
-        if (entry is DllExtensionEntry dllExtensionEntry)
-        {
-            return VerifyAssemblySignature(metadataUniqueName, dllExtensionEntry.Assembly);
-        }
-
-        if (entry is WasmExtensionEntry wasmExtensionEntry)
-        {
-            return true;
-            //TODO: Verify wasm signature somehow
-            //return VerifyAssemblySignature(metadataUniqueName, wasmExtensionEntry.Instance);
-        }
-
-        return false;
+        return IPlatform.Current.AdditionalContentProvider?.IsInstalled(fixedUniqueName) ?? false;
     }
 
-    private bool VerifyAssemblySignature(string metadataUniqueName, Assembly assembly)
-    {
-        bool wasVerified = false;
-        bool verified = StrongNameSignatureVerificationEx(assembly.Location, true, ref wasVerified);
-        if (!verified || !wasVerified) return false;
-
-        byte[]? assemblyPublicKey = assembly.GetName().GetPublicKey();
-        if (assemblyPublicKey == null) return false;
-
-        return PublicKeysMatch(assemblyPublicKey, _officialExtensionsKeys[metadataUniqueName].PublicKeyName);
-    }
-
-    private bool PublicKeysMatch(byte[] assemblyPublicKey, string pathToPublicKey)
-    {
-        Assembly currentAssembly = Assembly.GetExecutingAssembly();
-        using Stream? stream =
-            currentAssembly.GetManifestResourceStream(
-                $"{currentAssembly.GetName().Name}.OfficialExtensions.{pathToPublicKey}");
-        if (stream == null) return false;
-
-        using MemoryStream memoryStream = new MemoryStream();
-        stream.CopyTo(memoryStream);
-        byte[] publicKey = memoryStream.ToArray();
-
-        return assemblyPublicKey.SequenceEqual(publicKey);
-    }
-
-    //TODO: uhh, other platforms dumbass?
-    [DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
-    static extern bool StrongNameSignatureVerificationEx(string wszFilePath, bool fForceVerification,
-        ref bool pfWasVerified);
-
     private Extension LoadExtensionEntry(ExtensionEntry entry, ExtensionMetadata metadata)
     {
         Extension extension = entry.CreateExtension();
@@ -444,16 +382,3 @@ public class ExtensionLoader
         return null;
     }
 }
-
-public struct OfficialExtensionData
-{
-    public string PublicKeyName { get; }
-    public AdditionalContentProduct? Product { get; }
-    public string? PurchaseLink { get; }
-
-    public OfficialExtensionData(string publicKeyName, AdditionalContentProduct product, string? purchaseLink = null)
-    {
-        PublicKeyName = publicKeyName;
-        Product = product;
-    }
-}

+ 1 - 1
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml

@@ -3,7 +3,7 @@
         xmlns:system="clr-namespace:System;assembly=System.Runtime">
     <Styles.Resources>
         <ResourceDictionary>
-            <FontFamily x:Key="PixiPerfectIcons">avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf#pixiperfect</FontFamily>
+            <FontFamily x:Key="PixiPerfectIcons">avares://PixiEditor.UI.Common/Fonts#pixiperfect</FontFamily>
 
             <system:String x:Key="icon-ghost">&#xe812;</system:String>
             <system:String x:Key="icon-add-reference">&#xE900;</system:String>

+ 2 - 2
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml.cs

@@ -10,7 +10,7 @@ namespace PixiEditor.UI.Common.Fonts;
 //TODO: Make autogenerated from PixiPerfectIcons.axaml
 public static class PixiPerfectIcons
 {
-    private static readonly FontFamily pixiPerfectFontFamily = new("avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf#PixiPerfect");
+    private static readonly FontFamily pixiPerfectFontFamily = new("avares://PixiEditor.UI.Common/Fonts#PixiPerfect");
     
     public const string AddReference = "\ue900";
     public const string AddToMask = "\ue901";
@@ -160,7 +160,7 @@ public static class PixiPerfectIcons
 
     public static Stream GetFontStream()
     {
-        return AssetLoader.Open(new Uri("avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf"));
+        return AssetLoader.Open(new Uri("avares://PixiEditor.UI.Common/Fonts/pixiperfect.ttf"));
     }
 
     public static IImage ToIcon(string unicode, double size = 18)

+ 3 - 0
src/PixiEditor.UI.Common/PixiEditor.UI.Common.csproj

@@ -9,7 +9,10 @@
     <ItemGroup>
       <AvaloniaResource Include="Assets/**"/>
       <AvaloniaResource Include="Fonts/**"/>
+      <None Include="Assets/**" CopyToOutputDirectory="PreserveNewest" />
+      <None Include="Fonts/**" CopyToOutputDirectory="PreserveNewest" />
     </ItemGroup>
+  
 
     <ItemGroup>
       <PackageReference Include="Avalonia" Version="$(AvaloniaVersion)" />

+ 43 - 18
src/PixiEditor/Initialization/ClassicDesktopEntry.cs

@@ -1,10 +1,5 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
+using System.Diagnostics;
 using System.Text.RegularExpressions;
-using System.Threading;
-using System.Threading.Tasks;
-using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Platform.Storage;
@@ -14,17 +9,13 @@ using PixiEditor.Extensions.Runtime;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers.Behaviours;
 using PixiEditor.Models.Controllers;
-using PixiEditor.Models.Dialogs;
 using PixiEditor.Models.ExceptionHandling;
 using PixiEditor.Models.IO;
 using PixiEditor.OperatingSystem;
 using PixiEditor.Platform;
 using PixiEditor.UI.Common.Controls;
-using PixiEditor.UI.Common.Localization;
 using PixiEditor.Views;
 using PixiEditor.Views.Dialogs;
-using PixiEditor.Views.Input;
-using ViewModelMain = PixiEditor.ViewModels.ViewModelMain;
 using ViewModels_ViewModelMain = PixiEditor.ViewModels.ViewModelMain;
 
 namespace PixiEditor.Initialization;
@@ -32,7 +23,8 @@ namespace PixiEditor.Initialization;
 internal class ClassicDesktopEntry
 {
     private IClassicDesktopStyleApplicationLifetime desktop;
-
+    private bool restartQueued = false;
+    public static ClassicDesktopEntry? Active { get; private set; }
     public ClassicDesktopEntry(IClassicDesktopStyleApplicationLifetime desktop)
     {
         this.desktop = desktop;
@@ -42,6 +34,8 @@ internal class ClassicDesktopEntry
         {
             activable.Activated += ActivableOnActivated;
         }
+        
+        Active = this;
 
         desktop.Startup += Start;
         desktop.ShutdownRequested += ShutdownRequested;
@@ -67,7 +61,8 @@ internal class ClassicDesktopEntry
             var uri = openUriEventArgs.Uri;
             if (uri.Scheme == "lospec-palette")
             {
-                Dispatcher.UIThread.InvokeAsync(async () => await mainWindow.DataContext.ColorsSubViewModel.ImportLospecPalette(uri.AbsoluteUri));
+                Dispatcher.UIThread.InvokeAsync(async () =>
+                    await mainWindow.DataContext.ColorsSubViewModel.ImportLospecPalette(uri.AbsoluteUri));
             }
         }
     }
@@ -135,10 +130,6 @@ internal class ClassicDesktopEntry
 
         ExtensionLoader extensionLoader = new ExtensionLoader(
             [Paths.InstallDirExtensionPackagesPath, Paths.LocalExtensionPackagesPath], Paths.UserExtensionsPath);
-        //TODO: fetch from extension store
-        extensionLoader.AddOfficialExtension("pixieditor.founderspack",
-            new OfficialExtensionData("supporter-pack.snk", AdditionalContentProduct.SupporterPack));
-        extensionLoader.AddOfficialExtension("pixieditor.beta", new OfficialExtensionData());
         if (!safeMode)
         {
             extensionLoader.LoadExtensions();
@@ -154,7 +145,7 @@ internal class ClassicDesktopEntry
 #elif MSIX || MSIX_DEBUG
         return new PixiEditor.Platform.MSStore.MicrosoftStorePlatform();
 #else
-        return new PixiEditor.Platform.Standalone.StandalonePlatform();
+        return new PixiEditor.Platform.Standalone.StandalonePlatform(Paths.LocalExtensionPackagesPath, GetApiUrl());
 #endif
     }
 
@@ -218,6 +209,12 @@ internal class ClassicDesktopEntry
 
         return match.Success;
     }
+    
+    public void Restart()
+    {
+        restartQueued = true;
+        desktop.TryShutdown();
+    }
 
     private void ShutdownRequested(object? sender, ShutdownRequestedEventArgs e)
     {
@@ -226,7 +223,18 @@ internal class ClassicDesktopEntry
         if (vm is null)
             return;
 
-        vm.OnShutdown(e, () => desktop.Shutdown(0));
+        vm.OnShutdown(e, () =>
+        {
+            desktop.Shutdown(0);
+            if (restartQueued)
+            {
+                var process = Process.GetCurrentProcess().MainModule.FileName;
+                desktop.Exit += (_, _) =>
+                {
+                    Process.Start(process);
+                };
+            }
+        });
     }
 
     private void AttachGlobalShortcutBehavior(BehaviorCollection collection)
@@ -236,4 +244,21 @@ internal class ClassicDesktopEntry
 
         collection.Add(new GlobalShortcutFocusBehavior());
     }
+
+    private string GetApiUrl()
+    {
+        string baseUrl = BuildConstants.PixiEditorApiUrl;
+#if DEBUG
+        if (baseUrl.Contains('{') && baseUrl.Contains('}'))
+        {
+            string? envUrl = Environment.GetEnvironmentVariable("PIXIEDITOR_API_URL");
+            if (envUrl != null)
+            {
+                baseUrl = envUrl;
+            }
+        }
+#endif
+
+        return baseUrl;
+    }
 }

+ 1 - 0
src/PixiEditor/Views/Dialogs/OnboardingDialog.axaml

@@ -14,6 +14,7 @@
         x:Class="PixiEditor.Views.Dialogs.OnboardingDialog"
         ShowInTaskbar="False"
         CanResize="False"
+        SystemDecorations="None"
         d:DataContext="{x:Type userPreferences:OnboardingViewModel}"
         Title="Onboarding" Width="600" Height="345">
     <Design.DataContext>