Skip to content

Commit

Permalink
Add Re: to subject for reply emails
Browse files Browse the repository at this point in the history
  • Loading branch information
DimiDumo committed Sep 13, 2024
1 parent 7ea7e42 commit 7385b9a
Show file tree
Hide file tree
Showing 7 changed files with 126 additions and 43 deletions.
14 changes: 13 additions & 1 deletion packages/relayer/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ impl ChainClient {
.call()
.await
.map_err(|e| {
ChainError::contract_error("Failed to get recovery subject templates", e)
ChainError::contract_error("Failed to get recovery command templates", e)
})?;
Ok(templates[template_idx as usize].clone())
}
Expand All @@ -163,19 +163,29 @@ impl ChainClient {
account_eth_addr: &String,
complete_calldata: &String,
) -> Result<bool, ChainError> {
println!("doing complete recovery");
let controller_eth_addr: H160 =
controller_eth_addr.parse().map_err(ChainError::HexError)?;
println!("controller_eth_addr: {:?}", controller_eth_addr);

let contract = EmailAccountRecovery::new(controller_eth_addr, self.client.clone());
let decoded_calldata =
hex::decode(&complete_calldata.trim_start_matches("0x")).expect("Decoding failed");
println!("decoded_calldata : {:?}", decoded_calldata);

let account_eth_addr = account_eth_addr
.parse::<H160>()
.map_err(ChainError::HexError)?;
println!("account_eth_addr : {:?}", account_eth_addr);

let call = contract.complete_recovery(account_eth_addr, Bytes::from(decoded_calldata));
println!("call: {:?}", call);

let tx = call
.send()
.await
.map_err(|e| ChainError::contract_error("Failed to call complete_recovery", e))?;
println!("tx: {:?}", tx);
// If the transaction is successful, the function will return true and false otherwise.
let receipt = tx
.log()
Expand All @@ -188,6 +198,8 @@ impl ChainClient {
)
})?
.ok_or(anyhow!("No receipt"))?;
println!("receipt : {:?}", receipt);

Ok(receipt
.status
.map(|status| status == U64::from(1))
Expand Down
65 changes: 39 additions & 26 deletions packages/relayer/src/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,25 @@ pub async fn handle_email(email: String) -> Result<EmailAuthEvent, EmailError> {
let request_decomposed_def =
serde_json::from_str(include_str!("./regex_json/request_def.json"))
.map_err(|e| EmailError::Parse(format!("Failed to parse request_def.json: {}", e)))?;
println!("request_decomposed_def: {:?}", request_decomposed_def);
let request_idxes = extract_substr_idxes(&email, &request_decomposed_def)?;
println!("request_idxes: {:?}", request_idxes);
if request_idxes.is_empty() {
return Err(EmailError::Body(WRONG_COMMAND_FORMAT.to_string()));
}
info!(LOG, "Request idxes: {:?}", request_idxes);
let request_id = &email[request_idxes[0].0..request_idxes[0].1];
println!("request_id: {:?}", request_id);
let request_id_u32 = request_id
.parse::<u32>()
.map_err(|e| EmailError::Parse(format!("Failed to parse request_id to u64: {}", e)))?;
println!("request_id_u32: {:?}", request_id_u32);
let request = match DB.get_request(request_id_u32).await? {
Some(req) => req,
None => {
let original_subject = parsed_email.get_subject_all()?;
return Ok(EmailAuthEvent::Error {
email_addr: guardian_email_addr,
error: format!("Request {} not found", request_id),
})
original_subject,
original_message_id: parsed_email.get_message_id().ok(),
});
}
};
if request.guardian_email_addr != guardian_email_addr {
Expand Down Expand Up @@ -104,14 +103,24 @@ async fn handle_email_request(
accept(params, invitation_code).await
}
(None, is_for_recovery) if is_for_recovery => recover(params).await,
(Some(_), _) => Ok(EmailAuthEvent::Error {
email_addr: params.request.guardian_email_addr,
error: "Account code found and for recovery".to_string(),
}),
(None, _) => Ok(EmailAuthEvent::Error {
email_addr: params.request.guardian_email_addr,
error: "No account code found and not for recovery".to_string(),
}),
(Some(_), _) => {
let original_subject = params.parsed_email.get_subject_all()?;
Ok(EmailAuthEvent::Error {
email_addr: params.request.guardian_email_addr,
error: "Account code found and for recovery".to_string(),
original_subject,
original_message_id: params.parsed_email.get_message_id().ok(),
})
}
(None, _) => {
let original_subject = params.parsed_email.get_subject_all()?;
Ok(EmailAuthEvent::Error {
email_addr: params.request.guardian_email_addr,
error: "No account code found and not for recovery".to_string(),
original_subject,
original_message_id: params.parsed_email.get_message_id().ok(),
})
}
}
}

Expand Down Expand Up @@ -140,6 +149,7 @@ async fn accept(
)
.await?;

let original_subject = params.parsed_email.get_subject_all()?;
if is_accepted {
let creds = Credentials {
account_code: invitation_code,
Expand All @@ -153,11 +163,16 @@ async fn accept(
account_eth_addr: params.request.account_eth_addr,
guardian_email_addr: params.request.guardian_email_addr,
request_id: params.request.request_id,
original_subject,
original_message_id: params.parsed_email.get_message_id().ok(),
})
} else {
let original_subject = params.parsed_email.get_subject_all()?;
Ok(EmailAuthEvent::Error {
email_addr: params.request.guardian_email_addr,
error: "Failed to handle acceptance".to_string(),
original_subject,
original_message_id: params.parsed_email.get_message_id().ok(),
})
}
}
Expand All @@ -184,16 +199,22 @@ async fn recover(params: EmailRequestContext) -> Result<EmailAuthEvent, EmailErr
)
.await?;

let original_subject = params.parsed_email.get_subject_all()?;
if is_success {
Ok(EmailAuthEvent::RecoverySuccess {
account_eth_addr: params.request.account_eth_addr,
guardian_email_addr: params.request.guardian_email_addr,
request_id: params.request.request_id,
original_subject,
original_message_id: params.parsed_email.get_message_id().ok(),
})
} else {
let original_subject = params.parsed_email.get_subject_all()?;
Ok(EmailAuthEvent::Error {
email_addr: params.request.guardian_email_addr,
error: "Failed to handle recovery".to_string(),
original_subject,
original_message_id: params.parsed_email.get_message_id().ok(),
})
}
}
Expand Down Expand Up @@ -235,10 +256,8 @@ async fn update_request(
email_nullifier: Some(field_to_hex(&bytes32_to_fr(&email_nullifier)?)),
account_salt: Some(bytes32_to_hex(&account_salt)),
};
println!("updated_request: {:?}", updated_request);

let update_request_result = DB.update_request(&updated_request).await?;
println!("update_request_result: {:?}", update_request_result);
Ok(())
}

Expand Down Expand Up @@ -307,24 +326,18 @@ async fn get_encoded_command_params(
&params.request.controller_eth_addr,
params.request.template_idx,
)
.await?
.await
} else {
CLIENT
.get_acceptance_command_templates(
&params.request.controller_eth_addr,
params.request.template_idx,
)
.await?
};

let command_params =
extract_template_vals_from_command_template(&params.email_body, command_template)
.map_err(|e| EmailError::Body(format!("Invalid commad: {}", e)))?;
.await
}?;

// let command_params_encoded: Vec<Bytes> = command_params
// .iter()
// .map(|param| param.abi_encode(None).unwrap())
// .collect();
let command_params = extract_template_vals_from_command(&params.email_body, command_template)
.map_err(|e| EmailError::Body(format!("Invalid commad: {}", e)))?;

let command_params_encoded = command_params
.iter()
Expand Down
38 changes: 27 additions & 11 deletions packages/relayer/src/modules/mail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ pub enum EmailAuthEvent {
Error {
email_addr: String,
error: String,
original_subject: String,
original_message_id: Option<String>,
},
RecoveryRequest {
account_eth_addr: String,
Expand All @@ -31,11 +33,15 @@ pub enum EmailAuthEvent {
account_eth_addr: String,
guardian_email_addr: String,
request_id: u32,
original_subject: String,
original_message_id: Option<String>,
},
RecoverySuccess {
account_eth_addr: String,
guardian_email_addr: String,
request_id: u32,
original_subject: String,
original_message_id: Option<String>,
},
GuardianNotSet {
account_eth_addr: String,
Expand Down Expand Up @@ -116,8 +122,14 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError>

send_email(email).await?;
}
EmailAuthEvent::Error { email_addr, error } => {
let subject = "Error";
EmailAuthEvent::Error {
email_addr,
error,
original_subject,
original_message_id,
} => {
let subject = format!("Re: {}", original_subject);

let body_plain = format!(
"An error occurred while processing your request. \
Error: {}",
Expand All @@ -132,9 +144,9 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError>

let email = EmailMessage {
to: email_addr,
subject: subject.to_string(),
reference: None,
reply_to: None,
subject,
reference: original_message_id.clone(),
reply_to: original_message_id,
body_plain,
body_html,
body_attachments: None,
Expand Down Expand Up @@ -211,8 +223,10 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError>
account_eth_addr,
guardian_email_addr,
request_id,
original_subject,
original_message_id,
} => {
let subject = "Acceptance Success";
let subject = format!("Re: {}", original_subject);
let body_plain = format!(
"Your guardian request for the wallet address {} has been set. \
Your request ID is #{} is now complete.",
Expand All @@ -229,8 +243,8 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError>
let email = EmailMessage {
to: guardian_email_addr,
subject: subject.to_string(),
reference: None,
reply_to: None,
reference: original_message_id.clone(),
reply_to: original_message_id,
body_plain,
body_html,
body_attachments: None,
Expand All @@ -242,8 +256,10 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError>
account_eth_addr,
guardian_email_addr,
request_id,
original_subject,
original_message_id,
} => {
let subject = "Recovery Success";
let subject = format!("Re: {}", original_subject);
let body_plain = format!(
"Your recovery request for the wallet address {} is successful. \
Your request ID is #{}.",
Expand All @@ -260,8 +276,8 @@ pub async fn handle_email_event(event: EmailAuthEvent) -> Result<(), EmailError>
let email = EmailMessage {
to: guardian_email_addr,
subject: subject.to_string(),
reference: None,
reply_to: None,
reference: original_message_id.clone(),
reply_to: original_message_id,
body_plain,
body_html,
body_attachments: None,
Expand Down
2 changes: 1 addition & 1 deletion packages/relayer/src/modules/web_server/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ impl IntoResponse for ApiError {
ApiError::Database(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
ApiError::Chain(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
ApiError::SqlxError(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e),
ApiError::Validation(e) => (StatusCode::BAD_REQUEST, e.to_string()),
ApiError::Anyhow(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
ApiError::Internal(e) => (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()),
ApiError::Email(e) => match e {
Expand Down
Loading

0 comments on commit 7385b9a

Please sign in to comment.