public void TestSSLConnection() { _server = new ButtplugWebsocketServer(); _server.StartServer(this, 12346, true, true); _client = new ButtplugTestClient("Test client"); _client.Connect(new Uri("wss://localhost:12346/b******g"), true).Wait(); var msgId = _client.NextMsgId; var res = _client.SendMsg(new Core.Messages.Test("Test string", msgId)).GetAwaiter().GetResult(); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id > msgId); // Check ping is working Thread.Sleep(400); msgId = _client.NextMsgId; res = _client.SendMsg(new Core.Messages.Test("Test string", msgId)).GetAwaiter().GetResult(); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id > msgId); Assert.True(_client.NextMsgId > 4); // Shut it down _client.Disconnect().Wait(); _server.StopServer(); }
public ServerControl(Func <ButtplugServer> aFactory) { InitializeComponent(); _logManager = new ButtplugLogManager(); _log = _logManager.GetLogger(GetType()); _ws = new ButtplugWebsocketServer(); _bpFactory = aFactory; _config = new ButtplugConfig("B******g"); _connUrls = new ConnUrlList(); _port = 12345; // Usually, if we throw errors then connect, it's not actually an error. If we don't // connect after a second of throwing an exception, pop the toaster, but not before then. _toastTimer = new Timer { Interval = 1000, AutoReset = false, Enabled = false, }; _toastTimer.Elapsed += PopToaster; if (uint.TryParse(_config.GetValue("b******g.server.port", "12345"), out uint pres)) { _port = pres; } _secure = true; if (bool.TryParse(_config.GetValue("b******g.server.secure", "true"), out bool sres)) { _secure = sres; } _loopback = true; if (bool.TryParse(_config.GetValue("b******g.server.loopbackOnly", "true"), out bool lres)) { _loopback = lres; } _hostname = _config.GetValue("b******g.server.hostname", "localhost"); PortTextBox.Text = _port.ToString(); SecureCheckBox.IsChecked = _secure; LoopbackCheckBox.IsChecked = _loopback; ConnectionUrl.ItemsSource = _connUrls; _ws.OnException += WebSocketExceptionHandler; _ws.ConnectionAccepted += WebSocketConnectionAccepted; _ws.ConnectionUpdated += WebSocketConnectionAccepted; _ws.ConnectionClosed += WebSocketConnectionClosed; _log.OnLogException += ExceptionLogged; }
public async Task OneTimeSetUp() { _logMgr = new ButtplugLogManager(); _subtypeMgr = new TestDeviceSubtypeManager(new TestDevice(_logMgr, "Test Device")); _websocketServer = new ButtplugWebsocketServer(); await _websocketServer.StartServerAsync(() => { var server = new TestServer(); server.AddDeviceSubtypeManager(aLogger => _subtypeMgr); return(server); }); }
public async void TestConnection() { var server = new ButtplugWebsocketServer(); server.StartServer(this); var client = new ButtplugTestClient("Test client"); await client.Connect(new Uri("ws://localhost:12345/b******g")); Console.WriteLine("test msg 1"); var msgId = client.nextMsgId; var res = await client.SendMsg(new Core.Messages.Test("Test string", msgId)); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id == msgId); // Check ping is working Thread.Sleep(400); Console.WriteLine("test msg 2"); msgId = client.nextMsgId; res = await client.SendMsg(new Core.Messages.Test("Test string", msgId)); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id == msgId); Assert.True(client.nextMsgId > 4); await client.RequestDeviceList(); Console.WriteLine("FINISHED CLIENT DISCONNECT"); // Shut it down await client.Disconnect(); server.StopServer(); }
public WebsocketServerControl(IButtplugServiceFactory bpFactory) { InitializeComponent(); _ws = new ButtplugWebsocketServer(); _bpFactory = bpFactory; _config = new ButtplugConfig("B******g"); _port = 12345; _secure = false; if (uint.TryParse(_config.GetValue("b******g.server.port", "12345"), out uint pres)) { _port = pres; } if (bool.TryParse(_config.GetValue("b******g.server.secure", "false"), out bool sres)) { _secure = sres; } PortTextBox.Text = _port.ToString(); SecureCheckBox.IsChecked = _secure; }
public void SetUp() { _connector = new ButtplugWebsocketConnector(new Uri("ws://localhost:12345")); _client = new ButtplugClient("Test Client", _connector); _server = new ButtplugWebsocketServer(); }
public void TestConnection() { var eEvent = new AutoResetEvent(false); _subtypeMgr.AddDevice(new TestDevice(_logMgr, "A", "1")); _server = new ButtplugWebsocketServer(); _server.StartServer(this); _client = new ButtplugTestClient("Test client"); _client.Connect(new Uri("ws://localhost:12345/b******g")).Wait(); var msgId = _client.NextMsgId; var res = _client.SendMsg(new Core.Messages.Test("Test string", msgId)).GetAwaiter().GetResult(); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id > msgId); // Check ping is working Thread.Sleep(400); msgId = _client.NextMsgId; res = _client.SendMsg(new Core.Messages.Test("Test string", msgId)).GetAwaiter().GetResult(); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id > msgId); res = _client.SendMsg(new Core.Messages.Test("Test string")).GetAwaiter().GetResult(); Assert.True(res != null); Assert.True(res is Core.Messages.Test); Assert.True(((Core.Messages.Test)res).TestString == "Test string"); Assert.True(((Core.Messages.Test)res).Id > msgId); Assert.True(_client.NextMsgId > 5); // Test that events are raised var scanningFinished = false; ButtplugClientDevice lastAdded = null; ButtplugClientDevice lastRemoved = null; _client.ScanningFinished += (aSender, aArg) => { scanningFinished = true; eEvent.Set(); }; _client.DeviceAdded += (aSender, aArg) => { lastAdded = aArg.Device; eEvent.Set(); }; _client.DeviceRemoved += (aSender, aArg) => { lastRemoved = aArg.Device; eEvent.Set(); }; _client.StartScanning().Wait(); Assert.Null(lastAdded); _subtypeMgr.AddDevice(new TestDevice(_logMgr, "B", "2")); eEvent.WaitOne(10000); eEvent.Reset(); Assert.NotNull(lastAdded); Assert.AreEqual("B", lastAdded.Name); Assert.True(!scanningFinished); _client.StopScanning().Wait(); eEvent.WaitOne(10000); eEvent.Reset(); Assert.True(scanningFinished); Assert.AreEqual(2, _client.Devices.Length); Assert.AreEqual("A", _client.Devices[0].Name); Assert.AreEqual("B", _client.Devices[1].Name); eEvent.Reset(); Assert.Null(lastRemoved); foreach (var dev in _devMgr._devices.Values) { if ((dev as TestDevice)?.Identifier == "2") { (dev as TestDevice).RemoveDevice(); } } eEvent.WaitOne(10000); eEvent.Reset(); Assert.NotNull(lastRemoved); Assert.AreEqual("B", lastRemoved.Name); Assert.AreEqual(1, _client.Devices.Length); Assert.AreEqual("A", _client.Devices[0].Name); // Shut it down _client.Disconnect().Wait(); _server.StopServer(); }
public void RunServer(Options aOptions) { if (aOptions.Version) { Console.WriteLine("1"); return; } _useProtobufOutput = aOptions.FrontendPipe; if (_useProtobufOutput) { _stdioTask = new Task(ReadStdio); _stdioTask.Start(); } if (aOptions.GenerateCertificate) { // CertUtils.GenerateSelfSignedCert(aOptions.CertFile, aOptions.PrivFile); Console.WriteLine("Cannot currently generate certificates."); return; } if (aOptions.DeviceConfigFile != null) { DeviceConfigurationManager.LoadBaseConfigurationFile(aOptions.DeviceConfigFile); } else { DeviceConfigurationManager.LoadBaseConfigurationFromResource(); } if (aOptions.UserDeviceConfigFile != null) { DeviceConfigurationManager.Manager.LoadUserConfigurationFile(aOptions.UserDeviceConfigFile); } if (aOptions.WebsocketServerInsecurePort == 0 && aOptions.WebsocketServerSecurePort == 0 && !aOptions.UseIpcServer) { PrintProcessLog("ERROR: Must specify either IPC server or Websocket server!"); return; } var logLevel = ButtplugLogLevel.Off; if (aOptions.Log != null) { if (!Enum.TryParse(aOptions.Log, out logLevel)) { PrintProcessLog("ERROR: Invalid log level!"); return; } } ButtplugServer ServerFactory() { var server = new CLIServer(aOptions.ServerName, (uint)aOptions.PingTime, _deviceManager); // Pull out the device manager for reuse later. if (_deviceManager == null) { _deviceManager = server.DeviceManager; } if (logLevel != ButtplugLogLevel.Off) { server.LogManager.AddLogListener(logLevel, (aLogMsg) => { PrintProcessLog(aLogMsg.LogMessage); }); } server.ClientConnected += (aObj, aEvent) => { if (_useProtobufOutput) { SendProcessMessage(new ServerProcessMessage { ClientConnected = new ServerProcessMessage.Types.ClientConnected { ClientName = server.ClientName } }); } else { Console.WriteLine($"Client connected: {server.ClientName}"); } }; return(server); } ButtplugIPCServer ipcServer = null; ButtplugWebsocketServer insecureWebsocketServer = null; ButtplugWebsocketServer secureWebsocketServer = null; if (aOptions.WebsocketServerInsecurePort != 0) { insecureWebsocketServer = new ButtplugWebsocketServer(); insecureWebsocketServer.StartServerAsync(ServerFactory, 1, aOptions.WebsocketServerInsecurePort, !aOptions.WebsocketServerAllInterfaces).Wait(); insecureWebsocketServer.ConnectionClosed += (aSender, aArgs) => { _disconnectWait.SetResult(true); }; PrintProcessLog("Insecure websocket Server now running..."); } if (aOptions.WebsocketServerSecurePort != 0 && aOptions.CertFile != null && aOptions.PrivFile != null) { secureWebsocketServer = new ButtplugWebsocketServer(); secureWebsocketServer.StartServerAsync(ServerFactory, 1, aOptions.WebsocketServerSecurePort, !aOptions.WebsocketServerAllInterfaces, aOptions.CertFile, aOptions.PrivFile).Wait(); secureWebsocketServer.ConnectionClosed += (aSender, aArgs) => { _disconnectWait.SetResult(true); }; PrintProcessLog("Secure websocket Server now running..."); } if (aOptions.UseIpcServer) { ipcServer = new ButtplugIPCServer(); ipcServer.StartServer(ServerFactory, aOptions.IpcPipe); ipcServer.ConnectionClosed += (aSender, aArgs) => { _disconnectWait.SetResult(true); }; PrintProcessLog("IPC Server now running..."); } // Now that all server possibilities are up and running, if we have a pipe, let the // parent program know we've started. if (_useProtobufOutput) { var msg = new ServerProcessMessage { ProcessStarted = new ServerProcessMessage.Types.ProcessStarted() }; SendProcessMessage(msg); } else { Console.WriteLine("Server started, waiting for client connection."); } do { _disconnectWait.Task.Wait(); if (ipcServer != null && ipcServer.Connected) { ipcServer?.Disconnect(); } if (insecureWebsocketServer != null && insecureWebsocketServer.Connected) { insecureWebsocketServer?.DisconnectAsync().Wait(); } if (secureWebsocketServer != null && secureWebsocketServer.Connected) { secureWebsocketServer?.DisconnectAsync().Wait(); } if (_useProtobufOutput) { var msg = new ServerProcessMessage { ClientDisconnected = new ServerProcessMessage.Types.ClientDisconnected() }; SendProcessMessage(msg); } else { Console.WriteLine("Client disconnected."); } _disconnectWait = new TaskCompletionSource <bool>(); } while (aOptions.StayOpen && !_shouldExit); if (!_useProtobufOutput) { return; } PrintProcessLog("Exiting"); if (_useProtobufOutput) { var exitMsg = new ServerProcessMessage { ProcessEnded = new ServerProcessMessage.Types.ProcessEnded() }; SendProcessMessage(exitMsg); } _stdinTokenSource.Cancel(); }