]> git.arvados.org - arvados.git/blob - services/api/app/controllers/arvados/v1/credentials_controller.rb
22680: Couple more cleanups
[arvados.git] / services / api / app / controllers / arvados / v1 / credentials_controller.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 class Arvados::V1::CredentialsController < ApplicationController
6
7   # "secret" is not returned in API calls, but we also want
8   # to disallow its use in queries in general.
9
10   def load_where_param
11     super
12     if @where[:secret]
13       raise ArvadosModel::PermissionDeniedError.new "Cannot use 'secret' in where clause"
14     end
15   end
16
17   def load_filters_param
18     super
19     @filters.map do |k|
20       if k[0] =~ /secret/
21         raise ArvadosModel::PermissionDeniedError.new "Cannot filter on 'secret'"
22       end
23     end
24   end
25
26   def load_limit_offset_order_params
27     super
28     @orders.each do |ord|
29       if ord =~ /secret/
30         raise ArvadosModel::PermissionDeniedError.new "Cannot order by 'secret'"
31       end
32     end
33   end
34
35   def self._secret_method_description
36     "Fetch the secret part of the credential (can only be invoked by running containers)."
37   end
38
39   def secret
40     # Should have previously determined the user can read the credential in @object
41     c = Container.for_current_token
42     if !@object || !c || c.state != Container::Running
43       send_error("Token is not associated with a running container.", status: 403)
44       return
45     end
46
47     if Time.now >= @object.expires_at
48       send_error("Credential has expired.", status: 403)
49       return
50     end
51
52     lg = Log.new(event_type: "secret_access")
53     lg.object_uuid = @object.uuid
54     lg.object_owner_uuid = @object.owner_uuid
55     lg.properties = {
56       "name": @object.name,
57       "credential_class": @object.credential_class,
58       "external_id": @object.external_id,
59     }
60     lg.save!
61     send_json({"external_id" => @object.external_id, "secret" => @object.secret})
62   end
63 end