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 { // 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) } } }