diff --git a/src/client_server/account.rs b/src/client_server/account.rs index fe5ac97..9837d1b 100644 --- a/src/client_server/account.rs +++ b/src/client_server/account.rs @@ -145,7 +145,10 @@ pub fn register_route( } if missing_username { - return Err(Error::BadRequest(ErrorKind::MissingParam, "Missing username field.")); + return Err(Error::BadRequest( + ErrorKind::MissingParam, + "Missing username field.", + )); } let password = if is_guest { diff --git a/src/database/rooms.rs b/src/database/rooms.rs index 767f581..d2cd5e9 100644 --- a/src/database/rooms.rs +++ b/src/database/rooms.rs @@ -965,6 +965,7 @@ impl Rooms { self.tokenids .scan_prefix(&prefix2) .keys() + .rev() // Newest pdus first .filter_map(|r| r.ok()) .map(|key| { let pduid_index = key @@ -983,7 +984,14 @@ impl Rooms { .filter_map(|r| r.ok()) }); - Ok((utils::common_elements(iterators).unwrap(), words)) + Ok(( + utils::common_elements(iterators, |a, b| { + // We compare b with a because we reversed the iterator earlier + b.cmp(a) + }) + .unwrap(), + words, + )) } pub fn get_shared_rooms<'a>( @@ -1015,7 +1023,8 @@ impl Rooms { .filter_map(|r| r.ok()) }); - utils::common_elements(iterators) + // We use the default compare function because keys are sorted correctly (not reversed) + utils::common_elements(iterators, Ord::cmp) .expect("users is not empty") .map(|bytes| { RoomId::try_from(utils::string_from_bytes(&*bytes).map_err(|_| { diff --git a/src/utils.rs b/src/utils.rs index 473c18f..8cf1b2c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,7 +1,9 @@ use argon2::{Config, Variant}; +use cmp::Ordering; use rand::prelude::*; use sled::IVec; use std::{ + cmp, convert::TryInto, time::{SystemTime, UNIX_EPOCH}, }; @@ -63,6 +65,7 @@ pub fn calculate_hash(password: &str) -> Result { pub fn common_elements( mut iterators: impl Iterator>, + check_order: impl Fn(&IVec, &IVec) -> Ordering, ) -> Option> { let first_iterator = iterators.next()?; let mut other_iterators = iterators.map(|i| i.peekable()).collect::>(); @@ -72,12 +75,13 @@ pub fn common_elements( .iter_mut() .map(|it| { while let Some(element) = it.peek() { - if element > target { - return false; - } else if element == target { - return true; - } else { - it.next(); + match check_order(element, target) { + Ordering::Greater => return false, // We went too far + Ordering::Equal => return true, // Element is in both iters + Ordering::Less => { + // Keep searching + it.next(); + } } }