18681: Fix typo
[arvados.git] / lib / controller / localdb / collection.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         "time"
10
11         "git.arvados.org/arvados.git/sdk/go/arvados"
12         "git.arvados.org/arvados.git/sdk/go/auth"
13 )
14
15 // CollectionGet defers to railsProxy for everything except blob
16 // signatures.
17 func (conn *Conn) CollectionGet(ctx context.Context, opts arvados.GetOptions) (arvados.Collection, error) {
18         if len(opts.Select) > 0 {
19                 // We need to know IsTrashed and TrashAt to implement
20                 // signing properly, even if the caller doesn't want
21                 // them.
22                 opts.Select = append([]string{"is_trashed", "trash_at"}, opts.Select...)
23         }
24         resp, err := conn.railsProxy.CollectionGet(ctx, opts)
25         if err != nil {
26                 return resp, err
27         }
28         conn.signCollection(ctx, &resp)
29         return resp, nil
30 }
31
32 // CollectionList defers to railsProxy for everything except blob
33 // signatures.
34 func (conn *Conn) CollectionList(ctx context.Context, opts arvados.ListOptions) (arvados.CollectionList, error) {
35         if len(opts.Select) > 0 {
36                 // We need to know IsTrashed and TrashAt to implement
37                 // signing properly, even if the caller doesn't want
38                 // them.
39                 opts.Select = append([]string{"is_trashed", "trash_at"}, opts.Select...)
40         }
41         resp, err := conn.railsProxy.CollectionList(ctx, opts)
42         if err != nil {
43                 return resp, err
44         }
45         for i := range resp.Items {
46                 conn.signCollection(ctx, &resp.Items[i])
47         }
48         return resp, nil
49 }
50
51 // CollectionCreate defers to railsProxy for everything except blob
52 // signatures and vocabulary checking.
53 func (conn *Conn) CollectionCreate(ctx context.Context, opts arvados.CreateOptions) (arvados.Collection, error) {
54         err := conn.checkProperties(ctx, opts.Attrs["properties"])
55         if err != nil {
56                 return arvados.Collection{}, err
57         }
58         if len(opts.Select) > 0 {
59                 // We need to know IsTrashed and TrashAt to implement
60                 // signing properly, even if the caller doesn't want
61                 // them.
62                 opts.Select = append([]string{"is_trashed", "trash_at"}, opts.Select...)
63         }
64         resp, err := conn.railsProxy.CollectionCreate(ctx, opts)
65         if err != nil {
66                 return resp, err
67         }
68         conn.signCollection(ctx, &resp)
69         return resp, nil
70 }
71
72 // CollectionUpdate defers to railsProxy for everything except blob
73 // signatures and vocabulary checking.
74 func (conn *Conn) CollectionUpdate(ctx context.Context, opts arvados.UpdateOptions) (arvados.Collection, error) {
75         err := conn.checkProperties(ctx, opts.Attrs["properties"])
76         if err != nil {
77                 return arvados.Collection{}, err
78         }
79         if len(opts.Select) > 0 {
80                 // We need to know IsTrashed and TrashAt to implement
81                 // signing properly, even if the caller doesn't want
82                 // them.
83                 opts.Select = append([]string{"is_trashed", "trash_at"}, opts.Select...)
84         }
85         resp, err := conn.railsProxy.CollectionUpdate(ctx, opts)
86         if err != nil {
87                 return resp, err
88         }
89         conn.signCollection(ctx, &resp)
90         return resp, nil
91 }
92
93 func (conn *Conn) signCollection(ctx context.Context, coll *arvados.Collection) {
94         if coll.IsTrashed || coll.ManifestText == "" || !conn.cluster.Collections.BlobSigning {
95                 return
96         }
97         var token string
98         if creds, ok := auth.FromContext(ctx); ok && len(creds.Tokens) > 0 {
99                 token = creds.Tokens[0]
100         }
101         if token == "" {
102                 return
103         }
104         ttl := conn.cluster.Collections.BlobSigningTTL.Duration()
105         exp := time.Now().Add(ttl)
106         if coll.TrashAt != nil && !coll.TrashAt.IsZero() && coll.TrashAt.Before(exp) {
107                 exp = *coll.TrashAt
108         }
109         coll.ManifestText = arvados.SignManifest(coll.ManifestText, token, exp, ttl, []byte(conn.cluster.Collections.BlobSigningKey))
110 }