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 && ¤tEndpoint != 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 }