Download this file
| 1 | package rootstate |
| 2 | |
| 3 | import ( |
| 4 | "os" |
| 5 | "path/filepath" |
| 6 | "testing" |
| 7 | ) |
| 8 | |
| 9 | func TestPlan14TrustedLiveLink(t *testing.T) { |
| 10 | path := t.TempDir() |
| 11 | if err := os.Chmod(path, 0700); err != nil { |
| 12 | t.Fatal(err) |
| 13 | } |
| 14 | parent, err := os.Open(path) |
| 15 | if err != nil { |
| 16 | t.Fatal(err) |
| 17 | } |
| 18 | defer parent.Close() |
| 19 | d := &directory{file: parent, owner: uint32(os.Geteuid())} |
| 20 | if err := os.Symlink("/opt/carlos/versions/v1/app", filepath.Join(path, "live")); err != nil { |
| 21 | t.Fatal(err) |
| 22 | } |
| 23 | if got, err := d.readLink("live"); err != nil || got != "/opt/carlos/versions/v1/app" { |
| 24 | t.Fatalf("link: %q %v", got, err) |
| 25 | } |
| 26 | for _, name := range []string{"../live", "missing"} { |
| 27 | if _, err := d.readLink(name); err == nil { |
| 28 | t.Fatalf("accepted %s", name) |
| 29 | } |
| 30 | } |
| 31 | if err := os.WriteFile(filepath.Join(path, "file"), []byte("target"), 0600); err != nil { |
| 32 | t.Fatal(err) |
| 33 | } |
| 34 | if _, err := d.readLink("file"); err == nil { |
| 35 | t.Fatal("accepted regular file") |
| 36 | } |
| 37 | d.owner++ |
| 38 | if _, err := d.readLink("live"); err == nil { |
| 39 | t.Fatal("accepted wrong owner") |
| 40 | } |
| 41 | } |
| 42 | |