package Ġnet . cord a . node . services . messaging Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . google . common . net . Host And Port Ċ import Ġnet . cord a . core . crypto . Composite Key Ċ import Ġnet . cord a . core . messaging . Message Recipient Group Ċ import Ġnet . cord a . core . messaging . Message Recipients Ċ import Ġnet . cord a . core . messaging . Single Message Recipient Ċ import Ġnet . cord a . core . read Ċ import Ġnet . cord a . core . serialization . Singleton Serialize As Token Ċ import Ġnet . cord a . node . services . config . Node SSL Configuration Ċ import Ġorg . apache . activ emq . art emis . api . core . Simple String Ċ import Ġorg . apache . activ emq . art emis . api . core . Transport Configuration Ċ import Ġorg . apache . activ emq . art emis . core . rem oting . impl . netty . Net ty Accept or Factory Ċ import Ġorg . apache . activ emq . art emis . core . rem oting . impl . netty . Net ty Connector Factory Ċ import Ġorg . apache . activ emq . art emis . core . rem oting . impl . netty . Transport Constants Ċ import Ġjava . nio . file . FileSystem s Ċ import Ġjava . nio . file . Path Ċ import Ġjava . security . KeyStore Ċ Ċ /** Ċ Ġ* ĠThe Ġbase Ġclass Ġfor ĠArt emis Ġservices Ġthat Ġdefines Ġshared Ġdata Ġstructures Ġand Ġtransport Ġconfiguration Ċ Ġ*/ Ċ abstract Ġclass ĠArt emis Messaging Component () Ġ: ĠSingleton Serialize As Token () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty (" org . jboss . logging . provider ", Ġ" slf 4 j ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSystem Ġusers Ġmust Ġcontain Ġan Ġinvalid ĠRPC Ġusername Ġcharacter Ġto Ġprevent Ġany Ġchance Ġof Ġname Ġcl ash Ġwhich Ġin Ġthis ĊĠĠĠĠĠĠĠ Ġ// Ġcase Ġis Ġa Ġforward Ġslash ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNODE _ USER Ġ= Ġ" System Users / Node " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPE ER _ USER Ġ= Ġ" System Users / Peer " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠINTERNAL _ PREFIX Ġ= Ġ" internal ." ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPE ERS _ PREFIX Ġ= Ġ"${ INTERNAL _ PREFIX } peers ." ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSERVICES _ PREFIX Ġ= Ġ"${ INTERNAL _ PREFIX } services ." ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLI ENTS _ PREFIX Ġ= Ġ" clients ." ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP 2 P _ QUEUE Ġ= Ġ" p 2 p . inbound " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRPC _ REQUEST S _ QUEUE Ġ= Ġ" rpc . requests " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRPC _ QUEUE _ RE MO VAL S _ QUEUE Ġ= Ġ" rpc . q remo vals " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION S _ ADDRESS Ġ= Ġ"${ INTERNAL _ PREFIX } activ emq . notifications " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠNET WORK _ MAP _ ADDRESS Ġ= Ġ"${ INTERNAL _ PREFIX } network map " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAss uming Ġthe Ġpassed Ġin Ġtarget Ġaddress Ġis Ġactually Ġan ĠArt emis Address Ġwill Ġextract Ġthe Ġhost Ġand Ġport Ġof Ġthe Ġnode . ĠThis Ġshould ĊĠĠĠĠĠĠĠĠ Ġ* Ġonly Ġbe Ġused Ġin Ġunit Ġtests Ġand Ġthe Ġinternals Ġof Ġthe Ġmessaging Ġservices Ġto Ġkeep Ġaddressing Ġopaque Ġfor Ġthe Ġfuture . ĊĠĠĠĠĠĠĠĠ Ġ* ĠN . B . ĠMark ed Ġas ĠJ vm Static Ġto Ġallow Ġuse Ġin Ġthe Ġinherited Ġclasses . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġfun Ġto Host And Port ( target : ĠMessage Recipients ): ĠHost And Port Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddr Ġ= Ġtarget Ġas ? ĠArt emis Messaging Component . Art emis Peer Address Ġ?: Ġthrow ĠIllegalArgumentException (" Not Ġan ĠArt emis Ġaddress ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaddr . host And Port ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠArt emis Address Ġ: ĠMessage Recipients Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqueue Name : ĠSimple String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠArt emis Peer Address Ġ: ĠArt emis Address , ĠSingle Message Recipient Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhost And Port : ĠHost And Port ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠNetwork Map Address ( override Ġval Ġhost And Port : ĠHost And Port ) Ġ: ĠSingle Message Recipient , ĠArt emis Peer Address Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġqueue Name Ġ= ĠSimple String ( NETWORK _ MAP _ ADDRESS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġclass Ġused Ġto Ġimplement Ġ[ Single Message Recipient ], Ġfor Ġnow . ĠNote Ġthat Ġin Ġfuture Ġthis Ġclass ĊĠĠĠĠ Ġ* Ġmay Ġchange Ġor Ġev olve Ġand Ġcode Ġthat Ġrelies Ġupon Ġit Ġbeing Ġa Ġsimple Ġhost / port Ġmay Ġnot Ġfunction Ġcorrectly . ĊĠĠĠĠ Ġ* ĠFor Ġinstance Ġit Ġmay Ġcontain Ġon ion Ġrouting Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Node Address ] Ġidentifies Ġa Ġspecific Ġpeer Ġnode Ġand Ġan Ġassociated Ġqueue . ĠThe Ġqueue Ġmay Ġbe Ġthe Ġpeer 's Ġp 2 p Ġqueue Ġor ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġan Ġadvert ised Ġservice 's Ġqueue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġqueue Name ĠThe Ġname Ġof Ġthe Ġqueue Ġthis Ġaddress Ġis Ġassociated Ġwith . ĊĠĠĠĠ Ġ* Ġ@ param Ġhost And Port ĠThe Ġaddress Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠNode Address ( override Ġval Ġqueue Name : ĠSimple String , Ġoverride Ġval Ġhost And Port : ĠHost And Port ) Ġ: ĠArt emis Peer Address Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġas Peer ( peer Identity : ĠComposite Key , Ġhost And Port : ĠHost And Port ): ĠNode Address Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNode Address ( Simple String ("$ PE ERS _ PREFIX ${ peer Identity . to Base 5 8 String ()} "), Ġhost And Port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġas Service ( service Identity : ĠComposite Key , Ġhost And Port : ĠHost And Port ): ĠNode Address Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNode Address ( Simple String ("$ SERVICES _ PREFIX ${ service Identity . to Base 5 8 String ()} "), Ġhost And Port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"${ java Class . simple Name }( queue Ġ= Ġ$ queue Name , Ġ$ host And Port )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Service Address ] Ġimplements Ġ[ Message Recipient Group ]. ĠIt Ġholds Ġa Ġqueue Ġassociated Ġwith Ġa Ġservice Ġadvert ised Ġby ĊĠĠĠĠ Ġ* Ġzero Ġor Ġmore Ġnodes . ĠEach Ġadvertising Ġnode Ġhas Ġan Ġassociated Ġconsumer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBy Ġsending Ġto Ġsuch Ġan Ġaddress ĠArt emis Ġwill Ġpick Ġa Ġconsumer Ġ( uses ĠRound ĠRob in Ġby Ġdefault ) Ġand Ġsends Ġthe Ġmessage ĊĠĠĠĠ Ġ* Ġthere . ĠWe Ġuse Ġthis Ġto Ġestablish Ġsessions Ġinvol ving Ġservice Ġcounter part ies . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġidentity ĠThe Ġservice Ġidentity 's Ġow ning Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠService Address ( val Ġidentity : ĠComposite Key ) Ġ: ĠArt emis Address , ĠMessage Recipient Group Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġqueue Name : ĠSimple String Ġ= ĠSimple String ("$ SERVICES _ PREFIX ${ identity . to Base 5 8 String () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġconfig Ġobject Ġis Ġused Ġto Ġpass Ġin Ġthe Ġpasswords Ġfor Ġthe Ġcertificate ĠKey Store Ġand ĠTrust Store Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġconfig : ĠNode SSL Configuration ĊĊĠĠĠ Ġprotected Ġenum Ġclass ĠConnection Direction Ġ{ ĠIN BOUND , ĠOUT BOUND Ġ} ĊĊĠĠĠ Ġ// ĠRe strict Ġenabled ĠCipher ĠSu ites Ġto ĠAES Ġand ĠG CM Ġas Ġminimum Ġfor Ġthe Ġbulk Ġcipher . ĊĠĠĠ Ġ// ĠOur Ġself - generated Ġcertificates Ġall Ġuse ĠE CD SA Ġfor Ġhand sh akes , Ġbut Ġwe Ġallow Ġclass ical ĠRSA Ġcertificates Ġto Ġwork ĊĠĠĠ Ġ// Ġin Ġcase Ġwe Ġneed Ġto Ġuse Ġkey tool Ġcertificates Ġin Ġsome Ġde mos ĊĠĠĠ Ġprivate Ġval ĠC IP HER _ SU ITES Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ ECD HE _ ECD SA _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ ECD HE _ RSA _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ RSA _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ ECD H _ ECD SA _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ ECD H _ RSA _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ D HE _ RSA _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TLS _ D HE _ D SS _ WITH _ AES _ 1 2 8 _ GCM _ SHA 2 5 6 " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġnothing Ġif Ġthe Ġkeystore Ġwas Ġopened ĠOK Ġor Ġthrows Ġif Ġnot . ĠUseful Ġto Ġcheck Ġthe Ġpassword , Ġas ĊĠĠĠĠ Ġ* Ġunfortunately ĠArt emis Ġt ends Ġto Ġb ury Ġthe Ġexception Ġwhen Ġthe Ġpassword Ġis Ġwrong . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Store Password s () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . key Store Path . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . getInstance (" J KS "). load ( it , Ġconfig . key Store Password . toCharArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig . trust Store Path . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . getInstance (" J KS "). load ( it , Ġconfig . trust Store Password . toCharArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġtcp Transport ( direction : ĠConnection Direction , Ġhost : ĠString , Ġport : ĠInt ): ĠTransport Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . key Store Path . expected On Default FileSystem () ĊĠĠĠĠĠĠĠ Ġconfig . trust Store Path . expected On Default FileSystem () ĊĠĠĠĠĠĠĠ Ġreturn ĠTransport Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Direction . IN BOUND Ġ-> ĠNet ty Accept or Factory :: class . java . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Direction . OUT BOUND Ġ-> ĠNet ty Connector Factory :: class . java . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBasic ĠTCP Ġtarget Ġdetails ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . HOST _ PROP _ NAME Ġto Ġhost , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . PORT _ PROP _ NAME Ġto Ġport , ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTurn Ġon ĠAMQP Ġsupport , Ġwhich Ġneeds Ġthe Ġprotocol Ġjar Ġon Ġthe Ġclasspath . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnfortunately Ġwe Ġcannot Ġdisable Ġcore Ġprotocol Ġas Ġart emis Ġonly Ġuses ĠAMQP Ġfor Ġinter op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġdoes Ġnot Ġuse ĠAMQP Ġmessages Ġfor Ġits Ġown Ġmessages Ġe . g . Ġtopology Ġand Ġheart beats ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġfurther Ġinvestigate Ġhow Ġto Ġensure Ġwe Ġuse Ġa Ġwell Ġdefined Ġwire Ġlevel Ġprotocol Ġfor ĠNode Ġto ĠNode Ġcommunications ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . PROTOCOL S _ PROP _ NAME Ġto Ġ" CORE , AM QP ", ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnable ĠTLS Ġtransport Ġlayer Ġwith Ġclient Ġcerts Ġand Ġrestrict Ġto Ġat Ġleast ĠSHA 2 5 6 Ġin Ġhandshake ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand ĠAES Ġencryption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . SSL _ ENABLED _ PROP _ NAME Ġto Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . KEY STORE _ PROVIDER _ PROP _ NAME Ġto Ġ" J KS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . KEY STORE _ PATH _ PROP _ NAME Ġto Ġconfig . key Store Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . KEY STORE _ PASSWORD _ PROP _ NAME Ġto Ġconfig . key Store Password , Ġ// ĠTODO Ġproper Ġmanagement Ġof Ġkey stores Ġand Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . TR UST STORE _ PROVIDER _ PROP _ NAME Ġto Ġ" J KS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . TR UST STORE _ PATH _ PROP _ NAME Ġto Ġconfig . trust Store Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . TR UST STORE _ PASSWORD _ PROP _ NAME Ġto Ġconfig . trust Store Password , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . ENABLED _ CIPHER _ SU ITES _ PROP _ NAME Ġto ĠC IP HER _ SU ITES . join ToString ("," ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . ENABLED _ PROTOCOL S _ PROP _ NAME Ġto Ġ" TLS v 1 . 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransport Constants . NEED _ CLIENT _ AUTH _ PROP _ NAME Ġto Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSet Ġup Ġthe Ġconnector 's Ġhost Ġname Ġverifier Ġlogic Ġto Ġensure Ġwe Ġconnect Ġto Ġthe Ġexpected Ġnode Ġeven Ġin Ġcase Ġof ĠMIT M Ġor ĠBGP Ġh ij acks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠPath . expected On Default FileSystem () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( file System Ġ== ĠFileSystem s . getDefault ()) Ġ{ Ġ" Art emis Ġonly Ġuses Ġthe Ġdefault Ġfile Ġsystem " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ