use crate::prelude::*; use cryptography::hashing::HashedBytes; use log::error; use tokio::task::spawn_blocking; /// Returns true if the provided master password is valid #[inline] async fn check_master_pass( msg: &Message, db: &Pool, master_pass: &str, ) -> crate::Result> { let user_id = msg.from().ok_or(NoUserInfo)?.id.0; let Some(model) = MasterPass::get(user_id, db).await? else { error!("User was put into the GetMasterPass state with no master password set"); return Ok(Some( "No master password set. Use /cancel and set it by using /set_master_pass".to_owned(), )); }; let is_valid = { let hash = HashedBytes::from(model); let master_pass = master_pass.to_owned(); spawn_blocking(move || hash.verify(master_pass.as_bytes())).await? }; if !is_valid { return Ok(Some("Wrong master password. Try again".to_owned())); } Ok(None) } crate::simple_state_handler!( get_master_pass, check_master_pass, "Couldn't get the text of the message. Send the master password again" );