@@ -134,7 +134,7 @@ defmodule Realtime.Integration.RtChannel.PresenceTest do
134134 { service_role_socket , _ } = get_connection ( tenant , serializer , role: "service_role" )
135135 topic = "realtime:#{ topic } "
136136
137- WebsocketClient . join ( socket , topic , % { config: % { presence: % { key: "" , enabled: true } , private: true } } )
137+ WebsocketClient . join ( socket , topic , % { config: % { presence: % { key: "authenticated " , enabled: true } , private: true } } )
138138 assert_receive % Message { event: "phx_reply" , payload: % { "status" => "ok" } , topic: ^ topic } , 500
139139 assert_receive % Message { event: "presence_state" , payload: % { } , topic: ^ topic } , 500
140140
@@ -145,7 +145,7 @@ defmodule Realtime.Integration.RtChannel.PresenceTest do
145145 WebsocketClient . send_event ( socket , topic , "presence" , % { type: "presence" , event: "TRACK" , payload: payload } )
146146
147147 assert_receive % Message { event: "presence_diff" , payload: % { "joins" => joins , "leaves" => % { } } , topic: ^ topic } , 500
148- join_payload = joins |> Map . values ( ) |> hd ( ) |> get_in ( [ "metas" ] ) |> hd ( )
148+ join_payload = joins |> get_in ( [ "authenticated" , "metas" ] ) |> hd ( )
149149 assert get_in ( join_payload , [ "name" ] ) == payload . name
150150
151151 broadcast = % { "event" => "TEST" , "payload" => % { "msg" => 1 } , "type" => "broadcast" }
@@ -490,6 +490,55 @@ defmodule Realtime.Integration.RtChannel.PresenceTest do
490490
491491 refute_receive % Message { event: "phx_close" , topic: ^ realtime_topic } , 500
492492 end
493+
494+ @ tag policies: [
495+ :authenticated_read_presence ,
496+ :authenticated_write_presence ,
497+ :authenticated_read_broadcast_based_on_claim
498+ ]
499+ test "starts receiving broadcasts when broadcast read permission is granted on new access_token" ,
500+ % { tenant: tenant , topic: topic , serializer: serializer } do
501+ parent = self ( )
502+ publisher_inbox = spawn_link ( fn -> forward_frames ( parent , :publisher ) end )
503+ { :ok , publisher_token } = token_valid ( tenant , "service_role" )
504+
505+ { :ok , publisher } =
506+ WebsocketClient . connect ( publisher_inbox , uri ( tenant , serializer ) , serializer , [
507+ { "x-api-key" , publisher_token }
508+ ] )
509+
510+ # Token whose claims do not satisfy the broadcast read policy, so the join is allowed on presence alone
511+ { socket , _ } = get_connection ( tenant , serializer , role: "authenticated" , claims: % { broadcast_read: false } )
512+ realtime_topic = "realtime:#{ topic } "
513+
514+ WebsocketClient . join ( socket , realtime_topic , % {
515+ config: % { presence: % { key: "authenticated" , enabled: true } , private: true }
516+ } )
517+
518+ assert_receive % Message { event: "phx_reply" , payload: % { "status" => "ok" } , topic: ^ realtime_topic } , 500
519+ assert_receive % Message { event: "presence_state" , topic: ^ realtime_topic } , 500
520+
521+ WebsocketClient . join ( publisher , realtime_topic , % { config: % { private: true } } )
522+ assert_receive { :publisher , % Message { event: "phx_reply" , payload: % { "status" => "ok" } } } , 500
523+
524+ broadcast = % { "event" => "TEST" , "payload" => % { "msg" => 1 } , "type" => "broadcast" }
525+ WebsocketClient . send_event ( publisher , realtime_topic , "broadcast" , broadcast )
526+ refute_receive % Message { event: "broadcast" , topic: ^ realtime_topic } , 500
527+
528+ # New token whose claims satisfy the broadcast read policy
529+ { :ok , new_token } =
530+ generate_token ( tenant , % {
531+ exp: System . system_time ( :second ) + 1000 ,
532+ role: "authenticated" ,
533+ broadcast_read: true
534+ } )
535+
536+ WebsocketClient . send_event ( socket , realtime_topic , "access_token" , % { "access_token" => new_token } )
537+ refute_receive % Message { event: "phx_close" , topic: ^ realtime_topic } , 500
538+
539+ WebsocketClient . send_event ( publisher , realtime_topic , "broadcast" , broadcast )
540+ assert_receive % Message { event: "broadcast" , payload: ^ broadcast , topic: ^ realtime_topic } , 500
541+ end
493542 end
494543
495544 describe "database connection errors" do
0 commit comments