Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
 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);
     });
 }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
 public void SetUp()
 {
     _connector = new ButtplugWebsocketConnector(new Uri("ws://localhost:12345"));
     _client    = new ButtplugClient("Test Client", _connector);
     _server    = new ButtplugWebsocketServer();
 }
Ejemplo n.º 7
0
        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();
        }
Ejemplo n.º 8
0
        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();
        }