Files
continuwuity/src/service/emergency/mod.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

104 lines
2.6 KiB
Rust
Raw Normal View History

2024-07-18 06:37:47 +00:00
use std::sync::Arc;
use async_trait::async_trait;
use conduwuit::{Result, error, warn};
2024-07-18 06:37:47 +00:00
use ruma::{
events::{
GlobalAccountDataEvent, GlobalAccountDataEventType, push_rules::PushRulesEventContent,
},
2024-07-18 06:37:47 +00:00
push::Ruleset,
};
use crate::{
Dep, account_data, config, globals,
users::{self, HashedPassword},
};
2024-07-18 06:37:47 +00:00
pub struct Service {
services: Services,
}
struct Services {
account_data: Dep<account_data::Service>,
config: Dep<config::Service>,
2024-07-18 06:37:47 +00:00
globals: Dep<globals::Service>,
users: Dep<users::Service>,
}
#[async_trait]
impl crate::Service for Service {
fn build(args: crate::Args<'_>) -> Result<Arc<Self>> {
Ok(Arc::new(Self {
services: Services {
account_data: args.depend::<account_data::Service>("account_data"),
config: args.depend::<config::Service>("config"),
2024-07-18 06:37:47 +00:00
globals: args.depend::<globals::Service>("globals"),
users: args.depend::<users::Service>("users"),
},
}))
}
async fn worker(self: Arc<Self>) -> Result {
self.set_emergency_access().await.inspect_err(|e| {
error!("Could not set the configured emergency password for the server user: {e}");
})
2024-07-18 06:37:47 +00:00
}
fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
}
impl Service {
2024-12-14 21:58:01 -05:00
/// Sets the emergency password and push rules for the server user account
/// in case emergency password is set
async fn set_emergency_access(&self) -> Result {
2024-12-14 21:58:01 -05:00
let server_user = &self.services.globals.server_user;
2024-07-18 06:37:47 +00:00
match &self.services.config.emergency_password {
| Some(emergency_password) => {
let emergency_password = HashedPassword::new(emergency_password)?;
self.services
.users
.convert_to_local_account(server_user, emergency_password)
.await?;
},
| None => {
self.services
.users
.convert_to_shadow_account(server_user)
.await?;
},
}
2024-07-18 06:37:47 +00:00
let (ruleset, pwd_set) = match self.services.config.emergency_password {
| Some(_) => (Ruleset::server_default(server_user), true),
| None => (Ruleset::new(), false),
2024-07-18 06:37:47 +00:00
};
2024-08-08 17:18:30 +00:00
self.services
.account_data
.update(
None,
2024-12-14 21:58:01 -05:00
server_user,
2024-08-08 17:18:30 +00:00
GlobalAccountDataEventType::PushRules.to_string().into(),
2026-04-13 17:31:52 -04:00
&serde_json::to_value(GlobalAccountDataEvent::new(PushRulesEventContent::new(
ruleset,
)))
2024-08-08 17:18:30 +00:00
.expect("to json value always works"),
)
.await?;
2024-07-18 06:37:47 +00:00
if pwd_set {
warn!(
"The server account emergency password is set! Please unset it as soon as you \
finish admin account recovery! You will be logged out of the server service \
account when you finish."
2024-07-18 06:37:47 +00:00
);
Ok(())
2024-07-18 06:37:47 +00:00
} else {
// logs out any users still in the server service account and removes sessions
self.services.users.deactivate_account(server_user).await
2024-07-18 06:37:47 +00:00
}
}
}