mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-04-08 18:55:09 +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
|
||||
{
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user