diff --git a/Cargo.lock b/Cargo.lock index 240ee14..22b900f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -423,6 +423,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -497,6 +503,7 @@ dependencies = [ "objc2-app-kit", "objc2-core-foundation", "objc2-foundation", + "percent-encoding", "pollster", "raw-window-handle", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 7533900..898d4f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,6 +72,7 @@ windows-sys = { version = "0.61", features = [ ] } [target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] +percent-encoding = "2" libc = "0.2" # XDG Desktop Portal pollster = { version = "0.4", optional = true } diff --git a/src/backend/xdg_desktop_portal/portal/mod.rs b/src/backend/xdg_desktop_portal/portal/mod.rs index 42993fe..a2a0bf1 100644 --- a/src/backend/xdg_desktop_portal/portal/mod.rs +++ b/src/backend/xdg_desktop_portal/portal/mod.rs @@ -1,5 +1,6 @@ use std::{ - ffi::{CStr, CString}, + ffi::{CStr, CString, OsStr}, + os::unix::ffi::OsStrExt, path::PathBuf, }; @@ -15,11 +16,13 @@ pub use file_dialog::{FileFilter, FilePath, HandleToken, OpenFileOptions, SaveFi pub fn uris_to_paths(uris: Vec) -> Vec { uris.into_iter() .filter_map(|uri| { - uri.into_string() - .inspect_err(|err| log::error!("Ignoring uri: {err:?}")) - .ok() + let bytes: Vec = percent_encoding::percent_decode(uri.as_bytes()).collect(); + let Some(path) = bytes.strip_prefix(b"file://") else { + log::error!("Ignoring uri: {bytes:?} lacks `file://`"); + return None; + }; + Some(PathBuf::from(OsStr::from_bytes(path))) }) - .filter_map(|uri| uri.strip_prefix("file://").map(PathBuf::from)) .collect() }