diff --git a/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/mod.rs b/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/mod.rs index cd2ba58f09..b1a1c8bbc7 100644 --- a/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/mod.rs +++ b/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/mod.rs @@ -1,3 +1,4 @@ pub mod worldlabs_login_window_open; pub (super) mod worldlabs_login_window_thread; pub (super) mod worldlabs_login_webview_extract_cookies; +pub (super) mod worldlabs_javascript; diff --git a/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_javascript.rs b/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_javascript.rs new file mode 100644 index 0000000000..0906290469 --- /dev/null +++ b/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_javascript.rs @@ -0,0 +1,105 @@ + + + +pub (super) const WORLDLABS_JAVASCRIPT_EXPORT_BEARER_TOKENS : &str = r#" + (async () => { + if (window.tokensExported) { + console.error(">>> Tokens already gotten !"); + return; + } + + console.error(">>> Getting tokens..."); + + const request = indexedDB.open("firebaseLocalStorageDb"); + + request.onerror = (event) => {}; + + request.onsuccess = (event) => { + const db = event.target.result; + + console.error(">>> Start transaction..."); + + const tx = db.transaction("firebaseLocalStorage", "readonly"); + + console.error(">>> Object store open ..."); + + const store = tx.objectStore("firebaseLocalStorage"); + + console.error(">>> key request..."); + + const keysRequest = store.getAllKeys(); + + keysRequest.onerror = (event) => {}; + + keysRequest.onsuccess = () => { + console.error(">>> keys array..."); + + const keys = keysRequest.result; // array of keys + const key = keys[0]; + + console.error(">>> get key..."); + + const getKeyRequest = store.getKey(key); + + getKeyRequest.onsuccess = () => {}; + + store.openCursor().onsuccess = (event) => { + const cursor = event.target.result; + if (cursor) { + let tokens = cursor.value?.value?.stsTokenManager; + + if (tokens?.accessToken && tokens?.refreshToken) { + // Send to Tauri + let result = await window.__TAURI__.core.invoke("worldlabs_receive_bearer_command", { + request: { + bearer_token: window.tokens.accessToken, + refresh_token: window.tokens.refreshToken, + } + }); + + window.tokens = tokens; + window.tokensExported = true; + } + cursor.continue(); + } + }; // end cursor + }; // end keyRequest + }; // end DB + })(); + "#; + + +/// Take the Bearer tokens and send them to Tauri +pub (super) const WORLDLABS_JAVASCRIPT_SEND_BEARER_TO_TAURI : &str = r#" + (async () => { + if (!(window.tokens?.accessToken && window.tokens?.refreshToken)) { + console.error(">>> No tokens to export"); + return; + } + + console.error(">>> Sending to Tauri"); + + let result = await window.__TAURI__.core.invoke("worldlabs_receive_bearer_command", { + request: { + bearer_token: window.tokens.accessToken, + refresh_token: window.tokens.refreshToken, + } + }); + + error.log('>>> result', result); + + })(); + "#; + + +/// See if the pricing button exists. +/// This is only for the logged-in state. +/// We can use redirection to detect completion. +pub (super) const WORLDLABS_JAVASCRIPT_SEE_IF_PRICING_EXISTS : &str = r#" + (() => { + let pricing = document.querySelectorAll("a[href='/pricing']"); + if (pricing.length > 0) { + window.location.href = "https://www.worldlabs.ai/about"; + } + })(); + "#; diff --git a/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_login_window_thread.rs b/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_login_window_thread.rs index 2aec6d1337..13c92068c5 100644 --- a/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_login_window_thread.rs +++ b/crates/desktop/artcraft/src/services/worldlabs/windows/worldlabs_login_window/worldlabs_login_window_thread.rs @@ -12,6 +12,7 @@ use crate::services::sora::state::sora_credential_manager::SoraCredentialManager use crate::services::sora::windows::sora_login_window::extract_sora_webview_cookies::extract_sora_webview_cookies; use crate::services::worldlabs::state::worldlabs_bearer_bridge::WorldlabsBearerBridge; use crate::services::worldlabs::state::worldlabs_credential_manager::WorldlabsCredentialManager; +use crate::services::worldlabs::windows::worldlabs_login_window::worldlabs_javascript::WORLDLABS_JAVASCRIPT_EXPORT_BEARER_TOKENS; use crate::services::worldlabs::windows::worldlabs_login_window::worldlabs_login_webview_extract_cookies::worldlabs_login_webview_extract_cookies; use crate::services::worldlabs::windows::worldlabs_login_window::worldlabs_login_window_open::WORLDLABS_LOGIN_WINDOW_NAME; use anyhow::anyhow; @@ -23,6 +24,7 @@ use openai_sora_client::creds::sora_credential_set::SoraCredentialSet; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; use openai_sora_client::utils::has_session_cookie::{has_session_cookie, SessionCookiePresence}; use tauri::{AppHandle, Manager, WebviewWindow}; +use world_labs_client::credentials::world_labs_bearer_token::WorldLabsBearerToken; pub async fn worldlabs_login_window_thread( app: AppHandle, @@ -82,132 +84,31 @@ async fn check_login_window( // World labs has no distinct login page. Everything is in a single SPA. - let mut is_logged_in = false; - - // See if pricing exists. - // We'll use redirection to detect if we're done. - let pricing_script = r#" - (() => { - let pricing = document.querySelectorAll("a[href='/pricing']"); - console.log('pricing', pricing); - if (pricing.length > 0) { - window.location.href = "https://www.worldlabs.ai/about"; - } - })(); - "#; - - //webview_window.eval(pricing_script)?; - - let extract_bearer_tokens= r#" - (() => { - if (window.tokens) { - console.error(">>> Tokens already gotten !"); - return; - } - - console.error(">>> Getting tokens..."); - - const request = indexedDB.open("firebaseLocalStorageDb"); - request.onerror = (event) => {}; - - request.onsuccess = (event) => { - const db = event.target.result; - - const tx = db.transaction("firebaseLocalStorage", "readonly"); - const store = tx.objectStore("firebaseLocalStorage"); - - const keysRequest = store.getAllKeys(); - - keysRequest.onerror = (event) => {}; - - keysRequest.onsuccess = () => { - const keys = keysRequest.result; // array of keys - const key = keys[0]; - - const getKeyRequest = store.getKey(key); - - getKeyRequest.onsuccess = () => {}; - - store.openCursor().onsuccess = (event) => { - const cursor = event.target.result; - if (cursor) { - let tokens = cursor.value?.value?.stsTokenManager; - if (tokens?.accessToken && tokens?.refreshToken) { - window.tokens = tokens; - } - cursor.continue(); - } - }; - }; - }; - })(); - "#; - - webview_window.eval(extract_bearer_tokens)?; - - let export_bearer_tokens= r#" - (async () => { - if (!(window.tokens?.accessToken && window.tokens?.refreshToken)) { - console.error(">>> No tokens to export"); - return; - } - - console.error(">>> Sending to Tauri"); - - let result = await window.__TAURI__.core.invoke("worldlabs_receive_bearer_command", { - request: { - bearer_token: window.tokens.accessToken, - refresh_token: window.tokens.refreshToken, - } - }); - - error.log('>>> result', result); - - })(); - "#; - - webview_window.eval(export_bearer_tokens)?; + webview_window.eval(WORLDLABS_JAVASCRIPT_EXPORT_BEARER_TOKENS)?; let maybe_bearer = worldlabs_bearer_bridge.get()?; - if let Some(bearer) = maybe_bearer { - info!("Rust Got bearer: {:?}", bearer); - } - - - let hostname = get_webview_window_hostname(webview_window)?; - let path = get_webview_window_url_path(webview_window)?; - - match hostname.as_str() { - "www.worldlabs.ai" => { - is_logged_in = true; - }, - _ => {} - } - - match path.as_str() { - "/about" => { - is_logged_in = true; - }, - _ => {} - } - - is_logged_in = false; - - if !is_logged_in { - return Ok(false); - } + let bearer_info = match maybe_bearer { + Some(bearer) => bearer, + None => { + return Ok(false); // Not logged in. + } + }; let cookie_store = worldlabs_login_webview_extract_cookies(webview_window)?; info!("Current cookies (len {}): {:?}", cookie_store.len(), cookie_store.to_cookie_string()); worldlabs_creds_manager.replace_cookie_store(cookie_store)?; + + let bearer_token = WorldLabsBearerToken::new(bearer_info.bearer_token); + + worldlabs_creds_manager.replace_bearer_token(bearer_token)?; let result = worldlabs_creds_manager.persist_to_disk(); if let Err(err) = result { - error!("Error persisting grok cookies to disk: {:?}", err); + error!("Error persisting WorldLabs credentials to disk: {:?}", err); return Ok(false); } @@ -221,4 +122,3 @@ async fn check_login_window( Ok(true) } -