handle errors within System methods

This commit is contained in:
Aravinth Manivannan 2021-08-20 18:35:22 +05:30
parent ec5a38093c
commit b2684d9348
Signed by: realaravinth
GPG Key ID: AD9F0F08E855ED88
5 changed files with 33 additions and 27 deletions

View File

@ -22,6 +22,9 @@
`crate::master::embedded::master`, it automatically starts `Counter`
actor.
- `System::get_pow` returns `errors::CaptchaResult<Option<PoWConfig>>`
instead of `Option<PoWConfig>`
## 0.1.3
## Added

View File

@ -90,7 +90,7 @@ async fn main() -> std::io::Result<()> {
// Get PoW config. Should be called everytime there's a visitor for a
// managed site(here mcaptcha_name)
let work_req = system.get_pow(mcaptcha_name.into()).await.unwrap();
let work_req = system.get_pow(mcaptcha_name.into()).await.unwrap().unwrap();
// the following computation should be done on the client but for the purpose
// of this illustration, we are going to do it on the server it self

View File

@ -20,6 +20,8 @@
use derive_more::{Display, Error};
#[cfg(feature = "full")]
use redis::RedisError;
#[cfg(feature = "full")]
use tokio::sync::oneshot::error::RecvError;
/// Error datatype
#[derive(Debug, PartialEq, Display, Error)]
@ -88,6 +90,11 @@ pub enum CaptchaError {
#[cfg(feature = "full")]
RedisError(RedisError),
/// Channel receive error
#[display(fmt = "{}", _0)]
#[cfg(feature = "full")]
RecvError(RecvError),
/// Weird behaviour from mcaptcha redis module
#[display(
fmt = "Something weird happening with mCaptcha redis module. Please file bug report"
@ -121,6 +128,15 @@ impl From<RedisError> for CaptchaError {
}
}
#[cfg(feature = "full")]
#[cfg(not(tarpaulin_include))]
impl From<RecvError> for CaptchaError {
fn from(e: RecvError) -> Self {
log::error!("{:?}", e);
Self::RecvError(e)
}
}
#[cfg(feature = "full")]
#[cfg(not(tarpaulin_include))]
impl From<actix::MailboxError> for CaptchaError {

View File

@ -138,7 +138,7 @@
//!
//! // Get PoW config. Should be called everytime there's a visitor for a
//! // managed site(here mcaptcha_name)
//! let work_req = system.get_pow(mcaptcha_name.into()).await.unwrap();
//! let work_req = system.get_pow(mcaptcha_name.into()).await.unwrap().unwrap();
//!
//! // the following computation should be done on the client but for the purpose
//! // of this illustration, we are going to do it on the server it self

View File

@ -85,15 +85,8 @@ where
<X as actix::Actor>::Context: ToEnvelope<X, AddVisitor> + ToEnvelope<X, AddSite>,
{
/// utility function to get difficulty factor of site `id` and cache it
pub async fn get_pow(&self, id: String) -> Option<PoWConfig> {
match self
.master
.send(AddVisitor(id.clone()))
.await
.unwrap()
.await
.unwrap()
{
pub async fn get_pow(&self, id: String) -> CaptchaResult<Option<PoWConfig>> {
match self.master.send(AddVisitor(id.clone())).await?.await? {
Ok(Some(mcaptcha)) => {
let pow_config = PoWConfig::new(mcaptcha.difficulty_factor, self.pow.salt.clone());
@ -105,16 +98,10 @@ where
.build()
.unwrap();
self.cache
.send(cache_msg)
.await
.unwrap()
.await
.unwrap()
.unwrap();
Some(pow_config)
self.cache.send(cache_msg).await?.await??;
Ok(Some(pow_config))
}
_ => None,
_ => Ok(None),
}
}
@ -127,7 +114,7 @@ where
};
let msg = RetrivePoW(msg);
let cached_config = self.cache.send(msg).await.unwrap().await.unwrap()?;
let cached_config = self.cache.send(msg).await?.await??;
if cached_config.is_none() {
return Err(CaptchaError::StringNotFound);
@ -154,7 +141,7 @@ where
let msg: CacheResult = cached_config.into();
let res = msg.token.clone();
self.cache.send(msg).await.unwrap().await.unwrap()?;
self.cache.send(msg).await?.await??;
Ok(res)
}
@ -163,7 +150,7 @@ where
&self,
msg: VerifyCaptchaResult,
) -> CaptchaResult<bool> {
self.cache.send(msg).await.unwrap().await.unwrap()
self.cache.send(msg).await?.await?
}
}
@ -211,7 +198,7 @@ mod tests {
#[actix_rt::test]
async fn get_pow_works() {
let actors = boostrap_system(10).await;
let pow = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap();
let pow = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap().unwrap();
assert_eq!(pow.difficulty_factor, LEVEL_1.0);
}
@ -220,7 +207,7 @@ mod tests {
// start system
let actors = boostrap_system(10).await;
// get work
let work_req = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap();
let work_req = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap().unwrap();
// get config
let config = get_config();
@ -261,7 +248,7 @@ mod tests {
let res = actors.verify_pow(payload.clone()).await;
assert_eq!(res, Err(CaptchaError::StringNotFound));
let insufficient_work_req = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap();
let insufficient_work_req = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap().unwrap();
let insufficient_work = config.prove_work(&insufficient_work_req.string, 1).unwrap();
let insufficient_work_payload = Work {
string: insufficient_work_req.string,
@ -272,7 +259,7 @@ mod tests {
let res = actors.verify_pow(insufficient_work_payload.clone()).await;
assert_eq!(res, Err(CaptchaError::InsuffiencientDifficulty));
let sitekeyfail_config = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap();
let sitekeyfail_config = actors.get_pow(MCAPTCHA_NAME.into()).await.unwrap().unwrap();
let sitekeyfail_work = config
.prove_work(
&sitekeyfail_config.string,