|
|
|
|
@ -16,8 +16,10 @@ use ruma::{
|
|
|
|
|
uiaa::{AuthFlow, AuthType, UiaaInfo}, |
|
|
|
|
}, |
|
|
|
|
events::{ |
|
|
|
|
room::member::{MembershipState, RoomMemberEventContent}, |
|
|
|
|
room::message::RoomMessageEventContent, |
|
|
|
|
room::{ |
|
|
|
|
member::{MembershipState, RoomMemberEventContent}, |
|
|
|
|
message::RoomMessageEventContent, |
|
|
|
|
}, |
|
|
|
|
GlobalAccountDataEventType, RoomEventType, |
|
|
|
|
}, |
|
|
|
|
push, UserId, |
|
|
|
|
@ -27,7 +29,7 @@ use tracing::{info, warn};
|
|
|
|
|
|
|
|
|
|
use register::RegistrationKind; |
|
|
|
|
|
|
|
|
|
const GUEST_NAME_LENGTH: usize = 10; |
|
|
|
|
const RANDOM_USER_ID_LENGTH: usize = 10; |
|
|
|
|
|
|
|
|
|
/// # `GET /_matrix/client/r0/register/available`
|
|
|
|
|
///
|
|
|
|
|
@ -95,38 +97,38 @@ pub async fn register_route(
|
|
|
|
|
|
|
|
|
|
let is_guest = body.kind == RegistrationKind::Guest; |
|
|
|
|
|
|
|
|
|
let mut missing_username = false; |
|
|
|
|
|
|
|
|
|
// Validate user id
|
|
|
|
|
let user_id = UserId::parse_with_server_name( |
|
|
|
|
if is_guest { |
|
|
|
|
utils::random_string(GUEST_NAME_LENGTH) |
|
|
|
|
} else { |
|
|
|
|
body.username.clone().unwrap_or_else(|| { |
|
|
|
|
// If the user didn't send a username field, that means the client is just trying
|
|
|
|
|
// the get an UIAA error to see available flows
|
|
|
|
|
missing_username = true; |
|
|
|
|
// Just give the user a random name. He won't be able to register with it anyway.
|
|
|
|
|
utils::random_string(GUEST_NAME_LENGTH) |
|
|
|
|
}) |
|
|
|
|
let user_id = match (&body.username, is_guest) { |
|
|
|
|
(Some(username), false) => { |
|
|
|
|
let proposed_user_id = |
|
|
|
|
UserId::parse_with_server_name(username.to_lowercase(), db.globals.server_name()) |
|
|
|
|
.ok() |
|
|
|
|
.filter(|user_id| { |
|
|
|
|
!user_id.is_historical() |
|
|
|
|
&& user_id.server_name() == db.globals.server_name() |
|
|
|
|
}) |
|
|
|
|
.ok_or(Error::BadRequest( |
|
|
|
|
ErrorKind::InvalidUsername, |
|
|
|
|
"Username is invalid.", |
|
|
|
|
))?; |
|
|
|
|
if db.users.exists(&proposed_user_id)? { |
|
|
|
|
return Err(Error::BadRequest( |
|
|
|
|
ErrorKind::UserInUse, |
|
|
|
|
"Desired user ID is already taken.", |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
proposed_user_id |
|
|
|
|
} |
|
|
|
|
.to_lowercase(), |
|
|
|
|
db.globals.server_name(), |
|
|
|
|
) |
|
|
|
|
.ok() |
|
|
|
|
.filter(|user_id| !user_id.is_historical() && user_id.server_name() == db.globals.server_name()) |
|
|
|
|
.ok_or(Error::BadRequest( |
|
|
|
|
ErrorKind::InvalidUsername, |
|
|
|
|
"Username is invalid.", |
|
|
|
|
))?; |
|
|
|
|
|
|
|
|
|
// Check if username is creative enough
|
|
|
|
|
if db.users.exists(&user_id)? { |
|
|
|
|
return Err(Error::BadRequest( |
|
|
|
|
ErrorKind::UserInUse, |
|
|
|
|
"Desired user ID is already taken.", |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
_ => loop { |
|
|
|
|
let proposed_user_id = UserId::parse_with_server_name( |
|
|
|
|
utils::random_string(RANDOM_USER_ID_LENGTH).to_lowercase(), |
|
|
|
|
db.globals.server_name(), |
|
|
|
|
) |
|
|
|
|
.unwrap(); |
|
|
|
|
if !db.users.exists(&proposed_user_id)? { |
|
|
|
|
break proposed_user_id; |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// UIAA
|
|
|
|
|
let mut uiaainfo = UiaaInfo { |
|
|
|
|
@ -169,13 +171,6 @@ pub async fn register_route(
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if missing_username { |
|
|
|
|
return Err(Error::BadRequest( |
|
|
|
|
ErrorKind::MissingParam, |
|
|
|
|
"Missing username field.", |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
let password = if is_guest { |
|
|
|
|
None |
|
|
|
|
} else { |
|
|
|
|
|