- serde-yml has an un-addressed [security issue][sec-issue] - [saphyr][saphyr] is a pretty recent and active crate that deals with YAML parsing - based on that, someone recently created [serde-saphyr][serde-saphyr] --- The change was pretty straightforward and mostly "just a search and replace". The new crate has it's `Error` type split into serialization and derserialization errors. Hence I created one Continuwuity-Error variant for each instead of just having a single `Yaml` variant. This was already done previously with the `Toml` errors so I thought this would be rather acceptable. [sec-issue]: https://github.com/advisories/GHSA-gfxp-f68g-8x78 [saphyr]: https://github.com/saphyr-rs/saphyr [serde-saphyr]: https://github.com/saphyr-rs/saphyr/issues/66#issuecomment-3353212289
80 lines
2.1 KiB
Rust
80 lines
2.1 KiB
Rust
use conduwuit::{Err, Result, checked};
|
|
use futures::{FutureExt, StreamExt, TryFutureExt};
|
|
|
|
use crate::admin_command;
|
|
|
|
#[admin_command]
|
|
pub(super) async fn register(&self) -> Result {
|
|
let body = &self.body;
|
|
let body_len = self.body.len();
|
|
if body_len < 2
|
|
|| !body[0].trim().starts_with("```")
|
|
|| body.last().unwrap_or(&"").trim() != "```"
|
|
{
|
|
return Err!("Expected code block in command body. Add --help for details.");
|
|
}
|
|
|
|
let range = 1..checked!(body_len - 1)?;
|
|
let appservice_config_body = body[range].join("\n");
|
|
let parsed_config = serde_saphyr::from_str(&appservice_config_body);
|
|
match parsed_config {
|
|
| Err(e) => return Err!("Could not parse appservice config as YAML: {e}"),
|
|
| Ok(registration) => match self
|
|
.services
|
|
.appservice
|
|
.register_appservice(®istration, &appservice_config_body)
|
|
.await
|
|
.map(|()| registration.id)
|
|
{
|
|
| Err(e) => return Err!("Failed to register appservice: {e}"),
|
|
| Ok(id) => write!(self, "Appservice registered with ID: {id}"),
|
|
},
|
|
}
|
|
.await
|
|
}
|
|
|
|
#[admin_command]
|
|
pub(super) async fn unregister(&self, appservice_identifier: String) -> Result {
|
|
match self
|
|
.services
|
|
.appservice
|
|
.unregister_appservice(&appservice_identifier)
|
|
.await
|
|
{
|
|
| Err(e) => return Err!("Failed to unregister appservice: {e}"),
|
|
| Ok(()) => write!(self, "Appservice unregistered."),
|
|
}
|
|
.await
|
|
}
|
|
|
|
#[admin_command]
|
|
pub(super) async fn show_appservice_config(&self, appservice_identifier: String) -> Result {
|
|
match self
|
|
.services
|
|
.appservice
|
|
.get_registration(&appservice_identifier)
|
|
.await
|
|
{
|
|
| None => return Err!("Appservice does not exist."),
|
|
| Some(config) => {
|
|
let config_str = serde_saphyr::to_string(&config)?;
|
|
write!(self, "Config for {appservice_identifier}:\n\n```yaml\n{config_str}\n```")
|
|
},
|
|
}
|
|
.await
|
|
}
|
|
|
|
#[admin_command]
|
|
pub(super) async fn list_registered(&self) -> Result {
|
|
self.services
|
|
.appservice
|
|
.iter_ids()
|
|
.collect()
|
|
.map(Ok)
|
|
.and_then(|appservices: Vec<_>| {
|
|
let len = appservices.len();
|
|
let list = appservices.join(", ");
|
|
write!(self, "Appservices ({len}): {list}")
|
|
})
|
|
.await
|
|
}
|