factor server_name change check into a reusable fn

This commit is contained in:
Charles Hall 2024-09-24 19:46:21 -07:00
parent c2c6083277
commit 1fd20cdeba
No known key found for this signature in database
GPG key ID: 7B8E0645816E07CF
3 changed files with 42 additions and 9 deletions

View file

@ -84,15 +84,7 @@ pub(crate) async fn run(args: ServeArgs) -> Result<(), error::ServeCommand> {
.map_err(Error::InitializeServices)?,
)));
// Matrix resource ownership is based on the server name; changing it
// requires recreating the database from scratch. This check needs to be
// done before background tasks are started to avoid data races.
if services().users.count().map(|x| x > 0).map_err(Error::NonZeroUsers)? {
let admin_bot = services().globals.admin_bot_user_id.as_ref();
if !services().users.exists(admin_bot).map_err(Error::AdminBotExists)? {
return Err(Error::Renamed);
}
}
services().globals.err_if_server_name_changed()?;
db.apply_migrations().await.map_err(Error::DatabaseError)?;

View file

@ -65,6 +65,16 @@ pub(crate) enum ServeCommand {
#[error("failed to initialize services")]
InitializeServices(#[source] crate::utils::error::Error),
#[error("`server_name` change check failed")]
ServerNameChanged(#[from] ServerNameChanged),
}
/// Error generated if `server_name` has changed or if checking this failed
// Missing docs are allowed here since that kind of information should be
// encoded in the error messages themselves anyway.
#[allow(missing_docs)]
#[derive(Error, Debug)]
pub(crate) enum ServerNameChanged {
#[error("failed to check if there are any users")]
NonZeroUsers(#[source] crate::utils::error::Error),

View file

@ -305,6 +305,37 @@ impl Service {
Ok(s)
}
/// Check if `server_name` in the DB and config differ, return error if so
///
/// Matrix resource ownership is based on the server name; changing it
/// requires recreating the database from scratch. This check needs to be
/// done before background tasks are started to avoid data races.
// Allowed because this function calls `services()`
#[allow(clippy::unused_self)]
pub(crate) fn err_if_server_name_changed(
&self,
) -> Result<(), crate::error::ServerNameChanged> {
use crate::error::ServerNameChanged as Error;
if services()
.users
.count()
.map(|x| x > 0)
.map_err(Error::NonZeroUsers)?
{
let admin_bot = self.admin_bot_user_id.as_ref();
if !services()
.users
.exists(admin_bot)
.map_err(Error::AdminBotExists)?
{
return Err(Error::Renamed);
}
}
Ok(())
}
/// Returns this server's keypair.
pub(crate) fn keypair(&self) -> &ruma::signatures::Ed25519KeyPair {
&self.keypair