/* Ċ * ĠTor On ion Proxy Library - Android Ġ( a . k . a . Ġto pl - android ) Ġis Ġa Ġder ivation Ġof Ċ * Ġwork Ġfrom Ġthe ĠTor _ On ion _ Proxy _ Library Ġproject Ġthat Ġstarted Ġat Ġcommit Ċ * Ġhash Ġ` 7 4 4 0 7 1 1 4 cb fa 8 ea 6 f 2 ac 5 1 4 1 7 dda 8 be 9 8 d 8 aba 8 6 `. ĠCont ributions Ġmade Ġafter Ċ * Ġsaid Ġcommit Ġhash Ġare : Ċ * Ċ * ĠĠĠĠ ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠMat thew ĠN el son Ċ * Ċ * ĠĠĠĠ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ġit Ċ * ĠĠĠĠ Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ġthe Ċ * ĠĠĠĠ ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ġ( at Ġyour Ċ * ĠĠĠĠ Ġoption ) Ġany Ġlater Ġversion . Ċ * Ċ * ĠĠĠĠ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ġbut Ċ * ĠĠĠĠ ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof ĠMERCHANTABILITY Ċ * ĠĠĠĠ Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . ĠSee Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ * ĠĠĠĠ Ġfor Ġmore Ġdetails . Ċ * Ċ * ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ * ĠĠĠĠ Ġalong Ġwith Ġthis Ġprogram . ĠIf Ġnot , Ġsee Ġ< https :// www . gnu . org / licenses />. Ċ * Ċ * Ġ` ================================================================ =========== ` Ċ * Ġ` ++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ ++++++++ +++ ` Ċ * Ġ` ================================================================ =========== ` Ċ * Ċ * ĠThe Ġfollowing Ġexception Ġis Ġan Ġadditional Ġpermission Ġunder Ġsection Ġ 7 Ġof Ġthe Ċ * ĠGNU ĠGeneral ĠPublic ĠLicense , Ġversion Ġ 3 Ġ( âĢľ GPL v 3 âĢĿ ). Ċ * Ċ * ĠĠĠĠ Ġ" The ĠInterfaces " Ġis Ġhence for th Ġdefined Ġas ĠApplication ĠProgramming ĠInterfaces Ċ * ĠĠĠĠ Ġneeded Ġto Ġimplement ĠTor On ion Proxy Library - Android , Ġas Ġlisted Ġbelow : Ċ * Ċ * ĠĠĠĠĠ Ġ- ĠFrom Ġthe Ġ` to pl - core - base ` Ġmodule : Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠAll ĠClasses / methods / variables Ċ * Ċ * ĠĠĠĠĠ Ġ- ĠFrom Ġthe Ġ` to pl - service - base ` Ġmodule : Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠAll ĠClasses / methods / variables Ċ * Ċ * ĠĠĠĠĠ Ġ- ĠFrom Ġthe Ġ` to pl - service ` Ġmodule : Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠTor Service Controller Ġclass Ġand Ġit 's Ġcontained Ġclasses / methods / variables Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠService Notification . Builder Ġclass Ġand Ġit 's Ġcontained Ġclasses / methods / variables Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠBackground Manager . Builder Ġclass Ġand Ġit 's Ġcontained Ġclasses / methods / variables Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠBackground Manager . Companion Ġclass Ġand Ġit 's Ġcontained Ġmethods / variables Ċ * Ċ * ĠĠĠĠ ĠThe Ġfollowing Ġcode Ġis Ġexcluded Ġfrom Ġ" The ĠInterfaces ": Ċ * Ċ * ĠĠĠĠĠĠ Ġ- ĠAll Ġother Ġcode Ċ * Ċ * ĠĠĠĠ ĠLink ing ĠTor On ion Proxy Library - Android Ġstatic ally Ġor Ġdynamically Ġwith Ġother Ċ * ĠĠĠĠ Ġmodules Ġis Ġmaking Ġa Ġcombined Ġwork Ġbased Ġon ĠTor On ion Proxy Library - Android . Ċ * ĠĠĠĠ ĠThus , Ġthe Ġterms Ġand Ġconditions Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġcover Ġthe Ċ * ĠĠĠĠ Ġwhole Ġcombination . Ċ * Ċ * ĠĠĠĠ ĠAs Ġa Ġspecial Ġexception , Ġthe Ġcopyright Ġholder Ġof ĠTor On ion Proxy Library - Android Ċ * ĠĠĠĠ Ġgives Ġyou Ġpermission Ġto Ġcombine ĠTor On ion Proxy Library - Android Ġprogram Ġwith Ġfree Ċ * ĠĠĠĠ Ġsoftware Ġprograms Ġor Ġlibraries Ġthat Ġare Ġreleased Ġunder Ġthe ĠGNU ĠLGPL Ġand Ġwith Ċ * ĠĠĠĠ Ġindependent Ġmodules Ġthat Ġcommunicate Ġwith ĠTor On ion Proxy Library - Android Ġsole ly Ċ * ĠĠĠĠ Ġthrough Ġ" The ĠInterfaces ". ĠYou Ġmay Ġcopy Ġand Ġdistribute Ġsuch Ġa Ġsystem Ġfollowing Ċ * ĠĠĠĠ Ġthe Ġterms Ġof Ġthe ĠGNU ĠGPL Ġfor ĠTor On ion Proxy Library - Android Ġand Ġthe Ġlicenses Ġof Ċ * ĠĠĠĠ Ġthe Ġother Ġcode Ġconcerned , Ġprovided Ġthat Ġyou Ġinclude Ġthe Ġsource Ġcode Ġof Ġthat Ċ * ĠĠĠĠ Ġother Ġcode Ġwhen Ġand Ġas Ġthe ĠGNU ĠGPL Ġrequires Ġdistribution Ġof Ġsource Ġcode Ġand Ċ * ĠĠĠĠ Ġprovided Ġthat Ġyou Ġdo Ġnot Ġmodify Ġ" The ĠInterfaces ". Ċ * Ċ * ĠĠĠĠ ĠNote Ġthat Ġpeople Ġwho Ġmake Ġmodified Ġversions Ġof ĠTor On ion Proxy Library - Android Ċ * ĠĠĠĠ Ġare Ġnot Ġoblig ated Ġto Ġgrant Ġthis Ġspecial Ġexception Ġfor Ġtheir Ġmodified Ġversions ; Ċ * ĠĠĠĠ Ġit Ġis Ġtheir Ġchoice Ġwhether Ġto Ġdo Ġso . ĠThe ĠGNU ĠGeneral ĠPublic ĠLicense Ġgives Ċ * ĠĠĠĠ Ġpermission Ġto Ġrelease Ġa Ġmodified Ġversion Ġwithout Ġthis Ġexception ; Ġthis Ġexception Ċ * ĠĠĠĠ Ġalso Ġmakes Ġit Ġpossible Ġto Ġrelease Ġa Ġmodified Ġversion Ġwhich Ġcar ries Ġforward Ġthis Ċ * ĠĠĠĠ Ġexception . ĠIf Ġyou Ġmodify Ġ" The ĠInterfaces ", Ġthis Ġexception Ġdoes Ġnot Ġapply Ġto Ġyour Ċ * ĠĠĠĠ Ġmodified Ġversion Ġof ĠTor On ion Proxy Library - Android , Ġand Ġyou Ġmust Ġremove Ġthis Ċ * ĠĠĠĠ Ġexception Ġwhen Ġyou Ġdistribute Ġyour Ġmodified Ġversion . Ċ * Ġ*/ Ċ package Ġio . mat the wn el son . to pl _ service . service . components . on ion proxy Ċ Ċ import Ġio . mat the wn el son . to pl _ core . util . Tor Installer Ċ import Ġio . mat the wn el son . to pl _ core _ base . Tor Config Files Ċ import Ġio . mat the wn el son . to pl _ service . R Ċ import Ġio . mat the wn el son . to pl _ service . Tor Service Controller Ċ import Ġio . mat the wn el son . to pl _ service _ base . Tor Service Prefs Ċ import Ġio . mat the wn el son . to pl _ service . service . Base Service Ċ import Ġio . mat the wn el son . to pl _ service _ base . Base Service Consts . Pref Key List Ċ import Ġjava . io .* Ċ import Ġjava . util . concurrent . TimeoutException Ċ Ċ /** Ċ Ġ* ĠInstall s Ġthings Ġneeded Ġfor ĠTor . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ io . mat the wn el son . to pl _ service . Tor Service Controller . Builder ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġ[ tor Service ] Ġ[ Base Service ] Ġfor Ġcontext Ċ Ġ* Ġ*/ Ċ internal Ġclass ĠService Tor Installer Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġtor Service : ĠBase Service Ċ ): ĠTor Installer () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠĠĠĠĠ Ġfun Ġinstantiate ( tor Service : ĠBase Service ): ĠService Tor Installer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Tor Installer ( tor Service ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAPP _ VERSION _ CODE Ġ= Ġ" APP _ VERSION _ CODE " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtor Config Files : ĠTor Config Files ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠTor Service Controller . get Tor Config Files () ĊĊĠĠĠ Ġprivate Ġvar Ġgeo Ip File Copied Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġgeo Ipv 6 File Copied Ġ= Ġfalse ĊĊĠĠĠ Ġ// Ġbroadcast Logger Ġis Ġavailable Ġfrom ĠTor Installer Ġand Ġis Ġinstantiated Ġas Ġsoon Ġas ĊĠĠĠ Ġ// ĠOn ion Proxy Manager Ġgets Ġinitialized . Ċ // ĠĠĠ Ġvar Ġbroadcast Logger : ĠBroadcast Logger ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠSecurity Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! tor Config Files . geo Ip File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Geo Ip Asset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeo Ip File Copied Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! tor Config Files . geo Ipv 6 File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Geo Ipv 6 Asset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeo Ipv 6 File Copied Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! tor Config Files . v 3 Auth Private Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtor Config Files . v 3 Auth Private Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Prefs Ġ= ĠBase Service . getLocal Prefs ( tor Service . getContext ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġapp Ġversion Ġhas Ġbeen Ġincreased , Ġor Ġif Ġthis Ġis Ġa Ġdebug Ġbuild , Ġcopy Ġover ĊĠĠĠĠĠĠĠ Ġ// Ġgeo ip Ġassets Ġthen Ġupdate ĠSharedPreferences Ġwith Ġthe Ġnew Ġversion Ġcode . ĠThis ĊĠĠĠĠĠĠĠ Ġ// Ġmit ig ates Ġcopying Ġto Ġbe Ġdone Ġonly Ġif Ġa Ġversion Ġupgrade Ġis Ġhad . ĊĠĠĠĠĠĠĠ Ġif Ġ( Base Service . get Build Config Debug () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Service . get Build Config Version Code () Ġ> Ġlocal Prefs . getInt ( APP _ VERSION _ CODE , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! geo Ip File Copied ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Geo Ip Asset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! geo Ipv 6 File Copied ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Geo Ipv 6 Asset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Prefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Int ( APP _ VERSION _ CODE , ĠBase Service . get Build Config Version Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Geo Ip Asset () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( tor Config Files . geo Ip File Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtor Service . copy Asset ( Base Service . get Geo ip Asset Path (), Ġtor Config Files . geo Ip File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Logger ?. debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Asset Ġcopied Ġfrom Ġ${ Base Service . get Geo ip Asset Path ()} Ġ-> Ġ${ tor Config Files . geo Ip File }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Geo Ipv 6 Asset () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( tor Config Files . geo Ipv 6 File Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtor Service . copy Asset ( Base Service . get Geo ip 6 Asset Path (), Ġtor Config Files . geo Ipv 6 File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Logger ?. debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Asset Ġcopied Ġfrom Ġ${ Base Service . get Geo ip 6 Asset Path ()} Ġ-> Ġ${ tor Config Files . geo Ipv 6 File }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠTimeout Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġupdate Tor Config Custom ( content : ĠString ?) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġopen B rid ges Stream (): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB rid ges List Ġis Ġan Ġover loaded Ġfield , Ġwhich Ġcan Ġcause Ġsome Ġconfusion . ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġlist Ġcan Ġbe : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ) Ġa Ġfilter Ġlike Ġob fs 4 , Ġme ek , Ġor Ġsnow flake ĠOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 ) Ġit Ġcan Ġbe Ġa Ġcustom Ġbridge ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFor Ġ( 1 ), Ġwe Ġjust Ġpass Ġback Ġall Ġb rid ges , Ġthe Ġfilter Ġwill Ġoccur ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelsewhere Ġin Ġthe Ġlibrary . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFor Ġ( 2 ) Ġwe Ġreturn Ġthe Ġbridge Ġlist Ġas Ġa Ġraw Ġstream . ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIf Ġlength Ġis Ġgreater Ġthan Ġ 9 , Ġthen Ġwe Ġknow Ġthis Ġis Ġa Ġcustom Ġbridge ĊĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠComp let ely Ġrefactor Ġhow Ġb rid ges Ġwork . ĊĠĠĠĠĠĠĠ Ġval Ġuser Defined Bridge List : ĠString Ġ= ĠTor Service Prefs ( tor Service . getContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getList ( Pref Key List . USER _ DEFINED _ BR ID GES , Ġarray ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString () ĊĊĠĠĠĠĠĠĠ Ġvar Ġbridge Type Ġ= Ġ( if Ġ( user Defined Bridge List . length Ġ> Ġ 9 ) Ġ 1 Ġelse Ġ 0 ). to Byte () ĊĠĠĠĠĠĠĠ Ġ// ĠTer rible Ġhack . ĠMust Ġkeep Ġin Ġsync Ġwith Ġto pl :: add B rid ges From Resources . ĊĠĠĠĠĠĠĠ Ġif Ġ( bridge Type . toInt () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( user Defined Bridge List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSupported Bridge Type . OB FS 4 Ġ-> Ġbridge Type Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSupported Bridge Type . ME EK Ġ-> Ġbridge Type Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSupported Bridge Type . S NOW FL A KE Ġ-> Ġbridge Type Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbridge Type Stream Ġ= ĠByteArrayInputStream ( byte ArrayOf ( bridge Type )) ĊĠĠĠĠĠĠĠ Ġval Ġbridge Stream Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bridge Type . toInt () Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArrayInputStream ( user Defined Bridge List . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtor Service . getContext (). resources . open Raw Resource ( R . raw . brid ges ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSequence InputStream ( bridge Type Stream , Ġbridge Stream ) ĊĠĠĠ Ġ} Ċ }