mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-07-31 01:35:36 +02:00
wip WS redirection
This commit is contained in:
parent
3a9e5fa477
commit
06f8f920b8
@ -51,7 +51,7 @@ class QuickShell
|
|||||||
*
|
*
|
||||||
* Registers class into system.
|
* Registers class into system.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public function install()
|
public function install()
|
||||||
{
|
{
|
||||||
@ -66,7 +66,7 @@ class QuickShell
|
|||||||
*/
|
*/
|
||||||
public function interactiveShell()
|
public function interactiveShell()
|
||||||
{
|
{
|
||||||
file_get_Str
|
file_get_Str();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,8 @@ class WSProxy extends WebSocketServer
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->splitPacket($numBytes, $buffer, $user);
|
$user->lastRawPacket = $buffer;
|
||||||
|
return $buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -117,10 +118,9 @@ class WSProxy extends WebSocketServer
|
|||||||
protected function writeSocket($user, $message)
|
protected function writeSocket($user, $message)
|
||||||
{
|
{
|
||||||
if ($user->socket) {
|
if ($user->socket) {
|
||||||
socket_write(
|
if (!socket_write($user->socket, $message)) {
|
||||||
$user->socket,
|
$this->disconnect($user->socket);
|
||||||
$message
|
}
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
// Failed. Disconnect.
|
// Failed. Disconnect.
|
||||||
$this->disconnect($user->socket);
|
$this->disconnect($user->socket);
|
||||||
@ -186,12 +186,16 @@ class WSProxy extends WebSocketServer
|
|||||||
protected function connected($user)
|
protected function connected($user)
|
||||||
{
|
{
|
||||||
echo '** CONNECTED'."\n";
|
echo '** CONNECTED'."\n";
|
||||||
|
// Disconnect previous sessions.
|
||||||
|
$this->cleanupSocketByCookie($headers['cookie']);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $user->intSocket is connected to internal.
|
* $user->intSocket is connected to internal.
|
||||||
* $user->socket is connected to external.
|
* $user->socket is connected to external.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
var_dump($user);
|
||||||
|
|
||||||
// Create a new socket connection (internal).
|
// Create a new socket connection (internal).
|
||||||
$intUser = $this->connectInt($this->rawHeaders);
|
$intUser = $this->connectInt($this->rawHeaders);
|
||||||
|
|
||||||
@ -199,6 +203,8 @@ class WSProxy extends WebSocketServer
|
|||||||
$user->intUser = $intUser;
|
$user->intUser = $intUser;
|
||||||
// And socket.
|
// And socket.
|
||||||
$user->intSocket = $intUser->socket;
|
$user->intSocket = $intUser->socket;
|
||||||
|
$user->redirect = $intUser;
|
||||||
|
$intUser->redirect = $user;
|
||||||
|
|
||||||
$response = $this->readSocket($intUser);
|
$response = $this->readSocket($intUser);
|
||||||
|
|
||||||
@ -218,6 +224,36 @@ class WSProxy extends WebSocketServer
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process undecoded user message.
|
||||||
|
*
|
||||||
|
* @param object $user User.
|
||||||
|
* @param string $buffer Message.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
protected function processRaw($user, $buffer)
|
||||||
|
{
|
||||||
|
unset($user->intUser->lastRawPacket);
|
||||||
|
unset($user->lastRawPacket);
|
||||||
|
|
||||||
|
echo "\n****************** REDIRECT *********************\n";
|
||||||
|
echo date('D M j G:i:s').' - '.$user->id.' >> '.$user->intUser->id."\n";
|
||||||
|
echo $this->dump($buffer);
|
||||||
|
$this->writeSocket(
|
||||||
|
$user->intUser,
|
||||||
|
$buffer
|
||||||
|
);
|
||||||
|
|
||||||
|
echo date('D M j G:i:s').' - '.$user->intUser->id.'] << '.$user->id."\n";
|
||||||
|
$response = $this->readSocket($user->intUser);
|
||||||
|
$this->writeSocket($user, $user->intUser->lastRawPacket);
|
||||||
|
echo $this->dump($user->intUser->lastRawPacket);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* From client to socket (internal);
|
* From client to socket (internal);
|
||||||
*
|
*
|
||||||
@ -228,21 +264,7 @@ class WSProxy extends WebSocketServer
|
|||||||
*/
|
*/
|
||||||
protected function process($user, $message)
|
protected function process($user, $message)
|
||||||
{
|
{
|
||||||
echo '>> ['.$user->id.'] => ['.$user->intUser->id."]\n";
|
echo 'Procesando..'."\n";
|
||||||
echo $this->dump($this->rawPacket);
|
|
||||||
$this->writeSocket(
|
|
||||||
$user->intUser,
|
|
||||||
$this->rawPacket
|
|
||||||
);
|
|
||||||
|
|
||||||
echo '<< ['.$user->intUser->id.'] => ['.$user->id."]\n";
|
|
||||||
$response = $this->readSocket($user->intUser);
|
|
||||||
$this->send($user, $response);
|
|
||||||
echo $this->dump($this->rawPacket);
|
|
||||||
print "\n********************************************\n";
|
|
||||||
print "\n\n\n";
|
|
||||||
print "\n\n\n";
|
|
||||||
print "\n\n\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +19,13 @@ class WSProxyUser extends WebSocketUser
|
|||||||
*/
|
*/
|
||||||
public $intSocket;
|
public $intSocket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pair resend packages.
|
||||||
|
*
|
||||||
|
* @var WSProxyUser
|
||||||
|
*/
|
||||||
|
public $redirect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User identifier.
|
* User identifier.
|
||||||
*
|
*
|
||||||
@ -30,9 +37,8 @@ class WSProxyUser extends WebSocketUser
|
|||||||
/**
|
/**
|
||||||
* Builder.
|
* Builder.
|
||||||
*
|
*
|
||||||
* @param string $id Identifier.
|
* @param string $id Identifier.
|
||||||
* @param socket $socket Socket (origin).
|
* @param socket $socket Socket (origin).
|
||||||
* @param socket $intSocket Socket (internal).
|
|
||||||
*/
|
*/
|
||||||
public function __construct($id, $socket)
|
public function __construct($id, $socket)
|
||||||
{
|
{
|
||||||
|
@ -138,13 +138,6 @@ abstract class WebSocketServer
|
|||||||
*/
|
*/
|
||||||
public $rawHeaders = [];
|
public $rawHeaders = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* Raw packet for redirection.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $rawPacket;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builder.
|
* Builder.
|
||||||
@ -200,6 +193,20 @@ abstract class WebSocketServer
|
|||||||
abstract protected function process($user, $message);
|
abstract protected function process($user, $message);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process undecoded user message.
|
||||||
|
*
|
||||||
|
* @param object $user User.
|
||||||
|
* @param string $buffer Message.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function processRaw($user, $buffer)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called immediately when the data is recieved.
|
* Called immediately when the data is recieved.
|
||||||
*
|
*
|
||||||
@ -245,6 +252,7 @@ abstract class WebSocketServer
|
|||||||
*/
|
*/
|
||||||
protected function send($user, $message)
|
protected function send($user, $message)
|
||||||
{
|
{
|
||||||
|
var_dump($user->handshake);
|
||||||
if ($user->handshake) {
|
if ($user->handshake) {
|
||||||
$message = $this->frame($message, $user);
|
$message = $this->frame($message, $user);
|
||||||
$result = socket_write($user->socket, $message, strlen($message));
|
$result = socket_write($user->socket, $message, strlen($message));
|
||||||
@ -401,8 +409,6 @@ abstract class WebSocketServer
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$user = $this->getUserBySocket($socket);
|
$user = $this->getUserBySocket($socket);
|
||||||
$pair = $this->getIntUserBySocket($socket);
|
|
||||||
|
|
||||||
if (!$user->handshake) {
|
if (!$user->handshake) {
|
||||||
$tmp = str_replace("\r", '', $buffer);
|
$tmp = str_replace("\r", '', $buffer);
|
||||||
if (strpos($tmp, "\n\n") === false) {
|
if (strpos($tmp, "\n\n") === false) {
|
||||||
@ -414,10 +420,7 @@ abstract class WebSocketServer
|
|||||||
|
|
||||||
$this->doHandshake($user, $buffer);
|
$this->doHandshake($user, $buffer);
|
||||||
} else {
|
} else {
|
||||||
if (is_array($pair) && $pair['int']) {
|
if (!$this->processRaw($user, $buffer)) {
|
||||||
echo '~~ RESEND!'."\n";
|
|
||||||
socket_write($pair['ext']->socket, $buffer);
|
|
||||||
} else {
|
|
||||||
// Split packet into frame and send it to deframe.
|
// Split packet into frame and send it to deframe.
|
||||||
$this->splitPacket($numBytes, $buffer, $user);
|
$this->splitPacket($numBytes, $buffer, $user);
|
||||||
}
|
}
|
||||||
@ -742,6 +745,24 @@ abstract class WebSocketServer
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disconnects all users matching target cookie but latest one.
|
||||||
|
*
|
||||||
|
* @param string $cookie Cookie identifier.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function cleanupSocketByCookie($cookie)
|
||||||
|
{
|
||||||
|
foreach ($this->users as $user) {
|
||||||
|
if ($user->headers['cookie'] == $cookie) {
|
||||||
|
$this->disconnectUser($user->socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return INT user associated to target socket.
|
* Return INT user associated to target socket.
|
||||||
*
|
*
|
||||||
@ -921,7 +942,7 @@ abstract class WebSocketServer
|
|||||||
$length = strlen($packet);
|
$length = strlen($packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->rawPacket = $packet;
|
$user->lastRawPacket = $packet;
|
||||||
$fullpacket = $packet;
|
$fullpacket = $packet;
|
||||||
$frame_pos = 0;
|
$frame_pos = 0;
|
||||||
$frame_id = 1;
|
$frame_id = 1;
|
||||||
@ -1130,6 +1151,22 @@ abstract class WebSocketServer
|
|||||||
$header['length'] += (ord($message[8]) * 256);
|
$header['length'] += (ord($message[8]) * 256);
|
||||||
$header['length'] += ord($message[9]);
|
$header['length'] += ord($message[9]);
|
||||||
} else if ($header['hasmask']) {
|
} else if ($header['hasmask']) {
|
||||||
|
if (!isset($message[2])) {
|
||||||
|
$message[2] = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($message[3])) {
|
||||||
|
$message[3] = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($message[4])) {
|
||||||
|
$message[4] = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($message[5])) {
|
||||||
|
$message[5] = 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
$header['mask'] = $message[2].$message[3].$message[4].$message[5];
|
$header['mask'] = $message[2].$message[3].$message[4].$message[5];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1325,7 +1362,7 @@ abstract class WebSocketServer
|
|||||||
// Convert to hexidecimal.
|
// Convert to hexidecimal.
|
||||||
$hexi .= sprintf('%02x ', ord($data[$i]));
|
$hexi .= sprintf('%02x ', ord($data[$i]));
|
||||||
// Replace non-viewable bytes with '.'.
|
// Replace non-viewable bytes with '.'.
|
||||||
if (ord($data[$i]) >= 32) {
|
if (ord($data[$i]) >= 32 && ord($data[$i]) <= 255) {
|
||||||
$ascii .= $data[$i];
|
$ascii .= $data[$i];
|
||||||
} else {
|
} else {
|
||||||
$ascii .= '.';
|
$ascii .= '.';
|
||||||
|
@ -115,18 +115,18 @@ class WebSocketUser
|
|||||||
public $hasSentClose = false;
|
public $hasSentClose = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Received raw packet, to be redirected.
|
* Raw packet for redirection.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $rawPacket;
|
public $lastRawPacket;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes a websocket user.
|
* Initializes a websocket user.
|
||||||
*
|
*
|
||||||
* @param string $id Id.
|
* @param string $id Id of the new user.
|
||||||
* @param Socket $socket Socket.
|
* @param Socket $socket Socket where communication is stablished.
|
||||||
*/
|
*/
|
||||||
public function __construct($id, $socket)
|
public function __construct($id, $socket)
|
||||||
{
|
{
|
||||||
@ -135,28 +135,4 @@ class WebSocketUser
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retun last packet (raw) received
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getRawPacket()
|
|
||||||
{
|
|
||||||
return $this->rawPacket;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store raw packet.
|
|
||||||
*
|
|
||||||
* @param string $packet received.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function setRawPacket($packet)
|
|
||||||
{
|
|
||||||
$this->rawPacket = $packet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user