From 6d386e90a4b8bb28ee1f2971fa7dcfcc7ef5abe1 Mon Sep 17 00:00:00 2001 From: EETagent Date: Fri, 11 Nov 2022 19:53:59 +0100 Subject: [PATCH] feat: portfolio encryption --- core/src/services/candidate_service.rs | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/core/src/services/candidate_service.rs b/core/src/services/candidate_service.rs index 965d80c..3b4e944 100644 --- a/core/src/services/candidate_service.rs +++ b/core/src/services/candidate_service.rs @@ -138,7 +138,7 @@ impl CandidateService { .is_ok() } - pub async fn submit_portfolio(candidate_id: i32) -> Result<(), ServiceError> { + pub async fn submit_portfolio(candidate_id: i32, db: &DbConn) -> Result<(), ServiceError> { let path = Path::new(&candidate_id.to_string()).to_path_buf(); let cache_path = path.join("cache"); @@ -185,6 +185,36 @@ impl CandidateService { writer.close().await.unwrap(); archive.shutdown().await.unwrap(); + let Ok(admin_public_keys) = Query::get_all_admin_public_keys(db).await else { + return Err(ServiceError::DbError); + }; + + let Ok(candidate) = Query::find_candidate_by_id(db, candidate_id).await else { + return Err(ServiceError::DbError); + }; + + let Some(candidate) = candidate else { + return Err(ServiceError::UserNotFound); + }; + + let candidate_public_key = candidate.public_key; + + let mut admin_public_keys_refrence: Vec<&str> = + admin_public_keys.iter().map(|s| &**s).collect(); + + let mut recipients = vec![&*candidate_public_key]; + + recipients.append(&mut admin_public_keys_refrence); + + let Ok(_) = crypto::encrypt_file_with_recipients( + path.join("PORTFOLIO.zip"), + path.join("PORTFOLIO.zip"), + recipients, + ) + .await else { + return Err(ServiceError::CryptoEncryptFailed); + }; + Ok(()) }