@@ -9,9 +9,9 @@ use mas_storage::{RepositoryAccess, upstream_oauth2::UpstreamOAuthProviderReposi
99use serde:: { Deserialize , Serialize } ;
1010use thiserror:: Error ;
1111use tracing:: error;
12- use url:: Url ;
1312
14- use crate :: impl_from_error_for_route;
13+ use super :: cache:: LazyProviderInfos ;
14+ use crate :: { MetadataCache , impl_from_error_for_route} ;
1515
1616#[ derive( Serialize , Deserialize ) ]
1717struct LogoutToken {
@@ -40,6 +40,7 @@ pub enum RouteError {
4040}
4141
4242impl_from_error_for_route ! ( mas_storage:: RepositoryError ) ;
43+ impl_from_error_for_route ! ( mas_oidc_client:: error:: DiscoveryError ) ;
4344
4445impl From < reqwest:: Error > for RouteError {
4546 fn from ( err : reqwest:: Error ) -> Self {
@@ -67,14 +68,15 @@ impl From<reqwest::Error> for RouteError {
6768/// Returns a `RouteError` if there's an issue accessing the repository
6869pub async fn get_rp_initiated_logout_endpoints < E > (
6970 url_builder : & UrlBuilder ,
71+ metadata_cache : & MetadataCache ,
72+ client : & reqwest:: Client ,
7073 repo : & mut impl RepositoryAccess < Error = E > ,
7174 browser_session : & BrowserSession ,
7275) -> Result < UpstreamLogoutInfo , RouteError >
7376where
7477 RouteError : std:: convert:: From < E > ,
7578{
7679 let mut result: UpstreamLogoutInfo = UpstreamLogoutInfo :: default ( ) ;
77- // Set the post-logout redirect URI to our app's logout completion page
7880 let post_logout_redirect_uri = url_builder
7981 . absolute_url_for ( & mas_router:: Login :: default ( ) )
8082 . to_string ( ) ;
@@ -93,42 +95,39 @@ where
9395 } ) ?
9496 . ok_or ( RouteError :: SessionNotFound ) ?;
9597
96- // Get the session and assign its value, wrapped in Some
9798 let upstream_session = repo
9899 . upstream_oauth_session ( )
99100 . lookup ( upstream_oauth2_session_id)
100101 . await ?
101102 . ok_or ( RouteError :: SessionNotFound ) ?;
102- // Get the provider and assign its value, wrapped in Some
103+
103104 let provider = repo
104105 . upstream_oauth_provider ( )
105106 . lookup ( upstream_session. provider_id )
106107 . await ?
107108 . filter ( |provider| provider. allow_rp_initiated_logout )
108109 . ok_or ( RouteError :: ProviderNotFound ) ?;
109110
110- // Look for end session endpoint
111- // In a real implementation, we'd have end_session_endpoint fields in the
112- // provider For now, we'll try to construct one from the issuer if
113- // available
114- if let Some ( issuer) = & provider. issuer {
115- let end_session_endpoint = format ! ( "{issuer}/protocol/openid-connect/logout" ) ;
116- let mut logout_url = end_session_endpoint;
117- // Add post_logout_redirect_uri
118- if let Some ( post_uri) = & result. post_logout_redirect_uri {
119- if let Ok ( mut url) = Url :: parse ( & logout_url) {
120- url. query_pairs_mut ( )
121- . append_pair ( "post_logout_redirect_uri" , post_uri) ;
122- url. query_pairs_mut ( )
123- . append_pair ( "client_id" , & provider. client_id ) ;
124- // Add id_token_hint if available
125- if let Some ( id_token) = upstream_session. id_token ( ) {
126- url. query_pairs_mut ( ) . append_pair ( "id_token_hint" , id_token) ;
127- }
128- logout_url = url. to_string ( ) ;
129- }
111+ // Add post_logout_redirect_uri
112+ if let Some ( post_uri) = & result. post_logout_redirect_uri {
113+ let mut lazy_metadata = LazyProviderInfos :: new ( & metadata_cache, & provider, & client) ;
114+ let mut end_session_url = lazy_metadata. end_session_endpoint ( ) . await ?. clone ( ) ;
115+ end_session_url
116+ . query_pairs_mut ( )
117+ . append_pair ( "post_logout_redirect_uri" , post_uri) ;
118+ end_session_url
119+ . query_pairs_mut ( )
120+ . append_pair ( "client_id" , & provider. client_id ) ;
121+ // Add id_token_hint if available
122+ if let Some ( id_token) = upstream_session. id_token ( ) {
123+ end_session_url
124+ . query_pairs_mut ( )
125+ . append_pair ( "id_token_hint" , id_token) ;
130126 }
131- result. logout_endpoints . clone_from ( & logout_url) ;
127+ result
128+ . logout_endpoints
129+ . clone_from ( & end_session_url. to_string ( ) ) ;
132130 }
131+
133132 Ok ( result)
134133}
0 commit comments