diff --git a/Cargo.lock b/Cargo.lock index f1072f11..c5ffd744 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1362,6 +1362,7 @@ dependencies = [ "libc", "libz-sys", "lz4-sys", + "pkg-config", "zstd-sys", ] diff --git a/Cargo.toml b/Cargo.toml index d9aded99..0ee3ea03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,7 +117,7 @@ js_option = "0.1" nix = { version = "0.26.2", features = ["resource"] } [features] -default = ["conduit_bin", "backend_sqlite", "backend_rocksdb", "systemd", "zstd_compression"] +default = ["conduit_bin", "backend_rocksdb", "systemd", "zstd_compression"] #backend_sled = ["sled"] backend_persy = ["persy", "parking_lot"] backend_sqlite = ["sqlite"] @@ -132,6 +132,7 @@ zstd_compression = [] #brotli_compression = ["tower-http/compression-br"] #compression = ["tower-http/compression-full"] sha256_media = [] +io_uring = ["rocksdb/io-uring"] [[bin]] name = "conduit" diff --git a/src/api/client_server/keys.rs b/src/api/client_server/keys.rs index b5a6a339..d71ac888 100644 --- a/src/api/client_server/keys.rs +++ b/src/api/client_server/keys.rs @@ -367,7 +367,7 @@ pub(crate) async fn get_keys_helper bool>( .bad_query_ratelimiter .read() .unwrap() - .get(&*server) + .get(server) { // Exponential backoff let mut min_elapsed_duration = Duration::from_secs(30) * (*tries) * (*tries); @@ -468,7 +468,7 @@ fn add_unsigned_device_display_name( } else { unsigned_object.insert( "device_display_name".to_owned(), - Some(metadata.device_id.as_str().to_string()).into(), + Some(metadata.device_id.as_str().to_owned()).into(), ); } } diff --git a/src/api/client_server/membership.rs b/src/api/client_server/membership.rs index e16bac7d..e2a14c58 100644 --- a/src/api/client_server/membership.rs +++ b/src/api/client_server/membership.rs @@ -412,7 +412,7 @@ pub async fn get_member_events_route( if !services() .rooms .state_accessor - .user_can_see_state_events(&sender_user, &body.room_id)? + .user_can_see_state_events(sender_user, &body.room_id)? { return Err(Error::BadRequest( ErrorKind::Forbidden, @@ -447,7 +447,7 @@ pub async fn joined_members_route( if !services() .rooms .state_accessor - .user_can_see_state_events(&sender_user, &body.room_id)? + .user_can_see_state_events(sender_user, &body.room_id)? { return Err(Error::BadRequest( ErrorKind::Forbidden, diff --git a/src/api/client_server/message.rs b/src/api/client_server/message.rs index efbf2c44..badb089b 100644 --- a/src/api/client_server/message.rs +++ b/src/api/client_server/message.rs @@ -128,7 +128,7 @@ pub async fn get_message_events_route( let to = body .to .as_ref() - .and_then(|t| PduCount::try_from_string(&t).ok()); + .and_then(|t| PduCount::try_from_string(t).ok()); services().rooms.lazy_loading.lazy_load_confirm_delivery( sender_user, diff --git a/src/api/client_server/relations.rs b/src/api/client_server/relations.rs index a7cea786..124f1310 100644 --- a/src/api/client_server/relations.rs +++ b/src/api/client_server/relations.rs @@ -23,7 +23,7 @@ pub async fn get_relating_events_with_rel_type_and_event_type_route( let to = body .to .as_ref() - .and_then(|t| PduCount::try_from_string(&t).ok()); + .and_then(|t| PduCount::try_from_string(t).ok()); // Use limit or else 10, with maximum 100 let limit = body @@ -73,7 +73,7 @@ pub async fn get_relating_events_with_rel_type_route( let to = body .to .as_ref() - .and_then(|t| PduCount::try_from_string(&t).ok()); + .and_then(|t| PduCount::try_from_string(t).ok()); // Use limit or else 10, with maximum 100 let limit = body @@ -121,7 +121,7 @@ pub async fn get_relating_events_route( let to = body .to .as_ref() - .and_then(|t| PduCount::try_from_string(&t).ok()); + .and_then(|t| PduCount::try_from_string(t).ok()); // Use limit or else 10, with maximum 100 let limit = body diff --git a/src/api/client_server/session.rs b/src/api/client_server/session.rs index 5ce62af9..5f2360c2 100644 --- a/src/api/client_server/session.rs +++ b/src/api/client_server/session.rs @@ -117,12 +117,10 @@ pub async fn login_route(body: Ruma) -> Result { warn!("Unsupported or unknown login type: {:?}", &body.login_info); @@ -163,6 +161,7 @@ pub async fn login_route(body: Ruma) -> Result since; let mut timeline_users = HashSet::new(); @@ -618,16 +620,16 @@ async fn load_joined_room( } services().rooms.lazy_loading.lazy_load_confirm_delivery( - &sender_user, - &sender_device, - &room_id, + sender_user, + sender_device, + room_id, sincecount, )?; // Database queries: let current_shortstatehash = - if let Some(s) = services().rooms.state.get_room_shortstatehash(&room_id)? { + if let Some(s) = services().rooms.state.get_room_shortstatehash(room_id)? { s } else { error!("Room {} has no state", room_id); @@ -637,7 +639,7 @@ async fn load_joined_room( let since_shortstatehash = services() .rooms .user - .get_token_shortstatehash(&room_id, since)?; + .get_token_shortstatehash(room_id, since)?; let (heroes, joined_member_count, invited_member_count, joined_since_last_sync, state_events) = if timeline_pdus.is_empty() && since_shortstatehash == Some(current_shortstatehash) { @@ -649,12 +651,12 @@ async fn load_joined_room( let joined_member_count = services() .rooms .state_cache - .room_joined_count(&room_id)? + .room_joined_count(room_id)? .unwrap_or(0); let invited_member_count = services() .rooms .state_cache - .room_invited_count(&room_id)? + .room_invited_count(room_id)? .unwrap_or(0); // Recalculate heroes (first 5 members) @@ -667,7 +669,7 @@ async fn load_joined_room( for hero in services() .rooms .timeline - .all_pdus(&sender_user, &room_id)? + .all_pdus(sender_user, room_id)? .filter_map(|pdu| pdu.ok()) // Ignore all broken pdus .filter(|(_, pdu)| pdu.kind == TimelineEventType::RoomMember) .map(|(_, pdu)| { @@ -688,11 +690,11 @@ async fn load_joined_room( ) && (services() .rooms .state_cache - .is_joined(&user_id, &room_id)? + .is_joined(&user_id, room_id)? || services() .rooms .state_cache - .is_invited(&user_id, &room_id)?) + .is_invited(&user_id, room_id)?) { Ok::<_, Error>(Some(state_key.clone())) } else { @@ -808,17 +810,17 @@ async fn load_joined_room( // Reset lazy loading because this is an initial sync services().rooms.lazy_loading.lazy_load_reset( - &sender_user, - &sender_device, - &room_id, + sender_user, + sender_device, + room_id, )?; // The state_events above should contain all timeline_users, let's mark them as lazy // loaded. services().rooms.lazy_loading.lazy_load_mark_sent( - &sender_user, - &sender_device, - &room_id, + sender_user, + sender_device, + room_id, lazy_loaded, next_batchcount, ); @@ -885,14 +887,14 @@ async fn load_joined_room( } if !services().rooms.lazy_loading.lazy_load_was_sent_before( - &sender_user, - &sender_device, - &room_id, + sender_user, + sender_device, + room_id, &event.sender, )? || lazy_load_send_redundant { if let Some(member_event) = services().rooms.state_accessor.room_state_get( - &room_id, + room_id, &StateEventType::RoomMember, event.sender.as_str(), )? { @@ -903,9 +905,9 @@ async fn load_joined_room( } services().rooms.lazy_loading.lazy_load_mark_sent( - &sender_user, - &sender_device, - &room_id, + sender_user, + sender_device, + room_id, lazy_loaded, next_batchcount, ); @@ -953,7 +955,7 @@ async fn load_joined_room( match new_membership { MembershipState::Join => { // A new user joined an encrypted room - if !share_encrypted_room(&sender_user, &user_id, &room_id)? { + if !share_encrypted_room(sender_user, &user_id, room_id)? { device_list_updates.insert(user_id); } } @@ -973,15 +975,15 @@ async fn load_joined_room( services() .rooms .state_cache - .room_members(&room_id) + .room_members(room_id) .flatten() .filter(|user_id| { // Don't send key updates from the sender to the sender - &sender_user != user_id + sender_user != user_id }) .filter(|user_id| { // Only send keys if the sender doesn't share an encrypted room with the target already - !share_encrypted_room(&sender_user, user_id, &room_id) + !share_encrypted_room(sender_user, user_id, room_id) .unwrap_or(false) }), ); @@ -1016,7 +1018,7 @@ async fn load_joined_room( services() .rooms .user - .notification_count(&sender_user, &room_id)? + .notification_count(sender_user, room_id)? .try_into() .expect("notification count can't go that high"), ) @@ -1029,7 +1031,7 @@ async fn load_joined_room( services() .rooms .user - .highlight_count(&sender_user, &room_id)? + .highlight_count(sender_user, room_id)? .try_into() .expect("highlight count can't go that high"), ) @@ -1058,15 +1060,15 @@ async fn load_joined_room( .rooms .edus .read_receipt - .readreceipts_since(&room_id, since) + .readreceipts_since(room_id, since) .filter_map(|r| r.ok()) // Filter out buggy events .map(|(_, _, v)| v) .collect(); - if services().rooms.edus.typing.last_typing_update(&room_id)? > since { + if services().rooms.edus.typing.last_typing_update(room_id)? > since { edus.push( serde_json::from_str( - &serde_json::to_string(&services().rooms.edus.typing.typings_all(&room_id)?) + &serde_json::to_string(&services().rooms.edus.typing.typings_all(room_id)?) .expect("event is valid, we just created it"), ) .expect("event is valid, we just created it"), @@ -1075,7 +1077,7 @@ async fn load_joined_room( // Save the state after this sync so we can send the correct state diff next sync services().rooms.user.associate_token_shortstatehash( - &room_id, + room_id, next_batch, current_shortstatehash, )?; @@ -1084,7 +1086,7 @@ async fn load_joined_room( account_data: RoomAccountData { events: services() .account_data - .changes_since(Some(&room_id), &sender_user, since)? + .changes_since(Some(room_id), sender_user, since)? .into_iter() .filter_map(|(_, v)| { serde_json::from_str(v.json().get()) @@ -1129,13 +1131,13 @@ fn load_timeline( if services() .rooms .timeline - .last_timeline_count(&sender_user, &room_id)? + .last_timeline_count(sender_user, room_id)? > roomsincecount { let mut non_timeline_pdus = services() .rooms .timeline - .pdus_until(&sender_user, &room_id, PduCount::max())? + .pdus_until(sender_user, room_id, PduCount::max())? .filter_map(|r| { // Filter out buggy events if r.is_err() { @@ -1250,7 +1252,7 @@ pub async fn sync_events_v4_route( for room_id in &all_joined_rooms { let current_shortstatehash = - if let Some(s) = services().rooms.state.get_room_shortstatehash(&room_id)? { + if let Some(s) = services().rooms.state.get_room_shortstatehash(room_id)? { s } else { error!("Room {} has no state", room_id); @@ -1260,7 +1262,7 @@ pub async fn sync_events_v4_route( let since_shortstatehash = services() .rooms .user - .get_token_shortstatehash(&room_id, globalsince)?; + .get_token_shortstatehash(room_id, globalsince)?; let since_sender_member: Option = since_shortstatehash .and_then(|shortstatehash| { @@ -1349,7 +1351,7 @@ pub async fn sync_events_v4_route( if !share_encrypted_room( &sender_user, &user_id, - &room_id, + room_id, )? { device_list_changes.insert(user_id); } @@ -1370,7 +1372,7 @@ pub async fn sync_events_v4_route( services() .rooms .state_cache - .room_members(&room_id) + .room_members(room_id) .flatten() .filter(|user_id| { // Don't send key updates from the sender to the sender @@ -1378,7 +1380,7 @@ pub async fn sync_events_v4_route( }) .filter(|user_id| { // Only send keys if the sender doesn't share an encrypted room with the target already - !share_encrypted_room(&sender_user, user_id, &room_id) + !share_encrypted_room(&sender_user, user_id, room_id) .unwrap_or(false) }), ); @@ -1469,7 +1471,7 @@ pub async fn sync_events_v4_route( } sync_events::v4::SyncOp { op: SlidingOp::Sync, - range: Some(r.clone()), + range: Some(r), index: None, room_ids, room_id: None, @@ -1541,7 +1543,7 @@ pub async fn sync_events_v4_route( let roomsincecount = PduCount::Normal(*roomsince); let (timeline_pdus, limited) = - load_timeline(&sender_user, &room_id, roomsincecount, *timeline_limit)?; + load_timeline(&sender_user, room_id, roomsincecount, *timeline_limit)?; if roomsince != &0 && timeline_pdus.is_empty() { continue; @@ -1577,10 +1579,10 @@ pub async fn sync_events_v4_route( services() .rooms .state_accessor - .room_state_get(&room_id, &state.0, &state.1) + .room_state_get(room_id, &state.0, &state.1) }) .filter_map(|r| r.ok()) - .filter_map(|o| o) + .flatten() .map(|state| state.to_sync_state_event()) .collect(); @@ -1588,7 +1590,7 @@ pub async fn sync_events_v4_route( let heroes = services() .rooms .state_cache - .room_members(&room_id) + .room_members(room_id) .filter_map(|r| r.ok()) .filter(|member| member != &sender_user) .map(|member| { @@ -1596,7 +1598,7 @@ pub async fn sync_events_v4_route( services() .rooms .state_accessor - .get_member(&room_id, &member)? + .get_member(room_id, &member)? .map(|memberevent| { ( memberevent @@ -1608,24 +1610,24 @@ pub async fn sync_events_v4_route( ) }) .filter_map(|r| r.ok()) - .filter_map(|o| o) + .flatten() .take(5) .collect::>(); - let name = if heroes.len() > 1 { - let last = heroes[0].0.clone(); - Some( - heroes[1..] - .iter() - .map(|h| h.0.clone()) - .collect::>() - .join(", ") - + " and " - + &last, - ) - } else if heroes.len() == 1 { - Some(heroes[0].0.clone()) - } else { - None + let name = match heroes.len().cmp(&(1_usize)) { + Ordering::Greater => { + let last = heroes[0].0.clone(); + Some( + heroes[1..] + .iter() + .map(|h| h.0.clone()) + .collect::>() + .join(", ") + + " and " + + &last, + ) + } + Ordering::Equal => Some(heroes[0].0.clone()), + Ordering::Less => None, }; let avatar = if heroes.len() == 1 { @@ -1637,15 +1639,11 @@ pub async fn sync_events_v4_route( rooms.insert( room_id.clone(), sync_events::v4::SlidingSyncRoom { - name: services() - .rooms - .state_accessor - .get_name(&room_id)? - .or_else(|| name), + name: services().rooms.state_accessor.get_name(room_id)?.or(name), avatar: services() .rooms .state_accessor - .get_avatar(&room_id)? + .get_avatar(room_id)? .map_or(avatar, |a| a.url), initial: Some(roomsince == &0), is_dm: None, @@ -1655,7 +1653,7 @@ pub async fn sync_events_v4_route( services() .rooms .user - .highlight_count(&sender_user, &room_id)? + .highlight_count(&sender_user, room_id)? .try_into() .expect("notification count can't go that high"), ), @@ -1663,7 +1661,7 @@ pub async fn sync_events_v4_route( services() .rooms .user - .notification_count(&sender_user, &room_id)? + .notification_count(&sender_user, room_id)? .try_into() .expect("notification count can't go that high"), ), @@ -1676,7 +1674,7 @@ pub async fn sync_events_v4_route( (services() .rooms .state_cache - .room_joined_count(&room_id)? + .room_joined_count(room_id)? .unwrap_or(0) as u32) .into(), ), @@ -1684,7 +1682,7 @@ pub async fn sync_events_v4_route( (services() .rooms .state_cache - .room_invited_count(&room_id)? + .room_invited_count(room_id)? .unwrap_or(0) as u32) .into(), ), diff --git a/src/api/server_server.rs b/src/api/server_server.rs index c4c5db4f..a361c848 100644 --- a/src/api/server_server.rs +++ b/src/api/server_server.rs @@ -1,4 +1,5 @@ #![allow(deprecated)] +// Conduit implements the older APIs use crate::{ api::client_server::{self, claim_keys_helper, get_keys_helper}, @@ -520,7 +521,7 @@ async fn query_srv_record(hostname: &'_ str) -> Option { services() .globals .dns_resolver() - .srv_lookup(format!("{}", hostname)) + .srv_lookup(hostname.to_owned()) .await } @@ -724,7 +725,7 @@ pub fn parse_incoming_pdu( let room_version_id = services().rooms.state.get_room_version(&room_id)?; - let (event_id, value) = match gen_event_id_canonical_json(&pdu, &room_version_id) { + let (event_id, value) = match gen_event_id_canonical_json(pdu, &room_version_id) { Ok(t) => t, Err(_) => { // Event could not be converted to canonical json @@ -783,7 +784,7 @@ pub async fn send_transaction_message_route( continue; } - let r = parse_incoming_pdu(&pdu); + let r = parse_incoming_pdu(pdu); let (event_id, value, room_id) = match r { Ok(t) => t, Err(e) => { @@ -1088,7 +1089,7 @@ pub async fn get_event_route( if !services().rooms.state_accessor.server_can_see_event( sender_servername, - &room_id, + room_id, &body.event_id, )? { return Err(Error::BadRequest( @@ -1154,7 +1155,7 @@ pub async fn get_backfill_route( let all_events = services() .rooms .timeline - .pdus_until(&user_id!("@doesntmatter:conduit.rs"), &body.room_id, until)? + .pdus_until(user_id!("@doesntmatter:conduit.rs"), &body.room_id, until)? .take(limit.try_into().unwrap()); let events = all_events @@ -1171,7 +1172,7 @@ pub async fn get_backfill_route( }) .map(|(_, pdu)| services().rooms.timeline.get_pdu_json(&pdu.event_id)) .filter_map(|r| r.ok().flatten()) - .map(|pdu| PduEvent::convert_to_outgoing_federation_event(pdu)) + .map(PduEvent::convert_to_outgoing_federation_event) .collect(); Ok(get_backfill::v1::Response { @@ -1917,7 +1918,7 @@ pub async fn get_devices_route( .all_devices_metadata(&body.user_id) .filter_map(|r| r.ok()) .filter_map(|metadata| { - let device_id_string = metadata.device_id.as_str().to_string(); + let device_id_string = metadata.device_id.as_str().to_owned(); let device_display_name = match services().globals.allow_device_name_federation() { true => metadata.display_name, false => Some(device_id_string.to_string()), @@ -1928,7 +1929,7 @@ pub async fn get_devices_route( .get_device_keys(&body.user_id, &metadata.device_id) .ok()??, device_id: metadata.device_id, - device_display_name: device_display_name, + device_display_name, }) }) .collect(), diff --git a/src/config/proxy.rs b/src/config/proxy.rs index dcf304e9..28ffada4 100644 --- a/src/config/proxy.rs +++ b/src/config/proxy.rs @@ -27,10 +27,12 @@ use crate::Result; /// If a domain matches both the exclude and include list, the proxy will only be used if it was /// included because of a more specific rule than it was excluded. In the above example, the proxy /// would be used for `ordinary.onion`, `matrix.myspecial.onion`, but not `hello.myspecial.onion`. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Default, Debug, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ProxyConfig { + #[default] None, + Global { #[serde(deserialize_with = "crate::utils::deserialize_from_str")] url: Url, @@ -48,11 +50,6 @@ impl ProxyConfig { }) } } -impl Default for ProxyConfig { - fn default() -> Self { - ProxyConfig::None - } -} #[derive(Clone, Debug, Deserialize)] pub struct PartialProxyConfig { diff --git a/src/database/key_value/globals.rs b/src/database/key_value/globals.rs index 11aa0641..7a70af18 100644 --- a/src/database/key_value/globals.rs +++ b/src/database/key_value/globals.rs @@ -256,8 +256,8 @@ lasttimelinecount_cache: {lasttimelinecount_cache}\n" .. } = new_keys; - keys.verify_keys.extend(verify_keys.into_iter()); - keys.old_verify_keys.extend(old_verify_keys.into_iter()); + keys.verify_keys.extend(verify_keys); + keys.old_verify_keys.extend(old_verify_keys); self.server_signingkeys.insert( origin.as_bytes(), diff --git a/src/database/key_value/rooms/state_accessor.rs b/src/database/key_value/rooms/state_accessor.rs index ad08f46e..fe40b937 100644 --- a/src/database/key_value/rooms/state_accessor.rs +++ b/src/database/key_value/rooms/state_accessor.rs @@ -20,7 +20,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { let parsed = services() .rooms .state_compressor - .parse_compressed_state_event(&compressed)?; + .parse_compressed_state_event(compressed)?; result.insert(parsed.0, parsed.1); i += 1; @@ -49,7 +49,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { let (_, eventid) = services() .rooms .state_compressor - .parse_compressed_state_event(&compressed)?; + .parse_compressed_state_event(compressed)?; if let Some(pdu) = services().rooms.timeline.get_pdu(&eventid)? { result.insert( ( @@ -101,7 +101,7 @@ impl service::rooms::state_accessor::Data for KeyValueDatabase { services() .rooms .state_compressor - .parse_compressed_state_event(&compressed) + .parse_compressed_state_event(compressed) .ok() .map(|(_, id)| id) })) diff --git a/src/database/key_value/rooms/threads.rs b/src/database/key_value/rooms/threads.rs index 35c4e6e2..5e3dc970 100644 --- a/src/database/key_value/rooms/threads.rs +++ b/src/database/key_value/rooms/threads.rs @@ -52,13 +52,13 @@ impl service::rooms::threads::Data for KeyValueDatabase { .collect::>() .join(&[0xff][..]); - self.threadid_userids.insert(&root_id, &users)?; + self.threadid_userids.insert(root_id, &users)?; Ok(()) } fn get_participants(&self, root_id: &[u8]) -> Result>> { - if let Some(users) = self.threadid_userids.get(&root_id)? { + if let Some(users) = self.threadid_userids.get(root_id)? { Ok(Some( users .split(|b| *b == 0xff) diff --git a/src/database/key_value/rooms/timeline.rs b/src/database/key_value/rooms/timeline.rs index ba1e85ef..f322d430 100644 --- a/src/database/key_value/rooms/timeline.rs +++ b/src/database/key_value/rooms/timeline.rs @@ -39,11 +39,10 @@ impl service::rooms::timeline::Data for KeyValueDatabase { /// Returns the `count` of this pdu's id. fn get_pdu_count(&self, event_id: &EventId) -> Result> { - Ok(self - .eventid_pduid + self.eventid_pduid .get(event_id.as_bytes())? .map(|pdu_id| pdu_count(&pdu_id)) - .transpose()?) + .transpose() } /// Returns the json of a pdu. @@ -80,7 +79,7 @@ impl service::rooms::timeline::Data for KeyValueDatabase { /// Returns the pdu's id. fn get_pdu_id(&self, event_id: &EventId) -> Result>> { - Ok(self.eventid_pduid.get(event_id.as_bytes())?) + self.eventid_pduid.get(event_id.as_bytes()) } /// Returns the pdu. @@ -230,7 +229,7 @@ impl service::rooms::timeline::Data for KeyValueDatabase { room_id: &RoomId, until: PduCount, ) -> Result> + 'a>> { - let (prefix, current) = count_to_id(&room_id, until, 1, true)?; + let (prefix, current) = count_to_id(room_id, until, 1, true)?; let user_id = user_id.to_owned(); @@ -257,7 +256,7 @@ impl service::rooms::timeline::Data for KeyValueDatabase { room_id: &RoomId, from: PduCount, ) -> Result> + 'a>> { - let (prefix, current) = count_to_id(&room_id, from, 1, false)?; + let (prefix, current) = count_to_id(room_id, from, 1, false)?; let user_id = user_id.to_owned(); diff --git a/src/database/mod.rs b/src/database/mod.rs index a36e66c3..36f738d8 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -427,14 +427,12 @@ impl KeyValueDatabase { } // If the database has any data, perform data migrations before starting - let latest_database_version: u64; - // do not increment the db version if the user is not using sha256_media - if cfg!(feature = "sha256_media") { - latest_database_version = 14; + let latest_database_version = if cfg!(feature = "sha256_media") { + 14 } else { - latest_database_version = 13; - } + 13 + }; if services().users.count()? > 0 { // MIGRATIONS @@ -487,6 +485,7 @@ impl KeyValueDatabase { continue; } + #[allow(deprecated)] let path = services().globals.get_media_file(&key); let mut file = fs::File::create(path)?; file.write_all(&content)?; diff --git a/src/lib.rs b/src/lib.rs index dc6a9d2f..4dd4e12b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,6 @@ clippy::cloned_instead_of_copied, clippy::str_to_string )] -#![allow(clippy::suspicious_else_formatting)] #![deny(clippy::dbg_macro)] pub mod api; diff --git a/src/main.rs b/src/main.rs index b97903cd..1bd05712 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,6 @@ clippy::str_to_string, clippy::future_not_send )] -#![allow(clippy::suspicious_else_formatting)] #![deny(clippy::dbg_macro)] use std::{ @@ -17,7 +16,7 @@ use axum::{ extract::{DefaultBodyLimit, FromRequestParts, MatchedPath}, response::IntoResponse, routing::{get, on, MethodFilter}, - Json, Router, + Router, }; use axum_server::{bind, bind_rustls, tls_rustls::RustlsConfig, Handle as ServerHandle}; use conduit::api::{client_server, server_server}; @@ -38,7 +37,6 @@ use ruma::api::{ }, IncomingRequest, }; -use serde::Deserialize; use tokio::{net::UnixListener, signal, sync::oneshot}; use tower::ServiceBuilder; use tower_http::{ @@ -147,7 +145,7 @@ async fn main() { maximize_fd_limit().expect("should be able to increase the soft limit to the hard limit"); config.warn_deprecated(); - if let Err(_) = config.error_dual_listening(raw_config) { + if config.error_dual_listening(raw_config).is_err() { return; }; @@ -213,16 +211,15 @@ async fn run_server() -> io::Result<()> { .expect("failed to convert max request size"), )); - let app: axum::routing::IntoMakeService; - - if cfg!(feature = "zstd_compression") && config.zstd_compression { + let app = if cfg!(feature = "zstd_compression") && config.zstd_compression { debug!("zstd body compression is enabled"); - app = routes() + routes() .layer(middlewares.compression()) - .into_make_service(); + .into_make_service() } else { - app = routes().layer(middlewares).into_make_service(); - } + routes().layer(middlewares).into_make_service() + }; + let handle = ServerHandle::new(); let (tx, rx) = oneshot::channel::<()>(); diff --git a/src/service/admin/mod.rs b/src/service/admin/mod.rs index 70a4e646..d8c7816f 100644 --- a/src/service/admin/mod.rs +++ b/src/service/admin/mod.rs @@ -5,6 +5,8 @@ use std::{ time::Instant, }; +use std::fmt::Write; + use clap::{Parser, Subcommand}; use regex::Regex; use ruma::{ @@ -27,7 +29,7 @@ use ruma::{ EventId, OwnedRoomAliasId, OwnedRoomId, RoomAliasId, RoomId, RoomVersionId, ServerName, UserId, }; use serde_json::value::to_raw_value; -use tokio::sync::{mpsc, Mutex, MutexGuard}; +use tokio::sync::{mpsc, Mutex}; use crate::{ api::client_server::{leave_all_rooms, AUTO_GEN_PASSWORD_LENGTH}, @@ -194,19 +196,19 @@ enum RoomAliasCommand { room_id: Box, /// The alias localpart to use (`alias`, not `#alias:servername.tld`) - room_alias_localpart: Box, + room_alias_localpart: String, }, /// Remove an alias Remove { /// The alias localpart to remove (`alias`, not `#alias:servername.tld`) - room_alias_localpart: Box, + room_alias_localpart: String, }, /// Show which room is using an alias Which { /// The alias localpart to look up (`alias`, not `#alias:servername.tld`) - room_alias_localpart: Box, + room_alias_localpart: String, }, /// List aliases currently being used @@ -802,13 +804,12 @@ impl Service { "\n\t\t\n{}
Room list - page {page}
idmembersname
", rooms .iter() - .map(|(id, members, name)| format!( - "{}\t{}\t{}\n", - escape_html(&id.to_string()), + .fold(String::new(), |mut output, (id, members, name)| { + writeln!(output, "{}\t{}\t{}", escape_html(id.as_ref()), members, - escape_html(name), - )) - .collect::() + escape_html(name)).unwrap(); + output + }) ); RoomMessageEventContent::text_html(output_plain, output_html) } @@ -886,7 +887,7 @@ impl Service { Ok(None) => { RoomMessageEventContent::text_plain("Alias isn't in use.") } - Err(err) => RoomMessageEventContent::text_plain(&format!( + Err(err) => RoomMessageEventContent::text_plain(format!( "Unable to lookup alias: {}", err )), @@ -904,27 +905,29 @@ impl Service { .collect(); match aliases { Ok(aliases) => { - let plain_list: String = aliases - .iter() - .map(|alias| format!("- {}\n", alias)) - .collect(); + let plain_list: String = + aliases.iter().fold(String::new(), |mut output, alias| { + writeln!(output, "- {}", alias).unwrap(); + output + }); - let html_list: String = aliases - .iter() - .map(|alias| { - format!( - "
  • {}
  • \n", - escape_html(&alias.to_string()) + let html_list: String = + aliases.iter().fold(String::new(), |mut output, alias| { + writeln!( + output, + "
  • {}
  • ", + escape_html(alias.as_ref()) ) - }) - .collect(); + .unwrap(); + output + }); let plain = format!("Aliases for {}:\n{}", room_id, plain_list); let html = format!("Aliases for {}:\n
      {}
    ", room_id, html_list); RoomMessageEventContent::text_html(plain, html) } - Err(err) => RoomMessageEventContent::text_plain(&format!( + Err(err) => RoomMessageEventContent::text_plain(format!( "Unable to list aliases: {}", err )), @@ -936,30 +939,39 @@ impl Service { match aliases { Ok(aliases) => { let server_name = services().globals.server_name(); - let plain_list: String = aliases - .iter() - .map(|(id, alias)| { - format!("- #{}:{} -> {}\n", alias, server_name, id) - }) - .collect(); - - let html_list: String = aliases - .iter() - .map(|(id, alias)| { - format!( - "
  • #{}:{} -> {}
  • \n", - escape_html(&alias.to_string()), - server_name, - escape_html(&id.to_string()) + let plain_list: String = aliases.iter().fold( + String::new(), + |mut output, (alias, id)| { + writeln!( + output, + "- #{}:{} -> {}", + alias, server_name, id ) - }) - .collect(); + .unwrap(); + output + }, + ); + + let html_list: String = aliases.iter().fold( + String::new(), + |mut output, (alias, id)| { + writeln!( + output, + "
  • #{}:{} -> {}
  • ", + escape_html(alias.as_ref()), + server_name, + escape_html(id.as_ref()) + ) + .unwrap(); + output + }, + ); let plain = format!("Aliases:\n{}", plain_list); let html = format!("Aliases:\n
      {}
    ", html_list); RoomMessageEventContent::text_html(plain, html) } - Err(err) => RoomMessageEventContent::text_plain(&format!( + Err(err) => RoomMessageEventContent::text_plain(format!( "Unable to list aliases: {}", err )), @@ -971,7 +983,7 @@ impl Service { RoomDirectoryCommand::Publish { room_id } => { match services().rooms.directory.set_public(&room_id) { Ok(()) => RoomMessageEventContent::text_plain("Room published"), - Err(err) => RoomMessageEventContent::text_plain(&format!( + Err(err) => RoomMessageEventContent::text_plain(format!( "Unable to update room: {}", err )), @@ -980,7 +992,7 @@ impl Service { RoomDirectoryCommand::Unpublish { room_id } => { match services().rooms.directory.set_not_public(&room_id) { Ok(()) => RoomMessageEventContent::text_plain("Room unpublished"), - Err(err) => RoomMessageEventContent::text_plain(&format!( + Err(err) => RoomMessageEventContent::text_plain(format!( "Unable to update room: {}", err )), @@ -1023,13 +1035,10 @@ impl Service { "\n\t\t\n{}
    Room directory - page {page}
    idmembersname
    ", rooms .iter() - .map(|(id, members, name)| format!( - "{}\t{}\t{}\n", - escape_html(&id.to_string()), - members, - escape_html(name), - )) - .collect::() + .fold(String::new(), |mut output, (id, members, name)| { + writeln!(output, "{}\t{}\t{}", escape_html(id.as_ref()), members, escape_html(name.as_ref())).unwrap(); + output + }) ); RoomMessageEventContent::text_html(output_plain, output_html) } diff --git a/src/service/globals/mod.rs b/src/service/globals/mod.rs index 3b3ddc1a..bb202c67 100644 --- a/src/service/globals/mod.rs +++ b/src/service/globals/mod.rs @@ -164,7 +164,7 @@ impl Service { .dns_resolver(Arc::new(Resolver::new(Box::new(move |domain| { let read_guard = name_override.read().unwrap(); let (override_name, port) = read_guard.get(domain)?; - let first_name = override_name.get(0)?; + let first_name = override_name.first()?; Some(SocketAddr::new(*first_name, *port)) })))) .build()?; diff --git a/src/service/media/mod.rs b/src/service/media/mod.rs index fc3492f2..327abd86 100644 --- a/src/service/media/mod.rs +++ b/src/service/media/mod.rs @@ -35,19 +35,19 @@ impl Service { .db .create_file_metadata(mxc, 0, 0, content_disposition, content_type)?; - let path: std::path::PathBuf; - if cfg!(feature = "sha256_media") { - path = services().globals.get_media_file_new(&key); + let path = if cfg!(feature = "sha256_media") { + services().globals.get_media_file_new(&key) } else { - path = services().globals.get_media_file(&key); - } + #[allow(deprecated)] + services().globals.get_media_file(&key) + }; + let mut f = File::create(path).await?; f.write_all(file).await?; Ok(()) } /// Uploads or replaces a file thumbnail. - #[allow(clippy::too_many_arguments)] pub async fn upload_thumbnail( &self, mxc: String, @@ -61,12 +61,13 @@ impl Service { self.db .create_file_metadata(mxc, width, height, content_disposition, content_type)?; - let path: std::path::PathBuf; - if cfg!(feature = "sha256_media") { - path = services().globals.get_media_file_new(&key); + let path = if cfg!(feature = "sha256_media") { + services().globals.get_media_file_new(&key) } else { - path = services().globals.get_media_file(&key); - } + #[allow(deprecated)] + services().globals.get_media_file(&key) + }; + let mut f = File::create(path).await?; f.write_all(file).await?; @@ -78,12 +79,13 @@ impl Service { if let Ok((content_disposition, content_type, key)) = self.db.search_file_metadata(mxc, 0, 0) { - let path: std::path::PathBuf; - if cfg!(feature = "sha256_media") { - path = services().globals.get_media_file_new(&key); + let path = if cfg!(feature = "sha256_media") { + services().globals.get_media_file_new(&key) } else { - path = services().globals.get_media_file(&key); - } + #[allow(deprecated)] + services().globals.get_media_file(&key) + }; + let mut file = Vec::new(); BufReader::new(File::open(path).await?) .read_to_end(&mut file) @@ -136,12 +138,13 @@ impl Service { self.db.search_file_metadata(mxc.clone(), width, height) { // Using saved thumbnail - let path: std::path::PathBuf; - if cfg!(feature = "sha256_media") { - path = services().globals.get_media_file_new(&key); + let path = if cfg!(feature = "sha256_media") { + services().globals.get_media_file_new(&key) } else { - path = services().globals.get_media_file(&key); - } + #[allow(deprecated)] + services().globals.get_media_file(&key) + }; + let mut file = Vec::new(); File::open(path).await?.read_to_end(&mut file).await?; @@ -154,12 +157,13 @@ impl Service { self.db.search_file_metadata(mxc.clone(), 0, 0) { // Generate a thumbnail - let path: std::path::PathBuf; - if cfg!(feature = "sha256_media") { - path = services().globals.get_media_file_new(&key); + let path = if cfg!(feature = "sha256_media") { + services().globals.get_media_file_new(&key) } else { - path = services().globals.get_media_file(&key); - } + #[allow(deprecated)] + services().globals.get_media_file(&key) + }; + let mut file = Vec::new(); File::open(path).await?.read_to_end(&mut file).await?; @@ -229,12 +233,13 @@ impl Service { content_type.as_deref(), )?; - let path: std::path::PathBuf; - if cfg!(feature = "sha256_media") { - path = services().globals.get_media_file_new(&thumbnail_key); + let path = if cfg!(feature = "sha256_media") { + services().globals.get_media_file_new(&thumbnail_key) } else { - path = services().globals.get_media_file(&thumbnail_key); - } + #[allow(deprecated)] + services().globals.get_media_file(&thumbnail_key) + }; + let mut f = File::create(path).await?; f.write_all(&thumbnail_bytes).await?; @@ -337,7 +342,7 @@ mod tests { // r.push(base64::encode_config(key, base64::URL_SAFE_NO_PAD)); // use the sha256 hash of the key as the file name instead of the key itself // this is because the base64 encoded key can be longer than 255 characters. - r.push(general_purpose::URL_SAFE_NO_PAD.encode(sha2::Sha256::digest(&key))); + r.push(general_purpose::URL_SAFE_NO_PAD.encode(sha2::Sha256::digest(key))); // Check that the file path is not longer than 255 characters // (255 is the maximum length of a file path on most file systems) assert!( diff --git a/src/service/pdu.rs b/src/service/pdu.rs index 34c0320d..c8d78604 100644 --- a/src/service/pdu.rs +++ b/src/service/pdu.rs @@ -383,10 +383,9 @@ impl PartialEq for PduEvent { self.event_id == other.event_id } } -#[allow(clippy::non_canonical_partial_ord_impl)] impl PartialOrd for PduEvent { fn partial_cmp(&self, other: &Self) -> Option { - self.event_id.partial_cmp(&other.event_id) + Some(self.cmp(other)) } } impl Ord for PduEvent { diff --git a/src/service/rooms/edus/presence/mod.rs b/src/service/rooms/edus/presence/mod.rs index 9bae41f7..6a09e08e 100644 --- a/src/service/rooms/edus/presence/mod.rs +++ b/src/service/rooms/edus/presence/mod.rs @@ -182,7 +182,7 @@ fn process_presence_timer(user_id: OwnedUserId) -> Result<()> { } } - let new_state = match (&presence_state, last_active_ago.map(|ago| u64::from(ago))) { + let new_state = match (&presence_state, last_active_ago.map(u64::from)) { (PresenceState::Online, Some(ago)) if ago >= idle_timeout => { Some(PresenceState::Unavailable) } diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index a26735f4..8d633529 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -92,7 +92,7 @@ impl Service { )); } - services().rooms.event_handler.acl_check(origin, &room_id)?; + services().rooms.event_handler.acl_check(origin, room_id)?; // 1. Skip the PDU if we already have it as a timeline event if let Some(pdu_id) = services().rooms.timeline.get_pdu_id(event_id)? { @@ -277,6 +277,7 @@ impl Service { r } + #[allow(clippy::too_many_arguments)] fn handle_outlier_pdu<'a>( &'a self, origin: &'a ServerName, diff --git a/src/service/rooms/pdu_metadata/mod.rs b/src/service/rooms/pdu_metadata/mod.rs index 9ce74f4d..411f4f54 100644 --- a/src/service/rooms/pdu_metadata/mod.rs +++ b/src/service/rooms/pdu_metadata/mod.rs @@ -40,6 +40,7 @@ impl Service { } } + #[allow(clippy::too_many_arguments)] pub fn paginate_relations_with_filter( &self, sender_user: &UserId, @@ -82,7 +83,7 @@ impl Service { services() .rooms .state_accessor - .user_can_see_event(sender_user, &room_id, &pdu.event_id) + .user_can_see_event(sender_user, room_id, &pdu.event_id) .unwrap_or(false) }) .take_while(|&(k, _)| Some(k) != to) // Stop at `to` @@ -106,7 +107,7 @@ impl Service { let events_before: Vec<_> = services() .rooms .pdu_metadata - .relations_until(sender_user, &room_id, target, from)? + .relations_until(sender_user, room_id, target, from)? .filter(|r| { r.as_ref().map_or(true, |(_, pdu)| { filter_event_type.as_ref().map_or(true, |t| &pdu.kind == t) @@ -129,7 +130,7 @@ impl Service { services() .rooms .state_accessor - .user_can_see_event(sender_user, &room_id, &pdu.event_id) + .user_can_see_event(sender_user, room_id, &pdu.event_id) .unwrap_or(false) }) .take_while(|&(k, _)| Some(k) != to) // Stop at `to` diff --git a/src/service/rooms/spaces/mod.rs b/src/service/rooms/spaces/mod.rs index 342d00cd..12e16d22 100644 --- a/src/service/rooms/spaces/mod.rs +++ b/src/service/rooms/spaces/mod.rs @@ -134,7 +134,7 @@ impl Service { if serde_json::from_str::(pdu.content.get()) .ok() - .and_then(|c| Some(c.via)) + .map(|c| c.via) .map_or(true, |v| v.is_empty()) { continue; @@ -199,7 +199,7 @@ impl Service { if let Ok(response) = services() .sending .send_federation_request( - &server, + server, federation::space::get_hierarchy::v1::Request { room_id: current_room.to_owned(), suggested_only, @@ -237,7 +237,7 @@ impl Service { .room .allowed_room_ids .into_iter() - .map(|room| AllowRule::room_membership(room)) + .map(AllowRule::room_membership) .collect(), }) } @@ -247,7 +247,7 @@ impl Service { .room .allowed_room_ids .into_iter() - .map(|room| AllowRule::room_membership(room)) + .map(AllowRule::room_membership) .collect(), }) } @@ -315,7 +315,7 @@ impl Service { canonical_alias: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomCanonicalAlias, "")? + .room_state_get(room_id, &StateEventType::RoomCanonicalAlias, "")? .map_or(Ok(None), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomCanonicalAliasEventContent| c.alias) @@ -323,11 +323,11 @@ impl Service { Error::bad_database("Invalid canonical alias event in database.") }) })?, - name: services().rooms.state_accessor.get_name(&room_id)?, + name: services().rooms.state_accessor.get_name(room_id)?, num_joined_members: services() .rooms .state_cache - .room_joined_count(&room_id)? + .room_joined_count(room_id)? .unwrap_or_else(|| { warn!("Room {} has no member count", room_id); 0 @@ -338,7 +338,7 @@ impl Service { topic: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomTopic, "")? + .room_state_get(room_id, &StateEventType::RoomTopic, "")? .map_or(Ok(None), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomTopicEventContent| Some(c.topic)) @@ -350,7 +350,7 @@ impl Service { world_readable: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomHistoryVisibility, "")? + .room_state_get(room_id, &StateEventType::RoomHistoryVisibility, "")? .map_or(Ok(false), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomHistoryVisibilityEventContent| { @@ -365,7 +365,7 @@ impl Service { guest_can_join: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomGuestAccess, "")? + .room_state_get(room_id, &StateEventType::RoomGuestAccess, "")? .map_or(Ok(false), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomGuestAccessEventContent| { @@ -378,7 +378,7 @@ impl Service { avatar_url: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomAvatar, "")? + .room_state_get(room_id, &StateEventType::RoomAvatar, "")? .map(|s| { serde_json::from_str(s.content.get()) .map(|c: RoomAvatarEventContent| c.url) @@ -391,7 +391,7 @@ impl Service { let join_rule = services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomJoinRules, "")? + .room_state_get(room_id, &StateEventType::RoomJoinRules, "")? .map(|s| { serde_json::from_str(s.content.get()) .map(|c: RoomJoinRulesEventContent| c.join_rule) @@ -417,7 +417,7 @@ impl Service { room_type: services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomCreate, "")? + .room_state_get(room_id, &StateEventType::RoomCreate, "")? .map(|s| { serde_json::from_str::(s.content.get()).map_err(|e| { error!("Invalid room create event in database: {}", e); @@ -457,7 +457,7 @@ impl Service { SpaceRoomJoinRule::Invite => services() .rooms .state_cache - .is_joined(sender_user, &room_id)?, + .is_joined(sender_user, room_id)?, _ => false, }; @@ -481,17 +481,14 @@ impl Service { match join_rule { JoinRule::Restricted(r) => { for rule in &r.allow { - match rule { - join_rules::AllowRule::RoomMembership(rm) => { - if let Ok(true) = services() - .rooms - .state_cache - .is_joined(sender_user, &rm.room_id) - { - return Ok(true); - } + if let join_rules::AllowRule::RoomMembership(rm) = rule { + if let Ok(true) = services() + .rooms + .state_cache + .is_joined(sender_user, &rm.room_id) + { + return Ok(true); } - _ => {} } } diff --git a/src/service/rooms/state/mod.rs b/src/service/rooms/state/mod.rs index e5291a1c..282b0fe8 100644 --- a/src/service/rooms/state/mod.rs +++ b/src/service/rooms/state/mod.rs @@ -41,7 +41,7 @@ impl Service { services() .rooms .state_compressor - .parse_compressed_state_event(&new) + .parse_compressed_state_event(new) .ok() .map(|(_, id)| id) }) { @@ -409,7 +409,7 @@ impl Service { services() .rooms .state_compressor - .parse_compressed_state_event(&compressed) + .parse_compressed_state_event(compressed) .ok() }) .filter_map(|(shortstatekey, event_id)| { diff --git a/src/service/rooms/state_accessor/mod.rs b/src/service/rooms/state_accessor/mod.rs index 3c135f76..14c3bae7 100644 --- a/src/service/rooms/state_accessor/mod.rs +++ b/src/service/rooms/state_accessor/mod.rs @@ -180,7 +180,7 @@ impl Service { return Ok(*visibility); } - let currently_member = services().rooms.state_cache.is_joined(&user_id, &room_id)?; + let currently_member = services().rooms.state_cache.is_joined(user_id, room_id)?; let history_visibility = self .state_get(shortstatehash, &StateEventType::RoomHistoryVisibility, "")? @@ -197,11 +197,11 @@ impl Service { HistoryVisibility::Shared => currently_member, HistoryVisibility::Invited => { // Allow if any member on requesting server was AT LEAST invited, else deny - self.user_was_invited(shortstatehash, &user_id) + self.user_was_invited(shortstatehash, user_id) } HistoryVisibility::Joined => { // Allow if any member on requested server was joined, else deny - self.user_was_joined(shortstatehash, &user_id) + self.user_was_joined(shortstatehash, user_id) } _ => { error!("Unknown history visibility {history_visibility}"); @@ -221,10 +221,10 @@ impl Service { /// the room's history_visibility at that event's state. #[tracing::instrument(skip(self, user_id, room_id))] pub fn user_can_see_state_events(&self, user_id: &UserId, room_id: &RoomId) -> Result { - let currently_member = services().rooms.state_cache.is_joined(&user_id, &room_id)?; + let currently_member = services().rooms.state_cache.is_joined(user_id, room_id)?; let history_visibility = self - .room_state_get(&room_id, &StateEventType::RoomHistoryVisibility, "")? + .room_state_get(room_id, &StateEventType::RoomHistoryVisibility, "")? .map_or(Ok(HistoryVisibility::Shared), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomHistoryVisibilityEventContent| c.history_visibility) @@ -276,7 +276,7 @@ impl Service { services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomName, "")? + .room_state_get(room_id, &StateEventType::RoomName, "")? .map_or(Ok(None), |s| { serde_json::from_str(s.content.get()) .map(|c: RoomNameEventContent| Some(c.name)) @@ -294,7 +294,7 @@ impl Service { services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomAvatar, "")? + .room_state_get(room_id, &StateEventType::RoomAvatar, "")? .map_or(Ok(None), |s| { serde_json::from_str(s.content.get()) .map_err(|_| Error::bad_database("Invalid room avatar event in database.")) @@ -309,7 +309,7 @@ impl Service { services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomMember, user_id.as_str())? + .room_state_get(room_id, &StateEventType::RoomMember, user_id.as_str())? .map_or(Ok(None), |s| { serde_json::from_str(s.content.get()) .map_err(|_| Error::bad_database("Invalid room member event in database.")) diff --git a/src/service/rooms/state_compressor/mod.rs b/src/service/rooms/state_compressor/mod.rs index d29b020b..b0ede3ee 100644 --- a/src/service/rooms/state_compressor/mod.rs +++ b/src/service/rooms/state_compressor/mod.rs @@ -164,7 +164,7 @@ impl Service { for removed in statediffremoved.iter() { if !parent_new.remove(removed) { // It was not added in the parent and we removed it - parent_removed.insert(removed.clone()); + parent_removed.insert(*removed); } // Else it was added in the parent and we removed it again. We can forget this change } @@ -172,7 +172,7 @@ impl Service { for new in statediffnew.iter() { if !parent_removed.remove(new) { // It was not touched in the parent and we added it - parent_new.insert(new.clone()); + parent_new.insert(*new); } // Else it was removed in the parent and we added it again. We can forget this change } @@ -217,7 +217,7 @@ impl Service { for removed in statediffremoved.iter() { if !parent_new.remove(removed) { // It was not added in the parent and we removed it - parent_removed.insert(removed.clone()); + parent_removed.insert(*removed); } // Else it was added in the parent and we removed it again. We can forget this change } @@ -225,7 +225,7 @@ impl Service { for new in statediffnew.iter() { if !parent_removed.remove(new) { // It was not touched in the parent and we added it - parent_new.insert(new.clone()); + parent_new.insert(*new); } // Else it was removed in the parent and we added it again. We can forget this change } diff --git a/src/service/rooms/threads/mod.rs b/src/service/rooms/threads/mod.rs index fb703839..c6193bc8 100644 --- a/src/service/rooms/threads/mod.rs +++ b/src/service/rooms/threads/mod.rs @@ -26,7 +26,7 @@ impl Service { self.db.threads_until(user_id, room_id, until, include) } - pub fn add_to_thread<'a>(&'a self, root_event_id: &EventId, pdu: &PduEvent) -> Result<()> { + pub fn add_to_thread(&self, root_event_id: &EventId, pdu: &PduEvent) -> Result<()> { let root_id = &services() .rooms .timeline @@ -103,7 +103,7 @@ impl Service { } let mut users = Vec::new(); - if let Some(userids) = self.db.get_participants(&root_id)? { + if let Some(userids) = self.db.get_participants(root_id)? { users.extend_from_slice(&userids); users.push(pdu.sender.clone()); } else { diff --git a/src/service/rooms/timeline/mod.rs b/src/service/rooms/timeline/mod.rs index bc8bf3ef..048ffe9a 100644 --- a/src/service/rooms/timeline/mod.rs +++ b/src/service/rooms/timeline/mod.rs @@ -58,8 +58,8 @@ impl PduCount { } pub fn try_from_string(token: &str) -> Result { - if token.starts_with('-') { - token[1..].parse().map(PduCount::Backfilled) + if let Some(stripped_token) = token.strip_prefix('-') { + stripped_token.parse().map(PduCount::Backfilled) } else { token.parse().map(PduCount::Normal) } @@ -90,18 +90,6 @@ impl Ord for PduCount { } } } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn comparisons() { - assert!(PduCount::Normal(1) < PduCount::Normal(2)); - assert!(PduCount::Backfilled(2) < PduCount::Backfilled(1)); - assert!(PduCount::Normal(1) > PduCount::Backfilled(1)); - assert!(PduCount::Backfilled(1) < PduCount::Normal(1)); - } -} pub struct Service { pub db: &'static dyn Data, @@ -112,7 +100,7 @@ pub struct Service { impl Service { #[tracing::instrument(skip(self))] pub fn first_pdu_in_room(&self, room_id: &RoomId) -> Result>> { - self.all_pdus(&user_id!("@doesntmatter:conduit.rs"), &room_id)? + self.all_pdus(user_id!("@doesntmatter:conduit.rs"), room_id)? .next() .map(|o| o.map(|(_, p)| Arc::new(p))) .transpose() @@ -475,7 +463,7 @@ impl Service { let to_conduit = body.starts_with(&format!("{server_user}: ")) || body.starts_with(&format!("{server_user} ")) || body == format!("{server_user}:") - || body == format!("{server_user}"); + || body == server_user; // This will evaluate to false if the emergency password is set up so that // the administrator can execute commands as conduit @@ -867,7 +855,7 @@ impl Service { .map_err(|_| Error::bad_database("Invalid content in pdu."))?; if content.membership == MembershipState::Leave { - if target == &server_user { + if target == server_user { warn!("Conduit user cannot leave from admins room"); return Err(Error::BadRequest( ErrorKind::Forbidden, @@ -893,7 +881,7 @@ impl Service { } if content.membership == MembershipState::Ban && pdu.state_key().is_some() { - if target == &server_user { + if target == server_user { warn!("Conduit user cannot be banned in admins room"); return Err(Error::BadRequest( ErrorKind::Forbidden, @@ -1067,7 +1055,7 @@ impl Service { #[tracing::instrument(skip(self, room_id))] pub async fn backfill_if_required(&self, room_id: &RoomId, from: PduCount) -> Result<()> { let first_pdu = self - .all_pdus(&user_id!("@doesntmatter:conduit.rs"), &room_id)? + .all_pdus(user_id!("@doesntmatter:conduit.rs"), room_id)? .next() .expect("Room is not empty")?; @@ -1079,7 +1067,7 @@ impl Service { let power_levels: RoomPowerLevelsEventContent = services() .rooms .state_accessor - .room_state_get(&room_id, &StateEventType::RoomPowerLevels, "")? + .room_state_get(room_id, &StateEventType::RoomPowerLevels, "")? .map(|ev| { serde_json::from_str(ev.content.get()) .map_err(|_| Error::bad_database("invalid m.room.power_levels event")) @@ -1110,11 +1098,9 @@ impl Service { .await; match response { Ok(response) => { - let mut pub_key_map = RwLock::new(BTreeMap::new()); + let pub_key_map = RwLock::new(BTreeMap::new()); for pdu in response.pdus { - if let Err(e) = self - .backfill_pdu(backfill_server, pdu, &mut pub_key_map) - .await + if let Err(e) = self.backfill_pdu(backfill_server, pdu, &pub_key_map).await { warn!("Failed to add backfilled pdu: {e}"); } @@ -1161,13 +1147,13 @@ impl Service { services() .rooms .event_handler - .fetch_required_signing_keys([&value], &pub_key_map) + .fetch_required_signing_keys([&value], pub_key_map) .await?; services() .rooms .event_handler - .handle_incoming_pdu(origin, &event_id, &room_id, value, false, &pub_key_map) + .handle_incoming_pdu(origin, &event_id, &room_id, value, false, pub_key_map) .await?; let value = self.get_pdu_json(&event_id)?.expect("We just created it"); @@ -1200,24 +1186,21 @@ impl Service { drop(insert_lock); - match pdu.kind { - TimelineEventType::RoomMessage => { - #[derive(Deserialize)] - struct ExtractBody { - body: Option, - } - - let content = serde_json::from_str::(pdu.content.get()) - .map_err(|_| Error::bad_database("Invalid content in pdu."))?; - - if let Some(body) = content.body { - services() - .rooms - .search - .index_pdu(shortroomid, &pdu_id, &body)?; - } + if pdu.kind == TimelineEventType::RoomMessage { + #[derive(Deserialize)] + struct ExtractBody { + body: Option, + } + + let content = serde_json::from_str::(pdu.content.get()) + .map_err(|_| Error::bad_database("Invalid content in pdu."))?; + + if let Some(body) = content.body { + services() + .rooms + .search + .index_pdu(shortroomid, &pdu_id, &body)?; } - _ => {} } drop(mutex_lock); @@ -1225,3 +1208,15 @@ impl Service { Ok(()) } } +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn comparisons() { + assert!(PduCount::Normal(1) < PduCount::Normal(2)); + assert!(PduCount::Backfilled(2) < PduCount::Backfilled(1)); + assert!(PduCount::Normal(1) > PduCount::Backfilled(1)); + assert!(PduCount::Backfilled(1) < PduCount::Normal(1)); + } +} diff --git a/src/service/sending/mod.rs b/src/service/sending/mod.rs index a5389de3..f929991c 100644 --- a/src/service/sending/mod.rs +++ b/src/service/sending/mod.rs @@ -132,7 +132,7 @@ impl Service { for (key, outgoing_kind, event) in self.db.active_requests().filter_map(|r| r.ok()) { let entry = initial_transactions .entry(outgoing_kind.clone()) - .or_insert_with(Vec::new); + .or_default(); if entry.len() > 30 { warn!( diff --git a/src/service/users/mod.rs b/src/service/users/mod.rs index 6faa6d8e..6299b9ea 100644 --- a/src/service/users/mod.rs +++ b/src/service/users/mod.rs @@ -139,10 +139,10 @@ impl Service { cached .subscriptions - .extend(request.room_subscriptions.clone().into_iter()); + .extend(request.room_subscriptions.clone()); request .room_subscriptions - .extend(cached.subscriptions.clone().into_iter()); + .extend(cached.subscriptions.clone()); request.extensions.e2ee.enabled = request .extensions