package Ġnet . cord a . node . services . rpc Ċ Ċ import Ġnet . cord a . core . internal . unchecked Cast Ċ import Ġnet . cord a . core . utilities . logger For Ċ import Ġnet . cord a . node . internal . security . Password Ċ import Ġnet . cord a . node . internal . security . RPC Security Manager Ċ import Ġnet . cord a . node . internal . art emis . Certificate Chain Check Policy Ċ import Ġnet . cord a . node api . RPC Api Ċ import Ġnet . cord a . node api . internal . Art emis Messaging Component Ċ import Ġnet . cord a . node api . internal . Art emis Messaging Component . Companion . NODE _ USER Ċ import Ġorg . apache . activ emq . art emis . spi . core . security . ja as . Certificate Callback Ċ import Ġorg . apache . activ emq . art emis . spi . core . security . ja as . Role Principal Ċ import Ġorg . apache . activ emq . art emis . spi . core . security . ja as . User Principal Ċ import Ġjava . io . IOException Ċ import Ġjava . security . Principal Ċ import Ġjava . util .* Ċ import Ġjavax . security . auth . Subject Ċ import Ġjavax . security . auth . callback . Callback Handler Ċ import Ġjavax . security . auth . callback . Name Callback Ċ import Ġjavax . security . auth . callback . Password Callback Ċ import Ġjavax . security . auth . callback . Unsupported Callback Exception Ċ import Ġjavax . security . auth . login . Failed Login Exception Ċ import Ġjavax . security . auth . login . Login Exception Ċ import Ġjavax . security . auth . spi . Login Module Ċ import Ġjavax . security . cert . X 5 0 9 Certificate Ċ Ċ /** Ċ Ġ* ĠClients Ġmust Ġconnect Ġto Ġus Ġwith Ġa Ġusername Ġand Ġpassword Ġand Ġmust Ġuse ĠTLS . ĠIf Ġa Ġsomeone Ġconnects Ġwith Ċ Ġ* Ġ[ Art emis Messaging Component . NODE _ USER ] Ġthen Ġwe Ġconfirm Ġit 's Ġjust Ġus Ġas Ġthe Ġnode Ġby Ġchecking Ġtheir ĠTLS Ġcertificate Ċ Ġ* Ġis Ġthe Ġsame Ġas Ġour Ġone Ġin Ġour Ġkey Ġstore . ĠThen Ġthey 're Ġgiven Ġfull Ġaccess Ġto Ġall Ġvalid Ġqueues . ĠIf Ġthey Ġconnect Ġwith Ċ Ġ* Ġ[ Art emis Messaging Component . PEER _ USER ] Ġthen Ġwe Ġconfirm Ġthey Ġbelong Ġon Ġour ĠP 2 P Ġnetwork Ġby Ġchecking Ġtheir Ġroot ĠCA Ġis Ċ Ġ* Ġthe Ġsame Ġas Ġour Ġroot ĠCA . ĠIf Ġthat 's Ġthe Ġcase Ġthe Ġonly Ġaccess Ġthey 're Ġgiven Ġis Ġthe Ġab l ility Ġsend Ġto Ġour ĠP 2 P Ġaddress . Ċ Ġ* ĠIn Ġboth Ġcases Ġthe Ġmessages Ġthese Ġauthenticated Ġnodes Ġsend Ġto Ġus Ġare Ġtagged Ġwith Ġtheir Ġsubject ĠD N Ġand Ġwe Ġassume Ċ Ġ* Ġthe ĠCN Ġwithin Ġthat Ġis Ġtheir Ġlegal Ġname . Ċ Ġ* ĠOtherwise Ġif Ġthe Ġusername Ġis Ġneither Ġof Ġthe Ġabove Ġwe Ġassume Ġit 's Ġan ĠRPC Ġuser Ġand Ġauthenticate Ġagainst Ġour Ġlist Ġof Ċ Ġ* Ġvalid ĠRPC Ġusers . ĠRPC Ġclients Ġare Ġgiven Ġpermission Ġto Ġperform ĠRPC Ġand Ġnothing Ġelse . Ċ Ġ*/ Ċ internal Ġclass ĠNode Login Module Ġ: ĠLogin Module Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠNODE _ ROLE Ġ= Ġ" System Roles / Node " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠRPC _ ROLE Ġ= Ġ" System Roles / RPC " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠCERT _ CHAIN _ CHECKS _ ARG Ġ= Ġ" Cert Chain Checks " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠUSE _ SSL _ ARG Ġ= Ġ" use Ssl " ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠSECURITY _ MANAGER _ ARG Ġ= Ġ" Rpc Security Manager " ĊĠĠĠĠĠĠĠ Ġinternal Ġval ĠLOGIN _ LIST ENER _ ARG Ġ= Ġ" Login Listener " ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġlogger For < Node Login Module >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlogin Succeeded : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsubject : ĠSubject ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcallback Handler : ĠCallback Handler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsecurity Manager : ĠRPC Security Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlogin Listener : ĠLogin Listener ĊĠĠĠ Ġprivate Ġvar Ġuse Ssl : ĠBoolean ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnode Cert Check : ĠCertificate Chain Check Policy . Check ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrpc Cert Check : ĠCertificate Chain Check Policy . Check ĊĠĠĠ Ġprivate Ġval Ġprincip als Ġ= ĠArrayList < Principal >() ĊĊĠĠĠ Ġoverride Ġfun Ġinitialize ( subject : ĠSubject , Ġcallback Handler : ĠCallback Handler , Ġshared State : ĠMap < String , Ġ* >, Ġoptions : ĠMap < String , Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . subject Ġ= Ġsubject ĊĠĠĠĠĠĠĠ Ġthis . callback Handler Ġ= Ġcallback Handler ĊĠĠĠĠĠĠĠ Ġsecurity Manager Ġ= Ġunchecked Cast ( options [ SECURITY _ MANAGER _ ARG ]) ĊĠĠĠĠĠĠĠ Ġlogin Listener Ġ= Ġunchecked Cast ( options [ LOGIN _ LIST ENER _ ARG ]) ĊĠĠĠĠĠĠĠ Ġuse Ssl Ġ= Ġoptions [ USE _ SSL _ ARG ] Ġas ĠBoolean ĊĠĠĠĠĠĠĠ Ġval Ġcert Chain Checks : ĠMap < String , ĠCertificate Chain Check Policy . Check > Ġ= Ġunchecked Cast ( options [ CERT _ CHAIN _ CHECKS _ ARG ]) ĊĠĠĠĠĠĠĠ Ġnode Cert Check Ġ= Ġcert Chain Checks [ NODE _ ROLE ] !! ĊĠĠĠĠĠĠĠ Ġrpc Cert Check Ġ= Ġcert Chain Checks [ RPC _ ROLE ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlogin (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Callback Ġ= ĠName Callback (" Username : Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġpassword Callback Ġ= ĠPassword Callback (" Password : Ġ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġcertificate Callback Ġ= ĠCertificate Callback () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Handler . handle ( array Of ( name Callback , Ġpassword Callback , Ġcertificate Callback )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠLogin Exception ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnsupported Callback Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠLogin Exception ("${ e . message } Ġnot Ġavailable Ġto Ġobtain Ġinformation Ġfrom Ġuser ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġname Callback . name Ġ?: Ġthrow ĠFailed Login Exception (" Username Ġnot Ġprovided ") ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= ĠString ( password Callback . password Ġ?: Ġthrow ĠFailed Login Exception (" Password Ġnot Ġprovided ")) ĊĠĠĠĠĠĠĠ Ġval Ġcertificates Ġ= Ġcertificate Callback . certificates Ġ?: Ġempty Array () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rpc Cert Check Ġis ĠCertificate Chain Check Policy . Username Must Match Common Name Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( rpc Cert Check Ġas ĠCertificate Chain Check Policy . Username Must Match Common Name Check ). username Ġ= Ġusername ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Logging Ġuser Ġin ") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Ġ= Ġdetermine UserRole ( certificates , Ġusername , Ġuse Ssl !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidated User Ġ= Ġwhen Ġ( role ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Login Module . NODE _ ROLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate Node ( certificates ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNODE _ USER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRPC _ ROLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate Rpc User ( username , ĠPassword ( password ), Ġcertificates , Ġuse Ssl !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠFailed Login Exception (" Peer Ġdoes Ġnot Ġbelong Ġon Ġour Ġnetwork ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprincip als Ġ+= ĠUser Principal ( validated User ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Succeeded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlogin Succeeded ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠFailed Login Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ("$ exception ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauthenticate Node ( certificates : ĠArray < X 5 0 9 Certificate >) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode Cert Check . check Certificate Chain ( certificates ) ĊĠĠĠĠĠĠĠ Ġprincip als Ġ+= ĠRole Principal ( Node Login Module . NODE _ ROLE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauthenticate Rpc User ( username : ĠString , Ġpassword : ĠPassword , Ġcertificates : ĠArray < X 5 0 9 Certificate >, Ġuse Ssl : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( use Ssl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Cert Check . check Certificate Chain ( certificates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġpoint Ġin Ġmatching Ġusername Ġwith ĠCN Ġbecause Ġcompanies Ġwouldn 't Ġwant Ġto Ġprovide Ġa Ġcertificate Ġfor Ġeach Ġuser ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsecurity Manager . authenticate ( username , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġlogin Listener ( username ) ĊĠĠĠĠĠĠĠ Ġprincip als Ġ+= ĠRole Principal ( RPC _ ROLE ) Ġ Ġ// ĠThis Ġenables Ġthe ĠRPC Ġclient Ġto Ġsend Ġrequests ĊĠĠĠĠĠĠĠ Ġprincip als Ġ+= ĠRole Principal ("${ RPC Api . RPC _ CLIENT _ QUEUE _ NAME _ PREFIX }. $ username ") Ġ Ġ// ĠThis Ġenables Ġthe ĠRPC Ġclient Ġto Ġreceive Ġresponses ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine UserRole ( certificates : ĠArray < X 5 0 9 Certificate >, Ġusername : ĠString , Ġuse Ssl : ĠBoolean ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( username ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArt emis Messaging Component . NODE _ USER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( certificates . isNotEmpty ()) Ġ{ Ġ" No ĠTLS ?" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode Login Module . NODE _ ROLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Ssl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( certificates . isNotEmpty ()) Ġ{ Ġ" No ĠTLS ?" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRPC _ ROLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlogin Succeeded ĊĠĠĠĠĠĠĠ Ġif Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . pr incip als . addAll ( pr incip als ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġabort (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlogout (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject . pr incip als . removeAll ( pr incip als ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogin Succeeded Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ }