make registration tokens reloadable, and allow configuring multiple
Signed-off-by: morguldir <morguldir@protonmail.com>
This commit is contained in:
parent
69837671bb
commit
f698254c41
4 changed files with 41 additions and 19 deletions
|
@ -406,8 +406,9 @@
|
||||||
#
|
#
|
||||||
#registration_token =
|
#registration_token =
|
||||||
|
|
||||||
# Path to a file on the system that gets read for the registration token.
|
# Path to a file on the system that gets read for additional registration
|
||||||
# this config option takes precedence/priority over "registration_token".
|
# tokens. Multiple tokens can be added if you separate them with
|
||||||
|
# whitespace
|
||||||
#
|
#
|
||||||
# conduwuit must be able to access the file, and it must not be empty
|
# conduwuit must be able to access the file, and it must not be empty
|
||||||
#
|
#
|
||||||
|
|
|
@ -72,7 +72,7 @@ pub(super) async fn reprocess(
|
||||||
))),
|
))),
|
||||||
};
|
};
|
||||||
match command {
|
match command {
|
||||||
| RoomAliasCommand::Set { force, room_id, .. } =>
|
| RoomAliasCommand::Set { force, room_id, .. } => {
|
||||||
match (force, services.rooms.alias.resolve_local_alias(&room_alias).await) {
|
match (force, services.rooms.alias.resolve_local_alias(&room_alias).await) {
|
||||||
| (true, Ok(id)) => {
|
| (true, Ok(id)) => {
|
||||||
match services.rooms.alias.set_alias(
|
match services.rooms.alias.set_alias(
|
||||||
|
@ -106,8 +106,9 @@ pub(super) async fn reprocess(
|
||||||
))),
|
))),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
| RoomAliasCommand::Remove { .. } =>
|
},
|
||||||
|
| RoomAliasCommand::Remove { .. } => {
|
||||||
match services.rooms.alias.resolve_local_alias(&room_alias).await {
|
match services.rooms.alias.resolve_local_alias(&room_alias).await {
|
||||||
| Ok(id) => match services
|
| Ok(id) => match services
|
||||||
.rooms
|
.rooms
|
||||||
|
@ -124,15 +125,17 @@ pub(super) async fn reprocess(
|
||||||
},
|
},
|
||||||
| Err(_) =>
|
| Err(_) =>
|
||||||
Ok(RoomMessageEventContent::text_plain("Alias isn't in use.")),
|
Ok(RoomMessageEventContent::text_plain("Alias isn't in use.")),
|
||||||
},
|
}
|
||||||
| RoomAliasCommand::Which { .. } =>
|
},
|
||||||
|
| RoomAliasCommand::Which { .. } => {
|
||||||
match services.rooms.alias.resolve_local_alias(&room_alias).await {
|
match services.rooms.alias.resolve_local_alias(&room_alias).await {
|
||||||
| Ok(id) => Ok(RoomMessageEventContent::text_plain(format!(
|
| Ok(id) => Ok(RoomMessageEventContent::text_plain(format!(
|
||||||
"Alias resolves to {id}"
|
"Alias resolves to {id}"
|
||||||
))),
|
))),
|
||||||
| Err(_) =>
|
| Err(_) =>
|
||||||
Ok(RoomMessageEventContent::text_plain("Alias isn't in use.")),
|
Ok(RoomMessageEventContent::text_plain("Alias isn't in use.")),
|
||||||
},
|
}
|
||||||
|
},
|
||||||
| RoomAliasCommand::List { .. } => unreachable!(),
|
| RoomAliasCommand::List { .. } => unreachable!(),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -510,8 +510,9 @@ pub struct Config {
|
||||||
/// display: sensitive
|
/// display: sensitive
|
||||||
pub registration_token: Option<String>,
|
pub registration_token: Option<String>,
|
||||||
|
|
||||||
/// Path to a file on the system that gets read for the registration token.
|
/// Path to a file on the system that gets read for additional registration
|
||||||
/// this config option takes precedence/priority over "registration_token".
|
/// tokens. Multiple tokens can be added if you separate them with
|
||||||
|
/// whitespace
|
||||||
///
|
///
|
||||||
/// conduwuit must be able to access the file, and it must not be empty
|
/// conduwuit must be able to access the file, and it must not be empty
|
||||||
///
|
///
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use std::{
|
use std::{
|
||||||
collections::BTreeMap,
|
collections::{BTreeMap, HashSet},
|
||||||
sync::{Arc, RwLock},
|
sync::{Arc, RwLock},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ use ruma::{
|
||||||
CanonicalJsonValue, DeviceId, OwnedDeviceId, OwnedUserId, UserId,
|
CanonicalJsonValue, DeviceId, OwnedDeviceId, OwnedUserId, UserId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{globals, users, Dep};
|
use crate::{config, globals, users, Dep};
|
||||||
|
|
||||||
pub struct Service {
|
pub struct Service {
|
||||||
userdevicesessionid_uiaarequest: RwLock<RequestMap>,
|
userdevicesessionid_uiaarequest: RwLock<RequestMap>,
|
||||||
|
@ -28,6 +28,7 @@ pub struct Service {
|
||||||
struct Services {
|
struct Services {
|
||||||
globals: Dep<globals::Service>,
|
globals: Dep<globals::Service>,
|
||||||
users: Dep<users::Service>,
|
users: Dep<users::Service>,
|
||||||
|
config: Dep<config::Service>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Data {
|
struct Data {
|
||||||
|
@ -49,6 +50,7 @@ impl crate::Service for Service {
|
||||||
services: Services {
|
services: Services {
|
||||||
globals: args.depend::<globals::Service>("globals"),
|
globals: args.depend::<globals::Service>("globals"),
|
||||||
users: args.depend::<users::Service>("users"),
|
users: args.depend::<users::Service>("users"),
|
||||||
|
config: args.depend::<config::Service>("config"),
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@ -56,6 +58,26 @@ impl crate::Service for Service {
|
||||||
fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
|
fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[implement(Service)]
|
||||||
|
pub async fn read_tokens(&self) -> Result<HashSet<String>> {
|
||||||
|
let mut tokens = HashSet::new();
|
||||||
|
if let Some(file) = &self.services.config.registration_token_file.as_ref() {
|
||||||
|
match std::fs::read_to_string(file) {
|
||||||
|
| Ok(text) => {
|
||||||
|
text.split_ascii_whitespace().for_each(|token| {
|
||||||
|
tokens.insert(token.to_owned());
|
||||||
|
});
|
||||||
|
},
|
||||||
|
| Err(e) => error!("Failed to read the registration token file: {e}"),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(token) = &self.services.config.registration_token {
|
||||||
|
tokens.insert(token.to_owned());
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(tokens)
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new Uiaa session. Make sure the session token is unique.
|
/// Creates a new Uiaa session. Make sure the session token is unique.
|
||||||
#[implement(Service)]
|
#[implement(Service)]
|
||||||
pub fn create(
|
pub fn create(
|
||||||
|
@ -152,13 +174,8 @@ pub async fn try_auth(
|
||||||
uiaainfo.completed.push(AuthType::Password);
|
uiaainfo.completed.push(AuthType::Password);
|
||||||
},
|
},
|
||||||
| AuthData::RegistrationToken(t) => {
|
| AuthData::RegistrationToken(t) => {
|
||||||
if self
|
let tokens = self.read_tokens().await?;
|
||||||
.services
|
if tokens.contains(t.token.trim()) {
|
||||||
.globals
|
|
||||||
.registration_token
|
|
||||||
.as_ref()
|
|
||||||
.is_some_and(|reg_token| t.token.trim() == reg_token)
|
|
||||||
{
|
|
||||||
uiaainfo.completed.push(AuthType::RegistrationToken);
|
uiaainfo.completed.push(AuthType::RegistrationToken);
|
||||||
} else {
|
} else {
|
||||||
uiaainfo.auth_error = Some(ruma::api::client::error::StandardErrorBody {
|
uiaainfo.auth_error = Some(ruma::api::client::error::StandardErrorBody {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue