Files
Local-Cursor/internal/securefile/file.go

59 lines
1.2 KiB
Go
Raw Normal View History

// Package securefile provides private, durable files for application secrets.
package securefile
import (
"os"
"path/filepath"
)
func PrivateDir(path string) error {
if err := os.MkdirAll(path, 0700); err != nil {
return err
}
return protect(path, true)
}
func Protect(path string) error { return protect(path, false) }
func Write(path string, data []byte) error {
if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil {
return err
}
f, err := os.CreateTemp(filepath.Dir(path), ".local-cursor-*")
if err != nil {
return err
}
temp := f.Name()
defer os.Remove(temp)
if err = protect(temp, false); err == nil {
_, err = f.Write(data)
}
if err == nil {
err = f.Sync()
}
closeErr := f.Close()
if err != nil {
return err
}
if closeErr != nil {
return closeErr
}
return os.Rename(temp, path)
}
// Lock is released by the OS when the process exits, including after a crash.
func Lock(path string) (func(), error) {
f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0600)
if err != nil {
return nil, err
}
if err = Protect(path); err == nil {
err = lockFile(f)
}
if err != nil {
f.Close()
return nil, err
}
return func() { unlockFile(f); f.Close() }, nil
}