From c74c24ec2249f5f2eb7c5cbe16d6eb623562b9fb Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 29 Apr 2016 12:13:30 +0000 Subject: [PATCH 1/3] Add ADD_ONION and DEL_ONION support to jtorctl patch --- patches/jtorctl.patch | 121 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 2 deletions(-) diff --git a/patches/jtorctl.patch b/patches/jtorctl.patch index 167af82d2..7d346eff0 100644 --- a/patches/jtorctl.patch +++ b/patches/jtorctl.patch @@ -1,8 +1,125 @@ +diff --git a/net/freehaven/tor/control/TorControlCommands.java b/net/freehaven/tor/control/TorControlCommands.java +index 36482d5..14486e3 100644 +--- a/net/freehaven/tor/control/TorControlCommands.java ++++ b/net/freehaven/tor/control/TorControlCommands.java +@@ -144,5 +144,8 @@ public interface TorControlCommands { + "No such OR", + }; + ++ public static final String HS_ADDRESS = "onionAddress"; ++ public static final String HS_PRIVKEY = "onionPrivKey"; ++ + } + diff --git a/net/freehaven/tor/control/TorControlConnection.java b/net/freehaven/tor/control/TorControlConnection.java -index 9524612..38b1879 100644 +index 9524612..c0f2070 100644 --- a/net/freehaven/tor/control/TorControlConnection.java +++ b/net/freehaven/tor/control/TorControlConnection.java -@@ -740,7 +740,7 @@ public class TorControlConnection implements TorControlCommands { +@@ -736,11 +736,111 @@ public class TorControlConnection implements TorControlCommands { + sendAndWaitForResponse("TAKEOWNERSHIP\r\n", null); + } + ++ /** ++ * Tells Tor to generate and set up a new onion service using the best ++ * supported algorithm. ++ *

++ * ADD_ONION was added in Tor 0.2.7.1-alpha. ++ */ ++ public Map addOnion(Map portLines) ++ throws IOException { ++ return addOnion("NEW:BEST", portLines, null); ++ } ++ ++ /** ++ * Tells Tor to generate and set up a new onion service using the best ++ * supported algorithm. ++ *

++ * ADD_ONION was added in Tor 0.2.7.1-alpha. ++ */ ++ public Map addOnion(Map portLines, ++ boolean ephemeral, boolean detach) ++ throws IOException { ++ return addOnion("NEW:BEST", portLines, ephemeral, detach); ++ } ++ ++ /** ++ * Tells Tor to set up an onion service using the provided private key. ++ *

++ * ADD_ONION was added in Tor 0.2.7.1-alpha. ++ */ ++ public Map addOnion(String privKey, ++ Map portLines) ++ throws IOException { ++ return addOnion(privKey, portLines, null); ++ } ++ ++ /** ++ * Tells Tor to set up an onion service using the provided private key. ++ *

++ * ADD_ONION was added in Tor 0.2.7.1-alpha. ++ */ ++ public Map addOnion(String privKey, ++ Map portLines, ++ boolean ephemeral, boolean detach) ++ throws IOException { ++ List flags = new ArrayList(); ++ if (ephemeral) ++ flags.add("DiscardPK"); ++ if (detach) ++ flags.add("Detach"); ++ return addOnion(privKey, portLines, flags); ++ } ++ ++ /** ++ * Tells Tor to set up an onion service. ++ *

++ * ADD_ONION was added in Tor 0.2.7.1-alpha. ++ */ ++ public Map addOnion(String privKey, ++ Map portLines, ++ List flags) ++ throws IOException { ++ if (privKey.indexOf(':') < 0) ++ throw new IllegalArgumentException("Invalid privKey"); ++ if (portLines == null || portLines.size() < 1) ++ throw new IllegalArgumentException("Must provide at least one port line"); ++ StringBuilder b = new StringBuilder(); ++ b.append("ADD_ONION ").append(privKey); ++ if (flags != null && flags.size() > 0) { ++ b.append(" Flags="); ++ String separator = ""; ++ for (String flag : flags) { ++ b.append(separator).append(flag); ++ separator = ","; ++ } ++ } ++ for (Map.Entry portLine : portLines.entrySet()) { ++ int virtPort = portLine.getKey(); ++ String target = portLine.getValue(); ++ b.append(" Port=").append(virtPort); ++ if (target != null && target.length() > 0) ++ b.append(",").append(target); ++ } ++ b.append("\r\n"); ++ List lst = sendAndWaitForResponse(b.toString(), null); ++ Map ret = new HashMap(); ++ ret.put(HS_ADDRESS, (lst.get(0)).msg.split("=", 2)[1]); ++ if (lst.size() > 2) ++ ret.put(HS_PRIVKEY, (lst.get(1)).msg.split("=", 2)[1]); ++ return ret; ++ } ++ ++ /** ++ * Tells Tor to take down an onion service previously set up with ++ * addOnion(). The hostname excludes the .onion extension. ++ *

++ * DEL_ONION was added in Tor 0.2.7.1-alpha. ++ */ ++ public void delOnion(String hostname) throws IOException { ++ sendAndWaitForResponse("DEL_ONION " + hostname + "\r\n", null); ++ } ++ + /** Tells Tor to forget any cached client state relating to the hidden * service with the given hostname (excluding the .onion extension). */ public void forgetHiddenService(String hostname) throws IOException { From 27b4d0ef1f9c04ffea741dc5027fc6c20c0268a0 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 6 May 2016 12:02:34 +0100 Subject: [PATCH 2/3] Updated jtorctl binary with new patch. --- briar-android/libs/jtorctl-briar.jar | Bin 20193 -> 21074 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/briar-android/libs/jtorctl-briar.jar b/briar-android/libs/jtorctl-briar.jar index 134f85dbcb386b866b1cb9023a9f1fa29e308f84..a299bcdb39e4ec965dd35fc56263dabecce069ad 100644 GIT binary patch delta 9848 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 Bj#~f# delta 8954 zcmZX4WmFtp(=G1q!GpU6hr!*Q1lK_WAy^19zzpv0?oMzB79eX586JTE1_cELh9nj&ABQD`@b{{$ENn>1VtYqS z&#+g>BDhCPxJ^u-43p$=`SIc-ER2RSGKw4vIA0nD21e%h_zg50KH(?R}fcj=Q z48(uX0CEr9KPU>#;6HDV(6j%8qA(r)K?zS-GN7V&sGoFZ2*viS8P2RPQOvml%rU+7 zBy_rK=VLJ#QV|m*P}X_qqz?aL9GrC0BPvV_!#!<2}mT_c*4=hGK(+dVHbD1a5i#NtEIm@d*+3f`=g z;n}GjP4*hTOF`W|Yb+N0bcUSQ^#)l-7}X%piLhm}^N+7Ri@!x72@DMZy((i9WO)pk z>xr`Tg=}$~hc9Mm4oS1-giEDvk9X@KY4x&wu2v^TSpeahH!VLTXWDr)mKHL89JNYQ zX1&YZdUGe5B|x%F?@UI~kVz&Z+%@rYxDnRNjjVm>nh3-at;@XWI&*^zix$d;UT^8roNTyEbgmoT8qMhYeb27IzM?Oj5 zz$Z*EBlZ{vNQ#4Oo%8UP@CJ+HdGq$p5)H6Qw3_%`m*u&dxgzsUuw!SO^YCuQLdBJ5 zy&dvd{6N)$PsX{=*GLoaS!{>r@D_*z>}~y&{mt{pCk9--yK?FO?v(HDk>=4CY0deZ z68!V<2_E@mo2GR;%>LmBBP*4gVB%(@1(z72V-^^}O;% zvZi^ee&HyG5DUSkQI;fqh8)G9-Td5psi)H)WWRlj7$LcGdgb{Ok|rn5^axj@@;^z=DMO+moTF6ObJ$3)~%16Qt^?L6p3TJ9bJ0@N&zcsj}g+-}(ioI{LUT z@7Uw4Ejt=1VyK-YVFWA&66`-fUAf3uHe707>5<*MO%I;0Lus1W`x!*MWn^v@QaeRp zyR?qU$z(8ORe{maOWpfD`vyQZ=LP zs-zG5?SuME>oMsp!EM9)(kr(L5kjn->3e1grwGT7A&a6bCM5LZ`LjD0o})eNVj$!( zTHBsy^9NNx0GD8Pw$mI`IW!Wcpi~_;%}&Q$6ONoUP;#6f@m-%naq%^kIG>KCTERp* z)#bwy>(dF`dQpH`0Z3pP6CfSjYG)-_tdso6q&LSx{1O&kCq8p;SG;aRb0dT}5)EVe znr!TCs@@liHeF%yg37r}kMTVV>0ImJ_6?Sc5-f#RdvxEktZWWT5D2i5<761ESzgtN zvof@a0$!TNY^i^+8fAsbvl>uONjSgHT5ZCFM!gF9xEP(nZwt~yCXRIjOhx9U5!hsf z83cjLzTY!Ppod7Y=d0;&LWd>v^<_>D4c|RD+m*`Oe*0;GcR&GMn6~tGCf`$Wm!9_! zJs-60#1b%RV(uoQRIV+kx%DFz5=T~kr#b!lJeo~qN19iV*8L{6jUNEmP>a26^rDkl zM4w}ev!+GhpaFdz$51plg+q|e0&LuN6Nx{eBMW?PV_jS_XGyxY!H`sidy@s~-@cCw zCl#hkLyLy{G%TV$X9Ib(*&f85d%HXnOyGl`Lc^iCWlA-1zc(1WT4i1su4GzUH9$<{ z9UR9aLdzY_Tq1%am5Sbo=(}RhZHR?NX^Qg@eLCoLga(4NLz|y?9hoIk?G2C9-5&Ln z=d+QMd$KWCgV~u-rL#JnB;0(dQIacsPfkog2?8w(a|}D+k}AyfRAKL1^5VvUi1dRV zuXY24N?>@j=9XYO9N-)OnO4p;d$rp&a9A>dGEd(9C1|K?+eY<;@YiDD0Ln}-tLl6F zGK1Ox5U7`z!8i+F@pau+v(z5r<)^vAXE&G!Wm8D{wEXkOP0!MSN!@OSXMaBuYX#p3 zrY@n{Z%04hr(pD9weG_wPeYf}m#{xmneNqoX!xLom`{2F|^7k#NK32nx zYcHeyh6HWY(cZ~Te>%+|`Lly-7{B2ySK_N2ces05UHZ7B72y_MlP&4jNJS{u5HciY-s`13$qp{kf) zj;z9AE1n!f$iAF~lDd>s^?iG0RyS1{LB2q1MqX7Bb;DqxDQ^BM)qc$6z}G5H2497c zFBjMQ{dUqUdOGCsovSOyCI{8dPH-R+7Cl~lO9Sn9&|?m+#xR2b$Xyeg4J#gg9H|vvH@(73nKC zx^Ojwd_NF-BwSr(t=$pWKT&Dcwda++tDSgT-`<+1`IcmLzq;JcO`m_jBP|Kkh^gvy zL^xKX3QyliRFbKyQST=E9L^xnHn8!7(58jV;BX~Mb%t*w2&m^iH5n}TAvEiaIE6yI zQJ(pVmr2>Za)_MemYf?IlfcLLj1x!@icf)m*eyi>dmMu}V{4?$8jfk{H=!67mSXIx zoq(};jkLtAO>64uluK!ZI}JXNI$I;d^)_>t;5t_mL$SHt`lfe+U#P<230@hU2k(Jj z2Z`5o4e{YzxSDz?2hMf56}gu2qW#;|7(7+>A!jx_R$+OjW7J@2_RbG`+wbS8+ zTaXq3{snwd>g4Og-p!lo*Sf0*Uw1LoMKH`v*Jkhoi{091KKHRs)&)N=bXz<%li8T3 z7emj#FEfcBcu#lGbP)v~f&ysX_SOVjk-sBWsvx?Bc;~X%2+IN;G2BCapH5b*Fpp@H zgNo{V0|+JbYA0z$)kK?EITwhM)y7fWJ@5NoX}D6%_+XXEj_;ob$JBYMpctaKvt^dC zPdf0vqe*+c2O|X}`3~PXbDG z4TLOG9)#3p71YTB1#zfohjr3n`+?51d;DSc@^rAM%INV@HH!(Tw3!=08KkL|*KRld zGIAxJ72O|x#5ZK8=7Ib?vvZJ+>?U%?8m6XN6%8Hv>Cj~CEsRXxNXmgus;#O}9xhr^J)=o^ z(iiLNg!i08soC9Ad187AihS2}K>kX7Ryg$yW&|}l5e1wbLJ)RrM`K|Q53+(Y`w3$~ zPMsDi-vnxd5yh`C_b0g6#4Sd`p9uvmZdBGOqDs4J!^|9BkWpXW%9LPm9dn}VdHDVL ztl#j8Jnb!udC(m~X;3L{VLDSpI&+HN#9RA-(h6Iw#!2-HcRD-p+tG;wyR2;JfsM?< zI+C%h48ADk0O)q}cG1Vv5CJ4X11LVF6UcZW^Yw`x}WDg<&wr zmlum_;3pK4#oPbDbTk$>JFq(cs!Da)c+e|SDhoJ2n38#rRfI?>_*-xewP0%Jjw*?CCleQbn zi?yYV6^Piv*Ul6XB*{OR56>Q?gp_HN*f2)33Ccu6QD>sM*MAl|NJz2Ll0nrW-@CCN*zqOL|xLmUR2 zi^nCG9|6N-j4LAV@?5{E4IdXNY8C>M79^Thi!7IVj6#^|JU_&sdnP5@Bx6kE>!tj# z_O!m8+7uJ6vNm%1RxMdYSG`BAqUwfA&;UQ*MiBm$oYIXxs-&j3vAQ^|TZ7LSJ?4d> z0pv%)cFz7l<4Yz|Gca~Gq1%98Pj*1m7Iq3ZMwxfk!_eG)Qe9sNXxg#F_V`e>+kFe#|O!i+!4@r~^ zbg~bIef$rzFl#q4dA|}WCWLYk#(-2~%KF5kS(Zo5* zlPShP zLRqi^3UstP0tFf#;xsCsF@Gk_jqPN#mrY4^b$nm(#u-k?v+gZg zrN<$6kDnDJfBf3MyWqGNZff0jJf=G=GF!{)D&EM_W$$so)nktdnQgg_yyI;;lo2%e z0Ke064ev%Y9J)04A$x`O>~=pH-Ypt)FbhI9rYkT?HH?{du|-KXpdgqyxM<% zn%8v+xW*D!IJ?lkh80)+rL_*hjq0_6e?dBkx267;fh7!;xU8E-syVtwdclH=mR{Hq z+~qKIBqmx%j!-w?y6D>gf9Q&wN2PHI3Wa|{96M*|ur8VzdK>qdxgOMFMMYSsrzyWq zNmcReZ1@=Qg~s%w2Bmv*^8AC{6m(B8Avi!9s;3GwZQHn_+83^X zVv9xQuBtIkC0Z~ZD!+syNZ011FT`VbxO(Mn*MxTJj<+O#4Mh}SlCkvIpw-bd4F;I9 z$!d5eE-6uYF5tL&f?wEl$ZuK-C?)H~`d3vFN%~xKza|WBYlFHsMOoJGbq05MBZw!; z+EdH#c*{4?48G}xKWl1Cn=@-?lewm%;Q%Ud0OBf2b{OX%Gt}ng@;0Ta@}kbsVeI&d zOw*nM-gqjki4;D2W;wJrCMTnk%pGg1^H;oC4rP!dt#J5(^>%=pBl{RQ{X4Yi|jnF#u62m9wpZw$$ zc$kjsuRqb+9^by4uahiIIt<@JN`8QY5tpv{Qbl(kLqD{1hr~8n6uZtNCt7==OL(+X z`c}4_6%WBa60MG6FDOeUiUXL^C2q4AWXmFAN$Vtgk4npYSUBJYHW>S)bF% z^3^|4tL%=rDKxTZS>9CH|I&yVvVe^&$v098^ukx&q5gm;#eh0xA=6;pp4R5Y8uW?m z{oY9fcw8TCkTGKmWhWml5Gi^>rSH`X6(MC&=r4ESzJ@~g3t@paD~Kn z&-0|MK^+jAte7c68b`27ibOF*?19$cHK9Rwie&M~&<}kLc+;|N617(@LRhcqityK^ zA;Y0Cu3uNtnZWqxD(~``*gb}1ej84#KI5d!w=0X1T(Sw@-}n*iXxqT z#H^lGU0 zUq66Um1}J1_Gbt+fhu2dvpW6A{blQhrExCILqEj=uL^8WC=1a1L@8fcRH`fN;FJYj z$k$ugB_&N3%PAip74EL7uPNEi9EER*(&Zl^k`8cA68JH5`{gHvG343Br*HuYMY^)2 zsN>B|5k*avg&iYaCnC!x3@m#I#H0Busld>+X_>x=!4?<eBhZ}y5RPwpkv zz$;cbw*-ayP4onwt}#G7w12vKxKyF_MwExarEo(5PZ&P}7nw7nf#5n9Zqsv8@QxTX z8T6cobRRO==bxo9k7;Mo-ER3E#%-&t8szUZibDmWfesMU0^|9E$rs;}7DN@;Eq+Qb zQ_Tfd`5QDSx;62?a(^ONEL1I0Zm@H!;?HuL22Q{m;NCcVSIXMj@r+ANXkq^al~n2z%iWxsLqw(j79;cfk48~q{Gtj^!#iG+4Ar2;um+_JX@`b{$wYYN z7(8k+xYSZyT8`Q=JhKZI^wMn}+49m11X7$^;Ed+?geaD>2CsD|u_W7)N%AUD)DR(V z^6UsrKLj!j!6zqDax89YN@TOW!k5Ge5@jBNA#9nFvPP82VN9>q9mVU9Jjphon@N7arYC$^(*uHw0zIwYR4~`#GqB?n11=a>+RWpmQGMqt;Hw~&s zx#$gQZBimJ)lhzzSh52rc8SLZr^TB0T5^?i0Pc^BftM(RieUFthVCuwDK1fDb2mc7 zPc6bUB9e3zZmtvha%^Y)wh=O*nSzlJ*Xr0Q~u$ZChblSzjzl{%Ua>7VUH35 z`QDu>=mcqRBB5mx>PUV^8$#e+5Q~6q3KZicyf8wpkJR6Gk|omEZRvtT>4ylDwT*2v z1Jt9Rmv%@yY-iZ%yS^5nK4|ma;d$EJ)#AV+jYwd{s>(#N_r~@kTQ-D(A9%1>&Hi)wS zt?#dTmGqwDeaU4q!;#QR^X$F^R%2!tPlEuHfY&dXZl6@xwm55F5^O9~a=o>*{0!oq zClOAn1c!{k1DApoiaE9#anljXdS|rJy)@cigs`FoOj_3v+H$r-kjN121Xe;^aQguY z{e&bxhhs*3XxHM?Za{zPA=nl)HUT6sFzWpOyB?Cz4`4~?R;Q~sXElb!{ZknET{8La zL7za)N>P8zc8Kt|K9aD=Ed%-qqSeRE0W3`pCcpPO8Tp2u8Qao)?;{Lz<{Vz{>2*&G zj$h=!ieJ+{sC#j21Q){4sohW=8o{!GhdH0j$g#N2xN`+33ej}1tfL% zrpFZLCH!0f(nb3O2D$%A3jytHtdSD1M9lC_HIX$Tr5Aj&Ey8!BkILQ{5@I=Op zO)AG6v8uG=>Y3+WQR+>%Jd}|7@v{upLzZC6x?q){7>ue|yjy42ij^R3hd0UKWi-0?x1HN&Ybnu;*fHS!}nSPGh#^>L1PjVx?2jbbzwg3wj>4pEUxP#nGYmKc*4# zrQ#?WZKdlqYSpv;NLK*rfa4YV-J^yBw-$@P3_hhI312B=4pgP9eXnM3#mu1J3bPvH z-z7d!LNC_j3o1-BqD$fuh_hV+HUcvUo2ew{%#3tuS3iu30n+H`Y?+~Dg^|f$Y$rw3 zObo>jPCma`0-4kbZONF6%!{fe=MOqK?zRLk(a8deH(}5gYRgvjl%fZ=E6sKF?R7l^ z0{bGZtFM)7Ynt~*Yjl4s?1}rX?fn>$Zj8`L-*?_J*`g)FNn zEODcWEG3PNMH4%^ac;dT@X(W21?LsoAbY*Hk5zA?_f1z9C%pBf^<6a$a~!4`OeChZ z&Nu~Ne!R$Hs(DF{0Q6hx&ac@uZ1Ge?^2fA)1KBRuMMQ)icjmV+OV%BGY-TN*Dz#4+ z8tXu`&kZ<^cjQ}ZWj?Nk0XbHgNXb);&2?&K$r`9Ghmi8VGLl(xb!u>|V1X~xNOH@G zHsrAUpNYto@5S<3^9ogxO_VqB@9fy*p7n zL0sHWjJA>|y+@g)HKs@NdDODtM(WGn?j^Ob10c>r)fjN1GoZoa$!TusdIY-4oP)oF zPIKl~{@GlvaRybbLBKnYxKTv%{xe7&d}aTwx_L#<`s)*gT75RR=~{%(!KrXYhu!1XBcuA3&xLE@ z`;0woI{Suaf-2I4Di2XS16|T)+2?@}2Z$-dMhbql@~603`VFKFdepAKT6XggP%Y~Q z!-h3#4Nj+APX)x3dBXv=;7_U_9B%kiZ(8aj?)^*)*3J_a;nij^e`w}%GPQoOKj^fDO-wC%y#w{ z0ABheK!nBxlvA&KB7TErrBu+`V{zZv5?%J=;fYeFCzH!+SzqhBuqzJwF?PJ&hh-M? z>hbrAl+CPO?S?~J042&Z-OCo*iz~73r_bRl$aJGOFS(FbPH{T()2|{yrUoJB=65L1 z&rAW2W*Sc;A6yUCdvmL>_K`DZBz?QzQA{Fd&18ygSMJ_q)`x#yea8;kaVvaNL%c8J zn>rRKCbd^wD-cKY+>#CE_^n%o)~y^Ct4|c7(tE1KL6+|LGcN6v6xt>IZ24 zlPT-Tq>R!2wkss~s0d*G>09`3PeMYs3Ln)Ui5Eaeb|@?ij3zt`4A*~i?jO+eC-25R z60vD0!@?23{L=*Shl1He$ku=W19N~31Hm|2nEr zqxgqB`iG49_gOP09_#;(_2za3%z4p{78HWQ4$g(d#K zWuR`P%lQ6#WfVEljTo(P7Y?|+BG z_}hcXzev-33Fbn8c+LO2ZknWU{DQxAxD$*u>Ha$W+>h*e@OwY6es9pfry?($kf*8g d&zfEQCT5ELzNb%6lR`@n)xtq~RQTiR{{Upio@f97 From 84cdbb877d4514cdc69a575f212cc0ada7264326 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 29 Apr 2016 12:13:59 +0000 Subject: [PATCH 3/3] Use control port to create and set up the Tor hidden service --- .../briarproject/plugins/tor/TorPlugin.java | 87 +++++++++---------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java index b0c651fb6..e7852bff6 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java @@ -47,6 +47,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Scanner; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -63,20 +64,21 @@ import static android.os.PowerManager.PARTIAL_WAKE_LOCK; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; +import static net.freehaven.tor.control.TorControlCommands.HS_ADDRESS; +import static net.freehaven.tor.control.TorControlCommands.HS_PRIVKEY; class TorPlugin implements DuplexPlugin, EventHandler, EventListener { static final TransportId ID = new TransportId("tor"); + private static final String PROP_ONION = "onion"; private static final String[] EVENTS = { "CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR" }; private static final String OWNER = "__OwningControllerProcess"; private static final int SOCKS_PORT = 59050, CONTROL_PORT = 59051; private static final int COOKIE_TIMEOUT = 3000; // Milliseconds - private static final int HOSTNAME_TIMEOUT = 30 * 1000; // Milliseconds - private static final Pattern ONION = - Pattern.compile("[a-z2-7]{16}\\.onion"); + private static final Pattern ONION = Pattern.compile("[a-z2-7]{16}"); private static final int MIN_DESCRIPTORS_PUBLISHED = 3; private static final Logger LOG = Logger.getLogger(TorPlugin.class.getName()); @@ -90,8 +92,8 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { private final String architecture; private final int maxLatency, maxIdleTime, pollingInterval, socketTimeout; private final ConnectionStatus connectionStatus; - private final File torDirectory, torFile, geoIpFile, configFile, doneFile; - private final File cookieFile, hostnameFile; + private final File torDirectory, torFile, geoIpFile, configFile; + private final File doneFile, cookieFile; private final PowerManager.WakeLock wakeLock; private volatile boolean running = false; @@ -124,7 +126,6 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { configFile = new File(torDirectory, "torrc"); doneFile = new File(torDirectory, "done"); cookieFile = new File(torDirectory, ".tor/control_auth_cookie"); - hostnameFile = new File(torDirectory, "hs/hostname"); Object o = appContext.getSystemService(POWER_SERVICE); PowerManager pm = (PowerManager) o; wakeLock = pm.newWakeLock(PARTIAL_WAKE_LOCK, "TorPlugin"); @@ -421,47 +422,39 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { private void publishHiddenService(String port) { if (!running) return; - if (!hostnameFile.exists()) { - LOG.info("Creating hidden service"); - try { - // Watch for the hostname file being created/updated - File serviceDirectory = hostnameFile.getParentFile(); - serviceDirectory.mkdirs(); - hostnameFile.createNewFile(); - CountDownLatch latch = new CountDownLatch(1); - FileObserver obs = new WriteObserver(hostnameFile, latch); - obs.startWatching(); - // Use the control connection to update the Tor config - List config = Arrays.asList( - "HiddenServiceDir " + - serviceDirectory.getAbsolutePath(), - "HiddenServicePort 80 127.0.0.1:" + port); - controlConnection.setConf(config); - controlConnection.saveConf(); - // Wait for the hostname file to be created/updated - if (!latch.await(HOSTNAME_TIMEOUT, MILLISECONDS)) { - LOG.warning("Hidden service not created"); - if (LOG.isLoggable(INFO)) listFiles(torDirectory); - return; - } - if (!running) return; - } catch (IOException e) { - if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); - } catch (InterruptedException e) { - LOG.warning("Interrupted while creating hidden service"); - Thread.currentThread().interrupt(); - return; - } - } - // Publish the hidden service's onion hostname in transport properties + LOG.info("Creating hidden service"); + String privKey = callback.getSettings().get(HS_PRIVKEY); + Map portLines = + Collections.singletonMap(80, "127.0.0.1:" + port); + Map response; try { - String hostname = new String(read(hostnameFile), "UTF-8").trim(); - if (LOG.isLoggable(INFO)) LOG.info("Hidden service " + hostname); - TransportProperties p = new TransportProperties(); - p.put("onion", hostname); - callback.mergeLocalProperties(p); + // Use the control connection to set up the hidden service + if (privKey == null) + response = controlConnection.addOnion(portLines); + else response = controlConnection.addOnion(privKey, portLines); } catch (IOException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); + return; + } + if (!response.containsKey(HS_ADDRESS)) { + LOG.warning("Tor did not return a hidden service address"); + return; + } + if (privKey == null && !response.containsKey(HS_PRIVKEY)) { + LOG.warning("Tor did not return a private key"); + return; + } + // Publish the hidden service's onion hostname in transport properties + String hostname = response.get(HS_ADDRESS); + if (LOG.isLoggable(INFO)) LOG.info("Hidden service " + hostname); + TransportProperties p = new TransportProperties(); + p.put(PROP_ONION, hostname); + callback.mergeLocalProperties(p); + if (privKey == null) { + // Save the hidden service's private key for next time + Settings s = new Settings(); + s.put(HS_PRIVKEY, response.get(HS_PRIVKEY)); + callback.mergeSettings(s); } } @@ -551,7 +544,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { if (!isRunning()) return null; TransportProperties p = callback.getRemoteProperties().get(c); if (p == null) return null; - String onion = p.get("onion"); + String onion = p.get(PROP_ONION); if (StringUtils.isNullOrEmpty(onion)) return null; if (!ONION.matcher(onion).matches()) { if (LOG.isLoggable(INFO)) LOG.info("Invalid hostname: " + onion); @@ -559,10 +552,10 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener { } try { if (LOG.isLoggable(INFO)) LOG.info("Connecting to " + onion); - controlConnection.forgetHiddenService(onion.substring(0, 16)); + controlConnection.forgetHiddenService(onion); Socks5Proxy proxy = new Socks5Proxy("127.0.0.1", SOCKS_PORT); proxy.resolveAddrLocally(false); - Socket s = new SocksSocket(proxy, onion, 80); + Socket s = new SocksSocket(proxy, onion + ".onion", 80); s.setSoTimeout(socketTimeout); if (LOG.isLoggable(INFO)) LOG.info("Connected to " + onion); return new TorTransportConnection(this, s);