RPCServerSocketTransport.cs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System.Net.Security;
  2. using System.Security.Authentication;
  3. using System.Security.Cryptography.X509Certificates;
  4. using System.Security.Cryptography.Xml;
  5. using Fleck;
  6. using InABox.Core;
  7. using Logger = InABox.Core.Logger;
  8. namespace InABox.Rpc
  9. {
  10. public class RpcServerSocketTransport : RpcServerTransport<RpcServerSocketConnection2>
  11. {
  12. private WebSocketServer? _server;
  13. public static X509Certificate2? Certificate { get; set; }
  14. //public static void InitCertificate(string certificateFile) => Certificate = new X509Certificate2(certificateFile);
  15. public override bool IsSecure() => Certificate != null;
  16. public RpcServerSocketTransport(int port, X509Certificate2? certificate = null)
  17. {
  18. Certificate = certificate;
  19. var protocol = certificate != null ? "wss" : "ws";
  20. _server = new WebSocketServer($"{protocol}://0.0.0.0:{port}");
  21. if (Certificate != null)
  22. {
  23. /*_server.SslConfiguration.ServerCertificate = Certificate;
  24. _server.SslConfiguration.ClientCertificateRequired = false;
  25. _server.SslConfiguration.CheckCertificateRevocation = false;
  26. _server.SslConfiguration.ClientCertificateValidationCallback = WSSCallback;
  27. _server.SslConfiguration.EnabledSslProtocols = SslProtocols.Tls12;*/
  28. _server.Certificate = Certificate;
  29. }
  30. /*_server?.AddWebSocketService<RpcServerSocketConnection>("/", (connection) =>
  31. {
  32. connection.Transport = this;
  33. //new RpcServerSocketConnection() { Transport = this };
  34. });*/
  35. }
  36. private bool WSSCallback(object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslpolicyerrors)
  37. {
  38. return true;
  39. }
  40. public override void Start()
  41. {
  42. _server?.Start(socket =>
  43. {
  44. var connection = new RpcServerSocketConnection2(socket);
  45. socket.OnOpen = () => ConnectionOpened(connection);
  46. socket.OnClose = () => ConnectionClosed(connection);
  47. socket.OnError = (e) => ConnectionException(connection, e);
  48. socket.OnBinary = (data) => Task.Run(() =>
  49. {
  50. RpcMessage? request = Serialization.ReadBinary<RpcMessage>(data, BinarySerializationSettings.Latest);
  51. var response = DoMessage(connection, request);
  52. socket.Send(Serialization.WriteBinary(response, BinarySerializationSettings.Latest));
  53. });
  54. socket.OnMessage = (data) => Task.Run(() =>
  55. {
  56. RpcMessage? request = Serialization.Deserialize<RpcMessage>(data);
  57. var response = DoMessage(connection, request);
  58. socket.Send(Serialization.Serialize(response));
  59. });
  60. });
  61. }
  62. public override void Send(RpcServerSocketConnection2 connection, RpcMessage message)
  63. {
  64. connection.Connection.Send(Serialization.WriteBinary(message, BinarySerializationSettings.Latest));
  65. }
  66. public override void Stop()
  67. {
  68. _server?.ListenerSocket.Close();
  69. }
  70. public void ConnectionOpened(RpcServerSocketConnection2 connection)
  71. => DoOpen(connection);
  72. public void ConnectionException(RpcServerSocketConnection2 connection, Exception e)
  73. => DoException(connection, e);
  74. public void ConnectionClosed(RpcServerSocketConnection2 connection)
  75. => DoClose(connection, RpcTransportCloseEventType.Closed);
  76. }
  77. }