diff --git a/implementations/rust/ockam/ockam_app_lib/src/api/state.rs b/implementations/rust/ockam/ockam_app_lib/src/api/state.rs index 0f84c2b79bc..0fee3e5c1d6 100644 --- a/implementations/rust/ockam/ockam_app_lib/src/api/state.rs +++ b/implementations/rust/ockam/ockam_app_lib/src/api/state.rs @@ -15,6 +15,7 @@ pub enum OrchestratorStatus { Connected, WaitingForToken, + WaitingForEmailValidation, RetrievingSpace, RetrievingProject, } diff --git a/implementations/rust/ockam/ockam_app_lib/src/enroll/enroll_user.rs b/implementations/rust/ockam/ockam_app_lib/src/enroll/enroll_user.rs index cc392c76e1e..aedcdec7d13 100644 --- a/implementations/rust/ockam/ockam_app_lib/src/enroll/enroll_user.rs +++ b/implementations/rust/ockam/ockam_app_lib/src/enroll/enroll_user.rs @@ -1,5 +1,6 @@ use miette::IntoDiagnostic; -use tracing::{debug, error, info}; +use std::time::{Duration, Instant}; +use tracing::{debug, error, info, warn}; use ockam_api::cli_state; use ockam_api::cloud::project::{Project, Projects}; @@ -34,13 +35,6 @@ impl AppState { return Ok(()); } EnrollmentOutcome::PendingValidation => { - self.notify(Notification { - kind: Kind::Information, - title: "Verify your email".to_string(), - message: "We've sent a verification email. \ - Before we can continue, please check your inbox and click the included link to verify your email address." - .to_string(), - }); self.update_orchestrator_status(OrchestratorStatus::Disconnected); self.publish_state().await; return Ok(()); @@ -100,11 +94,23 @@ impl AppState { let token = oidc_service.get_token_with_pkce().await?; // retrieve the user information - let user_info = oidc_service.get_user_info(&token).await?; + let mut user_info = oidc_service.get_user_info(&token).await?; info!(?user_info, "User info retrieved successfully"); if !user_info.email_verified { - return Ok(EnrollmentOutcome::PendingValidation); + self.update_orchestrator_status(OrchestratorStatus::WaitingForEmailValidation); + self.publish_state().await; + + // let's wait up to 10 minutes for the email to get validated + let timeout_timestamp = Instant::now() + Duration::from_secs(60 * 10); + while !user_info.email_verified { + if Instant::now() > timeout_timestamp { + warn!("Timeout waiting for email validation"); + return Ok(EnrollmentOutcome::PendingValidation); + } + tokio::time::sleep(Duration::from_secs(10)).await; + user_info = oidc_service.get_user_info(&token).await?; + } } let cli_state = self.state().await; diff --git a/implementations/rust/ockam/ockam_command/src/enroll/oidc_service.rs b/implementations/rust/ockam/ockam_command/src/enroll/oidc_service.rs index b894493cd84..e32d3b059e0 100644 --- a/implementations/rust/ockam/ockam_command/src/enroll/oidc_service.rs +++ b/implementations/rust/ockam/ockam_command/src/enroll/oidc_service.rs @@ -153,7 +153,7 @@ impl OidcServiceExt for OidcService { user_info.email )) } - sleep(Duration::from_secs(5)).await; + sleep(Duration::from_secs(10)).await; } } } diff --git a/implementations/swift/ockam/ockam_app/Ockam/Bridge.h b/implementations/swift/ockam/ockam_app/Ockam/Bridge.h index b04e63e8fca..76afaa67355 100644 --- a/implementations/swift/ockam/ockam_app/Ockam/Bridge.h +++ b/implementations/swift/ockam/ockam_app/Ockam/Bridge.h @@ -19,6 +19,7 @@ typedef enum C_OrchestratorStatus { Connecting, Connected, WaitingForToken, + WaitingForEmailValidation, RetrievingSpace, RetrievingProject, } C_OrchestratorStatus; diff --git a/implementations/swift/ockam/ockam_app/Ockam/Bridge.swift b/implementations/swift/ockam/ockam_app/Ockam/Bridge.swift index 1306b0def12..605c09fec8d 100644 --- a/implementations/swift/ockam/ockam_app/Ockam/Bridge.swift +++ b/implementations/swift/ockam/ockam_app/Ockam/Bridge.swift @@ -183,6 +183,7 @@ enum OrchestratorStatus: Int { case Connecting case Connected case WaitingForToken + case WaitingForEmailValidation case RetrievingSpace case RetrievingProject } diff --git a/implementations/swift/ockam/ockam_app/Ockam/EnrollmentBlock.swift b/implementations/swift/ockam/ockam_app/Ockam/EnrollmentBlock.swift index a3e577b00db..6b590b6d867 100644 --- a/implementations/swift/ockam/ockam_app/Ockam/EnrollmentBlock.swift +++ b/implementations/swift/ockam/ockam_app/Ockam/EnrollmentBlock.swift @@ -72,7 +72,8 @@ Your friends will have access to it on their **localhost**! EnrollmentStatus(status: $appState.orchestrator_status) .padding(.vertical, VerticalSpacingUnit*2) - if appState.orchestrator_status == OrchestratorStatus.WaitingForToken { + if appState.orchestrator_status == OrchestratorStatus.WaitingForToken || + appState.orchestrator_status == OrchestratorStatus.WaitingForEmailValidation { Button(action: { restartCurrentProcess() }) { diff --git a/implementations/swift/ockam/ockam_app/Ockam/EnrollmentStatus.swift b/implementations/swift/ockam/ockam_app/Ockam/EnrollmentStatus.swift index dc927d0f87d..ca6bc265636 100644 --- a/implementations/swift/ockam/ockam_app/Ockam/EnrollmentStatus.swift +++ b/implementations/swift/ockam/ockam_app/Ockam/EnrollmentStatus.swift @@ -11,6 +11,8 @@ struct EnrollmentStatus: View { case .WaitingForToken: Text("Opened account.ockam.io") Text("Please finish enrolling in your browser.").font(.caption) + case .WaitingForEmailValidation: + Text("We’ve sent you a verification email.\n\nPlease check your inbox and click the included link so we can verify your email address.").padding(.bottom, VerticalSpacingUnit*2) case .RetrievingSpace: Text("Fetching your spaces...") case .RetrievingProject: @@ -33,6 +35,7 @@ struct EnrollmentStatus_Previews: PreviewProvider { EnrollmentStatus(status: .constant(.Connected)) EnrollmentStatus(status: .constant(.Connecting)) EnrollmentStatus(status: .constant(.WaitingForToken)) + EnrollmentStatus(status: .constant(.WaitingForEmailValidation)) EnrollmentStatus(status: .constant(.RetrievingSpace)) EnrollmentStatus(status: .constant(.RetrievingProject)) }