use serde::{Deserialize, Serialize};
#[cfg(feature = "full")]
pub mod hashcache;
#[cfg(feature = "full")]
pub mod redis;
#[derive(Serialize, Deserialize)]
pub struct AddChallenge {
pub difficulty: u32,
pub duration: u64,
pub challenge: String,
}
#[cfg(feature = "full")]
pub trait Save:
actix::Actor
+ actix::Handler<messages::RetrivePoW>
+ actix::Handler<messages::CachePoW>
+ actix::Handler<messages::DeletePoW>
+ actix::Handler<messages::CacheResult>
+ actix::Handler<messages::VerifyCaptchaResult>
+ actix::Handler<messages::DeleteCaptchaResult>
{
}
#[cfg(feature = "full")]
pub mod messages {
use actix::dev::*;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use tokio::sync::oneshot::Receiver;
use crate::errors::*;
#[derive(Message, Serialize, Deserialize, Builder, Clone)]
#[rtype(result = "Receiver<CaptchaResult<()>>")]
pub struct CachePoW {
pub string: String,
pub difficulty_factor: u32,
pub duration: u64,
pub key: String,
}
#[derive(Message)]
#[rtype(result = "Receiver<CaptchaResult<Option<CachedPoWConfig>>>")]
pub struct RetrivePoW(pub VerifyCaptchaResult);
#[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)]
pub struct CachedPoWConfig {
pub key: String,
pub difficulty_factor: u32,
pub duration: u64,
}
#[derive(Message)]
#[rtype(result = "CaptchaResult<()>")]
pub struct DeletePoW(pub String);
#[derive(Message, Serialize, Deserialize, Builder)]
#[rtype(result = "Receiver<CaptchaResult<()>>")]
pub struct CacheResult {
pub token: String,
pub key: String,
pub duration: u64,
}
impl From<CachedPoWConfig> for CacheResult {
fn from(c: CachedPoWConfig) -> Self {
use crate::utils::get_random;
CacheResultBuilder::default()
.key(c.key)
.duration(c.duration)
.token(get_random(32))
.build()
.unwrap()
}
}
#[derive(Message, Clone, Deserialize, Serialize)]
#[rtype(result = "Receiver<CaptchaResult<bool>>")]
pub struct VerifyCaptchaResult {
pub token: String,
pub key: String,
}
#[derive(Message)]
#[rtype(result = "CaptchaResult<()>")]
pub struct DeleteCaptchaResult {
pub token: String,
}
}