1- // Copyright 2024 New Vector Ltd.
1+ // Copyright 2024, 2025 New Vector Ltd.
22// Copyright 2022-2024 The Matrix.org Foundation C.I.C.
33//
44// SPDX-License-Identifier: AGPL-3.0-only
@@ -11,7 +11,6 @@ use axum::{
1111use axum_extra:: TypedHeader ;
1212use hyper:: StatusCode ;
1313use mas_axum_utils:: {
14- SessionInfoExt ,
1514 cookies:: CookieJar ,
1615 csrf:: { CsrfExt , ProtectedForm } ,
1716 sentry:: SentryEventID ,
@@ -27,7 +26,10 @@ use mas_templates::{ConsentContext, PolicyViolationContext, TemplateContext, Tem
2726use thiserror:: Error ;
2827use ulid:: Ulid ;
2928
30- use crate :: { BoundActivityTracker , PreferredLanguage , impl_from_error_for_route} ;
29+ use crate :: {
30+ BoundActivityTracker , PreferredLanguage , impl_from_error_for_route,
31+ session:: { SessionOrFallback , load_session_or_fallback} ,
32+ } ;
3133
3234#[ derive( Debug , Error ) ]
3335pub enum RouteError {
@@ -54,6 +56,7 @@ impl_from_error_for_route!(mas_templates::TemplateError);
5456impl_from_error_for_route ! ( mas_storage:: RepositoryError ) ;
5557impl_from_error_for_route ! ( mas_policy:: LoadError ) ;
5658impl_from_error_for_route ! ( mas_policy:: EvaluationError ) ;
59+ impl_from_error_for_route ! ( crate :: session:: SessionLoadError ) ;
5760
5861impl IntoResponse for RouteError {
5962 fn into_response ( self ) -> axum:: response:: Response {
@@ -85,9 +88,18 @@ pub(crate) async fn get(
8588 cookie_jar : CookieJar ,
8689 Path ( grant_id) : Path < Ulid > ,
8790) -> Result < Response , RouteError > {
88- let ( session_info, cookie_jar) = cookie_jar. session_info ( ) ;
89-
90- let maybe_session = session_info. load_session ( & mut repo) . await ?;
91+ let ( cookie_jar, maybe_session) = match load_session_or_fallback (
92+ cookie_jar, & clock, & mut rng, & templates, & locale, & mut repo,
93+ )
94+ . await ?
95+ {
96+ SessionOrFallback :: MaybeSession {
97+ cookie_jar,
98+ maybe_session,
99+ ..
100+ } => ( cookie_jar, maybe_session) ,
101+ SessionOrFallback :: Fallback { response } => return Ok ( response) ,
102+ } ;
91103
92104 let user_agent = user_agent. map ( |ua| ua. to_string ( ) ) ;
93105
@@ -107,48 +119,48 @@ pub(crate) async fn get(
107119 return Err ( RouteError :: GrantNotPending ) ;
108120 }
109121
110- if let Some ( session) = maybe_session {
111- activity_tracker
112- . record_browser_session ( & clock, & session)
113- . await ;
114-
115- let ( csrf_token, cookie_jar) = cookie_jar. csrf_token ( & clock, & mut rng) ;
116-
117- let res = policy
118- . evaluate_authorization_grant ( mas_policy:: AuthorizationGrantInput {
119- user : Some ( & session. user ) ,
120- client : & client,
121- scope : & grant. scope ,
122- grant_type : mas_policy:: GrantType :: AuthorizationCode ,
123- requester : mas_policy:: Requester {
124- ip_address : activity_tracker. ip ( ) ,
125- user_agent,
126- } ,
127- } )
128- . await ?;
129-
130- if res. valid ( ) {
131- let ctx = ConsentContext :: new ( grant, client)
132- . with_session ( session)
133- . with_csrf ( csrf_token. form_value ( ) )
134- . with_language ( locale) ;
135-
136- let content = templates. render_consent ( & ctx) ?;
137-
138- Ok ( ( cookie_jar, Html ( content) ) . into_response ( ) )
139- } else {
140- let ctx = PolicyViolationContext :: for_authorization_grant ( grant, client)
141- . with_session ( session)
142- . with_csrf ( csrf_token. form_value ( ) )
143- . with_language ( locale) ;
144-
145- let content = templates. render_policy_violation ( & ctx) ?;
146-
147- Ok ( ( cookie_jar, Html ( content) ) . into_response ( ) )
148- }
149- } else {
122+ let Some ( session) = maybe_session else {
150123 let login = mas_router:: Login :: and_continue_grant ( grant_id) ;
151- Ok ( ( cookie_jar, url_builder. redirect ( & login) ) . into_response ( ) )
124+ return Ok ( ( cookie_jar, url_builder. redirect ( & login) ) . into_response ( ) ) ;
125+ } ;
126+
127+ activity_tracker
128+ . record_browser_session ( & clock, & session)
129+ . await ;
130+
131+ let ( csrf_token, cookie_jar) = cookie_jar. csrf_token ( & clock, & mut rng) ;
132+
133+ let res = policy
134+ . evaluate_authorization_grant ( mas_policy:: AuthorizationGrantInput {
135+ user : Some ( & session. user ) ,
136+ client : & client,
137+ scope : & grant. scope ,
138+ grant_type : mas_policy:: GrantType :: AuthorizationCode ,
139+ requester : mas_policy:: Requester {
140+ ip_address : activity_tracker. ip ( ) ,
141+ user_agent,
142+ } ,
143+ } )
144+ . await ?;
145+
146+ if res. valid ( ) {
147+ let ctx = ConsentContext :: new ( grant, client)
148+ . with_session ( session)
149+ . with_csrf ( csrf_token. form_value ( ) )
150+ . with_language ( locale) ;
151+
152+ let content = templates. render_consent ( & ctx) ?;
153+
154+ Ok ( ( cookie_jar, Html ( content) ) . into_response ( ) )
155+ } else {
156+ let ctx = PolicyViolationContext :: for_authorization_grant ( grant, client)
157+ . with_session ( session)
158+ . with_csrf ( csrf_token. form_value ( ) )
159+ . with_language ( locale) ;
160+
161+ let content = templates. render_policy_violation ( & ctx) ?;
162+
163+ Ok ( ( cookie_jar, Html ( content) ) . into_response ( ) )
152164 }
153165}
154166
@@ -161,6 +173,8 @@ pub(crate) async fn get(
161173pub ( crate ) async fn post (
162174 mut rng : BoxRng ,
163175 clock : BoxClock ,
176+ PreferredLanguage ( locale) : PreferredLanguage ,
177+ State ( templates) : State < Templates > ,
164178 mut policy : Policy ,
165179 mut repo : BoxRepository ,
166180 activity_tracker : BoundActivityTracker ,
@@ -172,9 +186,18 @@ pub(crate) async fn post(
172186) -> Result < Response , RouteError > {
173187 cookie_jar. verify_form ( & clock, form) ?;
174188
175- let ( session_info, cookie_jar) = cookie_jar. session_info ( ) ;
176-
177- let maybe_session = session_info. load_session ( & mut repo) . await ?;
189+ let ( cookie_jar, maybe_session) = match load_session_or_fallback (
190+ cookie_jar, & clock, & mut rng, & templates, & locale, & mut repo,
191+ )
192+ . await ?
193+ {
194+ SessionOrFallback :: MaybeSession {
195+ cookie_jar,
196+ maybe_session,
197+ ..
198+ } => ( cookie_jar, maybe_session) ,
199+ SessionOrFallback :: Fallback { response } => return Ok ( response) ,
200+ } ;
178201
179202 let user_agent = user_agent. map ( |ua| ua. to_string ( ) ) ;
180203
0 commit comments