RPCServerPipeTransport.cs 3.1 KB

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