From a5f8610ee71a7c6d1ee364c6fabee16bacec17ae Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Mon, 29 Sep 2025 21:03:36 +0300 Subject: [PATCH 01/61] define is dmg running --- core/Cargo.lock | 2 +- core/src/analytics/client.rs | 2 +- core/src/auto_auth.rs | 57 ++++++++++++++++++++++++++++++++++++ core/src/flow.rs | 3 ++ core/src/installs.rs | 4 ++- core/src/lib.rs | 1 + src-tauri/Cargo.lock | 9 +++--- 7 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 core/src/auto_auth.rs diff --git a/core/Cargo.lock b/core/Cargo.lock index 02eb7b87..2755dc96 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -257,7 +257,7 @@ dependencies = [ [[package]] name = "dcl-launcher-core" -version = "1.9.5" +version = "1.11.2" dependencies = [ "anyhow", "deranged", diff --git a/core/src/analytics/client.rs b/core/src/analytics/client.rs index fe215e18..e7fcbe99 100644 --- a/core/src/analytics/client.rs +++ b/core/src/analytics/client.rs @@ -14,8 +14,8 @@ use time::OffsetDateTime; use tokio::sync::Mutex; -use crate::environment::AppEnvironment; use crate::analytics::network_info::network_context; +use crate::environment::AppEnvironment; use super::event::Event; use super::session::SessionId; diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs new file mode 100644 index 00000000..05edaf68 --- /dev/null +++ b/core/src/auto_auth.rs @@ -0,0 +1,57 @@ +use anyhow::Result; + +use std::path::Path; + +pub struct AutoAuth {} + +impl AutoAuth { + pub fn try_obtain_auth_token() { + if let Err(e) = Self::obtain_token_internal() { + log::error!("Obtain auth error: {e}"); + } + } + + #[cfg(target_os = "macos")] + fn obtain_token_internal() -> Result<()> { + let path = std::env::current_exe()?; + let parent = path.parent(); + + let Some(parent) = parent else { + log::info!("Exe has no parent and is not running in .dmg"); + return Ok(()); + }; + + let is_dmg = Self::is_running_from_dmg(parent)?; + log::info!("Exe is running from dmg: {is_dmg}"); + + Ok(()) + } + + #[cfg(target_os = "windows")] + fn obtain_token_internal() -> Result<()> { + //TODO + Ok(()) + } + + #[cfg(target_os = "macos")] + #[allow(unsafe_code)] + fn is_running_from_dmg(parent_path: &Path) -> Result { + use nix::libc::statfs; + use std::ffi::CString; + + let cpath = CString::new(parent_path.to_string_lossy().to_string())?; + let mut sfs: statfs = unsafe { std::mem::zeroed() }; + unsafe { + if statfs(cpath.as_ptr(), &raw mut sfs) == 0 { + // HFS/ExFAT images mounted from DMG typically show up as "hfs", "apfs", etc + // But the device path (sfs.f_mntfromname) starts with "/dev/disk" + let mntfrom = std::ffi::CStr::from_ptr(sfs.f_mntfromname.as_ptr()) + .to_string_lossy() + .to_string(); + Ok(mntfrom.starts_with("/dev/disk")) + } else { + Ok(false) + } + } + } +} diff --git a/core/src/flow.rs b/core/src/flow.rs index 2dd4d515..4a2ed972 100644 --- a/core/src/flow.rs +++ b/core/src/flow.rs @@ -1,3 +1,4 @@ +use crate::auto_auth::AutoAuth; use crate::channel::EventChannel; use crate::deeplink_bridge::{ PlaceDeeplinkError, PlaceDeeplinkResult, place_deeplink_and_wait_until_consumed, @@ -108,6 +109,8 @@ impl LaunchFlow { ) -> std::result::Result<(), FlowError> { const SILENT_ATTEMPTS_COUNT: u8 = 3; + AutoAuth::try_obtain_auth_token(); + let mut last_error: Option = None; for attempt in 1..=SILENT_ATTEMPTS_COUNT { diff --git a/core/src/installs.rs b/core/src/installs.rs index 6ac060df..44e4d2a8 100644 --- a/core/src/installs.rs +++ b/core/src/installs.rs @@ -139,7 +139,9 @@ fn get_version_data() -> Result> { fn get_version_data_or_empty() -> Map { get_version_data().unwrap_or_else(|_e| { - log::error!("Cannot get version data, fallback to new empty: File doesn't exist: version.json"); + log::error!( + "Cannot get version data, fallback to new empty: File doesn't exist: version.json" + ); Map::new() }) diff --git a/core/src/lib.rs b/core/src/lib.rs index 1ed3a2f1..92f24135 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -22,6 +22,7 @@ pub mod analytics; pub mod app; +mod auto_auth; pub mod channel; mod config; mod deeplink_bridge; diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7bf4421d..2bbf69ee 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "Decentraland-Launcher" -version = "1.9.5" +version = "1.11.2" dependencies = [ "anyhow", "dcl-launcher-core", @@ -663,7 +663,7 @@ dependencies = [ [[package]] name = "dcl-launcher-core" -version = "1.9.5" +version = "1.11.2" dependencies = [ "anyhow", "deranged", @@ -3612,15 +3612,16 @@ dependencies = [ [[package]] name = "segment" version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "971369158e31ad10bd73b558625f99de39554a2f00c2ff886a6796d950e69664" +source = "git+https://github.com/decentraland/segment?branch=main#60975a59daec3551a1e57e51b9ef871c059b70b7" dependencies = [ "async-trait", "reqwest", + "rusqlite", "serde", "serde_json", "thiserror 2.0.12", "time", + "tokio", ] [[package]] From 2705e470f9cd5f4bba131be2347ac13592809a6d Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Tue, 30 Sep 2025 00:43:44 +0300 Subject: [PATCH 02/61] windows compilation cfg --- core/src/auto_auth.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 05edaf68..0f8e315d 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,5 +1,6 @@ use anyhow::Result; +#[cfg(target_os = "macos")] use std::path::Path; pub struct AutoAuth {} @@ -28,6 +29,10 @@ impl AutoAuth { } #[cfg(target_os = "windows")] + // For dev only, remove later ==== + #[allow(clippy::unnecessary_wraps)] + #[allow(clippy::missing_const_for_fn)] + // ==== fn obtain_token_internal() -> Result<()> { //TODO Ok(()) From a2a2d13449c68001f9e3237e087bb22b08043673 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 04:41:41 +0300 Subject: [PATCH 03/61] import libc --- core/Cargo.lock | 5 +++-- core/Cargo.toml | 1 + core/src/auto_auth.rs | 46 ++++++++++++++++++++++--------------------- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index 2755dc96..4bbfd586 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -267,6 +267,7 @@ dependencies = [ "futures-util", "get_if_addrs", "humantime", + "libc", "log", "nix", "plist", @@ -1017,9 +1018,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libredox" diff --git a/core/Cargo.toml b/core/Cargo.toml index facdad7b..983b79f7 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -68,6 +68,7 @@ sentry-log = "0.37.0" sentry-types = "0.37.0" get_if_addrs = "0.5.3" +libc = "0.2.176" [target.'cfg(target_os = "macos")'.dependencies] system-configuration = "0.6.1" diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 0f8e315d..1bb86133 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -15,14 +15,7 @@ impl AutoAuth { #[cfg(target_os = "macos")] fn obtain_token_internal() -> Result<()> { let path = std::env::current_exe()?; - let parent = path.parent(); - - let Some(parent) = parent else { - log::info!("Exe has no parent and is not running in .dmg"); - return Ok(()); - }; - - let is_dmg = Self::is_running_from_dmg(parent)?; + let is_dmg = Self::is_running_from_dmg(&path)?; log::info!("Exe is running from dmg: {is_dmg}"); Ok(()) @@ -40,23 +33,32 @@ impl AutoAuth { #[cfg(target_os = "macos")] #[allow(unsafe_code)] - fn is_running_from_dmg(parent_path: &Path) -> Result { - use nix::libc::statfs; + fn is_running_from_dmg(exe_path: &Path) -> Result { use std::ffi::CString; + use std::ffi::CStr; + use libc::statfs; + use libc::MNT_RDONLY; - let cpath = CString::new(parent_path.to_string_lossy().to_string())?; + let cpath = CString::new(exe_path.to_string_lossy().to_string())?; let mut sfs: statfs = unsafe { std::mem::zeroed() }; - unsafe { - if statfs(cpath.as_ptr(), &raw mut sfs) == 0 { - // HFS/ExFAT images mounted from DMG typically show up as "hfs", "apfs", etc - // But the device path (sfs.f_mntfromname) starts with "/dev/disk" - let mntfrom = std::ffi::CStr::from_ptr(sfs.f_mntfromname.as_ptr()) - .to_string_lossy() - .to_string(); - Ok(mntfrom.starts_with("/dev/disk")) - } else { - Ok(false) - } + + let res = unsafe { statfs(cpath.as_ptr(), &mut sfs) }; + if res != 0 { + return Err(anyhow::anyhow!("Cannot read statfs")); } + + let mntfrom = unsafe { CStr::from_ptr(sfs.f_mntfromname.as_ptr()) } + .to_string_lossy() + .to_string(); + let mnton = unsafe { CStr::from_ptr(sfs.f_mntonname.as_ptr()) } + .to_string_lossy() + .to_string(); + + let is_readonly = sfs.f_flags & MNT_RDONLY as u32 != 0; + log::info!("exe mount data, from: {mntfrom}, on: {mnton}, readonly: {is_readonly}"); + + Ok(mntfrom.starts_with("/dev/disk") + && mnton.starts_with("/Volumes/") + && is_readonly) } } From bdc6267c6547c73f6c494e79ccf1a32b17d84a4a Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 04:43:47 +0300 Subject: [PATCH 04/61] use raw ptr --- core/src/auto_auth.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 1bb86133..012ae6c2 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -42,7 +42,7 @@ impl AutoAuth { let cpath = CString::new(exe_path.to_string_lossy().to_string())?; let mut sfs: statfs = unsafe { std::mem::zeroed() }; - let res = unsafe { statfs(cpath.as_ptr(), &mut sfs) }; + let res = unsafe { statfs(cpath.as_ptr(), &raw mut sfs) }; if res != 0 { return Err(anyhow::anyhow!("Cannot read statfs")); } From 1a8782d3025821ee19ef980a3c7973d64f91b28f Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 21:16:34 +0300 Subject: [PATCH 05/61] read where from attr --- core/src/auto_auth.rs | 140 +++++++++++++++++++++++++++++++++--------- 1 file changed, 112 insertions(+), 28 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 012ae6c2..9bb2b579 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,7 +1,7 @@ use anyhow::Result; #[cfg(target_os = "macos")] -use std::path::Path; +use std::path::{Path, PathBuf}; pub struct AutoAuth {} @@ -15,8 +15,22 @@ impl AutoAuth { #[cfg(target_os = "macos")] fn obtain_token_internal() -> Result<()> { let path = std::env::current_exe()?; - let is_dmg = Self::is_running_from_dmg(&path)?; - log::info!("Exe is running from dmg: {is_dmg}"); + let dmg_mount_path = dmg_mount_path(&path)?; + log::info!("Exe is running from dmg: {dmg_mount_path:?}"); + + let Some(dmg_mount_path) = dmg_mount_path else { + return Ok(()); + }; + + let Some(dmg_dir) = dmg_mount_path.parent() else { + log::info!("Dmg doesn't have a parent"); + return Ok(()); + }; + log::info!("Dmg parent: {}", dmg_dir.display()); + + //let dmg_dir = dmg_dir.to_str(); + //TODO dmg_dir to real file path -> call where_from_attr + let _ = where_from_attr(dmg_dir); Ok(()) } @@ -30,35 +44,105 @@ impl AutoAuth { //TODO Ok(()) } +} - #[cfg(target_os = "macos")] - #[allow(unsafe_code)] - fn is_running_from_dmg(exe_path: &Path) -> Result { - use std::ffi::CString; - use std::ffi::CStr; - use libc::statfs; - use libc::MNT_RDONLY; - - let cpath = CString::new(exe_path.to_string_lossy().to_string())?; - let mut sfs: statfs = unsafe { std::mem::zeroed() }; - - let res = unsafe { statfs(cpath.as_ptr(), &raw mut sfs) }; - if res != 0 { - return Err(anyhow::anyhow!("Cannot read statfs")); +#[cfg(target_os = "macos")] +#[allow(unsafe_code)] +fn dmg_mount_path(exe_path: &Path) -> Result> { + use libc::MNT_RDONLY; + use libc::statfs; + use std::ffi::CStr; + use std::ffi::CString; + + let cpath = CString::new(exe_path.to_string_lossy().to_string())?; + let mut sfs: statfs = unsafe { std::mem::zeroed() }; + + let res = unsafe { statfs(cpath.as_ptr(), &raw mut sfs) }; + if res != 0 { + return Err(anyhow::anyhow!("Cannot read statfs")); + } + + let mntfrom = unsafe { CStr::from_ptr(sfs.f_mntfromname.as_ptr()) } + .to_string_lossy() + .to_string(); + let mnton = unsafe { CStr::from_ptr(sfs.f_mntonname.as_ptr()) } + .to_string_lossy() + .to_string(); + + let is_readonly = sfs.f_flags & MNT_RDONLY as u32 != 0; + log::info!("exe mount data, from: {mntfrom}, on: {mnton}, readonly: {is_readonly}"); + + if is_readonly && mntfrom.to_lowercase().starts_with("/volumes/") { + Ok(Some(mntfrom.into())) + } else { + Ok(None) + } +} + +#[allow(unsafe_code)] +#[cfg(target_os = "macos")] +fn where_from_attr(dmg_path: &Path) -> Result>> { + use libc::getxattr; + use plist::Value; + use std::{ffi::CString, ptr}; + + let cpath = CString::new(dmg_path.to_string_lossy().to_string())?; + let attr = CString::new("com.apple.metadata:kMDItemWhereFroms")?; + + // size + let size = unsafe { getxattr(cpath.as_ptr(), attr.as_ptr(), ptr::null_mut(), 0, 0, 0) }; + if size <= 0 { + return Err(anyhow::anyhow!("Cannot read size")); + } + + // read contents + #[allow(clippy::cast_sign_loss)] + let mut buf = vec![0u8; size as usize]; + let ret = unsafe { + getxattr( + cpath.as_ptr(), + attr.as_ptr(), + buf.as_mut_ptr().cast(), + buf.len(), + 0, + 0, + ) + }; + if ret <= 0 { + return Err(anyhow::anyhow!("Cannot read xattr")); + } + + // Decode binary plist to array of strings + let mut cursor = std::io::Cursor::new(&buf[..]); + let val = Value::from_reader(&mut cursor)?; + + if let Some(arr) = val.into_array() { + let urls: Vec = arr.into_iter().filter_map(plist::Value::into_string).collect(); + if urls.is_empty() { + Ok(None) + } else { + Ok(Some(urls)) } + } else { + Ok(None) + } +} - let mntfrom = unsafe { CStr::from_ptr(sfs.f_mntfromname.as_ptr()) } - .to_string_lossy() - .to_string(); - let mnton = unsafe { CStr::from_ptr(sfs.f_mntonname.as_ptr()) } - .to_string_lossy() - .to_string(); +#[cfg(test)] +mod tests { + use super::*; - let is_readonly = sfs.f_flags & MNT_RDONLY as u32 != 0; - log::info!("exe mount data, from: {mntfrom}, on: {mnton}, readonly: {is_readonly}"); + #[test] + fn test_where_from_integration() -> Result<()> { + let path = std::option_env!("TEST_DMG_PATH"); + let Some(path) = path else { + println!("TEST_DMG_PATH is not provided, ignoring test"); + return Ok(()); + }; - Ok(mntfrom.starts_with("/dev/disk") - && mnton.starts_with("/Volumes/") - && is_readonly) + let path = Path::new(path); + let attr = where_from_attr(path)?; + println!("Where from attr: {attr:?}"); + Ok(()) } } From f89b10f295876382657ce95f4e249fef88d8a8a1 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 22:37:58 +0300 Subject: [PATCH 06/61] resolve disk image path --- core/Cargo.lock | 16 ++++++- core/Cargo.toml | 2 + core/src/auto_auth.rs | 98 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 110 insertions(+), 6 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index 4bbfd586..af9be664 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -200,6 +200,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -260,6 +270,8 @@ name = "dcl-launcher-core" version = "1.11.2" dependencies = [ "anyhow", + "core-foundation 0.10.1", + "core-foundation-sys", "deranged", "dirs", "fern", @@ -1750,7 +1762,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", @@ -2085,7 +2097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] diff --git a/core/Cargo.toml b/core/Cargo.toml index 983b79f7..9db87c1d 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -69,6 +69,8 @@ sentry-types = "0.37.0" get_if_addrs = "0.5.3" libc = "0.2.176" +core-foundation = "0.10.1" +core-foundation-sys = "0.8.7" [target.'cfg(target_os = "macos")'.dependencies] system-configuration = "0.6.1" diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 9bb2b579..d6a95f8a 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -28,9 +28,10 @@ impl AutoAuth { }; log::info!("Dmg parent: {}", dmg_dir.display()); - //let dmg_dir = dmg_dir.to_str(); - //TODO dmg_dir to real file path -> call where_from_attr - let _ = where_from_attr(dmg_dir); + let resolved_path = resolve_dmg_file(dmg_mount_path.as_path())?; + let where_from = where_from_attr(resolved_path.as_path())?; + + log::info!("Where from attr: {where_from:?}"); Ok(()) } @@ -117,7 +118,10 @@ fn where_from_attr(dmg_path: &Path) -> Result>> { let val = Value::from_reader(&mut cursor)?; if let Some(arr) = val.into_array() { - let urls: Vec = arr.into_iter().filter_map(plist::Value::into_string).collect(); + let urls: Vec = arr + .into_iter() + .filter_map(plist::Value::into_string) + .collect(); if urls.is_empty() { Ok(None) } else { @@ -128,6 +132,78 @@ fn where_from_attr(dmg_path: &Path) -> Result>> { } } +#[allow(unsafe_code)] +#[cfg(target_os = "macos")] +fn resolve_dmg_file(mntfrom: &Path) -> Result { + use core_foundation::{ + base::{CFRelease, TCFType}, + string::CFString, + url::CFURL, + }; + use core_foundation_sys::base::CFTypeRef; + use core_foundation_sys::url::{CFURLCopyFileSystemPath, kCFURLPOSIXPathStyle}; + use std::{ffi::CString, path::PathBuf, ptr}; + + unsafe { + let session = DASessionCreate(ptr::null()); + if session.is_null() { + return Err(anyhow::anyhow!("Could not create DASession")); + } + + let dev_c = CString::new(mntfrom.to_string_lossy().to_string())?; + let disk: CFTypeRef = DADiskCreateFromBSDName(ptr::null(), session, dev_c.as_ptr()); + if disk.is_null() { + return Err(anyhow::anyhow!( + "Could not create DADisk for {}", + mntfrom.display() + )); + } + + let desc = DADiskCopyDescription(disk); + if desc.is_null() { + return Err(anyhow::anyhow!("Could not get disk description")); + } + + let key = CFString::new("DAMediaPath"); + let val = core_foundation_sys::dictionary::CFDictionaryGetValue( + desc, + key.as_concrete_TypeRef().cast(), + ); + if val.is_null() { + return Err(anyhow::anyhow!("DAMediaPath not found")); + } + + let url: CFURL = CFURL::wrap_under_get_rule(val.cast()); + let cfstr = CFURLCopyFileSystemPath(url.as_concrete_TypeRef(), kCFURLPOSIXPathStyle); + let cfstring = CFString::wrap_under_create_rule(cfstr); + + CFRelease(desc.cast()); + CFRelease(disk.cast()); + CFRelease(session .cast()); + + Ok(PathBuf::from(cfstring.to_string())) + } +} + +#[cfg(target_os = "macos")] +#[allow(unsafe_code)] +#[link(name = "DiskArbitration", kind = "framework")] +unsafe extern "C" { + pub fn DASessionCreate( + allocator: core_foundation_sys::base::CFAllocatorRef, + ) -> core_foundation_sys::base::CFTypeRef; + + pub fn DADiskCreateFromBSDName( + allocator: core_foundation_sys::base::CFAllocatorRef, + session: core_foundation_sys::base::CFTypeRef, + bsdName: *const std::os::raw::c_char, + ) -> core_foundation_sys::base::CFTypeRef; + + pub fn DADiskCopyDescription( + disk: core_foundation_sys::base::CFTypeRef, + ) -> core_foundation_sys::dictionary::CFDictionaryRef; +} + #[cfg(test)] mod tests { use super::*; @@ -145,4 +221,18 @@ mod tests { println!("Where from attr: {attr:?}"); Ok(()) } + + #[test] + fn test_resolve_dmg_file_integration() -> Result<()> { + let path = std::option_env!("TEST_MNT_FROM"); + let Some(path) = path else { + println!("TEST_MNT_FROM is not provided, ignoring test"); + return Ok(()); + }; + + let path = Path::new(path); + let resolved = resolve_dmg_file(path)?; + println!("Image path: {resolved:?}"); + Ok(()) + } } From b3584eb3c05625eaeaf96d1a255c34f30c8b2691 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 22:59:27 +0300 Subject: [PATCH 07/61] solve dependencies --- core/Cargo.toml | 6 +++--- core/src/auto_auth.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 9db87c1d..babf0404 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -68,13 +68,13 @@ sentry-log = "0.37.0" sentry-types = "0.37.0" get_if_addrs = "0.5.3" -libc = "0.2.176" -core-foundation = "0.10.1" -core-foundation-sys = "0.8.7" [target.'cfg(target_os = "macos")'.dependencies] system-configuration = "0.6.1" rusqlite = { version = "0.37.0" } +libc = "0.2.176" +core-foundation = "0.10.1" +core-foundation-sys = "0.8.7" [target.'cfg(target_os = "windows")'.dependencies] rusqlite = { version = "0.37.0", features = ["bundled"] } diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index d6a95f8a..bb200fb8 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -179,7 +179,7 @@ fn resolve_dmg_file(mntfrom: &Path) -> Result { CFRelease(desc.cast()); CFRelease(disk.cast()); - CFRelease(session .cast()); + CFRelease(session.cast()); Ok(PathBuf::from(cfstring.to_string())) } From 9ec3fa1e48f4e3138a5c3159a4230258f8b7a766 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:07:05 +0300 Subject: [PATCH 08/61] conditional tests --- core/src/auto_auth.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index bb200fb8..1591833e 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -208,6 +208,7 @@ unsafe extern "C" { mod tests { use super::*; + #[cfg(target_os = "macos")] #[test] fn test_where_from_integration() -> Result<()> { let path = std::option_env!("TEST_DMG_PATH"); @@ -222,6 +223,7 @@ mod tests { Ok(()) } + #[cfg(target_os = "macos")] #[test] fn test_resolve_dmg_file_integration() -> Result<()> { let path = std::option_env!("TEST_MNT_FROM"); From af7b358e8652e528e51acdfefb75296b56b99c9f Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:18:02 +0300 Subject: [PATCH 09/61] macos tests --- core/src/auto_auth.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 1591833e..a1854ab2 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -204,11 +204,11 @@ unsafe extern "C" { ) -> core_foundation_sys::dictionary::CFDictionaryRef; } +#[cfg(target_os = "macos")] #[cfg(test)] mod tests { use super::*; - #[cfg(target_os = "macos")] #[test] fn test_where_from_integration() -> Result<()> { let path = std::option_env!("TEST_DMG_PATH"); @@ -223,7 +223,6 @@ mod tests { Ok(()) } - #[cfg(target_os = "macos")] #[test] fn test_resolve_dmg_file_integration() -> Result<()> { let path = std::option_env!("TEST_MNT_FROM"); From f3bfde02f3ad82bfb2abb948e6d8af87069c165b Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:28:28 +0300 Subject: [PATCH 10/61] hooks --- .githooks/pre-commit | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100755 .githooks/pre-commit diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 00000000..8fa0793a --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,16 @@ +#!/bin/sh + +echo "Running checks..." + +for dir in core src-tauri; do + echo "Executing $dir" + ( + cd "$dir" + echo "Check $dir" + cargo check + echo "Clippy $dir" + cargo clippy --all-targets --all-features -- -D warnings + ) +done + +echo "All checks passed!" From 6abd25431d7c01c30481e36a010f1ede0c727037 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:38:28 +0300 Subject: [PATCH 11/61] tests on pre commit --- .githooks/pre-commit | 4 ++++ src-tauri/Cargo.lock | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 8fa0793a..c8539a67 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -6,10 +6,14 @@ for dir in core src-tauri; do echo "Executing $dir" ( cd "$dir" + echo "Format $dir" + cargo fmt echo "Check $dir" cargo check echo "Clippy $dir" cargo clippy --all-targets --all-features -- -D warnings + echo "Test $dir" + cargo test ) done diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 2bbf69ee..60e4bc46 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -487,9 +487,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -508,7 +508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ "bitflags 2.9.0", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "core-graphics-types", "foreign-types 0.5.0", "libc", @@ -521,7 +521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ "bitflags 2.9.0", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "libc", ] @@ -666,6 +666,8 @@ name = "dcl-launcher-core" version = "1.11.2" dependencies = [ "anyhow", + "core-foundation 0.10.1", + "core-foundation-sys", "deranged", "dirs 5.0.1", "fern", @@ -673,6 +675,7 @@ dependencies = [ "futures-util", "get_if_addrs", "humantime", + "libc", "log", "nix", "plist", @@ -2125,9 +2128,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libloading" @@ -4169,7 +4172,7 @@ dependencies = [ "ntapi", "objc2-core-foundation", "objc2-io-kit", - "windows 0.60.0", + "windows 0.61.3", ] [[package]] @@ -4213,7 +4216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63c8b1020610b9138dd7b1e06cf259ae91aa05c30f3bd0d6b42a03997b92dec1" dependencies = [ "bitflags 2.9.0", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "core-graphics", "crossbeam-channel", "dispatch", From 7b218372f8424d813af578f2ecec7ab0c077a910 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:39:43 +0300 Subject: [PATCH 12/61] error descriptions --- core/src/auto_auth.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index a1854ab2..a4ee1b81 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -8,12 +8,14 @@ pub struct AutoAuth {} impl AutoAuth { pub fn try_obtain_auth_token() { if let Err(e) = Self::obtain_token_internal() { - log::error!("Obtain auth error: {e}"); + log::error!("Obtain auth token error: {e}"); } } #[cfg(target_os = "macos")] fn obtain_token_internal() -> Result<()> { + use anyhow::Context; + let path = std::env::current_exe()?; let dmg_mount_path = dmg_mount_path(&path)?; log::info!("Exe is running from dmg: {dmg_mount_path:?}"); @@ -28,8 +30,10 @@ impl AutoAuth { }; log::info!("Dmg parent: {}", dmg_dir.display()); - let resolved_path = resolve_dmg_file(dmg_mount_path.as_path())?; - let where_from = where_from_attr(resolved_path.as_path())?; + let resolved_path = resolve_dmg_file(dmg_mount_path.as_path()) + .with_context(|| "Cannot resolve mount path: {dmg_mount_path}")?; + let where_from = where_from_attr(resolved_path.as_path()) + .with_context(|| "Cannot read where from attr: {resolved_path}")?; log::info!("Where from attr: {where_from:?}"); From 6031635592ccdd592f235fd374ed9b6dea78eea4 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:47:37 +0300 Subject: [PATCH 13/61] mount path test --- core/src/auto_auth.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index a4ee1b81..f7b8032a 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -17,6 +17,7 @@ impl AutoAuth { use anyhow::Context; let path = std::env::current_exe()?; + log::info!("Exe path: {path:?}"); let dmg_mount_path = dmg_mount_path(&path)?; log::info!("Exe is running from dmg: {dmg_mount_path:?}"); @@ -240,4 +241,19 @@ mod tests { println!("Image path: {resolved:?}"); Ok(()) } + + #[test] + fn test_dmg_mount_path_integration() -> Result<()> { + let path = std::option_env!("TEST_EXE_MOUNT_PATH"); + let Some(path) = path else { + println!("TEST_EXE_MOUNT_PATH is not provided, ignoring test"); + return Ok(()); + }; + + let path = Path::new(path); + let dmg_mount_path = dmg_mount_path(&path)?; + println!("Exe is running from dmg: {dmg_mount_path:?}"); + Ok(()) + } + } From 3704eea99d2325a75770172bad80a9dbcf39e8b4 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:51:03 +0300 Subject: [PATCH 14/61] abort commit if error --- .githooks/pre-commit | 1 + 1 file changed, 1 insertion(+) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index c8539a67..8edc4170 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -1,4 +1,5 @@ #!/bin/sh +set -e echo "Running checks..." From 40de65d6aee0e1159e7699eb6cb2d77905e674bd Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 30 Sep 2025 23:51:49 +0300 Subject: [PATCH 15/61] format info --- core/src/auto_auth.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index f7b8032a..5e376046 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -17,7 +17,7 @@ impl AutoAuth { use anyhow::Context; let path = std::env::current_exe()?; - log::info!("Exe path: {path:?}"); + log::info!("Exe path: {}", path.display()); let dmg_mount_path = dmg_mount_path(&path)?; log::info!("Exe is running from dmg: {dmg_mount_path:?}"); @@ -251,9 +251,8 @@ mod tests { }; let path = Path::new(path); - let dmg_mount_path = dmg_mount_path(&path)?; + let dmg_mount_path = dmg_mount_path(path)?; println!("Exe is running from dmg: {dmg_mount_path:?}"); Ok(()) } - } From d4ea1f8ec3462e80f1f665774275a38c2e3e5c05 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 00:50:36 +0300 Subject: [PATCH 16/61] dmg check backing file --- core/src/auto_auth.rs | 114 +++++++++++++++++++++++++++++++----------- 1 file changed, 86 insertions(+), 28 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 5e376046..3bbf03c2 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,4 +1,11 @@ -use anyhow::Result; +use anyhow::{Result, anyhow}; + +#[cfg(target_os = "macos")] +use core_foundation::{base::CFAllocatorRef, url::CFURLRef}; +#[cfg(target_os = "macos")] +use core_foundation_sys::base::CFTypeRef; +#[cfg(target_os = "macos")] +use core_foundation_sys::dictionary::CFDictionaryRef; #[cfg(target_os = "macos")] use std::path::{Path, PathBuf}; @@ -31,10 +38,11 @@ impl AutoAuth { }; log::info!("Dmg parent: {}", dmg_dir.display()); - let resolved_path = resolve_dmg_file(dmg_mount_path.as_path()) - .with_context(|| "Cannot resolve mount path: {dmg_mount_path}")?; - let where_from = where_from_attr(resolved_path.as_path()) - .with_context(|| "Cannot read where from attr: {resolved_path}")?; + let dmg_file_path = dmg_backing_file(&dmg_dir.to_string_lossy()) + .with_context(|| "Cannot resolve mount path: {dmg_dir}")? + .ok_or_else(|| anyhow!("Dmg original file not found"))?; + let where_from = where_from_attr(dmg_file_path.as_path()) + .with_context(|| "Cannot read where from attr: {dmg_file_path}")?; log::info!("Where from attr: {where_from:?}"); @@ -48,7 +56,7 @@ impl AutoAuth { // ==== fn obtain_token_internal() -> Result<()> { //TODO - Ok(()) + Err(anyhow!("Not implemented")) } } @@ -137,6 +145,46 @@ fn where_from_attr(dmg_path: &Path) -> Result>> { } } +use std::process::Command; + +#[cfg(target_os = "macos")] +fn dmg_backing_file(mount_point: &str) -> Result> { + let output = Command::new("hdiutil").args(&["info", "-plist"]).output()?; + let plist = plist::Value::from_reader_xml(&*output.stdout)?; + let dict = plist + .as_dictionary() + .ok_or_else(|| anyhow!("Cannot convert plist to dictionary"))?; + let images = dict + .get("images") + .ok_or_else(|| anyhow!("No images found in plist"))? + .as_array() + .ok_or_else(|| anyhow!("Images is not an array"))?; + for image in images { + if let Some(props) = image.as_dictionary() { + if let (Some(img_path), Some(system_entities)) = + (props.get("image-path"), props.get("system-entities")) + { + if let (Some(img_path), Some(system_entities)) = + (img_path.as_string(), system_entities.as_array()) + { + for ent in system_entities { + if let Some(ent) = ent.as_dictionary() { + if let Some(mount_point_str) = + ent.get("mount-point").and_then(|v| v.as_string()) + { + if mount_point_str == mount_point { + return Ok(Some(PathBuf::from(img_path))); + } + } + } + } + } + } + } + } + Ok(None) +} + #[allow(unsafe_code)] #[cfg(target_os = "macos")] fn resolve_dmg_file(mntfrom: &Path) -> Result { @@ -145,9 +193,7 @@ fn resolve_dmg_file(mntfrom: &Path) -> Result { string::CFString, url::CFURL, }; - use core_foundation_sys::base::CFTypeRef; - use core_foundation_sys::url::{CFURLCopyFileSystemPath, kCFURLPOSIXPathStyle}; - use std::{ffi::CString, path::PathBuf, ptr}; + use std::{path::PathBuf, ptr}; unsafe { let session = DASessionCreate(ptr::null()); @@ -155,8 +201,10 @@ fn resolve_dmg_file(mntfrom: &Path) -> Result { return Err(anyhow::anyhow!("Could not create DASession")); } - let dev_c = CString::new(mntfrom.to_string_lossy().to_string())?; - let disk: CFTypeRef = DADiskCreateFromBSDName(ptr::null(), session, dev_c.as_ptr()); + let url = CFURL::from_path(mntfrom, true) + .ok_or_else(|| anyhow::anyhow!("Cannot resolve path to CFURL"))?; + let disk = DADiskCreateFromVolumePath(ptr::null(), session, url.as_concrete_TypeRef()); + if disk.is_null() { return Err(anyhow::anyhow!( "Could not create DADisk for {}", @@ -178,15 +226,15 @@ fn resolve_dmg_file(mntfrom: &Path) -> Result { return Err(anyhow::anyhow!("DAMediaPath not found")); } - let url: CFURL = CFURL::wrap_under_get_rule(val.cast()); - let cfstr = CFURLCopyFileSystemPath(url.as_concrete_TypeRef(), kCFURLPOSIXPathStyle); - let cfstring = CFString::wrap_under_create_rule(cfstr); + let cfstring: CFString = TCFType::wrap_under_get_rule(val.cast()); + let path_str = cfstring.to_string(); + let path = PathBuf::from(path_str); CFRelease(desc.cast()); CFRelease(disk.cast()); CFRelease(session.cast()); - Ok(PathBuf::from(cfstring.to_string())) + Ok(path) } } @@ -194,19 +242,16 @@ fn resolve_dmg_file(mntfrom: &Path) -> Result { #[allow(unsafe_code)] #[link(name = "DiskArbitration", kind = "framework")] unsafe extern "C" { - pub fn DASessionCreate( - allocator: core_foundation_sys::base::CFAllocatorRef, - ) -> core_foundation_sys::base::CFTypeRef; - - pub fn DADiskCreateFromBSDName( - allocator: core_foundation_sys::base::CFAllocatorRef, - session: core_foundation_sys::base::CFTypeRef, - bsdName: *const std::os::raw::c_char, - ) -> core_foundation_sys::base::CFTypeRef; - - pub fn DADiskCopyDescription( - disk: core_foundation_sys::base::CFTypeRef, - ) -> core_foundation_sys::dictionary::CFDictionaryRef; + + pub fn DASessionCreate(allocator: CFAllocatorRef) -> CFTypeRef; + + pub fn DADiskCreateFromVolumePath( + allocator: CFAllocatorRef, + session: CFTypeRef, + path: CFURLRef, + ) -> CFTypeRef; + + pub fn DADiskCopyDescription(disk: CFTypeRef) -> CFDictionaryRef; } #[cfg(target_os = "macos")] @@ -255,4 +300,17 @@ mod tests { println!("Exe is running from dmg: {dmg_mount_path:?}"); Ok(()) } + + #[test] + fn test_dmg_backing_file_integration() -> Result<()> { + let path = std::option_env!("TEST_DMG_BACKING"); + let Some(path) = path else { + println!("TEST_DMG_BACKING is not provided, ignoring test"); + return Ok(()); + }; + + let dmg_mount_path = dmg_backing_file(path)?; + println!("Exe is running from backing dmg: {dmg_mount_path:?}"); + Ok(()) + } } From e361748ac9c9687ede38676714d605d1af26af07 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 00:51:58 +0300 Subject: [PATCH 17/61] remove redundant code --- core/src/auto_auth.rs | 90 ------------------------------------------- 1 file changed, 90 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 3bbf03c2..005f5961 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,12 +1,5 @@ use anyhow::{Result, anyhow}; -#[cfg(target_os = "macos")] -use core_foundation::{base::CFAllocatorRef, url::CFURLRef}; -#[cfg(target_os = "macos")] -use core_foundation_sys::base::CFTypeRef; -#[cfg(target_os = "macos")] -use core_foundation_sys::dictionary::CFDictionaryRef; - #[cfg(target_os = "macos")] use std::path::{Path, PathBuf}; @@ -185,75 +178,6 @@ fn dmg_backing_file(mount_point: &str) -> Result> { Ok(None) } -#[allow(unsafe_code)] -#[cfg(target_os = "macos")] -fn resolve_dmg_file(mntfrom: &Path) -> Result { - use core_foundation::{ - base::{CFRelease, TCFType}, - string::CFString, - url::CFURL, - }; - use std::{path::PathBuf, ptr}; - - unsafe { - let session = DASessionCreate(ptr::null()); - if session.is_null() { - return Err(anyhow::anyhow!("Could not create DASession")); - } - - let url = CFURL::from_path(mntfrom, true) - .ok_or_else(|| anyhow::anyhow!("Cannot resolve path to CFURL"))?; - let disk = DADiskCreateFromVolumePath(ptr::null(), session, url.as_concrete_TypeRef()); - - if disk.is_null() { - return Err(anyhow::anyhow!( - "Could not create DADisk for {}", - mntfrom.display() - )); - } - - let desc = DADiskCopyDescription(disk); - if desc.is_null() { - return Err(anyhow::anyhow!("Could not get disk description")); - } - - let key = CFString::new("DAMediaPath"); - let val = core_foundation_sys::dictionary::CFDictionaryGetValue( - desc, - key.as_concrete_TypeRef().cast(), - ); - if val.is_null() { - return Err(anyhow::anyhow!("DAMediaPath not found")); - } - - let cfstring: CFString = TCFType::wrap_under_get_rule(val.cast()); - let path_str = cfstring.to_string(); - let path = PathBuf::from(path_str); - - CFRelease(desc.cast()); - CFRelease(disk.cast()); - CFRelease(session.cast()); - - Ok(path) - } -} - -#[cfg(target_os = "macos")] -#[allow(unsafe_code)] -#[link(name = "DiskArbitration", kind = "framework")] -unsafe extern "C" { - - pub fn DASessionCreate(allocator: CFAllocatorRef) -> CFTypeRef; - - pub fn DADiskCreateFromVolumePath( - allocator: CFAllocatorRef, - session: CFTypeRef, - path: CFURLRef, - ) -> CFTypeRef; - - pub fn DADiskCopyDescription(disk: CFTypeRef) -> CFDictionaryRef; -} - #[cfg(target_os = "macos")] #[cfg(test)] mod tests { @@ -273,20 +197,6 @@ mod tests { Ok(()) } - #[test] - fn test_resolve_dmg_file_integration() -> Result<()> { - let path = std::option_env!("TEST_MNT_FROM"); - let Some(path) = path else { - println!("TEST_MNT_FROM is not provided, ignoring test"); - return Ok(()); - }; - - let path = Path::new(path); - let resolved = resolve_dmg_file(path)?; - println!("Image path: {resolved:?}"); - Ok(()) - } - #[test] fn test_dmg_mount_path_integration() -> Result<()> { let path = std::option_env!("TEST_EXE_MOUNT_PATH"); From 3e4b0ea7513f022805e1b3d4524c5b061e0606dc Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 01:03:11 +0300 Subject: [PATCH 18/61] use direct array --- core/src/auto_auth.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 005f5961..3d6532f6 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -142,7 +142,7 @@ use std::process::Command; #[cfg(target_os = "macos")] fn dmg_backing_file(mount_point: &str) -> Result> { - let output = Command::new("hdiutil").args(&["info", "-plist"]).output()?; + let output = Command::new("hdiutil").args(["info", "-plist"]).output()?; let plist = plist::Value::from_reader_xml(&*output.stdout)?; let dict = plist .as_dictionary() From 1f185c4c20de73225a07fc3adbaed90e4a5d2ae2 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 01:22:28 +0300 Subject: [PATCH 19/61] use command only on macos --- core/src/auto_auth.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 3d6532f6..8fd83e9f 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -138,11 +138,9 @@ fn where_from_attr(dmg_path: &Path) -> Result>> { } } -use std::process::Command; - #[cfg(target_os = "macos")] fn dmg_backing_file(mount_point: &str) -> Result> { - let output = Command::new("hdiutil").args(["info", "-plist"]).output()?; + let output = std::process::Command::new("hdiutil").args(["info", "-plist"]).output()?; let plist = plist::Value::from_reader_xml(&*output.stdout)?; let dict = plist .as_dictionary() From f49147ce3e2a8fba13e0e6d429be3f6b9dbf3bef Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 02:01:36 +0300 Subject: [PATCH 20/61] auth token storage --- core/src/auto_auth.rs | 51 +++++++++++++++++++----- core/src/auto_auth/auth_token_storage.rs | 39 ++++++++++++++++++ core/src/installs.rs | 8 ++++ 3 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 core/src/auto_auth/auth_token_storage.rs diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 8fd83e9f..472fabd0 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,20 +1,43 @@ +mod auth_token_storage; + use anyhow::{Result, anyhow}; #[cfg(target_os = "macos")] use std::path::{Path, PathBuf}; +use auth_token_storage::AuthTokenStorage; + pub struct AutoAuth {} impl AutoAuth { pub fn try_obtain_auth_token() { - if let Err(e) = Self::obtain_token_internal() { - log::error!("Obtain auth token error: {e}"); + if AuthTokenStorage::has_token() { + log::info!("Token already obtained"); + return; + } + + match Self::obtain_token_internal() { + Ok(token) => { + let Some(token) = token else { + log::warn!("Token value is empty"); + return; + }; + + log::info!("Token obtained"); + if let Err(e) = AuthTokenStorage::write_token(token.as_str()) { + log::error!("Cannot write token: {e}"); + } + } + Err(e) => { + log::error!("Obtain auth token error: {e}"); + } } } #[cfg(target_os = "macos")] - fn obtain_token_internal() -> Result<()> { + fn obtain_token_internal() -> Result> { use anyhow::Context; + use std::borrow::ToOwned; let path = std::env::current_exe()?; log::info!("Exe path: {}", path.display()); @@ -22,12 +45,11 @@ impl AutoAuth { log::info!("Exe is running from dmg: {dmg_mount_path:?}"); let Some(dmg_mount_path) = dmg_mount_path else { - return Ok(()); + return Ok(None); }; let Some(dmg_dir) = dmg_mount_path.parent() else { - log::info!("Dmg doesn't have a parent"); - return Ok(()); + return Err(anyhow!("Dmg doesn't have a parent")); }; log::info!("Dmg parent: {}", dmg_dir.display()); @@ -39,7 +61,16 @@ impl AutoAuth { log::info!("Where from attr: {where_from:?}"); - Ok(()) + let Some(where_from) = where_from else { + return Err(anyhow!("Dmg does not have where from data")); + }; + + // TODO trim redundant data and purify token + let token = where_from + .first() + .map(ToOwned::to_owned); + + Ok(token) } #[cfg(target_os = "windows")] @@ -47,7 +78,7 @@ impl AutoAuth { #[allow(clippy::unnecessary_wraps)] #[allow(clippy::missing_const_for_fn)] // ==== - fn obtain_token_internal() -> Result<()> { + fn obtain_token_internal() -> Result> { //TODO Err(anyhow!("Not implemented")) } @@ -140,7 +171,9 @@ fn where_from_attr(dmg_path: &Path) -> Result>> { #[cfg(target_os = "macos")] fn dmg_backing_file(mount_point: &str) -> Result> { - let output = std::process::Command::new("hdiutil").args(["info", "-plist"]).output()?; + let output = std::process::Command::new("hdiutil") + .args(["info", "-plist"]) + .output()?; let plist = plist::Value::from_reader_xml(&*output.stdout)?; let dict = plist .as_dictionary() diff --git a/core/src/auto_auth/auth_token_storage.rs b/core/src/auto_auth/auth_token_storage.rs new file mode 100644 index 00000000..49306962 --- /dev/null +++ b/core/src/auto_auth/auth_token_storage.rs @@ -0,0 +1,39 @@ +use std::fs; + +use anyhow::Result; +use serde_json::json; + +use crate::installs::auth_token_bridge_path; +use crate::installs::auth_token_marker_path; + +pub struct AuthTokenStorage {} + +impl AuthTokenStorage { + pub fn has_token() -> bool { + let path = auth_token_marker_path(); + + match fs::exists(path) { + Ok(has) => has, + Err(e) => { + log::error!("Cannot read token path: {e}"); + false + } + } + } + + pub fn write_token(token: &str) -> Result<()> { + let json = json!( + { + "token": token + } + ); + + let marker_file = fs::File::create(auth_token_marker_path())?; + serde_json::to_writer_pretty(marker_file, &json)?; + + let bridge_file = fs::File::create(auth_token_bridge_path())?; + serde_json::to_writer_pretty(bridge_file, &json)?; + + Ok(()) + } +} diff --git a/core/src/installs.rs b/core/src/installs.rs index 44e4d2a8..1b58212b 100644 --- a/core/src/installs.rs +++ b/core/src/installs.rs @@ -67,6 +67,14 @@ pub fn config_path() -> PathBuf { explorer_path().join("config.json") } +pub fn auth_token_marker_path() -> PathBuf { + explorer_path().join("auth-token-marker.json") +} + +pub fn auth_token_bridge_path() -> PathBuf { + explorer_path().join("auth-token-bridge.json") +} + pub fn analytics_queue_db_path() -> PathBuf { explorer_path().join("analytics_queue.db") } From 8f715e4617ff0ca28f91af291b3e832702ad0fef Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 02:02:31 +0300 Subject: [PATCH 21/61] format --- core/src/auto_auth.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 472fabd0..900da405 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -66,9 +66,7 @@ impl AutoAuth { }; // TODO trim redundant data and purify token - let token = where_from - .first() - .map(ToOwned::to_owned); + let token = where_from.first().map(ToOwned::to_owned); Ok(token) } From aa7c730fa2dcf26da3de2f0669f622073d5ffc54 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 02:15:18 +0300 Subject: [PATCH 22/61] obtain token on startup --- core/src/flow.rs | 3 --- core/src/lib.rs | 2 +- src-tauri/src/lib.rs | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/flow.rs b/core/src/flow.rs index 4a2ed972..2dd4d515 100644 --- a/core/src/flow.rs +++ b/core/src/flow.rs @@ -1,4 +1,3 @@ -use crate::auto_auth::AutoAuth; use crate::channel::EventChannel; use crate::deeplink_bridge::{ PlaceDeeplinkError, PlaceDeeplinkResult, place_deeplink_and_wait_until_consumed, @@ -109,8 +108,6 @@ impl LaunchFlow { ) -> std::result::Result<(), FlowError> { const SILENT_ATTEMPTS_COUNT: u8 = 3; - AutoAuth::try_obtain_auth_token(); - let mut last_error: Option = None; for attempt in 1..=SILENT_ATTEMPTS_COUNT { diff --git a/core/src/lib.rs b/core/src/lib.rs index 92f24135..2127ffe6 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -22,7 +22,7 @@ pub mod analytics; pub mod app; -mod auto_auth; +pub mod auto_auth; pub mod channel; mod config; mod deeplink_bridge; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 2e3ee1b5..acf8781c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -11,6 +11,7 @@ #![allow(clippy::uninlined_format_args, clippy::used_underscore_binding)] use dcl_launcher_core::analytics::event::Event; +use dcl_launcher_core::auto_auth::AutoAuth; use dcl_launcher_core::environment::{AppEnvironment, Args}; use dcl_launcher_core::errors::FlowError; use dcl_launcher_core::log::{error, info}; @@ -231,6 +232,8 @@ fn setup_deeplink(a: &App, protocol: &Protocol) { } fn setup(a: &mut App) -> std::result::Result<(), Box> { + AutoAuth::try_obtain_auth_token(); + let app_state = tauri::async_runtime::block_on(AppState::setup()) .inspect_err(|e| error!("Error during setup: {:#}", e))?; From ec73dffe7a5df5cab2eaf8d7fb49f4a81a1d3864 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 02:26:41 +0300 Subject: [PATCH 23/61] setup base hooks --- src-tauri/tauri.conf.json | 5 +++-- src-tauri/windows/hooks.nsh | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src-tauri/windows/hooks.nsh diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index fed3e37f..8707dfc4 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -55,7 +55,8 @@ ] }, "nsis": { - "installerIcon": "./icons/icon.ico" + "installerIcon": "./icons/icon.ico", + "installerHooks": "./windows/hooks.nsh" } } }, @@ -74,4 +75,4 @@ "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDdEQUYxQkMxMUZCMTk1N0MKUldSOGxiRWZ3UnV2ZlIrVWl2Z3B1QVNzYStXOGc2eFBiNVhEZ1F3QTdnS01MWHg2OVNla1Z6bzkK" } } -} \ No newline at end of file +} diff --git a/src-tauri/windows/hooks.nsh b/src-tauri/windows/hooks.nsh new file mode 100644 index 00000000..d94bd222 --- /dev/null +++ b/src-tauri/windows/hooks.nsh @@ -0,0 +1,7 @@ +!macro NSIS_HOOK_PREINSTALL + MessageBox MB_OK "PreInstall" +!macroend + +!macro NSIS_HOOK_POSTINSTALL + MessageBox MB_OK "PostInstall" +!macroend From 2c54e5e2c3ec8f85406dc68b0d197cd74794f060 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 03:39:44 +0300 Subject: [PATCH 24/61] custom resources for windows --- src-tauri/tauri.windows.conf.json | 9 +++++++++ src-tauri/windows/hooks.nsh | 4 ---- 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 src-tauri/tauri.windows.conf.json diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json new file mode 100644 index 00000000..adb10947 --- /dev/null +++ b/src-tauri/tauri.windows.conf.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "bundle": { + "resources": [ + "resource/auto-auth-token-fetch.exe" + ] + } +} + diff --git a/src-tauri/windows/hooks.nsh b/src-tauri/windows/hooks.nsh index d94bd222..22ed516d 100644 --- a/src-tauri/windows/hooks.nsh +++ b/src-tauri/windows/hooks.nsh @@ -1,7 +1,3 @@ -!macro NSIS_HOOK_PREINSTALL - MessageBox MB_OK "PreInstall" -!macroend - !macro NSIS_HOOK_POSTINSTALL MessageBox MB_OK "PostInstall" !macroend From 863cb95c21644dba58a3be72dfe0c4f1893af009 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 05:47:48 +0300 Subject: [PATCH 25/61] zip 2.5.0 yanked https://crates.io/crates/zip/2.5.0 updating to a closest version --- core/Cargo.lock | 31 ++++++++++++++++++++----------- core/Cargo.toml | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index af9be664..2522d95f 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -249,12 +249,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - [[package]] name = "crypto-common" version = "0.1.6" @@ -471,11 +465,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", ] @@ -1056,6 +1051,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" +dependencies = [ + "zlib-rs", +] + [[package]] name = "linux-raw-sys" version = "0.9.3" @@ -3144,16 +3148,15 @@ dependencies = [ [[package]] name = "zip" -version = "2.5.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c03817464f64e23f6f37574b4fdc8cf65925b5bfd2b0f2aedf959791941f88" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" dependencies = [ "aes", "arbitrary", "bzip2", "constant_time_eq", "crc32fast", - "crossbeam-utils", "deflate64", "flate2", "getrandom 0.3.2", @@ -3170,6 +3173,12 @@ dependencies = [ "zstd", ] +[[package]] +name = "zlib-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" + [[package]] name = "zopfli" version = "0.8.1" diff --git a/core/Cargo.toml b/core/Cargo.toml index babf0404..e4577bdc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -47,7 +47,7 @@ sysinfo = "0.35.2" dirs = "5.0" tar = "0.4.44" -zip = "2.5.0" +zip = "3.0.0" flate2 = "1.1.0" time = "0.3.41" From 60d7c77f09415c82318ec13ff41450444aa72b0b Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 05:59:53 +0300 Subject: [PATCH 26/61] auth project setup --- src-auto-auth/.cargo/config.toml | 5 + src-auto-auth/.gitignore | 9 + src-auto-auth/Cargo.lock | 3278 ++++++++++++++++++++++++++++++ src-auto-auth/Cargo.toml | 18 + src-auto-auth/src/main.rs | 23 + 5 files changed, 3333 insertions(+) create mode 100644 src-auto-auth/.cargo/config.toml create mode 100644 src-auto-auth/.gitignore create mode 100644 src-auto-auth/Cargo.lock create mode 100644 src-auto-auth/Cargo.toml create mode 100644 src-auto-auth/src/main.rs diff --git a/src-auto-auth/.cargo/config.toml b/src-auto-auth/.cargo/config.toml new file mode 100644 index 00000000..d79c8728 --- /dev/null +++ b/src-auto-auth/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +rustflags = [ + "-Dwarnings", # treat all warnings as errors + "-Dunsafe_code", # deny unsafe blocks globally +] diff --git a/src-auto-auth/.gitignore b/src-auto-auth/.gitignore new file mode 100644 index 00000000..5cc1d24a --- /dev/null +++ b/src-auto-auth/.gitignore @@ -0,0 +1,9 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas + +output.log diff --git a/src-auto-auth/Cargo.lock b/src-auto-auth/Cargo.lock new file mode 100644 index 00000000..dda3dcf8 --- /dev/null +++ b/src-auto-auth/Cargo.lock @@ -0,0 +1,3278 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +dependencies = [ + "backtrace", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.0", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bzip2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +dependencies = [ + "bzip2-sys", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "c_linked_list" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" + +[[package]] +name = "cc" +version = "1.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dcl-launcher-core" +version = "1.11.2" +dependencies = [ + "anyhow", + "core-foundation 0.10.1", + "core-foundation-sys", + "deranged 0.4.0", + "dirs", + "fern", + "flate2", + "futures-util", + "get_if_addrs", + "humantime", + "libc", + "log", + "nix", + "plist", + "pretty_env_logger", + "regex", + "reqwest", + "rusqlite", + "segment", + "semver", + "sentry", + "sentry-anyhow", + "sentry-log", + "sentry-types", + "serde", + "serde_json", + "sysinfo", + "system-configuration", + "tar", + "thiserror 2.0.17", + "time", + "tokio", + "tokio-util", + "url", + "uuid", + "windows", + "windows-sys 0.59.0", + "zip", +] + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "serde", + "uuid", +] + +[[package]] +name = "deflate64" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" + +[[package]] +name = "deranged" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.1", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + +[[package]] +name = "filetime" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.60.2", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "libz-rs-sys", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gcc" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "get_if_addrs" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" +dependencies = [ + "c_linked_list", + "get_if_addrs-sys", + "libc", + "winapi 0.2.8", +] + +[[package]] +name = "get_if_addrs-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" +dependencies = [ + "gcc", + "libc", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if", + "libc", + "windows-link 0.1.3", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.2", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-rs-sys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" +dependencies = [ + "zlib-rs", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_info" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" +dependencies = [ + "log", + "plist", + "serde", + "windows-sys 0.52.0", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +dependencies = [ + "base64", + "indexmap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "pretty_env_logger" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 1.0.2", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.1", +] + +[[package]] +name = "rustls" +version = "0.23.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.1", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "segment" +version = "0.2.6" +source = "git+https://github.com/decentraland/segment?branch=main#60975a59daec3551a1e57e51b9ef871c059b70b7" +dependencies = [ + "async-trait", + "reqwest", + "rusqlite", + "serde", + "serde_json", + "thiserror 2.0.17", + "time", + "tokio", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "sentry" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "255914a8e53822abd946e2ce8baa41d4cded6b8e938913b7f7b9da5b7ab44335" +dependencies = [ + "httpdate", + "native-tls", + "reqwest", + "rustls", + "sentry-anyhow", + "sentry-backtrace", + "sentry-contexts", + "sentry-core", + "sentry-debug-images", + "sentry-log", + "sentry-panic", + "sentry-tracing", + "tokio", + "ureq", + "webpki-roots 0.26.11", +] + +[[package]] +name = "sentry-anyhow" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddfaa9f4d64827e05f394c72d5628d99bf27f8979ef37b89baf057fb4b8a908" +dependencies = [ + "anyhow", + "sentry-backtrace", + "sentry-core", +] + +[[package]] +name = "sentry-backtrace" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00293cd332a859961f24fd69258f7e92af736feaeb91020cff84dac4188a4302" +dependencies = [ + "backtrace", + "once_cell", + "regex", + "sentry-core", +] + +[[package]] +name = "sentry-contexts" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "961990f9caa76476c481de130ada05614cd7f5aa70fb57c2142f0e09ad3fb2aa" +dependencies = [ + "hostname", + "libc", + "os_info", + "rustc_version", + "sentry-core", + "uname", +] + +[[package]] +name = "sentry-core" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a6409d845707d82415c800290a5d63be5e3df3c2e417b0997c60531dfbd35ef" +dependencies = [ + "once_cell", + "rand 0.8.5", + "sentry-types", + "serde", + "serde_json", +] + +[[package]] +name = "sentry-debug-images" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71ab5df4f3b64760508edfe0ba4290feab5acbbda7566a79d72673065888e5cc" +dependencies = [ + "findshlibs", + "once_cell", + "sentry-core", +] + +[[package]] +name = "sentry-log" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693841da8dfb693af29105edfbea1d91348a13d23dd0a5d03761eedb9e450c46" +dependencies = [ + "log", + "sentry-core", +] + +[[package]] +name = "sentry-panic" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609b1a12340495ce17baeec9e08ff8ed423c337c1a84dffae36a178c783623f3" +dependencies = [ + "sentry-backtrace", + "sentry-core", +] + +[[package]] +name = "sentry-tracing" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f4e86402d5c50239dc7d8fd3f6d5e048221d5fcb4e026d8d50ab57fe4644cb" +dependencies = [ + "sentry-backtrace", + "sentry-core", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sentry-types" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3f117b8755dbede8260952de2aeb029e20f432e72634e8969af34324591631" +dependencies = [ + "debugid", + "hex", + "rand 0.8.5", + "serde", + "serde_json", + "thiserror 1.0.69", + "time", + "url", + "uuid", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "src-auto-auth" +version = "0.1.0" +dependencies = [ + "anyhow", + "dcl-launcher-core", + "fern", + "humantime", + "log", + "pretty_env_logger", + "serde", + "serde_json", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sysinfo" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.61.1", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged 0.5.4", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uname" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" +dependencies = [ + "libc", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64", + "log", + "native-tls", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots 0.26.11", +] + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.1", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.4", +] + +[[package]] +name = "windows-sys" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" +dependencies = [ + "windows-link 0.2.0", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "deflate64", + "flate2", + "getrandom 0.3.3", + "hmac", + "indexmap", + "lzma-rs", + "memchr", + "pbkdf2", + "sha1", + "time", + "xz2", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zlib-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" + +[[package]] +name = "zopfli" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/src-auto-auth/Cargo.toml b/src-auto-auth/Cargo.toml new file mode 100644 index 00000000..0b9cc9dd --- /dev/null +++ b/src-auto-auth/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "src-auto-auth" +version = "1.11.2" +edition = "2024" + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +log = "0.4" +fern = "0.7.1" +pretty_env_logger = "0.5.0" +humantime = "2.2.0" + +anyhow = "1.0.97" + +[dependencies.dcl-launcher-core] +path = "../core" diff --git a/src-auto-auth/src/main.rs b/src-auto-auth/src/main.rs new file mode 100644 index 00000000..e17af51e --- /dev/null +++ b/src-auto-auth/src/main.rs @@ -0,0 +1,23 @@ +use dcl_launcher_core::auto_auth::auth_token_storage::AuthTokenStorage; +use anyhow::Result; + +fn main() -> Result<()>{ + // TODO + // read path of installer from args + // read the token from installer.exe + // parse token + // write token to the location + // logging + + if AuthTokenStorage::has_token() { + println!("Token already installed"); + return Ok(()); + } + + let token = "exampe token"; + AuthTokenStorage::write_token(token)?; + + + println!("Complete"); + Ok(()) +} From 9d81c1a860f45b75d7d9f5d25d6f9865ff22a5f6 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 06:00:39 +0300 Subject: [PATCH 27/61] expose auth token; --- core/src/auto_auth.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 900da405..2a3474cf 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,4 +1,4 @@ -mod auth_token_storage; +pub mod auth_token_storage; use anyhow::{Result, anyhow}; From 8377e8ceec07efa4c0ad032981bd4ae7ec97b2ec Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 06:00:51 +0300 Subject: [PATCH 28/61] update lock --- src-tauri/Cargo.lock | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 60e4bc46..76d49230 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -702,7 +702,7 @@ dependencies = [ "uuid", "windows 0.61.3", "windows-sys 0.59.0", - "zip", + "zip 3.0.0", ] [[package]] @@ -1034,11 +1034,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", ] @@ -2164,6 +2165,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-rs-sys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" +dependencies = [ + "zlib-rs", +] + [[package]] name = "linux-raw-sys" version = "0.9.3" @@ -4465,7 +4475,7 @@ dependencies = [ "tokio", "url", "windows-sys 0.59.0", - "zip", + "zip 2.5.0", ] [[package]] @@ -6163,13 +6173,25 @@ name = "zip" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c03817464f64e23f6f37574b4fdc8cf65925b5bfd2b0f2aedf959791941f88" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "indexmap 2.8.0", + "memchr", +] + +[[package]] +name = "zip" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" dependencies = [ "aes", "arbitrary", "bzip2", "constant_time_eq", "crc32fast", - "crossbeam-utils", "deflate64", "flate2", "getrandom 0.3.2", @@ -6186,6 +6208,12 @@ dependencies = [ "zstd", ] +[[package]] +name = "zlib-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" + [[package]] name = "zopfli" version = "0.8.1" From d338e9ef4bcd0e8e12495018d585ae11c61099d3 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 06:02:49 +0300 Subject: [PATCH 29/61] add new project to bump version script --- update_version.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/update_version.rs b/update_version.rs index 0bf64b53..377b3988 100755 --- a/update_version.rs +++ b/update_version.rs @@ -18,17 +18,20 @@ const PACKAGE_JSON_LOCK: &str = "package-lock.json"; const APP_CONFIG_LOCK: &str = "src-tauri/tauri.conf.json"; const APP_RS_TOML: &str = "src-tauri/Cargo.toml"; const CORE_RS_TOML: &str = "core/Cargo.toml"; +const AUTO_AUTH_RS_TOML: &str = "src-auto-auth/Cargo.toml"; -const FILES: [&'static str; 5] = [ +const FILES: [&'static str; 6] = [ PACKAGE_JSON, PACKAGE_JSON_LOCK, APP_CONFIG_LOCK, APP_RS_TOML, CORE_RS_TOML, + AUTO_AUTH_RS_TOML ]; #[derive(Debug)] struct VersionPair { + #[allow(dead_code)] path: &'static str, version: Version, } From b16186675a0cf2139c96cf3b31a7b48c41cad8aa Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 06:06:12 +0300 Subject: [PATCH 30/61] add new project to analyzers --- .githooks/pre-commit | 2 +- package.json | 6 +++--- src-auto-auth/Cargo.lock | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 8edc4170..abd3e418 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -3,7 +3,7 @@ set -e echo "Running checks..." -for dir in core src-tauri; do +for dir in core src-tauri src-auto-auth; do echo "Executing $dir" ( cd "$dir" diff --git a/package.json b/package.json index f760e296..fbd051a1 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "build": "tsc && vite build", "preview": "vite preview", "tauri": "tauri", - "format": "npx prettier --write '**/*.{js,mjs,cjs,jsx,ts,ODmts,cts,tsx}'; cargo fmt --manifest-path src-tauri/Cargo.toml -- --check --verbose; cargo fmt --manifest-path core/Cargo.toml -- --check --verbose", - "analyze": "cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --all-features -- -D warnings; cargo clippy --manifest-path core/Cargo.toml --all-targets --all-features -- -D warnings" + "format": "npx prettier --write '**/*.{js,mjs,cjs,jsx,ts,ODmts,cts,tsx}'; cargo fmt --manifest-path src-tauri/Cargo.toml -- --check --verbose; cargo fmt --manifest-path core/Cargo.toml -- --check --verbose; cargo fmt --manifest-path src-auto-auth/Cargo.toml -- --check --verbose", + "analyze": "cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --all-features -- -D warnings; cargo clippy --manifest-path core/Cargo.toml --all-targets --all-features -- -D warnings; cargo clippy --manifest-path src-auto-auth/Cargo.toml --all-targets --all-features -- -D warnings" }, "dependencies": { "@sentry/react": "^8.29.0", @@ -35,4 +35,4 @@ "typescript": "~5.6.2", "vite": "^6.0.3" } -} \ No newline at end of file +} diff --git a/src-auto-auth/Cargo.lock b/src-auto-auth/Cargo.lock index dda3dcf8..dd5bc933 100644 --- a/src-auto-auth/Cargo.lock +++ b/src-auto-auth/Cargo.lock @@ -2060,7 +2060,7 @@ dependencies = [ [[package]] name = "src-auto-auth" -version = "0.1.0" +version = "1.11.2" dependencies = [ "anyhow", "dcl-launcher-core", From 56bf7ba494f15d3be224671344aed94b3715049e Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Wed, 1 Oct 2025 06:07:56 +0300 Subject: [PATCH 31/61] change resource directory --- src-tauri/tauri.windows.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index adb10947..db345957 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -2,7 +2,7 @@ "$schema": "https://schema.tauri.app/config/2", "bundle": { "resources": [ - "resource/auto-auth-token-fetch.exe" + "resources/auto-auth-token-fetch.exe" ] } } From db5bcd1fcd580840c08ff50f39708effc878dbd9 Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Wed, 1 Oct 2025 06:28:56 +0300 Subject: [PATCH 32/61] before build hook --- src-auto-auth/Cargo.toml | 12 ++++++++++++ src-tauri/resources/.gitignore | 1 + src-tauri/tauri.windows.conf.json | 3 +++ 3 files changed, 16 insertions(+) create mode 100644 src-tauri/resources/.gitignore diff --git a/src-auto-auth/Cargo.toml b/src-auto-auth/Cargo.toml index 0b9cc9dd..22f0b211 100644 --- a/src-auto-auth/Cargo.toml +++ b/src-auto-auth/Cargo.toml @@ -3,6 +3,18 @@ name = "src-auto-auth" version = "1.11.2" edition = "2024" +[profile.dev] +overflow-checks = true +incremental = true # Compile your binary in smaller steps. + +[profile.release] +overflow-checks = true +codegen-units = 1 # Allows LLVM to perform better optimization. +lto = true # Enables link-time-optimizations. +opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed. +panic = "abort" # Higher performance by disabling panic handlers. +strip = true # Ensures debug symbols are removed. + [dependencies] serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/src-tauri/resources/.gitignore b/src-tauri/resources/.gitignore new file mode 100644 index 00000000..65a37f3a --- /dev/null +++ b/src-tauri/resources/.gitignore @@ -0,0 +1 @@ +auto-auth-token-fetch.exe diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index db345957..ecd45c8f 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -4,6 +4,9 @@ "resources": [ "resources/auto-auth-token-fetch.exe" ] + }, + "build": { + "beforeBuildCommand": "cargo build --manifest-path ../src-auto-auth/Cargo.toml --release; cp ../src-auto-auth/target/release/src-auto-auth.exe resources/auto-auth-token-fetch.exe" } } From 66ad8f307713806ae4b3239d99f0033be45c7ef5 Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Wed, 1 Oct 2025 06:33:31 +0300 Subject: [PATCH 33/61] update hook --- src-tauri/windows/hooks.nsh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src-tauri/windows/hooks.nsh b/src-tauri/windows/hooks.nsh index 22ed516d..159ab9c1 100644 --- a/src-tauri/windows/hooks.nsh +++ b/src-tauri/windows/hooks.nsh @@ -1,3 +1,5 @@ !macro NSIS_HOOK_POSTINSTALL - MessageBox MB_OK "PostInstall" + MessageBox MB_OK "PostInstall $EXEPATH" + Exec '"$INSTDIR\resources\auto-auth-token-fetch.exe" $EXEPATH' + MessageBox MB_OK "PostInstall Complete" !macroend From 9b412be7ed322e31fe0fa65a6f6330f018b29ca1 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 06:52:30 +0300 Subject: [PATCH 34/61] expose logs --- core/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/lib.rs b/core/src/lib.rs index 2127ffe6..ec468359 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -31,7 +31,7 @@ pub mod errors; pub mod flow; pub mod installs; pub mod instances; -mod logs; +pub mod logs; mod monitoring; mod processes; pub mod protocols; From 7e0fa12b3d6662486101ab1ace6d449fddb53206 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 06:53:47 +0300 Subject: [PATCH 35/61] script read from installer setup --- src-auto-auth/Cargo.lock | 5 +--- src-auto-auth/Cargo.toml | 6 +---- src-auto-auth/src/main.rs | 57 ++++++++++++++++++++++++++++++++------- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src-auto-auth/Cargo.lock b/src-auto-auth/Cargo.lock index dd5bc933..b4424857 100644 --- a/src-auto-auth/Cargo.lock +++ b/src-auto-auth/Cargo.lock @@ -2063,11 +2063,8 @@ name = "src-auto-auth" version = "1.11.2" dependencies = [ "anyhow", + "base64", "dcl-launcher-core", - "fern", - "humantime", - "log", - "pretty_env_logger", "serde", "serde_json", ] diff --git a/src-auto-auth/Cargo.toml b/src-auto-auth/Cargo.toml index 22f0b211..905dfacc 100644 --- a/src-auto-auth/Cargo.toml +++ b/src-auto-auth/Cargo.toml @@ -19,12 +19,8 @@ strip = true # Ensures debug symbols are removed. serde = { version = "1", features = ["derive"] } serde_json = "1" -log = "0.4" -fern = "0.7.1" -pretty_env_logger = "0.5.0" -humantime = "2.2.0" - anyhow = "1.0.97" +base64 = "0.22.1" [dependencies.dcl-launcher-core] path = "../core" diff --git a/src-auto-auth/src/main.rs b/src-auto-auth/src/main.rs index e17af51e..4207c8a6 100644 --- a/src-auto-auth/src/main.rs +++ b/src-auto-auth/src/main.rs @@ -1,23 +1,62 @@ -use dcl_launcher_core::auto_auth::auth_token_storage::AuthTokenStorage; +use std::fs::File; +use std::io::{Read, Seek, SeekFrom}; +use std::process::exit; + use anyhow::Result; +use anyhow::anyhow; +use dcl_launcher_core::{auto_auth::auth_token_storage::AuthTokenStorage, log, logs}; +use std::io; + +use base64::prelude::*; -fn main() -> Result<()>{ +fn main() { + if let Err(e) = logs::dispath_logs() { + eprintln!("Cannot initialize logs: {e}"); + exit(1); + } + if let Err(e) = main_internal() { + log::error!("Error occurred running auto auth script: {e}"); + } +} + +fn main_internal() -> Result<()> { // TODO - // read path of installer from args // read the token from installer.exe // parse token - // write token to the location - // logging + log::info!("Start auto auth script"); if AuthTokenStorage::has_token() { - println!("Token already installed"); + log::info!("Token already installed"); return Ok(()); } - let token = "exampe token"; - AuthTokenStorage::write_token(token)?; + let args: Vec = std::env::args().collect(); + log::info!("Args: {args:?}"); + + let installer_path = args + .first() + .ok_or_else(|| anyhow!("Installer path is not provided"))?; + let token_binary = read_token(installer_path)?; - println!("Complete"); + // TODO actual encoding (json?) + let token = BASE64_STANDARD.encode(token_binary); + AuthTokenStorage::write_token(token.as_str())?; + + log::info!("Token write complete"); Ok(()) } + +fn read_token(path: &str) -> io::Result> { + let mut file = File::open(path)?; + let file_size = file.metadata()?.len(); + + // TODO replace to actual strategy + let read_size = 64.min(file_size as usize); + + file.seek(SeekFrom::End(-(read_size as i64)))?; + + let mut buffer = vec![0u8; read_size]; + file.read_exact(&mut buffer)?; + Ok(buffer) +} From ebfc68b9d4017af96ecfb1d5ec5bb270d0e38ddc Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Wed, 1 Oct 2025 07:01:42 +0300 Subject: [PATCH 36/61] update build command --- src-tauri/tauri.windows.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index ecd45c8f..77e5db6f 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -6,7 +6,7 @@ ] }, "build": { - "beforeBuildCommand": "cargo build --manifest-path ../src-auto-auth/Cargo.toml --release; cp ../src-auto-auth/target/release/src-auto-auth.exe resources/auto-auth-token-fetch.exe" + "beforeBuildCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe" } } From 4176ac7fe082f881434d435cdaa84c431b2b5ffb Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 07:14:24 +0300 Subject: [PATCH 37/61] proper stripping --- core/Cargo.toml | 2 +- src-auto-auth/Cargo.toml | 3 ++- src-tauri/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index e4577bdc..7a396c65 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,7 @@ codegen-units = 1 # Allows LLVM to perform better optimization. lto = true # Enables link-time-optimizations. opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed. panic = "abort" # Higher performance by disabling panic handlers. -strip = true # Ensures debug symbols are removed. +strip = "symbols" # Ensures debug symbols are removed. [dependencies] # fix for the issue: https://github.com/ebarnard/rust-plist/issues/151 diff --git a/src-auto-auth/Cargo.toml b/src-auto-auth/Cargo.toml index 905dfacc..c763ea70 100644 --- a/src-auto-auth/Cargo.toml +++ b/src-auto-auth/Cargo.toml @@ -13,7 +13,8 @@ codegen-units = 1 # Allows LLVM to perform better optimization. lto = true # Enables link-time-optimizations. opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed. panic = "abort" # Higher performance by disabling panic handlers. -strip = true # Ensures debug symbols are removed. +strip = "symbols" # Ensures debug symbols are removed. + [dependencies] serde = { version = "1", features = ["derive"] } diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 966f1398..5885689b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -30,7 +30,7 @@ codegen-units = 1 lto = true opt-level = "z" panic = "abort" -strip = true +strip = "symbols" [build-dependencies.tauri-build] version = "2" From 3ed00d83cf39fc326da89db03a69c46ef2f91d14 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 07:18:25 +0300 Subject: [PATCH 38/61] before lsdev command --- src-tauri/tauri.windows.conf.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 77e5db6f..e74b2dca 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -6,6 +6,7 @@ ] }, "build": { + "beforeDevCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe" "beforeBuildCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe" } } From 2e6f7b5fdb7337fe687301dd55ccc5039ea33303 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 07:27:24 +0300 Subject: [PATCH 39/61] add missing comma --- src-tauri/tauri.windows.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index e74b2dca..5a8dbf28 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -6,7 +6,7 @@ ] }, "build": { - "beforeDevCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe" + "beforeDevCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe", "beforeBuildCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe" } } From 5504b9f998619fbc45a9b6ab7740aeea0c18dbef Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Wed, 1 Oct 2025 12:40:14 +0300 Subject: [PATCH 40/61] update tauri config --- pre-build-auto-auth.ps1 | 3 +++ src-tauri/tauri.windows.conf.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 pre-build-auto-auth.ps1 diff --git a/pre-build-auto-auth.ps1 b/pre-build-auto-auth.ps1 new file mode 100644 index 00000000..c4395ec6 --- /dev/null +++ b/pre-build-auto-auth.ps1 @@ -0,0 +1,3 @@ +echo (pwd) +cargo build --manifest-path src-auto-auth/Cargo.toml --release; +cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe; diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 5a8dbf28..72c83e33 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -6,8 +6,8 @@ ] }, "build": { - "beforeDevCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe", - "beforeBuildCommand": "cargo build --manifest-path src-auto-auth/Cargo.toml --release && cp src-auto-auth/target/release/src-auto-auth.exe src-tauri/resources/auto-auth-token-fetch.exe" + "beforeDevCommand": "powershell -ExecutionPolicy Bypass -File ./pre-build-auto-auth.ps1", + "beforeBuildCommand": "powershell -ExecutionPolicy Bypass -File ./pre-build-auto-auth.ps1" } } From 4d950e51c960b8e0dfccdccee363b9f2bcd4b8d4 Mon Sep 17 00:00:00 2001 From: NickKhalow Date: Wed, 1 Oct 2025 12:45:55 +0300 Subject: [PATCH 41/61] prebuild auto auth --- .github/workflows/release.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bbc23041..83df3a3b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -200,10 +200,19 @@ jobs: SIGN_SCRIPT_PATH="${GITHUB_WORKSPACE}/src-tauri/scripts/sign.ps1" sed -i.bak "s|\"sign.ps1\"|\"${SIGN_SCRIPT_PATH//\\/\/}\"|g" src-tauri/tauri.conf.json + - name: Prebuild AutoAuth + working-directory: ${{ github.workspace }} + if: ${{ matrix.os == 'windows-latest' }} + run: powershell -ExecutionPolicy Bypass -File ./pre-build-auto-auth.ps1 + - name: Code Analysis Core working-directory: ${{ github.workspace }}/core run: cargo clippy --all-targets --all-features -- -D warnings + - name: Code Analysis AutoAuth + working-directory: ${{ github.workspace }}/src-auto-auth + run: cargo clippy --all-targets --all-features -- -D warnings + - name: Code Analysis Tauri working-directory: ${{ github.workspace }}/src-tauri run: cargo clippy --all-targets --all-features -- -D warnings From 2de198547cfc79ddf5e7d66d80e6ccb69e622019 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 15:11:11 +0300 Subject: [PATCH 42/61] remove NSIS message boxes, proper path args propagation, version print on start, headless mode --- src-auto-auth/src/main.rs | 5 ++++- src-tauri/windows/hooks.nsh | 4 +--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src-auto-auth/src/main.rs b/src-auto-auth/src/main.rs index 4207c8a6..63735906 100644 --- a/src-auto-auth/src/main.rs +++ b/src-auto-auth/src/main.rs @@ -1,3 +1,6 @@ +// Avoid popup terminal window +#![windows_subsystem = "windows"] + use std::fs::File; use std::io::{Read, Seek, SeekFrom}; use std::process::exit; @@ -24,7 +27,7 @@ fn main_internal() -> Result<()> { // read the token from installer.exe // parse token - log::info!("Start auto auth script"); + log::info!("Start auto auth script v{}", std::env!("CARGO_PKG_VERSION")); if AuthTokenStorage::has_token() { log::info!("Token already installed"); return Ok(()); diff --git a/src-tauri/windows/hooks.nsh b/src-tauri/windows/hooks.nsh index 159ab9c1..4b1793f4 100644 --- a/src-tauri/windows/hooks.nsh +++ b/src-tauri/windows/hooks.nsh @@ -1,5 +1,3 @@ !macro NSIS_HOOK_POSTINSTALL - MessageBox MB_OK "PostInstall $EXEPATH" - Exec '"$INSTDIR\resources\auto-auth-token-fetch.exe" $EXEPATH' - MessageBox MB_OK "PostInstall Complete" + Exec '"$INSTDIR\resources\auto-auth-token-fetch.exe" "$EXEPATH"' !macroend From 9a96848cd3e092e0d95ae9a0e6b657ac94a12843 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 1 Oct 2025 17:57:04 +0300 Subject: [PATCH 43/61] replace json to txt for token files --- core/src/auto_auth/auth_token_storage.rs | 15 ++------------- core/src/installs.rs | 4 ++-- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/core/src/auto_auth/auth_token_storage.rs b/core/src/auto_auth/auth_token_storage.rs index 49306962..4aaf39cd 100644 --- a/core/src/auto_auth/auth_token_storage.rs +++ b/core/src/auto_auth/auth_token_storage.rs @@ -1,7 +1,6 @@ use std::fs; use anyhow::Result; -use serde_json::json; use crate::installs::auth_token_bridge_path; use crate::installs::auth_token_marker_path; @@ -22,18 +21,8 @@ impl AuthTokenStorage { } pub fn write_token(token: &str) -> Result<()> { - let json = json!( - { - "token": token - } - ); - - let marker_file = fs::File::create(auth_token_marker_path())?; - serde_json::to_writer_pretty(marker_file, &json)?; - - let bridge_file = fs::File::create(auth_token_bridge_path())?; - serde_json::to_writer_pretty(bridge_file, &json)?; - + fs::write(auth_token_marker_path(), token)?; + fs::write(auth_token_bridge_path(), token)?; Ok(()) } } diff --git a/core/src/installs.rs b/core/src/installs.rs index 1b58212b..d4180bec 100644 --- a/core/src/installs.rs +++ b/core/src/installs.rs @@ -68,11 +68,11 @@ pub fn config_path() -> PathBuf { } pub fn auth_token_marker_path() -> PathBuf { - explorer_path().join("auth-token-marker.json") + explorer_path().join("auth-token-marker.txt") } pub fn auth_token_bridge_path() -> PathBuf { - explorer_path().join("auth-token-bridge.json") + explorer_path().join("auth-token-bridge.txt") } pub fn analytics_queue_db_path() -> PathBuf { From 57bc8e29be3d4c7581d65463afbf517d3184aec6 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Mon, 13 Oct 2025 14:09:21 +0300 Subject: [PATCH 44/61] read token --- core/src/lib.rs | 1 + src-auto-auth/Cargo.lock | 4 --- src-auto-auth/Cargo.toml | 8 ----- src-auto-auth/src/main.rs | 76 ++++++++++++++++++++++++++------------- 4 files changed, 52 insertions(+), 37 deletions(-) diff --git a/core/src/lib.rs b/core/src/lib.rs index ec468359..58302b9b 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -39,4 +39,5 @@ pub mod s3; pub mod types; pub mod utils; +pub use anyhow; pub use log; diff --git a/src-auto-auth/Cargo.lock b/src-auto-auth/Cargo.lock index b4424857..8b410f12 100644 --- a/src-auto-auth/Cargo.lock +++ b/src-auto-auth/Cargo.lock @@ -2062,11 +2062,7 @@ dependencies = [ name = "src-auto-auth" version = "1.11.2" dependencies = [ - "anyhow", - "base64", "dcl-launcher-core", - "serde", - "serde_json", ] [[package]] diff --git a/src-auto-auth/Cargo.toml b/src-auto-auth/Cargo.toml index c763ea70..c5f8516e 100644 --- a/src-auto-auth/Cargo.toml +++ b/src-auto-auth/Cargo.toml @@ -15,13 +15,5 @@ opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed. panic = "abort" # Higher performance by disabling panic handlers. strip = "symbols" # Ensures debug symbols are removed. - -[dependencies] -serde = { version = "1", features = ["derive"] } -serde_json = "1" - -anyhow = "1.0.97" -base64 = "0.22.1" - [dependencies.dcl-launcher-core] path = "../core" diff --git a/src-auto-auth/src/main.rs b/src-auto-auth/src/main.rs index 63735906..03b5c5a2 100644 --- a/src-auto-auth/src/main.rs +++ b/src-auto-auth/src/main.rs @@ -1,16 +1,18 @@ // Avoid popup terminal window #![windows_subsystem = "windows"] -use std::fs::File; -use std::io::{Read, Seek, SeekFrom}; -use std::process::exit; +use std::{ + fs::File, + io, + io::{Read, Seek, SeekFrom}, + process::exit, +}; -use anyhow::Result; -use anyhow::anyhow; -use dcl_launcher_core::{auto_auth::auth_token_storage::AuthTokenStorage, log, logs}; -use std::io; - -use base64::prelude::*; +use dcl_launcher_core::{ + anyhow::{Result, anyhow}, + auto_auth::auth_token_storage::AuthTokenStorage, + log, logs, +}; fn main() { if let Err(e) = logs::dispath_logs() { @@ -23,10 +25,6 @@ fn main() { } fn main_internal() -> Result<()> { - // TODO - // read the token from installer.exe - // parse token - log::info!("Start auto auth script v{}", std::env!("CARGO_PKG_VERSION")); if AuthTokenStorage::has_token() { log::info!("Token already installed"); @@ -40,26 +38,54 @@ fn main_internal() -> Result<()> { .first() .ok_or_else(|| anyhow!("Installer path is not provided"))?; - let token_binary = read_token(installer_path)?; - - // TODO actual encoding (json?) - let token = BASE64_STANDARD.encode(token_binary); + let token = read_token(installer_path)?; AuthTokenStorage::write_token(token.as_str())?; - log::info!("Token write complete"); Ok(()) } -fn read_token(path: &str) -> io::Result> { +// MAGIC (8B) = ASCII "DCLSIGv1" +// DATA (LEN B) = UTF-8 of token (UUIDv4) +// LEN (4B LE) = length of DATA (uint32) +pub fn read_token(path: &str) -> io::Result { let mut file = File::open(path)?; let file_size = file.metadata()?.len(); - // TODO replace to actual strategy - let read_size = 64.min(file_size as usize); + // Seek to the last 4 bytes (LEN field) + file.seek(SeekFrom::End(-4))?; + + let mut len_buf = [0u8; 4]; + file.read_exact(&mut len_buf)?; + let len = u32::from_le_bytes(len_buf) as u64; + + // Seek backward to read the DATA (token UTF-8 string) + // Total to read: MAGIC(8) + DATA(len) + LEN(4) + let trailer_size = 8 + len + 4; + if trailer_size > file_size { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "File too small for trailer", + )); + } + + file.seek(SeekFrom::End(-(trailer_size as i64)))?; + + let mut trailer = vec![0u8; trailer_size as usize]; + file.read_exact(&mut trailer)?; + + // Validate MAGIC and extract DATA + let magic = &trailer[..8]; + if magic != b"DCLSIGv1" { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid trailer magic", + )); + } - file.seek(SeekFrom::End(-(read_size as i64)))?; + let data = &trailer[8..(8 + len as usize)]; + let token = std::str::from_utf8(data) + .map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-8 in token"))? + .to_owned(); - let mut buffer = vec![0u8; read_size]; - file.read_exact(&mut buffer)?; - Ok(buffer) + Ok(token) } From 81335710371e9e518b7b09c31abb6bd0bde10621 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Mon, 13 Oct 2025 17:42:38 +0300 Subject: [PATCH 45/61] integration test for the token from file function --- src-auto-auth/src/main.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src-auto-auth/src/main.rs b/src-auto-auth/src/main.rs index 03b5c5a2..1acf0f5e 100644 --- a/src-auto-auth/src/main.rs +++ b/src-auto-auth/src/main.rs @@ -38,7 +38,7 @@ fn main_internal() -> Result<()> { .first() .ok_or_else(|| anyhow!("Installer path is not provided"))?; - let token = read_token(installer_path)?; + let token = token_from_file(installer_path)?; AuthTokenStorage::write_token(token.as_str())?; log::info!("Token write complete"); Ok(()) @@ -47,7 +47,7 @@ fn main_internal() -> Result<()> { // MAGIC (8B) = ASCII "DCLSIGv1" // DATA (LEN B) = UTF-8 of token (UUIDv4) // LEN (4B LE) = length of DATA (uint32) -pub fn read_token(path: &str) -> io::Result { +pub fn token_from_file(path: &str) -> io::Result { let mut file = File::open(path)?; let file_size = file.metadata()?.len(); @@ -89,3 +89,22 @@ pub fn read_token(path: &str) -> io::Result { Ok(token) } + +#[cfg(test)] +mod tests { + use super::*; + use dcl_launcher_core::anyhow::Result; + + #[test] + fn test_integration_token_from_file() -> Result<()> { + let file_path = option_env!("EXE_WITH_TOKEN"); + let Some(path) = file_path else { + println!("no env var provided EXE_WITH_TOKEN"); + return Ok(()); + }; + + let token = token_from_file(path)?; + println!("{token}"); + Ok(()) + } +} From 40f8e703142c1d3bffac3c014314a80e65fc46ac Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Tue, 14 Oct 2025 12:27:58 +0300 Subject: [PATCH 46/61] update background for dmg --- src-tauri/images/background.png | Bin 221591 -> 122755 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src-tauri/images/background.png b/src-tauri/images/background.png index fa06f7db54422dd0ada967787f17c3542c242f19..b1761fd9c9b7a9dfc6c10066aa00475d3fc3d0d1 100644 GIT binary patch literal 122755 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

52~Y^~Y#c_<7jh;Y*zDc}Psm$L8b*3W&P z#dHfZ?Siy5F_-7LgE78PE<>PlZyE%^RsNnFac4L!5r=T7ASv6IdF~(lb~}d~9!jLN z^#fkTHaCGRDAexh#xQpn&K2i?V6nE`O{ICYG1blX`ax^wI{lRGBC3lLx=t-bHNC3S zf#dsG`;aM@*mwr3@r;2*g1=ASS<={5^A`wZwy87_Pqw}jsI!qE_N)Ws3XC;UTS1}bb%a{akc7&ik4w|A z?~NBetyZ}!RbTBvvQ}vT6h#V_?@36#q(7H;@;g&_pI(z}WE7L5ywd*auZmQVzR`W( z3{&{p`j6AFG11Bg-mqrVwo?A?{;2e*#%f%19UE)RY`h(6b}h)O&maghy$5XA_s3XJ zY=-E;N321_*W?9Eqj8g*uAO*+NDffw^|&nZh6%9JF9ZMfCCbNoC=HJP^1QPhM*BRm z;Z4+;BFR$$DCrdHYSsk6(t2Ho(`dWE+1{=L=oLnA^3MhXg|cBN5R@g&7pn=SvY*3=XaWZ-j1zZo?KmhcehB z(YAUh(uUytWGZDKfl|L0+PIb#6)%!(O>^QmQ`fZ*nP?HQMmW?@oneu658suxwYd46 z7wWvo{c3_p$7`OFVk0GVQx{||VCPS#^4QCGMQ%&WD|?-Rn(^m!g9A)W1IV{*pTC_a zZbT4>r1xO!&zrWB)G|uN*qo3{X);X|hb3<)*tH{s5JXtMM`yq9M*6Oao(@H&7a{Q# zXyE+IYn2sr?q%L1%wBME2bL|^bx0+m1FN|P1vTCSuW~V#0c`;sg6;^~v936R#%P#% z#+ipNT~juW)S6Cb>noHKkDfU!&2@T*X{bLFHF|t7il-Vc@5;bi%FRVZOa}fj zM%^T+lgt!PSA1rmPSX}^$P}`Hy1|hBpsJT1b$5BCpznQU4Tv(mWGeB?2lAf0u2yJuRt|Z-2?9;wOgkcZ4Bm?6?FD2aWz%N6pyJaUn8r zed<8E$c0n0)CU%zR&iV4;u(qv*o@DYOsoOQ+e{sYC|fAvtn0 zB`g2xH$iOMZwGXBmi>N8TRvW&&?G2X#~%x^VNT2!;o7w z$4P|iVuC^mk^5I0PARi$o?c$Q8B4`P|6)d0xv_Qq zhNM4WxDc$96JQ9Wq>7|*RD)076m{w4*Jy{(yK)$XlxUJW83o8a6b>a6)>!RO*1TJk z1d&zXIloIE!?d)NK1uD^i(LIB)K%V%=&P$Y-4(|z+4t&|-H%1s>y1U}3c%7r+pXjU zptR8|ei!&68xFi9Z@n_#sVcNpogcok4q39VvVjkq?)dXtpS7w5Ff`ucX5S?2u_^1nZHQyB%b%zn8o@!Gd{^v z&W3>lqoo;-WM5^Ou3}u`QZ)#7ezN$K76T-6tfNMwwY7qQK?#_lR$R*{_z|?w_UdQz z6@Bpf%%S#miXMq%{BA;d*qGnbmNlc%r@2FZ$bcUuc8uNVZ*R1WW15Kjn{aRtfE$cl z^aMNA3X={}LR;I#n1E2idg@g&S^6whEt^&nK;ER$&{Nm4FkR%lo0{8#vZ9MWuVtZ5 zK)vYcSVv&A63+`J#yudZhpq$FM5PV({_{a8FYV0%h0q-anJ&{Bx&FVs*115ykxlvG z`*Iz|W!G(Mt{mfK%97q5lZ_AYeR+wln+;DNt z5+DFz>2;`6Kq*YE@VjFhq9Q_Ygx;WB-L$X}nC$NjXRh~n8*1m&&1g?0*cAgoJiyE~ z)bhQ@!y=wQI38892v;FubDNv-VTdJSSO$>BO^t6a|rtd&72 zu}tYS6ZC^0B>wOPlFX%a-E?)%fyYR43h?Io^7#0H9v?o?*FWFr*I$33U#@?D{QaNw z_460vJH;Sg`Y2995UN2Jt1I~V1KO#{XRZx&Cwg q=laj}pX)!@f3E*r|GEC3T>l%sNTbmfl7(yl0000 Date: Wed, 15 Oct 2025 11:30:15 +0300 Subject: [PATCH 47/61] remove redundant code --- core/src/auto_auth.rs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 2a3474cf..2ec364d9 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -16,6 +16,7 @@ impl AutoAuth { return; } + #[cfg(target_os = "macos")] match Self::obtain_token_internal() { Ok(token) => { let Some(token) = token else { @@ -70,16 +71,6 @@ impl AutoAuth { Ok(token) } - - #[cfg(target_os = "windows")] - // For dev only, remove later ==== - #[allow(clippy::unnecessary_wraps)] - #[allow(clippy::missing_const_for_fn)] - // ==== - fn obtain_token_internal() -> Result> { - //TODO - Err(anyhow!("Not implemented")) - } } #[cfg(target_os = "macos")] From 9d7747822f91bb5c06976b1eaa3809140502d903 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 12:22:08 +0300 Subject: [PATCH 48/61] skip update if from dmg --- core/src/auto_auth.rs | 180 +-------------------------------- core/src/environment.rs | 2 + core/src/environment/macos.rs | 184 ++++++++++++++++++++++++++++++++++ src-tauri/src/lib.rs | 18 +++- 4 files changed, 208 insertions(+), 176 deletions(-) create mode 100644 core/src/environment/macos.rs diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 2ec364d9..34c7905b 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -2,9 +2,6 @@ pub mod auth_token_storage; use anyhow::{Result, anyhow}; -#[cfg(target_os = "macos")] -use std::path::{Path, PathBuf}; - use auth_token_storage::AuthTokenStorage; pub struct AutoAuth {} @@ -35,11 +32,16 @@ impl AutoAuth { } } + #[cfg(target_os = "macos")] + pub fn try_auto_copy_from_dmg() {} + #[cfg(target_os = "macos")] fn obtain_token_internal() -> Result> { use anyhow::Context; use std::borrow::ToOwned; + use crate::environment::macos::{dmg_backing_file, dmg_mount_path, where_from_attr}; + let path = std::env::current_exe()?; log::info!("Exe path: {}", path.display()); let dmg_mount_path = dmg_mount_path(&path)?; @@ -72,175 +74,3 @@ impl AutoAuth { Ok(token) } } - -#[cfg(target_os = "macos")] -#[allow(unsafe_code)] -fn dmg_mount_path(exe_path: &Path) -> Result> { - use libc::MNT_RDONLY; - use libc::statfs; - use std::ffi::CStr; - use std::ffi::CString; - - let cpath = CString::new(exe_path.to_string_lossy().to_string())?; - let mut sfs: statfs = unsafe { std::mem::zeroed() }; - - let res = unsafe { statfs(cpath.as_ptr(), &raw mut sfs) }; - if res != 0 { - return Err(anyhow::anyhow!("Cannot read statfs")); - } - - let mntfrom = unsafe { CStr::from_ptr(sfs.f_mntfromname.as_ptr()) } - .to_string_lossy() - .to_string(); - let mnton = unsafe { CStr::from_ptr(sfs.f_mntonname.as_ptr()) } - .to_string_lossy() - .to_string(); - - let is_readonly = sfs.f_flags & MNT_RDONLY as u32 != 0; - log::info!("exe mount data, from: {mntfrom}, on: {mnton}, readonly: {is_readonly}"); - - if is_readonly && mntfrom.to_lowercase().starts_with("/volumes/") { - Ok(Some(mntfrom.into())) - } else { - Ok(None) - } -} - -#[allow(unsafe_code)] -#[cfg(target_os = "macos")] -fn where_from_attr(dmg_path: &Path) -> Result>> { - use libc::getxattr; - use plist::Value; - use std::{ffi::CString, ptr}; - - let cpath = CString::new(dmg_path.to_string_lossy().to_string())?; - let attr = CString::new("com.apple.metadata:kMDItemWhereFroms")?; - - // size - let size = unsafe { getxattr(cpath.as_ptr(), attr.as_ptr(), ptr::null_mut(), 0, 0, 0) }; - if size <= 0 { - return Err(anyhow::anyhow!("Cannot read size")); - } - - // read contents - #[allow(clippy::cast_sign_loss)] - let mut buf = vec![0u8; size as usize]; - let ret = unsafe { - getxattr( - cpath.as_ptr(), - attr.as_ptr(), - buf.as_mut_ptr().cast(), - buf.len(), - 0, - 0, - ) - }; - if ret <= 0 { - return Err(anyhow::anyhow!("Cannot read xattr")); - } - - // Decode binary plist to array of strings - let mut cursor = std::io::Cursor::new(&buf[..]); - let val = Value::from_reader(&mut cursor)?; - - if let Some(arr) = val.into_array() { - let urls: Vec = arr - .into_iter() - .filter_map(plist::Value::into_string) - .collect(); - if urls.is_empty() { - Ok(None) - } else { - Ok(Some(urls)) - } - } else { - Ok(None) - } -} - -#[cfg(target_os = "macos")] -fn dmg_backing_file(mount_point: &str) -> Result> { - let output = std::process::Command::new("hdiutil") - .args(["info", "-plist"]) - .output()?; - let plist = plist::Value::from_reader_xml(&*output.stdout)?; - let dict = plist - .as_dictionary() - .ok_or_else(|| anyhow!("Cannot convert plist to dictionary"))?; - let images = dict - .get("images") - .ok_or_else(|| anyhow!("No images found in plist"))? - .as_array() - .ok_or_else(|| anyhow!("Images is not an array"))?; - for image in images { - if let Some(props) = image.as_dictionary() { - if let (Some(img_path), Some(system_entities)) = - (props.get("image-path"), props.get("system-entities")) - { - if let (Some(img_path), Some(system_entities)) = - (img_path.as_string(), system_entities.as_array()) - { - for ent in system_entities { - if let Some(ent) = ent.as_dictionary() { - if let Some(mount_point_str) = - ent.get("mount-point").and_then(|v| v.as_string()) - { - if mount_point_str == mount_point { - return Ok(Some(PathBuf::from(img_path))); - } - } - } - } - } - } - } - } - Ok(None) -} - -#[cfg(target_os = "macos")] -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_where_from_integration() -> Result<()> { - let path = std::option_env!("TEST_DMG_PATH"); - let Some(path) = path else { - println!("TEST_DMG_PATH is not provided, ignoring test"); - return Ok(()); - }; - - let path = Path::new(path); - let attr = where_from_attr(path)?; - println!("Where from attr: {attr:?}"); - Ok(()) - } - - #[test] - fn test_dmg_mount_path_integration() -> Result<()> { - let path = std::option_env!("TEST_EXE_MOUNT_PATH"); - let Some(path) = path else { - println!("TEST_EXE_MOUNT_PATH is not provided, ignoring test"); - return Ok(()); - }; - - let path = Path::new(path); - let dmg_mount_path = dmg_mount_path(path)?; - println!("Exe is running from dmg: {dmg_mount_path:?}"); - Ok(()) - } - - #[test] - fn test_dmg_backing_file_integration() -> Result<()> { - let path = std::option_env!("TEST_DMG_BACKING"); - let Some(path) = path else { - println!("TEST_DMG_BACKING is not provided, ignoring test"); - return Ok(()); - }; - - let dmg_mount_path = dmg_backing_file(path)?; - println!("Exe is running from backing dmg: {dmg_mount_path:?}"); - Ok(()) - } -} diff --git a/core/src/environment.rs b/core/src/environment.rs index 590aecf2..f8382fe7 100644 --- a/core/src/environment.rs +++ b/core/src/environment.rs @@ -1,3 +1,5 @@ +pub mod macos; + use log::info; use crate::config; diff --git a/core/src/environment/macos.rs b/core/src/environment/macos.rs new file mode 100644 index 00000000..17214fda --- /dev/null +++ b/core/src/environment/macos.rs @@ -0,0 +1,184 @@ +#[cfg(target_os = "macos")] +use std::path::{Path, PathBuf}; + +#[cfg(target_os = "macos")] +use anyhow::{Result, anyhow}; + +#[cfg(target_os = "macos")] +pub fn is_running_from_dmg() -> Result { + let path = std::env::current_exe()?; + let dmg_mount_path = dmg_mount_path(&path)?; + Ok(dmg_mount_path.is_some()) +} + +#[cfg(target_os = "macos")] +#[allow(unsafe_code)] +pub fn dmg_mount_path(exe_path: &Path) -> Result> { + use libc::MNT_RDONLY; + use libc::statfs; + use std::ffi::CStr; + use std::ffi::CString; + + let cpath = CString::new(exe_path.to_string_lossy().to_string())?; + let mut sfs: statfs = unsafe { std::mem::zeroed() }; + + let res = unsafe { statfs(cpath.as_ptr(), &raw mut sfs) }; + if res != 0 { + return Err(anyhow::anyhow!("Cannot read statfs")); + } + + let mntfrom = unsafe { CStr::from_ptr(sfs.f_mntfromname.as_ptr()) } + .to_string_lossy() + .to_string(); + let mnton = unsafe { CStr::from_ptr(sfs.f_mntonname.as_ptr()) } + .to_string_lossy() + .to_string(); + + let is_readonly = sfs.f_flags & MNT_RDONLY as u32 != 0; + log::info!("exe mount data, from: {mntfrom}, on: {mnton}, readonly: {is_readonly}"); + + if is_readonly && mntfrom.to_lowercase().starts_with("/volumes/") { + Ok(Some(mntfrom.into())) + } else { + Ok(None) + } +} + +#[allow(unsafe_code)] +#[cfg(target_os = "macos")] +pub fn where_from_attr(dmg_path: &Path) -> Result>> { + use libc::getxattr; + use plist::Value; + use std::{ffi::CString, ptr}; + + let cpath = CString::new(dmg_path.to_string_lossy().to_string())?; + let attr = CString::new("com.apple.metadata:kMDItemWhereFroms")?; + + // size + let size = unsafe { getxattr(cpath.as_ptr(), attr.as_ptr(), ptr::null_mut(), 0, 0, 0) }; + if size <= 0 { + return Err(anyhow::anyhow!("Cannot read size")); + } + + // read contents + #[allow(clippy::cast_sign_loss)] + let mut buf = vec![0u8; size as usize]; + let ret = unsafe { + getxattr( + cpath.as_ptr(), + attr.as_ptr(), + buf.as_mut_ptr().cast(), + buf.len(), + 0, + 0, + ) + }; + if ret <= 0 { + return Err(anyhow::anyhow!("Cannot read xattr")); + } + + // Decode binary plist to array of strings + let mut cursor = std::io::Cursor::new(&buf[..]); + let val = Value::from_reader(&mut cursor)?; + + if let Some(arr) = val.into_array() { + let urls: Vec = arr + .into_iter() + .filter_map(plist::Value::into_string) + .collect(); + if urls.is_empty() { + Ok(None) + } else { + Ok(Some(urls)) + } + } else { + Ok(None) + } +} + +#[cfg(target_os = "macos")] +pub fn dmg_backing_file(mount_point: &str) -> Result> { + let output = std::process::Command::new("hdiutil") + .args(["info", "-plist"]) + .output()?; + let plist = plist::Value::from_reader_xml(&*output.stdout)?; + let dict = plist + .as_dictionary() + .ok_or_else(|| anyhow!("Cannot convert plist to dictionary"))?; + let images = dict + .get("images") + .ok_or_else(|| anyhow!("No images found in plist"))? + .as_array() + .ok_or_else(|| anyhow!("Images is not an array"))?; + for image in images { + if let Some(props) = image.as_dictionary() { + if let (Some(img_path), Some(system_entities)) = + (props.get("image-path"), props.get("system-entities")) + { + if let (Some(img_path), Some(system_entities)) = + (img_path.as_string(), system_entities.as_array()) + { + for ent in system_entities { + if let Some(ent) = ent.as_dictionary() { + if let Some(mount_point_str) = + ent.get("mount-point").and_then(|v| v.as_string()) + { + if mount_point_str == mount_point { + return Ok(Some(PathBuf::from(img_path))); + } + } + } + } + } + } + } + } + Ok(None) +} + +#[cfg(target_os = "macos")] +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_where_from_integration() -> Result<()> { + let path = std::option_env!("TEST_DMG_PATH"); + let Some(path) = path else { + println!("TEST_DMG_PATH is not provided, ignoring test"); + return Ok(()); + }; + + let path = Path::new(path); + let attr = where_from_attr(path)?; + println!("Where from attr: {attr:?}"); + Ok(()) + } + + #[test] + fn test_dmg_mount_path_integration() -> Result<()> { + let path = std::option_env!("TEST_EXE_MOUNT_PATH"); + let Some(path) = path else { + println!("TEST_EXE_MOUNT_PATH is not provided, ignoring test"); + return Ok(()); + }; + + let path = Path::new(path); + let dmg_mount_path = dmg_mount_path(path)?; + println!("Exe is running from dmg: {dmg_mount_path:?}"); + Ok(()) + } + + #[test] + fn test_dmg_backing_file_integration() -> Result<()> { + let path = std::option_env!("TEST_DMG_BACKING"); + let Some(path) = path else { + println!("TEST_DMG_BACKING is not provided, ignoring test"); + return Ok(()); + }; + + let dmg_mount_path = dmg_backing_file(path)?; + println!("Exe is running from backing dmg: {dmg_mount_path:?}"); + Ok(()) + } +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index acf8781c..f4622096 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -148,7 +148,23 @@ async fn update_if_needed_and_restart( app: &AppHandle, app_state: &AppState, channel: &StatusChannel, -) -> tauri_plugin_updater::Result<()> { +) -> anyhow::Result<()> { + #[cfg(target_os = "macos")] + match dcl_launcher_core::environment::macos::is_running_from_dmg() { + Ok(from_dmg) => { + if from_dmg { + info!("App is running from dmg, skipping update since mount is read-only"); + return Ok(()); + } + } + Err(e) => { + return Err(anyhow::anyhow!( + "Cannot define if dmg or not, skipping update: {}", + e + )); + } + } + channel.send_silent(LauncherUpdate::CheckingForUpdate.into()); if let Some(update) = current_updater(app)?.check().await? { let mut downloaded: usize = 0; From f4f17702d882af5198a53f8036c77f7671ee437e Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 12:23:04 +0300 Subject: [PATCH 49/61] auto install --- core/src/auto_auth.rs | 63 ++++++++++++++++++++++++++++++++++++++++++- src-tauri/src/lib.rs | 2 ++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 34c7905b..abcbc244 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,6 +1,8 @@ pub mod auth_token_storage; use anyhow::{Result, anyhow}; +#[cfg(target_os = "macos")] +use std::path::{Path, PathBuf}; use auth_token_storage::AuthTokenStorage; @@ -33,7 +35,51 @@ impl AutoAuth { } #[cfg(target_os = "macos")] - pub fn try_auto_copy_from_dmg() {} + pub fn try_install_to_app_dir_if_from_dmg() { + if let Err(e) = Self::install_to_app_dir_if_from_dmg() { + log::error!("Cannot auto install from dmg: {}", e); + } + } + + fn install_to_app_dir_if_from_dmg() -> Result<()> { + let from_dmg = crate::environment::macos::is_running_from_dmg()?; + + if !from_dmg { + log::info!("App is not running from dmg, no copying needed"); + return Ok(()); + } + + let exe_path = std::env::current_exe()?; + let app_bundle = app_bundle_from_exe_path(&exe_path)?; + let app_name = app_bundle + .file_name() + .ok_or_else(|| anyhow!("Cannot get name from app bundle"))?; + let dest_path = PathBuf::from("/Applications").join(app_name); + + if dest_path.exists() { + log::info!("App is already in /Applications, skipping copying from dmg"); + return Ok(()); + } + + log::info!( + "Copying app bundle from {} to {}", + app_bundle.display(), + dest_path.display() + ); + + // Use Apple's ditto, safest and signature-preserving + let status = std::process::Command::new("ditto") + .arg(&app_bundle) + .arg(&dest_path) + .status()?; + + if !status.success() { + return Err(anyhow!("ditto failed to copy the app bundle")); + } + + log::info!("Copy successful"); + Ok(()) + } #[cfg(target_os = "macos")] fn obtain_token_internal() -> Result> { @@ -74,3 +120,18 @@ impl AutoAuth { Ok(token) } } + +#[cfg(target_os = "macos")] +fn app_bundle_from_exe_path(exe_path: &Path) -> std::io::Result { + let mut path = exe_path.to_path_buf(); + while let Some(parent) = path.parent() { + if parent.extension().is_some_and(|e| e == "app") { + return Ok(parent.to_path_buf()); + } + path = parent.to_path_buf(); + } + Err(std::io::Error::new( + std::io::ErrorKind::NotFound, + "App bundle not found", + )) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f4622096..7ff562ca 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -249,6 +249,8 @@ fn setup_deeplink(a: &App, protocol: &Protocol) { fn setup(a: &mut App) -> std::result::Result<(), Box> { AutoAuth::try_obtain_auth_token(); + #[cfg(target_os = "macos")] + AutoAuth::try_install_to_app_dir_if_from_dmg(); let app_state = tauri::async_runtime::block_on(AppState::setup()) .inspect_err(|e| error!("Error during setup: {:#}", e))?; From c1bd8750d018aed6d5ae5bf3e804fcfd12d4fedd Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 12:30:06 +0300 Subject: [PATCH 50/61] macos cfg --- core/src/auto_auth.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index abcbc244..2b64dfc9 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -41,6 +41,7 @@ impl AutoAuth { } } + #[cfg(target_os = "macos")] fn install_to_app_dir_if_from_dmg() -> Result<()> { let from_dmg = crate::environment::macos::is_running_from_dmg()?; From 0522a3f984d78bde4aad2597866f1715b3c10d44 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 12:31:19 +0300 Subject: [PATCH 51/61] macos cfg results --- core/src/auto_auth.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 2b64dfc9..a31e9ad6 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -1,5 +1,6 @@ pub mod auth_token_storage; +#[cfg(target_os = "macos")] use anyhow::{Result, anyhow}; #[cfg(target_os = "macos")] use std::path::{Path, PathBuf}; From 6a04a57c548ec3ea9aad8eb7188e08e5c1a7fa72 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 12:36:02 +0300 Subject: [PATCH 52/61] cfg for return --- core/src/auto_auth.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index a31e9ad6..494fd45c 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -13,6 +13,9 @@ impl AutoAuth { pub fn try_obtain_auth_token() { if AuthTokenStorage::has_token() { log::info!("Token already obtained"); + + // No need to return on windows, just check if token obtained + #[cfg(target_os = "macos")] return; } From 8eab430a67710045987d1aa327ce18572c39cbd3 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 17:33:28 +0300 Subject: [PATCH 53/61] log auto install --- core/src/auto_auth.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 494fd45c..98f3e247 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -40,9 +40,13 @@ impl AutoAuth { #[cfg(target_os = "macos")] pub fn try_install_to_app_dir_if_from_dmg() { + log::info!("Auto install attempt begin"); if let Err(e) = Self::install_to_app_dir_if_from_dmg() { log::error!("Cannot auto install from dmg: {}", e); } + else { + log::info!("Auto install attempt complete"); + } } #[cfg(target_os = "macos")] From e69466226fdea83022d11f1ec8868f548f08214d Mon Sep 17 00:00:00 2001 From: Charly <85914018+charly-bg@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:36:51 -0300 Subject: [PATCH 54/61] adding new commands to edit dmg (#174) * adding new commands to edit dmg * correct tauri path * correct tauri path * correct create-dmg command * correct create-dmg command * consolidate and simplify changes * remove background validation * remove commented code * correct background path and app name * added back .app to icon name and remove drop-link * change to brew install --------- Co-authored-by: Nick Khalow <71646502+NickKhalow@users.noreply.github.com> --- .github/workflows/release.yml | 97 ++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 83df3a3b..c17089e5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -143,7 +143,7 @@ jobs: VITE_SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - name: Import Apple Developer certificate - if: ${{ matrix.os == 'macos-latest' && inputs.dry-run == false }} + if: ${{ matrix.os == 'macos-latest' }} env: APPLE_CERTIFICATE: ${{ secrets.MACOS_CSC_LINK }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CSC_KEY_PASSWORD }} @@ -159,7 +159,7 @@ jobs: security find-identity -v -p codesigning build.keychain - name: Verify Apple certificate - if: ${{ matrix.os == 'macos-latest' && inputs.dry-run == false }} + if: ${{ matrix.os == 'macos-latest' }} run: | CERT_INFO=$(security find-identity -v -p codesigning build.keychain | grep "Developer ID Application") CERT_ID=$(echo "$CERT_INFO" | awk -F'"' '{print $2}') @@ -266,6 +266,99 @@ jobs: args: ${{ secrets.args }} projectPath: ${{ env.PROJECT_PATH }} + - name: Build & replace custom DMG (macOS) + if: ${{ matrix.os == 'macos-latest' }} + env: + APP_NAME: Decentraland + DMG_BACKGROUND: ${{ github.workspace }}/src-tauri/images/background.png + OUTDIR: src-tauri/target/custom-dmg + CERT_ID: ${{ env.CERT_ID }} + APPLE_ID: ${{ secrets.MACOS_NOTARIZATION_APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.MACOS_NOTARIZATION_PWD }} + APPLE_TEAM_ID: ${{ secrets.MACOS_NOTARIZATION_TEAM_ID }} + run: | + set -euo pipefail + + # --- Resolve .app bundle path --- + APP_PATH=$( + ls -1d src-tauri/target/release/bundle/macos/${APP_NAME}.app 2>/dev/null || \ + ls -1d src-tauri/target/universal-apple-darwin/release/bundle/macos/${APP_NAME}.app 2>/dev/null || \ + ls -1d src-tauri/target/aarch64-apple-darwin/release/bundle/macos/${APP_NAME}.app 2>/dev/null || \ + ls -1d src-tauri/target/x86_64-apple-darwin/release/bundle/macos/${APP_NAME}.app 2>/dev/null + ) + echo "APP_PATH=$APP_PATH" | tee -a "$GITHUB_ENV" + [[ -d "$APP_PATH" ]] || { echo "❌ .app not found"; exit 1; } + [[ -f "$DMG_BACKGROUND" ]] || { echo "⚠️ Missing background: $DMG_BACKGROUND"; } + + # --- Ensure shell create-dmg is available --- + brew update + brew install create-dmg + + # --- Prepare unique staging folder --- + mkdir -p "$OUTDIR" + TIMESTAMP=$(date +%Y%m%d-%H%M%S) + STAGE="$OUTDIR/dmg-src-$TIMESTAMP" + mkdir -p "$STAGE" + echo "Using staging folder: $STAGE" + + # Copy only the .app into the staging folder + cp -R "$APP_PATH" "$STAGE/${APP_NAME}.app" + + # --- Build custom DMG --- + DMG_NAME="${APP_NAME}-custom.dmg" + create-dmg \ + --volname "Decentraland Installer" \ + --background "$DMG_BACKGROUND" \ + --window-pos 200 120 \ + --window-size 600 520 \ + --icon-size 120 \ + --icon "${APP_NAME}.app" 300 230 \ + --no-internet-enable \ + --format ULFO \ + "$OUTDIR/$DMG_NAME" \ + "$STAGE" + + NEW_DMG_PATH="$OUTDIR/$DMG_NAME" + echo "NEW_DMG_PATH=$NEW_DMG_PATH" | tee -a "$GITHUB_ENV" + [[ -f "$NEW_DMG_PATH" ]] || { echo "❌ Custom DMG not created"; exit 1; } + + # --- Codesign + verify --- + codesign --force --sign "$CERT_ID" --timestamp "$NEW_DMG_PATH" + codesign --verify --verbose "$NEW_DMG_PATH" + + # --- Notarize + staple --- + xcrun notarytool submit "$NEW_DMG_PATH" \ + --apple-id "$APPLE_ID" \ + --team-id "$APPLE_TEAM_ID" \ + --password "$APPLE_PASSWORD" \ + --wait + xcrun stapler staple "$NEW_DMG_PATH" + + # --- Replace Tauri DMG with same original filename --- + DMG_DIR=$( + ls -1d src-tauri/target/release/bundle/dmg 2>/dev/null || \ + ls -1d src-tauri/target/universal-apple-darwin/release/bundle/dmg 2>/dev/null || \ + ls -1d src-tauri/target/aarch64-apple-darwin/release/bundle/dmg 2>/dev/null || \ + ls -1d src-tauri/target/x86_64-apple-darwin/release/bundle/dmg 2>/dev/null + ) + if [[ ! -d "$DMG_DIR" ]]; then + echo "⚠️ Tauri DMG dir not found; leaving custom DMG at $NEW_DMG_PATH" + exit 1 + fi + + ORIG_DMG=$(ls -1 "$DMG_DIR"/*.dmg 2>/dev/null | head -n1 || true) + if [[ -z "${ORIG_DMG}" ]]; then + echo "❌ No existing Tauri DMG found in $DMG_DIR to infer original name"; exit 1 + fi + ORIG_NAME="$(basename "$ORIG_DMG")" + + rm -f "$DMG_DIR"/*.dmg + FINAL_DMG="$DMG_DIR/$ORIG_NAME" + cp "$NEW_DMG_PATH" "$FINAL_DMG" + + echo "FINAL_DMG=$FINAL_DMG" | tee -a "$GITHUB_ENV" + echo "✅ Replaced Tauri DMG with custom DMG at $FINAL_DMG (kept original filename)" + - name: Verify Windows signature if: ${{ matrix.os == 'windows-latest' && inputs.dry-run == false }} run: | From 9f00d6d83ac6cde4c8f490d704b4b29b94a11dec Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 17:37:42 +0300 Subject: [PATCH 55/61] apply format --- core/src/auto_auth.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 98f3e247..f1a7b3d9 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -43,8 +43,7 @@ impl AutoAuth { log::info!("Auto install attempt begin"); if let Err(e) = Self::install_to_app_dir_if_from_dmg() { log::error!("Cannot auto install from dmg: {}", e); - } - else { + } else { log::info!("Auto install attempt complete"); } } From 7fe46fb378a96ade0bfa360d87ab3c176fab5513 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 18:02:50 +0300 Subject: [PATCH 56/61] initialization order --- core/src/app.rs | 5 +++++ src-tauri/src/lib.rs | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/app.rs b/core/src/app.rs index 0a8de31d..38051fe7 100644 --- a/core/src/app.rs +++ b/core/src/app.rs @@ -2,6 +2,7 @@ use anyhow::{Context, Result}; use crate::analytics::Analytics; use crate::analytics::event::Event; +use crate::auto_auth::AutoAuth; use crate::flow::{LaunchFlow, LaunchFlowState}; use crate::installs; use crate::instances::RunningInstances; @@ -44,6 +45,10 @@ impl AppState { running_instances.clone(), ))); + AutoAuth::try_obtain_auth_token(); + #[cfg(target_os = "macos")] + AutoAuth::try_install_to_app_dir_if_from_dmg(); + let flow = LaunchFlow::new( installs_hub, analytics.clone(), diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 7ff562ca..8e21e6bc 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -11,7 +11,6 @@ #![allow(clippy::uninlined_format_args, clippy::used_underscore_binding)] use dcl_launcher_core::analytics::event::Event; -use dcl_launcher_core::auto_auth::AutoAuth; use dcl_launcher_core::environment::{AppEnvironment, Args}; use dcl_launcher_core::errors::FlowError; use dcl_launcher_core::log::{error, info}; @@ -248,10 +247,6 @@ fn setup_deeplink(a: &App, protocol: &Protocol) { } fn setup(a: &mut App) -> std::result::Result<(), Box> { - AutoAuth::try_obtain_auth_token(); - #[cfg(target_os = "macos")] - AutoAuth::try_install_to_app_dir_if_from_dmg(); - let app_state = tauri::async_runtime::block_on(AppState::setup()) .inspect_err(|e| error!("Error during setup: {:#}", e))?; From 47944bb25447a9deab72e81d94ade792400c151b Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 18:38:38 +0300 Subject: [PATCH 57/61] tests for token extraction from url --- core/Cargo.lock | 120 +++++++++++++++++++++++++++++++++++++++--- core/Cargo.toml | 3 ++ core/src/auto_auth.rs | 50 ++++++++++++++++-- 3 files changed, 162 insertions(+), 11 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index 2522d95f..87f9b2f2 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -261,7 +261,7 @@ dependencies = [ [[package]] name = "dcl-launcher-core" -version = "1.11.2" +version = "1.11.3" dependencies = [ "anyhow", "core-foundation 0.10.1", @@ -280,6 +280,7 @@ dependencies = [ "pretty_env_logger", "regex", "reqwest", + "rstest", "rusqlite", "segment", "semver", @@ -555,6 +556,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" @@ -643,6 +650,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "hashbrown" version = "0.15.2" @@ -958,9 +971,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown", @@ -1381,6 +1394,15 @@ dependencies = [ "log", ] +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.94" @@ -1577,6 +1599,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "reqwest" version = "0.12.15" @@ -1640,6 +1668,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rstest" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" +dependencies = [ + "futures-timer", + "futures-util", + "rstest_macros", +] + +[[package]] +name = "rstest_macros" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" +dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn", + "unicode-ident", +] + [[package]] name = "rusqlite" version = "0.37.0" @@ -1938,18 +1995,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2306,6 +2373,36 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + [[package]] name = "tower" version = "0.5.2" @@ -2999,6 +3096,15 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/core/Cargo.toml b/core/Cargo.toml index 0f8f329e..11962e0b 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -86,3 +86,6 @@ windows = { version = "0.61.3", features = [ "Win32_Networking_WinSock", "Win32_NetworkManagement_Ndis", ] } + +[dev-dependencies] +rstest = "0.26.1" diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index f1a7b3d9..739d567c 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -92,7 +92,6 @@ impl AutoAuth { #[cfg(target_os = "macos")] fn obtain_token_internal() -> Result> { use anyhow::Context; - use std::borrow::ToOwned; use crate::environment::macos::{dmg_backing_file, dmg_mount_path, where_from_attr}; @@ -122,10 +121,21 @@ impl AutoAuth { return Err(anyhow!("Dmg does not have where from data")); }; - // TODO trim redundant data and purify token - let token = where_from.first().map(ToOwned::to_owned); + for attr in &where_from { + let url = token_from_url(attr); + match url { + Ok(token) => { + if token.is_some() { + return Ok(token); + } + } + Err(e) => { + log::error!("Cannot read url '{}' due: {}", attr, e); + } + } + } - Ok(token) + Ok(None) } } @@ -143,3 +153,35 @@ fn app_bundle_from_exe_path(exe_path: &Path) -> std::io::Result { "App bundle not found", )) } + +#[cfg(target_os = "macos")] +fn token_from_url(url_str: &str) -> Result> { + let url = url::Url::parse(url_str)?; + // Split into path segments e.g. "391a85da-a3bb-49e2-a45e-96c740c38424" + let mut segments = url + .path_segments() + .ok_or_else(|| anyhow!("Cannot split url"))?; + // Regex for token find + let re = regex::Regex::new( + r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + )?; + Ok(segments.find(|s| re.is_match(s)).map(ToString::to_string)) +} + +#[cfg(target_os = "macos")] +#[cfg(test)] +mod tests { + use super::*; + use rstest::rstest; + + #[rstest] + #[case( + "https://test-download.decentraland.zone/391a85da-a3bb-49e2-a45e-96c740c38424/decentraland.dmg", + "391a85da-a3bb-49e2-a45e-96c740c38424" + )] + fn test_token_from_url(#[case] url: &str, #[case] expected_token: &str) -> Result<()> { + let token = token_from_url(url)?.ok_or_else(|| anyhow!("Empty url"))?; + assert_eq!(expected_token, token.as_str()); + Ok(()) + } +} From 99025edc857869be76b6a8b5a943ae809dfeb559 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 19:41:41 +0300 Subject: [PATCH 58/61] mntfrom -> mnton --- core/src/environment/macos.rs | 6 ++++-- src-auto-auth/Cargo.lock | 2 +- src-tauri/Cargo.lock | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/environment/macos.rs b/core/src/environment/macos.rs index 17214fda..b0d6bba7 100644 --- a/core/src/environment/macos.rs +++ b/core/src/environment/macos.rs @@ -37,8 +37,10 @@ pub fn dmg_mount_path(exe_path: &Path) -> Result> { let is_readonly = sfs.f_flags & MNT_RDONLY as u32 != 0; log::info!("exe mount data, from: {mntfrom}, on: {mnton}, readonly: {is_readonly}"); - if is_readonly && mntfrom.to_lowercase().starts_with("/volumes/") { - Ok(Some(mntfrom.into())) + let refer_mnt = &mnton; + + if is_readonly && refer_mnt.to_lowercase().starts_with("/volumes/") { + Ok(Some(refer_mnt.into())) } else { Ok(None) } diff --git a/src-auto-auth/Cargo.lock b/src-auto-auth/Cargo.lock index 8b410f12..a03ef463 100644 --- a/src-auto-auth/Cargo.lock +++ b/src-auto-auth/Cargo.lock @@ -268,7 +268,7 @@ dependencies = [ [[package]] name = "dcl-launcher-core" -version = "1.11.2" +version = "1.11.3" dependencies = [ "anyhow", "core-foundation 0.10.1", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 76d49230..f98d6f39 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "Decentraland-Launcher" -version = "1.11.2" +version = "1.11.3" dependencies = [ "anyhow", "dcl-launcher-core", @@ -663,7 +663,7 @@ dependencies = [ [[package]] name = "dcl-launcher-core" -version = "1.11.2" +version = "1.11.3" dependencies = [ "anyhow", "core-foundation 0.10.1", From b946ab602da9bbfeb2c61619e06d07587f79131e Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 20:50:58 +0300 Subject: [PATCH 59/61] enhance error message --- core/src/auto_auth.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 739d567c..48d43d0f 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -111,7 +111,7 @@ impl AutoAuth { let dmg_file_path = dmg_backing_file(&dmg_dir.to_string_lossy()) .with_context(|| "Cannot resolve mount path: {dmg_dir}")? - .ok_or_else(|| anyhow!("Dmg original file not found"))?; + .ok_or_else(|| anyhow!("Dmg original file not found: {dmg_dir:?}"))?; let where_from = where_from_attr(dmg_file_path.as_path()) .with_context(|| "Cannot read where from attr: {dmg_file_path}")?; From 306068bbe51165c077d6e2df4ef46cc9f42cc4ac Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Wed, 15 Oct 2025 21:16:18 +0300 Subject: [PATCH 60/61] remove parent call --- core/src/auto_auth.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 48d43d0f..95510d1e 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -104,14 +104,9 @@ impl AutoAuth { return Ok(None); }; - let Some(dmg_dir) = dmg_mount_path.parent() else { - return Err(anyhow!("Dmg doesn't have a parent")); - }; - log::info!("Dmg parent: {}", dmg_dir.display()); - - let dmg_file_path = dmg_backing_file(&dmg_dir.to_string_lossy()) - .with_context(|| "Cannot resolve mount path: {dmg_dir}")? - .ok_or_else(|| anyhow!("Dmg original file not found: {dmg_dir:?}"))?; + let dmg_file_path = dmg_backing_file(&dmg_mount_path.to_string_lossy()) + .with_context(|| format!("Cannot resolve mount path: {}", dmg_mount_path.display()))? + .ok_or_else(|| anyhow!("Dmg original file not found: {dmg_mount_path:?}"))?; let where_from = where_from_attr(dmg_file_path.as_path()) .with_context(|| "Cannot read where from attr: {dmg_file_path}")?; From c67cbd99647535cfb4d2c73e493c2c77b582d4b1 Mon Sep 17 00:00:00 2001 From: nickkhalow Date: Thu, 16 Oct 2025 09:44:35 +0300 Subject: [PATCH 61/61] enhance logging --- core/src/auto_auth.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/auto_auth.rs b/core/src/auto_auth.rs index 95510d1e..b40898d7 100644 --- a/core/src/auto_auth.rs +++ b/core/src/auto_auth.rs @@ -110,7 +110,7 @@ impl AutoAuth { let where_from = where_from_attr(dmg_file_path.as_path()) .with_context(|| "Cannot read where from attr: {dmg_file_path}")?; - log::info!("Where from attr: {where_from:?}"); + log::info!("Where from attr: {:?} for path: {}", where_from, dmg_file_path.display()); let Some(where_from) = where_from else { return Err(anyhow!("Dmg does not have where from data"));

IV_V4_xg61ck%&( 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