X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d77cf59c6dc0c70f8806d17e03576af272dc425d..03e570095885982d23e234bce8e1c068314b63af:/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..0803d5464d 100644 --- a/services/api/lib/current_api_client.rb +++ b/services/api/lib/current_api_client.rb @@ -29,14 +29,17 @@ 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 + # Is the current API client authorization scoped for the request? + def current_api_client_auth_has_scope(req_s) + (current_api_client_authorization.andand.scopes || []).select { |scope| + if scope == 'all' + true + elsif scope.end_with? '/' + req_s.start_with? scope + else + req_s == scope + end + }.any? end def system_user_uuid @@ -45,6 +48,12 @@ module CurrentApiClient '000000000000000'].join('-') end + def system_group_uuid + [Server::Application.config.uuid_prefix, + Group.uuid_prefix, + '000000000000000'].join('-') + end + def system_user if not $system_user real_current_user = Thread.current[:user] @@ -65,13 +74,38 @@ 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 + begin + yield + ensure + Thread.current[:user] = user_was + end else Thread.current[:user] = system_user end