X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6f9bc5a295042fdcc0e51b193d3f31633d58c5d1..3d7e21293962aac93f195ab02bf29d60039387bb:/services/api/app/controllers/arvados/v1/api_client_authorizations_controller.rb diff --git a/services/api/app/controllers/arvados/v1/api_client_authorizations_controller.rb b/services/api/app/controllers/arvados/v1/api_client_authorizations_controller.rb index 76acc701fd..cd466cf1fb 100644 --- a/services/api/app/controllers/arvados/v1/api_client_authorizations_controller.rb +++ b/services/api/app/controllers/arvados/v1/api_client_authorizations_controller.rb @@ -1,9 +1,15 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + +require 'safe_json' + class Arvados::V1::ApiClientAuthorizationsController < ApplicationController accept_attribute_as_json :scopes, Array - before_filter :current_api_client_is_trusted, :except => [:current] - before_filter :admin_required, :only => :create_system_auth - skip_before_filter :render_404_if_no_object, :only => [:create_system_auth, :current] - skip_before_filter :find_object_by_uuid, :only => [:create_system_auth, :current] + before_action :current_api_client_is_trusted, :except => [:current] + before_action :admin_required, :only => :create_system_auth + skip_before_action :render_404_if_no_object, :only => [:create_system_auth, :current] + skip_before_action :find_object_by_uuid, :only => [:create_system_auth, :current] def self._create_system_auth_requires_parameters { @@ -16,7 +22,7 @@ class Arvados::V1::ApiClientAuthorizationsController < ApplicationController new(user_id: system_user.id, api_client_id: params[:api_client_id] || current_api_client.andand.id, created_by_ip_address: remote_ip, - scopes: Oj.strict_load(params[:scopes] || '["all"]')) + scopes: SafeJSON.load(params[:scopes] || '["all"]')) @object.save! show end @@ -88,8 +94,24 @@ class Arvados::V1::ApiClientAuthorizationsController < ApplicationController @offset = 0 super wanted_scopes.compact.each do |scope_list| - sorted_scopes = scope_list.sort - @objects = @objects.select { |auth| auth.scopes.sort == sorted_scopes } + if @objects.respond_to?(:where) && scope_list.length < 2 + @objects = @objects. + where('scopes in (?)', + [scope_list.to_yaml, SafeJSON.dump(scope_list)]) + else + if @objects.respond_to?(:where) + # Eliminate rows with scopes=['all'] before doing the + # expensive filter. They are typically the majority of + # rows, and they obviously won't match given + # scope_list.length>=2, so loading them all into + # ActiveRecord objects is a huge waste of time. + @objects = @objects. + where('scopes not in (?)', + [['all'].to_yaml, SafeJSON.dump(['all'])]) + end + sorted_scopes = scope_list.sort + @objects = @objects.select { |auth| auth.scopes.sort == sorted_scopes } + end end @limit = @request_limit @offset = @request_offset