package main import ( "fmt" "os" "strings" "syscall" "golang.org/x/term" "go.yarn.social/client" "code.laidback.moe/mikuru/mirai" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) var ( username string password string ) var loginCmd = &cobra.Command{ Use: "login", Short: "Authenticate against a Yarn pod", Aliases: []string{"auth", "signin"}, Args: cobra.MaximumNArgs(0), Run: func(_ *cobra.Command, _ []string) { cli, err := client.NewClient(client.WithURI(mirai.Config.Host)) if err != nil { log.Fatalf("Unable to create client\n%s\n", err) } signin(cli) }, } func init() { mirai.ConfInit() rootCmd.AddCommand(loginCmd) } func signin(cli *client.Client) { fmt.Printf("Username: ") fmt.Scanln(&username) if len(username) == 0 { log.Fatal("No value. Bailing out") } fmt.Printf("Password: ") data, err := term.ReadPassword(int(syscall.Stdin)) if err != nil { log.Fatalf("Unable to obtain password\n%s\n", err) } password := string(data) res, err := cli.Login(username, password) if err != nil { log.Fatalf("Unable to login\n%s\n", err) } token := strings.Trim(fmt.Sprintf(res.Token), "{}") config, err := os.UserConfigDir() if err != nil { log.Fatal(err) } configPath := config + "/mikuru.ini" f, err := os.OpenFile(configPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) if err != nil { log.Fatal(err) } defer f.Close() f.WriteString("token = " + token + "\n") log.Info("Login successful") }