create admin bot user id once and reuse it

This way we don't need to remember to do the conditional everywhere.
This commit is contained in:
Charles Hall 2024-06-12 16:07:47 -07:00
parent 9087da91db
commit 95a24c761d
No known key found for this signature in database
GPG key ID: 7B8E0645816E07CF
2 changed files with 42 additions and 76 deletions

View file

@ -231,16 +231,6 @@ impl Service {
let self2 = Arc::clone(self); let self2 = Arc::clone(self);
tokio::spawn(async move { tokio::spawn(async move {
let mut receiver = self2.receiver.lock().await; let mut receiver = self2.receiver.lock().await;
let grapevine_user = UserId::parse(format!(
"@{}:{}",
if services().globals.config.conduit_compat {
"conduit"
} else {
"grapevine"
},
services().globals.server_name()
))
.expect("admin bot username should be valid");
let Ok(Some(grapevine_room)) = services().admin.get_admin_room() let Ok(Some(grapevine_room)) = services().admin.get_admin_room()
else { else {
@ -253,23 +243,16 @@ impl Service {
.await .await
.expect("admin command channel has been closed"); .expect("admin command channel has been closed");
Self::handle_event( Self::handle_event(&self2, event, &grapevine_room).await;
&self2,
event,
&grapevine_room,
&grapevine_user,
)
.await;
} }
}); });
} }
#[tracing::instrument(skip(self, grapevine_room, grapevine_user))] #[tracing::instrument(skip(self, grapevine_room))]
async fn handle_event( async fn handle_event(
&self, &self,
event: AdminRoomEvent, event: AdminRoomEvent,
grapevine_room: &OwnedRoomId, grapevine_room: &OwnedRoomId,
grapevine_user: &ruma::OwnedUserId,
) { ) {
let message_content = match event { let message_content = match event {
AdminRoomEvent::SendMessage(content) => content, AdminRoomEvent::SendMessage(content) => content,
@ -302,7 +285,7 @@ impl Service {
state_key: None, state_key: None,
redacts: None, redacts: None,
}, },
grapevine_user, &services().globals.admin_bot_user_id,
grapevine_room, grapevine_room,
&state_lock, &state_lock,
) )
@ -716,16 +699,7 @@ impl Service {
// Check if the specified user is valid // Check if the specified user is valid
if !services().users.exists(&user_id)? if !services().users.exists(&user_id)?
|| user_id || user_id == services().globals.admin_bot_user_id
== UserId::parse_with_server_name(
if services().globals.config.conduit_compat {
"conduit"
} else {
"grapevine"
},
services().globals.server_name(),
)
.expect("grapevine user exists")
{ {
return Ok(RoomMessageEventContent::text_plain( return Ok(RoomMessageEventContent::text_plain(
"The specified user does not exist!", "The specified user does not exist!",
@ -1133,11 +1107,7 @@ impl Service {
fn usage_to_html(text: &str, server_name: &ServerName) -> String { fn usage_to_html(text: &str, server_name: &ServerName) -> String {
// Replace `@grapevine:servername:-subcmdname` with // Replace `@grapevine:servername:-subcmdname` with
// `@grapevine:servername: subcmdname` // `@grapevine:servername: subcmdname`
let localpart = if services().globals.config.conduit_compat { let localpart = services().globals.admin_bot_user_id.localpart();
"conduit"
} else {
"grapevine"
};
let text = text.replace( let text = text.replace(
&format!("@{localpart}:{server_name}:-"), &format!("@{localpart}:{server_name}:-"),
@ -1231,19 +1201,7 @@ impl Service {
); );
let state_lock = mutex_state.lock().await; let state_lock = mutex_state.lock().await;
// Create a user for the server services().users.create(&services().globals.admin_bot_user_id, None)?;
let grapevine_user = UserId::parse(format!(
"@{}:{}",
if services().globals.config.conduit_compat {
"conduit"
} else {
"grapevine"
},
services().globals.server_name()
))
.expect("admin bot username should be valid");
services().users.create(&grapevine_user, None)?;
let room_version = services().globals.default_room_version(); let room_version = services().globals.default_room_version();
let mut content = match room_version { let mut content = match room_version {
@ -1256,9 +1214,9 @@ impl Service {
| RoomVersionId::V7 | RoomVersionId::V7
| RoomVersionId::V8 | RoomVersionId::V8
| RoomVersionId::V9 | RoomVersionId::V9
| RoomVersionId::V10 => { | RoomVersionId::V10 => RoomCreateEventContent::new_v1(
RoomCreateEventContent::new_v1(grapevine_user.clone()) services().globals.admin_bot_user_id.clone(),
} ),
RoomVersionId::V11 => RoomCreateEventContent::new_v11(), RoomVersionId::V11 => RoomCreateEventContent::new_v11(),
_ => unreachable!("Validity of room version already checked"), _ => unreachable!("Validity of room version already checked"),
}; };
@ -1279,7 +1237,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1304,10 +1262,12 @@ impl Service {
}) })
.expect("event is valid, we just created it"), .expect("event is valid, we just created it"),
unsigned: None, unsigned: None,
state_key: Some(grapevine_user.to_string()), state_key: Some(
services().globals.admin_bot_user_id.to_string(),
),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1315,7 +1275,7 @@ impl Service {
// 3. Power levels // 3. Power levels
let mut users = BTreeMap::new(); let mut users = BTreeMap::new();
users.insert(grapevine_user.clone(), 100.into()); users.insert(services().globals.admin_bot_user_id.clone(), 100.into());
services() services()
.rooms .rooms
@ -1332,7 +1292,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1353,7 +1313,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1376,7 +1336,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1397,7 +1357,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1420,7 +1380,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1443,7 +1403,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1470,7 +1430,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1518,16 +1478,6 @@ impl Service {
let state_lock = mutex_state.lock().await; let state_lock = mutex_state.lock().await;
// Use the server user to grant the new admin's power level // Use the server user to grant the new admin's power level
let grapevine_user = UserId::parse_with_server_name(
if services().globals.config.conduit_compat {
"conduit"
} else {
"grapevine"
},
services().globals.server_name(),
)
.expect("admin bot username should be valid");
// Invite and join the real user // Invite and join the real user
services() services()
.rooms .rooms
@ -1550,7 +1500,7 @@ impl Service {
state_key: Some(user_id.to_string()), state_key: Some(user_id.to_string()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )
@ -1584,7 +1534,10 @@ impl Service {
// Set power level // Set power level
let mut users = BTreeMap::new(); let mut users = BTreeMap::new();
users.insert(grapevine_user.clone(), 100.into()); users.insert(
services().globals.admin_bot_user_id.clone(),
100.into(),
);
users.insert(user_id.to_owned(), 100.into()); users.insert(user_id.to_owned(), 100.into());
services() services()
@ -1602,7 +1555,7 @@ impl Service {
state_key: Some(String::new()), state_key: Some(String::new()),
redacts: None, redacts: None,
}, },
&grapevine_user, &services().globals.admin_bot_user_id,
&room_id, &room_id,
&state_lock, &state_lock,
) )

View file

@ -25,7 +25,7 @@ use reqwest::dns::{Addrs, Name, Resolve, Resolving};
use ruma::{ use ruma::{
api::federation::discovery::ServerSigningKeys, serde::Base64, DeviceId, api::federation::discovery::ServerSigningKeys, serde::Base64, DeviceId,
MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedServerName, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedServerName,
RoomVersionId, ServerName, UserId, OwnedUserId, RoomVersionId, ServerName, UserId,
}; };
use tokio::sync::{broadcast, Mutex, RwLock, Semaphore}; use tokio::sync::{broadcast, Mutex, RwLock, Semaphore};
use tracing::{error, info, Instrument}; use tracing::{error, info, Instrument};
@ -52,6 +52,7 @@ pub(crate) struct Service {
default_client: reqwest::Client, default_client: reqwest::Client,
pub(crate) stable_room_versions: Vec<RoomVersionId>, pub(crate) stable_room_versions: Vec<RoomVersionId>,
pub(crate) unstable_room_versions: Vec<RoomVersionId>, pub(crate) unstable_room_versions: Vec<RoomVersionId>,
pub(crate) admin_bot_user_id: OwnedUserId,
pub(crate) bad_event_ratelimiter: pub(crate) bad_event_ratelimiter:
Arc<RwLock<HashMap<OwnedEventId, RateLimitState>>>, Arc<RwLock<HashMap<OwnedEventId, RateLimitState>>>,
pub(crate) bad_signature_ratelimiter: pub(crate) bad_signature_ratelimiter:
@ -206,6 +207,17 @@ impl Service {
let unstable_room_versions = let unstable_room_versions =
vec![RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5]; vec![RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5];
let admin_bot_user_id = UserId::parse(format!(
"@{}:{}",
if config.conduit_compat {
"conduit"
} else {
"grapevine"
},
config.server_name,
))
.expect("admin bot user ID should be valid");
let mut s = Self { let mut s = Self {
db, db,
config, config,
@ -231,6 +243,7 @@ impl Service {
jwt_decoding_key, jwt_decoding_key,
stable_room_versions, stable_room_versions,
unstable_room_versions, unstable_room_versions,
admin_bot_user_id,
bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())), bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())),
bad_signature_ratelimiter: Arc::new(RwLock::new(HashMap::new())), bad_signature_ratelimiter: Arc::new(RwLock::new(HashMap::new())),
bad_query_ratelimiter: Arc::new(RwLock::new(HashMap::new())), bad_query_ratelimiter: Arc::new(RwLock::new(HashMap::new())),