fix: persist.Store — sanitize callID, log save errors, document List filter semantics
This commit is contained in:
@@ -2,6 +2,7 @@ package persist
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -45,13 +46,16 @@ func (s *Store) Save(toolName, callID, content string) (string, bool) {
|
|||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
if err := os.MkdirAll(s.dir, 0o755); err != nil {
|
if err := os.MkdirAll(s.dir, 0o755); err != nil {
|
||||||
|
slog.Warn("persist: failed to create session directory", "dir", s.dir, "error", err)
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
// Sanitize tool name for filesystem (replace dots and slashes)
|
// Sanitize tool name and call ID for filesystem (replace dots, slashes, path traversal)
|
||||||
safeName := strings.NewReplacer(".", "_", "/", "_").Replace(toolName)
|
safeName := strings.NewReplacer(".", "_", "/", "_").Replace(toolName)
|
||||||
filename := safeName + "-" + callID + ".txt"
|
safeCallID := strings.NewReplacer("/", "_", "..", "_").Replace(callID)
|
||||||
|
filename := safeName + "-" + safeCallID + ".txt"
|
||||||
path := filepath.Join(s.dir, filename)
|
path := filepath.Join(s.dir, filename)
|
||||||
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
||||||
|
slog.Warn("persist: failed to write tool result", "path", path, "error", err)
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
return path, true
|
return path, true
|
||||||
@@ -67,8 +71,11 @@ func InlineReplacement(path, content string) string {
|
|||||||
path, previewSize, preview)
|
path, previewSize, preview)
|
||||||
}
|
}
|
||||||
|
|
||||||
// List returns all persisted results, optionally filtered by tool name prefix.
|
// List returns all persisted results, optionally filtered by sanitized tool name prefix.
|
||||||
|
// Tool names are stored with dots and slashes replaced by underscores — e.g.,
|
||||||
|
// "fs.grep" is stored as "fs_grep". Pass the sanitized form as the filter.
|
||||||
// An empty filter returns all results.
|
// An empty filter returns all results.
|
||||||
|
// Returns nil (not error) if the session directory does not yet exist.
|
||||||
func (s *Store) List(toolNameFilter string) ([]ResultFile, error) {
|
func (s *Store) List(toolNameFilter string) ([]ResultFile, error) {
|
||||||
entries, err := os.ReadDir(s.dir)
|
entries, err := os.ReadDir(s.dir)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user