16159: Attempts to expire the user's token getting it from the context. (WIP)
[arvados.git] / lib / controller / localdb / logout.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package localdb
6
7 import (
8         "context"
9         "errors"
10         "fmt"
11         "strings"
12
13         "git.arvados.org/arvados.git/lib/ctrlctx"
14         "git.arvados.org/arvados.git/sdk/go/auth"
15 )
16
17 func (conn *Conn) ExpireAPIClientAuthorization(ctx context.Context) error {
18         creds, ok := auth.FromContext(ctx)
19
20         if !ok {
21                 return errors.New("credentials not found from context")
22         }
23
24         if len(creds.Tokens) < 1 {
25                 return errors.New("no tokens found to expire")
26         }
27
28         token := creds.Tokens[0]
29         tokensecret := token
30         if strings.Contains(token, "/") {
31                 tokenparts := strings.Split(token, "/")
32                 if len(tokenparts) >= 3 {
33                         tokensecret = tokenparts[2]
34                 }
35         }
36
37         tx, err := ctrlctx.CurrentTx(ctx)
38         if err != nil {
39                 return err
40         }
41
42         res, err := tx.ExecContext(ctx, "UPDATE api_client_authorizations SET expires_at=current_timestamp WHERE api_token=$1", tokensecret)
43         if err != nil {
44                 return err
45         }
46
47         rows, err := res.RowsAffected()
48         if err != nil {
49                 return err
50         }
51         if rows != 1 {
52                 return fmt.Errorf("token expiration affected rows: %d -  token: %s", rows, token)
53         }
54
55         return nil
56 }