This way we avoid pointers with lifetimes.
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;
// 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 {
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 {
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(
use crate::{
ApiConfig, FileLogger, AuthError, RestEnvironment, CompressionMethod,
- extract_cookie, normalize_uri_path, formatter::*,
+ normalize_uri_path, formatter::*,
};
extern "C" {
}
}
-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()) {
}
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);
use proxmox::api::RpcEnvironmentType;
use pbs_client::DEFAULT_VSOCK_PORT;
-use proxmox_rest_server::{ApiConfig, RestServer};
+use proxmox_rest_server::{ApiConfig, RestServer, RestEnvironment};
mod proxmox_restore_daemon;
use proxmox_restore_daemon::*;
}
fn get_index<'a>(
- _auth_id: Option<String>,
- _language: Option<String>,
- _api: &'a ApiConfig,
+ _env: RestEnvironment,
_parts: Parts,
) -> Pin<Box<dyn Future<Output = http::Response<Body>> + Send + 'a>> {
Box::pin(async move {
use proxmox::api::RpcEnvironmentType;
use proxmox::tools::fs::CreateOptions;
-use proxmox_rest_server::{daemon, ApiConfig, RestServer};
+use proxmox_rest_server::{daemon, ApiConfig, RestServer, RestEnvironment};
use proxmox_backup::server::auth::default_api_auth;
use proxmox_backup::auth_helpers::*;
}
fn get_index<'a>(
- _auth_id: Option<String>,
- _language: Option<String>,
- _api: &'a ApiConfig,
+ _env: RestEnvironment,
_parts: Parts,
) -> Pin<Box<dyn Future<Output = Response<Body>> + Send + 'a>> {
Box::pin(async move {
use serde_json::{json, Value};
use proxmox::try_block;
-use proxmox::api::RpcEnvironmentType;
+use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
use proxmox::sys::linux::socket::set_tcp_keepalive;
use proxmox::tools::fs::CreateOptions;
use pbs_tools::task_log;
use pbs_datastore::DataStore;
-use proxmox_rest_server::{rotate_task_log_archive, ApiConfig, RestServer, WorkerTask};
+use proxmox_rest_server::{
+ rotate_task_log_archive, extract_cookie , ApiConfig, RestServer, RestEnvironment, WorkerTask,
+};
use proxmox_backup::{
server::{
pbs_runtime::main(run())
}
+
+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
+}
+
fn get_index<'a>(
- auth_id: Option<String>,
- language: Option<String>,
- api: &'a ApiConfig,
+ env: RestEnvironment,
parts: Parts,
) -> Pin<Box<dyn Future<Output = Response<Body>> + Send + 'a>> {
- Box::pin(get_index_future(auth_id, language, api, parts))
+ Box::pin(get_index_future(env, parts))
}
async fn get_index_future(
- auth_id: Option<String>,
- language: Option<String>,
- api: &ApiConfig,
+ env: RestEnvironment,
parts: Parts,
) -> Response<Body> {
- // fixme: make all IO async
+ let auth_id = env.get_auth_id();
+ let api = env.api_config();
+ let language = extract_lang_header(&parts.headers);
+
+ // fixme: make all IO async
let (userid, csrf_token) = match auth_id {
Some(auth_id) => {