// 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 }