From baa7ca66e62b3260e54bef286da3c5f797041593 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Wed, 20 May 2026 10:42:29 +0200 Subject: [PATCH] makeStat: delegate file modes to backing tree Remove hardcoded permission switch in makeStat and delegate to the underlying FileTree.Stat() instead. This makes FileList in sessionfile.go the single source of truth for session file modes. --- server/server.go | 46 ++++++------------------------------------ session/sessionfile.go | 6 +++--- 2 files changed, 9 insertions(+), 43 deletions(-) diff --git a/server/server.go b/server/server.go index 537f19b..7f124c5 100644 --- a/server/server.go +++ b/server/server.go @@ -1018,49 +1018,15 @@ func (s *Server) makeStat(path string) plan9.Dir { mode = plan9.DMDIR | 0755 } } else { - switch base { - case "ctl": - mode = 0222 // owner+group+other write - case "prompt", "fifo.in": - mode = 0022 // group+other write; owner cannot write (no self-prompt) - case "chat", "usage", "cost", "ctxsz", "models", "fifo.out", "offset", "statewait", "systemprompt": - mode = 0444 - case "cfg": - mode = 0666 - case "tail": - mode = 0555 - default: - if path == "/backends" || path == "/help" { - mode = 0444 - } else if isSessionFile(path) { - mode_, _ := session.FileMode(base) - mode = plan9.Perm(mode_) - } else if strings.HasPrefix(path, "/a/") { - mode = 0666 - } else if strings.HasPrefix(path, "/p/") { - mode = 0664 - } else if strings.HasPrefix(path, "/m/") { - mode = 0666 - } else if path == "/sk/idx" { - mode = 0444 - } else if strings.HasPrefix(path, "/sk/") { - mode = 0664 - } else if strings.HasPrefix(path, "/s/") { - parts := strings.SplitN(strings.TrimPrefix(path, "/s/"), "/", 3) - if len(parts) == 3 && parts[1] == "t" && parts[2] == "idx" { - mode = 0400 - } else if len(parts) == 3 && parts[1] == "t" { - mode = 0500 - } else { - mode = 0444 - } - } else if strings.HasPrefix(path, "/u/") { - mode = 0555 - } else if strings.HasPrefix(path, "/x/") { - mode = 0555 + // Delegate to the backing tree for file mode. + if tree, name := s.route(path); tree != nil { + if info, err := tree.Stat(name); err == nil { + mode = plan9.Perm(info.Mode()) } else { mode = 0444 } + } else { + mode = 0444 } } diff --git a/session/sessionfile.go b/session/sessionfile.go index dc74225..016af1a 100644 --- a/session/sessionfile.go +++ b/session/sessionfile.go @@ -23,10 +23,10 @@ var FileList = []struct { }{ {"plan", 0666, false, false}, {"ctl", 0200, false, true}, - {"prompt", 0200, false, true}, - {"fifo.in", 0200, false, true}, + {"prompt", 0466, false, true}, + {"fifo.in", 0222, false, true}, {"fifo.out", 0444, true, false}, - {"chat", 0666, false, false}, + {"chat", 0444, false, false}, {"offset", 0444, false, false}, {"cfg", 0666, false, false}, {"state", 0444, false, false},