@@ -164,6 +164,14 @@ defmodule Livebook.Hubs.TeamClient do
164
164
GenServer . call ( registry_name ( id ) , { :check_app_access , groups , slug } )
165
165
end
166
166
167
+ @ doc """
168
+ Returns if the given user has access to deploy apps to given deployment group.
169
+ """
170
+ @ spec user_can_deploy? ( String . t ( ) , pos_integer ( ) | nil , String . t ( ) ) :: boolean ( )
171
+ def user_can_deploy? ( id , user_id , deployment_group_id ) do
172
+ GenServer . call ( registry_name ( id ) , { :user_can_deploy? , user_id , deployment_group_id } )
173
+ end
174
+
167
175
@ doc """
168
176
Returns if the Team client is connected.
169
177
"""
@@ -338,6 +346,30 @@ defmodule Livebook.Hubs.TeamClient do
338
346
end
339
347
end
340
348
349
+ def handle_call ( { :user_can_deploy? , user_id , id } , _caller , state ) do
350
+ # App servers/Offline instances should not be able to deploy apps
351
+ if state . deployment_group_id || user_id == nil do
352
+ { :reply , false , state }
353
+ else
354
+ case fetch_deployment_group ( id , state ) do
355
+ { :ok , deployment_group } ->
356
+ deployment_user = % Teams.DeploymentUser {
357
+ user_id: to_string ( user_id ) ,
358
+ deployment_group_id: id
359
+ }
360
+
361
+ authorized? =
362
+ not deployment_group . deploy_auth or
363
+ deployment_user in deployment_group . deployment_users
364
+
365
+ { :reply , authorized? , state }
366
+
367
+ _ ->
368
+ { :reply , false , state }
369
+ end
370
+ end
371
+ end
372
+
341
373
@ impl true
342
374
def handle_info ( :connected , state ) do
343
375
Hubs.Broadcasts . hub_connected ( state . hub . id )
@@ -499,6 +531,7 @@ defmodule Livebook.Hubs.TeamClient do
499
531
agent_keys = Enum . map ( deployment_group . agent_keys , & build_agent_key / 1 )
500
532
environment_variables = build_environment_variables ( state , deployment_group )
501
533
authorization_groups = build_authorization_groups ( deployment_group )
534
+ deployment_users = build_deployment_users ( deployment_group )
502
535
503
536
% Teams.DeploymentGroup {
504
537
id: deployment_group . id ,
@@ -512,7 +545,9 @@ defmodule Livebook.Hubs.TeamClient do
512
545
url: nullify ( deployment_group . url ) ,
513
546
teams_auth: deployment_group . teams_auth ,
514
547
groups_auth: deployment_group . groups_auth ,
515
- authorization_groups: authorization_groups
548
+ deploy_auth: deployment_group . deploy_auth ,
549
+ authorization_groups: authorization_groups ,
550
+ deployment_users: deployment_users
516
551
}
517
552
end
518
553
@@ -530,7 +565,8 @@ defmodule Livebook.Hubs.TeamClient do
530
565
clustering: nullify ( deployment_group_created . clustering ) ,
531
566
url: nullify ( deployment_group_created . url ) ,
532
567
teams_auth: deployment_group_created . teams_auth ,
533
- authorization_groups: [ ]
568
+ authorization_groups: [ ] ,
569
+ deployment_users: [ ]
534
570
}
535
571
end
536
572
@@ -539,6 +575,7 @@ defmodule Livebook.Hubs.TeamClient do
539
575
agent_keys = Enum . map ( deployment_group_updated . agent_keys , & build_agent_key / 1 )
540
576
environment_variables = build_environment_variables ( state , deployment_group_updated )
541
577
authorization_groups = build_authorization_groups ( deployment_group_updated )
578
+ deployment_users = build_deployment_users ( deployment_group_updated )
542
579
543
580
{ :ok , deployment_group } = fetch_deployment_group ( deployment_group_updated . id , state )
544
581
@@ -552,7 +589,9 @@ defmodule Livebook.Hubs.TeamClient do
552
589
url: nullify ( deployment_group_updated . url ) ,
553
590
teams_auth: deployment_group_updated . teams_auth ,
554
591
groups_auth: deployment_group_updated . groups_auth ,
555
- authorization_groups: authorization_groups
592
+ deploy_auth: deployment_group_updated . deploy_auth ,
593
+ authorization_groups: authorization_groups ,
594
+ deployment_users: deployment_users
556
595
}
557
596
end
558
597
@@ -596,6 +635,15 @@ defmodule Livebook.Hubs.TeamClient do
596
635
end
597
636
end
598
637
638
+ defp build_deployment_users ( % { deployment_users: deployment_users } ) do
639
+ for deployment_user <- deployment_users do
640
+ % Teams.DeploymentUser {
641
+ user_id: deployment_user . user_id ,
642
+ deployment_group_id: deployment_user . deployment_group_id
643
+ }
644
+ end
645
+ end
646
+
599
647
defp put_agent ( state , agent ) do
600
648
state = remove_agent ( state , agent )
601
649
@@ -696,11 +744,19 @@ defmodule Livebook.Hubs.TeamClient do
696
744
697
745
with { :ok , current_deployment_group } <- fetch_deployment_group ( deployment_group . id , state ) do
698
746
if state . deployment_group_id == deployment_group . id and
699
- ( current_deployment_group . authorization_groups != deployment_group . authorization_groups or
747
+ ( current_deployment_group . authorization_groups !=
748
+ deployment_group . authorization_groups or
700
749
current_deployment_group . groups_auth != deployment_group . groups_auth or
701
750
current_deployment_group . teams_auth != deployment_group . teams_auth ) do
702
751
Teams.Broadcasts . server_authorization_updated ( deployment_group )
703
752
end
753
+
754
+ if state . deployment_group_id == nil and
755
+ ( current_deployment_group . deployment_users !=
756
+ deployment_group . deployment_users or
757
+ current_deployment_group . deploy_auth != deployment_group . deploy_auth ) do
758
+ Teams.Broadcasts . deployment_users_updated ( deployment_group )
759
+ end
704
760
end
705
761
706
762
put_deployment_group ( state , deployment_group )
0 commit comments