X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d7581fb19947ff1efa3b5dcc045b24377e1fe3d6..0ce64862c39e93591635f31a47c5b7d4aa0b9a19:/services/api/app/controllers/arvados/v1/collections_controller.rb diff --git a/services/api/app/controllers/arvados/v1/collections_controller.rb b/services/api/app/controllers/arvados/v1/collections_controller.rb index a0c64aa6e6..b65fa5b962 100644 --- a/services/api/app/controllers/arvados/v1/collections_controller.rb +++ b/services/api/app/controllers/arvados/v1/collections_controller.rb @@ -45,16 +45,9 @@ class Arvados::V1::CollectionsController < ApplicationController end # Remove any permission signatures from the manifest. - resource_attrs[:manifest_text] - .gsub!(/ [[:xdigit:]]{32}(\+[[:digit:]]+)?(\+\S+)/) { |word| - word.strip! - loc = Locator.parse(word) - if loc - " " + loc.without_signature.to_s - else - " " + word - end - } + munge_manifest_locators(resource_attrs[:manifest_text]) do |loc| + loc.without_signature.to_s + end # Save the collection with the stripped manifest. act_as_system_user do @@ -91,24 +84,13 @@ class Arvados::V1::CollectionsController < ApplicationController end def show - if current_api_client_authorization - signing_opts = { - key: Rails.configuration.blob_signing_key, - api_token: current_api_client_authorization.api_token, - ttl: Rails.configuration.blob_signing_ttl, - } - @object[:manifest_text] - .gsub!(/ [[:xdigit:]]{32}(\+[[:digit:]]+)?(\+\S+)/) { |word| - word.strip! - loc = Locator.parse(word) - if loc - " " + Blob.sign_locator(word, signing_opts) - else - " " + word - end - } - end - render json: @object.as_api_response(:with_data) + sign_manifests(@object[:manifest_text]) + super + end + + def index + sign_manifests(*@objects.map { |c| c[:manifest_text] }) + super end def collection_uuid(uuid) @@ -149,7 +131,7 @@ class Arvados::V1::CollectionsController < ApplicationController logger.debug "visiting #{uuid}" - if m + if m # uuid is a collection Collection.readable_by(current_user).where(uuid: uuid).each do |c| visited[uuid] = c.as_api_response @@ -166,7 +148,7 @@ class Arvados::V1::CollectionsController < ApplicationController Job.readable_by(current_user).where(log: uuid).each do |job| generate_provenance_edges(visited, job.uuid) end - + else # uuid is something else rsc = ArvadosModel::resource_class_for_uuid uuid @@ -208,7 +190,7 @@ class Arvados::V1::CollectionsController < ApplicationController logger.debug "visiting #{uuid}" - if m + if m # uuid is a collection Collection.readable_by(current_user).where(uuid: uuid).each do |c| visited[uuid] = c.as_api_response @@ -226,7 +208,7 @@ class Arvados::V1::CollectionsController < ApplicationController Job.readable_by(current_user).where(["jobs.script_parameters like ?", "%#{uuid}%"]).each do |job| generate_used_by_edges(visited, job.uuid) end - + else # uuid is something else rsc = ArvadosModel::resource_class_for_uuid uuid @@ -258,7 +240,27 @@ class Arvados::V1::CollectionsController < ApplicationController render json: visited end + def self.munge_manifest_locators(manifest) + # Given a manifest text and a block, yield each locator, + # and replace it with whatever the block returns. + manifest.andand.gsub!(/ [[:xdigit:]]{32}(\+[[:digit:]]+)?(\+\S+)/) do |word| + if loc = Locator.parse(word.strip) + " " + yield(loc) + else + " " + word + end + end + end + protected + + def find_objects_for_index + # Omit manifest_text from index results unless expressly selected. + @select ||= model_class.api_accessible_attributes(:user). + map { |attr_spec| attr_spec.first.to_s } - ["manifest_text"] + super + end + def find_object_by_uuid super if !@object and !params[:uuid].match(/^[0-9a-f]+\+\d+$/) @@ -277,4 +279,23 @@ class Arvados::V1::CollectionsController < ApplicationController end end end + + def munge_manifest_locators(manifest, &block) + self.class.munge_manifest_locators(manifest, &block) + end + + def sign_manifests(*manifests) + if current_api_client_authorization + signing_opts = { + key: Rails.configuration.blob_signing_key, + api_token: current_api_client_authorization.api_token, + ttl: Rails.configuration.blob_signing_ttl, + } + manifests.each do |text| + munge_manifest_locators(text) do |loc| + Blob.sign_locator(loc.to_s, signing_opts) + end + end + end + end end