From 4f5944f9f6c91f8d0e645686815af0e787b5bcd0 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 26 Nov 2018 00:28:57 +0100 Subject: [PATCH 1/6] wip --- tests/ConnectionTest.php | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index b39a063..10a5cb3 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -3,6 +3,7 @@ namespace BeyondCode\LaravelWebSockets\Tests; use BeyondCode\LaravelWebSockets\ClientProviders\Client; +use BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Exceptions\InvalidSignatureException; use BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Exceptions\UnknownAppKeyException; use BeyondCode\LaravelWebSockets\LaravelEcho\WebSocket\PusherServer; use BeyondCode\LaravelWebSockets\Tests\Mocks\Message; @@ -91,4 +92,55 @@ class ConnectionTest extends TestCase 'channel' => 'basic-channel' ]); } + + /** @test */ + public function clients_need_valid_auth_signatures_for_private_channels() + { + $this->expectException(InvalidSignatureException::class); + + /** @var PusherServer $server */ + $server = app(PusherServer::class); + + $connection = $this->getWebSocketConnection(); + + $message = new Message(json_encode([ + 'event' => 'pusher:subscribe', + 'data' => [ + 'auth' => 'invalid', + 'channel' => 'private-channel' + ], + ])); + + $server->onOpen($connection); + + $server->onMessage($connection, $message); + } + + /** @test */ + public function clients_can_subscribe_to_private_channels() + { + /** @var PusherServer $server */ + $server = app(PusherServer::class); + + $connection = $this->getWebSocketConnection(); + + $server->onOpen($connection); + + $signature = "{$connection->socketId}:private-channel"; + + $message = new Message(json_encode([ + 'event' => 'pusher:subscribe', + 'data' => [ + 'auth' => $connection->client->appKey.':'.hash_hmac('sha256', $signature, $connection->client->appSecret), + 'channel' => 'private-channel' + ], + ])); + + + $server->onMessage($connection, $message); + + $connection->assertSentEvent('pusher_internal:subscription_succeeded', [ + 'channel' => 'private-channel' + ]); + } } \ No newline at end of file From 420f5271f2fb89c041de3931cb873d07605c3959 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 26 Nov 2018 00:29:07 +0100 Subject: [PATCH 2/6] wip --- tests/ConnectionTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 10a5cb3..6a29f60 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -136,7 +136,6 @@ class ConnectionTest extends TestCase ], ])); - $server->onMessage($connection, $message); $connection->assertSentEvent('pusher_internal:subscription_succeeded', [ From 24580d0e96fc6a0d3d902b6679c7d7381316edfb Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 26 Nov 2018 00:29:19 +0100 Subject: [PATCH 3/6] wip --- tests/ConnectionTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 6a29f60..7c350fa 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -7,7 +7,6 @@ use BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Exceptions\InvalidSignatureE use BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Exceptions\UnknownAppKeyException; use BeyondCode\LaravelWebSockets\LaravelEcho\WebSocket\PusherServer; use BeyondCode\LaravelWebSockets\Tests\Mocks\Message; -use Ratchet\RFC6455\Messaging\MessageInterface; class ConnectionTest extends TestCase { From f75ed6d86c21ae8c6b4f5323b9429517d85f7715 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 26 Nov 2018 00:33:07 +0100 Subject: [PATCH 4/6] wip --- tests/ConnectionTest.php | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 7c350fa..142e521 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -141,4 +141,62 @@ class ConnectionTest extends TestCase 'channel' => 'private-channel' ]); } + + /** @test */ + public function clients_need_valid_auth_signatures_for_presence_channels() + { + $this->expectException(InvalidSignatureException::class); + + /** @var PusherServer $server */ + $server = app(PusherServer::class); + + $connection = $this->getWebSocketConnection(); + + $message = new Message(json_encode([ + 'event' => 'pusher:subscribe', + 'data' => [ + 'auth' => 'invalid', + 'channel' => 'presence-channel' + ], + ])); + + $server->onOpen($connection); + + $server->onMessage($connection, $message); + } + + /** @test */ + public function clients_can_subscribe_to_presence_channels() + { + /** @var PusherServer $server */ + $server = app(PusherServer::class); + + $connection = $this->getWebSocketConnection(); + + $server->onOpen($connection); + + $channelData = [ + 'user_id' => 1, + 'user_info' => [ + 'name' => 'Marcel' + ] + ]; + + $signature = "{$connection->socketId}:presence-channel:".json_encode($channelData); + + $message = new Message(json_encode([ + 'event' => 'pusher:subscribe', + 'data' => [ + 'auth' => $connection->client->appKey.':'.hash_hmac('sha256', $signature, $connection->client->appSecret), + 'channel' => 'presence-channel', + 'channel_data' => json_encode($channelData) + ], + ])); + + $server->onMessage($connection, $message); + + $connection->assertSentEvent('pusher_internal:subscription_succeeded', [ + 'channel' => 'presence-channel', + ]); + } } \ No newline at end of file From 7d6903591be2af46956e7a83cb2d3eb22171fea4 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 26 Nov 2018 00:38:50 +0100 Subject: [PATCH 5/6] wip --- src/WebSocketController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/WebSocketController.php b/src/WebSocketController.php index 3fa8ef3..0489e7b 100644 --- a/src/WebSocketController.php +++ b/src/WebSocketController.php @@ -11,7 +11,6 @@ class WebSocketController implements MessageComponentInterface { function onOpen(ConnectionInterface $connection) { - dump("Client connected"); } public function onMessage(ConnectionInterface $connection, MessageInterface $message) From 16aa68050719ced607952600cfeb9cc3949827a8 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Mon, 26 Nov 2018 00:40:32 +0100 Subject: [PATCH 6/6] wip --- composer.json | 2 +- ...cketsServiceProvider.php => WebSocketsServiceProvider.php} | 2 +- tests/TestCase.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/{LaravelWebSocketsServiceProvider.php => WebSocketsServiceProvider.php} (96%) diff --git a/composer.json b/composer.json index ba66341..b3394e1 100644 --- a/composer.json +++ b/composer.json @@ -60,7 +60,7 @@ "extra": { "laravel": { "providers": [ - "BeyondCode\\LaravelWebSockets\\LaravelWebSocketsServiceProvider" + "BeyondCode\\LaravelWebSockets\\WebSocketsServiceProvider" ], "aliases": { "WebSocketRouter": "BeyondCode\\LaravelWebSockets\\Facades\\WebSocketRouter" diff --git a/src/LaravelWebSocketsServiceProvider.php b/src/WebSocketsServiceProvider.php similarity index 96% rename from src/LaravelWebSocketsServiceProvider.php rename to src/WebSocketsServiceProvider.php index 8d92ab0..79d8909 100644 --- a/src/LaravelWebSocketsServiceProvider.php +++ b/src/WebSocketsServiceProvider.php @@ -8,7 +8,7 @@ use BeyondCode\LaravelWebSockets\ClientProviders\ClientProvider; use Illuminate\Support\ServiceProvider; use BeyondCode\LaravelWebSockets\LaravelEcho\Pusher\Channels\ChannelManager; -class LaravelWebSocketsServiceProvider extends ServiceProvider +class WebSocketsServiceProvider extends ServiceProvider { public function boot() { diff --git a/tests/TestCase.php b/tests/TestCase.php index 3e49d1e..9636394 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,13 +4,13 @@ namespace BeyondCode\LaravelWebSockets\Tests; use GuzzleHttp\Psr7\Request; use BeyondCode\LaravelWebSockets\Tests\Mocks\Connection; -use BeyondCode\LaravelWebSockets\LaravelWebSocketsServiceProvider; +use BeyondCode\LaravelWebSockets\WebSocketsServiceProvider; abstract class TestCase extends \Orchestra\Testbench\TestCase { protected function getPackageProviders($app) { - return [LaravelWebSocketsServiceProvider::class]; + return [WebSocketsServiceProvider::class]; } protected function getEnvironmentSetUp($app)