12995: Don't let admins lose admin privs by linking a non-admin account.
[arvados.git] / apps / workbench / test / integration / link_account_test.rb
1 # Copyright (C) The Arvados Authors. All rights reserved.
2 #
3 # SPDX-License-Identifier: AGPL-3.0
4
5 require 'integration_helper'
6 require 'webrick'
7
8 class LinkAccountTest < ActionDispatch::IntegrationTest
9   setup do
10     need_javascript
11   end
12
13   def start_sso_stub token
14     port = available_port('sso_stub')
15
16     s = WEBrick::HTTPServer.new(
17       :Port => port,
18       :BindAddress => 'localhost',
19       :Logger => WEBrick::Log.new('/dev/null', WEBrick::BasicLog::DEBUG),
20       :AccessLog => [nil,nil]
21     )
22
23     s.mount_proc("/login"){|req, res|
24       res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect, req.query["return_to"] + "&api_token=#{token}")
25       s.shutdown
26     }
27
28     Thread.new do
29       s.start
30     end
31
32     "http://localhost:#{port}/"
33   end
34
35   test "Add another login to this account" do
36     visit page_with_token('active_trustedclient')
37     stub = start_sso_stub(api_fixture('api_client_authorizations')['project_viewer_trustedclient']['api_token'])
38     Rails.configuration.arvados_login_base = stub + "login"
39
40     find("#notifications-menu").click
41     assert_text "active-user@arvados.local"
42
43     find("a", text: "Link account").click
44     find("button", text: "Add another login to this account").click
45
46     find("#notifications-menu").click
47     assert_text "project-viewer@arvados.local"
48
49     find("button", text: "Link accounts").click
50
51     find("#notifications-menu").click
52     assert_text "active-user@arvados.local"
53   end
54
55   test "Use this login to access another account" do
56     visit page_with_token('project_viewer_trustedclient')
57     stub = start_sso_stub(api_fixture('api_client_authorizations')['active_trustedclient']['api_token'])
58     Rails.configuration.arvados_login_base = stub + "login"
59
60     find("#notifications-menu").click
61     assert_text "project-viewer@arvados.local"
62
63     find("a", text: "Link account").click
64     find("button", text: "Use this login to access another account").click
65
66     find("#notifications-menu").click
67     assert_text "active-user@arvados.local"
68
69     find("button", text: "Link accounts").click
70
71     find("#notifications-menu").click
72     assert_text "active-user@arvados.local"
73   end
74
75   test "Link login of inactive user to this account" do
76     visit page_with_token('active_trustedclient')
77     stub = start_sso_stub(api_fixture('api_client_authorizations')['inactive_uninvited_trustedclient']['api_token'])
78     Rails.configuration.arvados_login_base = stub + "login"
79
80     find("#notifications-menu").click
81     assert_text "active-user@arvados.local"
82
83     find("a", text: "Link account").click
84     find("button", text: "Add another login to this account").click
85
86     find("#notifications-menu").click
87     assert_text "inactive-uninvited-user@arvados.local"
88
89     find("button", text: "Link accounts").click
90
91     find("#notifications-menu").click
92     assert_text "active-user@arvados.local"
93   end
94
95   test "Cannot link to inactive user" do
96     visit page_with_token('active_trustedclient')
97     stub = start_sso_stub(api_fixture('api_client_authorizations')['inactive_uninvited_trustedclient']['api_token'])
98     Rails.configuration.arvados_login_base = stub + "login"
99
100     find("#notifications-menu").click
101     assert_text "active-user@arvados.local"
102
103     find("a", text: "Link account").click
104     find("button", text: "Use this login to access another account").click
105
106     find("#notifications-menu").click
107     assert_text "inactive-uninvited-user@arvados.local"
108
109     assert_text "Cannot link active-user@arvados.local"
110
111     assert find("#link-account-submit")['disabled']
112
113     find("button", text: "Cancel").click
114
115     find("#notifications-menu").click
116     assert_text "active-user@arvados.local"
117   end
118
119   test "Inactive user can link to active account" do
120     visit page_with_token('inactive_uninvited_trustedclient')
121     stub = start_sso_stub(api_fixture('api_client_authorizations')['active_trustedclient']['api_token'])
122     Rails.configuration.arvados_login_base = stub + "login"
123
124     find("#notifications-menu").click
125     assert_text "inactive-uninvited-user@arvados.local"
126
127     assert_text "Already have an account with a different login?"
128
129     find("a", text: "Link this login to your existing account").click
130
131     assert_no_text "Add another login to this account"
132
133     find("button", text: "Use this login to access another account").click
134
135     find("#notifications-menu").click
136     assert_text "active-user@arvados.local"
137
138     find("button", text: "Link accounts").click
139
140     find("#notifications-menu").click
141     assert_text "active-user@arvados.local"
142   end
143
144   test "Admin cannot link to non-admin" do
145     visit page_with_token('admin_trustedclient')
146     stub = start_sso_stub(api_fixture('api_client_authorizations')['active_trustedclient']['api_token'])
147     Rails.configuration.arvados_login_base = stub + "login"
148
149     find("#notifications-menu").click
150     assert_text "admin@arvados.local"
151
152     find("a", text: "Link account").click
153     find("button", text: "Use this login to access another account").click
154
155     find("#notifications-menu").click
156     assert_text "active-user@arvados.local"
157
158     assert_text "Cannot link admin account admin@arvados.local"
159
160     assert find("#link-account-submit")['disabled']
161
162     find("button", text: "Cancel").click
163
164     find("#notifications-menu").click
165     assert_text "admin@arvados.local"
166   end
167
168 end