From 09c56ea0575c95b43f348d62bc3138d6bf61238d Mon Sep 17 00:00:00 2001 From: Johannes Becker Date: Thu, 14 Jul 2022 15:06:45 +0200 Subject: [PATCH] feat(appservice)!: Allow specifying device id for registration --- .../examples/appservice_autojoin.rs | 2 +- crates/matrix-sdk-appservice/src/lib.rs | 15 ++++++++++----- crates/matrix-sdk-appservice/tests/tests.rs | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs b/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs index e1c295af6..8835449e4 100644 --- a/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs +++ b/crates/matrix-sdk-appservice/examples/appservice_autojoin.rs @@ -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)?; } diff --git a/crates/matrix-sdk-appservice/src/lib.rs b/crates/matrix-sdk-appservice/src/lib.rs index 51592ec34..10b612c2c 100644 --- a/crates/matrix-sdk-appservice/src/lib.rs +++ b/crates/matrix-sdk-appservice/src/lib.rs @@ -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) -> 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(®ister::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(()) } diff --git a/crates/matrix-sdk-appservice/tests/tests.rs b/crates/matrix-sdk-appservice/tests/tests.rs index fc74555a5..5dd10d24c 100644 --- a/crates/matrix-sdk-appservice/tests/tests.rs +++ b/crates/matrix-sdk-appservice/tests/tests.rs @@ -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(()) }