X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/74c691a9aee5de7e1b61bd58adc74c869e0952d5..ac5cd5913a208c463206d2fa6cf62e42148682a4:/services/api/app/models/user.rb diff --git a/services/api/app/models/user.rb b/services/api/app/models/user.rb index a3e928234e..e4881edf4e 100644 --- a/services/api/app/models/user.rb +++ b/services/api/app/models/user.rb @@ -7,6 +7,7 @@ class User < ArvadosModel before_update :prevent_privilege_escalation before_update :prevent_inactive_admin before_create :check_auto_admin + after_create :add_system_group_permission_link after_create AdminNotifier has_many :authorized_keys, :foreign_key => :authorized_user_uuid, :primary_key => :uuid @@ -79,10 +80,10 @@ class User < ArvadosModel Group.where('owner_uuid in (?)', lookup_uuids).each do |group| newgroups << [group.owner_uuid, group.uuid, 'can_manage'] end - Link.where('tail_uuid in (?) and link_class = ? and head_kind = ?', + Link.where('tail_uuid in (?) and link_class = ? and head_kind in (?)', lookup_uuids, 'permission', - 'arvados#group').each do |link| + ['arvados#group', 'arvados#user']).each do |link| newgroups << [link.tail_uuid, link.head_uuid, link.name] end newgroups.each do |tail_uuid, head_uuid, perm_name| @@ -110,39 +111,17 @@ class User < ArvadosModel end def self.setup(user, openid_prefix, repo_name=nil, vm_uuid=nil) - login_perm_props = {identity_url_prefix: openid_prefix} - - # Check oid_login_perm - oid_login_perms = Link.where(tail_uuid: user.email, - head_kind: 'arvados#user', - link_class: 'permission', - name: 'can_login') - - if !oid_login_perms.any? - # create openid login permission - oid_login_perm = Link.create(link_class: 'permission', - name: 'can_login', - tail_kind: 'email', - tail_uuid: user.email, - head_kind: 'arvados#user', - head_uuid: user.uuid, - properties: login_perm_props - ) - logger.info { "openid login permission: " + oid_login_perm[:uuid] } - else - oid_login_perm = oid_login_perms.first - end - - return [oid_login_perm] + user.setup_repo_vm_links(repo_name, vm_uuid) + return user.setup_repo_vm_links(repo_name, vm_uuid, openid_prefix) end # create links - def setup_repo_vm_links(repo_name, vm_uuid) + def setup_repo_vm_links(repo_name, vm_uuid, openid_prefix) + oid_login_perm = create_oid_login_perm openid_prefix repo_perm = create_user_repo_link repo_name vm_login_perm = create_vm_login_permission_link vm_uuid, repo_name group_perm = create_user_group_link - return [repo_perm, vm_login_perm, group_perm, self].compact + return [oid_login_perm, repo_perm, vm_login_perm, group_perm, self].compact end # delete user signatures, login, repo, and vm perms, and mark as inactive @@ -174,6 +153,19 @@ class User < ArvadosModel Link.delete perm end + # delete "All users' group read permissions for this user + group = Group.where(name: 'All users').select do |g| + g[:uuid].match /-f+$/ + end.first + group_perms = Link.where(tail_uuid: self.uuid, + head_uuid: group[:uuid], + head_kind: 'arvados#group', + link_class: 'permission', + name: 'can_read') + group_perms.each do |perm| + Link.delete perm + end + # delete any signatures by this user signed_uuids = Link.where(link_class: 'signature', tail_kind: 'arvados#user', @@ -256,6 +248,33 @@ class User < ArvadosModel merged end + def create_oid_login_perm (openid_prefix) + login_perm_props = {identity_url_prefix: openid_prefix} + + # Check oid_login_perm + oid_login_perms = Link.where(tail_uuid: self.email, + head_kind: 'arvados#user', + link_class: 'permission', + name: 'can_login') + + if !oid_login_perms.any? + # create openid login permission + oid_login_perm = Link.create(link_class: 'permission', + name: 'can_login', + tail_kind: 'email', + tail_uuid: self.email, + head_kind: 'arvados#user', + head_uuid: self.uuid, + properties: login_perm_props + ) + logger.info { "openid login permission: " + oid_login_perm[:uuid] } + else + oid_login_perm = oid_login_perms.first + end + + return oid_login_perm + end + def create_user_repo_link(repo_name) # repo_name is optional if not repo_name @@ -380,4 +399,15 @@ class User < ArvadosModel end end + # Give the special "System group" permission to manage this user and + # all of this user's stuff. + # + def add_system_group_permission_link + Link.create(link_class: 'permission', + name: 'can_manage', + tail_kind: 'arvados#group', + tail_uuid: system_group_uuid, + head_kind: 'arvados#user', + head_uuid: self.uuid) + end end