Skip to content

Commit

Permalink
feat: handle email verification during enrollment in the portals app
Browse files Browse the repository at this point in the history
  • Loading branch information
davide-baldo committed Dec 19, 2023
1 parent 28907df commit 107ae29
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 12 deletions.
1 change: 1 addition & 0 deletions implementations/rust/ockam/ockam_app_lib/src/api/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub enum OrchestratorStatus {
Connected,

WaitingForToken,
WaitingForEmailValidation,
RetrievingSpace,
RetrievingProject,
}
Expand Down
26 changes: 16 additions & 10 deletions implementations/rust/ockam/ockam_app_lib/src/enroll/enroll_user.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down Expand Up @@ -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(());
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ impl OidcServiceExt for OidcService {
user_info.email
))
}
sleep(Duration::from_secs(5)).await;
sleep(Duration::from_secs(10)).await;
}
}
}
Expand Down
1 change: 1 addition & 0 deletions implementations/swift/ockam/ockam_app/Ockam/Bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ typedef enum C_OrchestratorStatus {
Connecting,
Connected,
WaitingForToken,
WaitingForEmailValidation,
RetrievingSpace,
RetrievingProject,
} C_OrchestratorStatus;
Expand Down
1 change: 1 addition & 0 deletions implementations/swift/ockam/ockam_app/Ockam/Bridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ enum OrchestratorStatus: Int {
case Connecting
case Connected
case WaitingForToken
case WaitingForEmailValidation
case RetrievingSpace
case RetrievingProject
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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))
}
Expand Down

0 comments on commit 107ae29

Please sign in to comment.