aboutsummaryrefslogtreecommitdiff
path: root/src/server/clipboard_image.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-07 00:07:24 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-07 16:29:44 +0300
commit3c2b46d24aa6c8011a1e198143752f2aa414d585 (patch)
treea52280bccc824ca656f8bc986a756f30901974e4 /src/server/clipboard_image.rs
parent5d7e56737ef30d9de5802b0684a9428c40131dda (diff)
feat: add native windows beta support
Diffstat (limited to 'src/server/clipboard_image.rs')
-rw-r--r--src/server/clipboard_image.rs41
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;