diff --git a/Cargo.lock b/Cargo.lock index 8ad082e69..db8f4316a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -294,9 +294,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" [[package]] name = "base91" @@ -2304,9 +2304,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" +checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" [[package]] name = "is-terminal" @@ -2906,7 +2906,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-trait", - "base64 0.20.0", + "base64 0.21.0", "bintree", "bitflags", "chrono", @@ -4993,7 +4993,7 @@ name = "termwiz" version = "0.19.0" dependencies = [ "anyhow", - "base64 0.20.0", + "base64 0.21.0", "bitflags", "cassowary", "criterion", @@ -6048,7 +6048,7 @@ dependencies = [ "anyhow", "assert_fs", "async_ossl", - "base64 0.20.0", + "base64 0.21.0", "bitflags", "camino", "clap 4.0.32", diff --git a/mux/Cargo.toml b/mux/Cargo.toml index 9d6e0a02a..50fb4d4c7 100644 --- a/mux/Cargo.toml +++ b/mux/Cargo.toml @@ -9,7 +9,7 @@ edition = "2018" [dependencies] anyhow = "1.0" async-trait = "0.1" -base64 = "0.20" +base64 = "0.21" bintree = { path = "../bintree" } bitflags = "1.3" chrono = { version = "0.4", features = ["serde"] } diff --git a/termwiz/Cargo.toml b/termwiz/Cargo.toml index 43ffc4de2..30cb65313 100644 --- a/termwiz/Cargo.toml +++ b/termwiz/Cargo.toml @@ -12,7 +12,7 @@ readme = "README.md" [dependencies] # backtrace = "0.3" -base64 = "0.20" +base64 = "0.21" bitflags = "1.3" cassowary = {version="0.3", optional=true} anyhow = "1.0" diff --git a/termwiz/src/escape/apc.rs b/termwiz/src/escape/apc.rs index bfd1649d8..914439f7d 100644 --- a/termwiz/src/escape/apc.rs +++ b/termwiz/src/escape/apc.rs @@ -1,3 +1,4 @@ +use crate::escape::osc::{base64_decode, base64_encode}; use std::collections::BTreeMap; use std::fmt::{Display, Error as FmtError, Formatter}; use std::io::{Read, Seek}; @@ -112,17 +113,17 @@ impl KittyImageData { match t { "d" => Some(Self::Direct(String::from_utf8(payload.to_vec()).ok()?)), "f" => Some(Self::File { - path: String::from_utf8(base64::decode(payload.to_vec()).ok()?).ok()?, + path: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), "t" => Some(Self::TemporaryFile { - path: String::from_utf8(base64::decode(payload.to_vec()).ok()?).ok()?, + path: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), "s" => Some(Self::SharedMem { - name: String::from_utf8(base64::decode(payload.to_vec()).ok()?).ok()?, + name: String::from_utf8(base64_decode(payload.to_vec()).ok()?).ok()?, data_size: geti(keys, "S"), data_offset: geti(keys, "O"), }), @@ -141,7 +142,7 @@ impl KittyImageData { data_size, } => { keys.insert("t", "f".to_string()); - keys.insert("payload", base64::encode(&path)); + keys.insert("payload", base64_encode(&path)); set(keys, "S", data_size); set(keys, "S", data_offset); } @@ -151,7 +152,7 @@ impl KittyImageData { data_size, } => { keys.insert("t", "t".to_string()); - keys.insert("payload", base64::encode(&path)); + keys.insert("payload", base64_encode(&path)); set(keys, "S", data_size); set(keys, "S", data_offset); } @@ -161,7 +162,7 @@ impl KittyImageData { data_size, } => { keys.insert("t", "s".to_string()); - keys.insert("payload", base64::encode(&name)); + keys.insert("payload", base64_encode(&name)); set(keys, "S", data_size); set(keys, "S", data_offset); } @@ -195,7 +196,7 @@ impl KittyImageData { match self { Self::Direct(data) => { - base64::decode(data).or_else(|_| Err(std::io::ErrorKind::InvalidInput.into())) + base64_decode(data).or_else(|_| Err(std::io::ErrorKind::InvalidInput.into())) } Self::File { path, diff --git a/termwiz/src/escape/osc.rs b/termwiz/src/escape/osc.rs index c8646e7f2..fd0b051b0 100644 --- a/termwiz/src/escape/osc.rs +++ b/termwiz/src/escape/osc.rs @@ -1,6 +1,7 @@ use crate::color::SrgbaTuple; pub use crate::hyperlink::Hyperlink; use crate::{bail, ensure, Result}; +use base64::Engine; use bitflags::bitflags; use num_derive::*; use num_traits::FromPrimitive; @@ -168,7 +169,7 @@ impl OperatingSystemCommand { Selection::try_parse(osc[1]).map(OperatingSystemCommand::QuerySelection) } else if osc.len() == 3 { let sel = Selection::try_parse(osc[1])?; - let bytes = base64::decode(osc[2])?; + let bytes = base64_decode(osc[2])?; let s = String::from_utf8(bytes)?; Ok(OperatingSystemCommand::SetSelection(sel, s)) } else { @@ -505,7 +506,7 @@ impl Display for OperatingSystemCommand { } ClearSelection(s) => write!(f, "52;{}", s)?, QuerySelection(s) => write!(f, "52;{};?", s)?, - SetSelection(s, val) => write!(f, "52;{};{}", s, base64::encode(val))?, + SetSelection(s, val) => write!(f, "52;{};{}", s, base64_encode(val))?, SystemNotification(s) => write!(f, "9;{}", s)?, ITermProprietary(i) => i.fmt(f)?, FinalTermSemanticPrompt(i) => i.fmt(f)?, @@ -907,7 +908,7 @@ impl ITermFileData { let param = if idx == last { // The final argument contains `:base64`, so look for that if let Some(colon) = param.iter().position(|c| *c == b':') { - data = Some(base64::decode(¶m[colon + 1..])?); + data = Some(base64_decode(¶m[colon + 1..])?); ¶m[..colon] } else { // If we don't find the colon in the last piece, we've @@ -935,7 +936,7 @@ impl ITermFileData { let name = params .get("name") - .and_then(|s| base64::decode(s).ok()) + .and_then(|s| base64_decode(s).ok()) .and_then(|b| String::from_utf8(b).ok()); let size = params.get("size").and_then(|s| s.parse().ok()); let width = params @@ -983,7 +984,7 @@ impl Display for ITermFileData { } if let Some(ref name) = self.name { sep = emit_sep(sep, f)?; - write!(f, "name={}", base64::encode(name))?; + write!(f, "name={}", base64_encode(name))?; } if self.width != ITermDimension::Automatic { sep = emit_sep(sep, f)?; @@ -1010,7 +1011,7 @@ impl Display for ITermFileData { if sep == "=" { write!(f, "=")?; } - write!(f, ":{}", base64::encode(&self.data))?; + write!(f, ":{}", base64_encode(&self.data))?; Ok(()) } } @@ -1145,13 +1146,13 @@ impl ITermProprietary { }; if osc.len() == 3 && keyword == "Copy" && p1_empty { - return Ok(ITermProprietary::Copy(String::from_utf8(base64::decode( + return Ok(ITermProprietary::Copy(String::from_utf8(base64_decode( osc[2], )?)?)); } if osc.len() == 3 && keyword == "SetBadgeFormat" && p1_empty { return Ok(ITermProprietary::SetBadgeFormat(String::from_utf8( - base64::decode(osc[2])?, + base64_decode(osc[2])?, )?)); } @@ -1183,7 +1184,7 @@ impl ITermProprietary { if let (Some(k), Some(v)) = (p1, p2) { return Ok(ITermProprietary::SetUserVar { name: k.to_string(), - value: String::from_utf8(base64::decode(v)?)?, + value: String::from_utf8(base64_decode(v)?)?, }); } } @@ -1222,6 +1223,18 @@ impl ITermProprietary { } } +/// base64::encode is deprecated, so make a less frustrating helper +pub(crate) fn base64_encode>(s: T) -> String { + base64::engine::general_purpose::STANDARD.encode(s) +} + +/// base64::decode is deprecated, so make a less frustrating helper +pub(crate) fn base64_decode>( + s: T, +) -> std::result::Result, base64::DecodeError> { + base64::engine::general_purpose::STANDARD.decode(s) +} + impl Display for ITermProprietary { fn fmt(&self, f: &mut Formatter) -> FmtResult { write!(f, "1337;")?; @@ -1251,12 +1264,12 @@ impl Display for ITermProprietary { f, "ReportCellSize={height_pixels:.1};{width_pixels:.1};{scale:.1}", )?, - Copy(s) => write!(f, "Copy=;{}", base64::encode(s))?, - ReportVariable(s) => write!(f, "ReportVariable={}", base64::encode(s))?, + Copy(s) => write!(f, "Copy=;{}", base64_encode(s))?, + ReportVariable(s) => write!(f, "ReportVariable={}", base64_encode(s))?, SetUserVar { name, value } => { - write!(f, "SetUserVar={}={}", name, base64::encode(value))? + write!(f, "SetUserVar={}={}", name, base64_encode(value))? } - SetBadgeFormat(s) => write!(f, "SetBadgeFormat={}", base64::encode(s))?, + SetBadgeFormat(s) => write!(f, "SetBadgeFormat={}", base64_encode(s))?, File(file) => file.fmt(f)?, UnicodeVersion(ITermUnicodeVersionOp::Set(n)) => write!(f, "UnicodeVersion={}", n)?, UnicodeVersion(ITermUnicodeVersionOp::Push(Some(label))) => { diff --git a/wezterm-ssh/Cargo.toml b/wezterm-ssh/Cargo.toml index b0bb144a5..fe42c371b 100644 --- a/wezterm-ssh/Cargo.toml +++ b/wezterm-ssh/Cargo.toml @@ -18,7 +18,7 @@ vendored-openssl-libssh-rs = ["libssh-rs/vendored-openssl"] [dependencies] anyhow = "1.0" -base64 = "0.20" +base64 = "0.21" bitflags = "1.3" camino = "1.0" dirs-next = "2.0" diff --git a/wezterm-ssh/src/host.rs b/wezterm-ssh/src/host.rs index cee6f2f95..cb53f95a7 100644 --- a/wezterm-ssh/src/host.rs +++ b/wezterm-ssh/src/host.rs @@ -115,11 +115,12 @@ impl crate::sessioninner::SessionInner { let fingerprint = sess .host_key_hash(ssh2::HashType::Sha256) .map(|fingerprint| { - let engine = base64::engine::fast_portable::FastPortable::from( + use base64::Engine; + let engine = base64::engine::general_purpose::GeneralPurpose::new( &base64::alphabet::STANDARD, - base64::engine::fast_portable::NO_PAD, + base64::engine::general_purpose::NO_PAD, ); - format!("SHA256:{}", base64::encode_engine(fingerprint, &engine)) + format!("SHA256:{}", engine.encode(fingerprint)) }) .or_else(|| { // Querying for the Sha256 can fail if for example we were linked