Skip to content

Commit 677b087

Browse files
committed
Test buffer file capture permissions
1 parent 5ec5590 commit 677b087

2 files changed

Lines changed: 59 additions & 2 deletions

File tree

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ Known groups:
247247
| `@kill` | `kill-session`, `kill-window`, `kill-pane`, `detach-client` |
248248
| `@socket` | `socket-for-path` |
249249

250+
Buffer file operations (`save-buffer` and `load-buffer`) are intentionally part of the existing capture permission surface: `[security].allow_capture = false` denies them alongside `capture-pane` and buffer inspection tools. Use `[security.tools]` for finer-grained filtering (for example, deny `save-buffer`, `load-buffer`, or `@buffer-write`) when capture should remain available but filesystem-backed buffer import/export should not. No separate `allow_buffer_read` or `allow_buffer_write` configuration exists.
251+
250252
## Tools
251253

252254
### Core Utilities
@@ -294,12 +296,12 @@ Known groups:
294296
### Buffer Management
295297
- **list-buffers** - List tmux paste buffers
296298
- **show-buffer** - Show buffer contents (supports offset/max bytes; defaults to 64KB)
297-
- **save-buffer** - Save buffer contents to a file
299+
- **save-buffer** - Save buffer contents to a file (writes to the server filesystem; governed by `allow_capture` and `[security.tools]`)
298300
- **delete-buffer** - Delete a buffer
299301

300302
### Additional Buffer Tools
301303
- **set-buffer** - Create or replace a buffer with UTF-8 content
302-
- **load-buffer** - Load buffer contents from a file
304+
- **load-buffer** - Load buffer contents from a file (reads from the server filesystem; governed by `allow_capture` and `[security.tools]`)
303305
- **append-buffer** - Append UTF-8 content to an existing buffer
304306
- **rename-buffer** - Emulate rename by copying then deleting
305307
- **search-buffer** - Structured search over one or more buffers (literal/regex + metadata)

src/server.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3457,6 +3457,61 @@ mod tests {
34573457
assert_eq!(first_text(&result), "stub-buffer");
34583458
}
34593459

3460+
#[tokio::test]
3461+
async fn buffer_file_operations_allowed_by_capture_policy() {
3462+
let _stub = TmuxStub::new();
3463+
let server = server_with_policy("[security]\nallow_capture = true\n");
3464+
3465+
let result = server
3466+
.load_buffer(Parameters(LoadBufferInput {
3467+
name: "buffer0".into(),
3468+
path: "tests/fixtures/old-man-and-the-sea.txt".into(),
3469+
socket: None,
3470+
}))
3471+
.await
3472+
.expect("load buffer");
3473+
assert_eq!(result.is_error, Some(false));
3474+
assert!(first_text(&result).contains("loaded"));
3475+
3476+
let result = server
3477+
.save_buffer(Parameters(SaveBufferInput {
3478+
name: "buffer0".into(),
3479+
path: "/tmp/buffer.txt".into(),
3480+
socket: None,
3481+
}))
3482+
.await
3483+
.expect("save buffer");
3484+
assert_eq!(result.is_error, Some(false));
3485+
assert!(first_text(&result).contains("saved"));
3486+
}
3487+
3488+
#[tokio::test]
3489+
async fn buffer_file_operations_denied_by_capture_policy() {
3490+
let server = server_with_policy("[security]\nallow_capture = false\n");
3491+
3492+
let result = server
3493+
.load_buffer(Parameters(LoadBufferInput {
3494+
name: "buffer0".into(),
3495+
path: "tests/fixtures/old-man-and-the-sea.txt".into(),
3496+
socket: None,
3497+
}))
3498+
.await
3499+
.expect("load buffer");
3500+
assert_eq!(result.is_error, Some(true));
3501+
assert!(first_text(&result).contains("not allowed by security policy"));
3502+
3503+
let result = server
3504+
.save_buffer(Parameters(SaveBufferInput {
3505+
name: "buffer0".into(),
3506+
path: "/tmp/buffer.txt".into(),
3507+
socket: None,
3508+
}))
3509+
.await
3510+
.expect("save buffer");
3511+
assert_eq!(result.is_error, Some(true));
3512+
assert!(first_text(&result).contains("not allowed by security policy"));
3513+
}
3514+
34603515
#[tokio::test]
34613516
async fn save_delete_and_detach_happy_path() {
34623517
let _stub = TmuxStub::new();

0 commit comments

Comments
 (0)