mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2025-06-06 06:06:43 +00:00
pow uses const routes
This commit is contained in:
parent
ef778687e0
commit
0829ee1c74
@ -31,6 +31,7 @@ pub fn services(cfg: &mut ServiceConfig) {
|
|||||||
auth::services(cfg);
|
auth::services(cfg);
|
||||||
account::services(cfg);
|
account::services(cfg);
|
||||||
mcaptcha::services(cfg);
|
mcaptcha::services(cfg);
|
||||||
|
pow::services(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
use actix::prelude::*;
|
use actix::prelude::*;
|
||||||
use actix_web::{post, web, HttpResponse, Responder};
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
use m_captcha::{defense::LevelBuilder, master::AddSiteBuilder, DefenseBuilder, MCaptchaBuilder};
|
use m_captcha::{defense::LevelBuilder, master::AddSiteBuilder, DefenseBuilder, MCaptchaBuilder};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
@ -39,8 +39,6 @@ pub struct GetConfigPayload {
|
|||||||
|
|
||||||
// API keys are mcaptcha actor names
|
// API keys are mcaptcha actor names
|
||||||
|
|
||||||
#[post("/config")]
|
|
||||||
//#[post("/pow/config")]
|
|
||||||
pub async fn get_config(
|
pub async fn get_config(
|
||||||
payload: web::Json<GetConfigPayload>,
|
payload: web::Json<GetConfigPayload>,
|
||||||
data: web::Data<Data>,
|
data: web::Data<Data>,
|
||||||
@ -154,8 +152,6 @@ mod tests {
|
|||||||
const NAME: &str = "powusrworks";
|
const NAME: &str = "powusrworks";
|
||||||
const PASSWORD: &str = "testingpas";
|
const PASSWORD: &str = "testingpas";
|
||||||
const EMAIL: &str = "randomuser@a.com";
|
const EMAIL: &str = "randomuser@a.com";
|
||||||
const GET_URL: &str = "/api/v1/pow/config";
|
|
||||||
// const UPDATE_URL: &str = "/api/v1/mcaptcha/domain/token/duration/update";
|
|
||||||
|
|
||||||
{
|
{
|
||||||
let data = Data::new().await;
|
let data = Data::new().await;
|
||||||
@ -175,7 +171,7 @@ mod tests {
|
|||||||
|
|
||||||
let get_config_resp = test::call_service(
|
let get_config_resp = test::call_service(
|
||||||
&mut app,
|
&mut app,
|
||||||
post_request!(&get_config_payload, GET_URL)
|
post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config)
|
||||||
.cookie(cookies.clone())
|
.cookie(cookies.clone())
|
||||||
.to_request(),
|
.to_request(),
|
||||||
)
|
)
|
||||||
|
@ -25,27 +25,46 @@ pub mod verify_token;
|
|||||||
pub use super::mcaptcha::duration::GetDurationResp;
|
pub use super::mcaptcha::duration::GetDurationResp;
|
||||||
pub use super::mcaptcha::levels::I32Levels;
|
pub use super::mcaptcha::levels::I32Levels;
|
||||||
|
|
||||||
// middleware protected by scope
|
|
||||||
pub fn services(cfg: &mut web::ServiceConfig) {
|
pub fn services(cfg: &mut web::ServiceConfig) {
|
||||||
let captcha_api_cors = Cors::default()
|
use crate::define_resource;
|
||||||
.allow_any_origin()
|
use crate::V1_API_ROUTES;
|
||||||
.allowed_methods(vec!["POST"])
|
|
||||||
.allow_any_header()
|
|
||||||
.max_age(0)
|
|
||||||
.send_wildcard();
|
|
||||||
|
|
||||||
cfg.service(
|
define_resource!(
|
||||||
web::scope("/api/v1/pow/")
|
cfg,
|
||||||
.wrap(captcha_api_cors)
|
V1_API_ROUTES.pow.verify_pow,
|
||||||
.configure(intenral_services),
|
Methods::CorsAllowAllPost,
|
||||||
|
verify_pow::verify_pow
|
||||||
|
);
|
||||||
|
|
||||||
|
define_resource!(
|
||||||
|
cfg,
|
||||||
|
V1_API_ROUTES.pow.get_config,
|
||||||
|
Methods::CorsAllowAllPost,
|
||||||
|
get_config::get_config
|
||||||
|
);
|
||||||
|
|
||||||
|
define_resource!(
|
||||||
|
cfg,
|
||||||
|
V1_API_ROUTES.pow.validate_captcha_token,
|
||||||
|
Methods::CorsAllowAllPost,
|
||||||
|
verify_token::validate_captcha_token
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// internal route aggregator, it's easy to use macros
|
pub mod routes {
|
||||||
// to denote paths than having to type it out
|
pub struct PoW {
|
||||||
// but remember, final path = scope + macro path
|
pub get_config: &'static str,
|
||||||
fn intenral_services(cfg: &mut web::ServiceConfig) {
|
pub verify_pow: &'static str,
|
||||||
cfg.service(get_config::get_config);
|
pub validate_captcha_token: &'static str,
|
||||||
cfg.service(verify_pow::verify_pow);
|
}
|
||||||
cfg.service(verify_token::validate_captcha_token);
|
|
||||||
|
impl PoW {
|
||||||
|
pub const fn new() -> Self {
|
||||||
|
PoW {
|
||||||
|
get_config: "/api/v1/pow/config",
|
||||||
|
verify_pow: "/api/v1/pow/verify",
|
||||||
|
validate_captcha_token: "/api/v1/pow/siteverify",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use actix_web::{post, web, HttpResponse, Responder};
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
use m_captcha::pow::Work;
|
use m_captcha::pow::Work;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
@ -29,7 +29,6 @@ pub struct ValidationToken {
|
|||||||
|
|
||||||
// API keys are mcaptcha actor names
|
// API keys are mcaptcha actor names
|
||||||
|
|
||||||
#[post("/verify")]
|
|
||||||
pub async fn verify_pow(
|
pub async fn verify_pow(
|
||||||
payload: web::Json<Work>,
|
payload: web::Json<Work>,
|
||||||
data: web::Data<Data>,
|
data: web::Data<Data>,
|
||||||
@ -55,9 +54,6 @@ mod tests {
|
|||||||
const NAME: &str = "powverifyusr";
|
const NAME: &str = "powverifyusr";
|
||||||
const PASSWORD: &str = "testingpas";
|
const PASSWORD: &str = "testingpas";
|
||||||
const EMAIL: &str = "verifyuser@a.com";
|
const EMAIL: &str = "verifyuser@a.com";
|
||||||
const VERIFY_URL: &str = "/api/v1/pow/verify";
|
|
||||||
const GET_URL: &str = "/api/v1/pow/config";
|
|
||||||
// const UPDATE_URL: &str = "/api/v1/mcaptcha/domain/token/duration/update";
|
|
||||||
|
|
||||||
{
|
{
|
||||||
let data = Data::new().await;
|
let data = Data::new().await;
|
||||||
@ -76,7 +72,7 @@ mod tests {
|
|||||||
|
|
||||||
let get_config_resp = test::call_service(
|
let get_config_resp = test::call_service(
|
||||||
&mut app,
|
&mut app,
|
||||||
post_request!(&get_config_payload, GET_URL).to_request(),
|
post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config).to_request(),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
assert_eq!(get_config_resp.status(), StatusCode::OK);
|
assert_eq!(get_config_resp.status(), StatusCode::OK);
|
||||||
@ -97,12 +93,18 @@ mod tests {
|
|||||||
key: token_key.key.clone(),
|
key: token_key.key.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let pow_verify_resp =
|
let pow_verify_resp = test::call_service(
|
||||||
test::call_service(&mut app, post_request!(&work, VERIFY_URL).to_request()).await;
|
&mut app,
|
||||||
|
post_request!(&work, V1_API_ROUTES.pow.verify_pow).to_request(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
assert_eq!(pow_verify_resp.status(), StatusCode::OK);
|
assert_eq!(pow_verify_resp.status(), StatusCode::OK);
|
||||||
|
|
||||||
let string_not_found =
|
let string_not_found = test::call_service(
|
||||||
test::call_service(&mut app, post_request!(&work, VERIFY_URL).to_request()).await;
|
&mut app,
|
||||||
|
post_request!(&work, V1_API_ROUTES.pow.verify_pow).to_request(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
assert_eq!(string_not_found.status(), StatusCode::BAD_REQUEST);
|
assert_eq!(string_not_found.status(), StatusCode::BAD_REQUEST);
|
||||||
let err: ErrorToResponse = test::read_body_json(string_not_found).await;
|
let err: ErrorToResponse = test::read_body_json(string_not_found).await;
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -113,12 +115,12 @@ mod tests {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
let pow_config_resp = test::call_service(
|
// let pow_config_resp = test::call_service(
|
||||||
&mut app,
|
// &mut app,
|
||||||
post_request!(&get_config_payload, GET_URL).to_request(),
|
// post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config).to_request(),
|
||||||
)
|
// )
|
||||||
.await;
|
// .await;
|
||||||
assert_eq!(pow_config_resp.status(), StatusCode::OK);
|
// assert_eq!(pow_config_resp.status(), StatusCode::OK);
|
||||||
// I'm not checking for errors because changing work.result triggered
|
// I'm not checking for errors because changing work.result triggered
|
||||||
// InssuficientDifficulty, which is possible becuase m_captcha calculates
|
// InssuficientDifficulty, which is possible becuase m_captcha calculates
|
||||||
// difficulty with the submitted result. Besides, this endpoint is merely
|
// difficulty with the submitted result. Besides, this endpoint is merely
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use actix_web::{post, web, HttpResponse, Responder};
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
use m_captcha::cache::messages::VerifyCaptchaResult;
|
use m_captcha::cache::messages::VerifyCaptchaResult;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
@ -29,7 +29,6 @@ pub struct CaptchaValidateResp {
|
|||||||
|
|
||||||
// API keys are mcaptcha actor names
|
// API keys are mcaptcha actor names
|
||||||
|
|
||||||
#[post("/siteverify")]
|
|
||||||
pub async fn validate_captcha_token(
|
pub async fn validate_captcha_token(
|
||||||
payload: web::Json<VerifyCaptchaResult>,
|
payload: web::Json<VerifyCaptchaResult>,
|
||||||
data: web::Data<Data>,
|
data: web::Data<Data>,
|
||||||
|
@ -21,6 +21,7 @@ use super::mcaptcha::duration::routes::Duration;
|
|||||||
use super::mcaptcha::levels::routes::Levels;
|
use super::mcaptcha::levels::routes::Levels;
|
||||||
use super::mcaptcha::mcaptcha::routes::MCaptcha;
|
use super::mcaptcha::mcaptcha::routes::MCaptcha;
|
||||||
use super::meta::routes::Meta;
|
use super::meta::routes::Meta;
|
||||||
|
use super::pow::routes::PoW;
|
||||||
|
|
||||||
pub const ROUTES: Routes = Routes::new();
|
pub const ROUTES: Routes = Routes::new();
|
||||||
|
|
||||||
@ -31,6 +32,7 @@ pub struct Routes {
|
|||||||
pub mcaptcha: MCaptcha,
|
pub mcaptcha: MCaptcha,
|
||||||
pub duration: Duration,
|
pub duration: Duration,
|
||||||
pub meta: Meta,
|
pub meta: Meta,
|
||||||
|
pub pow: PoW,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Routes {
|
impl Routes {
|
||||||
@ -42,6 +44,7 @@ impl Routes {
|
|||||||
mcaptcha: MCaptcha::new(),
|
mcaptcha: MCaptcha::new(),
|
||||||
duration: Duration::new(),
|
duration: Duration::new(),
|
||||||
meta: Meta::new(),
|
meta: Meta::new(),
|
||||||
|
pow: PoW::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,6 @@ async fn main() -> std::io::Result<()> {
|
|||||||
.wrap(actix_middleware::NormalizePath::new(
|
.wrap(actix_middleware::NormalizePath::new(
|
||||||
actix_middleware::normalize::TrailingSlash::Trim,
|
actix_middleware::normalize::TrailingSlash::Trim,
|
||||||
))
|
))
|
||||||
.configure(v1::pow::services)
|
|
||||||
.configure(v1::services)
|
.configure(v1::services)
|
||||||
.configure(docs::services)
|
.configure(docs::services)
|
||||||
.configure(static_assets::services)
|
.configure(static_assets::services)
|
||||||
|
@ -17,12 +17,21 @@
|
|||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub enum Methods {
|
pub enum Methods {
|
||||||
|
/// GET hander
|
||||||
Get,
|
Get,
|
||||||
|
/// POST handler
|
||||||
Post,
|
Post,
|
||||||
|
/// Protected GET handler
|
||||||
ProtectGet,
|
ProtectGet,
|
||||||
|
/// Protected POST handler
|
||||||
ProtectPost,
|
ProtectPost,
|
||||||
|
/// CORS allow all orgin GET handler
|
||||||
|
CorsAllowAllGet,
|
||||||
|
/// CORS allow all orgin PST handler
|
||||||
|
CorsAllowAllPost,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Defines resoures for [Methods]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! define_resource {
|
macro_rules! define_resource {
|
||||||
($cfg:expr, $path:expr, Methods::Get, $to:expr) => {
|
($cfg:expr, $path:expr, Methods::Get, $to:expr) => {
|
||||||
@ -58,4 +67,29 @@ macro_rules! define_resource {
|
|||||||
.to($to),
|
.to($to),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
($cfg:expr, $path:expr, Methods::CorsAllowAllGet, $cors:expr, $to:expr) => {
|
||||||
|
$cfg.service(
|
||||||
|
actix_web::web::resource($path)
|
||||||
|
.wrap($cors)
|
||||||
|
.guard(actix_web::guard::Get())
|
||||||
|
.to($to),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
($cfg:expr, $path:expr, Methods::CorsAllowAllPost, $to:expr) => {
|
||||||
|
let cors = Cors::default()
|
||||||
|
.allow_any_origin()
|
||||||
|
.allowed_methods(vec!["POST"])
|
||||||
|
.allow_any_header()
|
||||||
|
.max_age(0)
|
||||||
|
.send_wildcard();
|
||||||
|
|
||||||
|
$cfg.service(
|
||||||
|
actix_web::web::resource($path)
|
||||||
|
.wrap(cors)
|
||||||
|
.guard(actix_web::guard::Post())
|
||||||
|
.to($to),
|
||||||
|
);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user