package config
import (
"errors"
"fmt"
"os"
"syscall"
)
func secureWriteFile(path string, data []byte, perm os.FileMode) error {
flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC | syscall.O_NOFOLLOW
f, err := os.OpenFile(path, flags, perm)
if err != nil {
if errors.Is(err, syscall.ELOOP) {
return fmt.Errorf("refusing to write to symlink: %s", path)
}
return fmt.Errorf("failed to open %s: %w", path, err)
}
defer f.Close()
if err := f.Chmod(perm); err != nil {
return fmt.Errorf("failed to chmod %s: %w", path, err)
}
if _, err := f.Write(data); err != nil {
return fmt.Errorf("failed to write %s: %w", path, err)
}
return nil
}