mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 15:51:23 +01:00
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:
parent
9087da91db
commit
95a24c761d
2 changed files with 42 additions and 76 deletions
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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())),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue