package fileauthcache import ( "encoding/json" "os" "path/filepath" "sync" "git.icedream.tech/icedream/oneandone-billing-mailer/pkg/auth/authcache" "golang.org/x/oauth2" ) type fileAuthCache struct { filePath string cacheLock sync.Mutex } func NewFileAuthCache(filePath string) authcache.Cache { return &fileAuthCache{ filePath: filePath, } } func (ts *fileAuthCache) Persist(token *oauth2.Token) (err error) { ts.cacheLock.Lock() defer ts.cacheLock.Unlock() f, err := os.CreateTemp(filepath.Dir(ts.filePath), "") if err != nil { return err } if err = f.Chmod(0o600); err != nil { f.Close() return err } if err = json.NewEncoder(f).Encode(token); err != nil { f.Close() return err } if err = f.Close(); err != nil { return err } err = os.Rename(f.Name(), ts.filePath) return err } func (ts *fileAuthCache) Fetch() (token *oauth2.Token, err error) { f, err := os.OpenFile(ts.filePath, os.O_RDONLY, 0o600) if os.IsNotExist(err) { // Treat as no existing token found return nil, nil } if err != nil { return nil, err } decodedToken := new(oauth2.Token) if err = json.NewDecoder(f).Decode(decodedToken); err != nil { return nil, err } return decodedToken, nil }