RPCPipeProxyServer.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System.IO.Pipes;
  2. using System.Security.Principal;
  3. using H.Pipes;
  4. using H.Pipes.AccessControl;
  5. namespace InABox.Rpc;
  6. public class RpcPipeProxyServer : RpcProxyServer<PipeConnection<RpcMessage?>>, IDisposable
  7. {
  8. private PipeServer<RpcMessage?> _transport;
  9. public override bool IsSecure() => false;
  10. private void SetPipeSecurity()
  11. {
  12. #pragma warning disable CA1416
  13. var pipeSecurity = new PipeSecurity();
  14. pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSid, null), PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
  15. pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalServiceSid, null), PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
  16. pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
  17. _transport.SetPipeSecurity(pipeSecurity);
  18. #pragma warning restore CA1416
  19. }
  20. public RpcPipeProxyServer(string name, IRpcClientTransport serverTransport) : base(serverTransport)
  21. {
  22. _transport = new PipeServer<RpcMessage?>(name);
  23. #if WINDOWS
  24. SetPipeSecurity();
  25. #endif
  26. _transport.ClientConnected += Transport_OnConnected;
  27. _transport.ClientDisconnected += Transport_OnDisconnected;
  28. _transport.MessageReceived += Transport_OnMessage;
  29. _transport.ExceptionOccurred += Transport_OnException;
  30. }
  31. public override void Start()
  32. {
  33. _transport.StartAsync().Wait();
  34. }
  35. public override void Stop()
  36. {
  37. _transport.StopAsync().Wait();
  38. }
  39. private void Transport_OnConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage?> e)
  40. {
  41. DoOpen(e.Connection);
  42. }
  43. private void Transport_OnMessage(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<RpcMessage?> e)
  44. {
  45. Task.Run(() =>
  46. {
  47. var response = DoMessage(e.Connection, e.Message);
  48. e.Connection.WriteAsync(response);
  49. });
  50. }
  51. public override void Send(PipeConnection<RpcMessage?> connection, RpcMessage message)
  52. {
  53. connection.WriteAsync(message);
  54. }
  55. private void Transport_OnDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage?> e)
  56. {
  57. DoClose(e.Connection, RpcTransportCloseEventType.Closed);
  58. e.Connection.DisposeAsync();
  59. }
  60. private void Transport_OnException(object? sender, H.Pipes.Args.ExceptionEventArgs e)
  61. {
  62. DoException(null, e.Exception);
  63. }
  64. public void Dispose()
  65. {
  66. _transport.DisposeAsync().AsTask().Wait();
  67. }
  68. ~RpcPipeProxyServer()
  69. {
  70. Dispose();
  71. }
  72. }