Skip to content

Commit 842ed9d

Browse files
committed
fix(cli): login will actually work as intended now.
1 parent e9b74de commit 842ed9d

File tree

2 files changed

+201
-119
lines changed

2 files changed

+201
-119
lines changed

cmd/login.go

Lines changed: 188 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ package cmd
99
import (
1010
"encoding/json"
1111
"fmt"
12+
"github.com/Keyfactor/keyfactor-go-client/api"
1213
"github.com/spf13/cobra"
1314
"golang.org/x/crypto/ssh/terminal"
15+
"io"
1416
"log"
1517
"os"
1618
"os/signal"
1719
"strings"
1820
)
1921

20-
const DEFAULT_CONFIG_FILE_NAME = "command_config.json"
22+
const DefaultConfigFileName = "command_config.json"
2123

2224
// loginCmd represents the login command
2325
var loginCmd = &cobra.Command{
@@ -31,145 +33,208 @@ the CLI will default to using the environment variables: KEYFACTOR_HOSTNAME, KEY
3133
KEYFACTOR_PASSWORD and KEYFACTOR_DOMAIN.
3234
`,
3335
Run: func(cmd *cobra.Command, args []string) {
36+
log.SetOutput(io.Discard)
3437
configFile, _ := cmd.Flags().GetString("config")
3538
noPrompt, _ := cmd.Flags().GetBool("no-prompt")
36-
userHomeDir, hErr := os.UserHomeDir()
37-
config := make(map[string]string)
38-
39-
if configFile == "" {
40-
// Set up home directory config
41-
if hErr != nil {
42-
fmt.Println("[ERROR] getting user home directory: ", hErr)
43-
} else {
44-
userHomeDir = fmt.Sprintf("%s/.keyfactor", userHomeDir)
45-
}
46-
_, err := os.Stat(userHomeDir)
47-
48-
if os.IsNotExist(err) {
49-
errDir := os.MkdirAll(userHomeDir, 0700)
50-
if errDir != nil {
51-
fmt.Println("Unable to create login config file. ", errDir)
52-
log.Printf("[ERROR] creating directory: %s", errDir)
53-
}
54-
}
55-
config = loadConfigFile(fmt.Sprintf("%s/%s", userHomeDir, DEFAULT_CONFIG_FILE_NAME), nil)
56-
} else {
57-
// Load config from specified file
58-
config = loadConfigFile(configFile, nil)
59-
return
60-
}
6139

62-
// Get the Keyfactor Command URL
63-
hostName, hostSet := os.LookupEnv("KEYFACTOR_HOSTNAME")
64-
if !hostSet {
65-
log.Println("[INFO] Hostname not set. Please set the KEYFACTOR_HOSTNAME environment variable.")
40+
authenticated := authConfigFile(configFile, noPrompt)
41+
if !authenticated {
42+
fmt.Println("Login failed.")
43+
log.Fatal("Unable to authenticate")
6644
}
67-
var host string
68-
if noPrompt {
69-
fmt.Println("Connecting to Keyfactor Command host: ", hostName)
70-
host = hostName
45+
fmt.Println("Login successful!")
46+
},
47+
}
48+
49+
func init() {
50+
var (
51+
configFile string
52+
noPrompt bool
53+
)
54+
55+
RootCmd.AddCommand(loginCmd)
56+
57+
loginCmd.Flags().StringVarP(&configFile, "config", "c", "", "config file (default is $HOME/.keyfactor/%s)")
58+
loginCmd.Flags().BoolVar(&noPrompt, "no-prompt", false, "Do not prompt for username and password")
59+
}
60+
61+
func authConfigFile(configFile string, noPrompt bool) bool {
62+
config := make(map[string]string)
63+
userHomeDir, hErr := os.UserHomeDir()
64+
if configFile == "" {
65+
// Set up home directory config
66+
if hErr != nil {
67+
fmt.Println("Error getting user home directory: ", hErr)
7168
} else {
72-
fmt.Printf("Enter Keyfactor Command host URL [%s]: \n", hostName)
73-
fmt.Scanln(&host)
74-
if len(host) == 0 {
75-
host = hostName
69+
userHomeDir = fmt.Sprintf("%s/.keyfactor", userHomeDir)
70+
}
71+
_, err := os.Stat(userHomeDir)
72+
73+
if os.IsNotExist(err) {
74+
errDir := os.MkdirAll(userHomeDir, 0700)
75+
if errDir != nil {
76+
fmt.Println("Unable to create login config file. ", errDir)
77+
log.Printf("[ERROR] creating directory: %s", errDir)
7678
}
7779
}
80+
config = loadConfigFile(fmt.Sprintf("%s/%s", userHomeDir, DefaultConfigFileName), nil)
81+
} else {
82+
// Load config from specified file
83+
config = loadConfigFile(configFile, nil)
84+
return true
85+
}
7886

79-
// Get the username
80-
envUserName, userSet := os.LookupEnv("KEYFACTOR_USERNAME")
81-
if !userSet {
82-
fmt.Println("[INFO] Username not set. Please set the KEYFACTOR_USERNAME environment variable.")
87+
// Get the Keyfactor Command URL
88+
envHostName, hostSet := os.LookupEnv("KEYFACTOR_HOSTNAME")
89+
if !hostSet {
90+
log.Println("[INFO] Hostname not set. Please set the KEYFACTOR_HOSTNAME environment variable.")
91+
}
92+
var host string
93+
if noPrompt {
94+
//fmt.Println("Connecting to Keyfactor Command host: ", envHostName)
95+
if len(envHostName) == 0 {
96+
envHostName = config["host"]
8397
}
84-
var username string
85-
if noPrompt {
86-
fmt.Println("Logging in with username: ", envUserName)
87-
username = envUserName
88-
} else {
89-
fmt.Printf("Enter your Keyfactor Command username [%s]: \n", envUserName)
90-
fmt.Scanln(&username)
98+
host = envHostName
99+
} else {
100+
fmt.Printf("Enter Keyfactor Command host URL [%s]: \n", envHostName)
101+
_, phErr := fmt.Scanln(&host)
102+
if phErr != nil {
103+
fmt.Println("Error getting hostname: ", phErr)
104+
log.Fatal("[ERROR] getting hostname: ", phErr)
91105
}
92-
if len(username) == 0 {
93-
username = envUserName
106+
if len(host) == 0 {
107+
host = envHostName
94108
}
95-
os.Setenv("KEYFACTOR_USERNAME", username)
109+
}
110+
ehErr := os.Setenv("KEYFACTOR_HOSTNAME", host)
111+
if ehErr != nil {
112+
fmt.Println("Error setting hostname: ", ehErr)
113+
log.Fatal("[ERROR] setting hostname: ", ehErr)
114+
}
96115

97-
// Get the password.
98-
envPassword, passSet := os.LookupEnv("KEYFACTOR_PASSWORD")
99-
if !passSet {
100-
log.Println("[INFO] Password not set. Please set the KEYFACTOR_PASSWORD environment variable.")
116+
// Get the username
117+
envUserName, userSet := os.LookupEnv("KEYFACTOR_USERNAME")
118+
if !userSet {
119+
log.Println("[INFO] Username not set. Please set the KEYFACTOR_USERNAME environment variable.")
120+
}
121+
var username string
122+
if noPrompt {
123+
if len(envUserName) == 0 {
124+
envUserName = config["username"]
101125
}
102-
var p string
103-
if noPrompt {
104-
p = envPassword
105-
} else {
106-
p = getPassword("password: [<from env KEYFACTOR_PASSWORD>]")
107-
if len(p) == 0 {
108-
p = envPassword
109-
}
126+
username = envUserName
127+
} else {
128+
fmt.Printf("Enter your Keyfactor Command username [%s]: \n", envUserName)
129+
_, puErr := fmt.Scanln(&username)
130+
if puErr != nil {
131+
fmt.Println("Error getting username: ", puErr)
132+
log.Fatal("[ERROR] getting username: ", puErr)
110133
}
111-
os.Setenv("KEYFACTOR_PASSWORD", p)
112-
113-
// Get AD domain if not provided in the username or config file
114-
envDomain, domainSet := os.LookupEnv("KEYFACTOR_DOMAIN")
115-
var domain string
116-
if !domainSet {
117-
if strings.Contains(username, "@") {
118-
envDomain = strings.Split(username, "@")[1]
119-
} else if strings.Contains(username, "\\") {
120-
envDomain = strings.Split(username, "\\")[0]
121-
} else {
122-
log.Println("[INFO] Domain not set. Please set the KEYFACTOR_DOMAIN environment variable.")
123-
}
134+
}
135+
if len(username) == 0 {
136+
if len(envUserName) == 0 {
137+
envUserName = config["username"]
124138
}
125-
if noPrompt {
126-
fmt.Println("Using domain: ", envDomain)
127-
domain = envDomain
128-
} else {
129-
fmt.Printf("Enter your Keyfactor Command AD domain [%s]: \n", envDomain)
130-
fmt.Scanln(&domain)
131-
if len(domain) == 0 {
132-
domain = envDomain
133-
}
139+
username = envUserName
140+
}
141+
euErr := os.Setenv("KEYFACTOR_USERNAME", username)
142+
if euErr != nil {
143+
fmt.Println("Error setting username: ", euErr)
144+
log.Fatal("[ERROR] setting username: ", euErr)
145+
}
146+
147+
// Get the password.
148+
envPassword, passSet := os.LookupEnv("KEYFACTOR_PASSWORD")
149+
if !passSet {
150+
log.Println("[INFO] Password not set. Please set the KEYFACTOR_PASSWORD environment variable.")
151+
}
152+
var p string
153+
if noPrompt {
154+
if len(envPassword) == 0 {
155+
envPassword = config["password"]
156+
}
157+
p = envPassword
158+
} else {
159+
p = getPassword("password: [<from env KEYFACTOR_PASSWORD>]")
160+
if len(p) == 0 {
161+
p = envPassword
134162
}
135-
os.Setenv("KEYFACTOR_DOMAIN", domain)
163+
}
164+
epErr := os.Setenv("KEYFACTOR_PASSWORD", p)
165+
if epErr != nil {
166+
fmt.Println("Error setting password: ", epErr)
167+
log.Fatal("[ERROR] setting password: ", epErr)
168+
}
136169

137-
// Since there's no login command in the API, we'll just try to get the list of CAs
138-
kfClient, kfcErr := initClient()
139-
if kfcErr != nil {
140-
fmt.Println("[ERROR] initializing Keyfactor client: ", kfcErr)
170+
// Get AD domain if not provided in the username or config file
171+
envDomain, domainSet := os.LookupEnv("KEYFACTOR_DOMAIN")
172+
var domain string
173+
if !domainSet {
174+
if strings.Contains(username, "@") {
175+
envDomain = strings.Split(username, "@")[1]
176+
} else if strings.Contains(username, "\\") {
177+
envDomain = strings.Split(username, "\\")[0]
178+
} else {
179+
log.Println("[INFO] Domain not set. Please set the KEYFACTOR_DOMAIN environment variable.")
141180
}
142-
kfClient.GetCAList()
143-
144-
config["host"] = host
145-
config["username"] = username
146-
config["domain"] = domain
147-
config["password"] = p
148-
file, fErr := os.OpenFile(fmt.Sprintf("%s/%s", userHomeDir, DEFAULT_CONFIG_FILE_NAME), os.O_CREATE|os.O_RDWR, 0700)
149-
defer file.Close()
150-
if fErr != nil {
151-
fmt.Println("[ERROR] creating config file: ", fErr)
181+
}
182+
if noPrompt {
183+
//fmt.Println("Using domain: ", envDomain)
184+
if len(envDomain) == 0 {
185+
envDomain = config["domain"]
152186
}
153-
encoder := json.NewEncoder(file)
154-
enErr := encoder.Encode(&config)
155-
if enErr != nil {
156-
fmt.Println("Unable to read config file due to invalid format. ", enErr)
157-
log.Println("[ERROR] encoding config file: ", enErr)
187+
domain = envDomain
188+
} else {
189+
fmt.Printf("Enter your Keyfactor Command AD domain [%s]: \n", envDomain)
190+
_, sdErr := fmt.Scanln(&domain)
191+
if sdErr != nil {
192+
fmt.Println("Error getting domain: ", sdErr)
193+
log.Fatal("[ERROR] getting domain: ", sdErr)
158194
}
159-
fmt.Println("Login successful!")
160-
},
161-
}
162-
163-
func init() {
164-
var (
165-
configFile string
166-
noPrompt bool
167-
)
195+
if len(domain) == 0 {
196+
domain = envDomain
197+
}
198+
}
199+
edErr := os.Setenv("KEYFACTOR_DOMAIN", domain)
200+
if edErr != nil {
201+
fmt.Println("Error setting domain: ", edErr)
202+
log.Fatal("[ERROR] setting domain: ", edErr)
203+
}
168204

169-
RootCmd.AddCommand(loginCmd)
205+
authConfig := api.AuthConfig{
206+
Hostname: host,
207+
Username: username,
208+
Password: p,
209+
Domain: domain,
210+
}
211+
// Since there's no login command in the API, we'll just try to get the list of CAs
212+
kfClient, kfcErr := api.NewKeyfactorClient(&authConfig)
213+
if kfcErr != nil {
214+
log.Println("[ERROR] initializing Keyfactor client: ", kfcErr)
215+
}
216+
_, authErr := kfClient.GetCAList()
217+
if authErr != nil {
218+
fmt.Println("Error authenticating to Keyfactor Command: ", authErr)
219+
log.Fatal("[ERROR] getting CA list: ", authErr)
220+
}
170221

171-
loginCmd.Flags().StringVarP(&configFile, "config", "c", "", "config file (default is $HOME/.keyfactor/%s)")
172-
loginCmd.Flags().BoolVar(&noPrompt, "no-prompt", false, "Do not prompt for username and password")
222+
config["host"] = host
223+
config["username"] = username
224+
config["domain"] = domain
225+
config["password"] = p
226+
f, fErr := os.OpenFile(fmt.Sprintf("%s/%s", userHomeDir, DefaultConfigFileName), os.O_CREATE|os.O_RDWR, 0700)
227+
defer f.Close()
228+
if fErr != nil {
229+
fmt.Println("[ERROR] creating config file: ", fErr)
230+
}
231+
encoder := json.NewEncoder(f)
232+
enErr := encoder.Encode(&config)
233+
if enErr != nil {
234+
fmt.Println("Unable to read config file due to invalid format. ", enErr)
235+
log.Println("[ERROR] encoding config file: ", enErr)
236+
}
237+
return true
173238
}
174239

175240
func getPassword(prompt string) string {
@@ -207,7 +272,11 @@ func loadConfigFile(path string, filter func(map[string]interface{}) bool) map[s
207272

208273
f, _ := os.ReadFile(path)
209274

210-
json.Unmarshal(f, &data)
275+
jErr := json.Unmarshal(f, &data)
276+
if jErr != nil {
277+
//fmt.Println("Unable to read config file due to invalid format. ", jErr)
278+
log.Println("[ERROR] decoding config file: ", jErr)
279+
}
211280

212281
//filteredData := []map[string]interface{}{}
213282

cmd/root.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import (
1010
"fmt"
1111
"github.com/Keyfactor/keyfactor-go-client/api"
1212
"github.com/spf13/cobra"
13+
"io"
1314
"log"
1415
"os"
1516
"time"
1617
)
1718

1819
func initClient() (*api.Client, error) {
20+
log.SetOutput(io.Discard)
1921
var clientAuth api.AuthConfig
2022
clientAuth.Username = os.Getenv("KEYFACTOR_USERNAME")
2123
log.Printf("[DEBUG] Username: %s", clientAuth.Username)
@@ -26,6 +28,17 @@ func initClient() (*api.Client, error) {
2628
clientAuth.Hostname = os.Getenv("KEYFACTOR_HOSTNAME")
2729
log.Printf("[DEBUG] Hostname: %s", clientAuth.Hostname)
2830

31+
if clientAuth.Username == "" || clientAuth.Password == "" || clientAuth.Hostname == "" {
32+
authConfigFile("", true)
33+
clientAuth.Username = os.Getenv("KEYFACTOR_USERNAME")
34+
log.Printf("[DEBUG] Username: %s", clientAuth.Username)
35+
clientAuth.Password = os.Getenv("KEYFACTOR_PASSWORD")
36+
log.Printf("[DEBUG] Password: %s", clientAuth.Password)
37+
clientAuth.Domain = os.Getenv("KEYFACTOR_DOMAIN")
38+
log.Printf("[DEBUG] Domain: %s", clientAuth.Domain)
39+
clientAuth.Hostname = os.Getenv("KEYFACTOR_HOSTNAME")
40+
log.Printf("[DEBUG] Hostname: %s", clientAuth.Hostname)
41+
}
2942
c, err := api.NewKeyfactorClient(&clientAuth)
3043

3144
if err != nil {

0 commit comments

Comments
 (0)