Replace deprecated axum Host extractor with Host header

This commit is contained in:
Lennart
2025-12-30 13:53:42 +01:00
parent ed7becffc2
commit a7893ddbda
5 changed files with 29 additions and 24 deletions

View File

@@ -9,9 +9,9 @@ use axum::{
extract::Path,
response::{Html, IntoResponse, Response},
};
use axum_extra::{TypedHeader, extract::Host};
use axum_extra::TypedHeader;
use chrono::{Duration, Utc};
use headers::UserAgent;
use headers::{Host, UserAgent};
use http::StatusCode;
use rustical_store::auth::{AuthenticationProvider, Principal};
use serde::{Deserialize, Serialize};
@@ -21,7 +21,7 @@ use tracing::instrument;
pub async fn post_nextcloud_login(
Extension(state): Extension<Arc<NextcloudFlows>>,
TypedHeader(user_agent): TypedHeader<UserAgent>,
Host(host): Host,
TypedHeader(host): TypedHeader<Host>,
) -> Json<NextcloudLoginResponse> {
let flow_id = uuid::Uuid::new_v4().to_string();
let token = uuid::Uuid::new_v4().to_string();
@@ -150,7 +150,7 @@ pub async fn post_nextcloud_flow(
user: Principal,
Extension(state): Extension<Arc<NextcloudFlows>>,
Path(flow_id): Path<String>,
Host(host): Host,
TypedHeader(host): TypedHeader<Host>,
Form(form): Form<NextcloudAuthorizeForm>,
) -> Result<Response, rustical_store::Error> {
if let Some(flow) = state.flows.write().await.get_mut(&flow_id) {

View File

@@ -7,8 +7,8 @@ use axum::{
extract::Path,
response::{IntoResponse, Redirect, Response},
};
use axum_extra::extract::Host;
use headers::{ContentType, HeaderMapExt};
use axum_extra::TypedHeader;
use headers::{ContentType, HeaderMapExt, Host};
use http::{HeaderValue, StatusCode, header};
use percent_encoding::{CONTROLS, utf8_percent_encode};
use rand::{Rng, distr::Alphanumeric};
@@ -50,7 +50,7 @@ pub async fn route_post_app_token<AP: AuthenticationProvider>(
user: Principal,
Extension(auth_provider): Extension<Arc<AP>>,
Path(user_id): Path<String>,
Host(hostname): Host,
TypedHeader(host): TypedHeader<Host>,
Form(PostAppTokenForm { apple, name }): Form<PostAppTokenForm>,
) -> Result<Response, rustical_store::Error> {
assert!(!name.is_empty());
@@ -66,10 +66,10 @@ pub async fn route_post_app_token<AP: AuthenticationProvider>(
if apple {
let profile = AppleConfig {
token_name: name,
account_description: format!("{}@{}", &user.id, &hostname),
hostname: hostname.clone(),
caldav_principal_url: format!("https://{hostname}/caldav-compat/principal/{user_id}"),
carddav_principal_url: format!("https://{hostname}/carddav/principal/{user_id}"),
account_description: format!("{}@{}", &user.id, &host),
hostname: host.to_string(),
caldav_principal_url: format!("https://{host}/caldav-compat/principal/{user_id}"),
carddav_principal_url: format!("https://{host}/carddav/principal/{user_id}"),
user: user.id.clone(),
token,
caldav_profile_uuid: Uuid::new_v4(),

View File

@@ -1,5 +1,3 @@
use std::sync::Arc;
use crate::{FrontendConfig, OidcConfig, pages::DefaultLayoutData};
use askama::Template;
use askama_web::WebTemplate;
@@ -8,10 +6,12 @@ use axum::{
extract::Query,
response::{IntoResponse, Redirect, Response},
};
use axum_extra::extract::Host;
use axum_extra::TypedHeader;
use headers::Host;
use http::StatusCode;
use rustical_store::auth::AuthenticationProvider;
use serde::Deserialize;
use std::sync::Arc;
use tower_sessions::Session;
use tracing::{instrument, warn};
use url::Url;
@@ -73,7 +73,7 @@ pub async fn route_post_login<AP: AuthenticationProvider>(
Extension(auth_provider): Extension<Arc<AP>>,
Extension(config): Extension<FrontendConfig>,
session: Session,
Host(host): Host,
TypedHeader(host): TypedHeader<Host>,
Form(PostLoginForm {
username,
password,

View File

@@ -1,5 +1,6 @@
use std::sync::Arc;
use crate::pages::user::{Section, UserPage};
use askama::Template;
use askama_web::WebTemplate;
use axum::{
@@ -7,13 +8,11 @@ use axum::{
extract::Path,
response::{IntoResponse, Redirect},
};
use axum_extra::{TypedHeader, extract::Host};
use headers::UserAgent;
use axum_extra::TypedHeader;
use headers::{Host, UserAgent};
use http::StatusCode;
use rustical_store::auth::{AppToken, AuthenticationProvider, Principal};
use crate::pages::user::{Section, UserPage};
impl Section for ProfileSection {
fn name() -> &'static str {
"profile"
@@ -33,7 +32,7 @@ pub async fn route_user_named<AP: AuthenticationProvider>(
Path(user_id): Path<String>,
Extension(auth_provider): Extension<Arc<AP>>,
TypedHeader(user_agent): TypedHeader<UserAgent>,
Host(host): Host,
TypedHeader(host): TypedHeader<Host>,
user: Principal,
) -> impl IntoResponse {
if user_id != user.id {
@@ -41,7 +40,10 @@ pub async fn route_user_named<AP: AuthenticationProvider>(
}
let is_apple = user_agent.as_str().contains("Apple") || user_agent.as_str().contains("Mac OS");
let davx5_hostname = user_agent.as_str().contains("Android").then_some(host);
let davx5_hostname = user_agent
.as_str()
.contains("Android")
.then_some(host.to_string());
UserPage {
section: ProfileSection {