Check appservice registrations for unique as_token. (#72)
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
mod namespace_regex;
|
mod namespace_regex;
|
||||||
mod registration_info;
|
mod registration_info;
|
||||||
|
|
||||||
use std::{collections::BTreeMap, iter::IntoIterator, sync::Arc};
|
use std::{
|
||||||
|
collections::{BTreeMap, HashSet},
|
||||||
|
iter::IntoIterator,
|
||||||
|
sync::Arc,
|
||||||
|
};
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use futures::{Future, FutureExt, Stream, StreamExt, TryStreamExt};
|
use futures::{Future, FutureExt, Stream, StreamExt, TryStreamExt};
|
||||||
@@ -47,6 +51,7 @@ impl crate::Service for Service {
|
|||||||
|
|
||||||
async fn worker(self: Arc<Self>) -> Result {
|
async fn worker(self: Arc<Self>) -> Result {
|
||||||
self.init_registrations().await?;
|
self.init_registrations().await?;
|
||||||
|
self.check_registrations().await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -88,6 +93,25 @@ impl Service {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(name = "check", skip(self))]
|
||||||
|
async fn check_registrations(&self) -> Result {
|
||||||
|
let regs = self.registration_info.read().await;
|
||||||
|
|
||||||
|
let num_as_tokens = regs
|
||||||
|
.values()
|
||||||
|
.map(|info| &info.registration.as_token)
|
||||||
|
.collect::<HashSet<_>>()
|
||||||
|
.len();
|
||||||
|
|
||||||
|
if num_as_tokens < regs.len() {
|
||||||
|
return Err!(
|
||||||
|
"Conflicting Appservice registrations: each must have a unique as_token."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Registers an appservice and returns the ID to the caller
|
/// Registers an appservice and returns the ID to the caller
|
||||||
pub async fn register_appservice(
|
pub async fn register_appservice(
|
||||||
&self,
|
&self,
|
||||||
|
|||||||
Reference in New Issue
Block a user