X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a2107d5fc7982769c2d667e51656a6e2529d9bc9..417ff385d9e6bf111ebb1d5889c2081977dfe955:/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 c89efdf404..ed19636fcb 100644 --- a/services/api/app/models/arvados_model.rb +++ b/services/api/app/models/arvados_model.rb @@ -11,10 +11,11 @@ class ArvadosModel < ActiveRecord::Base before_create :ensure_permission_to_create before_update :ensure_permission_to_update before_destroy :ensure_permission_to_destroy - before_create :update_modified_by_fields - before_update :maybe_update_modified_by_fields + + before_validation :maybe_update_modified_by_fields validate :ensure_serialized_attribute_type validate :normalize_collection_uuids + validate :ensure_valid_uuids has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'" @@ -40,12 +41,16 @@ class ArvadosModel < ActiveRecord::Base def self.searchable_columns self.columns.collect do |col| - if [:string, :text].index(col.type) && col.name != 'owner_uuid' + if [:string, :text, :datetime, :integer].index(col.type) && col.name != 'owner_uuid' col.name end end.compact end + def self.attribute_column attr + self.columns.select { |col| col.name == attr.to_s }.first + end + def eager_load_associations self.class.columns.each do |col| re = col.name.match /^(.*)_kind$/ @@ -131,7 +136,7 @@ class ArvadosModel < ActiveRecord::Base end def maybe_update_modified_by_fields - update_modified_by_fields if self.changed? + update_modified_by_fields if self.changed? or self.new_record? end def update_modified_by_fields @@ -176,6 +181,25 @@ class ArvadosModel < ActiveRecord::Base end end + @@UUID_REGEX = /^[0-9a-z]{5}-([0-9a-z]{5})-[0-9a-z]{15}$/ + + def ensure_valid_uuids + specials = [system_user_uuid, 'd41d8cd98f00b204e9800998ecf8427e+0'] + + foreign_key_attributes.each do |attr| + next if attr == "modified_by_client_uuid" + begin + attr_value = send attr + r = ArvadosModel::resource_class_for_uuid attr_value if attr_value + if r and r.readable_by(current_user).where(uuid: attr_value).count == 0 and not specials.include? attr_value + errors.add(attr, "'#{attr_value}' not found") + end + rescue Exception => e + errors.add(attr, "'#{attr_value}' error #{e}") + end + end + end + def self.resource_class_for_uuid(uuid) if uuid.is_a? ArvadosModel return uuid.class @@ -189,7 +213,7 @@ class ArvadosModel < ActiveRecord::Base resource_class = nil Rails.application.eager_load! - uuid.match /^[0-9a-z]{5}-([0-9a-z]{5})-[0-9a-z]{15}$/ do |re| + uuid.match @@UUID_REGEX do |re| ActiveRecord::Base.descendants.reject(&:abstract_class?).each do |k| if k.respond_to?(:uuid_prefix) if k.uuid_prefix == re[1]