fix: clean up updater temp folders

This commit is contained in:
Calum H. (IMB11)
2026-07-24 16:38:18 +01:00
parent a6d9bb7b3e
commit 6b4875b502
3 changed files with 77 additions and 0 deletions
+17
View File
@@ -181,6 +181,23 @@ fn main() {
.build(),
)
.setup(|app| {
#[cfg(target_os = "windows")]
{
let app_name = app.package_info().name.clone();
tauri::async_runtime::spawn(async move {
match theseus::cleanup_updater_temp_folders(&app_name).await
{
Ok(0) => {}
Ok(count) => tracing::info!(
"Cleaned up {count} updater temp folders"
),
Err(error) => tracing::warn!(
"Failed to clean up updater temp folders: {error}"
),
}
});
}
#[cfg(target_os = "macos")]
{
let payload = macos::deep_link::get_or_init_payload(app);
+2
View File
@@ -17,6 +17,7 @@ pub mod install;
mod launcher;
mod logger;
mod state;
mod updater;
pub use api::*;
pub use error::*;
@@ -26,6 +27,7 @@ pub use event::{
};
pub use logger::start_logger;
pub use state::State;
pub use updater::cleanup_updater_temp_folders;
pub use util::fetch::DownloadReason;
pub fn launcher_user_agent() -> String {
+58
View File
@@ -0,0 +1,58 @@
use std::io;
const UPDATER_SEPARATOR: &str = "-updater-";
const UPDATER_RANDOM_SUFFIX_LENGTH: usize = 6;
pub async fn cleanup_updater_temp_folders(
app_name: &str,
) -> io::Result<usize> {
let mut entries = tokio::fs::read_dir(std::env::temp_dir()).await?;
let mut removed = 0;
while let Some(entry) = entries.next_entry().await? {
let file_name = entry.file_name();
let Some(file_name) = file_name.to_str() else {
continue;
};
if !is_updater_temp_folder(app_name, file_name)
|| !entry.file_type().await?.is_dir()
{
continue;
}
let path = entry.path();
match tokio::fs::remove_dir_all(&path).await {
Ok(()) => removed += 1,
Err(error) => {
tracing::warn!(
"Failed to clean up updater temp folder {}: {error}",
path.display()
);
}
}
}
Ok(removed)
}
fn is_updater_temp_folder(app_name: &str, file_name: &str) -> bool {
let Some(name) = file_name
.strip_prefix(app_name)
.and_then(|name| name.strip_prefix('-'))
else {
return false;
};
let Some((version, random_suffix)) =
name.rsplit_once(UPDATER_SEPARATOR)
else {
return false;
};
!version.is_empty()
&& version
.bytes()
.all(|byte| byte.is_ascii_alphanumeric() || b".-+".contains(&byte))
&& random_suffix.len() == UPDATER_RANDOM_SUFFIX_LENGTH
&& random_suffix.bytes().all(|byte| byte.is_ascii_alphanumeric())
}