11453: Move remote token validation to middleware. Bypass Ruby SDK.
[arvados.git] / services / api / test / integration / remote_user_test.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 require 'webrick'
6 require 'webrick/https'
7 require 'test_helper'
8 require 'helpers/users_test_helper'
9
10 class RemoteUsersTest < ActionDispatch::IntegrationTest
11   def auth(remote:)
12     token = salt_token(fixture: :active, remote: remote)
13     token.sub!('/zzzzz-', '/'+remote+'-')
14     {"HTTP_AUTHORIZATION" => "Bearer #{token}"}
15   end
16
17   setup do
18     @controller = Arvados::V1::UsersController.new
19     ready = Thread::Queue.new
20     srv = WEBrick::HTTPServer.new(
21       Port: 0,
22       Logger: WEBrick::Log.new(
23         Rails.root.join("log", "webrick.log").to_s,
24         WEBrick::Log::INFO),
25       AccessLog: [[File.open(Rails.root.join(
26                               "log", "webrick_access.log").to_s, 'a+'),
27                    WEBrick::AccessLog::COMBINED_LOG_FORMAT]],
28       SSLEnable: true,
29       SSLVerifyClient: OpenSSL::SSL::VERIFY_NONE,
30       SSLPrivateKey: OpenSSL::PKey::RSA.new(
31         File.open(Rails.root.join("tmp", "self-signed.key")).read),
32       SSLCertificate: OpenSSL::X509::Certificate.new(
33         File.open(Rails.root.join("tmp", "self-signed.pem")).read),
34       SSLCertName: [["CN", WEBrick::Utils::getservername]],
35       StartCallback: lambda { ready.push(true) })
36     srv.mount_proc '/discovery/v1/apis/arvados/v1/rest' do |req, res|
37       Rails.cache.delete 'arvados_v1_rest_discovery'
38       res.body = Arvados::V1::SchemaController.new.send(:discovery_doc).to_json
39     end
40     srv.mount_proc '/arvados/v1/users/current' do |req, res|
41       res.status = @stub_status
42       res.body = @stub_content.is_a?(String) ? @stub_content : @stub_content.to_json
43     end
44     Thread.new do
45       srv.start
46     end
47     ready.pop
48     @remote_server = srv
49     @remote_host = "127.0.0.1:#{srv.config[:Port]}"
50     Rails.configuration.remote_hosts['zbbbb'] = @remote_host
51     Rails.configuration.remote_hosts['zcccc'] = @remote_host
52     Arvados::V1::SchemaController.any_instance.stubs(:root_url).returns "https://#{@remote_host}"
53     @stub_status = 200
54     @stub_content = {
55       uuid: 'zbbbb-tpzed-000000000000000',
56       is_admin: true,
57       is_active: true,
58     }
59   end
60
61   teardown do
62     @remote_server.andand.stop
63   end
64
65   test 'authenticate with remote token' do
66     get '/arvados/v1/users/current', {}, auth(remote: 'zbbbb')
67     assert_response :success
68     assert_equal 'zbbbb-tpzed-000000000000000', json_response['uuid']
69     assert_equal false, json_response['is_admin']
70   end
71
72   test 'authenticate with remote token from wrong site' do
73     @stub_content[:uuid] = 'zcccc-tpzed-000000000000000'
74     get '/arvados/v1/users/current', {}, auth(remote: 'zbbbb')
75     assert_response 401
76   end
77
78   test 'authenticate with remote token that fails validate' do
79     @stub_status = 401
80     @stub_content = {
81       error: 'not authorized',
82     }
83     get '/arvados/v1/users/current', {}, auth(remote: 'zbbbb')
84     assert_response 401
85   end
86
87   test 'remote api server is not an api server' do
88     @stub_status = 200
89     @stub_content = '<html>bad</html>'
90     get '/arvados/v1/users/current', {}, auth(remote: 'zbbbb')
91     assert_response 401
92   end
93
94   ['zbbbb', 'z0000'].each do |token_valid_for|
95     test "validate #{token_valid_for}-salted token for remote cluster zbbbb" do
96       salted_token = salt_token(fixture: :active, remote: token_valid_for)
97       get '/arvados/v1/users/current', {format: 'json', remote: 'zbbbb'}, {
98             "HTTP_AUTHORIZATION" => "Bearer #{salted_token}"
99           }
100       if token_valid_for == 'zbbbb'
101         assert_response 200
102         assert_equal(users(:active).uuid, json_response['uuid'])
103       else
104         assert_response 401
105       end
106     end
107   end
108 end