Merge pull request 'fix(handlers/org_helpers_test): correct TestResolveInsideRoot_DotDotWithIntermediate to expect success' (#974) from fix/org-helpers-test-panic into main
Some checks failed
Block internal-flavored paths / Block forbidden paths (push) Successful in 6s
Harness Replays / detect-changes (push) Successful in 8s
Secret scan / Scan diff for credential-shaped strings (push) Successful in 7s
Harness Replays / Harness Replays (push) Successful in 3s
CI / Detect changes (push) Successful in 17s
E2E API Smoke Test / detect-changes (push) Successful in 17s
E2E Staging Canvas (Playwright) / detect-changes (push) Successful in 19s
Handlers Postgres Integration / detect-changes (push) Successful in 18s
Runtime PR-Built Compatibility / detect-changes (push) Successful in 18s
CI / Canvas (Next.js) (push) Successful in 4s
CI / Shellcheck (E2E scripts) (push) Successful in 3s
CI / Python Lint & Test (push) Successful in 3s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (push) Successful in 4s
CI / Canvas Deploy Reminder (push) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (push) Successful in 1m5s
CI / Platform (Go) (push) Failing after 2m33s
CI / all-required (push) Successful in 3s
Handlers Postgres Integration / Handlers Postgres Integration (push) Failing after 2m35s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (push) Successful in 2m39s
Sweep stale e2e-* orgs (staging) / Sweep e2e orgs (push) Successful in 4s
gitea-merge-queue / queue (push) Successful in 7s
Sweep stale Cloudflare DNS records / Sweep CF orphans (push) Successful in 12s
publish-workspace-server-image / build-and-push (push) Successful in 5m16s
publish-workspace-server-image / Production auto-deploy (push) Failing after 15s
status-reaper / reap (push) Successful in 1m16s
Continuous synthetic E2E (staging) / Synthetic E2E against staging (push) Successful in 4m55s
ci-required-drift / drift (push) Successful in 1m46s

This commit is contained in:
devops-engineer 2026-05-14 12:10:34 +00:00
commit ca80e3cc91

View File

@ -45,13 +45,19 @@ func TestResolveInsideRoot_DotDotTraversal(t *testing.T) {
}
func TestResolveInsideRoot_DotDotWithIntermediate(t *testing.T) {
// a/b/../../c should escape if a/b is not under root
got, err := resolveInsideRoot("/safe/root", "a/b/../../c")
if err == nil {
t.Fatalf("dotdot with intermediate: expected error, got %q", got)
// a/b/../../c normalises to "c" — a valid descendant inside any root.
// Must use t.TempDir() for a real filesystem path so filepath.Abs resolves.
root := t.TempDir()
got, err := resolveInsideRoot(root, "a/b/../../c")
if err != nil {
t.Fatalf("a/b/../../c should resolve within root: %v", err)
}
if err.Error() != "path escapes root" {
t.Errorf("dotdot with intermediate: got %q, want %q", err.Error(), "path escapes root")
// Verify result is inside root and ends with "c"
if !strings.HasPrefix(got, root+string(filepath.Separator)) {
t.Errorf("result should be inside root %q, got %q", root, got)
}
if got[len(got)-1:] != "c" {
t.Errorf("resolved path should end in 'c', got %q", got)
}
}