From 6ab9703957a5c58a5e989d7b3ee0fb61c8145603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Tue, 3 Mar 2026 16:03:12 +0100 Subject: [PATCH] Upgrade matrix-sdk and ruma crates Brings in a bug fix. --- Cargo.lock | 36 +++++----- Cargo.toml | 8 +-- .../deactivate_account_subpage.rs | 37 ++++++---- src/account_settings/general_page/mod.rs | 36 ++++++---- src/account_settings/mod.rs | 70 ++++++++----------- .../user_session/user_session_subpage.rs | 34 +++++---- 6 files changed, 116 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6d8d414b..1fc965e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2844,7 +2844,7 @@ dependencies = [ [[package]] name = "matrix-sdk" 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 = [ "anymap2", "aquamarine", @@ -2902,7 +2902,7 @@ dependencies = [ [[package]] name = "matrix-sdk-base" 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 = [ "as_variant", "async-trait", @@ -2928,7 +2928,7 @@ dependencies = [ [[package]] name = "matrix-sdk-common" 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 = [ "eyeball-im", "futures-core", @@ -2951,7 +2951,7 @@ dependencies = [ [[package]] name = "matrix-sdk-crypto" 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 = [ "aes", "aquamarine", @@ -2992,7 +2992,7 @@ dependencies = [ [[package]] name = "matrix-sdk-indexeddb" 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 = [ "async-trait", "base64", @@ -3023,7 +3023,7 @@ dependencies = [ [[package]] name = "matrix-sdk-qrcode" 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 = [ "byteorder", "qrcode", @@ -3035,7 +3035,7 @@ dependencies = [ [[package]] name = "matrix-sdk-sqlite" 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 = [ "as_variant", "async-trait", @@ -3062,7 +3062,7 @@ dependencies = [ [[package]] name = "matrix-sdk-store-encryption" 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 = [ "base64", "blake3", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "matrix-sdk-ui" 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 = [ "as_variant", "async-rx", @@ -4042,7 +4042,7 @@ dependencies = [ [[package]] name = "ruma" 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 = [ "assign", "js_int", @@ -4058,7 +4058,7 @@ dependencies = [ [[package]] name = "ruma-client-api" 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 = [ "as_variant", "assign", @@ -4081,7 +4081,7 @@ dependencies = [ [[package]] name = "ruma-common" 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 = [ "as_variant", "base64", @@ -4114,7 +4114,7 @@ dependencies = [ [[package]] name = "ruma-events" 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 = [ "as_variant", "indexmap", @@ -4140,7 +4140,7 @@ dependencies = [ [[package]] name = "ruma-federation-api" 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 = [ "headers", "http", @@ -4159,7 +4159,7 @@ dependencies = [ [[package]] name = "ruma-html" 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 = [ "as_variant", "html5ever", @@ -4171,7 +4171,7 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" 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 = [ "js_int", "thiserror 2.0.18", @@ -4180,7 +4180,7 @@ dependencies = [ [[package]] name = "ruma-macros" 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 = [ "as_variant", "cfg-if", @@ -4196,7 +4196,7 @@ dependencies = [ [[package]] name = "ruma-signatures" 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 = [ "base64", "ed25519-dalek", diff --git a/Cargo.toml b/Cargo.toml index 68298d7b..9a48f0a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,23 +75,23 @@ sourceview = { version = "0.10", package = "sourceview5" } [dependencies.matrix-sdk] # version = "0.14" git = "https://github.com/matrix-org/matrix-rust-sdk.git" -rev = "bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" +rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc" features = ["socks", "sso-login", "markdown", "qrcode"] [dependencies.matrix-sdk-store-encryption] # version = "0.14" git = "https://github.com/matrix-org/matrix-rust-sdk.git" -rev = "bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" +rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc" [dependencies.matrix-sdk-ui] # version = "0.14" git = "https://github.com/matrix-org/matrix-rust-sdk.git" -rev = "bbdfe7b38fd17952beb82e6e13c7d448b53fb2d1" +rev = "029148ef6e45d51e6325a4f5aadcdee7ec9385cc" [dependencies.ruma] # version = "0.14" git = "https://github.com/ruma/ruma.git" -rev = "289bee87974bd3c2ad14a6c15801c80b683b67dc" +rev = "4a0ae80fbf42d1b759e108d7315537d13583c144" features = [ "client-api-c", "markdown", diff --git a/src/account_settings/general_page/deactivate_account_subpage.rs b/src/account_settings/general_page/deactivate_account_subpage.rs index 5106afc0..105c6743 100644 --- a/src/account_settings/general_page/deactivate_account_subpage.rs +++ b/src/account_settings/general_page/deactivate_account_subpage.rs @@ -1,7 +1,9 @@ use adw::{prelude::*, subclass::prelude::*}; use gettextrs::gettext; 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 super::AccountSettings; @@ -71,7 +73,7 @@ mod imp { fn set_account_settings(&self, account_settings: &AccountSettings) { 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)] self, move |_| { @@ -81,17 +83,18 @@ mod imp { self.update_visible_button(); } - /// The builder for the account management URL of the OAuth 2.0 - /// authorization server, if any. - fn account_management_url_builder(&self) -> Option { + /// The OAuth 2.0 authorization server metadata, if any. + fn oauth_server_metadata(&self) -> Option { self.account_settings .upgrade() - .and_then(|s| s.account_management_url_builder()) + .and_then(|s| s.oauth_server_metadata()) } /// Update the visible button for the current state. 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.open_url_button.set_visible(should_open_url); } @@ -112,7 +115,10 @@ mod imp { /// Deactivate the account with the proper method. #[template_callback] 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; } else { self.deactivate_account_with_request().await; @@ -165,20 +171,23 @@ mod imp { // Open the account management URL to deactivate the account. #[template_callback] async fn open_deactivate_account_url(&self) { - let Some(url_builder) = self.account_management_url_builder() else { - error!("Could not find open account management URL"); + let Some(metadata) = self.oauth_server_metadata() else { + error!("Could not find OAuth 2.0 authorization server metadata"); return; }; - let url = url_builder - .action(AccountManagementActionFull::AccountDeactivate) - .build(); + let Some(url) = metadata + .account_management_url_with_action(AccountManagementActionData::AccountDeactivate) + else { + error!("Could not build OAuth 2.0 account management URL"); + return; + }; if let Err(error) = gtk::UriLauncher::new(url.as_str()) .launch_future(self.obj().root().and_downcast_ref::()) .await { - error!("Could not launch account management URL: {error}"); + error!("Could not launch OAuth 2.0 account management URL: {error}"); } } } diff --git a/src/account_settings/general_page/mod.rs b/src/account_settings/general_page/mod.rs index d5f1e8b0..a1e46bbf 100644 --- a/src/account_settings/general_page/mod.rs +++ b/src/account_settings/general_page/mod.rs @@ -1,13 +1,17 @@ use adw::{prelude::*, subclass::prelude::*}; use gettextrs::gettext; use gtk::{gio, glib, glib::clone}; -use matrix_sdk::authentication::oauth::{AccountManagementActionFull, AccountManagementUrlBuilder}; use ruma::{ OwnedMxcUri, api::{ Metadata, SupportedVersions, client::{ - discovery::get_capabilities::v3::Capabilities, + discovery::{ + get_authorization_server_metadata::v1::{ + AccountManagementActionData, AuthorizationServerMetadata, + }, + get_capabilities::v3::Capabilities, + }, profile::{ProfileFieldName, delete_profile_field}, }, }, @@ -191,7 +195,7 @@ mod imp { self.account_settings.set(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)] self, move |_| { @@ -203,12 +207,11 @@ mod imp { self.update_capabilities(); } - /// The builder for the account management URL of the OAuth 2.0 - /// authorization server, if any. - fn account_management_url_builder(&self) -> Option { + /// The OAuth 2.0 authorization server metadata, if any. + fn oauth_server_metadata(&self) -> Option { self.account_settings .upgrade() - .and_then(|s| s.account_management_url_builder()) + .and_then(|s| s.oauth_server_metadata()) } /// Load the possible changes on the user account. @@ -255,7 +258,9 @@ mod imp { }; 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(); self.avatar.set_editable( @@ -276,20 +281,23 @@ mod imp { /// Open the URL to manage the account. #[template_callback] async fn manage_account(&self) { - let Some(url_builder) = self.account_management_url_builder() else { - error!("Could not find open account management URL"); + let Some(metadata) = self.oauth_server_metadata() else { + error!("Could not find OAuth 2.0 authorization server metadata"); return; }; - let url = url_builder - .action(AccountManagementActionFull::Profile) - .build(); + let Some(url) = + metadata.account_management_url_with_action(AccountManagementActionData::Profile) + else { + error!("Could not build OAuth 2.0 account management URL"); + return; + }; if let Err(error) = gtk::UriLauncher::new(url.as_str()) .launch_future(self.obj().root().and_downcast_ref::()) .await { - error!("Could not launch account management URL: {error}"); + error!("Could not launch OAuth 2.0 account management URL: {error}"); } } diff --git a/src/account_settings/mod.rs b/src/account_settings/mod.rs index 3a46dd14..da833fcb 100644 --- a/src/account_settings/mod.rs +++ b/src/account_settings/mod.rs @@ -3,9 +3,8 @@ use gtk::{ glib, glib::{clone, closure_local}, }; -use matrix_sdk::authentication::oauth::{ - AccountManagementUrlBuilder, OAuthError, error::OAuthDiscoveryError, -}; +use matrix_sdk::authentication::oauth::error::OAuthDiscoveryError; +use ruma::api::client::discovery::get_authorization_server_metadata::v1::AuthorizationServerMetadata; use tracing::{error, warn}; mod encryption_page; @@ -65,9 +64,8 @@ mod imp { /// The current session. #[property(get, set = Self::set_session, nullable)] session: BoundObjectWeakRef, - /// The builder for the account management URL of the OAuth 2.0 - /// authorization server, if any. - account_management_url_builder: RefCell>, + /// The OAuth 2.0 authorization server metadata, if any. + oauth_server_metadata: RefCell>, } #[glib::object_subclass] @@ -133,9 +131,8 @@ mod imp { #[glib::derived_properties] impl ObjectImpl for AccountSettings { fn signals() -> &'static [Signal] { - static SIGNALS: LazyLock> = LazyLock::new(|| { - vec![Signal::builder("account-management-url-builder-changed").build()] - }); + static SIGNALS: LazyLock> = + LazyLock::new(|| vec![Signal::builder("oauth-server-metadata-changed").build()]); SIGNALS.as_ref() } } @@ -153,7 +150,7 @@ mod imp { let obj = self.obj(); self.session.disconnect_signals(); - self.set_account_management_url_builder(None); + self.set_oauth_server_metadata(None); if let Some(session) = session { let logged_out_handler = session.connect_logged_out(clone!( @@ -179,7 +176,7 @@ mod imp { #[weak(rename_to = imp)] self, async move { - imp.load_account_management_url_builder().await; + imp.load_oauth_server_metadata().await; } )); } @@ -187,47 +184,39 @@ mod imp { obj.notify_session(); } - /// Load the builder for the account management URL of the OAuth 2.0 - /// authorization server. - async fn load_account_management_url_builder(&self) { + /// Load the the OAuth 2.0 authorization server metadata. + async fn load_oauth_server_metadata(&self) { let Some(session) = self.session.obj() else { return; }; 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") { - Ok(url_builder) => url_builder, + let metadata = match handle.await.expect("task was not aborted") { + Ok(metadata) => Some(metadata), Err(error) => { // Ignore the error that says that OAuth 2.0 is not supported, it can happen. - if !matches!( - error, - OAuthError::Discovery(OAuthDiscoveryError::NotSupported) - ) { - warn!("Could not fetch OAuth 2.0 account management URL: {error}"); + if !matches!(error, OAuthDiscoveryError::NotSupported) { + warn!("Could not fetch OAuth 2.0 authorization server metadata: {error}"); } 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 /// authorization server. - fn set_account_management_url_builder( - &self, - url_builder: Option, - ) { - self.account_management_url_builder.replace(url_builder); + fn set_oauth_server_metadata(&self, metadata: Option) { + self.oauth_server_metadata.replace(metadata); 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 - /// authorization server, if any. - pub(super) fn account_management_url_builder(&self) -> Option { - self.account_management_url_builder.borrow().clone() + /// The OAuth 2.0 authorization server metadata, if any. + pub(super) fn oauth_server_metadata(&self) -> Option { + self.oauth_server_metadata.borrow().clone() } /// Reload the sessions from the server. @@ -254,10 +243,9 @@ impl AccountSettings { glib::Object::builder().property("session", session).build() } - /// The builder for the account management URL of the OAuth 2.0 - /// authorization server, if any. - fn account_management_url_builder(&self) -> Option { - self.imp().account_management_url_builder() + /// The OAuth 2.0 authorization server metadata, if any. + fn oauth_server_metadata(&self) -> Option { + self.imp().oauth_server_metadata() } /// Show the "Encryption" tab. @@ -358,14 +346,14 @@ impl AccountSettings { self.push_subpage(&page); } - /// Connect to the signal emitted when the builder for the OAuth 2.0 account - /// management URL changed. - pub fn connect_account_management_url_builder_changed( + /// Connect to the signal emitted when the OAuth 2.0 authorization server + /// metadata changed. + pub fn connect_oauth_server_metadata_changed( &self, f: F, ) -> glib::SignalHandlerId { self.connect_closure( - "account-management-url-builder-changed", + "oauth-server-metadata-changed", true, closure_local!(move |obj: Self| { f(&obj); diff --git a/src/account_settings/user_session/user_session_subpage.rs b/src/account_settings/user_session/user_session_subpage.rs index 81c4927e..c33f9dca 100644 --- a/src/account_settings/user_session/user_session_subpage.rs +++ b/src/account_settings/user_session/user_session_subpage.rs @@ -1,7 +1,9 @@ use adw::{prelude::*, subclass::prelude::*}; use gettextrs::gettext; 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 crate::{ @@ -124,7 +126,7 @@ mod imp { /// Set the ancestor [`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)] self, move |_| { @@ -134,10 +136,9 @@ mod imp { self.account_settings.set(account_settings, vec![handler]); } - /// The builder for the account management URL of the OAuth 2.0 - /// authorization server, if any. - fn account_management_url_builder(&self) -> Option { - self.account_settings.obj().account_management_url_builder() + /// The OAuth 2.0 authorization server metadata, if any. + fn oauth_server_metadata(&self) -> Option { + self.account_settings.obj().oauth_server_metadata() } /// Update the visible disconnect button. @@ -158,7 +159,9 @@ mod imp { }; 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.loading_disconnect_button @@ -258,21 +261,24 @@ mod imp { return; }; - let device_id = user_session.device_id_string().into(); - let Some(url_builder) = self.account_management_url_builder() else { - error!("Could not find account management URL"); + let device_id = user_session.device_id(); + let Some(metadata) = self.oauth_server_metadata() else { + error!("Could not find OAuth 2.0 authorization server metadata"); return; }; - let url = url_builder - .action(AccountManagementActionFull::SessionEnd { device_id }) - .build(); + let Some(url) = metadata.account_management_url_with_action( + AccountManagementActionData::DeviceDelete(DeviceDeleteData::new(device_id)), + ) else { + error!("Could not build OAuth 2.0 account management URL"); + return; + }; if let Err(error) = gtk::UriLauncher::new(url.as_str()) .launch_future(self.obj().root().and_downcast_ref::()) .await { - error!("Could not launch account management URL: {error}"); + error!("Could not launch OAuth 2.0 account management URL: {error}"); } } }