From 22f01131d8cb4e0c9786eb481525f5a8cfee5b19 Mon Sep 17 00:00:00 2001 From: batistalucasv Date: Tue, 10 Nov 2026 21:47:52 -0300 Subject: [PATCH] Clipboard: use process-unique token for Windows clipboard ownership (#6205) --- apps/wordcraft/src/clipboard.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/wordcraft/src/clipboard.rs b/apps/wordcraft/src/clipboard.rs index 3721325814..901e6c9812 100644 --- a/apps/wordcraft/src/clipboard.rs +++ b/apps/wordcraft/src/clipboard.rs @@ -538,18 +538,35 @@ mod platform { const OWNER_FORMAT: &str = "WordCraft Copy Owner"; + /// Process-unique ownership token placed into Windows clipboard marker. + fn owner_token() -> [u8; 16] { + static TOKEN: std::sync::OnceLock<[u8; 16]> = std::sync::OnceLock::new(); + *TOKEN.get_or_init(|| { + let mut b = [0u8; 16]; + let _ = getrandom::fill(&mut b); + b + }) + } + /// Record clipboard ownership for Windows clipboard. pub fn record_own() { let Some(format) = raw::register_format(OWNER_FORMAT) else { return }; let Ok(_open) = Clipboard::new_attempts(10) else { return }; - let _ = raw::set_without_clear(format.get(), &[1u8]); + let _ = raw::set_without_clear(format.get(), &owner_token()); } /// Whether WordCraft still owns the Windows clipboard contents. pub fn is_own() -> bool { let Some(format) = raw::register_format(OWNER_FORMAT) else { return false }; let Ok(_open) = Clipboard::new_attempts(10) else { return false }; - raw::is_format_avail(format.get()) + if !raw::is_format_avail(format.get()) { + return false; + } + let mut out = Vec::new(); + if raw::get_vec(format.get(), &mut out).is_err() { + return false; + } + out == owner_token() } /// Windows supports clipboard setting via arboard and clipboard_win.