1
- // Copyright 2024 New Vector Ltd.
1
+ // Copyright 2024, 2025 New Vector Ltd.
2
2
// Copyright 2022-2024 The Matrix.org Foundation C.I.C.
3
3
//
4
4
// SPDX-License-Identifier: AGPL-3.0-only
@@ -11,7 +11,6 @@ use axum::{
11
11
use axum_extra:: TypedHeader ;
12
12
use hyper:: StatusCode ;
13
13
use mas_axum_utils:: {
14
- SessionInfoExt ,
15
14
cookies:: CookieJar ,
16
15
csrf:: { CsrfExt , ProtectedForm } ,
17
16
sentry:: SentryEventID ,
@@ -27,7 +26,10 @@ use mas_templates::{ConsentContext, PolicyViolationContext, TemplateContext, Tem
27
26
use thiserror:: Error ;
28
27
use ulid:: Ulid ;
29
28
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
+ } ;
31
33
32
34
#[ derive( Debug , Error ) ]
33
35
pub enum RouteError {
@@ -54,6 +56,7 @@ impl_from_error_for_route!(mas_templates::TemplateError);
54
56
impl_from_error_for_route ! ( mas_storage:: RepositoryError ) ;
55
57
impl_from_error_for_route ! ( mas_policy:: LoadError ) ;
56
58
impl_from_error_for_route ! ( mas_policy:: EvaluationError ) ;
59
+ impl_from_error_for_route ! ( crate :: session:: SessionLoadError ) ;
57
60
58
61
impl IntoResponse for RouteError {
59
62
fn into_response ( self ) -> axum:: response:: Response {
@@ -85,9 +88,18 @@ pub(crate) async fn get(
85
88
cookie_jar : CookieJar ,
86
89
Path ( grant_id) : Path < Ulid > ,
87
90
) -> 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
+ } ;
91
103
92
104
let user_agent = user_agent. map ( |ua| ua. to_string ( ) ) ;
93
105
@@ -107,48 +119,48 @@ pub(crate) async fn get(
107
119
return Err ( RouteError :: GrantNotPending ) ;
108
120
}
109
121
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 {
150
123
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 ( ) )
152
164
}
153
165
}
154
166
@@ -161,6 +173,8 @@ pub(crate) async fn get(
161
173
pub ( crate ) async fn post (
162
174
mut rng : BoxRng ,
163
175
clock : BoxClock ,
176
+ PreferredLanguage ( locale) : PreferredLanguage ,
177
+ State ( templates) : State < Templates > ,
164
178
mut policy : Policy ,
165
179
mut repo : BoxRepository ,
166
180
activity_tracker : BoundActivityTracker ,
@@ -172,9 +186,18 @@ pub(crate) async fn post(
172
186
) -> Result < Response , RouteError > {
173
187
cookie_jar. verify_form ( & clock, form) ?;
174
188
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
+ } ;
178
201
179
202
let user_agent = user_agent. map ( |ua| ua. to_string ( ) ) ;
180
203
0 commit comments