wip
This commit is contained in:
parent
b8c3ae6fe4
commit
b575f57224
|
|
@ -2,8 +2,10 @@
|
||||||
|
|
||||||
namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels;
|
namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels;
|
||||||
|
|
||||||
|
use BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Exceptions\InvalidSignatureException;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Ratchet\ConnectionInterface;
|
use Ratchet\ConnectionInterface;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
class Channel
|
class Channel
|
||||||
{
|
{
|
||||||
|
|
@ -23,10 +25,26 @@ class Channel
|
||||||
return count($this->connections) > 0;
|
return count($this->connections) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function verifySignature(ConnectionInterface $connection, stdClass $payload)
|
||||||
|
{
|
||||||
|
$auth = $payload->auth;
|
||||||
|
|
||||||
|
$signature = "{$connection->socketId}:{$this->channelId}";
|
||||||
|
|
||||||
|
if (isset($payload->channel_data)) {
|
||||||
|
$signature .= ":{$payload->channel_data}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Have app id specific secrets
|
||||||
|
if (str_after($auth, ':') !== hash_hmac('sha256', $signature, config('broadcasting.connections.pusher.secret'))) {
|
||||||
|
throw new InvalidSignatureException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @link https://pusher.com/docs/pusher_protocol#presence-channel-events
|
* @link https://pusher.com/docs/pusher_protocol#presence-channel-events
|
||||||
*/
|
*/
|
||||||
public function subscribe(ConnectionInterface $connection, $payload)
|
public function subscribe(ConnectionInterface $connection, stdClass $payload)
|
||||||
{
|
{
|
||||||
$this->saveConnection($connection);
|
$this->saveConnection($connection);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@ class PresenceChannel extends Channel
|
||||||
*/
|
*/
|
||||||
public function subscribe(ConnectionInterface $connection, $payload)
|
public function subscribe(ConnectionInterface $connection, $payload)
|
||||||
{
|
{
|
||||||
|
$this->verifySignature($connection, $payload);
|
||||||
|
|
||||||
$this->saveConnection($connection);
|
$this->saveConnection($connection);
|
||||||
|
|
||||||
$channelData = json_decode($payload->channel_data);
|
$channelData = json_decode($payload->channel_data);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,15 @@
|
||||||
|
|
||||||
namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels;
|
namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels;
|
||||||
|
|
||||||
|
use Ratchet\ConnectionInterface;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
class PrivateChannel extends Channel
|
class PrivateChannel extends Channel
|
||||||
{
|
{
|
||||||
|
public function subscribe(ConnectionInterface $connection, stdClass $payload)
|
||||||
|
{
|
||||||
|
$this->verifySignature($connection, $payload);
|
||||||
|
|
||||||
|
parent::subscribe($connection, $payload);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Exceptions;
|
||||||
|
|
||||||
|
class InvalidSignatureException extends PusherException
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->message = 'Invalid Signature';
|
||||||
|
$this->code = 4009;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeyondCode\LaravelWebsockets\LaravelEcho\Pusher\Exceptions;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class PusherException extends Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
public function getPayload()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'event' => 'pusher:error',
|
||||||
|
'data' => [
|
||||||
|
'message' => $this->getMessage(),
|
||||||
|
'code' => $this->getCode()
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
namespace BeyondCode\LaravelWebSockets\LaravelEcho\WebSocket;
|
namespace BeyondCode\LaravelWebSockets\LaravelEcho\WebSocket;
|
||||||
|
|
||||||
|
use BeyondCode\LaravelWebsockets\LaravelEcho\Pusher\Exceptions\PusherException;
|
||||||
|
use Exception;
|
||||||
use Ratchet\ConnectionInterface;
|
use Ratchet\ConnectionInterface;
|
||||||
use Ratchet\RFC6455\Messaging\MessageInterface;
|
use Ratchet\RFC6455\Messaging\MessageInterface;
|
||||||
use BeyondCode\LaravelWebSockets\WebSocketController;
|
use BeyondCode\LaravelWebSockets\WebSocketController;
|
||||||
|
|
@ -57,4 +59,13 @@ class EchoServer extends WebSocketController
|
||||||
{
|
{
|
||||||
$this->channelManager->removeFromAllChannels($connection);
|
$this->channelManager->removeFromAllChannels($connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onError(ConnectionInterface $connection, Exception $exception)
|
||||||
|
{
|
||||||
|
if ($exception instanceof PusherException) {
|
||||||
|
$connection->send(json_encode(
|
||||||
|
$exception->getPayload()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue