1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.arvados.org/arvados.git/lib/controller/rpc"
14 "git.arvados.org/arvados.git/sdk/go/arvados"
15 "git.arvados.org/arvados.git/sdk/go/ctxlog"
16 "github.com/sirupsen/logrus"
19 type testLoginController struct {
20 Cluster *arvados.Cluster
24 func (ctrl *testLoginController) Logout(ctx context.Context, opts arvados.LogoutOptions) (arvados.LogoutResponse, error) {
25 err := ctrl.Parent.ExpireAPIClientAuthorization(ctx)
27 return arvados.LogoutResponse{}, err
29 return noopLogout(ctrl.Cluster, opts)
32 func (ctrl *testLoginController) Login(ctx context.Context, opts arvados.LoginOptions) (arvados.LoginResponse, error) {
33 tmpl, err := template.New("form").Parse(loginform)
35 return arvados.LoginResponse{}, err
38 err = tmpl.Execute(&buf, opts)
40 return arvados.LoginResponse{}, err
42 return arvados.LoginResponse{HTML: buf}, nil
45 func (ctrl *testLoginController) UserAuthenticate(ctx context.Context, opts arvados.UserAuthenticateOptions) (arvados.APIClientAuthorization, error) {
46 for username, user := range ctrl.Cluster.Login.Test.Users {
47 if (opts.Username == username || opts.Username == user.Email) && opts.Password == user.Password {
48 ctxlog.FromContext(ctx).WithFields(logrus.Fields{
51 }).Debug("test authentication succeeded")
52 return ctrl.Parent.CreateAPIClientAuthorization(ctx, ctrl.Cluster.SystemRootToken, rpc.UserSessionAuthInfo{
58 return arvados.APIClientAuthorization{}, fmt.Errorf("authentication failed for user %q with password len=%d", opts.Username, len(opts.Password))
64 <head><title>Arvados test login</title>
66 async function authenticate(event) {
67 event.preventDefault()
68 document.getElementById('error').innerHTML = ''
69 const resp = await fetch('/arvados/v1/users/authenticate', {
72 headers: {'Content-Type': 'application/json'},
73 body: JSON.stringify({
74 username: document.getElementById('username').value,
75 password: document.getElementById('password').value,
79 document.getElementById('error').innerHTML = '<p>Authentication failed.</p><p>The "test login" users are defined in Clusters.[ClusterID].Login.Test.Users section of config.yml</p><p>If you are using arvbox, use "arvbox adduser" to add users.</p>'
82 var redir = document.getElementById('return_to').value
83 if (redir.indexOf('?') > 0) {
88 const respj = await resp.json()
89 document.location = redir + "api_token=v2/" + respj.uuid + "/" + respj.api_token
94 <h3>Arvados test login</h3>
96 <input id="return_to" type="hidden" name="return_to" value="{{.ReturnTo}}">
97 username <input id="username" type="text" name="username" autofocus size=16>
98 password <input id="password" type="password" name="password" size=16>
99 <input type="submit" value="Log in">
105 document.getElementsByTagName('form')[0].onsubmit = authenticate