package v1_test import ( v1 "github.com/cirruslabs/orchard/pkg/resource/v1" "github.com/stretchr/testify/require" "testing" ) func TestNewHostDirPolicyFromString(t *testing.T) { policy, err := v1.NewHostDirPolicyFromString("/Users/ci/src:ro") require.NoError(t, err) require.EqualValues(t, v1.HostDirPolicy{ PathPrefix: "/Users/ci/src", ReadOnly: true, }, policy) _, err = v1.NewHostDirPolicyFromString("/Users/ci/src:ro:something") require.Error(t, err) _, err = v1.NewHostDirPolicyFromString("/Users/ci/src:rw") require.Error(t, err) } func TestHostDirPolicyValidate(t *testing.T) { policy := &v1.HostDirPolicy{PathPrefix: "/Users/ci/src"} // Valid uses require.True(t, policy.Validate("/Users/ci/src", true)) require.True(t, policy.Validate("/Users/ci/src/", true)) require.True(t, policy.Validate("/Users/ci/src/website", true)) // Invalid uses require.False(t, policy.Validate("/Users/ci/", true)) require.False(t, policy.Validate("/Users", true)) require.False(t, policy.Validate("/tmp", true)) require.False(t, policy.Validate("/", true)) // No path traversal, even within the path prefix require.False(t, policy.Validate("/Users/ci/src/website/../../../../../../etc/passwd", true)) require.False(t, policy.Validate("/Users/ci/src/website/..", true)) require.False(t, policy.Validate("/Users/ci/src/..", true)) require.False(t, policy.Validate("/Users/ci/..", true)) require.False(t, policy.Validate("/Users/..", true)) require.False(t, policy.Validate("/..", true)) } func TestHostDirPolicyValidateReadOnly(t *testing.T) { policy := &v1.HostDirPolicy{PathPrefix: "/Users/ci/src", ReadOnly: true} const desiredPath = "/Users/ci/src/website" // Only read-only is allowed require.True(t, policy.Validate(desiredPath, true)) require.False(t, policy.Validate(desiredPath, false)) } func TestHostDirPolicyString(t *testing.T) { policyRw := &v1.HostDirPolicy{PathPrefix: "/Users/ci/src"} require.EqualValues(t, "/Users/ci/src", policyRw.String()) policyRo := &v1.HostDirPolicy{PathPrefix: "/Users/ci/src", ReadOnly: true} require.EqualValues(t, "/Users/ci/src:ro", policyRo.String()) } func TestHTTPHostDirPolicyString(t *testing.T) { policy, err := v1.NewHostDirPolicyFromString("https://github.com/actions/runner/releases/download") require.NoError(t, err) require.EqualValues(t, v1.HostDirPolicy{ PathPrefix: "https://github.com/actions/runner/releases/download", ReadOnly: false, }, policy) //nolint: lll require.True(t, policy.Validate("https://github.com/actions/runner/releases/download/v2.309.0/actions-runner-osx-arm64-2.309.0.tar.gz", false)) }