@@ -9,15 +9,17 @@ package cmd
99import (
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
2325var loginCmd = & cobra.Command {
@@ -31,145 +33,208 @@ the CLI will default to using the environment variables: KEYFACTOR_HOSTNAME, KEY
3133KEYFACTOR_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
175240func 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
0 commit comments