22// SPDX-License-Identifier: Apache-2.0
33
44use anyhow;
5- use axum:: extract:: MatchedPath ;
6- use axum:: extract:: Request as ExtractRequest ;
75use axum:: {
6+ extract:: { MatchedPath , Request as ExtractRequest } ,
87 http:: { Method , Request } ,
98 middleware:: { from_fn, from_fn_with_state} ,
109 response:: IntoResponse ,
@@ -26,20 +25,24 @@ use std::{
2625} ;
2726use tap_core:: { manager:: Manager , receipt:: checks:: CheckList , tap_eip712_domain} ;
2827use thegraph_core:: { Address , Attestation } ;
29- use tokio:: net:: TcpListener ;
30- use tokio:: signal;
31- use tokio:: sync:: watch:: Receiver ;
28+ use tokio:: { net:: TcpListener , signal, sync:: watch:: Receiver } ;
3229use tower:: ServiceBuilder ;
3330use tower_governor:: { governor:: GovernorConfigBuilder , GovernorLayer } ;
34- use tower_http:: validate_request:: ValidateRequestHeaderLayer ;
35- use tower_http:: { cors, cors:: CorsLayer , normalize_path:: NormalizePath , trace:: TraceLayer } ;
36- use tracing:: warn;
37- use tracing:: { error, info, info_span} ;
31+ use tower_http:: {
32+ auth:: AsyncRequireAuthorizationLayer ,
33+ cors:: { self , CorsLayer } ,
34+ normalize_path:: NormalizePath ,
35+ trace:: TraceLayer ,
36+ validate_request:: ValidateRequestHeaderLayer ,
37+ } ;
38+ use tracing:: { error, info, info_span, warn} ;
3839
3940use crate :: {
40- metrics:: { HANDLER_FAILURE , HANDLER_HISTOGRAM } ,
41+ metrics:: { FAILED_RECEIPT , HANDLER_FAILURE , HANDLER_HISTOGRAM } ,
4142 middleware:: {
42- allocation_middleware, deployment_middleware, labels_middleware, receipt_middleware,
43+ allocation_middleware,
44+ auth:: { self , Bearer , OrExt } ,
45+ context_middleware, deployment_middleware, labels_middleware, receipt_middleware,
4346 sender_middleware, AllocationState , PrometheusMetricsMiddlewareLayer , SenderState ,
4447 } ,
4548 routes:: { health, request_handler, static_subgraph_request_handler} ,
@@ -96,7 +99,6 @@ pub struct IndexerServiceOptions {
9699pub struct IndexerServiceState {
97100 pub config : Config ,
98101 pub attestation_signers : Receiver < HashMap < Address , AttestationSigner > > ,
99- pub tap_manager : Manager < IndexerTapContext > ,
100102 pub service_impl : SubgraphService ,
101103}
102104
@@ -266,16 +268,15 @@ pub async fn run(options: IndexerServiceOptions) -> Result<(), anyhow::Error> {
266268 )
267269 . await ;
268270
269- let tap_manager = Manager :: new (
271+ let tap_manager = Box :: leak ( Box :: new ( Manager :: new (
270272 domain_separator. clone ( ) ,
271273 indexer_context,
272274 CheckList :: new ( checks) ,
273- ) ;
275+ ) ) ) ;
274276
275277 let state = Arc :: new ( IndexerServiceState {
276278 config : options. config . clone ( ) ,
277279 attestation_signers,
278- tap_manager,
279280 service_impl : options. service_impl ,
280281 } ) ;
281282
@@ -361,6 +362,22 @@ pub async fn run(options: IndexerServiceOptions) -> Result<(), anyhow::Error> {
361362
362363 misc_routes = misc_routes. with_state ( state. clone ( ) ) ;
363364
365+ let mut request_handler_route = post ( request_handler) ;
366+
367+ // inject auth
368+ let failed_receipt_metric = Box :: leak ( Box :: new ( FAILED_RECEIPT . clone ( ) ) ) ;
369+ let tap_auth = auth:: tap_receipt_authorize ( tap_manager, failed_receipt_metric) ;
370+
371+ if let Some ( free_auth_token) = & options. config . service . serve_auth_token {
372+ let free_query = Bearer :: new ( free_auth_token) ;
373+ let result = free_query. or ( tap_auth) ;
374+ let auth_layer = AsyncRequireAuthorizationLayer :: new ( result) ;
375+ request_handler_route = request_handler_route. layer ( auth_layer) ;
376+ } else {
377+ let auth_layer = AsyncRequireAuthorizationLayer :: new ( tap_auth) ;
378+ request_handler_route = request_handler_route. layer ( auth_layer) ;
379+ }
380+
364381 let deployment_to_allocation = deployment_to_allocation ( allocations) ;
365382 let allocation_state = AllocationState {
366383 deployment_to_allocation,
@@ -385,15 +402,19 @@ pub async fn run(options: IndexerServiceOptions) -> Result<(), anyhow::Error> {
385402 . layer ( PrometheusMetricsMiddlewareLayer :: new (
386403 HANDLER_HISTOGRAM . clone ( ) ,
387404 HANDLER_FAILURE . clone ( ) ,
388- ) ) ;
405+ ) )
406+ // tap context
407+ . layer ( from_fn ( context_middleware) ) ;
408+
409+ request_handler_route = request_handler_route. layer ( service_builder) ;
389410
390411 let data_routes = Router :: new ( )
391412 . route (
392413 PathBuf :: from ( & options. config . service . url_prefix )
393414 . join ( format ! ( "{}/id/:id" , options. url_namespace) )
394415 . to_str ( )
395416 . expect ( "Failed to set up `/{url_namespace}/id/:id` route" ) ,
396- post ( request_handler ) . route_layer ( service_builder ) ,
417+ request_handler_route ,
397418 )
398419 . with_state ( state. clone ( ) ) ;
399420
0 commit comments