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