mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 07:41:23 +01:00
factor server_name change check into a reusable fn
This commit is contained in:
parent
c2c6083277
commit
1fd20cdeba
3 changed files with 42 additions and 9 deletions
|
|
@ -84,15 +84,7 @@ pub(crate) async fn run(args: ServeArgs) -> Result<(), error::ServeCommand> {
|
||||||
.map_err(Error::InitializeServices)?,
|
.map_err(Error::InitializeServices)?,
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// Matrix resource ownership is based on the server name; changing it
|
services().globals.err_if_server_name_changed()?;
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
db.apply_migrations().await.map_err(Error::DatabaseError)?;
|
db.apply_migrations().await.map_err(Error::DatabaseError)?;
|
||||||
|
|
||||||
|
|
|
||||||
10
src/error.rs
10
src/error.rs
|
|
@ -65,6 +65,16 @@ pub(crate) enum ServeCommand {
|
||||||
#[error("failed to initialize services")]
|
#[error("failed to initialize services")]
|
||||||
InitializeServices(#[source] crate::utils::error::Error),
|
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")]
|
#[error("failed to check if there are any users")]
|
||||||
NonZeroUsers(#[source] crate::utils::error::Error),
|
NonZeroUsers(#[source] crate::utils::error::Error),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -305,6 +305,37 @@ impl Service {
|
||||||
Ok(s)
|
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.
|
/// Returns this server's keypair.
|
||||||
pub(crate) fn keypair(&self) -> &ruma::signatures::Ed25519KeyPair {
|
pub(crate) fn keypair(&self) -> &ruma::signatures::Ed25519KeyPair {
|
||||||
&self.keypair
|
&self.keypair
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue