github.com/mhlo/force@v0.22.28-0.20150915022417-6d05ecfb0b47/login.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"github.com/bgentry/speakeasy"
     7  	"net/url"
     8  )
     9  
    10  var cmdLogin = &Command{
    11  	Usage: "login",
    12  	Short: "force login [-i=<instance>] [<-u=username> <-p=password>]",
    13  	Long: `
    14    force login [-i=<instance>] [<-u=username> <-p=password>]
    15  
    16    Examples:
    17      force login
    18      force login -i=test
    19      force login -u=un -p=pw
    20      force login -i=test -u=un -p=pw
    21      force login -i=na1-blitz01.soma.salesforce.com -u=un -p=pw
    22  `,
    23  }
    24  
    25  func init() {
    26  	cmdLogin.Run = runLogin
    27  }
    28  
    29  var (
    30  	instance = cmdLogin.Flag.String("i", "login", "non-production server to login to (values are 'pre', 'test', or full instance url")
    31  	userName = cmdLogin.Flag.String("u", "", "Username for Soap Login")
    32  	password = cmdLogin.Flag.String("p", "", "Password for Soap Login")
    33  )
    34  
    35  func runLogin(cmd *Command, args []string) {
    36  	var endpoint ForceEndpoint = EndpointProduction
    37  
    38  	/*currentEndpoint, customUrl, err := CurrentEndpoint()
    39  	if err == nil && &currentEndpoint != nil {
    40  		endpoint = currentEndpoint
    41  		if currentEndpoint == EndpointCustom && customUrl != "" {
    42  			*instance = customUrl
    43  		}
    44  	}*/
    45  
    46  	switch *instance {
    47  	case "login":
    48  		endpoint = EndpointProduction
    49  	case "test":
    50  		endpoint = EndpointTest
    51  	case "pre":
    52  		endpoint = EndpointPrerelease
    53  	default:
    54  		if *instance != "" {
    55  			//need to determine the form of the endpoint
    56  			uri, err := url.Parse(*instance)
    57  			if err != nil {
    58  				ErrorAndExit("no such endpoint: %s", *instance)
    59  			}
    60  			// Could be short hand?
    61  			if uri.Host == "" {
    62  				uri, err = url.Parse(fmt.Sprintf("https://%s", *instance))
    63  				//fmt.Println(uri)
    64  				if err != nil {
    65  					ErrorAndExit("no such endpoint: %s", *instance)
    66  				}
    67  			}
    68  			CustomEndpoint = uri.Scheme + "://" + uri.Host
    69  			endpoint = EndpointCustom
    70  
    71  			fmt.Println("Loaded Endpoint: (" + CustomEndpoint + ")")
    72  		}
    73  	}
    74  
    75  	if len(*userName) != 0 { // Do SOAP login
    76  		if len(*password) == 0 {
    77  			var err error
    78  			*password, err = speakeasy.Ask("Password: ")
    79  			if err != nil {
    80  				ErrorAndExit(err.Error())
    81  			}
    82  		}
    83  		_, err := ForceLoginAndSaveSoap(endpoint, *userName, *password)
    84  		if err != nil {
    85  			ErrorAndExit(err.Error())
    86  		}
    87  	} else { // Do OAuth login
    88  		_, err := ForceLoginAndSave(endpoint)
    89  		if err != nil {
    90  			ErrorAndExit(err.Error())
    91  		}
    92  	}
    93  }
    94  
    95  func CurrentEndpoint() (endpoint ForceEndpoint, customUrl string, err error) {
    96  	creds, err := ActiveCredentials()
    97  	if err != nil {
    98  		return
    99  	}
   100  	endpoint = creds.ForceEndpoint
   101  	customUrl = creds.InstanceUrl
   102  	return
   103  }
   104  
   105  func ForceSaveLogin(creds ForceCredentials) (username string, err error) {
   106  	force := NewForce(creds)
   107  	login, err := force.Get(creds.Id)
   108  	if err != nil {
   109  		return
   110  	}
   111  	body, err := json.Marshal(creds)
   112  	if err != nil {
   113  		return
   114  	}
   115  	username = login["username"].(string)
   116  
   117  	me, err := force.Whoami()
   118  	if err != nil {
   119  		return
   120  	}
   121  	fmt.Printf("Logged in as '%s'\n", me["Username"])
   122  	title := fmt.Sprintf("\033];%s\007", me["Username"])
   123  	fmt.Printf(title)
   124  
   125  	describe, err := force.Metadata.DescribeMetadata()
   126  
   127  	if err == nil {
   128  		creds.Namespace = describe.NamespacePrefix
   129  	} else {
   130  		fmt.Printf("Your profile does not have Modify All Data enabled. Functionallity will be limited.\n")
   131  		err = nil
   132  	}
   133  
   134  	body, err = json.Marshal(creds)
   135  	if err != nil {
   136  		return
   137  	}
   138  	Config.Save("accounts", username, string(body))
   139  	Config.Save("current", "account", username)
   140  	return
   141  }
   142  
   143  func ForceLoginAndSaveSoap(endpoint ForceEndpoint, user_name string, password string) (username string, err error) {
   144  	creds, err := ForceSoapLogin(endpoint, user_name, password)
   145  	if err != nil {
   146  		return
   147  	}
   148  
   149  	username, err = ForceSaveLogin(creds)
   150  	//fmt.Printf("Creds %+v", creds)
   151  	return
   152  }
   153  
   154  func ForceLoginAndSave(endpoint ForceEndpoint) (username string, err error) {
   155  	creds, err := ForceLogin(endpoint)
   156  	if err != nil {
   157  		return
   158  	}
   159  	username, err = ForceSaveLogin(creds)
   160  	return
   161  }