package Ġchat . sphinx . feature _ network _ client Ċ Ċ import Ġapp . cash . exhaustive . Ex haustive Ċ import Ġchat . sphinx . concept _ network _ client _ crypto . Crypto Scheme Ċ import Ġchat . sphinx . concept _ network _ client _ crypto . is Crypto Header Ċ import Ġchat . sphinx . concept _ network _ client _ crypto . retrieve Crypto Scheme Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . ResponseBody . Companion . as ResponseBody Ċ import Ġokhttp 3 . ResponseBody . Companion . to ResponseBody Ċ import Ġok io . Buffer Ċ import Ġok io . Buffered Source Ċ import Ġorg . crypt on ode . jn crypt or . AES 2 5 6 J NC rypt or InputStream Ċ import Ġjava . io . IOException Ċ import Ġkotlin . jvm . Throws Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ private Ġinline Ġfun ĠCrypto Interceptor . build Invalid Response ( ĊĠĠĠ Ġrequest : ĠRequest , ĊĠĠĠ Ġfailure Message : ĠString , Ċ ): ĠResponse Ġ= ĊĠĠĠ ĠResponse . Builder () ĊĠĠĠĠĠĠĠ Ġ. request ( request ) ĊĠĠĠĠĠĠĠ Ġ. protocol ( Protocol . HTTP _ 1 _ 1 ) ĊĠĠĠĠĠĠĠ Ġ. code ( 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġ. message ( failure Message ) ĊĠĠĠĠĠĠĠ Ġ. body ( failure Message . to ResponseBody ( null )) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ /** Ċ Ġ* ĠInter cept s Ġa Ġnetwork Ġrequest Ġwhere Ġa Ġ[ chat . sphinx . concept _ network _ client _ crypto . Crypto Header ] Ċ Ġ* Ġis Ġpresent , Ġand Ġutil izes Ġthe Ġprovided Ġheader Ġvalue Ġto Ġencrypt / decrypt Ġthe Ċ Ġ* Ġ[ RequestBody ]/ [ ResponseBody ] Ġfor Ġthe Ġdeclared Ġ[ Crypto Scheme ] Ġwithin Ġthe Ġheader Ġkey . Ċ Ġ* Ċ Ġ* ĠThe Ġheaders Ġ( if Ġpresent ) Ġare Ġstripped Ġfrom Ġthe Ġrequest Ġprior Ġto Ġexecution Ġas Ġto Ġnot Ġleak Ċ Ġ* Ġsensitive Ġdata . Ċ Ġ* Ġ*/ Ċ class ĠCrypto Interceptor : ĠInter ceptor Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠ Ġval Ġcrypto Headers : ĠList < Pair < String , ĠString >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . headers . filter Ġ{ Ġit . first . is Crypto Header Ġ} ĊĊĠĠĠĠĠĠĠ Ġcrypto Headers . first OrNull ()?. let Ġ{ Ġcrypto Header Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġrequest . newBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStrip Ġ_ all _ ĠCrypto Headers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( header Ġin Ġcrypto Headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . remove Header ( header . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscheme : ĠCrypto Scheme Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Header . first . retrieve Crypto Scheme () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Scheme Ġunexpected ly Ġreturned Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġprocessing Ġthe Ġrequest Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Invalid Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Message Ġ= Ġe . message Ġ?: Ġ" Invalid ĠCrypto Scheme Ġretrieval Ġfrom Ġheaders ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Request ( scheme , Ġcrypto Header . second , Ġchain , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġchain . proceed ( request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġhandle Request ( ĊĠĠĠĠĠĠĠ Ġscheme : ĠCrypto Scheme , ĊĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠ Ġchain : ĠInter ceptor . Chain , ĊĠĠĠĠĠĠĠ Ġrequest : ĠRequest ĊĠĠĠ Ġ): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Ex haustive ĊĠĠĠĠĠĠĠ Ġwhen Ġ( scheme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCrypto Scheme . Decrypt Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġchain . proceed ( request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Body : ĠResponse Body Ġ= Ġresponse . body Ġ?: Ġreturn Ġresponse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Ex haustive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( scheme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Scheme . Decrypt . J NC rypt or Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠAES 2 5 6 J NC rypt or InputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Body . byte Stream (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword . toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Buffer : ĠBuffered Source Ġ= ĠBuffer (). read From ( stream ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( new Buffer . as ResponseBody ( response Body . contentType ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Scheme . Encrypt . J NC rypt or Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠBuild Ġout Ġsending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Encryption Ġis Ġnot Ġyet Ġsupported Ġfor Ġsending ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ