-
Notifications
You must be signed in to change notification settings - Fork 385
/
cmd_access_setup.go
122 lines (100 loc) · 2.8 KB
/
cmd_access_setup.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
// Copyright (C) 2022 Storj Labs, Inc.
// See LICENSE for copying information.
package main
import (
"context"
"fmt"
"strings"
"github.com/zeebo/clingy"
"github.com/zeebo/errs"
"storj.io/storj/cmd/uplink/ulext"
"storj.io/uplink"
)
type cmdAccessSetup struct {
ex ulext.External
am accessMaker
authService string
}
func newCmdAccessSetup(ex ulext.External) *cmdAccessSetup {
return &cmdAccessSetup{
ex: ex,
am: accessMaker{
ex: ex,
use: true,
},
}
}
func (c *cmdAccessSetup) Setup(params clingy.Parameters) {
c.authService = params.Flag("auth-service", "If generating backwards-compatible S3 Gateway credentials, use this auth service", "https://auth.storjshare.io").(string)
c.am.Setup(params, c.ex)
}
func (c *cmdAccessSetup) Execute(ctx context.Context) (err error) {
defer mon.Task()(&ctx)(&err)
name, err := c.ex.PromptInput(ctx, "Enter name to import as [default: main]:")
if err != nil {
return errs.Wrap(err)
}
if name == "" {
name = "main"
}
keyOrGrant, err := c.ex.PromptInput(ctx, "Enter API key or Access grant:")
if err != nil {
return errs.Wrap(err)
}
if keyOrGrant == "" {
return errs.New("API key cannot be empty.")
}
access, err := uplink.ParseAccess(keyOrGrant)
if err == nil {
_, err := c.am.Execute(ctx, name, access)
if err != nil {
return errs.Wrap(err)
}
} else {
satelliteAddr, err := c.ex.PromptInput(ctx, "Satellite address:")
if err != nil {
return errs.Wrap(err)
}
if satelliteAddr == "" {
return errs.New("Satellite address cannot be empty.")
}
passphrase, err := c.ex.PromptSecret(ctx, "Passphrase:")
if err != nil {
return errs.Wrap(err)
}
if passphrase == "" {
return errs.New("Encryption passphrase cannot be empty.")
}
unencryptedObjectKeys := false
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
}
access, err = c.ex.RequestAccess(ctx, satelliteAddr, keyOrGrant, passphrase, unencryptedObjectKeys)
if err != nil {
return errs.Wrap(err)
}
_, err = c.am.Execute(ctx, name, access)
if err != nil {
return errs.Wrap(err)
}
}
fmt.Fprintf(clingy.Stdout(ctx), "Switched default access to %q\n", name)
answer, err := c.ex.PromptInput(ctx, "Would you like S3 backwards-compatible Gateway credentials? (y/N):")
if err != nil {
return errs.Wrap(err)
}
answer = strings.ToLower(answer)
if answer != "y" && answer != "yes" {
return nil
}
credentials, err := RegisterAccess(ctx, access, c.authService, false, "")
if err != nil {
return errs.Wrap(err)
}
return errs.Wrap(DisplayGatewayCredentials(ctx, *credentials, "", ""))
}