github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/auth.go (about) 1 package cmd 2 3 import ( 4 "errors" 5 "fmt" 6 "net/url" 7 "os/exec" 8 "runtime" 9 "time" 10 11 drycc "github.com/drycc/controller-sdk-go" 12 "github.com/drycc/controller-sdk-go/api" 13 "github.com/drycc/controller-sdk-go/auth" 14 "github.com/drycc/workflow-cli/settings" 15 ) 16 17 func (d *DryccCmd) doLogin(s settings.Settings) error { 18 URL, err := auth.Login(s.Client) 19 if d.checkAPICompatibility(s.Client, err) != nil { 20 return err 21 } 22 if err != nil { 23 return nil 24 } 25 fmt.Printf("Opening browser to %s\n", URL) 26 d.Print("Waiting for login... ") 27 err = d.openBrower(URL) 28 if err != nil { 29 d.Print("Cannot open browser, please visit the website in yourself") 30 } 31 u, err := url.Parse(URL) 32 if err != nil { 33 return err 34 } 35 key := u.Query()["key"][0] 36 quit := progress(d.WOut) 37 d.doToken(s, key) 38 quit <- true 39 <-quit 40 return nil 41 } 42 43 func (d *DryccCmd) openBrower(URL string) error { 44 var commands = map[string]string{ 45 "windows": "start", 46 "darwin": "open", 47 "linux": "xdg-open", 48 } 49 run, ok := commands[runtime.GOOS] 50 if !ok { 51 return errors.New("warning: Cannot open browser") 52 } 53 cmd := exec.Command(run, URL) 54 err := cmd.Start() 55 if err != nil { 56 return errors.New("warning: Cannot open browser") 57 } 58 59 return nil 60 } 61 62 func (d *DryccCmd) doToken(s settings.Settings, key string) error { 63 var token api.AuthLoginResponse 64 for i := 0; i <= 120; i++ { 65 token, _ = auth.Token(s.Client, key) 66 if token != (api.AuthLoginResponse{}) { 67 break 68 } 69 time.Sleep(time.Duration(5) * time.Second) 70 } 71 if token.Token == "" || token.Token == "fail" { 72 d.Printf("Logged fail") 73 } else { 74 s.Client.Token = token.Token 75 s.Username = token.Username 76 filename, err := s.Save(d.ConfigFile) 77 if err != nil { 78 return nil 79 } 80 d.Printf("Logged in as %s\n", token.Username) 81 d.Printf("Configuration file written to %s\n", filename) 82 } 83 return nil 84 } 85 86 // Login to a Drycc controller. 87 func (d *DryccCmd) Login(controller string, sslVerify bool) error { 88 c, err := drycc.New(sslVerify, controller, "") 89 90 if err != nil { 91 return err 92 } 93 94 // Set user agent for temporary client. 95 c.UserAgent = settings.UserAgent 96 97 if err = c.CheckConnection(); d.checkAPICompatibility(c, err) != nil { 98 return err 99 } 100 101 s := settings.Settings{Client: c} 102 return d.doLogin(s) 103 } 104 105 // Logout from a Drycc controller. 106 func (d *DryccCmd) Logout() error { 107 if err := settings.Delete(d.ConfigFile); err != nil { 108 return err 109 } 110 111 d.Println("Logged out") 112 return nil 113 } 114 115 // Whoami prints the logged in user. If all is true, it fetches info from the controller to know 116 // more about the user. 117 func (d *DryccCmd) Whoami(all bool) error { 118 s, err := settings.Load(d.ConfigFile) 119 120 if err != nil { 121 return err 122 } 123 124 if all { 125 user, err := auth.Whoami(s.Client) 126 if err != nil { 127 return err 128 } 129 d.Println(user) 130 } else { 131 d.Printf("You are %s at %s\n", s.Username, s.Client.ControllerURL.String()) 132 } 133 return nil 134 }