-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathsessionapproval.go
More file actions
72 lines (63 loc) · 2.32 KB
/
Copy pathsessionapproval.go
File metadata and controls
72 lines (63 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2025, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
package aiusechat
import (
"path/filepath"
"strings"
"sync"
"github.com/wavetermdev/waveterm/pkg/util/logutil"
"github.com/wavetermdev/waveterm/pkg/wavebase"
)
// SessionApprovalRegistry tracks paths that the user has approved for reading
// during the current session. This is in-memory only and resets when the app restarts.
type SessionApprovalRegistry struct {
mu sync.RWMutex
approvedPaths map[string]bool // set of approved directory prefixes
}
var globalSessionApproval = &SessionApprovalRegistry{
approvedPaths: make(map[string]bool),
}
// AddSessionReadApproval adds a directory path to the session-level read approval list.
// All files under this directory (and subdirectories) will be auto-approved for reading.
func AddSessionReadApproval(dirPath string) {
expanded, err := wavebase.ExpandHomeDir(dirPath)
if err != nil {
expanded = dirPath
}
cleaned := filepath.Clean(expanded)
if !strings.HasSuffix(cleaned, string(filepath.Separator)) {
cleaned += string(filepath.Separator)
}
logutil.DevPrintf("session read approval added: %s\n", cleaned)
globalSessionApproval.mu.Lock()
defer globalSessionApproval.mu.Unlock()
globalSessionApproval.approvedPaths[cleaned] = true
}
// IsSessionReadApproved checks if a file path falls under any session-approved directory.
func IsSessionReadApproved(filePath string) bool {
cleaned := filepath.Clean(filePath)
globalSessionApproval.mu.RLock()
defer globalSessionApproval.mu.RUnlock()
for approvedDir := range globalSessionApproval.approvedPaths {
if strings.HasPrefix(cleaned, approvedDir) || cleaned == strings.TrimSuffix(approvedDir, string(filepath.Separator)) {
return true
}
}
return false
}
// GetSessionApprovedPaths returns a copy of all currently approved paths.
func GetSessionApprovedPaths() []string {
globalSessionApproval.mu.RLock()
defer globalSessionApproval.mu.RUnlock()
paths := make([]string, 0, len(globalSessionApproval.approvedPaths))
for p := range globalSessionApproval.approvedPaths {
paths = append(paths, p)
}
return paths
}
// ClearSessionApprovals removes all session-level read approvals.
func ClearSessionApprovals() {
globalSessionApproval.mu.Lock()
defer globalSessionApproval.mu.Unlock()
globalSessionApproval.approvedPaths = make(map[string]bool)
}