This repository has been archived by the owner on Nov 10, 2023. It is now read-only.
/
auth.go
124 lines (106 loc) · 3.23 KB
/
auth.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
package source
import (
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"os/user"
log "github.com/Sirupsen/logrus"
)
type novaConfigScheme struct {
NovaURL string `json:"NOVA_URL"`
NovaID string `json:"NOVA_CLIENT_ID"`
NovaSecret string `json:"NOVA_CLIENT_SECRET"`
}
type configFile struct {
Nova []novaConfigScheme
}
func GetBasicAuthHeader(clientID, clientSecret string) string {
return "Basic " + base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", clientID, clientSecret)))
}
func GetCredentials(novaUrl string) (clientID, clientSecret string, err error) {
errNotFound := fmt.Errorf("couldn't find credentials in ENV[NOVA_CLIENT_ID], ENV[NOVA_CLIENT_SECRET] or in config file")
// env takes precedence over file vars
clientID = os.Getenv("NOVA_CLIENT_ID")
clientSecret = os.Getenv("NOVA_CLIENT_SECRET")
if clientID != "" && clientSecret != "" {
return
}
// try file vars if env is empty
rawFile, err := ioutil.ReadFile(getConfigFilePath())
if err != nil {
log.Errorf("Error reading %s: %+v", getConfigFilePath(), err)
err = errNotFound
return
}
novaConfig := configFile{}
json.Unmarshal(rawFile, &novaConfig)
for _, nc := range novaConfig.Nova {
if nc.NovaURL == novaUrl {
clientID, clientSecret = nc.NovaID, nc.NovaSecret
}
}
if clientID != "" && clientSecret != "" {
return
}
log.Errorf("couldn't find %s in %s", novaUrl, getConfigFilePath())
err = errNotFound
return
}
func SaveCredentials(novaUrl string) (clientID, clientSecret string, err error) {
var n int
currentConfig := configFile{}
rawFile, _ := ioutil.ReadFile(getConfigFilePath())
if rawFile != nil {
json.Unmarshal(rawFile, ¤tConfig)
for _, nc := range currentConfig.Nova {
if nc.NovaURL == novaUrl {
err = fmt.Errorf("%s already contains an entry for %s. Please modify the file by hand to update keys.",
getConfigFilePath(), novaUrl)
return
}
}
}
fmt.Println("You can get your splunknova client credentials at https://www.splunknova.com/apikeys\n")
fmt.Printf("Please enter Client ID: ")
n, err = fmt.Scan(&clientID)
if n != 1 || err != nil {
err = fmt.Errorf("error reading Client ID %+v", err)
return
}
fmt.Printf("Please enter Client Secret: ")
n, err = fmt.Scan(&clientSecret)
if n != 1 || err != nil {
err = fmt.Errorf("error reading Client Secret %+v", err)
return
}
err = validateCredentials(novaUrl, clientID, clientSecret)
if err != nil {
return
}
log.Infof("Login succeeded")
currentConfig.Nova = append(currentConfig.Nova, novaConfigScheme{novaUrl, clientID, clientSecret})
data, err := json.MarshalIndent(currentConfig, "", " ")
if err != nil {
return
}
err = ioutil.WriteFile(getConfigFilePath(), data, 0644)
if err != nil {
log.Infof("Keys saved to %s", getConfigFilePath())
}
return
}
func validateCredentials(novaUrl, clientID, clientSecret string) error {
authHeader := "Basic " + base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", clientID, clientSecret)))
_, err := Get(novaUrl+validateCredsURLPath, nil, authHeader)
if err != nil {
return fmt.Errorf("credentials didn't work, please try again or contact us")
}
return nil
}
func getConfigFilePath() string {
usr, _ := user.Current()
dir := usr.HomeDir
return dir + configFileRelPath
}