54 lines
1.7 KiB
Rust
54 lines
1.7 KiB
Rust
use mysql_async::Pool;
|
|
use mysql_async::prelude::{params, Queryable};
|
|
use crate::db_types::{UBigInt, VarChar};
|
|
|
|
use crate::routes;
|
|
|
|
pub enum AuthReason {
|
|
Good, //passed regular check
|
|
OpenAuth, // route does not require auth
|
|
NoKey,
|
|
}
|
|
|
|
|
|
fn open_route(path: &str) -> bool {
|
|
return path == routes::INVITE_JOIN
|
|
}
|
|
pub async fn wall_entry(path: &str, pool: &Pool, params: &serde_json::Value) -> Result<AuthReason, mysql_async::error::Error> {
|
|
// Start by Checking if the api key is in our keystore
|
|
if open_route(path) {
|
|
Ok(AuthReason::OpenAuth)
|
|
}
|
|
else {
|
|
if let Some(key) = params.get("secret") {
|
|
let key_str = key.as_str();
|
|
let conn = pool.get_conn().await?;
|
|
// (id, name, secret)
|
|
type RowType = Option<(UBigInt, VarChar)>;
|
|
let db_result: Result<(_, RowType), mysql_async::error::Error> = conn
|
|
.first_exec(r"SELECT id, name FROM members WHERE secret = :secret ", mysql_async::params!{ "secret" => key_str})
|
|
.await;
|
|
|
|
match db_result {
|
|
Ok((_, row)) => {
|
|
match row{
|
|
Some(_) => Ok(AuthReason::Good),
|
|
None => Ok(AuthReason::NoKey)
|
|
}
|
|
}
|
|
Err(e) => {
|
|
println!("Issue fetching auth data {:?}", e);
|
|
Ok(AuthReason::NoKey)
|
|
}
|
|
}
|
|
|
|
//let (_con, row): (_, Option<(UBigInt, VarChar)>) = conn
|
|
// .first_exec(r"SELECT userid, name FROM keys WHERE secret = :secret ", mysql_async::params!{ "secret" => key})
|
|
// .await;
|
|
}
|
|
else {
|
|
Ok(AuthReason::NoKey)
|
|
}
|
|
}
|
|
}
|