2762: When deleting an object, delete permissions and fail if other
[arvados.git] / services / api / app / models / arvados_model.rb
index 4e707b72e4c865ac6c4b9ec7d628442a597c0d40..4faa0d041ffa28d3497a085d01285ab8ca6906df 100644 (file)
@@ -14,7 +14,6 @@ class ArvadosModel < ActiveRecord::Base
   before_save :ensure_ownership_path_leads_to_user
   before_destroy :ensure_owner_uuid_is_permitted
   before_destroy :ensure_permission_to_destroy
-
   before_create :update_modified_by_fields
   before_update :maybe_update_modified_by_fields
   after_create :log_create
@@ -27,7 +26,7 @@ class ArvadosModel < ActiveRecord::Base
   # Note: This only returns permission links. It does not account for
   # permissions obtained via user.is_admin or
   # user.uuid==object.owner_uuid.
-  has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'"
+  has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'", dependent: :destroy
 
   class PermissionDeniedError < StandardError
     def http_status
@@ -186,7 +185,7 @@ class ArvadosModel < ActiveRecord::Base
   end
 
   def ensure_owner_uuid_is_permitted
-    return false if !current_user
+    raise PermissionDeniedError if !current_user
     self.owner_uuid ||= current_user.uuid
     if self.owner_uuid_changed?
       if current_user.uuid == self.owner_uuid or
@@ -237,6 +236,11 @@ class ArvadosModel < ActiveRecord::Base
     return true
   end
 
+  def destroy_permission_links
+    Link.destroy_all(['link_class=? and (head_uuid=? or tail_uuid=?)',
+                      'permission', uuid, uuid])
+  end
+
   def ensure_permission_to_destroy
     raise PermissionDeniedError unless permission_to_destroy
   end
@@ -247,6 +251,7 @@ class ArvadosModel < ActiveRecord::Base
 
   def maybe_update_modified_by_fields
     update_modified_by_fields if self.changed? or self.new_record?
+    true
   end
 
   def update_modified_by_fields
@@ -255,6 +260,7 @@ class ArvadosModel < ActiveRecord::Base
     self.modified_at = Time.now
     self.modified_by_user_uuid = current_user ? current_user.uuid : nil
     self.modified_by_client_uuid = current_api_client ? current_api_client.uuid : nil
+    true
   end
 
   def ensure_serialized_attribute_type