|
|
|
@ -74,10 +74,7 @@ pub async fn get_register_available_route(
|
|
|
|
|
/// - Creates a new account and populates it with default account data
|
|
|
|
|
/// - If `inhibit_login` is false: Creates a device and returns device id and access_token
|
|
|
|
|
pub async fn register_route(body: Ruma<register::v3::Request>) -> Result<register::v3::Response> {
|
|
|
|
|
if !services().globals.allow_registration()
|
|
|
|
|
&& !body.from_appservice
|
|
|
|
|
&& services().globals.config.registration_token.is_none()
|
|
|
|
|
{
|
|
|
|
|
if !services().globals.allow_registration() && !body.from_appservice {
|
|
|
|
|
return Err(Error::BadRequest(
|
|
|
|
|
ErrorKind::Forbidden,
|
|
|
|
|
"Registration has been disabled.",
|
|
|
|
@ -122,21 +119,35 @@ pub async fn register_route(body: Ruma<register::v3::Request>) -> Result<registe
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// UIAA
|
|
|
|
|
let mut uiaainfo = UiaaInfo {
|
|
|
|
|
flows: vec![AuthFlow {
|
|
|
|
|
stages: if services().globals.config.registration_token.is_some() {
|
|
|
|
|
vec![AuthType::RegistrationToken]
|
|
|
|
|
} else {
|
|
|
|
|
vec![AuthType::Dummy]
|
|
|
|
|
},
|
|
|
|
|
}],
|
|
|
|
|
completed: Vec::new(),
|
|
|
|
|
params: Default::default(),
|
|
|
|
|
session: None,
|
|
|
|
|
auth_error: None,
|
|
|
|
|
};
|
|
|
|
|
let mut uiaainfo;
|
|
|
|
|
let skip_auth;
|
|
|
|
|
if services().globals.config.registration_token.is_some() {
|
|
|
|
|
// Registration token required
|
|
|
|
|
uiaainfo = UiaaInfo {
|
|
|
|
|
flows: vec![AuthFlow {
|
|
|
|
|
stages: vec![AuthType::RegistrationToken],
|
|
|
|
|
}],
|
|
|
|
|
completed: Vec::new(),
|
|
|
|
|
params: Default::default(),
|
|
|
|
|
session: None,
|
|
|
|
|
auth_error: None,
|
|
|
|
|
};
|
|
|
|
|
skip_auth = body.from_appservice;
|
|
|
|
|
} else {
|
|
|
|
|
// No registration token necessary, but clients must still go through the flow
|
|
|
|
|
uiaainfo = UiaaInfo {
|
|
|
|
|
flows: vec![AuthFlow {
|
|
|
|
|
stages: vec![AuthType::Dummy],
|
|
|
|
|
}],
|
|
|
|
|
completed: Vec::new(),
|
|
|
|
|
params: Default::default(),
|
|
|
|
|
session: None,
|
|
|
|
|
auth_error: None,
|
|
|
|
|
};
|
|
|
|
|
skip_auth = body.from_appservice || is_guest;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !body.from_appservice && !is_guest {
|
|
|
|
|
if !skip_auth {
|
|
|
|
|
if let Some(auth) = &body.auth {
|
|
|
|
|
let (worked, uiaainfo) = services().uiaa.try_auth(
|
|
|
|
|
&UserId::parse_with_server_name("", services().globals.server_name())
|
|
|
|
|