proxmox-rest-server: pass owned RestEnvironment to get_index

This way we avoid pointers with lifetimes.
This commit is contained in:
Dietmar Maurer 2021-10-04 14:49:25 +02:00
parent 591a32ecd4
commit 2c09017045
3 changed files with 10 additions and 20 deletions

View File

@ -8,7 +8,7 @@ use lazy_static::lazy_static;
use proxmox::api::{api, router::SubdirMap, Router, RpcEnvironmentType, UserInformation};
use proxmox::list_subdirs_api_method;
use proxmox_rest_server::{ApiAuth, ApiConfig, AuthError, RestServer};
use proxmox_rest_server::{ApiAuth, ApiConfig, AuthError, RestServer, RestEnvironment};
// Create a Dummy User info and auth system
// Normally this would check and authenticate the user
struct DummyUserInfo;
@ -46,9 +46,7 @@ impl ApiAuth for DummyAuth {
// iow. what the user browses to
fn get_index<'a>(
_auth_id: Option<String>,
_language: Option<String>,
_api: &'a ApiConfig,
_env: RestEnvironment,
_parts: http::request::Parts,
) -> Pin<Box<dyn Future<Output = http::Response<hyper::Body>> + Send + 'a>> {
Box::pin(async move {

View File

@ -16,9 +16,9 @@ use serde::Serialize;
use proxmox::api::{ApiMethod, Router, RpcEnvironmentType, UserInformation};
use proxmox::tools::fs::{create_path, CreateOptions};
use crate::{ApiAuth, AuthError, FileLogger, FileLogOptions, CommandSocket};
use crate::{ApiAuth, AuthError, FileLogger, FileLogOptions, CommandSocket, RestEnvironment};
pub type GetIndexFn = &'static (dyn for<'a> Fn(Option<String>, Option<String>, &'a ApiConfig, Parts) -> Pin<Box<dyn Future<Output = Response<Body>> + Send + 'a>> + Send + Sync);
pub type GetIndexFn = &'static (dyn Fn(RestEnvironment, Parts) -> Pin<Box<dyn Future<Output = Response<Body>> + Send>> + Send + Sync);
/// REST server configuration
pub struct ApiConfig {
@ -72,11 +72,10 @@ impl ApiConfig {
pub(crate) async fn get_index(
&self,
auth_id: Option<String>,
language: Option<String>,
rest_env: RestEnvironment,
parts: Parts,
) -> Response<Body> {
(self.get_index_fn)(auth_id, language, self, parts).await
(self.get_index_fn)(rest_env, parts).await
}
pub(crate) async fn check_auth(

View File

@ -36,7 +36,7 @@ use pbs_tools::stream::AsyncReaderStream;
use crate::{
ApiConfig, FileLogger, AuthError, RestEnvironment, CompressionMethod,
extract_cookie, normalize_uri_path, formatter::*,
normalize_uri_path, formatter::*,
};
extern "C" {
@ -587,13 +587,6 @@ async fn handle_static_file_download(
}
}
fn extract_lang_header(headers: &http::HeaderMap) -> Option<String> {
if let Some(Ok(cookie)) = headers.get("COOKIE").map(|v| v.to_str()) {
return extract_cookie(cookie, "PBSLangCookie");
}
None
}
// FIXME: support handling multiple compression methods
fn extract_compression_method(headers: &http::HeaderMap) -> Option<CompressionMethod> {
if let Some(Ok(encodings)) = headers.get(header::ACCEPT_ENCODING).map(|v| v.to_str()) {
@ -727,17 +720,17 @@ async fn handle_request(
}
if comp_len == 0 {
let language = extract_lang_header(&parts.headers);
match api.check_auth(&parts.headers, &method).await {
Ok((auth_id, _user_info)) => {
return Ok(api.get_index(Some(auth_id), language, parts).await);
rpcenv.set_auth_id(Some(auth_id));
return Ok(api.get_index(rpcenv, parts).await);
}
Err(AuthError::Generic(_)) => {
tokio::time::sleep_until(Instant::from_std(delay_unauth_time)).await;
}
Err(AuthError::NoData) => {}
}
return Ok(api.get_index(None, language, parts).await);
return Ok(api.get_index(rpcenv, parts).await);
} else {
let filename = api.find_alias(&components);
let compression = extract_compression_method(&parts.headers);