mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
87 lines
2.7 KiB
Go
87 lines
2.7 KiB
Go
package config
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
)
|
||
|
|
|
||
|
|
func withCurrentUserHome(t *testing.T, home string) {
|
||
|
|
t.Helper()
|
||
|
|
orig := currentUserHomeDir
|
||
|
|
currentUserHomeDir = func() (string, error) { return home, nil }
|
||
|
|
t.Cleanup(func() { currentUserHomeDir = orig })
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestUnwritableConfigDirRemedy(t *testing.T) {
|
||
|
|
t.Run("dir inside real home suggests chown", func(t *testing.T) {
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "")
|
||
|
|
withCurrentUserHome(t, "/home/alice")
|
||
|
|
|
||
|
|
help, fix := UnwritableConfigDirRemedy("/home/alice/.config/safedep/pmg")
|
||
|
|
assert.Contains(t, help, "sudo chown -R")
|
||
|
|
assert.Contains(t, help, "/home/alice/.config/safedep/pmg")
|
||
|
|
assert.Contains(t, fix, "sudo chown -R")
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("dir outside real home blames leaked env, never suggests chown", func(t *testing.T) {
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "")
|
||
|
|
withCurrentUserHome(t, "/home/pmgtest")
|
||
|
|
|
||
|
|
help, fix := UnwritableConfigDirRemedy("/home/runner/.config/safedep/pmg")
|
||
|
|
assert.Contains(t, help, "XDG_CONFIG_HOME")
|
||
|
|
assert.NotContains(t, help, "chown")
|
||
|
|
assert.Contains(t, fix, "XDG_CONFIG_HOME")
|
||
|
|
assert.NotContains(t, fix, "chown")
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("explicit PMG_CONFIG_DIR gets its own remedy", func(t *testing.T) {
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "/srv/pmg")
|
||
|
|
withCurrentUserHome(t, "/home/alice")
|
||
|
|
|
||
|
|
help, fix := UnwritableConfigDirRemedy("/srv/pmg")
|
||
|
|
assert.Contains(t, help, "PMG_CONFIG_DIR")
|
||
|
|
assert.NotContains(t, help, "chown")
|
||
|
|
assert.Contains(t, fix, "PMG_CONFIG_DIR")
|
||
|
|
assert.NotContains(t, fix, "chown")
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("sibling dir with home prefix is outside home", func(t *testing.T) {
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "")
|
||
|
|
withCurrentUserHome(t, "/home/alice")
|
||
|
|
|
||
|
|
help, _ := UnwritableConfigDirRemedy("/home/alice-evil/.config/safedep/pmg")
|
||
|
|
assert.NotContains(t, help, "chown")
|
||
|
|
})
|
||
|
|
|
||
|
|
t.Run("unresolvable home falls back to chown for own dir", func(t *testing.T) {
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "")
|
||
|
|
orig := currentUserHomeDir
|
||
|
|
currentUserHomeDir = func() (string, error) { return "", assert.AnError }
|
||
|
|
t.Cleanup(func() { currentUserHomeDir = orig })
|
||
|
|
|
||
|
|
help, _ := UnwritableConfigDirRemedy("/home/alice/.config/safedep/pmg")
|
||
|
|
assert.Contains(t, help, "chown")
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestClassifyUnwritableDir(t *testing.T) {
|
||
|
|
withCurrentUserHome(t, "/home/alice")
|
||
|
|
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "/srv/pmg")
|
||
|
|
assert.Equal(t, causeExplicitConfigDir, classifyUnwritableDir("/srv/pmg"))
|
||
|
|
|
||
|
|
t.Setenv("PMG_CONFIG_DIR", "")
|
||
|
|
assert.Equal(t, causeLeakedHomeEnv, classifyUnwritableDir("/home/runner/.config/safedep/pmg"))
|
||
|
|
assert.Equal(t, causeRootCreatedDir, classifyUnwritableDir("/home/alice/.config/safedep/pmg"))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCurrentUserHomeDirRejectsEmptyPasswdHome(t *testing.T) {
|
||
|
|
home, err := currentUserHomeDir()
|
||
|
|
if err != nil {
|
||
|
|
assert.Empty(t, home)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
assert.NotEmpty(t, home)
|
||
|
|
}
|