From 8b15897f63a763afb36030b0d5d7e8bdd77771eb Mon Sep 17 00:00:00 2001 From: Alex Renoki Date: Thu, 13 Aug 2020 19:17:06 +0300 Subject: [PATCH] Allow missing user_info on presence channels --- src/WebSockets/Channels/PresenceChannel.php | 7 ++++- tests/Channels/PresenceChannelTest.php | 29 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/WebSockets/Channels/PresenceChannel.php b/src/WebSockets/Channels/PresenceChannel.php index 9bbe1ec231..479d365066 100644 --- a/src/WebSockets/Channels/PresenceChannel.php +++ b/src/WebSockets/Channels/PresenceChannel.php @@ -86,12 +86,17 @@ protected function getUserIds(): array return array_values($userIds); } + /** + * Compute the hash for the presence channel integrity. + * + * @return array + */ protected function getHash(): array { $hash = []; foreach ($this->users as $socketId => $channelData) { - $hash[$channelData->user_id] = $channelData->user_info; + $hash[$channelData->user_id] = $channelData->user_info ?? []; } return $hash; diff --git a/tests/Channels/PresenceChannelTest.php b/tests/Channels/PresenceChannelTest.php index c2ae4a48c8..1749c13877 100644 --- a/tests/Channels/PresenceChannelTest.php +++ b/tests/Channels/PresenceChannelTest.php @@ -59,4 +59,33 @@ public function clients_with_valid_auth_signatures_can_join_presence_channels() 'channel' => 'presence-channel', ]); } + + /** @test */ + public function clients_with_no_user_info_can_join_presence_channels() + { + $connection = $this->getWebSocketConnection(); + + $this->pusherServer->onOpen($connection); + + $channelData = [ + 'user_id' => 1, + ]; + + $signature = "{$connection->socketId}:presence-channel:".json_encode($channelData); + + $message = new Message(json_encode([ + 'event' => 'pusher:subscribe', + 'data' => [ + 'auth' => $connection->app->key.':'.hash_hmac('sha256', $signature, $connection->app->secret), + 'channel' => 'presence-channel', + 'channel_data' => json_encode($channelData), + ], + ])); + + $this->pusherServer->onMessage($connection, $message); + + $connection->assertSentEvent('pusher_internal:subscription_succeeded', [ + 'channel' => 'presence-channel', + ]); + } }