X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/79a18f2eb4c02212d30462b3c8eb4f989ab750d3..eb03fb3ad316a637f032f911af7d69950482ead3:/services/api/app/models/arvados_model.rb diff --git a/services/api/app/models/arvados_model.rb b/services/api/app/models/arvados_model.rb index 1fe5808848..936f823a5e 100644 --- a/services/api/app/models/arvados_model.rb +++ b/services/api/app/models/arvados_model.rb @@ -103,6 +103,13 @@ class ArvadosModel < ActiveRecord::Base api_column_map end + def self.columns_for_attributes(select_attributes) + # Given an array of attribute names to select, return an array of column + # names that must be fetched from the database to satisfy the request. + api_column_map = attributes_required_columns + select_attributes.flat_map { |attr| api_column_map[attr] }.uniq + end + def self.default_orders ["#{table_name}.modified_at desc", "#{table_name}.uuid"] end @@ -308,8 +315,13 @@ class ArvadosModel < ActiveRecord::Base # Verify "write" permission on new owner # default fail unless one of: # current_user is this object - # current user can_write new owner - unless current_user == self or current_user.can? write: owner_uuid + # current user can_write new owner, or this object if owner unchanged + if new_record? or owner_uuid_changed? or is_a?(ApiClientAuthorization) + write_target = owner_uuid + else + write_target = uuid + end + unless current_user == self or current_user.can? write: write_target logger.warn "User #{current_user.uuid} tried to modify #{self.class.to_s} #{uuid} but does not have permission to write new owner_uuid #{owner_uuid}" errors.add :owner_uuid, "cannot be changed without write permission on new owner" raise PermissionDeniedError