diff --git a/theseus/src/api/settings.rs b/theseus/src/api/settings.rs index 59bca9a87..270a01680 100644 --- a/theseus/src/api/settings.rs +++ b/theseus/src/api/settings.rs @@ -1,6 +1,7 @@ //! Theseus profile management interface use std::path::PathBuf; +use tokio::fs; use io::IOError; use tokio::sync::RwLock; @@ -188,3 +189,17 @@ pub async fn set_config_dir(new_config_dir: PathBuf) -> crate::Result<()> { Ok(()) } + +pub async fn is_dir_writeable(new_config_dir: PathBuf) -> crate::Result { + let temp_path = new_config_dir.join(".tmp"); + match fs::write(temp_path.clone(), "test").await { + Ok(_) => { + fs::remove_file(temp_path).await?; + Ok(true) + } + Err(e) => { + tracing::error!("Error writing to new config dir: {}", e); + Ok(false) + } + } +} diff --git a/theseus_gui/src-tauri/src/api/settings.rs b/theseus_gui/src-tauri/src/api/settings.rs index 28221b845..324761095 100644 --- a/theseus_gui/src-tauri/src/api/settings.rs +++ b/theseus_gui/src-tauri/src/api/settings.rs @@ -8,7 +8,8 @@ pub fn init() -> tauri::plugin::TauriPlugin { .invoke_handler(tauri::generate_handler![ settings_get, settings_set, - settings_change_config_dir + settings_change_config_dir, + settings_is_dir_writeable ]) .build() } @@ -37,3 +38,11 @@ pub async fn settings_change_config_dir(new_config_dir: PathBuf) -> Result<()> { settings::set_config_dir(new_config_dir).await?; Ok(()) } + +#[tauri::command] +pub async fn settings_is_dir_writeable( + new_config_dir: PathBuf, +) -> Result { + let res = settings::is_dir_writeable(new_config_dir).await?; + Ok(res) +} diff --git a/theseus_gui/src/helpers/settings.js b/theseus_gui/src/helpers/settings.js index 62b53745c..701cc325d 100644 --- a/theseus_gui/src/helpers/settings.js +++ b/theseus_gui/src/helpers/settings.js @@ -43,3 +43,7 @@ export async function set(settings) { export async function change_config_dir(newConfigDir) { return await invoke('plugin:settings|settings_change_config_dir', { newConfigDir }) } + +export async function is_dir_writeable(newConfigDir) { + return await invoke('plugin:settings|settings_is_dir_writeable', { newConfigDir }) +} diff --git a/theseus_gui/src/pages/Settings.vue b/theseus_gui/src/pages/Settings.vue index 5ff7d7d79..9fa66e2cd 100644 --- a/theseus_gui/src/pages/Settings.vue +++ b/theseus_gui/src/pages/Settings.vue @@ -14,7 +14,7 @@ import { UpdatedIcon, } from 'omorphia' import { handleError, useTheming } from '@/store/state' -import { change_config_dir, get, set } from '@/helpers/settings' +import { is_dir_writeable, change_config_dir, get, set } from '@/helpers/settings' import { get_max_memory } from '@/helpers/jre' import { get as getCreds, logout } from '@/helpers/mr_auth.js' import JavaSelector from '@/components/ui/JavaSelector.vue' @@ -116,7 +116,18 @@ async function signInAfter() { } async function findLauncherDir() { - const newDir = await open({ multiple: false, directory: true }) + const newDir = await open({ + multiple: false, + directory: true, + title: 'Select a new app directory', + }) + + const writeable = await is_dir_writeable(newDir) + + if (!writeable) { + handleError('The selected directory does not have proper permissions for write access.') + return + } if (newDir) { settingsDir.value = newDir