demo CLI tool for grain.social
at main 83 lines 1.6 kB view raw
1package main 2 3import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "io/ioutil" 9 "log/slog" 10 "os" 11 12 "github.com/adrg/xdg" 13 "github.com/bluesky-social/indigo/atproto/client" 14) 15 16var ErrNoAuthSession = errors.New("no auth session found") 17 18var SESSION_DATA_PATH = "halide/auth.json" 19 20func persistAuthSession(d client.PasswordSessionData) error { 21 22 fPath, err := xdg.StateFile(SESSION_DATA_PATH) 23 if err != nil { 24 return err 25 } 26 27 f, err := os.OpenFile(fPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) 28 if err != nil { 29 return err 30 } 31 defer f.Close() 32 33 authBytes, err := json.MarshalIndent(d, "", " ") 34 if err != nil { 35 return err 36 } 37 _, err = f.Write(authBytes) 38 return err 39} 40 41func wipeAuthSession() error { 42 43 fPath, err := xdg.SearchStateFile(SESSION_DATA_PATH) 44 if err != nil { 45 fmt.Printf("no auth session found (already logged out)") 46 return nil 47 } 48 return os.Remove(fPath) 49} 50 51func loadAuthSession() (*client.PasswordSessionData, error) { 52 53 fPath, err := xdg.SearchStateFile(SESSION_DATA_PATH) 54 if err != nil { 55 return nil, ErrNoAuthSession 56 } 57 58 fBytes, err := ioutil.ReadFile(fPath) 59 if err != nil { 60 return nil, err 61 } 62 63 var sess client.PasswordSessionData 64 err = json.Unmarshal(fBytes, &sess) 65 if err != nil { 66 return nil, err 67 } 68 return &sess, nil 69} 70 71func loadClient() (*client.APIClient, error) { 72 d, err := loadAuthSession() 73 if err != nil { 74 return nil, err 75 } 76 77 c := client.ResumePasswordSession(*d, func(ctx context.Context, data client.PasswordSessionData) { 78 if err := persistAuthSession(data); err != nil { 79 slog.Error("saving refreshed auth session", "err", err) 80 } 81 }) 82 return c, nil 83}