github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/login/login.go (about) 1 package login 2 3 import ( 4 "bufio" 5 "errors" 6 "fmt" 7 "io" 8 "os" 9 "path/filepath" 10 "strings" 11 12 "github.com/spf13/afero" 13 "github.com/Redstoneguy129/cli/internal/utils" 14 "github.com/Redstoneguy129/cli/internal/utils/credentials" 15 ) 16 17 func Run(stdin io.Reader, fsys afero.Fs) error { 18 fmt.Fprintf(os.Stderr, `You can generate an access token from %s/account/tokens 19 Enter your access token: `, utils.GetSupabaseDashboardURL()) 20 21 scanner := bufio.NewScanner(stdin) 22 if !scanner.Scan() { 23 fmt.Println("Cancelled " + utils.Aqua("supabase login") + ".") 24 return nil 25 } 26 27 accessToken := strings.TrimSpace(scanner.Text()) 28 29 // 1. Validate access token 30 if !utils.AccessTokenPattern.MatchString(accessToken) { 31 return errors.New("Invalid access token format. Must be like `sbp_0102...1920`.") 32 } 33 34 // 2. Save access token 35 if err := credentials.Set(utils.AccessTokenKey, accessToken); err == nil { 36 return nil 37 } 38 return fallbackSaveToken(accessToken, fsys) 39 } 40 41 func fallbackSaveToken(accessToken string, fsys afero.Fs) error { 42 home, err := os.UserHomeDir() 43 if err != nil { 44 return err 45 } 46 47 configPath := filepath.Join(home, ".supabase") 48 if err := utils.MkdirIfNotExistFS(fsys, configPath); err != nil { 49 return err 50 } 51 52 accessTokenPath := filepath.Join(configPath, utils.AccessTokenKey) 53 return afero.WriteFile(fsys, accessTokenPath, []byte(accessToken), 0600) 54 }