package main import ( "context" "encoding/json" "errors" "fmt" "io/ioutil" "log/slog" "os" "github.com/adrg/xdg" "github.com/bluesky-social/indigo/atproto/client" ) var ErrNoAuthSession = errors.New("no auth session found") var SESSION_DATA_PATH = "halide/auth.json" func persistAuthSession(d client.PasswordSessionData) error { fPath, err := xdg.StateFile(SESSION_DATA_PATH) if err != nil { return err } f, err := os.OpenFile(fPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return err } defer f.Close() authBytes, err := json.MarshalIndent(d, "", " ") if err != nil { return err } _, err = f.Write(authBytes) return err } func wipeAuthSession() error { fPath, err := xdg.SearchStateFile(SESSION_DATA_PATH) if err != nil { fmt.Printf("no auth session found (already logged out)") return nil } return os.Remove(fPath) } func loadAuthSession() (*client.PasswordSessionData, error) { fPath, err := xdg.SearchStateFile(SESSION_DATA_PATH) if err != nil { return nil, ErrNoAuthSession } fBytes, err := ioutil.ReadFile(fPath) if err != nil { return nil, err } var sess client.PasswordSessionData err = json.Unmarshal(fBytes, &sess) if err != nil { return nil, err } return &sess, nil } func loadClient() (*client.APIClient, error) { d, err := loadAuthSession() if err != nil { return nil, err } c := client.ResumePasswordSession(*d, func(ctx context.Context, data client.PasswordSessionData) { if err := persistAuthSession(data); err != nil { slog.Error("saving refreshed auth session", "err", err) } }) return c, nil }