diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml.cs b/src/Snap.Hutao/Snap.Hutao/App.xaml.cs index 1cdc4086..9ec6c6e3 100644 --- a/src/Snap.Hutao/Snap.Hutao/App.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/App.xaml.cs @@ -81,7 +81,14 @@ public sealed partial class App : Application LogDiagnosticInformation(); // Manually invoke - activation.Activate(HutaoActivationArguments.FromAppActivationArguments(activatedEventArgs)); + HutaoActivationArguments hutaoArgs = HutaoActivationArguments.FromAppActivationArguments(activatedEventArgs); + if (hutaoArgs.Kind is HutaoActivationKind.Toast) + { + Exit(); + return; + } + + activation.Activate(hutaoArgs); activation.PostInitialization(); } catch (Exception ex) diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs index 81052e07..cb296236 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs @@ -50,13 +50,6 @@ internal sealed partial class AppActivation : IAppActivation, IAppActivationActi /// public void Activate(HutaoActivationArguments args) { - // Before activate, we try to redirect to the opened process in App, - // And we check if it's a toast activation. - if (args.Kind is HutaoActivationKind.Toast) - { - return; - } - HandleActivationAsync(args).SafeForget(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs index 3cb7894e..1dc0ba16 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs @@ -10,15 +10,42 @@ using System.Security.Principal; namespace Snap.Hutao.Core.LifeCycle.InterProcess; [Injection(InjectAs.Singleton)] -[ConstructorGenerated] internal sealed partial class PrivateNamedPipeServer : IDisposable { private readonly PrivateNamedPipeMessageDispatcher messageDispatcher; private readonly RuntimeOptions runtimeOptions; - private readonly NamedPipeServerStream serverStream = new("Snap.Hutao.PrivateNamedPipe", PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous | PipeOptions.WriteThrough); + private readonly CancellationTokenSource serverTokenSource = new(); private readonly SemaphoreSlim serverSemaphore = new(1); + private readonly NamedPipeServerStream serverStream; + + public PrivateNamedPipeServer(IServiceProvider serviceProvider) + { + messageDispatcher = serviceProvider.GetRequiredService(); + runtimeOptions = serviceProvider.GetRequiredService(); + + PipeSecurity? pipeSecurity = default; + + if (runtimeOptions.IsElevated) + { + SecurityIdentifier everyOne = new(WellKnownSidType.WorldSid, null); + + pipeSecurity = new(); + pipeSecurity.AddAccessRule(new PipeAccessRule(everyOne, PipeAccessRights.FullControl, AccessControlType.Allow)); + } + + serverStream = NamedPipeServerStreamAcl.Create( + "Snap.Hutao.PrivateNamedPipe", + PipeDirection.InOut, + NamedPipeServerStream.MaxAllowedServerInstances, + PipeTransmissionMode.Byte, + PipeOptions.Asynchronous | PipeOptions.WriteThrough, + 0, + 0, + pipeSecurity); + } + public void Dispose() { serverTokenSource.Cancel(); @@ -33,17 +60,6 @@ internal sealed partial class PrivateNamedPipeServer : IDisposable { using (await serverSemaphore.EnterAsync(serverTokenSource.Token).ConfigureAwait(false)) { - if (runtimeOptions.IsElevated) - { - SecurityIdentifier everyOne = new(WellKnownSidType.WorldSid, null); - SecurityIdentifier users = new(WellKnownSidType.BuiltinUsersSid, null); - - PipeSecurity pipeSecurity = new(); - pipeSecurity.AddAccessRule(new PipeAccessRule(everyOne, PipeAccessRights.ReadWrite, AccessControlType.Allow)); - pipeSecurity.AddAccessRule(new PipeAccessRule(users, PipeAccessRights.ReadWrite, AccessControlType.Allow)); - serverStream.SetAccessControl(pipeSecurity); - } - while (!serverTokenSource.IsCancellationRequested) { try diff --git a/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json b/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json index a5fb2a14..7ae76b9e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json +++ b/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json @@ -3,7 +3,7 @@ "Snap.Hutao": { "commandName": "MsixPackage", "nativeDebugging": false, - "doNotLaunchApp": false, + "doNotLaunchApp": true, "allowLocalNetworkLoopbackProperty": true }, "[Unpackaged] Snap.Hutao": {