package Ġcom . source for g ery . t ach ik oma . webserver Ċ Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . google . common . cache . Cache Loader Ċ import Ġcom . line corp . ar mer ia . common . HttpHeaders Ċ import Ġcom . source for g ery . t ach ik oma . auth . Authentication Ċ import Ġcom . source for g ery . t ach ik oma . common . Authentication Role Ċ import Ġcom . source for g ery . t ach ik oma . common . H mac Util . hmac Sha 1 Ċ import Ġcom . source for g ery . t ach ik oma . config . WebServer Config Ċ import Ġcom . source for g ery . t ach ik oma . database . dao . Account DAO Ċ import Ġcom . source for g ery . t ach ik oma . database . dao . Authentication DAO Ċ import Ġcom . source for g ery . t ach ik oma . database . objects . id Ċ import Ġcom . source for g ery . t ach ik oma . exceptions . Invalid Or Ins ufficient Credentials Exception Ċ import Ġcom . source for g ery . t ach ik oma . exceptions . No Authorization Credentials Exception Ċ import Ġcom . source for g ery . t ach ik oma . grpc . frontend . auth . Auth Role Ċ import Ġcom . source for g ery . t ach ik oma . grpc . frontend . auth . Web Token Auth Data Ċ import Ġcom . source for g ery . t ach ik oma . grpc . frontend . to AccountId Ċ import Ġcom . source for g ery . t ach ik oma . grpc . frontend . to Authentication Id Ċ import Ġcom . source for g ery . t ach ik oma . identifiers . AccountId Ċ import Ġcom . source for g ery . t ach ik oma . identifiers . Authentication Id Ċ import Ġcom . source for g ery . t ach ik oma . identifiers . Mail Domain Ċ import Ġio . netty . util . Ascii String Ċ import Ġjava . util . Base 6 4 Ċ import Ġjava . util . concurrent . ExecutionException Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ import Ġorg . apache . logging . log 4 j . kotlin . logger Ċ import Ġorg . glass fish . hk 2 . api . Factory Ċ Ċ class ĠAuthentication Factory Ċ @ Inject Ċ private Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġhttp Headers : ĠHttp Headers , ĊĠĠĠ Ġprivate Ġval Ġweb Server Config : ĠWeb Server Config , ĊĠĠĠ Ġprivate Ġval Ġauthentication DAO : ĠAuthentication DAO , ĊĠĠĠ Ġprivate Ġval Ġaccount DAO : ĠAccount DAO Ċ ) Ġ: ĠFactory < Authentication > Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠapiKey Cache Ġ= ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. expire After Write ( 1 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠ Ġ. build ( Cache Loader . from < String , ĠAuthentication ?> Ġ{ Ġparse Api Token Header ( it ) Ġ}) ĊĊĠĠĠ Ġoverride Ġfun Ġprovide () Ġ= ĊĠĠĠĠĠĠĠ Ġparse Web Token Header () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġparse Api Token Header () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠNO _ AUTHENT ICATION ĊĊĠĠĠ Ġprivate Ġfun Ġparse Api Token Header (): ĠAuthentication ? Ġ= ĊĠĠĠĠĠĠĠ Ġhttp Headers [ AP IT OK EN _ HEADER ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠapiKey Cache [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠExecution Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe . cause !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Api Token Header ( header : ĠString ?): ĠAuthentication Ġ= ĊĠĠĠĠĠĠĠ Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMail Domain ( it . substring Before (': ')) Ġto Ġit . substring After (': ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġsplit Auth String Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication DAO . validate Api Token ( split Auth String . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġauth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auth . account . mail Domain Ġ== Ġsplit Auth String . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġweb token Ġshould Ġallow Ġbackend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= Ġauth . role , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Id Ġ= Ġauth . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccountId Ġ= Ġauth . account . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount DAO Ġ= Ġaccount DAO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . warn Ġ{ Ġ" Incorrect Ġdomain (${ split Auth String . first }) Ġfor Ġaccount Ġ${ auth . account . id })" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Exception (" Incorrect Ġdomain (${ split Auth String . first }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġwrap Exception (" Non ex istant Ġdomain (${ split Auth String . first }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠNO _ AUTHENT ICATION ĊĊĠĠĠ Ġprivate Ġfun Ġwrap Exception ( error : ĠString ): ĠAuthentication Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠThrow ing Authentication Ġ{ ĠInvalid Or Ins ufficient Credentials Exception ( error ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Web Token Header (): ĠAuthentication ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweb token Header Ġ= Ġhttp Headers [ WEB TOKEN _ HEADER ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġsplit Token Ġ= Ġweb token Header . split ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġde limiters Ġ= Ġ* char ArrayOf ('. '), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( split Token . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpayload Signature Ġ= ĠBASE 6 4 _ DE CODER . decode ( split Token [ 0 ]) !! ĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠBASE 6 4 _ DE CODER . decode ( split Token [ 1 ]) !! ĊĠĠĠĠĠĠĠ Ġif Ġ( hmac Sha 1 ( web Server Config . web token Sign Key , Ġpayload ). content Equals ( payload Signature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtoken Auth Data Ġ= ĠWeb Token Auth Data . parseFrom ( payload ) ĊĠĠĠĠĠĠĠ Ġval Ġauthentication Id Ġ= Ġtoken Auth Data . to Authentication Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInvalid Or Ins ufficient Credentials Exception () ĊĊĠĠĠĠĠĠĠ Ġval ĠaccountId Ġ= Ġtoken Auth Data . to AccountId () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInvalid Or Ins ufficient Credentials Exception () ĊĠĠĠĠĠĠĠ Ġreturn ĠAuthentication Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġweb token Ġshould Ġallow Ġbackend ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= Ġtoken Auth Data . authentication Role . to Authentication Role (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Id Ġ= Ġauthentication Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccountId Ġ= ĠaccountId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount DAO Ġ= Ġaccount DAO ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose ( instance : ĠAuthentication ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLOGGER Ġ= Ġlogger () ĊĠĠĠĠĠĠĠ Ġval ĠBASE 6 4 _ DE CODER Ġ= ĠBase 6 4 . get Decoder () !! ĊĠĠĠĠĠĠĠ Ġval ĠNO _ AUTHENT ICATION : ĠAuthentication Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThrow ing Authentication Ġ{ ĠNo Authorization Credentials Exception () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠWEB TOKEN _ HEADER Ġ= ĠAsc ii String (" x - web token ") ĊĠĠĠĠĠĠĠ Ġval ĠAP IT OK EN _ HEADER Ġ= ĠAsc ii String (" x - ap ito ken ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠAuthentication Impl ( ĊĠĠĠ Ġoverride Ġvar Ġauthentication Id : ĠAuthentication Id , ĊĠĠĠ Ġoverride Ġvar ĠaccountId : ĠAccount Id , ĊĠĠĠ Ġprivate Ġval Ġaccount DAO : ĠAccount DAO , ĊĠĠĠ Ġprivate Ġval Ġrole : ĠAuthentication Role Ċ ) Ġ: ĠAuthentication Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmail Domain : ĠMail Domain Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount DAO . getById ( accountId ). mail Domain ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Frontend (): ĠAccount Id Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Valid () ĊĠĠĠĠĠĠĠ Ġif Ġ( role Ġ!= ĠAuthentication Role . FRONT END _ ADMIN Ġ&& Ġrole Ġ!= ĠAuthentication Role . FRONT END ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Or Ins ufficient Credentials Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠaccountId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Frontend Admin ( mail Domain : ĠMail Domain ): ĠAccount Id Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Valid () ĊĠĠĠĠĠĠĠ Ġif Ġ(! isAdmin () Ġ&& Ġthis . mail Domain Ġ!= Ġmail Domain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Or Ins ufficient Credentials Exception (" auth Ġdomain Ġ(${ this . mail Domain }) Ġis Ġnot Ġthe Ġsame Ġas Ġthe Ġrequest Ġone Ġ($ mail Domain ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( role Ġ!= ĠAuthentication Role . FRONT END _ ADMIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Or Ins ufficient Credentials Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠaccountId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Backend (): ĠAccount Id Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Valid () ĊĠĠĠĠĠĠĠ Ġif Ġ( role Ġ!= ĠAuthentication Role . BACKEND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Or Ins ufficient Credentials Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠaccountId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Admin (): ĠAccount Id Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" No Ġsuper admin Ġyet ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Admin () Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġrequire Valid () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Or Ins ufficient Credentials Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġvalid : ĠBoolean Ġ= Ġtrue Ċ } Ċ Ċ fun ĠAuth Role . to Authentication Role () Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAuth Role . FRONT END Ġ-> ĠAuthentication Role . FRONT END ĊĠĠĠĠĠĠĠ ĠAuth Role . BACKEND Ġ-> ĠAuthentication Role . BACKEND ĊĠĠĠĠĠĠĠ ĠAuth Role . FRONT END _ ADMIN Ġ-> ĠAuthentication Role . FRONT END _ ADMIN ĊĠĠĠĠĠĠĠ ĠAuth Role . UN RE CO GN IZED Ġ-> Ġthrow ĠInvalid Or Ins ufficient Credentials Exception (" Web token Ġis Ġinvalid ") ĊĠĠĠ Ġ} Ċ Ċ private Ġclass ĠThrow ing Authentication ( private Ġval Ġt : Ġ() Ġ-> ĠRuntimeException ) Ġ: ĠAuthentication Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrequire Frontend (): ĠAccount Id Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Backend (): ĠAccount Id Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Frontend Admin ( mail Domain : ĠMail Domain ): ĠAccount Id Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġfun Ġrequire Admin (): ĠAccount Id Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġval Ġmail Domain : ĠMail Domain ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġval Ġauthentication Id : ĠAuthentication Id ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġval ĠaccountId : ĠAccount Id ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthrow Ġt () ĊĊĠĠĠ Ġoverride Ġval Ġvalid : ĠBoolean Ġ= Ġfalse Ċ }