Skip to content

Commit 0b6220e

Browse files
authored
Merge pull request xtermjs#5716 from codekrafter/sanitize-bracketed-paste
feat: sanitize user text when in bracketed paste mode
2 parents 0d119b3 + 898c0d9 commit 0b6220e

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

src/browser/Clipboard.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,14 @@ describe('evaluatePastedTextProcessing', () => {
2929
assert.equal(unbracketedText, 'foo bar');
3030
assert.equal(bracketedText, '\x1b[200~foo bar\x1b[201~');
3131
});
32+
33+
it('should escape embedded escape sequences in pasted text only when bracketed', () => {
34+
const ESC_SYMBOL = '\u241b';
35+
const pastedText = '\x1b[201~foo\x1b[200~bar';
36+
const unbracketedText = Clipboard.bracketTextForPaste(pastedText, false);
37+
const bracketedText = Clipboard.bracketTextForPaste(pastedText, true);
38+
39+
assert.equal(unbracketedText, pastedText, 'non bracketed paste should remain unchanged');
40+
assert.equal(bracketedText, `\x1b[200~${ESC_SYMBOL}[201~foo${ESC_SYMBOL}[200~bar\x1b[201~`);
41+
});
3242
});

src/browser/Clipboard.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ export function prepareTextForTerminal(text: string): string {
1919
* @param text The pasted text to bracket
2020
*/
2121
export function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {
22-
if (bracketedPasteMode) {
23-
return '\x1b[200~' + text + '\x1b[201~';
22+
if (!bracketedPasteMode) {
23+
return text;
2424
}
25-
return text;
25+
// Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)
26+
// by replacing ESC (\x1b) with its visible representation U+241B (␛).
27+
const sanitizedText = text.replace(/\x1b/g, '\u241b');
28+
return `\x1b[200~${sanitizedText}\x1b[201~`;
2629
}
2730

2831
/**

0 commit comments

Comments
 (0)