Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 13a89c4

Browse files
committed
Add --user flag to "secrets" and "envs"
1 parent 3dc2d89 commit 13a89c4

File tree

14 files changed

+133
-88
lines changed

14 files changed

+133
-88
lines changed

cmd/coder/auth.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import (
1111
)
1212

1313
// requireAuth exits the process with a nonzero exit code if the user is not authenticated to make requests
14-
func requireAuth() *entclient.Client {
15-
client, err := newClient()
14+
func requireAuth(user string) *entclient.Client {
15+
client, err := newClient(user)
1616
if err != nil {
1717
flog.Fatal("%v", err)
1818
}
1919
return client
2020
}
2121

22-
func newClient() (*entclient.Client, error) {
22+
func newClient(userFlag string) (*entclient.Client, error) {
2323
sessionToken, err := config.Session.Read()
2424
if err != nil {
2525
return nil, xerrors.Errorf("read session: %v (did you run coder login?)", err)
@@ -35,8 +35,19 @@ func newClient() (*entclient.Client, error) {
3535
return nil, xerrors.Errorf("url misformatted: %v (try runing coder login)", err)
3636
}
3737

38-
return &entclient.Client{
38+
client := &entclient.Client{
3939
BaseURL: u,
4040
Token: sessionToken,
41-
}, nil
41+
UserID: entclient.Me,
42+
}
43+
44+
user, err := client.UserByEmail(userFlag)
45+
if err != nil {
46+
return nil, xerrors.Errorf("failed to find user (%v) by email: %v", userFlag, err)
47+
}
48+
49+
// perform all additional actions as this user
50+
client.UserID = user.ID
51+
52+
return client, nil
4253
}

cmd/coder/ceapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ outer:
2828

2929
// getEnvs returns all environments for the user.
3030
func getEnvs(client *entclient.Client) ([]entclient.Environment, error) {
31-
me, err := client.Me()
31+
me, err := client.TargetUser()
3232
if err != nil {
3333
return nil, xerrors.Errorf("get self: %+v", err)
3434
}

cmd/coder/configssh.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ func configSSH(filepath *string, remove *bool) func(cmd *cobra.Command, _ []stri
7676
return nil
7777
}
7878

79-
entClient := requireAuth()
79+
entClient := requireAuth(entclient.Me)
8080

8181
sshAvailable := isSSHAvailable(ctx)
8282
if !sshAvailable {
8383
return xerrors.New("SSH is disabled or not available for your Coder Enterprise deployment.")
8484
}
8585

86-
me, err := entClient.Me()
86+
me, err := entClient.TargetUser()
8787
if err != nil {
8888
return xerrors.Errorf("fetch username: %w", err)
8989
}

cmd/coder/envs.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,28 @@ import (
44
"encoding/json"
55
"os"
66

7+
"cdr.dev/coder-cli/internal/entclient"
78
"cdr.dev/coder-cli/internal/x/xtabwriter"
89
"github.com/spf13/cobra"
910
"golang.org/x/xerrors"
1011
)
1112

1213
func makeEnvsCommand() *cobra.Command {
1314
var outputFmt string
15+
var user string
1416
cmd := &cobra.Command{
1517
Use: "envs",
1618
Short: "Interact with Coder environments",
1719
Long: "Perform operations on the Coder environments owned by the active user.",
1820
}
21+
cmd.PersistentFlags().StringVar(&user, "user",entclient.Me, "Specify the user whose resources to target")
1922

2023
lsCmd := &cobra.Command{
2124
Use: "ls",
2225
Short: "list all environments owned by the active user",
2326
Long: "List all Coder environments owned by the active user.",
2427
RunE: func(cmd *cobra.Command, args []string) error {
25-
entClient := requireAuth()
28+
entClient := requireAuth(user)
2629
envs, err := getEnvs(entClient)
2730
if err != nil {
2831
return err

cmd/coder/secrets.go

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,39 @@ import (
1515
)
1616

1717
func makeSecretsCmd() *cobra.Command {
18+
var user string
1819
cmd := &cobra.Command{
1920
Use: "secrets",
2021
Short: "Interact with Coder Secrets",
2122
Long: "Interact with secrets objects owned by the active user.",
2223
}
24+
cmd.PersistentFlags().StringVar(&user, "user", entclient.Me, "Specify the user whose resources to target")
2325
cmd.AddCommand(
2426
&cobra.Command{
2527
Use: "ls",
2628
Short: "List all secrets owned by the active user",
27-
RunE: listSecrets,
29+
RunE: listSecrets(&user),
2830
},
29-
makeCreateSecret(),
31+
makeCreateSecret(&user),
3032
&cobra.Command{
3133
Use: "rm [...secret_name]",
3234
Short: "Remove one or more secrets by name",
3335
Args: cobra.MinimumNArgs(1),
34-
RunE: removeSecrets,
36+
RunE: makeRemoveSecrets(&user),
3537
Example: "coder secrets rm mysql-password mysql-user",
3638
},
3739
&cobra.Command{
3840
Use: "view [secret_name]",
3941
Short: "View a secret by name",
4042
Args: cobra.ExactArgs(1),
41-
RunE: viewSecret,
43+
RunE: makeViewSecret(&user),
4244
Example: "coder secrets view mysql-password",
4345
},
4446
)
4547
return cmd
4648
}
4749

48-
func makeCreateSecret() *cobra.Command {
50+
func makeCreateSecret(user *string) *cobra.Command {
4951
var (
5052
fromFile string
5153
fromLiteral string
@@ -77,7 +79,7 @@ coder secrets create aws-credentials --from-file ./credentials.json`,
7779
},
7880
RunE: func(cmd *cobra.Command, args []string) error {
7981
var (
80-
client = requireAuth()
82+
client = requireAuth(*user)
8183
name = args[0]
8284
value string
8385
err error
@@ -127,71 +129,78 @@ coder secrets create aws-credentials --from-file ./credentials.json`,
127129
return cmd
128130
}
129131

130-
func listSecrets(cmd *cobra.Command, _ []string) error {
131-
client := requireAuth()
132+
func listSecrets(user *string) func(cmd *cobra.Command, _ []string) error {
133+
return func(cmd *cobra.Command, _ []string) error {
134+
client := requireAuth(*user)
132135

133-
secrets, err := client.Secrets()
134-
if err != nil {
135-
return xerrors.Errorf("get secrets: %w", err)
136-
}
136+
secrets, err := client.Secrets()
137+
if err != nil {
138+
return xerrors.Errorf("get secrets: %w", err)
139+
}
137140

138-
if len(secrets) < 1 {
139-
flog.Info("No secrets found")
140-
return nil
141-
}
141+
if len(secrets) < 1 {
142+
flog.Info("No secrets found")
143+
return nil
144+
}
142145

143-
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
144-
s := secrets[i]
145-
s.Value = "******" // value is omitted from bulk responses
146-
return s
147-
})
148-
if err != nil {
149-
return xerrors.Errorf("write table of secrets: %w", err)
146+
err = xtabwriter.WriteTable(len(secrets), func(i int) interface{} {
147+
s := secrets[i]
148+
s.Value = "******" // value is omitted from bulk responses
149+
return s
150+
})
151+
if err != nil {
152+
return xerrors.Errorf("write table of secrets: %w", err)
153+
}
154+
return nil
150155
}
151-
return nil
152156
}
153157

154-
func viewSecret(_ *cobra.Command, args []string) error {
155-
var (
156-
client = requireAuth()
157-
name = args[0]
158-
)
159-
if name == "" {
160-
return xerrors.New("[name] is a required argument")
161-
}
158+
func makeViewSecret(user *string) func(cmd *cobra.Command, args []string) error {
159+
return func (_ *cobra.Command, args []string) error {
160+
var (
161+
client = requireAuth(*user)
162+
name = args[0]
163+
)
164+
if name == "" {
165+
return xerrors.New("[name] is a required argument")
166+
}
162167

163-
secret, err := client.SecretByName(name)
164-
if err != nil {
165-
return xerrors.Errorf("get secret by name: %w", err)
166-
}
168+
secret, err := client.SecretByName(name)
169+
if err != nil {
170+
return xerrors.Errorf("get secret by name: %w", err)
171+
}
167172

168-
_, err = fmt.Fprintln(os.Stdout, secret.Value)
169-
if err != nil {
170-
return xerrors.Errorf("write secret value: %w", err)
171-
}
172-
return nil
173+
_, err = fmt.Fprintln(os.Stdout, secret.Value)
174+
if err != nil {
175+
return xerrors.Errorf("write secret value: %w", err)
176+
}
177+
return nil
178+
}
173179
}
174180

175-
func removeSecrets(_ *cobra.Command, args []string) error {
176-
var (
177-
client = requireAuth()
178-
)
179-
if len(args) < 1 {
180-
return xerrors.New("[...secret_name] is a required argument")
181-
}
181+
func makeRemoveSecrets(user *string) func(c *cobra.Command, args []string) error {
182+
return func (_ *cobra.Command, args []string) error {
183+
var (
184+
client = requireAuth(*user)
185+
)
186+
if len(args) < 1 {
187+
return xerrors.New("[...secret_name] is a required argument")
188+
}
182189

183-
errorSeen := false
184-
for _, n := range args {
185-
err := client.DeleteSecretByName(n)
186-
if err != nil {
187-
flog.Error("failed to delete secret %q: %v", n, err)
188-
errorSeen = true
189-
} else {
190-
flog.Success("successfully deleted secret %q", n)
190+
errorSeen := false
191+
for _, n := range args {
192+
err := client.DeleteSecretByName(n)
193+
if err != nil {
194+
flog.Error("failed to delete secret %q: %v", n, err)
195+
errorSeen = true
196+
} else {
197+
flog.Success("successfully deleted secret %q", n)
198+
}
191199
}
200+
if errorSeen {
201+
os.Exit(1)
202+
}
203+
return nil
192204
}
193-
if errorSeen {
194-
os.Exit(1)
195-
}
196-
return nil
197205
}
206+

cmd/coder/shell.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
"cdr.dev/coder-cli/internal/activity"
11+
"cdr.dev/coder-cli/internal/entclient"
1112
"cdr.dev/coder-cli/internal/x/xterminal"
1213
"cdr.dev/wsep"
1314
"github.com/spf13/cobra"
@@ -94,7 +95,7 @@ func sendResizeEvents(ctx context.Context, termfd uintptr, process wsep.Process)
9495

9596
func runCommand(ctx context.Context, envName string, command string, args []string) error {
9697
var (
97-
entClient = requireAuth()
98+
entClient = requireAuth(entclient.Me)
9899
)
99100
env, err := findEnv(entClient, envName)
100101
if err != nil {

cmd/coder/sync.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"path/filepath"
99
"strings"
1010

11+
"cdr.dev/coder-cli/internal/entclient"
1112
"cdr.dev/coder-cli/internal/sync"
1213
"github.com/spf13/cobra"
1314
"golang.org/x/xerrors"
@@ -51,7 +52,7 @@ func makeRunSync(init *bool) func(cmd *cobra.Command, args []string) error {
5152
remote = args[1]
5253
)
5354

54-
entClient := requireAuth()
55+
entClient := requireAuth(entclient.Me)
5556

5657
info, err := os.Stat(local)
5758
if err != nil {

cmd/coder/urls.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strconv"
1010
"strings"
1111

12+
"cdr.dev/coder-cli/internal/entclient"
1213
"cdr.dev/coder-cli/internal/x/xtabwriter"
1314
"github.com/spf13/cobra"
1415
"golang.org/x/xerrors"
@@ -147,7 +148,7 @@ func makeCreateDevURL() *cobra.Command {
147148
if urlname != "" && !devURLNameValidRx.MatchString(urlname) {
148149
return xerrors.New("update devurl: name must be < 64 chars in length, begin with a letter and only contain letters or digits.")
149150
}
150-
entClient := requireAuth()
151+
entClient := requireAuth(entclient.Me)
151152

152153
env, err := findEnv(entClient, envName)
153154
if err != nil {
@@ -213,7 +214,7 @@ func removeDevURL(cmd *cobra.Command, args []string) error {
213214
return xerrors.Errorf("validate port: %w", err)
214215
}
215216

216-
entClient := requireAuth()
217+
entClient := requireAuth(entclient.Me)
217218
env, err := findEnv(entClient, envName)
218219
if err != nil {
219220
return err
@@ -240,7 +241,7 @@ func removeDevURL(cmd *cobra.Command, args []string) error {
240241

241242
// urlList returns the list of active devURLs from the cemanager.
242243
func urlList(envName string) ([]DevURL, error) {
243-
entClient := requireAuth()
244+
entClient := requireAuth(entclient.Me)
244245
env, err := findEnv(entClient, envName)
245246
if err != nil {
246247
return nil, err

cmd/coder/users.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"os"
66

7+
"cdr.dev/coder-cli/internal/entclient"
78
"cdr.dev/coder-cli/internal/x/xtabwriter"
89
"github.com/spf13/cobra"
910
"golang.org/x/xerrors"
@@ -31,7 +32,7 @@ coder users ls -o json | jq .[] | jq -r .email`,
3132

3233
func listUsers(outputFmt *string) func(cmd *cobra.Command, args []string) error {
3334
return func(cmd *cobra.Command, args []string) error {
34-
entClient := requireAuth()
35+
entClient := requireAuth(entclient.Me)
3536

3637
users, err := entClient.Users()
3738
if err != nil {

internal/entclient/client.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ import (
66
"net/url"
77
)
88

9+
// Me is the route param to access resources of the authenticated user
10+
const Me = "me"
11+
912
// Client wraps the Coder HTTP API
1013
type Client struct {
1114
BaseURL *url.URL
1215
Token string
16+
UserID string
1317
}
1418

1519
func (c Client) copyURL() *url.URL {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy