Browse Source

Merge branch 'kcommaille/bump-sdk' into 'main'

Upgrade matrix-sdk and ruma crates

See merge request World/fractal!2149
merge-requests/2149/merge
Kévin Commaille 2 weeks ago
parent
commit
bcb7bd53c0
  1. 36
      Cargo.lock
  2. 8
      Cargo.toml
  3. 37
      src/account_settings/general_page/deactivate_account_subpage.rs
  4. 36
      src/account_settings/general_page/mod.rs
  5. 70
      src/account_settings/mod.rs
  6. 34
      src/account_settings/user_session/user_session_subpage.rs

36
Cargo.lock generated

@ -2844,7 +2844,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk" name = "matrix-sdk"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"anymap2", "anymap2",
"aquamarine", "aquamarine",
@ -2902,7 +2902,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-base" name = "matrix-sdk-base"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"async-trait", "async-trait",
@ -2928,7 +2928,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-common" name = "matrix-sdk-common"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"eyeball-im", "eyeball-im",
"futures-core", "futures-core",
@ -2951,7 +2951,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-crypto" name = "matrix-sdk-crypto"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"aes", "aes",
"aquamarine", "aquamarine",
@ -2992,7 +2992,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-indexeddb" name = "matrix-sdk-indexeddb"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64", "base64",
@ -3023,7 +3023,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-qrcode" name = "matrix-sdk-qrcode"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"qrcode", "qrcode",
@ -3035,7 +3035,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-sqlite" name = "matrix-sdk-sqlite"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"async-trait", "async-trait",
@ -3062,7 +3062,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-store-encryption" name = "matrix-sdk-store-encryption"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"base64", "base64",
"blake3", "blake3",
@ -3082,7 +3082,7 @@ dependencies = [
[[package]] [[package]]
name = "matrix-sdk-ui" name = "matrix-sdk-ui"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1#bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" source = "git+https://github.com/matrix-org/matrix-rust-sdk.git?rev=029148ef6e45d51e6325a4f5aadcdee7ec9385cc#029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"async-rx", "async-rx",
@ -4042,7 +4042,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma" name = "ruma"
version = "0.14.1" version = "0.14.1"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"assign", "assign",
"js_int", "js_int",
@ -4058,7 +4058,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-client-api" name = "ruma-client-api"
version = "0.22.1" version = "0.22.1"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"assign", "assign",
@ -4081,7 +4081,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-common" name = "ruma-common"
version = "0.17.1" version = "0.17.1"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"base64", "base64",
@ -4114,7 +4114,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-events" name = "ruma-events"
version = "0.32.1" version = "0.32.1"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"indexmap", "indexmap",
@ -4140,7 +4140,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-federation-api" name = "ruma-federation-api"
version = "0.13.1" version = "0.13.1"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"headers", "headers",
"http", "http",
@ -4159,7 +4159,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-html" name = "ruma-html"
version = "0.6.0" version = "0.6.0"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"html5ever", "html5ever",
@ -4171,7 +4171,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-identifiers-validation" name = "ruma-identifiers-validation"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"js_int", "js_int",
"thiserror 2.0.18", "thiserror 2.0.18",
@ -4180,7 +4180,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-macros" name = "ruma-macros"
version = "0.17.1" version = "0.17.1"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"cfg-if", "cfg-if",
@ -4196,7 +4196,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-signatures" name = "ruma-signatures"
version = "0.19.0" version = "0.19.0"
source = "git+https://github.com/ruma/ruma.git?rev=289bee87974bd3c2ad14a6c15801c80b683b67dc#289bee87974bd3c2ad14a6c15801c80b683b67dc" source = "git+https://github.com/ruma/ruma.git?rev=4a0ae80fbf42d1b759e108d7315537d13583c144#4a0ae80fbf42d1b759e108d7315537d13583c144"
dependencies = [ dependencies = [
"base64", "base64",
"ed25519-dalek", "ed25519-dalek",

8
Cargo.toml

@ -75,23 +75,23 @@ sourceview = { version = "0.10", package = "sourceview5" }
[dependencies.matrix-sdk] [dependencies.matrix-sdk]
# version = "0.14" # version = "0.14"
git = "https://github.com/matrix-org/matrix-rust-sdk.git" git = "https://github.com/matrix-org/matrix-rust-sdk.git"
rev = "bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
features = ["socks", "sso-login", "markdown", "qrcode"] features = ["socks", "sso-login", "markdown", "qrcode"]
[dependencies.matrix-sdk-store-encryption] [dependencies.matrix-sdk-store-encryption]
# version = "0.14" # version = "0.14"
git = "https://github.com/matrix-org/matrix-rust-sdk.git" git = "https://github.com/matrix-org/matrix-rust-sdk.git"
rev = "bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
[dependencies.matrix-sdk-ui] [dependencies.matrix-sdk-ui]
# version = "0.14" # version = "0.14"
git = "https://github.com/matrix-org/matrix-rust-sdk.git" git = "https://github.com/matrix-org/matrix-rust-sdk.git"
rev = "bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc"
[dependencies.ruma] [dependencies.ruma]
# version = "0.14" # version = "0.14"
git = "https://github.com/ruma/ruma.git" git = "https://github.com/ruma/ruma.git"
rev = "289bee87974bd3c2ad14a6c15801c80b683b67dc" rev = "4a0ae80fbf42d1b759e108d7315537d13583c144"
features = [ features = [
"client-api-c", "client-api-c",
"markdown", "markdown",

37
src/account_settings/general_page/deactivate_account_subpage.rs

@ -1,7 +1,9 @@
use adw::{prelude::*, subclass::prelude::*}; use adw::{prelude::*, subclass::prelude::*};
use gettextrs::gettext; use gettextrs::gettext;
use gtk::{glib, glib::clone}; use gtk::{glib, glib::clone};
use matrix_sdk::authentication::oauth::{AccountManagementActionFull, AccountManagementUrlBuilder}; use ruma::api::client::discovery::get_authorization_server_metadata::v1::{
AccountManagementActionData, AuthorizationServerMetadata,
};
use tracing::error; use tracing::error;
use super::AccountSettings; use super::AccountSettings;
@ -71,7 +73,7 @@ mod imp {
fn set_account_settings(&self, account_settings: &AccountSettings) { fn set_account_settings(&self, account_settings: &AccountSettings) {
self.account_settings.set(Some(account_settings)); self.account_settings.set(Some(account_settings));
account_settings.connect_account_management_url_builder_changed(clone!( account_settings.connect_oauth_server_metadata_changed(clone!(
#[weak(rename_to = imp)] #[weak(rename_to = imp)]
self, self,
move |_| { move |_| {
@ -81,17 +83,18 @@ mod imp {
self.update_visible_button(); self.update_visible_button();
} }
/// The builder for the account management URL of the OAuth 2.0 /// The OAuth 2.0 authorization server metadata, if any.
/// authorization server, if any. fn oauth_server_metadata(&self) -> Option<AuthorizationServerMetadata> {
fn account_management_url_builder(&self) -> Option<AccountManagementUrlBuilder> {
self.account_settings self.account_settings
.upgrade() .upgrade()
.and_then(|s| s.account_management_url_builder()) .and_then(|s| s.oauth_server_metadata())
} }
/// Update the visible button for the current state. /// Update the visible button for the current state.
fn update_visible_button(&self) { fn update_visible_button(&self) {
let should_open_url = self.account_management_url_builder().is_some(); let should_open_url = self
.oauth_server_metadata()
.is_some_and(|metadata| metadata.account_management_uri.is_some());
self.loading_button.set_visible(!should_open_url); self.loading_button.set_visible(!should_open_url);
self.open_url_button.set_visible(should_open_url); self.open_url_button.set_visible(should_open_url);
} }
@ -112,7 +115,10 @@ mod imp {
/// Deactivate the account with the proper method. /// Deactivate the account with the proper method.
#[template_callback] #[template_callback]
async fn deactivate_account(&self) { async fn deactivate_account(&self) {
if self.account_management_url_builder().is_some() { if self
.oauth_server_metadata()
.is_some_and(|metadata| metadata.account_management_uri.is_some())
{
self.open_deactivate_account_url().await; self.open_deactivate_account_url().await;
} else { } else {
self.deactivate_account_with_request().await; self.deactivate_account_with_request().await;
@ -165,20 +171,23 @@ mod imp {
// Open the account management URL to deactivate the account. // Open the account management URL to deactivate the account.
#[template_callback] #[template_callback]
async fn open_deactivate_account_url(&self) { async fn open_deactivate_account_url(&self) {
let Some(url_builder) = self.account_management_url_builder() else { let Some(metadata) = self.oauth_server_metadata() else {
error!("Could not find open account management URL"); error!("Could not find OAuth 2.0 authorization server metadata");
return; return;
}; };
let url = url_builder let Some(url) = metadata
.action(AccountManagementActionFull::AccountDeactivate) .account_management_url_with_action(AccountManagementActionData::AccountDeactivate)
.build(); else {
error!("Could not build OAuth 2.0 account management URL");
return;
};
if let Err(error) = gtk::UriLauncher::new(url.as_str()) if let Err(error) = gtk::UriLauncher::new(url.as_str())
.launch_future(self.obj().root().and_downcast_ref::<gtk::Window>()) .launch_future(self.obj().root().and_downcast_ref::<gtk::Window>())
.await .await
{ {
error!("Could not launch account management URL: {error}"); error!("Could not launch OAuth 2.0 account management URL: {error}");
} }
} }
} }

36
src/account_settings/general_page/mod.rs

@ -1,13 +1,17 @@
use adw::{prelude::*, subclass::prelude::*}; use adw::{prelude::*, subclass::prelude::*};
use gettextrs::gettext; use gettextrs::gettext;
use gtk::{gio, glib, glib::clone}; use gtk::{gio, glib, glib::clone};
use matrix_sdk::authentication::oauth::{AccountManagementActionFull, AccountManagementUrlBuilder};
use ruma::{ use ruma::{
OwnedMxcUri, OwnedMxcUri,
api::{ api::{
Metadata, SupportedVersions, Metadata, SupportedVersions,
client::{ client::{
discovery::get_capabilities::v3::Capabilities, discovery::{
get_authorization_server_metadata::v1::{
AccountManagementActionData, AuthorizationServerMetadata,
},
get_capabilities::v3::Capabilities,
},
profile::{ProfileFieldName, delete_profile_field}, profile::{ProfileFieldName, delete_profile_field},
}, },
}, },
@ -191,7 +195,7 @@ mod imp {
self.account_settings.set(account_settings); self.account_settings.set(account_settings);
if let Some(account_settings) = account_settings { if let Some(account_settings) = account_settings {
account_settings.connect_account_management_url_builder_changed(clone!( account_settings.connect_oauth_server_metadata_changed(clone!(
#[weak(rename_to = imp)] #[weak(rename_to = imp)]
self, self,
move |_| { move |_| {
@ -203,12 +207,11 @@ mod imp {
self.update_capabilities(); self.update_capabilities();
} }
/// The builder for the account management URL of the OAuth 2.0 /// The OAuth 2.0 authorization server metadata, if any.
/// authorization server, if any. fn oauth_server_metadata(&self) -> Option<AuthorizationServerMetadata> {
fn account_management_url_builder(&self) -> Option<AccountManagementUrlBuilder> {
self.account_settings self.account_settings
.upgrade() .upgrade()
.and_then(|s| s.account_management_url_builder()) .and_then(|s| s.oauth_server_metadata())
} }
/// Load the possible changes on the user account. /// Load the possible changes on the user account.
@ -255,7 +258,9 @@ mod imp {
}; };
let uses_oauth_api = session.uses_oauth_api(); let uses_oauth_api = session.uses_oauth_api();
let has_account_management_url = self.account_management_url_builder().is_some(); let has_account_management_url = self
.oauth_server_metadata()
.is_some_and(|metadata| metadata.account_management_uri.is_some());
let capabilities_data = self.capabilities_data.borrow(); let capabilities_data = self.capabilities_data.borrow();
self.avatar.set_editable( self.avatar.set_editable(
@ -276,20 +281,23 @@ mod imp {
/// Open the URL to manage the account. /// Open the URL to manage the account.
#[template_callback] #[template_callback]
async fn manage_account(&self) { async fn manage_account(&self) {
let Some(url_builder) = self.account_management_url_builder() else { let Some(metadata) = self.oauth_server_metadata() else {
error!("Could not find open account management URL"); error!("Could not find OAuth 2.0 authorization server metadata");
return; return;
}; };
let url = url_builder let Some(url) =
.action(AccountManagementActionFull::Profile) metadata.account_management_url_with_action(AccountManagementActionData::Profile)
.build(); else {
error!("Could not build OAuth 2.0 account management URL");
return;
};
if let Err(error) = gtk::UriLauncher::new(url.as_str()) if let Err(error) = gtk::UriLauncher::new(url.as_str())
.launch_future(self.obj().root().and_downcast_ref::<gtk::Window>()) .launch_future(self.obj().root().and_downcast_ref::<gtk::Window>())
.await .await
{ {
error!("Could not launch account management URL: {error}"); error!("Could not launch OAuth 2.0 account management URL: {error}");
} }
} }

70
src/account_settings/mod.rs

@ -3,9 +3,8 @@ use gtk::{
glib, glib,
glib::{clone, closure_local}, glib::{clone, closure_local},
}; };
use matrix_sdk::authentication::oauth::{ use matrix_sdk::authentication::oauth::error::OAuthDiscoveryError;
AccountManagementUrlBuilder, OAuthError, error::OAuthDiscoveryError, use ruma::api::client::discovery::get_authorization_server_metadata::v1::AuthorizationServerMetadata;
};
use tracing::{error, warn}; use tracing::{error, warn};
mod encryption_page; mod encryption_page;
@ -65,9 +64,8 @@ mod imp {
/// The current session. /// The current session.
#[property(get, set = Self::set_session, nullable)] #[property(get, set = Self::set_session, nullable)]
session: BoundObjectWeakRef<Session>, session: BoundObjectWeakRef<Session>,
/// The builder for the account management URL of the OAuth 2.0 /// The OAuth 2.0 authorization server metadata, if any.
/// authorization server, if any. oauth_server_metadata: RefCell<Option<AuthorizationServerMetadata>>,
account_management_url_builder: RefCell<Option<AccountManagementUrlBuilder>>,
} }
#[glib::object_subclass] #[glib::object_subclass]
@ -133,9 +131,8 @@ mod imp {
#[glib::derived_properties] #[glib::derived_properties]
impl ObjectImpl for AccountSettings { impl ObjectImpl for AccountSettings {
fn signals() -> &'static [Signal] { fn signals() -> &'static [Signal] {
static SIGNALS: LazyLock<Vec<Signal>> = LazyLock::new(|| { static SIGNALS: LazyLock<Vec<Signal>> =
vec![Signal::builder("account-management-url-builder-changed").build()] LazyLock::new(|| vec![Signal::builder("oauth-server-metadata-changed").build()]);
});
SIGNALS.as_ref() SIGNALS.as_ref()
} }
} }
@ -153,7 +150,7 @@ mod imp {
let obj = self.obj(); let obj = self.obj();
self.session.disconnect_signals(); self.session.disconnect_signals();
self.set_account_management_url_builder(None); self.set_oauth_server_metadata(None);
if let Some(session) = session { if let Some(session) = session {
let logged_out_handler = session.connect_logged_out(clone!( let logged_out_handler = session.connect_logged_out(clone!(
@ -179,7 +176,7 @@ mod imp {
#[weak(rename_to = imp)] #[weak(rename_to = imp)]
self, self,
async move { async move {
imp.load_account_management_url_builder().await; imp.load_oauth_server_metadata().await;
} }
)); ));
} }
@ -187,47 +184,39 @@ mod imp {
obj.notify_session(); obj.notify_session();
} }
/// Load the builder for the account management URL of the OAuth 2.0 /// Load the the OAuth 2.0 authorization server metadata.
/// authorization server. async fn load_oauth_server_metadata(&self) {
async fn load_account_management_url_builder(&self) {
let Some(session) = self.session.obj() else { let Some(session) = self.session.obj() else {
return; return;
}; };
let oauth = session.client().oauth(); let oauth = session.client().oauth();
let handle = spawn_tokio!(async move { oauth.account_management_url().await }); let handle = spawn_tokio!(async move { oauth.cached_server_metadata().await });
let url_builder = match handle.await.expect("task was not aborted") { let metadata = match handle.await.expect("task was not aborted") {
Ok(url_builder) => url_builder, Ok(metadata) => Some(metadata),
Err(error) => { Err(error) => {
// Ignore the error that says that OAuth 2.0 is not supported, it can happen. // Ignore the error that says that OAuth 2.0 is not supported, it can happen.
if !matches!( if !matches!(error, OAuthDiscoveryError::NotSupported) {
error, warn!("Could not fetch OAuth 2.0 authorization server metadata: {error}");
OAuthError::Discovery(OAuthDiscoveryError::NotSupported)
) {
warn!("Could not fetch OAuth 2.0 account management URL: {error}");
} }
None None
} }
}; };
self.set_account_management_url_builder(url_builder); self.set_oauth_server_metadata(metadata);
} }
/// Set the builder for the account management URL of the OAuth 2.0 /// Set the builder for the account management URL of the OAuth 2.0
/// authorization server. /// authorization server.
fn set_account_management_url_builder( fn set_oauth_server_metadata(&self, metadata: Option<AuthorizationServerMetadata>) {
&self, self.oauth_server_metadata.replace(metadata);
url_builder: Option<AccountManagementUrlBuilder>,
) {
self.account_management_url_builder.replace(url_builder);
self.obj() self.obj()
.emit_by_name::<()>("account-management-url-builder-changed", &[]); .emit_by_name::<()>("oauth-server-metadata-changed", &[]);
} }
/// The builder for the account management URL of the OAuth 2.0 /// The OAuth 2.0 authorization server metadata, if any.
/// authorization server, if any. pub(super) fn oauth_server_metadata(&self) -> Option<AuthorizationServerMetadata> {
pub(super) fn account_management_url_builder(&self) -> Option<AccountManagementUrlBuilder> { self.oauth_server_metadata.borrow().clone()
self.account_management_url_builder.borrow().clone()
} }
/// Reload the sessions from the server. /// Reload the sessions from the server.
@ -254,10 +243,9 @@ impl AccountSettings {
glib::Object::builder().property("session", session).build() glib::Object::builder().property("session", session).build()
} }
/// The builder for the account management URL of the OAuth 2.0 /// The OAuth 2.0 authorization server metadata, if any.
/// authorization server, if any. fn oauth_server_metadata(&self) -> Option<AuthorizationServerMetadata> {
fn account_management_url_builder(&self) -> Option<AccountManagementUrlBuilder> { self.imp().oauth_server_metadata()
self.imp().account_management_url_builder()
} }
/// Show the "Encryption" tab. /// Show the "Encryption" tab.
@ -358,14 +346,14 @@ impl AccountSettings {
self.push_subpage(&page); self.push_subpage(&page);
} }
/// Connect to the signal emitted when the builder for the OAuth 2.0 account /// Connect to the signal emitted when the OAuth 2.0 authorization server
/// management URL changed. /// metadata changed.
pub fn connect_account_management_url_builder_changed<F: Fn(&Self) + 'static>( pub fn connect_oauth_server_metadata_changed<F: Fn(&Self) + 'static>(
&self, &self,
f: F, f: F,
) -> glib::SignalHandlerId { ) -> glib::SignalHandlerId {
self.connect_closure( self.connect_closure(
"account-management-url-builder-changed", "oauth-server-metadata-changed",
true, true,
closure_local!(move |obj: Self| { closure_local!(move |obj: Self| {
f(&obj); f(&obj);

34
src/account_settings/user_session/user_session_subpage.rs

@ -1,7 +1,9 @@
use adw::{prelude::*, subclass::prelude::*}; use adw::{prelude::*, subclass::prelude::*};
use gettextrs::gettext; use gettextrs::gettext;
use gtk::{glib, glib::clone}; use gtk::{glib, glib::clone};
use matrix_sdk::authentication::oauth::{AccountManagementActionFull, AccountManagementUrlBuilder}; use ruma::api::client::discovery::get_authorization_server_metadata::v1::{
AccountManagementActionData, AuthorizationServerMetadata, DeviceDeleteData,
};
use tracing::error; use tracing::error;
use crate::{ use crate::{
@ -124,7 +126,7 @@ mod imp {
/// Set the ancestor [`AccountSettings`]. /// Set the ancestor [`AccountSettings`].
fn set_account_settings(&self, account_settings: AccountSettings) { fn set_account_settings(&self, account_settings: AccountSettings) {
let handler = account_settings.connect_account_management_url_builder_changed(clone!( let handler = account_settings.connect_oauth_server_metadata_changed(clone!(
#[weak(rename_to = imp)] #[weak(rename_to = imp)]
self, self,
move |_| { move |_| {
@ -134,10 +136,9 @@ mod imp {
self.account_settings.set(account_settings, vec![handler]); self.account_settings.set(account_settings, vec![handler]);
} }
/// The builder for the account management URL of the OAuth 2.0 /// The OAuth 2.0 authorization server metadata, if any.
/// authorization server, if any. fn oauth_server_metadata(&self) -> Option<AuthorizationServerMetadata> {
fn account_management_url_builder(&self) -> Option<AccountManagementUrlBuilder> { self.account_settings.obj().oauth_server_metadata()
self.account_settings.obj().account_management_url_builder()
} }
/// Update the visible disconnect button. /// Update the visible disconnect button.
@ -158,7 +159,9 @@ mod imp {
}; };
let uses_oauth_api = session.uses_oauth_api(); let uses_oauth_api = session.uses_oauth_api();
let has_account_management_url = self.account_management_url_builder().is_some(); let has_account_management_url = self
.oauth_server_metadata()
.is_some_and(|metadata| metadata.account_management_uri.is_some());
self.log_out_button.set_visible(false); self.log_out_button.set_visible(false);
self.loading_disconnect_button self.loading_disconnect_button
@ -258,21 +261,24 @@ mod imp {
return; return;
}; };
let device_id = user_session.device_id_string().into(); let device_id = user_session.device_id();
let Some(url_builder) = self.account_management_url_builder() else { let Some(metadata) = self.oauth_server_metadata() else {
error!("Could not find account management URL"); error!("Could not find OAuth 2.0 authorization server metadata");
return; return;
}; };
let url = url_builder let Some(url) = metadata.account_management_url_with_action(
.action(AccountManagementActionFull::SessionEnd { device_id }) AccountManagementActionData::DeviceDelete(DeviceDeleteData::new(device_id)),
.build(); ) else {
error!("Could not build OAuth 2.0 account management URL");
return;
};
if let Err(error) = gtk::UriLauncher::new(url.as_str()) if let Err(error) = gtk::UriLauncher::new(url.as_str())
.launch_future(self.obj().root().and_downcast_ref::<gtk::Window>()) .launch_future(self.obj().root().and_downcast_ref::<gtk::Window>())
.await .await
{ {
error!("Could not launch account management URL: {error}"); error!("Could not launch OAuth 2.0 account management URL: {error}");
} }
} }
} }

Loading…
Cancel
Save