package Ġnet . cord a . testing . node . internal . network Ċ Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . core . crypto . Signed Data Ċ import Ġnet . cord a . core . identity . C ord a X 5 0 0 Name Ċ import Ġnet . cord a . core . internal . read Object Ċ import Ġnet . cord a . core . node . Network Parameters Ċ import Ġnet . cord a . core . node . NodeInfo Ċ import Ġnet . cord a . core . serialization . serialize Ċ import Ġnet . cord a . core . utilities . Network Host And Port Ċ import Ġnet . cord a . node api . internal . Signed NodeInfo Ċ import Ġnet . cord a . node api . internal . create Dev Network Map Ca Ċ import Ġnet . cord a . node api . internal . crypto . Certificate And KeyPair Ċ import Ġnet . cord a . node api . internal . network . Network Map Ċ import Ġnet . cord a . node api . internal . network . Parameters Update Ċ import Ġnet . cord a . testing . common . internal . test Network Parameters Ċ import Ġorg . eclipse . jetty . server . Server Ċ import Ġorg . eclipse . jetty . server . Server Connector Ċ import Ġorg . eclipse . jetty . server . handler . Handler Collection Ċ import Ġorg . eclipse . jetty . servlet . ServletContext Handler Ċ import Ġorg . eclipse . jetty . servlet . Servlet Holder Ċ import Ġorg . glass fish . j ersey . server . Resource Config Ċ import Ġorg . glass fish . j ersey . servlet . Servlet Container Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . security . PublicKey Ċ import Ġjava . security . Signature Exception Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ import Ġjavax . ws . rs .* Ċ import Ġjavax . ws . rs . core . MediaType Ċ import Ġjavax . ws . rs . core . Response Ċ import Ġjavax . ws . rs . core . Response . ok Ċ import Ġjavax . ws . rs . core . Response . status Ċ Ċ class ĠNetwork Map Server ( private Ġval Ġpoll Interval : ĠDuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost And Port : ĠNetwork Host And Port Ġ= ĠNetwork Host And Port (" localhost ", Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġnetwork Map Cert And KeyPair : ĠCertificate And KeyPair Ġ= Ġcreate Dev Network Map Ca (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy HostName Value : ĠString Ġ= Ġ" test . host . name ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Ġadditional Services : ĠAny ) Ġ: ĠClose able Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstub Network Parameters Ġ= Ġtest Network Parameters ( epoch Ġ= Ġ 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġserver : ĠServer ĊĠĠĠ Ġvar Ġnetwork Parameters : ĠNetwork Parameters Ġ= Ġstub Network Parameters ĊĠĠĠ Ġprivate Ġval Ġservice Ġ= ĠIn Memory Network Map Service () ĊĠĠĠ Ġprivate Ġvar Ġparameters Update : ĠParameters Update ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnext Network Parameters : ĠNetwork Parameters ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Ġ= ĠServer ( Inet SocketAddress ( host And Port . host , Ġhost And Port . port )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Ġ= ĠHandler Collection (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Handler ( ServletContext Handler (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Path Ġ= Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource Config Ġ= ĠResource Config (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġyour ĠAPI Ġprovider Ġclasses Ġ( annotated Ġfor ĠJ AX - RS ) Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Services . forEach Ġ{ Ġregister ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj ersey Servlet Ġ= ĠServlet Holder ( Servlet Container ( resource Config )). apply Ġ{ Ġinit Order Ġ= Ġ 0 Ġ} Ġ// ĠInitial ise Ġat Ġserver Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Servlet ( j ersey Servlet , Ġ" /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart (): ĠNetwork Host And Port Ġ{ ĊĠĠĠĠĠĠĠ Ġserver . start () ĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġuntil Ġserver Ġis Ġup Ġto Ġobtain Ġthe Ġhost Ġand Ġport . ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! server . is Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġserver . connectors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit Ġas ? ĠServer Connector Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠNetwork Host And Port ( it . host , Ġit . local Port ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnetwork Map Hashes (): ĠList < Secure Hash > Ġ= Ġservice . node Info Map . keys . toList () ĊĊĠĠĠ Ġfun Ġremove NodeInfo ( node Info : ĠNode Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġservice . remove NodeInfo ( node Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġschedule Parameters Update ( next Parameters : ĠNetwork Parameters , Ġdescription : ĠString , Ġupdate Deadline : ĠInstant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnext Network Parameters Ġ= Ġnext Parameters ĊĠĠĠĠĠĠĠ Ġparameters Update Ġ= ĠParameters Update ( next Parameters . serialize (). hash , Ġdescription , Ġupdate Deadline ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġad vertise New Parameters () Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork Parameters Ġ= ĠcheckNotNull ( next Network Parameters ) Ġ{ Ġ" Schedule Ġparameters Ġupdate Ġfirst " Ġ} ĊĠĠĠĠĠĠĠ Ġnext Network Parameters Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġparameters Update Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlatest Parameters Accepted ( publicKey : ĠPublicKey ): ĠSecure Hash ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġservice . latest Accepted Parameters Map [ publicKey ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Nodes To Private Network ( network UUID : ĠUUID , Ġnodes Names : ĠList < C ord a X 5 0 0 Name >) Ġ{ ĊĠĠĠĠĠĠĠ Ġservice . add Nodes To Private Network ( network UUID , Ġnodes Names ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Path (" network - map ") ĊĠĠĠ Ġinner Ġclass ĠIn Memory Network Map Service Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnode Names UUID Ġ= Ġmutable Map Of < C ord a X 5 0 0 Name , ĠUUID >() ĊĠĠĠĠĠĠĠ Ġval Ġnode Info Map Ġ= Ġmutable Map Of < Secure Hash , ĠSigned NodeInfo >() ĊĠĠĠĠĠĠĠ Ġ// ĠMapping Ġfrom Ġthe ĠUUID Ġof Ġthe Ġnetwork Ġ( null Ġfor Ġglobal Ġone ) Ġto Ġhashes Ġof Ġthe Ġnodes Ġin Ġnetwork ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnetwork Maps Ġ= Ġmutable Map Of < UUID ?, ĠMutable Set < Secure Hash >>() ĊĠĠĠĠĠĠĠ Ġval Ġlatest Accepted Parameters Map Ġ= Ġmutable Map Of < PublicKey , ĠSecure Hash >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsigned Net Params Ġby Ġlazy Ġ{ Ġnetwork Map Cert And KeyPair . sign ( network Parameters ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ POST ĊĠĠĠĠĠĠĠ Ġ@ Path (" publish ") ĊĠĠĠĠĠĠĠ Ġ@ Cons umes ( MediaType . APPLICATION _ OCT ET _ STREAM ) ĊĠĠĠĠĠĠĠ Ġfun Ġpublish NodeInfo ( input : ĠInputStream ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned NodeInfo Ġ= Ġinput . read Object < Signed NodeInfo >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġsigned NodeInfo . raw . hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Info Ġ= Ġsigned NodeInfo . verified () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprivate Network Ġ= Ġnode Names UUID [ node Info . legal Id entities [ 0 ]. name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġnetwork Maps . compute If Absent ( private Network ) Ġ{ Ġmutable Set Of () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . add ( hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info Map . filter Ġ{ Ġit . value . verified (). legal Id entities . first (). name Ġ== Ġsigned NodeInfo . verified (). legal Id entities . first (). name Ġ}. forEach Ġ{ Ġt , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info Map . remove ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . remove ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info Map [ hash ] Ġ= Ġsigned NodeInfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSignature Exception Ġ-> Ġstatus ( Response . Status . FOR BID DEN ). entity ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstatus ( Response . Status . INTERNAL _ SERVER _ ERROR ). entity ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ POST ĊĠĠĠĠĠĠĠ Ġ@ Path (" ack - parameters ") ĊĠĠĠĠĠĠĠ Ġ@ Cons umes ( MediaType . APPLICATION _ OCT ET _ STREAM ) ĊĠĠĠĠĠĠĠ Ġfun Ġack Network Parameters ( input : ĠInputStream ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Parameters Hash Ġ= Ġinput . read Object < Signed Data < Secure Hash >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġsigned Parameters Hash . verified () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Accepted Parameters Map [ signed Parameters Hash . sig . by ] Ġ= Ġhash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġok (). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ GET ĊĠĠĠĠĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ OCT ET _ STREAM ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Global Network Map (): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Info Hashes Ġ= Ġnetwork Maps [ null ]?. toList () Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnetwork Map Response ( node Info Hashes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ GET ĊĠĠĠĠĠĠĠ Ġ@ Path ("{ var }") ĊĠĠĠĠĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ OCT ET _ STREAM ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Private Network Map (@ Path Param (" var ") Ġextra UUID : ĠString ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠUUID . fromString ( extra UUID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Info Hashes Ġ= Ġnetwork Maps [ uuid ] Ġ?: Ġreturn ĠResponse . status ( Response . Status . NOT _ FOUND ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnetwork Map Response ( node Info Hashes . toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnetwork Map Response ( node Info Hashes : ĠList < Secure Hash >): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Map Ġ= ĠNetwork Map ( node Info Hashes , Ġsigned Net Params . raw . hash , Ġparameters Update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Network Map Ġ= Ġnetwork Map Cert And KeyPair . sign ( network Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( signed Network Map . serialize (). bytes ). header (" Cache - Control ", Ġ" max - age =${ poll Interval . seconds } "). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġnode Info Ġfor Ġtesting . ĊĠĠĠĠĠĠĠ Ġfun Ġremove NodeInfo ( node Info : ĠNode Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġnode Info . serialize (). hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Maps . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . remove ( hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Info Map . remove ( hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Nodes To Private Network ( network UUID : ĠUUID , Ġnode Names : ĠList < C ord a X 5 0 0 Name >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( name Ġin Ġnode Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( name Ġ! in Ġnode Info Map . values . flatMap Ġ{ Ġit . verified (). legal Id entities . map Ġ{ Ġit . name Ġ} Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Node Ġwith Ġname : Ġ$ name Ġwas Ġalready Ġpublished Ġto Ġglobal Ġnetwork Ġmap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Names . forEach Ġ{ Ġnode Names UUID [ it ] Ġ= Ġnetwork UUID Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ GET ĊĠĠĠĠĠĠĠ Ġ@ Path (" node - info /{ var }") ĊĠĠĠĠĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ OCT ET _ STREAM ) ĊĠĠĠĠĠĠĠ Ġfun Ġget NodeInfo (@ Path Param (" var ") Ġnode Info Hash : ĠString ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= ĠSecure Hash . parse ( node Info Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned NodeInfo Ġ= Ġnode Info Map [ hash ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( signed NodeInfo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . ok ( signed NodeInfo . serialize (). bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . status ( Response . Status . NOT _ FOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ GET ĊĠĠĠĠĠĠĠ Ġ@ Path (" network - parameters /{ var }") ĊĠĠĠĠĠĠĠ Ġ@ Produces ( MediaType . APPLICATION _ OCT ET _ STREAM ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Network Parameter (@ Path Param (" var ") Ġhash : ĠString ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequested Hash Ġ= ĠSecure Hash . parse ( hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequested Parameters Ġ= Ġif Ġ( requested Hash Ġ== Ġsigned Net Params . raw . hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned Net Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( requested Hash Ġ== Ġnext Network Parameters ?. serialize ()?. hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Network Parameters ?. let Ġ{ Ġnetwork Map Cert And KeyPair . sign ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( requested Parameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponse . ok ( requested Parameters !!. serialize (). bytes ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ GET ĊĠĠĠĠĠĠĠ Ġ@ Path (" my - hostname ") ĊĠĠĠĠĠĠĠ Ġfun Ġget HostName (): ĠResponse Ġ= ĠResponse . ok ( my HostName Value ). build () ĊĠĠĠ Ġ} Ċ }