Skip to content

Commit d29d346

Browse files
SAY-5SAY-5
andauthored
feat(chat): create session files with 0600 owner-only permissions (#366)
Closes #355. Signed-off-by: SAY-5 <saiasish.cnp@gmail.com> Co-authored-by: SAY-5 <saiasish.cnp@gmail.com>
1 parent 262af09 commit d29d346

3 files changed

Lines changed: 30 additions & 3 deletions

File tree

pkg/chat/chat.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
)
3232

3333
const (
34-
defaultFilePermissions = 0755
34+
defaultFilePermissions = 0600
3535
sessionNameMaxLength = 65
3636
)
3737

pkg/chat/filesystem.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ func (m FilesystemChatSessionManager) SaveSession(sessionName string, messages [
161161
}
162162
slog.Debug("Existing session file opened and truncated")
163163
} else {
164-
// Create file
165-
file, err = os.Create(sessionFilepath)
164+
// Create file with owner-only permissions; sessions may contain sensitive data.
165+
file, err = os.OpenFile(sessionFilepath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, defaultFilePermissions)
166166
if err != nil {
167167
return err
168168
}

pkg/chat/filesystem_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,33 @@ func createTestConfig(t *testing.T) *viper.Viper {
290290
return config
291291
}
292292

293+
func TestFilesystemChatSessionManager_SaveSession_FilePermissions(t *testing.T) {
294+
config := createTestConfig(t)
295+
296+
manager, err := NewFilesystemChatSessionManager(config)
297+
require.NoError(t, err)
298+
299+
messages := createTestMessages()
300+
301+
// New session: file is created via os.Create.
302+
err = manager.SaveSession("perm_new", messages)
303+
require.NoError(t, err)
304+
305+
info, err := os.Stat(filepath.Join(config.GetString("cacheDir"), "perm_new"))
306+
require.NoError(t, err)
307+
require.Equal(t, os.FileMode(0600), info.Mode().Perm(),
308+
"new session file must be owner-only (0600), got %o", info.Mode().Perm())
309+
310+
// Existing session: file is reopened via os.OpenFile with defaultFilePermissions.
311+
err = manager.SaveSession("perm_new", messages)
312+
require.NoError(t, err)
313+
314+
info, err = os.Stat(filepath.Join(config.GetString("cacheDir"), "perm_new"))
315+
require.NoError(t, err)
316+
require.Equal(t, os.FileMode(0600), info.Mode().Perm(),
317+
"reopened session file must remain owner-only (0600), got %o", info.Mode().Perm())
318+
}
319+
293320
func TestFilesystemChatSessionManager_GetSession_ScannerError(t *testing.T) {
294321
config := createTestConfig(t)
295322

0 commit comments

Comments
 (0)