From 1a60e6681c0bc0f600f4b61c71ad32419690e6b1 Mon Sep 17 00:00:00 2001 From: 1zuna Date: Wed, 12 Jun 2024 22:52:25 +0200 Subject: [PATCH] feat: check if session is authenticated --- src-tauri/src/app/gui.rs | 6 ++++-- src-tauri/src/minecraft/auth.rs | 35 +++++++++++++++++++++++++++++++-- src/lib/main/MainScreen.svelte | 23 ++++++++++++++++------ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src-tauri/src/app/gui.rs b/src-tauri/src/app/gui.rs index c6ed660..ec64bbf 100644 --- a/src-tauri/src/app/gui.rs +++ b/src-tauri/src/app/gui.rs @@ -253,9 +253,9 @@ async fn run_client(build_id: u32, account_data: MinecraftAccount, options: Laun let shareable_window: ShareableWindow = Arc::new(Mutex::new(window)); let (account_name, uuid, token, user_type) = match account_data { - MinecraftAccount::MsaAccount { msa: _, xbl: _, mca, profile } => (profile.name, profile.id.to_string(), mca.data.access_token, "msa".to_string()), + MinecraftAccount::MsaAccount { msa: _, xbl: _, mca, profile, .. } => (profile.name, profile.id.to_string(), mca.data.access_token, "msa".to_string()), MinecraftAccount::LegacyMsaAccount { name, uuid, token, .. } => (name, uuid.to_string(), token, "msa".to_string()), - MinecraftAccount::OfflineAccount { name, id } => (name, id.to_string(), "-".to_string(), "legacy".to_string()) + MinecraftAccount::OfflineAccount { name, id, .. } => (name, id.to_string(), "-".to_string(), "legacy".to_string()) }; // Random XUID @@ -351,8 +351,10 @@ async fn terminate(app_state: tauri::State<'_, AppState>) -> Result<(), String> #[tauri::command] async fn refresh(account_data: MinecraftAccount) -> Result { + info!("Refreshing account..."); let account = account_data.refresh().await .map_err(|e| format!("unable to refresh: {:?}", e))?; + info!("Account was refreshed - username {}", account.get_username()); Ok(account) } diff --git a/src-tauri/src/minecraft/auth.rs b/src-tauri/src/minecraft/auth.rs index 2820827..6e1dd76 100644 --- a/src-tauri/src/minecraft/auth.rs +++ b/src-tauri/src/minecraft/auth.rs @@ -46,6 +46,10 @@ pub enum MinecraftAccount { /// The user's Minecraft profile (i.e. username, UUID, skin) #[serde(flatten)] profile: ProfileResponse, + #[serde(skip_deserializing)] + #[serde(default)] + #[serde(rename = "hasBeenAuthenticated")] + has_been_authenticated: bool, }, #[serde(rename = "Microsoft")] LegacyMsaAccount { @@ -53,12 +57,20 @@ pub enum MinecraftAccount { uuid: Uuid, token: String, ms_auth: MsAuth, + #[serde(skip_deserializing)] + #[serde(default)] + #[serde(rename = "hasBeenAuthenticated")] + has_been_authenticated: bool, }, #[serde(rename = "Offline")] OfflineAccount { name: String, #[serde(alias = "uuid")] - id: Uuid + id: Uuid, + #[serde(skip_deserializing)] + #[serde(default)] + #[serde(rename = "hasBeenAuthenticated")] + has_been_authenticated: bool, }, } @@ -119,6 +131,7 @@ impl MinecraftAccount { MinecraftAccount::OfflineAccount { name: username, id: uuid, + has_been_authenticated: true } } @@ -130,6 +143,7 @@ impl MinecraftAccount { xbl, mca, profile, + .. } => { // Not necessary to refresh if the Minecraft auth token is not expired if !mca.is_expired() { @@ -138,6 +152,7 @@ impl MinecraftAccount { xbl, mca, profile, + has_been_authenticated: true }); } @@ -163,7 +178,13 @@ impl MinecraftAccount { &ms_auth.refresh_token).await?; return Ok(login_msa(msa).await?); } - MinecraftAccount::OfflineAccount { .. } => Ok(self), + MinecraftAccount::OfflineAccount { name, id, .. } => { + Ok(MinecraftAccount::OfflineAccount { + name, + id, + has_been_authenticated: true + }) + }, }; } @@ -171,6 +192,15 @@ impl MinecraftAccount { pub async fn logout(&self) -> Result<()> { Ok(()) } + + pub fn get_username(&self) -> &str { + match self { + MinecraftAccount::MsaAccount { profile, .. } => &profile.name, + MinecraftAccount::LegacyMsaAccount { name, .. } => name, + MinecraftAccount::OfflineAccount { name, .. } => name, + } + } + } async fn login_msa(msa: ExpiringValue) -> Result { @@ -186,5 +216,6 @@ async fn login_msa(msa: ExpiringValue) -> Result { console.info("Account Refreshed", account); - options.currentAccount = account; options.store(); }) - .catch((e) => console.error(e)); + .catch((e) => { + console.error("Failed to refresh account", e); + alert("Failed to refresh account session: " + e); + }); {#if clientLogShown}