46 lines
1.4 KiB
Rust
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())
|
|
}
|
|
}
|
|
} |