42 lines
816 B
Go
42 lines
816 B
Go
package launcher
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
func ensureDataDir() error {
|
|
dir := resolveDataDir()
|
|
if err := rejectSymlinkComponents(dir); err != nil {
|
|
return err
|
|
}
|
|
if err := os.MkdirAll(dir, 0o700); err != nil {
|
|
return err
|
|
}
|
|
if err := os.Chmod(dir, 0o700); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func rejectSymlinkComponents(target string) error {
|
|
abs, err := filepath.Abs(target)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for current := abs; ; current = filepath.Dir(current) {
|
|
info, err := os.Lstat(current)
|
|
if err == nil && info.Mode()&os.ModeSymlink != 0 {
|
|
return fmt.Errorf("refusing to use symlinked data path component: %s", current)
|
|
}
|
|
if err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
parent := filepath.Dir(current)
|
|
if parent == current {
|
|
return nil
|
|
}
|
|
}
|
|
}
|