From fbf8345d90502ef4fa4bee099c0e8fd1ec6ea859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Wed, 30 Apr 2025 00:24:29 +0800 Subject: [PATCH] feat: checks in `ya pub` and `ya emit` subcommands to verify receiver exists and has necessary abilities (#2696) --- Cargo.lock | 28 ++++++++++++++-------------- Cargo.toml | 2 +- yazi-boot/Cargo.toml | 2 +- yazi-cli/Cargo.toml | 2 +- yazi-cli/src/args.rs | 8 ++++---- yazi-dds/src/client.rs | 19 ++++++++++++++----- 6 files changed, 35 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8607eef6..8d8ac2ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,9 +389,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f5378ea264ad4f82bbc826628b5aad714a75abf6ece087e923010eb937fb6" +checksum = "be8c97f3a6f02b9e24cadc12aaba75201d18754b53ea0a9d99642f806ccdb4c9" dependencies = [ "clap", ] @@ -787,7 +787,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2132,7 +2132,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2145,7 +2145,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2595,9 +2595,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900f6c86a685850b1bc9f6223b20125115ee3f31e01207d81655bbcc0aea9231" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -2616,9 +2616,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.25" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "serde", @@ -2630,9 +2630,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28391a4201ba7eb1984cfeb6862c0b3ea2cfe23332298967c749dddc0d6cd976" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" [[package]] name = "tracing" @@ -3000,7 +3000,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3205,9 +3205,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 9c265ec0..996b8227 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ syntect = { version = "5.2.0", default-features = false, features = tokio = { version = "1.44.2", features = [ "full" ] } tokio-stream = "0.1.17" tokio-util = "0.7.15" -toml = { version = "0.8.21" } +toml = { version = "0.8.22" } tracing = { version = "0.1.41", features = [ "max_level_debug", "release_max_level_debug" ] } twox-hash = { version = "2.1.0", default-features = false, features = [ "std", "random", "xxhash3_128" ] } unicode-width = "0.2.0" diff --git a/yazi-boot/Cargo.toml b/yazi-boot/Cargo.toml index f94f5116..232f7fe6 100644 --- a/yazi-boot/Cargo.toml +++ b/yazi-boot/Cargo.toml @@ -25,7 +25,7 @@ yazi-shared = { path = "../yazi-shared", version = "25.4.8" } # External dependencies clap = { workspace = true } -clap_complete = "4.5.47" +clap_complete = "4.5.48" clap_complete_fig = "4.5.2" clap_complete_nushell = "4.5.5" vergen-gitcl = { version = "1.0.8", features = [ "build", "rustc" ] } diff --git a/yazi-cli/Cargo.toml b/yazi-cli/Cargo.toml index 1b76706e..ce1b87b9 100644 --- a/yazi-cli/Cargo.toml +++ b/yazi-cli/Cargo.toml @@ -31,7 +31,7 @@ yazi-shared = { path = "../yazi-shared", version = "25.4.8" } # External build dependencies anyhow = { workspace = true } clap = { workspace = true } -clap_complete = "4.5.47" +clap_complete = "4.5.48" clap_complete_fig = "4.5.2" clap_complete_nushell = "4.5.5" serde_json = { workspace = true } diff --git a/yazi-cli/src/args.rs b/yazi-cli/src/args.rs index aecbce7b..c2a3a4d1 100644 --- a/yazi-cli/src/args.rs +++ b/yazi-cli/src/args.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; use anyhow::{Result, bail}; use clap::{Parser, Subcommand, command}; -use yazi_shared::event::Cmd; +use yazi_shared::{Id, event::Cmd}; #[derive(Parser)] #[command(name = "Ya", about, long_about = None)] @@ -43,7 +43,7 @@ pub(super) struct CommandEmit { #[derive(clap::Args)] pub(super) struct CommandEmitTo { /// The receiver ID. - pub(super) receiver: u64, + pub(super) receiver: Id, /// The name of the command. pub(super) name: String, /// The arguments of the command. @@ -89,7 +89,7 @@ pub(super) struct CommandPub { impl CommandPub { #[allow(dead_code)] - pub(super) fn receiver() -> Result { + pub(super) fn receiver() -> Result { if let Some(s) = std::env::var("YAZI_PID").ok().filter(|s| !s.is_empty()) { Ok(s.parse()?) } else { @@ -102,7 +102,7 @@ impl CommandPub { pub(super) struct CommandPubTo { /// The receiver ID. #[arg(index = 1)] - pub(super) receiver: u64, + pub(super) receiver: Id, /// The kind of message. #[arg(index = 2)] pub(super) kind: String, diff --git a/yazi-dds/src/client.rs b/yazi-dds/src/client.rs index 10377710..430cff7d 100644 --- a/yazi-dds/src/client.rs +++ b/yazi-dds/src/client.rs @@ -65,7 +65,7 @@ impl Client { } /// Connect to an existing server to send a single message. - pub async fn shot(kind: &str, receiver: u64, body: &str) -> Result<()> { + pub async fn shot(kind: &str, receiver: Id, body: &str) -> Result<()> { Body::validate(kind)?; let payload = format!( @@ -79,12 +79,12 @@ impl Client { writer.flush().await?; drop(writer); - let mut version = None; + let (mut peers, mut version) = Default::default(); while let Ok(Some(line)) = lines.next_line().await { match line.split(',').next() { - Some("hey") if version.is_none() => { + Some("hey") => { if let Ok(Body::Hey(hey)) = Payload::from_str(&line).map(|p| p.body) { - version = Some(hey.version); + (peers, version) = (hey.peers, Some(hey.version)); } } Some("bye") => break, @@ -94,11 +94,20 @@ impl Client { if version.as_deref() != Some(BodyHi::version()) { bail!( - "Incompatible version (Ya {}, Yazi {}), please restart all `ya` and `yazi` processes if you upgrade either one.", + "Incompatible version (Ya {}, Yazi {}). Restart all `ya` and `yazi` processes if you upgrade either one.", BodyHi::version(), version.as_deref().unwrap_or("Unknown") ); } + + match peers.get(&receiver).map(|p| p.able(kind)) { + Some(true) => {} + Some(false) => { + bail!("Receiver `{receiver}` does not have the ability to receive `{kind}` messages.") + } + None => bail!("Receiver `{receiver}` not found. Check if the receiver is running."), + } + Ok(()) }