@@ -3,6 +3,7 @@ package auth
33import (
44 "context"
55 "encoding/json"
6+ "errors"
67 "fmt"
78 "net/http"
89 "strings"
@@ -15,6 +16,10 @@ import (
1516 "github.com/anchordotdev/cli/keyring"
1617)
1718
19+ var (
20+ ErrSigninFailed = errors .New ("sign in failed" )
21+ )
22+
1823type SignIn struct {
1924 Config * cli.Config
2025}
@@ -26,17 +31,23 @@ func (s SignIn) TUI() cli.TUI {
2631}
2732
2833func (s * SignIn ) run (ctx context.Context , tty termenv.File ) error {
29- apiToken := s .Config .API .Token
30- if len (apiToken ) == 0 {
31- if _ , err := fmt .Fprintf (tty , "API Token: " ); err != nil {
34+ if len (s .Config .API .Token ) == 0 {
35+ fmt .Fprintf (tty , "To complete sign in, please:\n 1. Visit https://anchor.dev/settings and add a new Personal Access Token (PAT).\n 2. Copy the key from the new token and paste it below when prompted.\n " )
36+
37+ if _ , err := fmt .Fprintf (tty , "Personal Access Token (PAT): " ); err != nil {
3238 return err
3339 }
3440
3541 line , err := term .ReadPassword (int (tty .Fd ()))
3642 if err != nil {
3743 return err
3844 }
39- apiToken = strings .TrimSpace (string (line ))
45+ pat := strings .TrimSpace (string (line ))
46+ if ! strings .HasPrefix (pat , "ap0_" ) || len (pat ) != 64 {
47+ return fmt .Errorf ("invalid PAT key" )
48+ }
49+
50+ s .Config .API .Token = pat
4051
4152 if _ , err := fmt .Fprintln (tty ); err != nil {
4253 return err
@@ -52,12 +63,15 @@ func (s *SignIn) run(ctx context.Context, tty termenv.File) error {
5263 if err != nil {
5364 return err
5465 }
55- req .SetBasicAuth (apiToken , "" )
66+ req .SetBasicAuth (s . Config . API . Token , "" )
5667
5768 res , err := anc .Do (req )
5869 if err != nil {
5970 return err
6071 }
72+ if res .StatusCode == http .StatusForbidden {
73+ return ErrSigninFailed
74+ }
6175 if res .StatusCode != http .StatusOK {
6276 return fmt .Errorf ("unexpected response code: %d" , res .StatusCode )
6377 }
@@ -68,7 +82,7 @@ func (s *SignIn) run(ctx context.Context, tty termenv.File) error {
6882 }
6983
7084 kr := keyring.Keyring {Config : s .Config }
71- if err := kr .Set (keyring .APIToken , apiToken ); err != nil {
85+ if err := kr .Set (keyring .APIToken , s . Config . API . Token ); err != nil {
7286 return err
7387 }
7488
0 commit comments