X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5650d4363cf788affbf1b72771111ea856258c12..754d85439d5e9a835562689dee597b782932914f:/services/api/lib/current_api_client.rb diff --git a/services/api/lib/current_api_client.rb b/services/api/lib/current_api_client.rb index 0ea871e3da..37039ee654 100644 --- a/services/api/lib/current_api_client.rb +++ b/services/api/lib/current_api_client.rb @@ -29,26 +29,36 @@ module CurrentApiClient Thread.current[:api_client_ip_address] end - # Does the current API client authorization include any of ok_scopes? - def current_api_client_auth_has_scope(ok_scopes) - auth_scopes = current_api_client_authorization.andand.scopes || [] - unless auth_scopes.index('all') or (auth_scopes & ok_scopes).any? - logger.warn "Insufficient auth scope: need #{ok_scopes}, #{current_api_client_authorization.inspect} has #{auth_scopes}" - return false - end - true - end - def system_user_uuid [Server::Application.config.uuid_prefix, User.uuid_prefix, '000000000000000'].join('-') end + def system_group_uuid + [Server::Application.config.uuid_prefix, + Group.uuid_prefix, + '000000000000000'].join('-') + end + + def anonymous_group_uuid + [Server::Application.config.uuid_prefix, + Group.uuid_prefix, + 'anonymouspublic'].join('-') + end + + def anonymous_user_uuid + [Server::Application.config.uuid_prefix, + User.uuid_prefix, + 'anonymouspublic'].join('-') + end + def system_user if not $system_user real_current_user = Thread.current[:user] - Thread.current[:user] = User.new(is_admin: true, is_active: true) + Thread.current[:user] = User.new(is_admin: true, + is_active: true, + uuid: system_user_uuid) $system_user = User.where('uuid=?', system_user_uuid).first if !$system_user $system_user = User.new(uuid: system_user_uuid, @@ -65,15 +75,113 @@ module CurrentApiClient $system_user end + def system_group + if not $system_group + act_as_system_user do + ActiveRecord::Base.transaction do + $system_group = Group. + where(uuid: system_group_uuid).first_or_create do |g| + g.update_attributes(name: "System group", + description: "System group") + User.all.collect(&:uuid).each do |user_uuid| + Link.create(link_class: 'permission', + name: 'can_manage', + tail_kind: 'arvados#group', + tail_uuid: system_group_uuid, + head_kind: 'arvados#user', + head_uuid: user_uuid) + end + end + end + end + end + $system_group + end + def act_as_system_user if block_given? - user_was = Thread.current[:user] - Thread.current[:user] = system_user - ret = yield - Thread.current[:user] = user_was - ret + act_as_user system_user do + yield + end else Thread.current[:user] = system_user end end + + def act_as_user user + user_was = Thread.current[:user] + Thread.current[:user] = user + begin + yield + ensure + Thread.current[:user] = user_was + end + end + + def anonymous_group + if not $anonymous_group + act_as_system_user do + ActiveRecord::Base.transaction do + $anonymous_group = Group. + where(uuid: anonymous_group_uuid).first_or_create do |g| + g.update_attributes(name: "Anonymous group", + description: "Anonymous group") + end + end + end + end + $anonymous_group + end + + def anonymous_user + if not $anonymous_user + act_as_system_user do + $anonymous_user = User.where('uuid=?', anonymous_user_uuid).first + if !$anonymous_user + $anonymous_user = User.new(uuid: anonymous_user_uuid, + is_active: false, + is_admin: false, + email: 'anonymouspublic', + first_name: 'anonymouspublic', + last_name: 'anonymouspublic') + $anonymous_user.save! + $anonymous_user.reload + end + + group_perms = Link.where(tail_uuid: anonymous_user_uuid, + head_uuid: anonymous_group_uuid, + link_class: 'permission', + name: 'can_read') + + if !group_perms.any? + group_perm = Link.create!(tail_uuid: anonymous_user_uuid, + head_uuid: anonymous_group_uuid, + link_class: 'permission', + name: 'can_read') + end + end + end + $anonymous_user + end + + def empty_collection_uuid + 'd41d8cd98f00b204e9800998ecf8427e+0' + end + + def empty_collection + if not $empty_collection + act_as_system_user do + ActiveRecord::Base.transaction do + $empty_collection = Collection. + where(uuid: empty_collection_uuid). + first_or_create!(manifest_text: '') + Link.where(tail_uuid: anonymous_group.uuid, + head_uuid: empty_collection_uuid, + link_class: 'permission', + name: 'can_read').first_or_create! + end + end + end + $empty_collection + end end