use libmcaptcha::{
cache::{hashcache::HashCache, messages::VerifyCaptchaResult},
master::embedded::master::Master,
master::messages::AddSiteBuilder,
pow::{ConfigBuilder, Work},
system::SystemBuilder,
DefenseBuilder, LevelBuilder, MCaptchaBuilder,
};
use actix::prelude::*;
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
let cache = HashCache::default().start();
let pow = ConfigBuilder::default()
.salt("myrandomsaltisnotlongenoug".into())
.build()
.unwrap();
let master = Master::new(60).start();
let system = SystemBuilder::default()
.master(master)
.cache(cache)
.pow(pow.clone())
.runners(4)
.queue_length(2000)
.build();
let defense = DefenseBuilder::default()
.add_level(
LevelBuilder::default()
.visitor_threshold(50)
.difficulty_factor(500)
.unwrap()
.build()
.unwrap(),
)
.unwrap()
.add_level(
LevelBuilder::default()
.visitor_threshold(5000)
.difficulty_factor(50000)
.unwrap()
.build()
.unwrap(),
)
.unwrap()
.build()
.unwrap();
let mcaptcha = MCaptchaBuilder::default()
.defense(defense)
.duration(30)
.build()
.unwrap();
let mcaptcha_name = "batsense.net";
let msg = AddSiteBuilder::default()
.id(mcaptcha_name.into())
.mcaptcha(mcaptcha)
.build()
.unwrap();
system.master.send(msg).await.unwrap();
let work_req = system.get_pow(mcaptcha_name.into()).await.unwrap().unwrap();
let work = pow
.prove_work(&work_req.string, work_req.difficulty_factor)
.unwrap();
let payload = Work {
string: work_req.string,
result: work.result,
nonce: work.nonce,
key: mcaptcha_name.into(),
};
let res = system
.verify_pow(payload.clone(), "192.168.0.103".into())
.await;
assert!(res.is_ok());
let (res, _res_difficulty_factor) = res.unwrap();
let verify_msg = VerifyCaptchaResult {
token: res,
key: mcaptcha_name.into(),
};
let res = system.validate_verification_tokens(verify_msg).await;
assert!(res.is_ok());
assert!(res.unwrap());
Ok(())
}