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
{
/**
* 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);
}

View File

@ -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 {

View File

@ -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);
}

View File

@ -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;