From ad9cb0e057eba311ef9f34dd2ff084afa62ccc38 Mon Sep 17 00:00:00 2001 From: Jacob Taylor Date: Sun, 12 Jul 2026 16:58:35 -0700 Subject: [PATCH] Feat: Merge nex/feat/global-ip-span --- src/api/client/account/mod.rs | 10 ++----- src/api/client/account/register.rs | 4 +-- src/api/client/dehydrated_device.rs | 13 +++----- src/api/client/device.rs | 4 +-- src/api/client/directory.rs | 10 ++----- src/api/client/media.rs | 36 ---------------------- src/api/client/media_legacy.rs | 25 ++++------------ src/api/client/membership/invite.rs | 14 ++------- src/api/client/membership/join.rs | 30 +++++-------------- src/api/client/membership/knock.rs | 15 ++-------- src/api/client/membership/mod.rs | 7 ++--- src/api/client/message.rs | 2 +- src/api/client/read_marker.rs | 2 +- src/api/client/redact.rs | 2 +- src/api/client/report.rs | 10 ++----- src/api/client/room/summary.rs | 4 +-- src/api/client/send.rs | 2 +- src/api/client/session.rs | 16 ++++------ src/api/client/state.rs | 4 +-- src/api/client/sync/v3/mod.rs | 2 +- src/api/client/sync/v5.rs | 2 +- src/api/client/typing.rs | 2 +- src/api/server/invite.rs | 4 +-- src/api/server/media.rs | 17 ++--------- src/api/server/publicrooms.rs | 7 ++--- src/api/server/send.rs | 46 ++++++++--------------------- src/router/layers.rs | 30 ++++++++++++++----- 27 files changed, 93 insertions(+), 227 deletions(-) diff --git a/src/api/client/account/mod.rs b/src/api/client/account/mod.rs index 62248a7ca..be7d46bfa 100644 --- a/src/api/client/account/mod.rs +++ b/src/api/client/account/mod.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, err, info, pdu::PartialPdu, @@ -43,10 +42,9 @@ /// /// Note: This will not reserve the username, so the username might become /// invalid when trying to register -#[tracing::instrument(skip_all, fields(%client), name = "register_available", level = "info")] +#[tracing::instrument(skip_all, name = "register_available", level = "info")] pub(crate) async fn get_register_available_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let _ = services @@ -80,10 +78,9 @@ pub(crate) async fn get_register_available_route( /// last seen ts) /// - Forgets to-device events /// - Triggers device list updates -#[tracing::instrument(skip_all, fields(%client), name = "change_password", level = "info")] +#[tracing::instrument(skip_all, name = "change_password", level = "info")] pub(crate) async fn change_password_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let identity = if let Some(identity) = body.identity.as_ref() { @@ -248,10 +245,9 @@ pub(crate) async fn whoami_route( /// - Forgets all to-device events /// - Triggers device list updates /// - Removes ability to log in again -#[tracing::instrument(skip_all, fields(%client), name = "deactivate", level = "info")] +#[tracing::instrument(skip_all, name = "deactivate", level = "info")] pub(crate) async fn deactivate_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { // Authentication for this endpoint is technically optional, diff --git a/src/api/client/account/register.rs b/src/api/client/account/register.rs index 39a02e666..ee9014adb 100644 --- a/src/api/client/account/register.rs +++ b/src/api/client/account/register.rs @@ -36,10 +36,10 @@ /// /_matrix/client/v3/register/available`](fn.get_register_available_route. /// html) to check if the user id is valid and available. #[allow(clippy::doc_markdown)] -#[tracing::instrument(skip_all, fields(%client), name = "register", level = "info")] +#[tracing::instrument(skip_all, name = "register", level = "info")] pub(crate) async fn register_route( State(services): State, - ClientIp(client): ClientIp, + ClientIp(client): ClientIp, // NOTE: Required for metadata. body: Ruma, ) -> Result { if body.kind != RegistrationKind::User { diff --git a/src/api/client/dehydrated_device.rs b/src/api/client/dehydrated_device.rs index 6f0698999..72ae2b955 100644 --- a/src/api/client/dehydrated_device.rs +++ b/src/api/client/dehydrated_device.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{Err, Result, at}; use futures::StreamExt; use ruma::{ @@ -19,10 +18,9 @@ /// # `PUT /_matrix/client/../dehydrated_device` /// /// Creates or overwrites the user's dehydrated device. -#[tracing::instrument(skip_all, fields(%client))] +#[tracing::instrument(skip_all)] pub(crate) async fn put_dehydrated_device_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let device_id = body.device_id.clone(); @@ -38,10 +36,9 @@ pub(crate) async fn put_dehydrated_device_route( /// # `DELETE /_matrix/client/../dehydrated_device` /// /// Deletes the user's dehydrated device without replacement. -#[tracing::instrument(skip_all, fields(%client))] +#[tracing::instrument(skip_all)] pub(crate) async fn delete_dehydrated_device_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -56,10 +53,9 @@ pub(crate) async fn delete_dehydrated_device_route( /// # `GET /_matrix/client/../dehydrated_device` /// /// Gets the user's dehydrated device -#[tracing::instrument(skip_all, fields(%client))] +#[tracing::instrument(skip_all)] pub(crate) async fn get_dehydrated_device_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -72,10 +68,9 @@ pub(crate) async fn get_dehydrated_device_route( /// # `GET /_matrix/client/../dehydrated_device/{device_id}/events` /// /// Paginates the events of the dehydrated device. -#[tracing::instrument(skip_all, fields(%client))] +#[tracing::instrument(skip_all)] pub(crate) async fn get_dehydrated_events_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/device.rs b/src/api/client/device.rs index f81934900..1345b46a6 100644 --- a/src/api/client/device.rs +++ b/src/api/client/device.rs @@ -46,10 +46,10 @@ pub(crate) async fn get_device_route( /// # `PUT /_matrix/client/r0/devices/{deviceId}` /// /// Updates the metadata on a given device of the sender user. -#[tracing::instrument(skip_all, fields(%client), name = "update_device", level = "debug")] +#[tracing::instrument(skip_all, name = "update_device", level = "debug")] pub(crate) async fn update_device_route( State(services): State, - ClientIp(client): ClientIp, + ClientIp(client): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/directory.rs b/src/api/client/directory.rs index 6b209b4eb..a4d137202 100644 --- a/src/api/client/directory.rs +++ b/src/api/client/directory.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, err, info, utils::{ @@ -35,10 +34,9 @@ /// Lists the public rooms on this server. /// /// - Rooms are ordered by the number of joined members -#[tracing::instrument(skip_all, fields(%client), name = "publicrooms", level = "info")] +#[tracing::instrument(skip_all, name = "publicrooms", level = "info")] pub(crate) async fn get_public_rooms_filtered_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if let Some(server) = &body.server { @@ -71,10 +69,9 @@ pub(crate) async fn get_public_rooms_filtered_route( /// Lists the public rooms on this server. /// /// - Rooms are ordered by the number of joined members -#[tracing::instrument(skip_all, fields(%client), name = "publicrooms", level = "info")] +#[tracing::instrument(skip_all, name = "publicrooms", level = "info")] pub(crate) async fn get_public_rooms_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if let Some(server) = &body.server { @@ -106,10 +103,9 @@ pub(crate) async fn get_public_rooms_route( /// # `PUT /_matrix/client/r0/directory/list/room/{roomId}` /// /// Sets the visibility of a given room in the room directory. -#[tracing::instrument(skip_all, fields(%client), name = "room_directory", level = "info")] +#[tracing::instrument(skip_all, name = "room_directory", level = "info")] pub(crate) async fn set_room_visibility_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/media.rs b/src/api/client/media.rs index 05b63358d..824d98541 100644 --- a/src/api/client/media.rs +++ b/src/api/client/media.rs @@ -1,7 +1,6 @@ use std::time::Duration; use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, err, utils::{self, content_disposition::make_content_disposition, math::ruma_from_usize}, @@ -42,15 +41,8 @@ pub(crate) async fn get_media_config_route( /// /// - Some metadata will be saved in the database /// - Media will be saved in the media/ directory -#[tracing::instrument( - name = "media_upload", - level = "debug", - skip_all, - fields(%client), -)] pub(crate) async fn create_content_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let user = body.identity.expect_sender_user()?; @@ -81,15 +73,8 @@ pub(crate) async fn create_content_route( /// # `GET /_matrix/client/v1/media/thumbnail/{serverName}/{mediaId}` /// /// Load media thumbnail from our server or over federation. -#[tracing::instrument( - name = "media_thumbnail_get", - level = "debug", - skip_all, - fields(%client), -)] pub(crate) async fn get_content_thumbnail_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let user = body.identity.expect_sender_user()?; @@ -131,15 +116,8 @@ pub(crate) async fn get_content_thumbnail_route( /// # `GET /_matrix/client/v1/media/download/{serverName}/{mediaId}` /// /// Load media from our server or over federation. -#[tracing::instrument( - name = "media_get", - level = "debug", - skip_all, - fields(%client), -)] pub(crate) async fn get_content_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let user = body.identity.expect_sender_user()?; @@ -178,15 +156,8 @@ pub(crate) async fn get_content_route( /// # `GET /_matrix/client/v1/media/download/{serverName}/{mediaId}/{fileName}` /// /// Load media from our server or over federation as fileName. -#[tracing::instrument( - name = "media_get_af", - level = "debug", - skip_all, - fields(%client), -)] pub(crate) async fn get_content_as_filename_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let user = body.identity.expect_sender_user()?; @@ -229,15 +200,8 @@ pub(crate) async fn get_content_as_filename_route( /// # `GET /_matrix/client/v1/media/preview_url` /// /// Returns URL preview. -#[tracing::instrument( - name = "url_preview", - level = "debug", - skip_all, - fields(%client), -)] pub(crate) async fn get_media_preview_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/media_legacy.rs b/src/api/client/media_legacy.rs index f6ceb3a54..ddc7e9c92 100644 --- a/src/api/client/media_legacy.rs +++ b/src/api/client/media_legacy.rs @@ -1,7 +1,6 @@ #![allow(deprecated)] use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, err, utils::{content_disposition::make_content_disposition, math::ruma_from_usize}, @@ -50,10 +49,8 @@ pub(crate) async fn get_media_config_legacy_legacy_route( /// # `GET /_matrix/media/v3/preview_url` /// /// Returns URL preview. -#[tracing::instrument(skip_all, fields(%client), name = "url_preview_legacy", level = "debug")] pub(crate) async fn get_media_preview_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -95,10 +92,9 @@ pub(crate) async fn get_media_preview_legacy_route( /// Returns URL preview. pub(crate) async fn get_media_preview_legacy_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result> { - get_media_preview_legacy_route(State(services), ClientIp(client), body) + get_media_preview_legacy_route(State(services), body) .await .map(RumaResponse) } @@ -115,10 +111,9 @@ pub(crate) async fn get_media_preview_legacy_legacy_route( /// - Media will be saved in the media/ directory pub(crate) async fn create_content_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result> { - create_content_route(State(services), ClientIp(client), body) + create_content_route(State(services), body) .await .map(RumaResponse) } @@ -131,10 +126,8 @@ pub(crate) async fn create_content_legacy_route( /// - Only redirects if `allow_redirect` is true /// - Uses client-provided `timeout_ms` if available, else defaults to 20 /// seconds -#[tracing::instrument(skip_all, fields(%client), name = "media_get_legacy", level = "debug")] pub(crate) async fn get_content_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let mxc = Mxc { @@ -209,13 +202,11 @@ pub(crate) async fn get_content_legacy_route( /// - Only redirects if `allow_redirect` is true /// - Uses client-provided `timeout_ms` if available, else defaults to 20 /// seconds -#[tracing::instrument(skip_all, fields(%client), name = "media_get_legacy", level = "debug")] pub(crate) async fn get_content_legacy_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result> { - get_content_legacy_route(State(services), ClientIp(client), body) + get_content_legacy_route(State(services), body) .await .map(RumaResponse) } @@ -228,10 +219,8 @@ pub(crate) async fn get_content_legacy_legacy_route( /// - Only redirects if `allow_redirect` is true /// - Uses client-provided `timeout_ms` if available, else defaults to 20 /// seconds -#[tracing::instrument(skip_all, fields(%client), name = "media_get_legacy", level = "debug")] pub(crate) async fn get_content_as_filename_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let mxc = Mxc { @@ -307,10 +296,9 @@ pub(crate) async fn get_content_as_filename_legacy_route( /// seconds pub(crate) async fn get_content_as_filename_legacy_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result> { - get_content_as_filename_legacy_route(State(services), ClientIp(client), body) + get_content_as_filename_legacy_route(State(services), body) .await .map(RumaResponse) } @@ -323,10 +311,8 @@ pub(crate) async fn get_content_as_filename_legacy_legacy_route( /// - Only redirects if `allow_redirect` is true /// - Uses client-provided `timeout_ms` if available, else defaults to 20 /// seconds -#[tracing::instrument(skip_all, fields(%client), name = "media_thumbnail_get_legacy", level = "debug")] pub(crate) async fn get_content_thumbnail_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let mxc = Mxc { @@ -404,10 +390,9 @@ pub(crate) async fn get_content_thumbnail_legacy_route( /// seconds pub(crate) async fn get_content_thumbnail_legacy_legacy_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result> { - get_content_thumbnail_legacy_route(State(services), ClientIp(client), body) + get_content_thumbnail_legacy_route(State(services), body) .await .map(RumaResponse) } diff --git a/src/api/client/membership/invite.rs b/src/api/client/membership/invite.rs index ac233675d..cf88de8f9 100644 --- a/src/api/client/membership/invite.rs +++ b/src/api/client/membership/invite.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, debug_error, err, info, matrix::{event::gen_event_id_canonical_json, pdu::PartialPdu}, @@ -23,10 +22,9 @@ /// # `POST /_matrix/client/r0/rooms/{roomId}/invite` /// /// Tries to send an invite event into the room. -#[tracing::instrument(skip_all, fields(%client), name = "invite", level = "info")] +#[tracing::instrument(skip_all, name = "invite", level = "info")] pub(crate) async fn invite_user_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -42,14 +40,8 @@ pub(crate) async fn invite_user_route( return Err!(Request(Forbidden("Invites are not allowed on this server."))); } - banned_room_check( - &services, - sender_user, - Some(&body.room_id), - body.room_id.server_name(), - client, - ) - .await?; + banned_room_check(&services, sender_user, Some(&body.room_id), body.room_id.server_name()) + .await?; match &body.recipient { | invite_user::v3::InvitationRecipient::UserId(InviteUserId { diff --git a/src/api/client/membership/join.rs b/src/api/client/membership/join.rs index ba7f0eaa0..037941e79 100644 --- a/src/api/client/membership/join.rs +++ b/src/api/client/membership/join.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, debug, result::FlatOk, @@ -22,10 +21,9 @@ /// rules locally /// - If the server does not know about the room: asks other servers over /// federation -#[tracing::instrument(skip_all, fields(%client), name = "join", level = "info")] +#[tracing::instrument(skip_all, name = "join", level = "info")] pub(crate) async fn join_room_by_id_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -33,14 +31,8 @@ pub(crate) async fn join_room_by_id_route( return Err!(Request(UserSuspended("You cannot perform this action while suspended."))); } - banned_room_check( - &services, - sender_user, - Some(&body.room_id), - body.room_id.server_name(), - client, - ) - .await?; + banned_room_check(&services, sender_user, Some(&body.room_id), body.room_id.server_name()) + .await?; // There is no body.server_name for /roomId/join let mut servers: Vec<_> = services @@ -91,10 +83,9 @@ pub(crate) async fn join_room_by_id_route( /// - If the server does not know about the room: use the server name query /// param if specified. if not specified, asks other servers over federation /// via room alias server name and room ID server name -#[tracing::instrument(skip_all, fields(%client), name = "join", level = "info")] +#[tracing::instrument(skip_all, name = "join", level = "info")] pub(crate) async fn join_room_by_id_or_alias_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -105,15 +96,9 @@ pub(crate) async fn join_room_by_id_or_alias_route( let (servers, room_id) = match OwnedRoomId::try_from(body.room_id_or_alias.clone()) { | Ok(room_id) => { - banned_room_check( - &services, - sender_user, - Some(&room_id), - room_id.server_name(), - client, - ) - .boxed() - .await?; + banned_room_check(&services, sender_user, Some(&room_id), room_id.server_name()) + .boxed() + .await?; let mut servers = body.via.clone(); if servers.is_empty() { @@ -159,7 +144,6 @@ pub(crate) async fn join_room_by_id_or_alias_route( sender_user, Some(&room_id), Some(room_alias.server_name()), - client, ) .await?; diff --git a/src/api/client/membership/knock.rs b/src/api/client/membership/knock.rs index 988767046..583fc6e94 100644 --- a/src/api/client/membership/knock.rs +++ b/src/api/client/membership/knock.rs @@ -1,7 +1,6 @@ use std::{borrow::Borrow, collections::HashMap, iter::once, sync::Arc}; use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Result, debug, debug_info, debug_warn, err, info, matrix::{ @@ -45,10 +44,9 @@ /// # `POST /_matrix/client/*/knock/{roomIdOrAlias}` /// /// Tries to knock the room to ask permission to join for the sender user. -#[tracing::instrument(skip_all, fields(%client), name = "knock", level = "info")] +#[tracing::instrument(skip_all, name = "knock", level = "info")] pub(crate) async fn knock_room_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -59,14 +57,8 @@ pub(crate) async fn knock_room_route( let (servers, room_id) = match OwnedRoomId::try_from(body.room_id_or_alias.clone()) { | Ok(room_id) => { - banned_room_check( - &services, - sender_user, - Some(&room_id), - room_id.server_name(), - client, - ) - .await?; + banned_room_check(&services, sender_user, Some(&room_id), room_id.server_name()) + .await?; let mut servers = body.via.clone(); servers.extend( @@ -109,7 +101,6 @@ pub(crate) async fn knock_room_route( sender_user, Some(&room_id), Some(room_alias.server_name()), - client, ) .await?; diff --git a/src/api/client/membership/mod.rs b/src/api/client/membership/mod.rs index 0b2ee55b3..06847ea7b 100644 --- a/src/api/client/membership/mod.rs +++ b/src/api/client/membership/mod.rs @@ -8,8 +8,6 @@ mod members; mod unban; -use std::net::IpAddr; - use axum::extract::State; use conduwuit::{Err, Result, warn}; use futures::{FutureExt, StreamExt}; @@ -58,7 +56,6 @@ pub(crate) async fn banned_room_check( user_id: &UserId, room_id: Option<&RoomId>, server_name: Option<&ServerName>, - client_ip: IpAddr, ) -> Result { if services.users.is_admin(user_id).await { return Ok(()); @@ -85,7 +82,7 @@ pub(crate) async fn banned_room_check( .admin .send_text(&format!( "Automatically deactivating user {user_id} due to attempted banned \ - room join from IP {client_ip}" + room join" )) .await; } @@ -121,7 +118,7 @@ pub(crate) async fn banned_room_check( .admin .send_text(&format!( "Automatically deactivating user {user_id} due to attempted banned \ - room join from IP {client_ip}" + room join" )) .await; } diff --git a/src/api/client/message.rs b/src/api/client/message.rs index 2c3ccc782..89d84e5ca 100644 --- a/src/api/client/message.rs +++ b/src/api/client/message.rs @@ -72,7 +72,7 @@ /// where the user was joined, depending on `history_visibility`) pub(crate) async fn get_message_events_route( State(services): State, - ClientIp(client_ip): ClientIp, + ClientIp(client_ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/read_marker.rs b/src/api/client/read_marker.rs index a476f6790..f3f1898f9 100644 --- a/src/api/client/read_marker.rs +++ b/src/api/client/read_marker.rs @@ -117,7 +117,7 @@ pub(crate) async fn set_read_marker_route( /// Sets private read marker and public read receipt EDU. pub(crate) async fn create_receipt_route( State(services): State, - ClientIp(client_ip): ClientIp, + ClientIp(client_ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/redact.rs b/src/api/client/redact.rs index 377b14f4c..01787ffd3 100644 --- a/src/api/client/redact.rs +++ b/src/api/client/redact.rs @@ -14,7 +14,7 @@ /// - TODO: Handle txn id pub(crate) async fn redact_event_route( State(services): State, - ClientIp(client_ip): ClientIp, + ClientIp(client_ip): ClientIp, // NOTE: required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/report.rs b/src/api/client/report.rs index a7acd9790..a0d1bea26 100644 --- a/src/api/client/report.rs +++ b/src/api/client/report.rs @@ -1,7 +1,6 @@ use std::{fmt::Write as _, time::Duration}; use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{Err, Event, Result, debug_info, info, matrix::pdu::PduEvent, utils::ReadyExt}; use conduwuit_service::Services; use ruma::{ @@ -30,10 +29,9 @@ struct Report { /// # `POST /_matrix/client/v3/rooms/{roomId}/report` /// /// Reports an abusive room to homeserver admins -#[tracing::instrument(skip_all, fields(%client), name = "report_room", level = "info")] +#[tracing::instrument(skip_all, name = "report_room", level = "info")] pub(crate) async fn report_room_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -85,10 +83,9 @@ pub(crate) async fn report_room_route( /// # `POST /_matrix/client/v3/rooms/{roomId}/report/{eventId}` /// /// Reports an inappropriate event to homeserver admins -#[tracing::instrument(skip_all, fields(%client), name = "report_event", level = "info")] +#[tracing::instrument(skip_all, name = "report_event", level = "info")] pub(crate) async fn report_event_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { // user authentication @@ -129,10 +126,9 @@ pub(crate) async fn report_event_route( Ok(report_content::v3::Response::new()) } -#[tracing::instrument(skip_all, fields(%client), name = "report_user", level = "info")] +#[tracing::instrument(skip_all, name = "report_user", level = "info")] pub(crate) async fn report_user_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/room/summary.rs b/src/api/client/room/summary.rs index 80c2e2f70..da6958242 100644 --- a/src/api/client/room/summary.rs +++ b/src/api/client/room/summary.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{Err, Result}; use ruma::api::client::room::get_summary; use service::rooms::summary::Accessibility; @@ -9,10 +8,9 @@ /// # `GET /_matrix/client/v1/room_summary/{roomIdOrAlias}` /// /// Returns a short description of the state of a room. -#[tracing::instrument(skip_all, fields(%client), name = "room_summary", level = "info")] +#[tracing::instrument(skip_all, name = "room_summary", level = "info")] pub(crate) async fn get_room_summary( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let (room_id, servers) = services diff --git a/src/api/client/send.rs b/src/api/client/send.rs index 7a34c496d..775042b37 100644 --- a/src/api/client/send.rs +++ b/src/api/client/send.rs @@ -19,7 +19,7 @@ /// allowed pub(crate) async fn send_message_event_route( State(services): State, - ClientIp(client_ip): ClientIp, + ClientIp(client_ip): ClientIp, // NOTE: required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/session.rs b/src/api/client/session.rs index a7e86b6ac..067591f54 100644 --- a/src/api/client/session.rs +++ b/src/api/client/session.rs @@ -38,10 +38,9 @@ /// /// Get the supported login types of this server. One of these should be used as /// the `type` field when logging in. -#[tracing::instrument(skip_all, fields(%client), name = "login", level = "info")] +#[tracing::instrument(skip_all, name = "login", level = "info")] pub(crate) async fn get_login_types_route( State(services): State, - ClientIp(client): ClientIp, _body: Ruma, ) -> Result { if !services.config.oauth.compatibility_mode().uiaa_available() { @@ -115,10 +114,10 @@ pub async fn handle_login( /// Note: You can use [`GET /// /_matrix/client/r0/login`](fn.get_supported_versions_route.html) to see /// supported login types. -#[tracing::instrument(skip_all, fields(%client), name = "login", level = "info")] +#[tracing::instrument(skip_all, name = "login", level = "info")] pub(crate) async fn login_route( State(services): State, - ClientIp(client): ClientIp, + ClientIp(client): ClientIp, // NOTE: Required for device metadata body: Ruma, ) -> Result { if !services.config.oauth.compatibility_mode().uiaa_available() { @@ -255,10 +254,9 @@ pub(crate) async fn login_route( /// to log in with the m.login.token flow. /// /// -#[tracing::instrument(skip_all, fields(%client), name = "login_token", level = "info")] +#[tracing::instrument(skip_all, name = "login_token", level = "info")] pub(crate) async fn login_token_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if !services.config.login_via_existing_session { @@ -291,10 +289,9 @@ pub(crate) async fn login_token_route( /// last seen ts) /// - Forgets to-device events /// - Triggers device list updates -#[tracing::instrument(skip_all, fields(%client), name = "logout", level = "info")] +#[tracing::instrument(skip_all, name = "logout", level = "info")] pub(crate) async fn logout_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -339,10 +336,9 @@ pub(crate) async fn logout_route( /// Note: This is equivalent to calling [`GET /// /_matrix/client/r0/logout`](fn.logout_route.html) from each device of this /// user. -#[tracing::instrument(skip_all, fields(%client), name = "logout", level = "info")] +#[tracing::instrument(skip_all, name = "logout", level = "info")] pub(crate) async fn logout_all_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/state.rs b/src/api/client/state.rs index 1067501d3..c0f9d02a2 100644 --- a/src/api/client/state.rs +++ b/src/api/client/state.rs @@ -35,7 +35,7 @@ /// Sends a state event into the room. pub(crate) async fn send_state_event_for_key_route( State(services): State, - ClientIp(ip): ClientIp, + ClientIp(ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; @@ -72,7 +72,7 @@ pub(crate) async fn send_state_event_for_key_route( /// Sends a state event into the room. pub(crate) async fn send_state_event_for_empty_key_route( State(services): State, - ClientIp(ip): ClientIp, + ClientIp(ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result> { send_state_event_for_key_route(State(services), ClientIp(ip), body) diff --git a/src/api/client/sync/v3/mod.rs b/src/api/client/sync/v3/mod.rs index 90b8ca83b..51f76623f 100644 --- a/src/api/client/sync/v3/mod.rs +++ b/src/api/client/sync/v3/mod.rs @@ -181,7 +181,7 @@ fn lazy_loading_enabled(&self) -> bool { )] pub(crate) async fn sync_events_route( State(services): State, - ClientIp(client_ip): ClientIp, + ClientIp(client_ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/sync/v5.rs b/src/api/client/sync/v5.rs index 3602cc45b..13767a037 100644 --- a/src/api/client/sync/v5.rs +++ b/src/api/client/sync/v5.rs @@ -67,7 +67,7 @@ /// [MSC4186]: https://github.com/matrix-org/matrix-spec-proposals/pull/4186 pub(crate) async fn sync_events_v5_route( State(ref services): State, - ClientIp(client_ip): ClientIp, + ClientIp(client_ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; diff --git a/src/api/client/typing.rs b/src/api/client/typing.rs index 4cc0dc6a0..6e8c9aa37 100644 --- a/src/api/client/typing.rs +++ b/src/api/client/typing.rs @@ -10,7 +10,7 @@ /// Sets the typing state of the sender user. pub(crate) async fn create_typing_event_route( State(services): State, - ClientIp(ip): ClientIp, + ClientIp(ip): ClientIp, // NOTE: Required for updating device metadata body: Ruma, ) -> Result { use create_typing_event::v3::Typing; diff --git a/src/api/server/invite.rs b/src/api/server/invite.rs index 392bfa7a9..8ad765b27 100644 --- a/src/api/server/invite.rs +++ b/src/api/server/invite.rs @@ -1,7 +1,6 @@ use std::collections::{HashMap, hash_map::Entry}; use axum::extract::State; -use axum_client_ip::ClientIp; use base64::{Engine as _, engine::general_purpose}; use conduwuit::{ Err, Error, EventTypeExt, PduEvent, Result, debug, err, error, @@ -28,10 +27,9 @@ /// # `PUT /_matrix/federation/v2/invite/{roomId}/{eventId}` /// /// Invites a remote user to a room. -#[tracing::instrument(skip_all, fields(%client), name = "invite", level = "info")] +#[tracing::instrument(skip_all, name = "invite", level = "info")] pub(crate) async fn create_invite_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if !services.server.supported_room_version(&body.room_version) { diff --git a/src/api/server/media.rs b/src/api/server/media.rs index 56f791889..98b3ae7ed 100644 --- a/src/api/server/media.rs +++ b/src/api/server/media.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{Err, Result, utils::content_disposition::make_content_disposition}; use conduwuit_service::media::{Dim, FileMeta}; use ruma::api::federation::authenticated_media::{ @@ -12,15 +11,9 @@ /// # `GET /_matrix/federation/v1/media/download/{mediaId}` /// /// Load media from our server. -#[tracing::instrument( - name = "media_get", - level = "debug", - skip_all, - fields(%client) -)] +#[tracing::instrument(name = "media_get", level = "debug", skip_all)] pub(crate) async fn get_content_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let mxc = Mxc { @@ -54,15 +47,9 @@ pub(crate) async fn get_content_route( /// # `GET /_matrix/federation/v1/media/thumbnail/{mediaId}` /// /// Load media thumbnail from our server. -#[tracing::instrument( - name = "media_thumbnail_get", - level = "debug", - skip_all, - fields(%client) -)] +#[tracing::instrument(name = "media_thumbnail_get", level = "debug", skip_all)] pub(crate) async fn get_content_thumbnail_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { let dim = Dim::from_ruma(body.width, body.height, body.method.clone())?; diff --git a/src/api/server/publicrooms.rs b/src/api/server/publicrooms.rs index 9cf691603..42baf081f 100644 --- a/src/api/server/publicrooms.rs +++ b/src/api/server/publicrooms.rs @@ -1,5 +1,4 @@ use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{Err, Result, err}; use ruma::{ api::federation::directory::{get_public_rooms, get_public_rooms_filtered}, @@ -12,10 +11,9 @@ /// # `POST /_matrix/federation/v1/publicRooms` /// /// Lists the public rooms on this server. -#[tracing::instrument(name = "publicrooms", level = "debug", skip_all, fields(%client))] +#[tracing::instrument(name = "publicrooms", level = "debug", skip_all)] pub(crate) async fn get_public_rooms_filtered_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if !services @@ -48,10 +46,9 @@ pub(crate) async fn get_public_rooms_filtered_route( /// # `GET /_matrix/federation/v1/publicRooms` /// /// Lists the public rooms on this server. -#[tracing::instrument(name = "publicrooms", level = "debug", skip_all, fields(%client))] +#[tracing::instrument(name = "publicrooms", level = "debug", skip_all)] pub(crate) async fn get_public_rooms_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if !services diff --git a/src/api/server/send.rs b/src/api/server/send.rs index bc1dbf32a..3599c105b 100644 --- a/src/api/server/send.rs +++ b/src/api/server/send.rs @@ -1,11 +1,9 @@ use std::{ collections::{BTreeMap, HashMap}, - net::IpAddr, time::{Duration, Instant}, }; use axum::extract::State; -use axum_client_ip::ClientIp; use conduwuit::{ Err, Error, Result, debug, debug_error, debug_warn, err, error, result::LogErr, @@ -57,7 +55,6 @@ /// Push EDUs and PDUs to this server. pub(crate) async fn send_transaction_message_route( State(services): State, - ClientIp(client): ClientIp, body: Ruma, ) -> Result { if body.identity != body.body.origin { @@ -98,7 +95,7 @@ pub(crate) async fn send_transaction_message_route( services .server .runtime() - .spawn(process_inbound_transaction(services, body, client, txn_key, sender)); + .spawn(process_inbound_transaction(services, body, txn_key, sender)); // and wait for it wait_for_result(receiver).await }, @@ -141,7 +138,6 @@ async fn wait_for_result( async fn process_inbound_transaction( services: crate::State, body: Ruma, - client: IpAddr, txn_key: TxnKey, sender: Sender, ) { @@ -163,7 +159,7 @@ async fn process_inbound_transaction( .stream(); debug!(pdus = body.pdus.len(), edus = body.edus.len(), "Processing transaction",); - let results = match handle(&services, &client, &body.identity, pdus, edus).await { + let results = match handle(&services, &body.identity, pdus, edus).await { | Ok(results) => results, | Err(err) => { fail_federation_txn(services, &txn_key, &sender, err); @@ -236,7 +232,6 @@ fn transaction_error_to_response(err: &TransactionError) -> Error { } async fn handle( services: &Services, - client: &IpAddr, origin: &ServerName, pdus: impl Stream + Send, edus: impl Stream + Send, @@ -257,7 +252,7 @@ async fn handle( .into_iter() .try_stream() .broad_and_then(|(room_id, pdus): (_, Vec<_>)| { - handle_room(services, client, origin, room_id, pdus.into_iter()) + handle_room(services, origin, room_id, pdus.into_iter()) .map_ok(Vec::into_iter) .map_ok(IterStream::try_stream) }) @@ -267,7 +262,7 @@ async fn handle( .await?; // Evaluate EDUs after PDUs in case some of the PDUs then forbid some EDUs. - edus.for_each_concurrent(automatic_width(), |edu| handle_edu(services, client, origin, edu)) + edus.for_each_concurrent(automatic_width(), |edu| handle_edu(services, origin, edu)) .boxed() .await; @@ -276,7 +271,6 @@ async fn handle( async fn handle_room( services: &Services, - _client: &IpAddr, origin: &ServerName, room_id: OwnedRoomId, pdus: impl Iterator + Send, @@ -323,25 +317,25 @@ async fn handle_room( Ok(results) } -async fn handle_edu(services: &Services, client: &IpAddr, origin: &ServerName, edu: Edu) { +async fn handle_edu(services: &Services, origin: &ServerName, edu: Edu) { match edu { | Edu::Presence(presence) if services.server.config.allow_incoming_presence => - handle_edu_presence(services, client, origin, presence).await, + handle_edu_presence(services, origin, presence).await, | Edu::Receipt(receipt) if services.server.config.allow_incoming_read_receipts => - handle_edu_receipt(services, client, origin, receipt).await, + handle_edu_receipt(services, origin, receipt).await, | Edu::Typing(typing) if services.server.config.allow_incoming_typing => - handle_edu_typing(services, client, origin, typing).await, + handle_edu_typing(services, origin, typing).await, | Edu::DeviceListUpdate(content) => - handle_edu_device_list_update(services, client, origin, content).await, + handle_edu_device_list_update(services, origin, content).await, | Edu::DirectToDevice(content) => - handle_edu_direct_to_device(services, client, origin, content).await, + handle_edu_direct_to_device(services, origin, content).await, | Edu::SigningKeyUpdate(content) => - handle_edu_signing_key_update(services, client, origin, content).await, + handle_edu_signing_key_update(services, origin, content).await, | Edu::_Custom(ref _custom) => debug_warn!(?edu, "received custom/unknown EDU"), @@ -351,7 +345,6 @@ async fn handle_edu(services: &Services, client: &IpAddr, origin: &ServerName, e async fn handle_edu_presence( services: &Services, - _client: &IpAddr, origin: &ServerName, presence: PresenceContent, ) { @@ -392,12 +385,7 @@ async fn handle_edu_presence_update( .ok(); } -async fn handle_edu_receipt( - services: &Services, - _client: &IpAddr, - origin: &ServerName, - receipt: ReceiptContent, -) { +async fn handle_edu_receipt(services: &Services, origin: &ServerName, receipt: ReceiptContent) { receipt .receipts .into_iter() @@ -492,12 +480,7 @@ async fn handle_edu_receipt_room_user( .await; } -async fn handle_edu_typing( - services: &Services, - _client: &IpAddr, - origin: &ServerName, - typing: TypingContent, -) { +async fn handle_edu_typing(services: &Services, origin: &ServerName, typing: TypingContent) { if typing.user_id.server_name() != origin { debug_warn!( %typing.user_id, %origin, @@ -557,7 +540,6 @@ async fn handle_edu_typing( async fn handle_edu_device_list_update( services: &Services, - _client: &IpAddr, origin: &ServerName, content: DeviceListUpdateContent, ) { @@ -576,7 +558,6 @@ async fn handle_edu_device_list_update( async fn handle_edu_direct_to_device( services: &Services, - _client: &IpAddr, origin: &ServerName, content: DirectDeviceContent, ) { @@ -696,7 +677,6 @@ async fn handle_edu_direct_to_device_event( async fn handle_edu_signing_key_update( services: &Services, - _client: &IpAddr, origin: &ServerName, content: SigningKeyUpdateContent, ) { diff --git a/src/router/layers.rs b/src/router/layers.rs index 0d2ed6d43..bde1d5cca 100644 --- a/src/router/layers.rs +++ b/src/router/layers.rs @@ -1,10 +1,10 @@ use std::{any::Any, sync::Arc, time::Duration}; use axum::{ - Router, - extract::{DefaultBodyLimit, MatchedPath}, + Router, extract, + extract::{DefaultBodyLimit, FromRequestParts, MatchedPath}, }; -use axum_client_ip::ClientIpSource; +use axum_client_ip::{ClientIp, ClientIpSource}; use conduwuit::{Result, Server, debug, error}; use conduwuit_service::{Services, state::Guard}; use http::{ @@ -20,7 +20,6 @@ timeout::{RequestBodyTimeoutLayer, ResponseBodyTimeoutLayer, TimeoutLayer}, trace::{DefaultOnFailure, DefaultOnRequest, DefaultOnResponse, TraceLayer}, }; -use tracing::Level; use crate::{request, router}; @@ -67,15 +66,16 @@ pub(crate) fn build(services: &Arc) -> Result<(Router, Guard)> { let services_ = services.clone(); let layers = layers .layer(SetSensitiveHeadersLayer::new([header::AUTHORIZATION])) + .layer(client_ip_layer.into_extension()) .layer( TraceLayer::new_for_http() .make_span_with(tracing_span::<_>) - .on_failure(DefaultOnFailure::new().level(Level::ERROR)) - .on_request(DefaultOnRequest::new().level(Level::TRACE)) - .on_response(DefaultOnResponse::new().level(Level::DEBUG)), + .on_failure(DefaultOnFailure::new().level(tracing::Level::ERROR)) + .on_request(DefaultOnRequest::new().level(tracing::Level::TRACE)) + .on_response(DefaultOnResponse::new().level(tracing::Level::DEBUG)), ) + .layer(axum::middleware::from_fn(request_ip)) .layer(axum::middleware::from_fn_with_state(Arc::clone(services), request::handle)) - .layer(client_ip_layer.into_extension()) .layer(ResponseBodyTimeoutLayer::new(Duration::from_secs( server.config.client_response_timeout, ))) @@ -230,11 +230,25 @@ fn tracing_span(request: &http::Request) -> tracing::Span { parent: None, debug::INFO_SPAN_LEVEL, "router", + ip=tracing::field::Empty, method = %request.method(), %path, } } +/// Annotates the tracing span with the client IP +async fn request_ip( + request: extract::Request, + next: axum::middleware::Next, +) -> axum::response::Response { + let (mut parts, body) = request.into_parts(); + if let Ok(ip) = ClientIp::from_request_parts(&mut parts, &()).await { + let span = tracing::Span::current(); + span.record("ip", ip.0.to_string()); + } + next.run(extract::Request::from_parts(parts, body)).await +} + fn request_path_str(request: &http::Request) -> &str { request .uri()