diff --git a/flecs-core/src/fsm/console_client.rs b/flecs-core/src/fsm/console_client.rs index 3bbe2085d..c79a602f3 100644 --- a/flecs-core/src/fsm/console_client.rs +++ b/flecs-core/src/fsm/console_client.rs @@ -11,17 +11,17 @@ struct SessionIdMiddleware { vault: Arc, } -impl Default for SessionIdMiddleware { - fn default() -> Self { +impl SessionIdMiddleware { + pub async fn default() -> Self { Self { - vault: crate::lore::vault::default(), + vault: crate::lore::vault::default().await, } } } -pub fn create_default_client_with_middleware() -> ClientWithMiddleware { +pub async fn create_default_client_with_middleware() -> ClientWithMiddleware { ClientBuilder::new(reqwest::Client::new()) - .with(SessionIdMiddleware::default()) + .with(SessionIdMiddleware::default().await) .build() } @@ -36,7 +36,7 @@ impl SessionIdMiddleware { debug!("{request:?}"); } - fn handle_response(&self, response: Result) -> Result { + async fn handle_response(&self, response: Result) -> Result { debug!("{response:?}"); if let Ok(response) = response { if let Some(session) = response.headers().get("x-session-id") { @@ -48,6 +48,7 @@ impl SessionIdMiddleware { .reservation() .reserve_secret_pouch_mut() .grab() + .await .secret_pouch_mut .as_mut() .unwrap() @@ -80,6 +81,6 @@ impl Middleware for SessionIdMiddleware { ) -> Result { self.handle_request(&mut req); let res = next.run(req, extensions).await; - self.handle_response(res) + self.handle_response(res).await } } diff --git a/flecs-core/src/fsm/mod.rs b/flecs-core/src/fsm/mod.rs index 6e0be5fb5..eac7f95e9 100644 --- a/flecs-core/src/fsm/mod.rs +++ b/flecs-core/src/fsm/mod.rs @@ -68,8 +68,8 @@ pub fn init_tracing() { info!("Tracing initialized"); } -fn create_service() -> IntoMakeServiceWithConnectInfo { - let server = server_impl::ServerImpl::default(); +async fn create_service() -> IntoMakeServiceWithConnectInfo { + let server = server_impl::ServerImpl::default().await; let app = flecsd_axum_server::server::new(Arc::new(server)).layer( tower_http::trace::TraceLayer::new_for_http() .make_span_with(|request: &Request<_>| { @@ -137,7 +137,11 @@ async fn serve( } pub async fn server(socket_path: PathBuf) -> Result<()> { - serve(create_unix_socket(socket_path).await?, create_service()).await; + serve( + create_unix_socket(socket_path).await?, + create_service().await, + ) + .await; Ok(()) } diff --git a/flecs-core/src/fsm/server_impl.rs b/flecs-core/src/fsm/server_impl.rs index f57f4a2ae..b5a02c200 100644 --- a/flecs-core/src/fsm/server_impl.rs +++ b/flecs-core/src/fsm/server_impl.rs @@ -71,10 +71,10 @@ pub struct ServerImpl { vault: Arc, } -impl Default for ServerImpl { - fn default() -> Self { +impl ServerImpl { + pub async fn default() -> Self { Self { - vault: crate::lore::vault::default(), + vault: crate::lore::vault::default().await, } } } @@ -161,7 +161,7 @@ impl Console for ServerImpl { _host: Host, _cookies: CookieJar, ) -> Result { - crate::sorcerer::authmancer::delete_authentication(&self.vault); + crate::sorcerer::authmancer::delete_authentication(&self.vault).await; Ok(ConsoleAuthenticationDeleteResponse::Status204_NoContent) } @@ -172,7 +172,7 @@ impl Console for ServerImpl { _cookies: CookieJar, body: AuthResponseData, ) -> Result { - crate::sorcerer::authmancer::store_authentication(body, &self.vault); + crate::sorcerer::authmancer::store_authentication(body, &self.vault).await; Ok(ConsoleAuthenticationPutResponse::Status204_NoContent) } } @@ -187,7 +187,7 @@ impl Device for ServerImpl { ) -> Result { match crate::sorcerer::licenso::activate_license( &self.vault, - crate::lore::console_client_config::default(), + crate::lore::console_client_config::default().await, ) .await { @@ -224,7 +224,7 @@ impl Device for ServerImpl { _host: Host, _cookies: CookieJar, ) -> Result { - let secrets = self.vault.get_secrets(); + let secrets = self.vault.get_secrets().await; Ok(DeviceLicenseInfoGetResponse::Status200_Success( DeviceLicenseInfoGet200Response { // TODO: Use correct type, as soon as serial numbers are implemented diff --git a/flecs-core/src/lore/mod.rs b/flecs-core/src/lore/mod.rs index 7f0d7ea54..99ad37120 100644 --- a/flecs-core/src/lore/mod.rs +++ b/flecs-core/src/lore/mod.rs @@ -1,34 +1,40 @@ pub mod console_client_config { use crate::fsm::console_client::create_default_client_with_middleware; use flecs_console_client::apis::configuration::Configuration; - use std::sync::OnceLock; + use tokio::sync::OnceCell; - pub fn default() -> &'static Configuration { - static CONSOLE_CLIENT_CONFIG: OnceLock = OnceLock::new(); + pub async fn default() -> &'static Configuration { + static CONSOLE_CLIENT_CONFIG: OnceCell = OnceCell::const_new(); #[cfg(debug_assertions)] const BASE_PATH: &str = "https://console-dev.flecs.tech"; #[cfg(not(debug_assertions))] const BASE_PATH: &str = "https://console.flecs.tech"; - CONSOLE_CLIENT_CONFIG.get_or_init(|| Configuration { - base_path: BASE_PATH.to_owned(), - client: create_default_client_with_middleware(), - ..Configuration::default() - }) + CONSOLE_CLIENT_CONFIG + .get_or_init(|| async { + Configuration { + base_path: BASE_PATH.to_owned(), + client: create_default_client_with_middleware().await, + ..Configuration::default() + } + }) + .await } } pub mod vault { use crate::vault::{Vault, VaultConfig}; - use std::sync::{Arc, OnceLock}; + use std::sync::Arc; + use tokio::sync::OnceCell; - pub fn default() -> Arc { - static DEFAULT_VAULT: OnceLock> = OnceLock::new(); + pub async fn default() -> Arc { + static DEFAULT_VAULT: OnceCell> = OnceCell::const_new(); DEFAULT_VAULT - .get_or_init(|| { + .get_or_init(|| async { let vault = Vault::new(VaultConfig::default()); - vault.open(); + vault.open().await; Arc::new(vault) }) + .await .clone() } } diff --git a/flecs-core/src/sorcerer/authmancer.rs b/flecs-core/src/sorcerer/authmancer.rs index e487ad861..b2be93b67 100644 --- a/flecs-core/src/sorcerer/authmancer.rs +++ b/flecs-core/src/sorcerer/authmancer.rs @@ -6,8 +6,8 @@ use flecs_console_client::apis::configuration::Configuration; use flecs_console_client::models::PostApiV2Tokens200ResponseData; use flecsd_axum_server::models::AuthResponseData; -pub fn delete_authentication(vault: &Vault) { - let mut grabbed_pouches = vault.reservation().reserve_secret_pouch_mut().grab(); +pub async fn delete_authentication(vault: &Vault) { + let mut grabbed_pouches = vault.reservation().reserve_secret_pouch_mut().grab().await; spell::auth::delete_authentication( grabbed_pouches .secret_pouch_mut @@ -17,8 +17,8 @@ pub fn delete_authentication(vault: &Vault) { ) } -pub fn store_authentication(auth: AuthResponseData, vault: &Vault) { - let mut grabbed_pouches = vault.reservation().reserve_secret_pouch_mut().grab(); +pub async fn store_authentication(auth: AuthResponseData, vault: &Vault) { + let mut grabbed_pouches = vault.reservation().reserve_secret_pouch_mut().grab().await; spell::auth::store_authentication( auth, grabbed_pouches @@ -39,6 +39,7 @@ pub async fn acquire_download_token( .reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() @@ -79,8 +80,8 @@ mod tests { } } - #[test] - fn delete_authentication_test() { + #[tokio::test] + async fn delete_authentication_test() { let test_path = Path::new(TEST_PATH).join("delete_authentication"); fs::create_dir_all(&test_path).unwrap(); let vault = Vault::new(VaultConfig { path: test_path }); @@ -88,16 +89,18 @@ mod tests { .reservation() .reserve_secret_pouch_mut() .grab() + .await .secret_pouch_mut .as_mut() .unwrap() .gems_mut() .authentication = Some(create_test_auth()); - delete_authentication(&vault); + delete_authentication(&vault).await; assert!(vault .reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() @@ -106,8 +109,8 @@ mod tests { .is_none()) } - #[test] - fn store_authentication_test() { + #[tokio::test] + async fn store_authentication_test() { let test_path = Path::new(TEST_PATH).join("store_authentication"); fs::create_dir_all(&test_path).unwrap(); let vault = Vault::new(VaultConfig { path: test_path }); @@ -115,19 +118,21 @@ mod tests { .reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() .gems() .authentication .is_none()); - store_authentication(create_test_auth(), &vault); + store_authentication(create_test_auth(), &vault).await; assert_eq!( Some(create_test_auth()), vault .reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() diff --git a/flecs-core/src/sorcerer/licenso.rs b/flecs-core/src/sorcerer/licenso.rs index a927ddf96..ffa3334dc 100644 --- a/flecs-core/src/sorcerer/licenso.rs +++ b/flecs-core/src/sorcerer/licenso.rs @@ -7,7 +7,7 @@ use anyhow::{anyhow, Context}; use flecs_console_client::apis::configuration::Configuration; pub async fn activate_license(vault: &Vault, configuration: &Configuration) -> Result<()> { - let secrets = vault.get_secrets(); + let secrets = vault.get_secrets().await; let activation_result = match ( secrets.license_key.as_ref(), @@ -35,7 +35,7 @@ pub async fn activate_license(vault: &Vault, configuration: &Configuration) -> R if let GrabbedPouches { secret_pouch_mut: Some(ref mut secret_pouch), .. - } = vault.reservation().reserve_secret_pouch_mut().grab() + } = vault.reservation().reserve_secret_pouch_mut().grab().await { secret_pouch.gems_mut().license_key = Some(activation_data.license_key); secret_pouch @@ -50,7 +50,7 @@ pub async fn activate_license(vault: &Vault, configuration: &Configuration) -> R if let GrabbedPouches { secret_pouch: Some(ref secret_pouch), .. - } = vault.reservation().reserve_secret_pouch().grab() + } = vault.reservation().reserve_secret_pouch().grab().await { match (&secret_pouch.gems().license_key, secret_pouch.gems().get_session_id().id) { (None, None) => Err(anyhow!("Console responded with already active, but license and session id are not set")), @@ -70,14 +70,18 @@ pub async fn validate_license(vault: &Vault) -> Result { .reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() .gems() .get_session_id() .id; - spell::license::validate_license(session_id, crate::lore::console_client_config::default()) - .await + spell::license::validate_license( + session_id, + crate::lore::console_client_config::default().await, + ) + .await } #[cfg(test)] @@ -96,8 +100,8 @@ mod tests { const SESSION_ID: &str = "74c3b620-6048-4bfd-9bf7-c9857a001694"; const TIMESTAMP: u64 = 17243237291234u64; - fn setup_secrets(vault: &Vault, secrets: Secrets) { - let mut pouches = vault.reservation().reserve_secret_pouch_mut().grab(); + async fn setup_secrets(vault: &Vault, secrets: Secrets) { + let mut pouches = vault.reservation().reserve_secret_pouch_mut().grab().await; let secret_pouch = pouches.secret_pouch_mut.as_mut().unwrap(); assert!(secret_pouch.gems().license_key.is_none()); assert!(secret_pouch.gems().get_session_id().id.is_none()); @@ -142,7 +146,8 @@ mod tests { SessionId::default(), create_auth_for_token(auth.to_string()), ), - ); + ) + .await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -174,7 +179,7 @@ mod tests { .await; activate_license(&vault, &config).await.unwrap(); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!(secrets.gems().get_session_id(), resulting_session_id); assert_eq!(secrets.gems().license_key, Some(LICENSE_KEY.to_string())); @@ -188,7 +193,8 @@ mod tests { setup_secrets( &vault, Secrets::new(Some(LICENSE_KEY.to_string()), SessionId::default(), None), - ); + ) + .await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -220,7 +226,7 @@ mod tests { .await; activate_license(&vault, &config).await.unwrap(); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!(secrets.gems().get_session_id(), resulting_session_id); assert_eq!(secrets.gems().license_key, Some(LICENSE_KEY.to_string())); @@ -241,7 +247,8 @@ mod tests { }, None, ), - ); + ) + .await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -258,7 +265,7 @@ mod tests { .await; activate_license(&vault, &config).await.unwrap(); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!(secrets.gems().get_session_id(), resulting_session_id); assert_eq!(secrets.gems().license_key, Some(LICENSE_KEY.to_string())); @@ -276,7 +283,8 @@ mod tests { SessionId::default(), create_auth_for_token("irrelevant".to_string()), ), - ); + ) + .await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -293,7 +301,7 @@ mod tests { ) .contains("Console responded with already active, but license and session id are not set")); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!(secrets.gems().get_session_id(), SessionId::default()); assert_eq!(secrets.gems().license_key, None); @@ -314,7 +322,8 @@ mod tests { }, create_auth_for_token("irrelevant".to_string()), ), - ); + ) + .await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -331,7 +340,7 @@ mod tests { ) .contains("Console responded with already active, but license is not set")); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!( secrets.gems().get_session_id(), @@ -351,7 +360,8 @@ mod tests { setup_secrets( &vault, Secrets::new(Some(LICENSE_KEY.to_string()), SessionId::default(), None), - ); + ) + .await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -368,7 +378,7 @@ mod tests { ) .contains("Console responded with already active, but session id is not set")); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!(secrets.gems().get_session_id(), SessionId::default()); assert_eq!(secrets.gems().license_key, Some(LICENSE_KEY.to_string())); @@ -379,7 +389,7 @@ mod tests { let vault = Vault::new(VaultConfig { path: Path::new(TEST_PATH).to_path_buf(), }); - setup_secrets(&vault, Secrets::new(None, SessionId::default(), None)); + setup_secrets(&vault, Secrets::new(None, SessionId::default(), None)).await; let mut server = mockito::Server::new_async().await; let config = Configuration { base_path: server.url(), @@ -401,7 +411,7 @@ mod tests { "Can not activate license, as no license key or user authentication is present" ),); mock.assert(); - let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = secrets.secret_pouch_mut.as_mut().unwrap(); assert_eq!(secrets.gems().get_session_id(), SessionId::default()); assert_eq!(secrets.gems().license_key, None); diff --git a/flecs-core/src/sorcerer/manifesto.rs b/flecs-core/src/sorcerer/manifesto.rs index 99cd9557e..b2dc28f7c 100644 --- a/flecs-core/src/sorcerer/manifesto.rs +++ b/flecs-core/src/sorcerer/manifesto.rs @@ -12,6 +12,7 @@ pub async fn download_manifest( .reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() @@ -20,7 +21,7 @@ pub async fn download_manifest( .id; let session_id = session_id.unwrap_or_default(); spell::manifest::download_manifest( - crate::lore::console_client_config::default(), + crate::lore::console_client_config::default().await, &session_id, &app_key.name, &app_key.version, diff --git a/flecs-core/src/vault/mod.rs b/flecs-core/src/vault/mod.rs index b752c097c..30eee6611 100644 --- a/flecs-core/src/vault/mod.rs +++ b/flecs-core/src/vault/mod.rs @@ -4,7 +4,7 @@ use crate::vault::pouch::{Pouch, Secrets}; use pouch::{AppPouch, ManifestPouch, SecretPouch, VaultPouch}; use std::fmt::{Debug, Display, Formatter}; use std::path::{Path, PathBuf}; -use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; +use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; pub enum Error { Single(String), @@ -117,46 +117,55 @@ impl Vault { /// use flecs_core::vault::{Vault, VaultConfig}; /// use std::path::Path; /// - /// let vault = Vault::new(VaultConfig { - /// path: Path::new("/tmp/vault/").to_path_buf(), - /// }); - /// let reservation = vault - /// .reservation() - /// .reserve_app_pouch() - /// .reserve_manifest_pouch() - /// .reserve_secret_pouch_mut(); - /// let pouches = reservation.grab(); - /// assert!(pouches.app_pouch.is_some()); - /// assert!(pouches.app_pouch_mut.is_none()); - /// assert!(pouches.manifest_pouch.is_some()); - /// assert!(pouches.manifest_pouch_mut.is_none()); - /// assert!(pouches.secret_pouch.is_none()); - /// assert!(pouches.secret_pouch_mut.is_some()); + /// # tokio_test::block_on( + /// async { + /// let vault = Vault::new(VaultConfig { + /// path: Path::new("/tmp/vault/").to_path_buf(), + /// }); + /// let reservation = vault + /// .reservation() + /// .reserve_app_pouch() + /// .reserve_manifest_pouch() + /// .reserve_secret_pouch_mut(); + /// let pouches = reservation.grab().await; + /// assert!(pouches.app_pouch.is_some()); + /// assert!(pouches.app_pouch_mut.is_none()); + /// assert!(pouches.manifest_pouch.is_some()); + /// assert!(pouches.manifest_pouch_mut.is_none()); + /// assert!(pouches.secret_pouch.is_none()); + /// assert!(pouches.secret_pouch_mut.is_some()); + /// } + /// # ) /// ``` /// More concise variant /// ``` /// use flecs_core::vault::{GrabbedPouches, Vault, VaultConfig}; /// use std::path::Path; /// - /// let vault = Vault::new(VaultConfig { - /// path: Path::new("/tmp/vault/").to_path_buf(), - /// }); - /// if let GrabbedPouches { - /// app_pouch: Some(apps), - /// manifest_pouch: Some(manifests), - /// secret_pouch_mut: Some(secrets), - /// .. - /// } = &vault - /// .reservation() - /// .reserve_app_pouch() - /// .reserve_manifest_pouch() - /// .reserve_secret_pouch_mut() - /// .grab() - /// { - /// // use pouches - /// } else { - /// panic!("This branch is unreachable if the correct pouches are reserved and matched"); - /// }; + /// # tokio_test::block_on( + /// async { + /// let vault = Vault::new(VaultConfig { + /// path: Path::new("/tmp/vault/").to_path_buf(), + /// }); + /// if let GrabbedPouches { + /// app_pouch: Some(apps), + /// manifest_pouch: Some(manifests), + /// secret_pouch_mut: Some(secrets), + /// .. + /// } = &vault + /// .reservation() + /// .reserve_app_pouch() + /// .reserve_manifest_pouch() + /// .reserve_secret_pouch_mut() + /// .grab() + /// .await + /// { + /// // use pouches + /// } else { + /// panic!("This branch is unreachable if the correct pouches are reserved and matched"); + /// }; + /// } + /// # ) /// ``` pub fn reservation(&self) -> Reservation { Reservation::new(self) @@ -164,13 +173,14 @@ impl Vault { /// Replaces the content of all pouches with data from disk. See [AppPouch::open()], /// [ManifestPouch::open()] and [SecretPouch::open()] for details. - pub fn open(&self) { + pub async fn open(&self) { let mut grabbed_pouches = self .reservation() .reserve_app_pouch_mut() .reserve_manifest_pouch_mut() .reserve_secret_pouch_mut() - .grab(); + .grab() + .await; if let GrabbedPouches { app_pouch_mut: Some(ref mut app_pouch_mut), manifest_pouch_mut: Some(ref mut manifest_pouch_mut), @@ -194,24 +204,26 @@ impl Vault { /// Saves the content of all contained pouches. Calling this function is generally not necessary /// as the pouches are implicitly saved after accessing them mutably via [Self::reservation()]. - pub fn close(&self) { + pub async fn close(&self) { // Dropping 'GrabbedPouches' closes all contained pouches let _ = self .reservation() .reserve_app_pouch_mut() .reserve_manifest_pouch_mut() .reserve_secret_pouch_mut() - .grab(); + .grab() + .await; } /// Creates a copy of the [Secrets] contained in the [SecretPouch] of this vault. ///
Do not use this function if any other pouches of the vault are needed. /// Using this method while access to the secret pouch was granted via reservation will lead to /// a deadlock!
- pub fn get_secrets(&self) -> Secrets { + pub async fn get_secrets(&self) -> Secrets { self.reservation() .reserve_secret_pouch() .grab() + .await .secret_pouch .as_ref() .unwrap() @@ -300,29 +312,31 @@ impl<'a> Reservation<'a> { self } - fn create_reservation_guards( + async fn create_reservation_guards( reserve_kind: ReserveKind, lock: &RwLock, ) -> (Option>, Option>) { match reserve_kind { ReserveKind::None => (None, None), - ReserveKind::Read => (Some(lock.read().unwrap()), None), - ReserveKind::Write => (None, Some(lock.write().unwrap())), + ReserveKind::Read => (Some(lock.read().await), None), + ReserveKind::Write => (None, Some(lock.write().await)), } } /// Converts the [Reservation] into [GrabbedPouches] which allows accessing the previously /// reserved pouches. This function blocks until all reserved pouches are available. /// For usage examples see [Vault::reservation()]. - pub fn grab(self) -> GrabbedPouches<'a> { + pub async fn grab(self) -> GrabbedPouches<'a> { let (app_pouch, app_pouch_mut) = - Self::create_reservation_guards(self.app_pouch_reserved, &self.vault.app_pouch); + Self::create_reservation_guards(self.app_pouch_reserved, &self.vault.app_pouch).await; let (secret_pouch, secret_pouch_mut) = - Self::create_reservation_guards(self.secret_pouch_reserved, &self.vault.secret_pouch); + Self::create_reservation_guards(self.secret_pouch_reserved, &self.vault.secret_pouch) + .await; let (manifest_pouch, manifest_pouch_mut) = Self::create_reservation_guards( self.manifest_pouch_reserved, &self.vault.manifest_pouch, - ); + ) + .await; GrabbedPouches { app_pouch, secret_pouch, @@ -351,9 +365,9 @@ mod tests { use flecs_console_client::models::SessionId; use ntest::timeout; - #[test] + #[tokio::test] #[timeout(100)] - fn grab_multiple() { + async fn grab_multiple() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); @@ -362,7 +376,8 @@ mod tests { .reserve_manifest_pouch() .reserve_app_pouch() .reserve_secret_pouch() - .grab(); + .grab() + .await; assert!(grab.manifest_pouch.is_some()); assert!(grab.app_pouch.is_some()); assert!(grab.secret_pouch.is_some()); @@ -371,68 +386,72 @@ mod tests { assert!(grab.secret_pouch_mut.is_none()); } - #[test] + #[tokio::test] #[timeout(100)] #[should_panic] - fn double_grab_mutable_mutable() { + async fn double_grab_mutable_mutable() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); - let _grab1 = vault.reservation().reserve_secret_pouch_mut().grab(); - let _grab2 = vault.reservation().reserve_secret_pouch_mut().grab(); + let _grab1 = vault.reservation().reserve_secret_pouch_mut().grab().await; + let _grab2 = vault.reservation().reserve_secret_pouch_mut().grab().await; } - #[test] + #[tokio::test] #[timeout(100)] #[should_panic] - fn double_grab_mutable_immutable() { + async fn double_grab_mutable_immutable() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); - let _grab1 = vault.reservation().reserve_secret_pouch_mut().grab(); - let _grab2 = vault.reservation().reserve_secret_pouch().grab(); + let _grab1 = vault.reservation().reserve_secret_pouch_mut().grab().await; + let _grab2 = vault.reservation().reserve_secret_pouch().grab().await; } - #[test] + #[tokio::test] #[timeout(100)] - fn double_grab_immutable_immutable() { + async fn double_grab_immutable_immutable() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); - let grab1 = vault.reservation().reserve_secret_pouch().grab(); + let grab1 = vault.reservation().reserve_secret_pouch().grab().await; assert!(grab1.secret_pouch.is_some()); - let grab2 = vault.reservation().reserve_secret_pouch().grab(); + let grab2 = vault.reservation().reserve_secret_pouch().grab().await; assert!(grab2.secret_pouch.is_some()); } - #[test] + #[tokio::test] #[timeout(100)] #[should_panic] - fn double_grab_immutable_mutable() { + async fn double_grab_immutable_mutable() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); - let _grab1 = vault.reservation().reserve_secret_pouch().grab(); - let _grab2 = vault.reservation().reserve_secret_pouch_mut().grab(); + let _grab1 = vault.reservation().reserve_secret_pouch().grab().await; + let _grab2 = vault.reservation().reserve_secret_pouch_mut().grab().await; } - #[test] + #[tokio::test] #[timeout(100)] - fn reserving_one_pouch_leaves_other_pouches_mut() { + async fn reserving_one_pouch_leaves_other_pouches_mut() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); - let grab_secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let grab_secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; assert!(grab_secrets.secret_pouch_mut.is_some()); - let grab_apps = vault.reservation().reserve_app_pouch_mut().grab(); + let grab_apps = vault.reservation().reserve_app_pouch_mut().grab().await; assert!(grab_apps.app_pouch_mut.is_some()); - let grab_manifests = vault.reservation().reserve_manifest_pouch_mut().grab(); + let grab_manifests = vault + .reservation() + .reserve_manifest_pouch_mut() + .grab() + .await; assert!(grab_manifests.manifest_pouch_mut.is_some()); } - #[test] + #[tokio::test] #[timeout(100)] - fn get_secrets() { + async fn get_secrets() { let vault = Vault::new(VaultConfig { path: Path::new("/tmp/flecs-tests/vault/").to_path_buf(), }); @@ -445,12 +464,12 @@ mod tests { None, ); { - let mut grab_secrets = vault.reservation().reserve_secret_pouch_mut().grab(); + let mut grab_secrets = vault.reservation().reserve_secret_pouch_mut().grab().await; let secrets = grab_secrets.secret_pouch_mut.as_mut().unwrap().gems_mut(); secrets.set_session_id(expected_secrets.get_session_id()); secrets.authentication = expected_secrets.authentication.clone(); secrets.license_key = expected_secrets.license_key.clone(); } - assert_eq!(expected_secrets, vault.get_secrets()); + assert_eq!(expected_secrets, vault.get_secrets().await); } } diff --git a/flecs_core_cxx_bridge/src/manifest.rs b/flecs_core_cxx_bridge/src/manifest.rs index e9d2b5793..66093368e 100644 --- a/flecs_core_cxx_bridge/src/manifest.rs +++ b/flecs_core_cxx_bridge/src/manifest.rs @@ -5,14 +5,16 @@ use flecs_core::*; pub fn download_manifest(app: &str, version: &str) -> Result { let server = get_server(); let server = server.lock().unwrap(); - let vault = lore::vault::default(); - Ok(serde_json::to_string(&server.runtime.block_on( + let manifest = server.runtime.block_on(async { + let vault = lore::vault::default().await; sorcerer::manifesto::download_manifest( &vault, AppKey { name: app.into(), version: version.into(), }, - ), - )?)?) + ) + .await + })?; + Ok(serde_json::to_string(&manifest)?) } diff --git a/flecs_core_cxx_bridge/src/token.rs b/flecs_core_cxx_bridge/src/token.rs index 1aad29ae8..6d3639fd7 100644 --- a/flecs_core_cxx_bridge/src/token.rs +++ b/flecs_core_cxx_bridge/src/token.rs @@ -5,16 +5,11 @@ use flecs_core::{lore, sorcerer}; pub fn acquire_download_token(app: &str, version: &str) -> Result { let server = get_server(); let server = server.lock().unwrap(); - let configuration = lore::console_client_config::default(); - let vault = lore::vault::default(); - let data = server - .runtime - .block_on(sorcerer::authmancer::acquire_download_token( - configuration, - &vault, - app, - version, - ))?; + let data = server.runtime.block_on(async { + let vault = lore::vault::default().await; + let configuration = lore::console_client_config::default().await; + sorcerer::authmancer::acquire_download_token(configuration, &vault, app, version).await + })?; Ok(Token { username: data.token.username, password: data.token.password,