diffplug / diffplug/dormouse

dor send --stdin interprets backslash escapes in piped bytes

Đang mở
#355 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
TypeScript
Star
5
Fork
0
Merge trung bình
14 giờ 13 phút
Pull request đã merge (30 ngày)
199

Mô tả

## `dor send --stdin` interprets backslash escapes in piped bytes, corrupting the documented use case

`dor send --stdin` reads standard input and forwards it as a **text** input:

```ts
if (flags.stdin === true) {
if (!readStdin) return { ok: false, message: 'stdin is not available' };
return { ok: true, value: [{ kind: 'text', text: await readStdin() }] };
}
```
([send.ts:183-186](https://github.com/diffplug/dormouse/blob/a1782f19b7d8363997eb37c440d1cbc8dfe13829/dor/src/commands/send.ts#L183-L186))

Text inputs then run through `interpretTextEscapes` unless `--raw` is set:

```ts
input += raw ? item.text : interpretTextEscapes(item.text);
```
([send.ts:227-228](https://github.com/diffplug/dormouse/blob/a1782f19b7d8363997eb37c440d1cbc8dfe13829/dor/src/commands/send.ts#L227-L228), converting `\n \r \t \\` at [send.ts:238-253](https://github.com/diffplug/dormouse/blob/a1782f19b7d8363997eb37c440d1cbc8dfe13829/dor/src/commands/send.ts#L238-L253))

### Why this is a footgun for `--stdin`

The flagship stdin example in the help is:

```
cat script.sh | dor send surface:3 --stdin
```
([send.ts:115](https://github.com/diffplug/dormouse/blob/a1782f19b7d8363997eb37c440d1cbc8dfe13829/dor/src/commands/send.ts#L115))

Bytes arriving on stdin are already literal — they are not a shell-authored string where a two-character `\t` stands in for a tab. Shell scripts routinely contain literal backslash sequences (`printf 'a\tb'`, `sed 's/\n/ /'`, `grep -P '\d'`, Windows paths with `\\`). Piping such a file through `--stdin` silently rewrites every `\n`/`\r`/`\t`/`\\`, so the text typed into the target terminal is not the file's contents.

**Repro:** `printf 'printf "a\\tb\\n"\n' | dor send surface:3 --stdin` types a real TAB and newline into the middle of the line instead of the literal `\t`/`\n` the script source contains.

The escape interpretation is desirable for `--text "echo hi\nthere"` (a human types escapes on the command line), but for `--stdin` the input is already-real bytes.

### Design question (why an issue, not a drive-by PR)

The current behavior is *consistent with* the documented contract — the help says "Text input interprets backslash escapes … unless `--raw` is set" ([send.ts:97](https://github.com/diffplug/dormouse/blob/a1782f19b7d8363997eb37c440d1cbc8dfe13829/dor/src/commands/send.ts#L97)), and `--stdin` is documented as text input — so flipping the default is a contract change that needs a maintainer call. Options:

1. **Make `--stdin` raw by default** — treat piped bytes as literal; keep `--text` interpreting escapes. Most aligned with the `cat script.sh | …` example. Would need an opt-in flag if anyone wants escape interpretation on stdin.
2. **Keep current behavior, document it** — call out at the `--stdin` help that it interprets escapes and that `--raw` is needed for literal file contents.

I lean toward option 1, but it changes documented behavior, so I'm leaving the call to a maintainer. Happy to open the PR (including a regression test that pipes a script containing `\t` and asserts the bytes are preserved) once a direction is chosen.

Surfaced by the nightly code-quality survey.

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu trong dor/src/commands/send.ts, tại phần xử lý stdin và chuyển đổi escape của văn bản được mô tả trong issue. Xác nhận hành vi hiện tại bằng ví dụ piping được ghi trong tài liệu, sau đó chờ maintainer lựa chọn giữa raw stdin theo mặc định và việc ghi lại hành vi hiện có. Hoàn tất có nghĩa là contract được chọn đã được triển khai hoặc ghi lại trong tài liệu, kèm một regression test bảo toàn các byte liên quan.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
typescript
Lĩnh vực
cli
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
50/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.