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  }