feat(appservice)!: Allow specifying device id for registration

This commit is contained in:
Johannes Becker
2022-07-14 15:06:45 +02:00
committed by Damir Jelić
parent 41de3e0af8
commit 09c56ea057
3 changed files with 12 additions and 7 deletions

View File

@@ -27,7 +27,7 @@ pub async fn handle_room_member(
trace!("not an appservice user: {}", event.state_key);
} else if let MembershipState::Invite = event.content.membership {
let user_id = UserId::parse(event.state_key.as_str())?;
if let Err(error) = appservice.register_virtual_user(user_id.localpart()).await {
if let Err(error) = appservice.register_virtual_user(user_id.localpart(), None).await {
error_if_user_not_in_use(error)?;
}

View File

@@ -106,7 +106,7 @@ use ruma::{
},
assign,
events::{room::member::MembershipState, AnyRoomEvent, AnyStateEvent},
IdParseError, OwnedRoomId, OwnedServerName,
DeviceId, IdParseError, OwnedRoomId, OwnedServerName,
};
use serde::Deserialize;
use tokio::task::JoinHandle;
@@ -305,18 +305,23 @@ impl AppService {
/// # Returns
/// This function may return a UIAA response, which should be checked for
/// with [`Error::uiaa_response()`].
pub async fn register_virtual_user(&self, localpart: impl AsRef<str>) -> Result<()> {
if self.is_user_registered(localpart.as_ref()).await? {
pub async fn register_virtual_user<'a>(
&self,
localpart: &'a str,
device_id: Option<&'a DeviceId>,
) -> Result<()> {
if self.is_user_registered(localpart).await? {
return Ok(());
}
let request = assign!(register::v3::Request::new(), {
username: Some(localpart.as_ref()),
username: Some(localpart),
login_type: Some(&register::LoginType::ApplicationService),
device_id,
});
let client = self.virtual_user(None).await?;
client.register(request).await?;
self.set_user_registered(localpart.as_ref()).await?;
self.set_user_registered(localpart).await?;
Ok(())
}

View File

@@ -82,7 +82,7 @@ async fn test_register_virtual_user() -> Result<()> {
.mount(&server)
.await;
appservice.register_virtual_user(localpart).await?;
appservice.register_virtual_user(localpart, None).await?;
Ok(())
}