diff options
Diffstat (limited to 'alacritty_terminal')
-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 |
3 files changed, 43 insertions, 2 deletions
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, |