@@ -27,7 +27,7 @@ use axum::{
27
27
extract:: { RawQuery , State as AxumState } ,
28
28
http:: StatusCode ,
29
29
response:: { Html , IntoResponse , Response } ,
30
- Json ,
30
+ Extension , Json ,
31
31
} ;
32
32
use axum_extra:: typed_header:: TypedHeader ;
33
33
use chrono:: { DateTime , Utc } ;
@@ -65,6 +65,13 @@ use crate::{impl_from_error_for_route, passwords::PasswordManager, BoundActivity
65
65
#[ cfg( test) ]
66
66
mod tests;
67
67
68
+ /// Extra parameters we get from the listener configuration, because they are
69
+ /// per-listener options. We pass them through request extensions.
70
+ #[ derive( Debug , Clone ) ]
71
+ pub struct ExtraRouterParameters {
72
+ pub undocumented_oauth2_access : bool ,
73
+ }
74
+
68
75
struct GraphQLState {
69
76
pool : PgPool ,
70
77
homeserver_connection : Arc < dyn HomeserverConnection < Error = anyhow:: Error > > ,
@@ -217,13 +224,19 @@ impl IntoResponse for RouteError {
217
224
}
218
225
219
226
async fn get_requester (
227
+ undocumented_oauth2_access : bool ,
220
228
clock : & impl Clock ,
221
229
activity_tracker : & BoundActivityTracker ,
222
230
mut repo : BoxRepository ,
223
231
session_info : SessionInfo ,
224
232
token : Option < & str > ,
225
233
) -> Result < Requester , RouteError > {
226
234
let requester = if let Some ( token) = token {
235
+ // If we haven't enabled undocumented_oauth2_access on the listener, we bail out
236
+ if !undocumented_oauth2_access {
237
+ return Err ( RouteError :: InvalidToken ) ;
238
+ }
239
+
227
240
let token = repo
228
241
. oauth2_access_token ( )
229
242
. find_by_token ( token)
@@ -281,6 +294,9 @@ async fn get_requester(
281
294
282
295
pub async fn post (
283
296
AxumState ( schema) : AxumState < Schema > ,
297
+ Extension ( ExtraRouterParameters {
298
+ undocumented_oauth2_access,
299
+ } ) : Extension < ExtraRouterParameters > ,
284
300
clock : BoxClock ,
285
301
repo : BoxRepository ,
286
302
activity_tracker : BoundActivityTracker ,
@@ -294,7 +310,15 @@ pub async fn post(
294
310
. as_ref ( )
295
311
. map ( |TypedHeader ( Authorization ( bearer) ) | bearer. token ( ) ) ;
296
312
let ( session_info, _cookie_jar) = cookie_jar. session_info ( ) ;
297
- let requester = get_requester ( & clock, & activity_tracker, repo, session_info, token) . await ?;
313
+ let requester = get_requester (
314
+ undocumented_oauth2_access,
315
+ & clock,
316
+ & activity_tracker,
317
+ repo,
318
+ session_info,
319
+ token,
320
+ )
321
+ . await ?;
298
322
299
323
let content_type = content_type. map ( |TypedHeader ( h) | h. to_string ( ) ) ;
300
324
@@ -323,6 +347,9 @@ pub async fn post(
323
347
324
348
pub async fn get (
325
349
AxumState ( schema) : AxumState < Schema > ,
350
+ Extension ( ExtraRouterParameters {
351
+ undocumented_oauth2_access,
352
+ } ) : Extension < ExtraRouterParameters > ,
326
353
clock : BoxClock ,
327
354
repo : BoxRepository ,
328
355
activity_tracker : BoundActivityTracker ,
@@ -334,7 +361,15 @@ pub async fn get(
334
361
. as_ref ( )
335
362
. map ( |TypedHeader ( Authorization ( bearer) ) | bearer. token ( ) ) ;
336
363
let ( session_info, _cookie_jar) = cookie_jar. session_info ( ) ;
337
- let requester = get_requester ( & clock, & activity_tracker, repo, session_info, token) . await ?;
364
+ let requester = get_requester (
365
+ undocumented_oauth2_access,
366
+ & clock,
367
+ & activity_tracker,
368
+ repo,
369
+ session_info,
370
+ token,
371
+ )
372
+ . await ?;
338
373
339
374
let request =
340
375
async_graphql:: http:: parse_query_string ( & query. unwrap_or_default ( ) ) ?. data ( requester) ;
0 commit comments