fix ownership-change permission check
[arvados.git] / app / models / metadatum.rb
1 class Metadatum < OrvosModel
2   include AssignUuid
3   include KindAndEtag
4   include CommonApiTemplate
5   serialize :info, Hash
6   before_create :permission_to_attach_to_objects
7   before_update :permission_to_attach_to_objects
8
9   api_accessible :superuser, :extend => :common do |t|
10     t.add :tail_kind
11     t.add :tail
12     t.add :metadata_class
13     t.add :name
14     t.add :head_kind
15     t.add :head
16     t.add :info
17   end
18
19   def info
20     @info ||= Hash.new
21     super
22   end
23
24   protected
25
26   def permission_to_attach_to_objects
27     # Anonymous users cannot write metadata
28     return false if !current_user
29
30     # All users can write metadata that doesn't affect permissions
31     return true if self.metadata_class != 'permission'
32
33     # Administrators can grant permissions
34     return true if current_user.is_admin
35
36     # All users can grant permissions on objects they own
37     head_obj = self.class.
38       kind_class(self.head_kind).
39       where('uuid=?',head_uuid).
40       first
41     if head_obj
42       return true if head_obj.owner == current_user.uuid
43     end
44
45     # Users with "can_grant" permission on an object can grant
46     # permissions on that object
47     has_grant_permission = self.class.
48       where('metadata_class=? AND name=? AND tail=? AND head=?',
49             'permission', 'can_grant', current_user.uuid, self.head).
50       count > 0
51     return true if has_grant_permission
52
53     # Default = deny.
54     false
55   end
56 end