Merge branch '2659-anonymous-share-projects' refs #2659
[arvados.git] / services / api / lib / current_api_client.rb
1 module CurrentApiClient
2   def current_user
3     Thread.current[:user]
4   end
5
6   def current_api_client
7     Thread.current[:api_client]
8   end
9
10   def current_api_client_authorization
11     Thread.current[:api_client_authorization]
12   end
13
14   def current_api_base
15     Thread.current[:api_url_base]
16   end
17
18   def current_default_owner
19     # owner_uuid for newly created objects
20     ((current_api_client_authorization &&
21       current_api_client_authorization.default_owner_uuid) ||
22      (current_user && current_user.default_owner_uuid) ||
23      (current_user && current_user.uuid) ||
24      nil)
25   end
26
27   # Where is the client connecting from?
28   def current_api_client_ip_address
29     Thread.current[:api_client_ip_address]
30   end
31
32   def system_user_uuid
33     [Server::Application.config.uuid_prefix,
34      User.uuid_prefix,
35      '000000000000000'].join('-')
36   end
37
38   def system_group_uuid
39     [Server::Application.config.uuid_prefix,
40      Group.uuid_prefix,
41      '000000000000000'].join('-')
42   end
43
44   def anonymous_group_uuid
45     [Server::Application.config.uuid_prefix,
46      Group.uuid_prefix,
47      'anonymouspublic'].join('-')
48   end
49
50   def anonymous_user_uuid
51     [Server::Application.config.uuid_prefix,
52      User.uuid_prefix,
53      'anonymouspublic'].join('-')
54   end
55
56   def system_user
57     $system_user = check_cache $system_user do
58       real_current_user = Thread.current[:user]
59       begin
60         Thread.current[:user] = User.new(is_admin: true,
61                                          is_active: true,
62                                          uuid: system_user_uuid)
63         User.where(uuid: system_user_uuid).
64           first_or_create!(is_active: true,
65                            is_admin: true,
66                            email: 'root',
67                            first_name: 'root',
68                            last_name: '')
69       ensure
70         Thread.current[:user] = real_current_user
71       end
72     end
73   end
74
75   def system_group
76     $system_group = check_cache $system_group do
77       act_as_system_user do
78         ActiveRecord::Base.transaction do
79           Group.where(uuid: system_group_uuid).
80             first_or_create!(name: "System group",
81                              description: "System group") do |g|
82             g.save!
83             User.all.collect(&:uuid).each do |user_uuid|
84               Link.create!(link_class: 'permission',
85                            name: 'can_manage',
86                            tail_kind: 'arvados#group',
87                            tail_uuid: system_group_uuid,
88                            head_kind: 'arvados#user',
89                            head_uuid: user_uuid)
90             end
91           end
92         end
93       end
94     end
95   end
96
97   def all_users_group_uuid
98     [Server::Application.config.uuid_prefix,
99      Group.uuid_prefix,
100      'fffffffffffffff'].join('-')
101   end
102
103   def all_users_group
104     $all_users_group = check_cache $all_users_group do
105       act_as_system_user do
106         ActiveRecord::Base.transaction do
107           Group.where(uuid: all_users_group_uuid).
108             first_or_create!(name: "All users",
109                              description: "All users",
110                              group_class: "role")
111         end
112       end
113     end
114   end
115
116   def act_as_system_user
117     if block_given?
118       act_as_user system_user do
119         yield
120       end
121     else
122       Thread.current[:user] = system_user
123     end
124   end
125
126   def act_as_user user
127     user_was = Thread.current[:user]
128     Thread.current[:user] = user
129     begin
130       yield
131     ensure
132       Thread.current[:user] = user_was
133     end
134   end
135
136   def anonymous_group
137     $anonymous_group = check_cache $anonymous_group do
138       act_as_system_user do
139         ActiveRecord::Base.transaction do
140           Group.where(uuid: anonymous_group_uuid).
141             first_or_create!(group_class: "role",
142                              name: "Anonymous users",
143                              description: "Anonymous users")
144         end
145       end
146     end
147   end
148
149   def anonymous_user
150     $anonymous_user = check_cache $anonymous_user do
151       act_as_system_user do
152         User.where(uuid: anonymous_user_uuid).
153           first_or_create!(is_active: false,
154                            is_admin: false,
155                            email: 'anonymous',
156                            first_name: 'Anonymous',
157                            last_name: '') do |u|
158           u.save!
159           Link.where(tail_uuid: anonymous_user_uuid,
160                      head_uuid: anonymous_group.uuid,
161                      link_class: 'permission',
162                      name: 'can_read').
163             first_or_create!
164         end
165       end
166     end
167   end
168
169   def empty_collection_uuid
170     'd41d8cd98f00b204e9800998ecf8427e+0'
171   end
172
173   def empty_collection
174     $empty_collection = check_cache $empty_collection do
175       act_as_system_user do
176         ActiveRecord::Base.transaction do
177           Collection.
178             where(portable_data_hash: empty_collection_uuid).
179             first_or_create!(manifest_text: '', owner_uuid: anonymous_group.uuid)
180         end
181       end
182     end
183   end
184
185   private
186
187   # If the given value is nil, or the cache has been cleared since it
188   # was set, yield. Otherwise, return the given value.
189   def check_cache value
190     Rails.cache.fetch "CurrentApiClient.$globals" do
191       value = nil
192       true
193     end
194     return value unless value.nil?
195     yield
196   end
197 end