clippable/dblib/src/request.rs
2021-09-29 21:19:40 -07:00

52 lines
1.5 KiB
Rust

use crate::{DB, KeyStore};
use rocket::request::{self, Request, FromRequest};
use rocket::http::Status;
use rocket::Outcome;
use serde::{Serialize, Deserialize};
#[derive(Clone, Serialize, Deserialize)]
pub struct ApiKey {
// Owner of the key
pub name: String,
// The secret value of the key itself
pub key: String,
}
#[derive(Debug)]
pub enum ApiKeyError {
BadCount,
Missing,
Invalid
}
fn verify_api_key(key: &str, name: &str) -> request::Outcome<ApiKey, ApiKeyError> {
// yolo unwrap because i cba to deal w/ edge cases and shit
match DB::get_entry(name.to_string()).unwrap() {
Some(db_key) => {
if db_key == key {
Outcome::Success(
ApiKey { name: name.to_string(), key: key.to_string()}
)
} else{
Outcome::Failure((Status::Unauthorized, ApiKeyError::Invalid))
}
},
None => Outcome::Failure((Status::Unauthorized, ApiKeyError::Invalid))
}
}
impl<'a, 'r> FromRequest<'a, 'r> for ApiKey {
type Error = ApiKeyError;
fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
let key = request.headers().get_one("x-api-key");
let name = request.headers().get_one("x-api-name");
match (key, name) {
(Some(key), Some(name)) => verify_api_key(key, name),
_ => Outcome::Failure((Status::BadRequest, ApiKeyError::Missing))
}
}
}