renamed data to system, hashcache is not 'static
This commit is contained in:
parent
049bdd9eaa
commit
8e065f8051
4 changed files with 61 additions and 15 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/target
|
/target
|
||||||
tarpaulin-report.html
|
tarpaulin-report.html
|
||||||
|
.env
|
||||||
|
|
|
@ -105,8 +105,8 @@ pub mod message {
|
||||||
|
|
||||||
/// message datatypes to interact with [MCaptcha] actor
|
/// message datatypes to interact with [MCaptcha] actor
|
||||||
pub mod cache;
|
pub mod cache;
|
||||||
pub mod data;
|
|
||||||
pub mod pow;
|
pub mod pow;
|
||||||
|
pub mod system;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
pub use crate::cache::hashcache::HashCache;
|
pub use crate::cache::hashcache::HashCache;
|
||||||
|
|
|
@ -28,11 +28,11 @@ use crate::mcaptcha::MCaptcha;
|
||||||
/// varying [Defense][crate::defense::Defense] configurations
|
/// varying [Defense][crate::defense::Defense] configurations
|
||||||
/// so a "master" actor is needed to manage them all
|
/// so a "master" actor is needed to manage them all
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Master<'a> {
|
pub struct Master {
|
||||||
sites: BTreeMap<&'a str, Addr<MCaptcha>>,
|
sites: BTreeMap<String, Addr<MCaptcha>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Master<'static> {
|
impl Master {
|
||||||
/// add [MCaptcha] actor to [Master]
|
/// add [MCaptcha] actor to [Master]
|
||||||
pub fn add_site(&mut self, details: AddSite) {
|
pub fn add_site(&mut self, details: AddSite) {
|
||||||
self.sites.insert(details.id, details.addr.to_owned());
|
self.sites.insert(details.id, details.addr.to_owned());
|
||||||
|
@ -51,7 +51,7 @@ impl Master<'static> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Actor for Master<'static> {
|
impl Actor for Master {
|
||||||
type Context = Context<Self>;
|
type Context = Context<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ impl Actor for Master<'static> {
|
||||||
#[rtype(result = "Option<Addr<MCaptcha>>")]
|
#[rtype(result = "Option<Addr<MCaptcha>>")]
|
||||||
pub struct GetSite(pub String);
|
pub struct GetSite(pub String);
|
||||||
|
|
||||||
impl Handler<GetSite> for Master<'static> {
|
impl Handler<GetSite> for Master {
|
||||||
type Result = MessageResult<GetSite>;
|
type Result = MessageResult<GetSite>;
|
||||||
|
|
||||||
fn handle(&mut self, m: GetSite, _ctx: &mut Self::Context) -> Self::Result {
|
fn handle(&mut self, m: GetSite, _ctx: &mut Self::Context) -> Self::Result {
|
||||||
|
@ -77,11 +77,11 @@ impl Handler<GetSite> for Master<'static> {
|
||||||
#[derive(Message, Builder)]
|
#[derive(Message, Builder)]
|
||||||
#[rtype(result = "()")]
|
#[rtype(result = "()")]
|
||||||
pub struct AddSite {
|
pub struct AddSite {
|
||||||
pub id: &'static str,
|
pub id: String,
|
||||||
pub addr: Addr<MCaptcha>,
|
pub addr: Addr<MCaptcha>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Handler<AddSite> for Master<'static> {
|
impl Handler<AddSite> for Master {
|
||||||
type Result = ();
|
type Result = ();
|
||||||
|
|
||||||
fn handle(&mut self, m: AddSite, _ctx: &mut Self::Context) -> Self::Result {
|
fn handle(&mut self, m: AddSite, _ctx: &mut Self::Context) -> Self::Result {
|
||||||
|
@ -101,7 +101,7 @@ mod tests {
|
||||||
let id = "yo";
|
let id = "yo";
|
||||||
let mcaptcha = get_counter().start();
|
let mcaptcha = get_counter().start();
|
||||||
let msg = AddSiteBuilder::default()
|
let msg = AddSiteBuilder::default()
|
||||||
.id(id)
|
.id(id.into())
|
||||||
.addr(mcaptcha.clone())
|
.addr(mcaptcha.clone())
|
||||||
.build()
|
.build()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
//! module describing various bits of data required for an mCaptcha system
|
//! module describing mCaptcha system
|
||||||
use actix::dev::*;
|
use actix::dev::*;
|
||||||
use derive_builder::Builder;
|
use derive_builder::Builder;
|
||||||
use pow_sha256::{Config, PoW};
|
use pow_sha256::{Config, PoW};
|
||||||
|
@ -24,17 +24,19 @@ use crate::cache::messages;
|
||||||
use crate::cache::Save;
|
use crate::cache::Save;
|
||||||
use crate::errors::*;
|
use crate::errors::*;
|
||||||
use crate::master::Master;
|
use crate::master::Master;
|
||||||
|
//use crate::models::*;
|
||||||
use crate::pow::*;
|
use crate::pow::*;
|
||||||
|
|
||||||
/// struct describing various bits of data required for an mCaptcha system
|
/// struct describing various bits of data required for an mCaptcha system
|
||||||
#[derive(Clone, Builder)]
|
#[derive(Clone, Builder)]
|
||||||
pub struct Data<T: Save> {
|
pub struct System<T: Save> {
|
||||||
master: Addr<Master<'static>>,
|
pub master: Addr<Master>,
|
||||||
cache: Addr<T>,
|
cache: Addr<T>,
|
||||||
pow: Config,
|
pow: Config,
|
||||||
|
// db: PgPool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Data<T>
|
impl<T> System<T>
|
||||||
where
|
where
|
||||||
T: Save,
|
T: Save,
|
||||||
<T as actix::Actor>::Context: ToEnvelope<T, messages::Cache> + ToEnvelope<T, messages::Retrive>,
|
<T as actix::Actor>::Context: ToEnvelope<T, messages::Cache> + ToEnvelope<T, messages::Retrive>,
|
||||||
|
@ -77,6 +79,48 @@ where
|
||||||
Err(_) => Err(CaptchaError::Default),
|
Err(_) => Err(CaptchaError::Default),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pub async fn register(&self, u: &Users) {
|
||||||
|
// sqlx::query!("INSERT INTO mcaptcha_users (name) VALUES ($1)", u.name)
|
||||||
|
// .execute(&self.db)
|
||||||
|
// .await
|
||||||
|
// .unwrap();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// pub async fn levels(&self, l: &Levels) {
|
||||||
|
// sqlx::query!(
|
||||||
|
// "INSERT INTO mcaptcha_levels (id, difficulty_factor, visitor_threshold) VALUES ($1, $2, $3)",
|
||||||
|
// l.id,
|
||||||
|
// l.difficulty_factor,
|
||||||
|
// l.visitor_threshold
|
||||||
|
// )
|
||||||
|
// .execute(&self.db)
|
||||||
|
// .await
|
||||||
|
// .unwrap();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// pub async fn add_mcaptcha(&self, m: &MCaptchaSystem) {
|
||||||
|
// sqlx::query!(
|
||||||
|
// "INSERT INTO mcaptcha_config (id, name, duration) VALUES ($1, $2, $3)",
|
||||||
|
// m.id,
|
||||||
|
// m.name,
|
||||||
|
// m.duration
|
||||||
|
// )
|
||||||
|
// .execute(&self.db)
|
||||||
|
// .await
|
||||||
|
// .unwrap();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// async fn init_mcaptcha(&self, m: &MCaptchaSystem) {
|
||||||
|
// let id = sqlx::query_as!(
|
||||||
|
// Duration,
|
||||||
|
// "SELECT duration FROM mcaptcha_config WHERE id = ($1)",
|
||||||
|
// m.id,
|
||||||
|
// )
|
||||||
|
// .fetch_one(&self.db)
|
||||||
|
// .await
|
||||||
|
// .unwrap();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -84,6 +128,7 @@ mod tests {
|
||||||
|
|
||||||
use pow_sha256::ConfigBuilder;
|
use pow_sha256::ConfigBuilder;
|
||||||
|
|
||||||
|
use super::System;
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::cache::HashCache;
|
use crate::cache::HashCache;
|
||||||
use crate::master::*;
|
use crate::master::*;
|
||||||
|
@ -91,7 +136,7 @@ mod tests {
|
||||||
|
|
||||||
const MCAPTCHA_NAME: &str = "batsense.net";
|
const MCAPTCHA_NAME: &str = "batsense.net";
|
||||||
|
|
||||||
async fn boostrap_system() -> Data<HashCache> {
|
async fn boostrap_system() -> System<HashCache> {
|
||||||
let master = Master::new().start();
|
let master = Master::new().start();
|
||||||
let mcaptcha = get_counter().start();
|
let mcaptcha = get_counter().start();
|
||||||
let pow = get_config();
|
let pow = get_config();
|
||||||
|
@ -105,7 +150,7 @@ mod tests {
|
||||||
|
|
||||||
master.send(msg).await.unwrap();
|
master.send(msg).await.unwrap();
|
||||||
|
|
||||||
DataBuilder::default()
|
SystemBuilder::default()
|
||||||
.master(master)
|
.master(master)
|
||||||
.cache(cache)
|
.cache(cache)
|
||||||
.pow(pow)
|
.pow(pow)
|
Loading…
Reference in a new issue