diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 00:07:24 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 16:29:44 +0300 |
| commit | 3c2b46d24aa6c8011a1e198143752f2aa414d585 (patch) | |
| tree | a52280bccc824ca656f8bc986a756f30901974e4 /src/server/clipboard_image.rs | |
| parent | 5d7e56737ef30d9de5802b0684a9428c40131dda (diff) | |
feat: add native windows beta support
Diffstat (limited to 'src/server/clipboard_image.rs')
| -rw-r--r-- | src/server/clipboard_image.rs | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/server/clipboard_image.rs b/src/server/clipboard_image.rs index 299267d3..70072f2d 100644 --- a/src/server/clipboard_image.rs +++ b/src/server/clipboard_image.rs @@ -15,8 +15,6 @@ pub(crate) fn stage( extension: &str, data: &[u8], ) -> io::Result<StagedClipboardImage> { - use std::os::unix::fs::OpenOptionsExt; - let extension = sanitize_extension(extension); let dir = ensure_staging_dir()?; cleanup_stale(&dir); @@ -30,12 +28,10 @@ pub(crate) fn stage( let path = dir.join(format!( "client-{client_id}-clipboard-{unique}-{attempt}.{extension}" )); - let mut file = match fs::OpenOptions::new() - .write(true) - .create_new(true) - .mode(0o600) - .open(&path) - { + let mut options = fs::OpenOptions::new(); + options.write(true).create_new(true); + restrict_file_options(&mut options); + let mut file = match options.open(&path) { Ok(file) => file, Err(err) if err.kind() == io::ErrorKind::AlreadyExists => continue, Err(err) => return Err(err), @@ -76,13 +72,14 @@ fn sanitize_extension(extension: &str) -> &'static str { } fn staging_dir() -> PathBuf { + #[cfg(unix)] let user_id = unsafe { libc::geteuid() }; + #[cfg(windows)] + let user_id = std::process::id(); std::env::temp_dir().join(format!("herdr-clipboard-images-{user_id}")) } fn ensure_staging_dir() -> io::Result<PathBuf> { - use std::os::unix::fs::PermissionsExt; - let dir = staging_dir(); fs::create_dir_all(&dir)?; let metadata = fs::metadata(&dir)?; @@ -92,10 +89,32 @@ fn ensure_staging_dir() -> io::Result<PathBuf> { dir.display() ))); } - fs::set_permissions(&dir, fs::Permissions::from_mode(0o700))?; + restrict_dir_permissions(&dir)?; Ok(dir) } +#[cfg(unix)] +fn restrict_file_options(options: &mut fs::OpenOptions) { + use std::os::unix::fs::OpenOptionsExt; + + options.mode(0o600); +} + +#[cfg(windows)] +fn restrict_file_options(_options: &mut fs::OpenOptions) {} + +#[cfg(unix)] +fn restrict_dir_permissions(dir: &Path) -> io::Result<()> { + use std::os::unix::fs::PermissionsExt; + + fs::set_permissions(dir, fs::Permissions::from_mode(0o700)) +} + +#[cfg(windows)] +fn restrict_dir_permissions(_dir: &Path) -> io::Result<()> { + Ok(()) +} + fn cleanup_stale(dir: &Path) { let Ok(entries) = fs::read_dir(dir) else { return; |
