diff --git a/pandora_console/include/lib/Websockets/WSManager.php b/pandora_console/include/lib/Websockets/WSManager.php index 66658b6e93..18a95b7489 100644 --- a/pandora_console/include/lib/Websockets/WSManager.php +++ b/pandora_console/include/lib/Websockets/WSManager.php @@ -53,27 +53,6 @@ require_once __DIR__.'/../../functions.php'; class WSManager extends WebSocketServer { - /** - * Target host. - * - * @var string - */ - private $intHost = '127.0.0.1'; - - /** - * Target port - * - * @var integer - */ - private $intPort = 8080; - - /** - * Internal URL. - * - * @var string - */ - private $intUrl = '/ws'; - /** * 1MB... overkill for an echo server, but potentially plausible for other * applications. @@ -255,7 +234,9 @@ class WSManager extends WebSocketServer */ public function writeSocket($user, $message) { - if (is_resource($user->socket)) { + if (is_resource($user->socket) === true + || ($user->socket instanceof \Socket) === true + ) { if (socket_write($user->socket, $message) === false) { $this->disconnect($user->socket); } diff --git a/pandora_console/include/lib/Websockets/WebSocketServer.php b/pandora_console/include/lib/Websockets/WebSocketServer.php index 085da5dbea..5294d6b6fc 100644 --- a/pandora_console/include/lib/Websockets/WebSocketServer.php +++ b/pandora_console/include/lib/Websockets/WebSocketServer.php @@ -451,8 +451,8 @@ abstract class WebSocketServer $this->stderr('Failed: socket_accept(), reason: ', socket_last_error()); continue; } else { - $this->connect($client); - $this->stderr('Client connected. '.obhd($client)); + $user = $this->connect($client); + $this->stderr('Client connected. '.$user->id); } } else { if ((bool) $socket !== true) { @@ -548,9 +548,9 @@ abstract class WebSocketServer /** * Register user (and its socket) into master. * - * @param Socket $socket Socket. + * @param \Socket $socket Socket. * - * @return void + * @return object */ public function connect($socket) { @@ -561,6 +561,8 @@ abstract class WebSocketServer $this->users[$user->id] = $user; $this->sockets[$user->id] = $socket; $this->connecting($user); + + return $user; } @@ -628,6 +630,7 @@ abstract class WebSocketServer */ public function doHandshake($user, $buffer) { + // WS RFC. $magicGUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; $headers = []; $lines = explode("\n", $buffer); @@ -642,6 +645,7 @@ abstract class WebSocketServer } } + $handshakeResponse = null; if (isset($headers['get'])) { $user->requestedResource = $headers['get']; } else { diff --git a/pandora_console/include/websocket_registrations.php b/pandora_console/include/websocket_registrations.php index c367455c3a..4aa1bcbcb8 100644 --- a/pandora_console/include/websocket_registrations.php +++ b/pandora_console/include/websocket_registrations.php @@ -34,6 +34,8 @@ * ============================================================================ */ +use PandoraFMS\Websockets\WSManager; + /* * ============================================================================ * * GOTTY PROTOCOL: PROXY @@ -48,16 +50,16 @@ * @param array $headers Communication headers. * @param string $to_addr Target address (internal). * @param integer $to_port Target port (internal). - * @param integer $to_url Target url (internal). + * @param string $to_url Target url (internal). * * @return socket Active socket or null. */ function connectInt( - $ws_object, - $headers, - $to_addr, - $to_port, - $to_url + WSManager $ws_object, + array $headers, + string $to_addr, + int $to_port, + string $to_url ) { $intSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // Not sure. @@ -79,11 +81,11 @@ function connectInt( $c_str .= 'Origin: http://'.$to_addr."\r\n"; $c_str .= 'Sec-WebSocket-Key: '.$headers['Sec-WebSocket-Key']."\r\n"; $c_str .= 'Sec-WebSocket-Version: '.$headers['Sec-WebSocket-Version']."\r\n"; - if (isset($headers['Sec-WebSocket-Protocol'])) { + if (isset($headers['Sec-WebSocket-Protocol']) === true) { $c_str .= 'Sec-WebSocket-Protocol: '.$headers['Sec-WebSocket-Protocol']."\r\n"; } - $c_str .= "\r\n\r\n"; + $c_str .= "\r\n"; // Send. // Register user - internal. @@ -121,12 +123,21 @@ function proxyConnected( * $user->socket is connected to external. */ + $failed = false; + // Gotty. Based on the command selected, redirect to a target port. if ($user->requestedResource === '/ssh') { $port = $config['gotty_ssh_port']; } else if ($user->requestedResource === '/telnet') { $port = $config['gotty_telnet_port']; } else { + $failed = true; + } + + if ($failed === true + || isset($config['gotty_host']) === false + || isset($port) === false + ) { $ws_object->disconnect($user->socket); return; } @@ -158,8 +169,7 @@ function proxyConnected( $ws_object->remoteUsers[$intUser->id] = $intUser; // Ignore. Cleanup socket. - // $response = $ws_object->readSocket($user->intUser); - flush(); + $ws_object->readSocket($user->intUser); } diff --git a/pandora_console/ws.php b/pandora_console/ws.php index 26dbd61c4f..c55e884d24 100644 --- a/pandora_console/ws.php +++ b/pandora_console/ws.php @@ -31,7 +31,7 @@ require_once __DIR__.'/vendor/autoload.php'; use \PandoraFMS\Websockets\WSManager; // Set to true to get full output. -$debug = true; +$debug = false; // 1MB. $bufferSize = 1048576;