-
Notifications
You must be signed in to change notification settings - Fork 397
/
cmd_access_create.go
134 lines (110 loc) · 3.4 KB
/
cmd_access_create.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright (C) 2021 Storj Labs, Inc.
// See LICENSE for copying information.
package main
import (
"context"
"fmt"
"io"
"strconv"
"strings"
"github.com/zeebo/clingy"
"github.com/zeebo/errs"
"storj.io/storj/cmd/uplink/ulext"
)
type cmdAccessCreate struct {
ex ulext.External
am accessMaker
passphraseStdin bool
satelliteAddr string
apiKey string
importAs string
exportTo string
unencryptedObjectKeys *bool
}
func newCmdAccessCreate(ex ulext.External) *cmdAccessCreate {
return &cmdAccessCreate{ex: ex}
}
func (c *cmdAccessCreate) Setup(params clingy.Parameters) {
c.passphraseStdin = params.Flag("passphrase-stdin", "If set, the passphrase is read from stdin, and all other values must be provided.", false,
clingy.Transform(strconv.ParseBool),
clingy.Boolean,
).(bool)
c.satelliteAddr = params.Flag("satellite-address", "Satellite address from satellite UI (prompted if unspecified)", "").(string)
c.apiKey = params.Flag("api-key", "API key from satellite UI (prompted if unspecified)", "").(string)
c.importAs = params.Flag("import-as", "Import the access as this name", "").(string)
c.exportTo = params.Flag("export-to", "Export the access to this file path", "").(string)
c.unencryptedObjectKeys = params.Flag("unencrypted-object-keys", "If set, the created access grant won't encrypt object keys", nil,
clingy.Transform(strconv.ParseBool), clingy.Boolean, clingy.Optional,
).(*bool)
params.Break()
c.am.Setup(params, c.ex)
}
func (c *cmdAccessCreate) Execute(ctx context.Context) (err error) {
if c.satelliteAddr == "" {
if c.passphraseStdin {
return errs.New("Must specify the satellite address as a flag when passphrase-stdin is set.")
}
c.satelliteAddr, err = c.ex.PromptInput(ctx, "Satellite address:")
if err != nil {
return errs.Wrap(err)
}
}
if c.apiKey == "" {
if c.passphraseStdin {
return errs.New("Must specify the api key as a flag when passphrase-stdin is set.")
}
c.apiKey, err = c.ex.PromptInput(ctx, "API key:")
if err != nil {
return errs.Wrap(err)
}
}
unencryptedObjectKeys := false
if c.unencryptedObjectKeys != nil {
unencryptedObjectKeys = *c.unencryptedObjectKeys
} else if !c.passphraseStdin {
answer, err := c.ex.PromptInput(ctx, "Would you like to disable encryption for object keys (allows lexicographical sorting of objects in listings)? (y/N):")
if err != nil {
return errs.Wrap(err)
}
answer = strings.ToLower(answer)
if answer == "y" || answer == "yes" {
unencryptedObjectKeys = true
}
}
var passphrase string
if c.passphraseStdin {
stdinData, err := io.ReadAll(clingy.Stdin(ctx))
if err != nil {
return errs.Wrap(err)
}
passphrase = strings.TrimRight(string(stdinData), "\r\n")
} else {
passphrase, err = c.ex.PromptSecret(ctx, "Passphrase:")
if err != nil {
return errs.Wrap(err)
}
}
if passphrase == "" {
return errs.New("Encryption passphrase must be non-empty")
}
access, err := c.ex.RequestAccess(ctx, c.satelliteAddr, c.apiKey, passphrase, unencryptedObjectKeys)
if err != nil {
return errs.Wrap(err)
}
access, err = c.am.Execute(ctx, c.importAs, access)
if err != nil {
return errs.Wrap(err)
}
if c.exportTo != "" {
return c.ex.ExportAccess(ctx, access, c.exportTo)
}
if c.importAs != "" {
return nil
}
serialized, err := access.Serialize()
if err != nil {
return errs.Wrap(err)
}
fmt.Fprintln(clingy.Stdout(ctx), serialized)
return nil
}