package Ġorg . block stack . android . sdk Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . col endi . ec ies . Encrypted Result Form Ċ import Ġcom . col endi . ec ies . Encryption Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlinx . io . IOException Ċ import Ġokhttp 3 .* Ċ import Ġok io . ByteString Ċ import Ġorg . block stack . android . sdk . ec ies . sign Content Ċ import Ġorg . block stack . android . sdk . ec ies . sign Encrypted Content Ċ import Ġorg . block stack . android . sdk . ec ies . verify Ċ import Ġorg . block stack . android . sdk . model .* Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġorg . ke thereum . crypto . to EC KeyPair Ċ import Ġorg . ke thereum . hashes . sha 2 5 6 Ċ import Ġorg . ke thereum . model . EC KeyPair Ċ import Ġorg . ke thereum . model . PrivateKey Ċ import Ġorg . ke thereum . model . PublicKey Ċ import Ġorg . k omp uting . k hex . extensions . hex To ByteArray Ċ import Ġjava . math . BigInteger Ċ import Ġjava . security . Invalid Parameter Exception Ċ import Ġjava . util .* Ċ Ċ const Ġval ĠSIGN ATURE _ FILE _ EXTENSION Ġ= Ġ". sig " Ċ Ċ class ĠBlock stack Session ( private Ġval Ġsession Store : ĠIS ession Store , Ġprivate Ġval Ġapp Config : ĠBlock stack Config ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcall Factory : ĠCall . Factory Ġ= ĠOk HttpClient (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock stack : ĠBlock stack Ġ= ĠBlock stack (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhub : ĠHub Ġ= ĠHub ( call Factory )) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġapp PrivateKey : ĠString ? ĊĠĠĠ Ġvar Ġgaia Hub Config : ĠGa ia Hub Config ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp PrivateKey Ġ= Ġsession Store . session Data . json . opt JSONObject (" userData ") ?. opt String (" app PrivateKey ") ĊĠĠĠĠĠĠĠ Ġthis . app PrivateKey Ġ= Ġapp PrivateKey ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess Ġa Ġpending Ġsign Ġin . ĠThis Ġmethod Ġshould Ġbe Ġcalled Ġby Ġyour Ġapp Ġwhen Ġit ĊĠĠĠĠ Ġ* Ġreceives Ġa Ġrequest Ġto Ġthe Ġapp 's Ġcustom Ġprotocol Ġhandler . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġauth Response Ġauthentication Ġresponse Ġtoken ĊĠĠĠĠ Ġ* Ġ@ return Ġresult Ġobject Ġwith Ġthe Ġuser Ġdata Ġafter Ġsign - in Ġor Ġwith Ġan Ġerror ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġhandle Pending SignIn ( auth Response : ĠString ): ĠResult < UserData > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransit Key Ġ= Ġsession Store . get Transit PrivateKey () ĊĠĠĠĠĠĠĠ Ġval Ġname Lookup Url Ġ= Ġsession Store . session Data . json . opt String (" core - node ", Ġ" https :// core . block stack . org ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtoken Triple Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock stack . decode Token ( auth Response ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Login Failed Error , Ġ" The Ġauth Response Ġparameter Ġis Ġan Ġinvalid Ġbase 6 4 Ġencoded Ġtoken \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 Ġdots Ġrequires \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Auth Ġresponse : Ġ$ auth Response ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtoken Payload Ġ= Ġtoken Triple . second ĊĠĠĠĠĠĠĠ Ġval ĠisValid Token Ġ= Ġblock stack . verify Token ( auth Response ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Login Failed Error , Ġ" invalid Ġauth Ġresponse ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġapp PrivateKey Ġ= Ġdecrypt ( token Payload . getString (" private _ key "), Ġtransit Key ) ĊĠĠĠĠĠĠĠ Ġval Ġcore Session Token Ġ= Ġdecrypt ( token Payload . opt String (" core _ token "), Ġtransit Key ) ĊĊĠĠĠĠĠĠĠ Ġval ĠuserData Ġ= Ġauth Response To UserData ( token Payload , Ġname Lookup Url , Ġapp PrivateKey , Ġcore Session Token , Ġauth Response ) ĊĊĠĠĠĠĠĠĠ Ġthis . app PrivateKey Ġ= Ġapp PrivateKey ĊĠĠĠĠĠĠĠ Ġsession Store . update UserData ( userData ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResult ( userData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġhandle Un encrypted SignIn ( auth Response : ĠString ): ĠResult < UserData > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Lookup Url Ġ= Ġsession Store . session Data . json . opt String (" core - node ", Ġ" https :// core . block stack . org ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtoken Triple Ġ= Ġblock stack . decode Token ( auth Response ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken Payload Ġ= Ġtoken Triple . second ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisValid Token Ġ= Ġblock stack . verify Token ( auth Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isValid Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Login Failed Error , Ġ" invalid Ġauth Ġresponse ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Login Failed Error , Ġ" invalid Ġauth Ġresponse Ġ" Ġ+ Ġe . message )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġapp PrivateKey Ġ= Ġtoken Payload . getString (" private _ key ") ĊĠĠĠĠĠĠĠ Ġval Ġcore Session Token Ġ= Ġtoken Payload . opt String (" core _ token ") ĊĠĠĠĠĠĠĠ Ġval ĠuserData Ġ= Ġauth Response To UserData ( token Payload , Ġname Lookup Url , Ġapp PrivateKey , Ġcore Session Token , Ġauth Response ) ĊĠĠĠĠĠĠĠ Ġreturn ĠResult ( userData ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġauth Response To UserData ( token Payload : ĠJSONObject , Ġname Lookup Url : ĠString , Ġapp PrivateKey : ĠString ?, Ġcore Session Token : ĠString ?, Ġauth Response : ĠString ): ĠUser Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiss Ġ= Ġtoken Payload . getString (" iss ") ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Address Ġ= ĠD IDs . getAddress From DID ( iss ) ĊĠĠĠĠĠĠĠ Ġval ĠuserData Ġ= ĠUser Data ( JSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" username ", Ġtoken Payload . getString (" username ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" profile ", Ġextract Profile ( token Payload , Ġname Lookup Url )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" email ", Ġtoken Payload . opt String (" email ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" de central ized ID ", Ġiss ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" identity Address ", Ġidentity Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" app PrivateKey ", Ġapp PrivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" core Session Token ", Ġcore Session Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" auth Response Token ", Ġauth Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" hub Url ", Ġtoken Payload . opt String (" hub Url ", ĠBLOCK STACK _ DEFAULT _ G AI A _ HUB _ URL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" ga ia Associ ationToken ", Ġtoken Payload . opt String (" associ ationToken "))) ĊĠĠĠĠĠĠĠ Ġreturn ĠuserData ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġextract Profile ( token Payload : ĠJSONObject , Ġname Lookup Url : ĠString ): ĠJSONObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprofile Url Ġ= Ġtoken Payload . opt String OrNull (" profile _ url ") ĊĠĠĠĠĠĠĠ Ġif Ġ( profile Url Ġ!= Ġnull Ġ&& Ġprofile Url . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( profile Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcall Factory . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofiles Ġ= ĠJSONArray ( response . body () !!. string ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( profiles . length () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofiles . getJSONObject ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" invalid Ġprofile Ġurl Ġ$ profile Url : Ġ${ response . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtoken Payload . getJSONObject (" profile ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt ( cipher Object Hex : ĠString , ĠprivateKey : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cipher Object Hex . isEmpty () Ġ|| Ġcipher Object Hex Ġ=== Ġ" null ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġblock stack . decrypt Content ( cipher Object Hex . hex To ByteArray (). toString ( Charsets . UTF _ 8 ), Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Options ( privateKey Ġ= ĠprivateKey ) ĊĠĠĠĠĠĠĠ Ġ). value Ġas ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġ@ ignore ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġget Or Set Local Ga ia Hub Connection (): ĠGa ia Hub Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Data Ġ= Ġsession Store . session Data ĊĠĠĠĠĠĠĠ Ġval ĠuserData Ġ= Ġsession Data . json . opt JSONObject (" userData ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Missing ĠuserData ") ĊĠĠĠĠĠĠĠ Ġval Ġhub Config Ġ= ĠuserData . opt JSONObject (" ga ia Hub Config ") ĊĠĠĠĠĠĠĠ Ġif Ġ( hub Config Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠGa ia Hub Config ( hub Config . getString (" url _ prefix "), Ġhub Config . getString (" address "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhub Config . getString (" token "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhub Config . getString (" server ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgaia Hub Config Ġ= Ġconfig ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconfig ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠuserData . opt (" ga ia Hub Config ") ĊĠĠĠĠĠĠĠ Ġif Ġ( config Ġis ĠGa ia Hub Config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ga ia Hub Config Ġ= Ġconfig ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconfig ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . set Local Ga ia Hub Connection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThese Ġtwo Ġfunctions Ġare Ġapp - specific Ġconnections Ġto Ġgaia Ġhub , ĊĠĠĠĠ Ġ* ĠĠ Ġthey Ġread Ġthe Ġuser Ġdata Ġobject Ġfor Ġinformation Ġon Ġsetting Ġup ĊĠĠĠĠ Ġ* ĠĠ Ġa Ġhub Ġconnection , Ġand Ġstore Ġthe Ġhub Ġconfig Ġto Ġlocal storage ĊĠĠĠĠ Ġ* Ġ@ private ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Promise } Ġthat Ġresolves Ġto Ġthe Ġnew Ġgaia Ġhub Ġconnection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġset Local Ga ia Hub Connection (): ĠGa ia Hub Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserData Ġ= Ġthis . load UserData () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( userData . json . opt String OrNull (" hub Url ") Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . json . put (" hub Url ", ĠBLOCK STACK _ DEFAULT _ G AI A _ HUB _ URL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgaia Config Ġ= Ġhub . connect To Ga ia ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . hub Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . app PrivateKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserData . json . opt String OrNull (" ga ia Associ ationToken ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠuserData . json . put (" ga ia Hub Config ", Ġgaia Config ) ĊĠĠĠĠĠĠĠ Ġval Ġsession Data Ġ= Ġsession Store . session Data . json ĊĠĠĠĠĠĠĠ Ġsession Data . put (" userData ", ĠuserData . json ) ĊĠĠĠĠĠĠĠ Ġsession Store . session Data Ġ= ĠSession Data ( session Data ) ĊĠĠĠĠĠĠĠ Ġgaia Hub Config Ġ= Ġgaia Config ĊĠĠĠĠĠĠĠ Ġreturn Ġgaia Config ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġspecified Ġfile Ġfrom Ġthe Ġapp 's Ġdata Ġstore . ĊĠĠĠĠ Ġ* ĠThe Ġmethod Ġis Ġcalled Ġwith Ġ` Dispatch ers . IO ` ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġpath Ġthe Ġpath Ġof Ġthe Ġfile Ġfrom Ġwhich Ġto Ġread Ġdata ĊĠĠĠĠ Ġ* Ġ@ property Ġoptions Ġan Ġinstance Ġof Ġa Ġ` Get File Options ` Ġobject Ġwhich Ġis Ġused Ġto Ġconfigure ĊĠĠĠĠ Ġ* Ġoptions Ġsuch Ġas Ġde cryption Ġand Ġreading Ġfiles Ġfrom Ġother Ġapps Ġor Ġusers . ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġresult Ġobject Ġwith Ġthe Ġfile Ġcontents Ġor Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetFile ( path : ĠString , Ġoptions : ĠGet File Options ): ĠResult < out ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" getFile : Ġpath : Ġ$ path Ġoptions : Ġ$ options ") ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Result Ġ= ĠgetFile Url ( path , Ġoptions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Request Ġ= Ġhub . build GetRequest ( url Result . value !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcall Factory . new Call ( getRequest ). execute () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġ" Error Ġwhen Ġloading Ġfrom ĠGa ia Ġhub , Ġstatus :" Ġ+ Ġresponse . code ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġresponse . header (" Content - Type ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠAny ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . decrypt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Content Ġ= Ġresponse . body () !!. string () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Object Ġ= Ġif Ġ( options . verify ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Address Ġ= Ġif Ġ( options . username Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ga ia Address ( options . app ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġapp Config !!. app Domain . toString (), Ġoptions . username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgaia Hub Config !!. address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Signed Encrypted Content ( response Content , Ġexpected Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher Object ( JSONObject ( response Content )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Content Ġ= ĠEncryption (). decrypt With PrivateKey ( Encrypted Result Form ( cipher Object . ep hemeral PK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher Object . iv , Ġcipher Object . mac , Ġcipher Object . cipher Text , Ġapp PrivateKey )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( cipher Object . was String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( de crypted Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( contentType Ġ=== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| ĠcontentType . startsWith (" text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| ĠcontentType Ġ== Ġ" application / json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . verify ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Request Ġ= Ġhub . build GetRequest ( hub . getFull Read Url ("$ path $ SIGNATURE _ FILE _ EXTENSION ", Ġgaia Hub Config !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Response Ġ= Ġcall Factory . new Call ( signature Request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( signature Response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Object Ġ= ĠSignature Object . from JSON String ( signature Response . body () !!. string ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Hash Ġ= Ġif Ġ( result Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġas ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sha 2 5 6 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= ĠEC KeyPair ( PrivateKey ( 0 . to BigInteger ()), ĠPublicKey ( signature Object . publicKey )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! key Pair . verify ( result Hash , Ġsignature Object . signature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Signature Verification Error , Ġ" Failed Ġto Ġverify Ġsignature : ĠInvalid Ġsignature Ġfor Ġfile : Ġ$ path ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Signature Verification Error , Ġ" Failed Ġto Ġverify Ġsignature : ĠFailed Ġto Ġobtain Ġsignature Ġfor Ġfile : Ġ$ path ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġ" invalid Ġresponse Ġfrom ĠgetFile ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġexception . exception OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġe . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġe . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġexception . get OrNull () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Ga ia Address ( app Domain : ĠString , Ġusername : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Url Ġ= Ġblock stack . getUser App File Url ("/", Ġusername , Ġapp Domain , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠRegex (" ([ 1 3 ][ a - km - zA - HJ - NP - Z 0 - 9 ]{ 2 6 , 3 5 }) "). find ( file Url )?. value ĊĠĠĠĠĠĠĠ Ġif Ġ( address Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaddress ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStores Ġthe Ġdata Ġprovided Ġin Ġthe Ġapp 's Ġdata Ġstore Ġto Ġto Ġthe Ġfile Ġspecified . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġpath Ġthe Ġpath Ġto Ġstore Ġthe Ġdata Ġto ĊĠĠĠĠ Ġ* Ġ@ property Ġcontent Ġthe Ġdata Ġto Ġstore Ġin Ġthe Ġfile ĊĠĠĠĠ Ġ* Ġ@ property Ġoptions Ġan Ġinstance Ġof Ġa Ġ` Put File Options ` Ġobject Ġwhich Ġis Ġused Ġto Ġconfigure ĊĠĠĠĠ Ġ* Ġoptions Ġsuch Ġas Ġencryption ĊĠĠĠĠ Ġ* Ġ@ property Ġa Ġresult Ġobject Ġwi ht Ġa Ġ` String ` Ġrepresentation Ġof Ġa Ġurl Ġfrom ĊĠĠĠĠ Ġ* Ġwhich Ġyou Ġcan Ġread Ġthe Ġfile Ġthat Ġwas Ġjust Ġput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġput File ( path : ĠString , Ġcontent : ĠAny , Ġoptions : ĠPut File Options ): ĠResult < out ĠString > Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" put File : Ġpath : Ġ${ path } Ġoptions : Ġ${ options }") ĊĠĠĠĠĠĠĠ Ġval Ġgaia Hub Configuration Ġ= Ġget Or Set Local Ga ia Hub Connection () ĊĠĠĠĠĠĠĠ Ġval Ġvalid Ġ= Ġcontent Ġis ĠString Ġ|| Ġcontent Ġis ĠByteArray ĊĠĠĠĠĠĠĠ Ġif Ġ(! valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" put File Ġcontent Ġonly Ġsupports ĠString Ġor ĠByteArray ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠcontentType : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġrequest Content Ġ= Ġif Ġ( options . encrypt Ġ|| Ġoptions . encryption Key Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġ" application / json " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Ġ= ĠEncryption () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġoptions . encryption Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠPrivate Key ( app PrivateKey !! ). to EC KeyPair (). to Hex PublicKey 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent ByteArray Ġ= Ġif Ġ( content Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġas ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenc . encrypt With PublicKey ( content ByteArray , ĠpublicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson String Ġ= ĠCipher Object ( result . iv , Ġresult . ep hem PublicKey , Ġresult . ciphertext , Ġresult . mac , Ġcontent Ġis ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. json . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . should Sign ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Cipher Object Ġ= Ġsign Encrypted Content ( json String , Ġget Sign Key ( options )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned Cipher Object . toJSON ByteString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte String . encode Utf 8 ( json String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġoptions . contentType Ġ?: Ġif Ġ( content Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" text / plain " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" application / octet - stream " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte String . encode Utf 8 ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte String . of ( content Ġas ĠByteArray , Ġ 0 , Ġcontent . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġhub . upload To Ga ia Hub ( path , Ġrequest Content , Ġgaia Hub Configuration , ĠcontentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Text Ġ= Ġresponse . body ()?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( responseText Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! options . should Encrypt () Ġ&& Ġoptions . should Sign ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Content Ġ= Ġsign Content ( request Content . toByteArray (), Ġget Sign Key ( options )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhub . upload To Ga ia Hub ("$ path $ SIGNATURE _ FILE _ EXTENSION ", Ġsigned Content . toJSON ByteString (), Ġgaia Hub Config !! , Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġ" invalid Ġresponse Ġfrom Ġput File Ġsignature Ġ$ responseText ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse JSON Ġ= ĠJSONObject ( responseText ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( response JSON . getString (" public URL ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġ" invalid Ġresponse Ġfrom Ġput File Ġ$ responseText ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġe . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġe . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sign Key ( options : ĠPut File Options ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( options . sign Ġis ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp PrivateKey !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . sign Ġas ĠString ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhandle Signed Encrypted Content ( response Content : ĠString , Ġexpected Address : ĠString ): ĠCipher Object Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsigned Cipher Object Ġ= ĠSigned Cipher Object . from JSON String ( response Content ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsigner Address Ġ= Ġsigned Cipher Object . publicKey . to Btc Address () ĊĠĠĠĠĠĠĠ Ġif Ġ( signer Address Ġ!= Ġexpected Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Parameter Exception (" Unexpected Ġsigner Ġaddress Ġ$ signer Address Ġ!= Ġ$ expected Address ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Hash Ġ= Ġsigned Cipher Object . signature . toByteArray (). sha 2 5 6 () ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= ĠEC KeyPair ( PrivateKey ( BigInteger . ZERO ), ĠPublicKey ( signed Cipher Object . publicKey )) ĊĠĠĠĠĠĠĠ Ġif Ġ( key Pair . verify ( content Hash , Ġsigned Cipher Object . signature )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCipher Object ( JSONObject ( signed Cipher Object . signature )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Parameter Exception (" Invalid Ġsignature ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġdelete File ( path : ĠString , Ġoptions : ĠDelete File Options Ġ= ĠDelete File Options ()): ĠResult < out ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhub . delete From Ga ia Hub ( path , Ġoptions . ga ia Hub Config Ġ?: Ġgaia Hub Config !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġe . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġe . toString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġthe Ġset Ġof Ġfiles Ġin Ġthis Ġapplication 's ĠGa ia Ġstorage Ġbucket . ĊĠĠĠĠ Ġ* Ġ@ param Ġ{ function } Ġcallback Ġ- Ġa Ġcallback Ġto Ġinvoke Ġon Ġeach Ġnamed Ġfile Ġthat ĊĠĠĠĠ Ġ* Ġreturns Ġ` true ` Ġto Ġcontinue Ġthe Ġlisting Ġoperation Ġor Ġ` false ` Ġto Ġend Ġit ĊĠĠĠĠ Ġ* Ġ@ return Ġ{ Promise } Ġthat Ġresolves Ġto Ġthe Ġnumber Ġof Ġfiles Ġlisted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġlist Files ( callback : Ġ( Result < String >) Ġ-> ĠBoolean ): ĠResult < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Count Ġ= Ġlist Files Loop ( null , Ġcallback , Ġnull , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( file Count ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġe . message Ġ?: Ġe . toString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe ĠURL Ġfor Ġreading Ġa Ġfile Ġfrom Ġan Ġapp 's Ġdata Ġstore . ĊĠĠĠĠ Ġ* Ġ@ param Ġpath Ġ Ġthe Ġpath Ġto Ġthe Ġfile Ġto Ġread ĊĠĠĠĠ Ġ* Ġ@ param Ġoptions Ġ- Ġoptions Ġobject ĊĠĠĠĠ Ġ* Ġ@ returns Ġ{ Promise < string >} Ġthat Ġresolves Ġto Ġthe ĠURL Ġor Ġreject s Ġwith Ġan Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetFile Url ( path : ĠString , Ġoptions : ĠGet File Options ): ĠResult < String > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġread Url : ĠString ? ĊĠĠĠĠĠĠĠ Ġif Ġ( options . username Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Url Ġ= Ġblock stack . getUser App File Url ( path , Ġoptions . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . app Ġ?: Ġapp Config ?. app Domain . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . zone File Lookup URL ?. toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgaia Hub Config Ġ= Ġget Or Set Local Ga ia Hub Connection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Url Ġ= Ġhub . getFull Read Url ( path , Ġgaia Hub Config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( read Url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġ" Missing Ġread URL ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult ( read Url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġlist Files Loop ( ga ia Hub Config : ĠGa ia Hub Config ? Ġ= Ġnull , Ġcallback : Ġ( Result < String >) Ġ-> ĠBoolean , Ġpage : ĠString ?, Ġcall Count : ĠInt , Ġfile Count : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Count Ġ> Ġ 6 5 5 3 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Too Ġmany Ġentries Ġto Ġlist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġbuild List Files Request ( page , Ġgaia Hub Config Ġ?: Ġget Hub Config ()) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Factory . new Call ( request ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġreconnect ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" reconnect Ġto Ġgaia Ġ${ response . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" call Ġto Ġlist - files Ġfailed Ġ${ response . code () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Json Ġ= ĠJSONObject ( response . body () !!. string ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Entries Ġ= Ġresponse Json . opt JSONArray (" entries ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Ġ= Ġif Ġ( response Json . isNull (" page ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Json . getString (" page ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Entries Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġindicates Ġa Ġmis be having ĠGa ia Ġhub Ġor Ġa Ġmis be having Ġdriver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( i . e . Ġthe Ġdata Ġis Ġmalformed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Bad Ġlist Files Ġresponse : Ġno Ġentries ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġfile Entries . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Continue Ġ= Ġcallback ( Result ( file Entries . getString ( index ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! should Continue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile Count Ġ+ Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Page Ġ!= Ġnull Ġ&& Ġnext Page . isNotEmpty () Ġ&& Ġfile Entries . length () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist Files Loop ( ga ia Hub Config , Ġcallback , Ġnext Page , Ġcall Count Ġ+ Ġ 1 , Ġfile Count Ġ+ Ġfile Entries . length ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile Count Ġ+ Ġfile Entries . length () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Hub Config (): ĠGa ia Hub Config Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgaia Hub Config Ġ?: Ġthrow ĠRuntimeException (" not Ġconnected Ġto Ġgaia ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġbuild List Files Request ( page : ĠString ?, Ġhub Config : ĠGa ia Hub Config ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Request Ġ= ĠJSONObject (). put (" page ", Ġpage ). toString () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġpage Request ) ĊĠĠĠĠĠĠĠ Ġreturn ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ("${ hub Config . server }/ list - files /${ hub Config . address }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Content - Type ", ĠCONTENT _ TYPE _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Content - Length ", Ġpage Request . length . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Authorization ", Ġ" bearer Ġ${ hub Config . token }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Ref errer - Policy ", Ġ" no - referrer ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. method (" POST ", ĠRequest Body . create ( MediaType . get ( CONTENT _ TYPE _ JSON ), Ġpage Request )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis User Signed In (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsession Store . session Data . json . opt JSONObject (" userData ") ?. opt String (" app PrivateKey ") Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload UserData (): ĠUser Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserData Json Ġ= Ġsession Store . session Data . json . opt JSONObject (" userData ") ĊĠĠĠĠĠĠĠ Ġif Ġ( userData Json Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUser Data ( userData Json ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġuser Ġdata Ġfound . ĠDid Ġthe Ġuser Ġsign Ġin ?") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsign User Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġsession Store . delete Session Data () ĊĠĠĠĠĠĠĠ Ġapp PrivateKey Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalidate Pro ofs ( profile : ĠProfile , Ġowner Address : ĠString , Ġopt String : ĠString ?): ĠResult < ArrayList < Proof >> Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" not Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġreturn ĠResult ( null , ĠResult Error ( ErrorCode . Unknown Error , Ġ" Not Ġimplemented ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencrypt Content ( content : ĠAny , Ġoptions : ĠCrypto Options ): ĠResult < Cipher Object > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdated Options Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . publicKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp PrivateKey Pair Ġ= ĠPrivate Key ( app PrivateKey !! ). to EC KeyPair () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġapp PrivateKey Pair . to Hex PublicKey 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Options ( publicKey Ġ= ĠpublicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġblock stack . encrypt Content ( content , Ġupdated Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt Content ( cipher Object : ĠString , Ġbinary : ĠBoolean , Ġoptions : ĠCrypto Options ): ĠResult < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdated Options Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . privateKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Options ( privateKey Ġ= Ġapp PrivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġblock stack . decrypt Content ( cipher Object , Ġbinary , Ġupdated Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠBlock stack Session :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġval ĠCONTENT _ TYPE _ JSON Ġ= Ġ" application / json " ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠJSONObject . opt String OrNull ( name : ĠString ): ĠString ? Ġ{ ĊĠĠĠ Ġif Ġ( isNull ( name )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġopt String ( name ) ĊĠĠĠ Ġ} Ċ } Ċ