auto-decrypt/src/api/guards.rs

46 lines
1.4 KiB
Rust

use clap::Error;
use rocket::form::Strict;
use rocket::request::{Outcome, Request, FromRequest};
use crate::app_config::CONFIG;
use crate::orm::DbConn;
use crate::api::State;
use rocket::http::uri::Query;
use crate::services::providers::Providers;
use super::HttpResult;
use super::helpers::{get_query_value, find_provider_by_name};
pub(super) struct APIProviderRequest<'r> {
pub share: &'r Providers,
pub name: &'r str,
}
#[rocket::async_trait]
impl<'r> FromRequest<'r> for APIProviderRequest<'r> {
type Error = HttpResult;
async fn from_request(req: &'r Request<'_>) -> Outcome<Self, Self::Error> {
let path = req.uri().path().segments();
let share_name: &str = path.get(path.len() - 1).unwrap_or(&"");
let access_key: &str = &get_query_value(&req.uri().query(), "access_key")
.unwrap_or_default();
if share_name.is_empty() {
return Outcome::Error(HttpResult::ShareNotFound("No share name provided.".to_string()).into());
}
if let Some(service) = find_provider_by_name(share_name)
.filter(|(_, service)| {service.access_key_hash == access_key})
{
Outcome::Success(APIProviderRequest { share: service.1, name: service.0 })
} else {
Outcome::Error(HttpResult::ShareNotFound(format!(
"Share '{}' not found or access_key invalide.",
share_name
)).into())
}
}
}