package Ġcom . bab o ais ystem . tor . core Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . bab o ais ystem . tor . Tor Ċ import Ġcom . bab o ais ystem . tor . utils . FileUtils Ċ import Ġcom . bab o ais ystem . tor . utils . Native Loader Ċ import Ġcom . bab o ais ystem . tor . utils . Network Utils Ċ import Ġjava . io .* Ċ import Ġjava . util . concurrent . TimeoutException Ċ import Ġjava . util . logging . Logger Ċ import Ġjava . util . zip . Zip InputStream Ċ Ċ class ĠTor ResourceManager ( private Ġval Ġtor Settings : ĠTor . Settings ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getLogger (" Tor ResourceManager ") ĊĊĠĠĠ Ġlateinit Ġvar Ġfile Tor : ĠFile ĊĠĠĠ Ġlateinit Ġvar Ġfile Tor rc Custom : ĠFile ĊĠĠĠ Ġlateinit Ġvar Ġfile Tor Control Port : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfile Tor rc : ĠFile ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠTimeout Exception :: class ) ĊĠĠĠ Ġfun Ġinstall Resources (): ĠFile ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! tor Settings . app Files Dir . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtor Settings . app Files Dir . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! tor Settings . app Data Dir . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtor Settings . app Data Dir . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġfile Tor Control Port Ġ= ĠFile ( tor Settings . app Files Dir , ĠTor Constants . TOR _ CONTROL _ PORT _ FILE ) ĊĊĠĠĠĠĠĠĠ Ġinstall Geo IP () ĊĊĠĠĠĠĠĠĠ Ġfile Tor rc Ġ= Ġasset ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTor Constants . COMMON _ AS SET _ KEY Ġ+ ĠTor Constants . TOR RC _ AS SET _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTor Constants . TOR RC _ AS SET _ KEY , Ġfalse , Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġupdate Tor rc Custom File ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Tor rc Custom Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfile Tor Ġ= ĠFile ( tor Settings . app Native Dir , ĠTor Constants . TOR _ AS SET _ KEY Ġ+ Ġ". so ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file Tor . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Tor . can Execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile Tor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . set Executable ( file Tor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Tor . can Execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile Tor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġins Stream : ĠInputStream Ġ= ĠFileInputStream ( file Tor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream ToFile ( ins Stream , Ġfile Tor , Ġfalse , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . set Executable ( file Tor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Tor . exists () Ġ&& Ġfile Tor . can Execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile Tor ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// it Ġexists Ġbut Ġwe Ġcan 't Ġexecute Ġit , Ġso Ġcopy Ġit Ġto Ġa Ġnew Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNative Loader . load Native Binary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtor Settings . app Native Dir , Ġtor Settings . app Source Dir , ĠTor Constants . TOR _ AS SET _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( tor Settings . app Files Dir , ĠTor Constants . TOR _ AS SET _ KEY )) ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . set Executable ( file Tor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Tor . exists () Ġ&& Ġfile Tor . can Execute ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Tor Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Tor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . se vere (" Error !!! ĠFile :${ file Tor } Ġnot Ġfound Ġ!!! ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠTimeout Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġupdate Tor rc Custom File (): ĠFile ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġextra Lines Ġ= ĠStringBuffer () ĊĊĠĠĠĠĠĠĠ Ġextra Lines . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Run As Daemon Ġ 1 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Avoid Disk Writes Ġ 1 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Control Port Write ToFile Ġ"). append ( file Tor Control Port . absolute Path ). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Control Port ĠAuto "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" SOCK SP ort Ġ"). append ( check Port Or Auto ( Tor Constants . SOCK S _ PROXY _ PORT _ DEFAULT )). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Reduc ed Connection Padding Ġ 1 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Reduc ed Circuit Padding Ġ 1 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Safe S ocks Ġ 0 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Test S ocks Ġ 0 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Trans Port Ġ 0 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" HTTP Tunnel Port Ġ"). append ( check Port Or Auto ( Tor Constants . HTTP _ PROXY _ PORT _ DEFAULT )). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" DN SP ort Ġ"). append ( check Port Or Auto ( Tor Constants . TOR _ DNS _ PORT _ DEFAULT )). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Cookie Authentication Ġ 1 "). append ('\ n ') ĊĠĠĠĠĠĠĠ Ġextra Lines . append (" Disable Network Ġ 0 "). append ('\ n ') ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Tor Rc Custom Ġ= ĠFile ( file Tor rc . getAbsolutePath () Ġ+ Ġ". custom ") ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġupdate Tor Config Custom ( file Tor Rc Custom , Ġextra Lines . toString ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( success Ġ&& Ġfile Tor Rc Custom . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Tor Rc Custom ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Port Or Auto ( port String : ĠString ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! port String . toLowerCase (). content Equals (" auto ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Port Used Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġport Ġ= Ġport String . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( is Port Used ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Port Used Ġ= ĠNetwork Utils . is Port Open (" 1 2 7 . 0 . 0 . 1 ", Ġport , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Port Used ) Ġ// the Ġspecified Ġport Ġis Ġnot Ġavailable , Ġso Ġlet ĠTor Ġfind Ġone Ġinstead ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġport . toString () Ġ+ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġport String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠFileNotFoundException :: class , ĠTimeout Exception :: class ) ĊĠĠĠ Ġfun Ġupdate Tor Config Custom ( file Tor Rc Custom : ĠFile , Ġextra Lines : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Tor Rc Custom . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Tor Rc Custom . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" tor Resources ", Ġ" de leting Ġexisting Ġtor rc . custom ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Tor Rc Custom . createNew File () ĊĊĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( file Tor Rc Custom , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġps Ġ= ĠPrint Stream ( fos ) ĊĠĠĠĠĠĠĠ Ġps . print ( extra Lines ) ĊĠĠĠĠĠĠĠ Ġps . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠExtract Ġthe ĠTor Ġbinary Ġfrom Ġthe ĠA PK Ġfile Ġusing ĠZIP ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġinstall Geo IP (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġasset ToFile ( Tor Constants . COMMON _ AS SET _ KEY Ġ+ ĠTor Constants . GEO IP _ AS SET _ KEY , ĠTor Constants . GEO IP _ AS SET _ KEY ) ĊĠĠĠĠĠĠĠ Ġasset ToFile ( Tor Constants . COMMON _ AS SET _ KEY Ġ+ ĠTor Constants . GEO IP 6 _ AS SET _ KEY , ĠTor Constants . GEO IP 6 _ AS SET _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠReads Ġfile Ġfrom Ġasset Path / asset Key Ġwrites Ġit Ġto Ġthe Ġinstall Ġfolder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġasset ToFile ( asset Path : ĠString , Ġasset Key : ĠString , Ġis Z ipped : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Executable : ĠBoolean Ġ= Ġfalse ): ĠFile Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġinp Stream Ġ= Ġtor Settings . context . assets . open ( asset Path ) ĊĠĠĠĠĠĠĠ Ġval Ġout File Ġ= ĠFile ( tor Settings . app Files Dir , Ġasset Key ) ĊĠĠĠĠĠĠĠ Ġstream ToFile ( inp Stream , Ġout File , Ġfalse , Ġis Z ipped ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Executable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . set Executable ( out File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġout File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġ* ĠWrite Ġthe Ġinput stream Ġcontents Ġto Ġthe Ġfile ĊĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġstream ToFile ( stm : ĠInputStream , Ġout File : ĠFile , Ġappend : ĠBoolean , Ġzip : ĠBoolean ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġinp Stream Ġ= Ġstm ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( Tor Constants . FILE _ WRITE _ BUFFER _ SIZE ) ĊĠĠĠĠĠĠĠ Ġvar Ġbyte count : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġstm Out : ĠOutputStream Ġ= ĠFileOutputStream ( out File . absolute Path , Ġappend ) ĊĠĠĠĠĠĠĠ Ġvar Ġz is : ĠZip InputStream ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( zip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz is Ġ= ĠZip InputStream ( stm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz is . next Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinp Stream Ġ= Ġz is ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( inp Stream . read ( buffer ). also Ġ{ Ġbyte count Ġ= Ġit Ġ} Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstm Out . write ( buffer , Ġ 0 , Ġbyte count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstm Out . close () ĊĠĠĠĠĠĠĠ Ġinp Stream . close () ĊĠĠĠĠĠĠĠ Ġz is ?. close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ Ċ } Ċ