github.com/haagen/force@v0.19.6-0.20140911230915-22addd930b34/login.go (about)

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