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  }