handle libmcaptcha actor errors

This commit is contained in:
realaravinth 2021-08-20 18:15:55 +05:30
parent 6ef941f73d
commit 068c49080e
No known key found for this signature in database
GPG Key ID: AD9F0F08E855ED88
6 changed files with 50 additions and 26 deletions

16
Cargo.lock generated
View File

@ -1560,9 +1560,9 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
[[package]] [[package]]
name = "matches" name = "matches"
version = "0.1.8" version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
[[package]] [[package]]
name = "mcaptcha" name = "mcaptcha"
@ -1599,6 +1599,7 @@ dependencies = [
"serde_json", "serde_json",
"serde_yaml", "serde_yaml",
"sqlx", "sqlx",
"tokio",
"url", "url",
"validator", "validator",
"yaml-rust", "yaml-rust",
@ -3058,9 +3059,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c" checksum = "01cf844b23c6131f624accf65ce0e4e9956a8bb329400ea5bcc26ae3a5c20b0b"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"bytes", "bytes",
@ -3173,12 +3174,9 @@ dependencies = [
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.5" version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085"
dependencies = [
"matches",
]
[[package]] [[package]]
name = "unicode-normalization" name = "unicode-normalization"

View File

@ -31,7 +31,7 @@ members = [
actix-web = "4.0.0-beta.8" actix-web = "4.0.0-beta.8"
actix = "0.12" actix = "0.12"
actix-identity = "0.4.0-beta.2" actix-identity = "0.4.0-beta.2"
actix-http = "3.0.0-beta.8" actix-http = "3.0.0-beta.9"
actix-rt = "2" actix-rt = "2"
actix-cors = "0.6.0-beta.2" actix-cors = "0.6.0-beta.2"
actix-service = "2.0.0" actix-service = "2.0.0"
@ -42,6 +42,7 @@ rust-embed = "6.0.0"
cache-buster = { git = "https://github.com/realaravinth/cache-buster" } cache-buster = { git = "https://github.com/realaravinth/cache-buster" }
futures = "0.3.15" futures = "0.3.15"
tokio = { version = "1", features = ["sync"]}
sqlx = { version = "0.5.5", features = [ "runtime-actix-rustls", "postgres", "time", "offline" ] } sqlx = { version = "0.5.5", features = [ "runtime-actix-rustls", "postgres", "time", "offline" ] }
argon2-creds = { branch = "master", git = "https://github.com/realaravinth/argon2-creds"} argon2-creds = { branch = "master", git = "https://github.com/realaravinth/argon2-creds"}

View File

@ -1,6 +1,7 @@
CREATE TABLE IF NOT EXISTS mcaptcha_users ( CREATE TABLE IF NOT EXISTS mcaptcha_users (
name VARCHAR(100) NOT NULL UNIQUE, name VARCHAR(100) NOT NULL UNIQUE,
email VARCHAR(100) UNIQUE DEFAULT NULL, email VARCHAR(100) UNIQUE DEFAULT NULL,
email_verified BOOLEAN DEFAULT NULL,
secret varchar(50) NOT NULL UNIQUE, secret varchar(50) NOT NULL UNIQUE,
password TEXT NOT NULL, password TEXT NOT NULL,
ID SERIAL PRIMARY KEY NOT NULL ID SERIAL PRIMARY KEY NOT NULL

View File

@ -41,6 +41,7 @@ use libmcaptcha::{
use sqlx::postgres::PgPoolOptions; use sqlx::postgres::PgPoolOptions;
use sqlx::PgPool; use sqlx::PgPool;
use crate::errors::ServiceResult;
use crate::SETTINGS; use crate::SETTINGS;
/// Represents mCaptcha cache and master system. /// Represents mCaptcha cache and master system.
@ -80,29 +81,29 @@ impl SystemGroup {
} }
/// utility function to AddSite /// utility function to AddSite
pub async fn add_site(&self, msg: AddSite) -> CaptchaResult<()> { pub async fn add_site(&self, msg: AddSite) -> ServiceResult<()> {
match self { match self {
Self::Embedded(val) => val.master.send(msg).await?, Self::Embedded(val) => val.master.send(msg).await?.await?,
Self::Redis(val) => val.master.send(msg).await?, Self::Redis(val) => val.master.send(msg).await?.await?,
}; }?;
Ok(()) Ok(())
} }
/// utility function to rename captcha /// utility function to rename captcha
pub async fn rename(&self, msg: Rename) -> CaptchaResult<()> { pub async fn rename(&self, msg: Rename) -> ServiceResult<()> {
match self { match self {
Self::Embedded(val) => val.master.send(msg).await?, Self::Embedded(val) => val.master.send(msg).await?.await?,
Self::Redis(val) => val.master.send(msg).await?, Self::Redis(val) => val.master.send(msg).await?.await?,
}; }?;
Ok(()) Ok(())
} }
/// utility function to remove captcha /// utility function to remove captcha
pub async fn remove(&self, msg: RemoveCaptcha) -> CaptchaResult<()> { pub async fn remove(&self, msg: RemoveCaptcha) -> ServiceResult<()> {
match self { match self {
Self::Embedded(val) => val.master.send(msg).await?, Self::Embedded(val) => val.master.send(msg).await?.await?,
Self::Redis(val) => val.master.send(msg).await?, Self::Redis(val) => val.master.send(msg).await?.await?,
}; }?;
Ok(()) Ok(())
} }

View File

@ -17,6 +17,7 @@
use std::convert::From; use std::convert::From;
use actix::MailboxError;
use actix_web::{ use actix_web::{
dev::BaseHttpResponseBuilder as HttpResponseBuilder, dev::BaseHttpResponseBuilder as HttpResponseBuilder,
error::ResponseError, error::ResponseError,
@ -28,6 +29,7 @@ use derive_more::{Display, Error};
use lettre::transport::smtp::Error as SmtpError; use lettre::transport::smtp::Error as SmtpError;
use libmcaptcha::errors::CaptchaError; use libmcaptcha::errors::CaptchaError;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tokio::sync::oneshot::error::RecvError;
use url::ParseError; use url::ParseError;
use validator::ValidationErrors; use validator::ValidationErrors;
@ -223,6 +225,24 @@ impl From<SmtpError> for ServiceError {
} }
} }
#[cfg(not(tarpaulin_include))]
impl From<RecvError> for ServiceError {
#[cfg(not(tarpaulin_include))]
fn from(e: RecvError) -> Self {
log::error!("{:?}", e);
ServiceError::InternalServerError
}
}
#[cfg(not(tarpaulin_include))]
impl From<MailboxError> for ServiceError {
#[cfg(not(tarpaulin_include))]
fn from(e: MailboxError) -> Self {
log::error!("{:?}", e);
ServiceError::InternalServerError
}
}
#[cfg(not(tarpaulin_include))] #[cfg(not(tarpaulin_include))]
pub type ServiceResult<V> = std::result::Result<V, ServiceError>; pub type ServiceResult<V> = std::result::Result<V, ServiceError>;

View File

@ -17,11 +17,10 @@
use std::env; use std::env;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use sqlx::postgres::PgPoolOptions;
mod data;
mod settings; mod settings;
pub use data::Data;
pub use settings::Settings; pub use settings::Settings;
#[cfg(not(tarpaulin_include))] #[cfg(not(tarpaulin_include))]
@ -33,7 +32,11 @@ lazy_static! {
#[cfg(not(tarpaulin_include))] #[cfg(not(tarpaulin_include))]
#[actix_rt::main] #[actix_rt::main]
async fn main() { async fn main() {
let data = Data::new().await; let db = PgPoolOptions::new()
.max_connections(SETTINGS.database.pool)
.connect(&SETTINGS.database.url)
.await
.expect("Unable to form database pool");
for arg in env::args() { for arg in env::args() {
if arg == "--build" { if arg == "--build" {
@ -42,7 +45,7 @@ async fn main() {
} }
} }
sqlx::migrate!("./migrations/").run(&data.db).await.unwrap(); sqlx::migrate!("./migrations/").run(&db).await.unwrap();
} }
fn build() { fn build() {