github.com/jfrog/jfrog-cli-core/v2@v2.51.0/general/login/login.go (about) 1 package login 2 3 import ( 4 "github.com/jfrog/jfrog-cli-core/v2/common/commands" 5 "github.com/jfrog/jfrog-cli-core/v2/general" 6 "github.com/jfrog/jfrog-cli-core/v2/utils/config" 7 "github.com/jfrog/jfrog-cli-core/v2/utils/ioutils" 8 "github.com/jfrog/jfrog-client-go/utils/errorutils" 9 "github.com/jfrog/jfrog-client-go/utils/io/fileutils" 10 ) 11 12 const ( 13 newSeverPlaceholder = "[New Server]" 14 ) 15 16 type LoginCommand struct { 17 } 18 19 func NewLoginCommand() *LoginCommand { 20 return &LoginCommand{} 21 } 22 23 func (lc *LoginCommand) Run() error { 24 configurations, err := config.GetAllServersConfigs() 25 if err != nil { 26 return err 27 } 28 if len(configurations) == 0 { 29 return newConfLogin() 30 } 31 return existingConfLogin(configurations) 32 } 33 34 func newConfLogin() error { 35 platformUrl, err := promptPlatformUrl() 36 if err != nil { 37 return err 38 } 39 newServer := config.ServerDetails{Url: platformUrl} 40 return general.ConfigServerWithDeducedId(&newServer, true, true) 41 } 42 43 func promptPlatformUrl() (string, error) { 44 var platformUrl string 45 ioutils.ScanFromConsole("JFrog Platform URL", &platformUrl, "") 46 if platformUrl == "" { 47 return "", errorutils.CheckErrorf("providing JFrog Platform URL is mandatory") 48 } 49 return platformUrl, nil 50 } 51 52 func existingConfLogin(configurations []*config.ServerDetails) error { 53 selectedChoice, err := promptAddOrEdit(configurations) 54 if err != nil { 55 return err 56 } 57 if selectedChoice == newSeverPlaceholder { 58 return selectedNewServer() 59 } 60 return existingServerLogin(selectedChoice) 61 } 62 63 // When configurations exist and the user chose to log in with a new server we direct him to a clean config process, 64 // where he will be prompted for server ID and URL. 65 func selectedNewServer() error { 66 return general.ConfigServerAsDefault(nil, "", true, true) 67 } 68 69 // When a user chose to log in to an existing server, 70 // we run a config process while keeping all his current server details except credentials. 71 func existingServerLogin(serverId string) error { 72 serverDetails, err := commands.GetConfig(serverId, true) 73 if err != nil { 74 return err 75 } 76 if serverDetails.Url == "" { 77 serverDetails = &config.ServerDetails{ServerId: serverDetails.ServerId} 78 } else { 79 if fileutils.IsSshUrl(serverDetails.Url) { 80 return errorutils.CheckErrorf("web login cannot be performed via SSH. Please try again with different server configuration or configure a new one") 81 } 82 serverDetails.User = "" 83 serverDetails.Password = "" 84 serverDetails.AccessToken = "" 85 serverDetails.RefreshToken = "" 86 } 87 return general.ConfigServerAsDefault(serverDetails, serverId, true, true) 88 } 89 90 // Prompt a list of all server IDs and an option for a new server, and let the user choose to which to log in. 91 func promptAddOrEdit(configurations []*config.ServerDetails) (selectedChoice string, err error) { 92 selectableItems := []ioutils.PromptItem{{Option: newSeverPlaceholder, TargetValue: &selectedChoice}} 93 for i := range configurations { 94 selectableItems = append(selectableItems, ioutils.PromptItem{Option: configurations[i].ServerId, TargetValue: &selectedChoice}) 95 } 96 err = ioutils.SelectString(selectableItems, "Select whether to create a new server configuration or to web login to an existing one:", false, func(item ioutils.PromptItem) { 97 *item.TargetValue = item.Option 98 selectedChoice = *item.TargetValue 99 }) 100 return 101 }