-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathauth_var.go
More file actions
99 lines (84 loc) · 1.9 KB
/
auth_var.go
File metadata and controls
99 lines (84 loc) · 1.9 KB
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
package goflags
import (
"fmt"
"os"
"golang.org/x/term"
)
// AuthVar handles authentication tokens with support for:
// - Direct value: -auth TOKEN
// - Interactive prompt: -auth (prompts for masked input)
// - Environment variable fallback
type AuthVar struct {
field *string
envKey string
}
func (a *AuthVar) Set(value string) error {
if isBoolLikeValue(value) {
token, err := promptForToken()
if err != nil {
return err
}
*a.field = token
} else {
*a.field = value
}
if a.envKey != "" && *a.field != "" {
os.Setenv(a.envKey, *a.field)
}
return nil
}
func (a *AuthVar) IsBoolFlag() bool {
return true
}
func (a *AuthVar) String() string {
if a.field == nil {
return ""
}
return *a.field
}
func isBoolLikeValue(value string) bool {
switch value {
case "true", "TRUE", "True", "t", "T", "1":
return true
}
return false
}
func promptForToken() (string, error) {
fmt.Print("Enter authentication token: ")
token, err := term.ReadPassword(int(os.Stdin.Fd()))
fmt.Println()
if err != nil {
return "", fmt.Errorf("failed to read token: %w", err)
}
return string(token), nil
}
func (flagSet *FlagSet) AuthVar(field *string, long, envKey, usage string) *FlagData {
return flagSet.AuthVarP(field, long, "", envKey, usage)
}
func (flagSet *FlagSet) AuthVarP(field *string, long, short, envKey, usage string) *FlagData {
if field == nil {
panic(fmt.Errorf("field cannot be nil for flag -%v", long))
}
if envKey != "" {
if envValue := os.Getenv(envKey); envValue != "" {
*field = envValue
}
}
authVar := &AuthVar{
field: field,
envKey: envKey,
}
flagData := &FlagData{
usage: usage,
long: long,
defaultValue: "",
}
if short != "" {
flagData.short = short
flagSet.CommandLine.Var(authVar, short, usage)
flagSet.flagKeys.Set(short, flagData)
}
flagSet.CommandLine.Var(authVar, long, usage)
flagSet.flagKeys.Set(long, flagData)
return flagData
}