mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-07-31 01:35:36 +02:00
Pandora WebSockets fix
This commit is contained in:
parent
b0824e048e
commit
e157b1102f
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user