Skip to content

Commit 5eb8e78

Browse files
authored
Use the new dedicated Synapse API (#4801)
2 parents 3266bfb + ee9f843 commit 5eb8e78

File tree

23 files changed

+1505
-857
lines changed

23 files changed

+1505
-857
lines changed

crates/cli/src/util.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use mas_data_model::{SessionExpirationConfig, SiteConfig};
1717
use mas_email::{MailTransport, Mailer};
1818
use mas_handlers::passwords::PasswordManager;
1919
use mas_matrix::{HomeserverConnection, ReadOnlyHomeserverConnection};
20-
use mas_matrix_synapse::SynapseConnection;
20+
use mas_matrix_synapse::{LegacySynapseConnection, SynapseConnection};
2121
use mas_policy::PolicyFactory;
2222
use mas_router::UrlBuilder;
2323
use mas_storage::{BoxRepositoryFactory, RepositoryAccess, RepositoryFactory};
@@ -469,14 +469,22 @@ pub fn homeserver_connection_from_config(
469469
http_client: reqwest::Client,
470470
) -> Arc<dyn HomeserverConnection> {
471471
match config.kind {
472-
HomeserverKind::Synapse => Arc::new(SynapseConnection::new(
472+
HomeserverKind::Synapse | HomeserverKind::SynapseLegacy => {
473+
Arc::new(LegacySynapseConnection::new(
474+
config.homeserver.clone(),
475+
config.endpoint.clone(),
476+
config.secret.clone(),
477+
http_client,
478+
))
479+
}
480+
HomeserverKind::SynapseModern => Arc::new(SynapseConnection::new(
473481
config.homeserver.clone(),
474482
config.endpoint.clone(),
475483
config.secret.clone(),
476484
http_client,
477485
)),
478486
HomeserverKind::SynapseReadOnly => {
479-
let connection = SynapseConnection::new(
487+
let connection = LegacySynapseConnection::new(
480488
config.homeserver.clone(),
481489
config.endpoint.clone(),
482490
config.secret.clone(),

crates/config/src/sections/matrix.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,25 @@ fn default_endpoint() -> Url {
2727
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
2828
#[serde(rename_all = "snake_case")]
2929
pub enum HomeserverKind {
30-
/// Homeserver is Synapse
30+
/// Homeserver is Synapse, using the legacy API
31+
///
32+
/// This will switch to using the modern API in a few releases.
3133
#[default]
3234
Synapse,
3335

34-
/// Homeserver is Synapse, in read-only mode
36+
/// Homeserver is Synapse, using the legacy API, in read-only mode
3537
///
3638
/// This is meant for testing rolling out Matrix Authentication Service with
3739
/// no risk of writing data to the homeserver.
40+
///
41+
/// This will switch to using the modern API in a few releases.
3842
SynapseReadOnly,
43+
44+
/// Homeserver is Synapse, using the legacy API,
45+
SynapseLegacy,
46+
47+
/// Homeserver is Synapse, with the modern API available
48+
SynapseModern,
3949
}
4050

4151
/// Configuration related to the Matrix homeserver

crates/handlers/src/admin/v1/users/add.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,7 @@ pub async fn handler(
166166
let user = repo.user().add(&mut rng, &clock, params.username).await?;
167167

168168
homeserver
169-
.provision_user(&ProvisionRequest::new(
170-
homeserver.mxid(&user.username),
171-
&user.sub,
172-
))
169+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
173170
.await
174171
.map_err(RouteError::Homeserver)?;
175172

@@ -222,8 +219,7 @@ mod tests {
222219
assert_eq!(user.username, "alice");
223220

224221
// Check that the user was created on the homeserver
225-
let mxid = state.homeserver_connection.mxid("alice");
226-
let result = state.homeserver_connection.query_user(&mxid).await;
222+
let result = state.homeserver_connection.query_user("alice").await;
227223
assert!(result.is_ok());
228224
}
229225

crates/handlers/src/admin/v1/users/reactivate.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,8 @@ pub async fn handler(
8383
.ok_or(RouteError::NotFound(id))?;
8484

8585
// Call the homeserver synchronously to reactivate the user
86-
let mxid = homeserver.mxid(&user.username);
8786
homeserver
88-
.reactivate_user(&mxid)
87+
.reactivate_user(&user.username)
8988
.await
9089
.map_err(RouteError::Homeserver)?;
9190

@@ -127,20 +126,23 @@ mod tests {
127126

128127
// Provision and immediately deactivate the user on the homeserver,
129128
// because this endpoint will try to reactivate it
130-
let mxid = state.homeserver_connection.mxid(&user.username);
131129
state
132130
.homeserver_connection
133-
.provision_user(&ProvisionRequest::new(&mxid, &user.sub))
131+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
134132
.await
135133
.unwrap();
136134
state
137135
.homeserver_connection
138-
.delete_user(&mxid, true)
136+
.delete_user(&user.username, true)
139137
.await
140138
.unwrap();
141139

142140
// The user should be deactivated on the homeserver
143-
let mx_user = state.homeserver_connection.query_user(&mxid).await.unwrap();
141+
let mx_user = state
142+
.homeserver_connection
143+
.query_user(&user.username)
144+
.await
145+
.unwrap();
144146
assert!(mx_user.deactivated);
145147

146148
let request = Request::post(format!("/api/admin/v1/users/{}/reactivate", user.id))
@@ -176,10 +178,9 @@ mod tests {
176178
repo.save().await.unwrap();
177179

178180
// Provision the user on the homeserver
179-
let mxid = state.homeserver_connection.mxid(&user.username);
180181
state
181182
.homeserver_connection
182-
.provision_user(&ProvisionRequest::new(&mxid, &user.sub))
183+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
183184
.await
184185
.unwrap();
185186

crates/handlers/src/admin/v1/users/unlock.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,9 @@ mod tests {
112112

113113
// Also provision the user on the homeserver, because this endpoint will try to
114114
// reactivate it
115-
let mxid = state.homeserver_connection.mxid(&user.username);
116115
state
117116
.homeserver_connection
118-
.provision_user(&ProvisionRequest::new(&mxid, &user.sub))
117+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
119118
.await
120119
.unwrap();
121120

@@ -149,21 +148,24 @@ mod tests {
149148
repo.save().await.unwrap();
150149

151150
// Provision the user on the homeserver
152-
let mxid = state.homeserver_connection.mxid(&user.username);
153151
state
154152
.homeserver_connection
155-
.provision_user(&ProvisionRequest::new(&mxid, &user.sub))
153+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
156154
.await
157155
.unwrap();
158156
// but then deactivate it
159157
state
160158
.homeserver_connection
161-
.delete_user(&mxid, true)
159+
.delete_user(&user.username, true)
162160
.await
163161
.unwrap();
164162

165163
// The user should be deactivated on the homeserver
166-
let mx_user = state.homeserver_connection.query_user(&mxid).await.unwrap();
164+
let mx_user = state
165+
.homeserver_connection
166+
.query_user(&user.username)
167+
.await
168+
.unwrap();
167169
assert!(mx_user.deactivated);
168170

169171
let request = Request::post(format!("/api/admin/v1/users/{}/unlock", user.id))
@@ -182,7 +184,11 @@ mod tests {
182184
body["data"]["attributes"]["deactivated_at"],
183185
serde_json::json!(state.clock.now())
184186
);
185-
let mx_user = state.homeserver_connection.query_user(&mxid).await.unwrap();
187+
let mx_user = state
188+
.homeserver_connection
189+
.query_user(&user.username)
190+
.await
191+
.unwrap();
186192
assert!(mx_user.deactivated);
187193
}
188194

crates/handlers/src/compat/login.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,11 @@ pub(crate) async fn post(
411411
// Now we can create the device on the homeserver, without holding the
412412
// transaction
413413
if let Err(err) = homeserver
414-
.create_device(&user_id, device.as_str(), session.human_name.as_deref())
414+
.upsert_device(
415+
&user.username,
416+
device.as_str(),
417+
session.human_name.as_deref(),
418+
)
415419
.await
416420
{
417421
// Something went wrong, let's end this session and schedule a device sync
@@ -829,10 +833,9 @@ mod tests {
829833
.add(&mut rng, &state.clock, &user, version, hash, None)
830834
.await
831835
.unwrap();
832-
let mxid = state.homeserver_connection.mxid(&user.username);
833836
state
834837
.homeserver_connection
835-
.provision_user(&ProvisionRequest::new(mxid, &user.sub))
838+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
836839
.await
837840
.unwrap();
838841

@@ -1133,10 +1136,9 @@ mod tests {
11331136
.await
11341137
.unwrap();
11351138

1136-
let mxid = state.homeserver_connection.mxid(&user.username);
11371139
state
11381140
.homeserver_connection
1139-
.provision_user(&ProvisionRequest::new(mxid, &user.sub))
1141+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
11401142
.await
11411143
.unwrap();
11421144

@@ -1239,10 +1241,9 @@ mod tests {
12391241
let user = repo.user().lock(&state.clock, user).await.unwrap();
12401242
repo.save().await.unwrap();
12411243

1242-
let mxid = state.homeserver_connection.mxid(&user.username);
12431244
state
12441245
.homeserver_connection
1245-
.provision_user(&ProvisionRequest::new(mxid, &user.sub))
1246+
.provision_user(&ProvisionRequest::new(&user.username, &user.sub))
12461247
.await
12471248
.unwrap();
12481249

crates/handlers/src/graphql/model/matrix.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ impl MatrixUser {
2727
conn: &C,
2828
user: &str,
2929
) -> Result<MatrixUser, anyhow::Error> {
30-
let mxid = conn.mxid(user);
30+
let info = conn.query_user(user).await?;
3131

32-
let info = conn.query_user(&mxid).await?;
32+
let mxid = conn.mxid(user);
3333

3434
Ok(MatrixUser {
3535
mxid,

crates/handlers/src/graphql/mutations/compat_session.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,9 @@ impl CompatSessionMutations {
187187
.await?;
188188

189189
// Update the device on the homeserver side
190-
let mxid = homeserver.mxid(&user.username);
191190
if let Some(device) = session.device.as_ref() {
192191
homeserver
193-
.update_device_display_name(&mxid, device.as_str(), &input.human_name)
192+
.update_device_display_name(&user.username, device.as_str(), &input.human_name)
194193
.await
195194
.context("Failed to provision device")?;
196195
}

crates/handlers/src/graphql/mutations/matrix.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ impl MatrixMutations {
9393
repo.cancel().await?;
9494

9595
let conn = state.homeserver_connection();
96-
let mxid = conn.mxid(&user.username);
9796

9897
if let Some(display_name) = &input.display_name {
9998
// Let's do some basic validation on the display name
@@ -105,11 +104,11 @@ impl MatrixMutations {
105104
return Ok(SetDisplayNamePayload::Invalid);
106105
}
107106

108-
conn.set_displayname(&mxid, display_name)
107+
conn.set_displayname(&user.username, display_name)
109108
.await
110109
.context("Failed to set display name")?;
111110
} else {
112-
conn.unset_displayname(&mxid)
111+
conn.unset_displayname(&user.username)
113112
.await
114113
.context("Failed to unset display name")?;
115114
}

crates/handlers/src/graphql/mutations/oauth2_session.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,10 @@ impl OAuth2SessionMutations {
212212
repo.user().acquire_lock_for_sync(&user).await?;
213213

214214
// Look for devices to provision
215-
let mxid = homeserver.mxid(&user.username);
216215
for scope in &*session.scope {
217216
if let Some(device) = Device::from_scope_token(scope) {
218217
homeserver
219-
.create_device(&mxid, device.as_str(), None)
218+
.upsert_device(&user.username, device.as_str(), None)
220219
.await
221220
.context("Failed to provision device")?;
222221
}
@@ -331,11 +330,10 @@ impl OAuth2SessionMutations {
331330
.await?;
332331

333332
// Update the device on the homeserver side
334-
let mxid = homeserver.mxid(&user.username);
335333
for scope in &*session.scope {
336334
if let Some(device) = Device::from_scope_token(scope) {
337335
homeserver
338-
.update_device_display_name(&mxid, device.as_str(), &input.human_name)
336+
.update_device_display_name(&user.username, device.as_str(), &input.human_name)
339337
.await
340338
.context("Failed to provision device")?;
341339
}

0 commit comments

Comments
 (0)