package Ġno . nav . pens jon . sel v bet j ening . f ss gw . common Ċ Ċ import Ġio . json web token . Jwt Exception Ċ import Ġio . micro meter . core . instrument . Metrics Ċ import Ġno . nav . pens jon . sel v bet j ening . f ss gw . tech . jwt . J ws Validator Ċ import Ġno . nav . pens jon . sel v bet j ening . f ss gw . tech . oauth 2 . Oauth 2 Exception Ċ import Ġno . nav . pens jon . sel v bet j ening . f ss gw . tech . sts . Service Token Getter Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . http . HttpHeaders Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . util . StringUtils . has Text Ċ import Ġjava . util .* Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ Ċ abstract Ġclass ĠController Base ( ĊĠĠĠ Ġprivate Ġval Ġj ws Validator : ĠJ ws Validator , ĊĠĠĠ Ġprivate Ġval Ġservice Client : ĠService Client , ĊĠĠĠ Ġprivate Ġval Ġe gress Token Getter : ĠService Token Getter , ĊĠĠĠ Ġprivate Ġval Ġe gress Endpoint : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġauth Type Ġ= Ġ" Bearer " ĊĠĠĠ Ġprivate Ġval Ġcall Id Header Name Ġ= Ġ" Nav - Call - Id " ĊĠĠĠ Ġprivate Ġval Ġconsumer Token Header Name Ġ= Ġ" Nav - Consumer - Token " ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġprivate Ġval Ġnot Relay ed Headers Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠHttp Headers . ACCEPT . toLowerCase (), ĊĠĠĠĠĠĠĠ ĠHttp Headers . AUTHORIZATION . toLowerCase (), ĊĠĠĠĠĠĠĠ ĠHttp Headers . HOST . toLowerCase (), ĊĠĠĠĠĠĠĠ ĠHttp Headers . USER _ AGENT . toLowerCase (), ĊĠĠĠĠĠĠĠ ĠHttp Headers . CONTENT _ LENGTH . toLowerCase (), ĊĠĠĠĠĠĠĠ Ġconsumer Token Header Name . toLowerCase () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġdo Get ( request : ĠHttpServletRequest ): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ingress Auth ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders To Relay Ġ= Ġget E gress Headers ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Part Ġ= Ġif Ġ( has Text ( request . queryString )) Ġ"? ${ request . queryString }" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ e gress Endpoint ${ request . request URI }$ query Part " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġservice Client . do Get ( url , Ġheaders To Relay ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . counter (" request _ counter ", Ġ" action ", Ġ" get ", Ġ" status ", Ġ" OK "). increment () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity ( response Body , Ġjson ContentType , ĠHttpStatus . OK ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJwt Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun authorized ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO auth 2 Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun authorized ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠConsumer Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . counter (" request _ counter ", Ġ" action ", Ġ" get ", Ġ" status ", Ġ" error "). increment () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity (""" {" error ": Ġ"${ e . message } "} """, Ġjson ContentType , ĠHttpStatus . BAD _ GATE WAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Post ( request : ĠHttpServletRequest , Ġbody : ĠString ): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ingress Auth ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders To Relay Ġ= Ġget E gress Headers ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Part Ġ= Ġif Ġ( has Text ( request . queryString )) Ġ"? ${ request . queryString }" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ e gress Endpoint ${ request . request URI }$ query Part " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġservice Client . do Post ( url , Ġheaders To Relay , Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . counter (" request _ counter ", Ġ" action ", Ġ" post ", Ġ" status ", Ġ" OK "). increment () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity ( response Body , Ġjson ContentType , ĠHttpStatus . OK ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJwt Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun authorized ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠO auth 2 Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun authorized ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠConsumer Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetrics . counter (" request _ counter ", Ġ" action ", Ġ" post ", Ġ" status ", Ġ" error "). increment () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity (""" {" error ": Ġ"${ e . message } "} """, Ġjson ContentType , ĠHttpStatus . BAD _ GATE WAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġe gress Auth Wa ived (): ĠBoolean ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġconsumer Token Required (): ĠBoolean ĊĊĠĠĠ Ġprivate Ġfun Ġget E gress Headers ( request : ĠHttpServletRequest ): ĠTreeMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe gress Headers Ġ= ĠTreeMap < String , ĠString >( String . CASE _ INS ENS ITIVE _ ORDER ) ĊĠĠĠĠĠĠĠ Ġrequest . header Names . toList (). forEach Ġ{ Ġcopy Header ( request , Ġit , Ġe gress Headers ) Ġ} ĊĠĠĠĠĠĠĠ Ġadd Auth Header IfNeeded ( e gress Headers ) ĊĠĠĠĠĠĠĠ Ġadd Call Id Header IfNeeded ( e gress Headers ) ĊĠĠĠĠĠĠĠ Ġreturn Ġe gress Headers ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Auth Header IfNeeded ( headers : ĠTreeMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e gress Auth Wa ived ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġe gress Token Getter . getService User Token (). accessToken ĊĠĠĠĠĠĠĠ Ġval Ġauth Ġ= Ġ"$ auth Type Ġ$ token " ĊĠĠĠĠĠĠĠ Ġheaders [ HttpHeaders . AUTHORIZATION ] Ġ= Ġauth ĊĊĠĠĠĠĠĠĠ Ġif Ġ( consumer Token Required ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders [ consumer Token Header Name ] Ġ= Ġauth ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Call Id Header IfNeeded ( headers : ĠTreeMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( headers . containsKey ( call Id Header Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġheaders [ call Id Header Name ] Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Header ( request : ĠHttpServletRequest , Ġheader Name : ĠString , Ġheaders : ĠTreeMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( not Relay ed Headers . contains ( header Name . toLowerCase ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġheaders [ header Name ] Ġ= Ġrequest . getHeader ( header Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Ingress Auth ( request : ĠHttpServletRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth : ĠString ? Ġ= Ġrequest . getHeader ( HttpHeaders . AUTHORIZATION ) ĊĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠString Ġ= Ġauth ?. substring ( auth Type . length Ġ+ Ġ 1 ) Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! has Text ( accessToken )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJwt Exception (" Missing Ġaccess Ġtoken ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġj ws Validator . validate ( accessToken ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun authorized ( e : ĠException ): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġun authorized ( e . message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun authorized ( message : ĠString ?): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . error (" Unauthorized : Ġ$ message ") ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity (" Unauthorized ", ĠHttpStatus . UN AUTHORIZ ED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġjson ContentType : ĠHttp Headers ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhttp Headers Ġ= ĠHttp Headers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Headers . contentType Ġ= ĠMediaType . APPLICATION _ JSON ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhttp Headers ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ