Pandora WebSockets fix

This commit is contained in:
fbsanchez 2022-01-27 23:18:12 +01:00
parent b0824e048e
commit e157b1102f
4 changed files with 32 additions and 37 deletions

View File

@ -53,27 +53,6 @@ require_once __DIR__.'/../../functions.php';
class WSManager extends WebSocketServer 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 * 1MB... overkill for an echo server, but potentially plausible for other
* applications. * applications.
@ -255,7 +234,9 @@ class WSManager extends WebSocketServer
*/ */
public function writeSocket($user, $message) 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) { if (socket_write($user->socket, $message) === false) {
$this->disconnect($user->socket); $this->disconnect($user->socket);
} }

View File

@ -451,8 +451,8 @@ abstract class WebSocketServer
$this->stderr('Failed: socket_accept(), reason: ', socket_last_error()); $this->stderr('Failed: socket_accept(), reason: ', socket_last_error());
continue; continue;
} else { } else {
$this->connect($client); $user = $this->connect($client);
$this->stderr('Client connected. '.obhd($client)); $this->stderr('Client connected. '.$user->id);
} }
} else { } else {
if ((bool) $socket !== true) { if ((bool) $socket !== true) {
@ -548,9 +548,9 @@ abstract class WebSocketServer
/** /**
* Register user (and its socket) into master. * Register user (and its socket) into master.
* *
* @param Socket $socket Socket. * @param \Socket $socket Socket.
* *
* @return void * @return object
*/ */
public function connect($socket) public function connect($socket)
{ {
@ -561,6 +561,8 @@ abstract class WebSocketServer
$this->users[$user->id] = $user; $this->users[$user->id] = $user;
$this->sockets[$user->id] = $socket; $this->sockets[$user->id] = $socket;
$this->connecting($user); $this->connecting($user);
return $user;
} }
@ -628,6 +630,7 @@ abstract class WebSocketServer
*/ */
public function doHandshake($user, $buffer) public function doHandshake($user, $buffer)
{ {
// WS RFC.
$magicGUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; $magicGUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$headers = []; $headers = [];
$lines = explode("\n", $buffer); $lines = explode("\n", $buffer);
@ -642,6 +645,7 @@ abstract class WebSocketServer
} }
} }
$handshakeResponse = null;
if (isset($headers['get'])) { if (isset($headers['get'])) {
$user->requestedResource = $headers['get']; $user->requestedResource = $headers['get'];
} else { } else {

View File

@ -34,6 +34,8 @@
* ============================================================================ * ============================================================================
*/ */
use PandoraFMS\Websockets\WSManager;
/* /*
* ============================================================================ * ============================================================================
* * GOTTY PROTOCOL: PROXY * * GOTTY PROTOCOL: PROXY
@ -48,16 +50,16 @@
* @param array $headers Communication headers. * @param array $headers Communication headers.
* @param string $to_addr Target address (internal). * @param string $to_addr Target address (internal).
* @param integer $to_port Target port (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. * @return socket Active socket or null.
*/ */
function connectInt( function connectInt(
$ws_object, WSManager $ws_object,
$headers, array $headers,
$to_addr, string $to_addr,
$to_port, int $to_port,
$to_url string $to_url
) { ) {
$intSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $intSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Not sure. // Not sure.
@ -79,11 +81,11 @@ function connectInt(
$c_str .= 'Origin: http://'.$to_addr."\r\n"; $c_str .= 'Origin: http://'.$to_addr."\r\n";
$c_str .= 'Sec-WebSocket-Key: '.$headers['Sec-WebSocket-Key']."\r\n"; $c_str .= 'Sec-WebSocket-Key: '.$headers['Sec-WebSocket-Key']."\r\n";
$c_str .= 'Sec-WebSocket-Version: '.$headers['Sec-WebSocket-Version']."\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 .= 'Sec-WebSocket-Protocol: '.$headers['Sec-WebSocket-Protocol']."\r\n";
} }
$c_str .= "\r\n\r\n"; $c_str .= "\r\n";
// Send. // Send.
// Register user - internal. // Register user - internal.
@ -121,12 +123,21 @@ function proxyConnected(
* $user->socket is connected to external. * $user->socket is connected to external.
*/ */
$failed = false;
// Gotty. Based on the command selected, redirect to a target port. // Gotty. Based on the command selected, redirect to a target port.
if ($user->requestedResource === '/ssh') { if ($user->requestedResource === '/ssh') {
$port = $config['gotty_ssh_port']; $port = $config['gotty_ssh_port'];
} else if ($user->requestedResource === '/telnet') { } else if ($user->requestedResource === '/telnet') {
$port = $config['gotty_telnet_port']; $port = $config['gotty_telnet_port'];
} else { } else {
$failed = true;
}
if ($failed === true
|| isset($config['gotty_host']) === false
|| isset($port) === false
) {
$ws_object->disconnect($user->socket); $ws_object->disconnect($user->socket);
return; return;
} }
@ -158,8 +169,7 @@ function proxyConnected(
$ws_object->remoteUsers[$intUser->id] = $intUser; $ws_object->remoteUsers[$intUser->id] = $intUser;
// Ignore. Cleanup socket. // Ignore. Cleanup socket.
// $response = $ws_object->readSocket($user->intUser); $ws_object->readSocket($user->intUser);
flush();
} }

View File

@ -31,7 +31,7 @@ require_once __DIR__.'/vendor/autoload.php';
use \PandoraFMS\Websockets\WSManager; use \PandoraFMS\Websockets\WSManager;
// Set to true to get full output. // Set to true to get full output.
$debug = true; $debug = false;
// 1MB. // 1MB.
$bufferSize = 1048576; $bufferSize = 1048576;