diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | Cargo.lock | 2 | ||||
-rw-r--r-- | alacritty/Cargo.toml | 2 | ||||
-rw-r--r-- | alacritty_terminal/Cargo.toml | 2 | ||||
-rw-r--r-- | alacritty_terminal/src/config/mod.rs | 25 | ||||
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 18 | ||||
-rw-r--r-- | extra/man/alacritty.5.scd | 14 |
7 files changed, 60 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f4957ef..c6801762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - The default colorscheme is now based on base16 classic dark - IME popup now tries to not obscure the current cursor line - The double click threshold was raised to `400ms` +- OSC 52 paste ability is now **disabled by default**; use `terminal.osc52` to adjust it ### Fixed @@ -72,7 +72,7 @@ dependencies = [ [[package]] name = "alacritty_terminal" -version = "0.19.2-dev" +version = "0.20.0-dev" dependencies = [ "alacritty_config", "alacritty_config_derive", diff --git a/alacritty/Cargo.toml b/alacritty/Cargo.toml index 5ab00f2b..d983d962 100644 --- a/alacritty/Cargo.toml +++ b/alacritty/Cargo.toml @@ -11,7 +11,7 @@ rust-version = "1.65.0" [dependencies.alacritty_terminal] path = "../alacritty_terminal" -version = "0.19.2-dev" +version = "0.20.0-dev" default-features = false [dependencies.alacritty_config_derive] diff --git a/alacritty_terminal/Cargo.toml b/alacritty_terminal/Cargo.toml index 5782a8fb..2f5e930a 100644 --- a/alacritty_terminal/Cargo.toml +++ b/alacritty_terminal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "alacritty_terminal" -version = "0.19.2-dev" +version = "0.20.0-dev" authors = ["Christian Duerr <contact@christianduerr.com>", "Joe Wilm <joe@jwilm.com>"] license = "Apache-2.0" description = "Library for writing terminal emulators" diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs index 80be4d16..e70389ec 100644 --- a/alacritty_terminal/src/config/mod.rs +++ b/alacritty_terminal/src/config/mod.rs @@ -31,11 +31,36 @@ pub struct Config { /// Cursor configuration. pub cursor: Cursor, + /// Terminal specific settings. + pub terminal: Terminal, + #[config(flatten)] pub pty_config: PtyConfig, } #[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq, Default)] +pub struct Terminal { + // OSC 52 handling (clipboard handling). + pub osc52: Osc52, +} + +#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq, Default)] +pub enum Osc52 { + /// The handling of the escape sequence is disabled. + Disabled, + /// Only copy sequence is accepted. + /// + /// This option is the default as a compromiss between entirely + /// disabling it (the most secure) and allowing `paste` (the less secure). + #[default] + OnlyCopy, + /// Only paste sequence is accepted. + OnlyPaste, + /// Both are accepted. + CopyPaste, +} + +#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct PtyConfig { /// Path to a shell program to run on startup. pub shell: Option<Program>, diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index 7c4abb57..2e66b402 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -12,7 +12,7 @@ use vte::ansi::{Hyperlink as VteHyperlink, Rgb as VteRgb}; use crate::ansi::{ self, Attr, CharsetIndex, Color, CursorShape, CursorStyle, Handler, NamedColor, StandardCharset, }; -use crate::config::Config; +use crate::config::{Config, Osc52, Terminal}; use crate::event::{Event, EventListener}; use crate::grid::{Dimensions, Grid, GridIterator, Scroll}; use crate::index::{self, Boundary, Column, Direction, Line, Point, Side}; @@ -304,6 +304,9 @@ pub struct Term<T> { /// Information about damaged cells. damage: TermDamageState, + + /// Config directly for the terminal. + config: Terminal, } impl<T> Term<T> { @@ -363,6 +366,7 @@ impl<T> Term<T> { title_stack: Vec::new(), selection: None, damage, + config: config.terminal.clone(), } } @@ -461,6 +465,8 @@ impl<T> Term<T> { self.grid.update_history(config.scrolling.history() as usize); } + self.config = config.terminal.clone(); + // Damage everything on config updates. self.mark_fully_damaged(); } @@ -1539,6 +1545,11 @@ impl<T: EventListener> Handler for Term<T> { /// Store data into clipboard. #[inline] fn clipboard_store(&mut self, clipboard: u8, base64: &[u8]) { + if !matches!(self.config.osc52, Osc52::OnlyCopy | Osc52::CopyPaste) { + debug!("Denied osc52 store"); + return; + } + let clipboard_type = match clipboard { b'c' => ClipboardType::Clipboard, b'p' | b's' => ClipboardType::Selection, @@ -1555,6 +1566,11 @@ impl<T: EventListener> Handler for Term<T> { /// Load data from clipboard. #[inline] fn clipboard_load(&mut self, clipboard: u8, terminator: &str) { + if !matches!(self.config.osc52, Osc52::OnlyPaste | Osc52::CopyPaste) { + debug!("Denied osc52 load"); + return; + } + let clipboard_type = match clipboard { b'c' => ClipboardType::Clipboard, b'p' | b's' => ClipboardType::Selection, diff --git a/extra/man/alacritty.5.scd b/extra/man/alacritty.5.scd index ec670e75..f9e82ba3 100644 --- a/extra/man/alacritty.5.scd +++ b/extra/man/alacritty.5.scd @@ -534,6 +534,20 @@ This section documents the *[cursor]* table of the configuration file. Default: _0.15_ +# Terminal + +This section documents the *[terminal]* table of the configuration file. + +*osc52* "Disabled" | "OnlyCopy" | "OnlyPaste" | "CopyPaste" + + Controls the ability to write to the system clipboard with the _OSC 52_ + escape sequence. While this escape sequence is useful to copy contents + from the remote server, allowing any application to read from the clipboard + can be easily abused while not providing significant benefits over + explicitly pasting text. + + Default: _"OnlyCopy"_ + # Mouse This section documents the *[mouse]* table of the configuration file. |