oneandone-billing-mailer/pkg/auth/authcache/fileauthcache/fileauthcache.go

68 lines
1.2 KiB
Go

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
}