Support matching room_id as publicrooms search term.
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -33,7 +33,7 @@ use tuwunel_core::{
|
|||||||
TryFutureExtExt,
|
TryFutureExtExt,
|
||||||
math::Expected,
|
math::Expected,
|
||||||
result::FlatOk,
|
result::FlatOk,
|
||||||
stream::{ReadyExt, WidebandExt},
|
stream::{IterStream, ReadyExt, WidebandExt},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use tuwunel_service::Services;
|
use tuwunel_service::Services;
|
||||||
@@ -284,32 +284,62 @@ pub(crate) async fn get_public_rooms_filtered_helper(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let search_term = filter
|
||||||
|
.generic_search_term
|
||||||
|
.as_deref()
|
||||||
|
.map(str::to_lowercase);
|
||||||
|
|
||||||
|
let search_room_id = filter
|
||||||
|
.generic_search_term
|
||||||
|
.as_deref()
|
||||||
|
.filter(|_| services.config.allow_public_room_search_by_id)
|
||||||
|
.filter(|s| s.starts_with('!'))
|
||||||
|
.filter(|s| s.len() > 5); // require some characters to limit scope.
|
||||||
|
|
||||||
|
let meta_public_rooms = search_room_id
|
||||||
|
.filter(|_| services.config.allow_unlisted_room_search_by_id)
|
||||||
|
.map(|prefix| services.rooms.metadata.public_ids_prefix(prefix))
|
||||||
|
.into_iter()
|
||||||
|
.stream()
|
||||||
|
.flatten();
|
||||||
|
|
||||||
let mut all_rooms: Vec<PublicRoomsChunk> = services
|
let mut all_rooms: Vec<PublicRoomsChunk> = services
|
||||||
.rooms
|
.rooms
|
||||||
.directory
|
.directory
|
||||||
.public_rooms()
|
.public_rooms()
|
||||||
.map(ToOwned::to_owned)
|
.map(ToOwned::to_owned)
|
||||||
|
.chain(meta_public_rooms)
|
||||||
.wide_then(|room_id| public_rooms_chunk(services, room_id))
|
.wide_then(|room_id| public_rooms_chunk(services, room_id))
|
||||||
.ready_filter_map(|chunk| {
|
.ready_filter_map(|chunk| {
|
||||||
if !filter.room_types.is_empty() && !filter.room_types.contains(&RoomTypeFilter::from(chunk.room_type.clone())) {
|
if !filter.room_types.is_empty()
|
||||||
|
&& !filter
|
||||||
|
.room_types
|
||||||
|
.contains(&RoomTypeFilter::from(chunk.room_type.clone()))
|
||||||
|
{
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(query) = filter.generic_search_term.as_ref().map(|q| q.to_lowercase()) {
|
if let Some(query) = search_room_id {
|
||||||
|
if chunk.room_id.as_str().contains(query) {
|
||||||
|
return Some(chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(query) = search_term.as_deref() {
|
||||||
if let Some(name) = &chunk.name {
|
if let Some(name) = &chunk.name {
|
||||||
if name.as_str().to_lowercase().contains(&query) {
|
if name.as_str().to_lowercase().contains(query) {
|
||||||
return Some(chunk);
|
return Some(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(topic) = &chunk.topic {
|
if let Some(topic) = &chunk.topic {
|
||||||
if topic.to_lowercase().contains(&query) {
|
if topic.to_lowercase().contains(query) {
|
||||||
return Some(chunk);
|
return Some(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(canonical_alias) = &chunk.canonical_alias {
|
if let Some(canonical_alias) = &chunk.canonical_alias {
|
||||||
if canonical_alias.as_str().to_lowercase().contains(&query) {
|
if canonical_alias.as_str().to_lowercase().contains(query) {
|
||||||
return Some(chunk);
|
return Some(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -598,6 +598,26 @@ pub struct Config {
|
|||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub allow_public_room_directory_without_auth: bool,
|
pub allow_public_room_directory_without_auth: bool,
|
||||||
|
|
||||||
|
/// Allows room directory searches to match on partial room_id's when the
|
||||||
|
/// search term starts with '!'.
|
||||||
|
///
|
||||||
|
/// default: true
|
||||||
|
#[serde(default = "true_fn")]
|
||||||
|
pub allow_public_room_search_by_id: bool,
|
||||||
|
|
||||||
|
/// Set this to false to limit results of rooms when searching by ID to
|
||||||
|
/// those that would be found by an alias or other query; specifically
|
||||||
|
/// those listed in the public rooms directory. By default this is set to
|
||||||
|
/// true allowing any joinable room to match. This satisfies the Principle
|
||||||
|
/// of Least Expectation when pasting a room_id into a search box with
|
||||||
|
/// intent to join; many rooms simply opt-out of public listings. Therefor
|
||||||
|
/// to prevent this feature from abuse, knowledge of several characters of
|
||||||
|
/// the room_id is required before any results are returned.
|
||||||
|
///
|
||||||
|
/// default: true
|
||||||
|
#[serde(default = "true_fn")]
|
||||||
|
pub allow_unlisted_room_search_by_id: bool,
|
||||||
|
|
||||||
/// Allow guests/unauthenticated users to access TURN credentials.
|
/// Allow guests/unauthenticated users to access TURN credentials.
|
||||||
///
|
///
|
||||||
/// This is the equivalent of Synapse's `turn_allow_guests` config option.
|
/// This is the equivalent of Synapse's `turn_allow_guests` config option.
|
||||||
|
|||||||
@@ -473,6 +473,22 @@
|
|||||||
#
|
#
|
||||||
#allow_public_room_directory_without_auth = false
|
#allow_public_room_directory_without_auth = false
|
||||||
|
|
||||||
|
# Allows room directory searches to match on partial room_id's when the
|
||||||
|
# search term starts with '!'.
|
||||||
|
#
|
||||||
|
#allow_public_room_search_by_id = true
|
||||||
|
|
||||||
|
# Set this to false to limit results of rooms when searching by ID to
|
||||||
|
# those that would be found by an alias or other query; specifically
|
||||||
|
# those listed in the public rooms directory. By default this is set to
|
||||||
|
# true allowing any joinable room to match. This satisfies the Principle
|
||||||
|
# of Least Expectation when pasting a room_id into a search box with
|
||||||
|
# intent to join; many rooms simply opt-out of public listings. Therefor
|
||||||
|
# to prevent this feature from abuse, knowledge of several characters of
|
||||||
|
# the room_id is required before any results are returned.
|
||||||
|
#
|
||||||
|
#allow_unlisted_room_search_by_id = true
|
||||||
|
|
||||||
# Allow guests/unauthenticated users to access TURN credentials.
|
# Allow guests/unauthenticated users to access TURN credentials.
|
||||||
#
|
#
|
||||||
# This is the equivalent of Synapse's `turn_allow_guests` config option.
|
# This is the equivalent of Synapse's `turn_allow_guests` config option.
|
||||||
|
|||||||
Reference in New Issue
Block a user