From 586a0c468f80ef3a7ef8e651af8bc52607e0a424 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 14 May 2014 18:10:41 +0100 Subject: [PATCH] Fixed logging of Tor circuit paths, added more Tor logging. --- briar-android/libs/jtorctl-briar.jar | Bin 16143 -> 16298 bytes .../briarproject/plugins/tor/TorPlugin.java | 24 +++- jtorctl.patch | 134 +++++++++++------- 3 files changed, 100 insertions(+), 58 deletions(-) diff --git a/briar-android/libs/jtorctl-briar.jar b/briar-android/libs/jtorctl-briar.jar index a3bd4a68828e317ee79279e334f42b28e76efaff..1f90213fca321569b1bb89cb8b566c2dcc24be2f 100644 GIT binary patch delta 8859 zcmZ9S1yEc|w61Y?cZc9QKycTAKyZg(K@xOu86-G^ySuwPfuMuCLx3OyfdGL7=OyP> z-FMFIUA0$L*ZR75t-qyquZ|C_0%K_c5s`@C(EdC`iHTTZ2!Gxx5eS5djq}q;e@t@` zasm7wn=Fqi3C`7=dV|1+m&ec$5=3{xh-UUdoFbAml`Q14Va^X02OOVIYQv0rl|K=R z`&Ev71Hw8W_|`AeU+U)+$ZRLi9PTR-4&o~A*C6R!%qi`6auXjM(6G9S*^GI!c*z%L z9q9MBHPjpwWR(V2J^a5M_U`*3q-qY$+c+>?T<6a|dx1yqMhd8aX36H|wl#`E#sNRS z<5JcN7^cjVszP;jj`ZL5HA>p@8%2-3Imc2&Qr+5}{fQkl0R))Dbn31vv~_2r{%V_M z$@ZiFfn{rl6|;5VSh+Z+%Q;+}Z-A{^C4wWr*Rs5XP}=J$#$2J{PZZ1;l_qI7gznDZ zajIEYvZT*mcVRBjxD{-qcRG7} zeI~m3IBVP|YQv+w{zDUpipJyYD;RH-0Z=xd-qpmk`}rcB^z>P2en zeByLL0Pg#MElN^@!{;pcQFg}!En5g98>|FFY$K! zVso)%!*s54zPUB^OvPW~XEtBHDDF@69=Ec ze(oBsh9GU5^b~kQj(Cej6cMYjCz0H%p3%O+)1o2p`d}vvXM|(nID!0BaAvF~<>)^#@AG046%q|vPQ{Q-XriBGM1E2IA*R=8^tjd&>k4~c6XNPq z)P05WS5T9dN%Go1f-)ohSJ38ajJ|&+k0Y)G>fcFJMS}IuB0}##!a*^0 z$^^I1YsCY9NV%vTC#kY~4PXI~cV1wdS9qm{s&1VQ2%9IeH{o)FVJNKGBpnZgrx+h9_;tL66 zCi&SP!ZUj-3*ni+t)>90A9AN1p0b1G0L{7wK&qCgezvL7c@q`_b8dhk0KPTeInyR+9Uc1RNCkeQc*e>&@tAH`1X2SCK_%*V{?j1|W9ZWj58YfhT= z_0(p-fTc@2YKZC9+p=P{>0nJCo8RlL&kg0Cj%9l;(k)xDaGb^bLa35 zvlbI~ePxWs!~h9ONbs@cEO8cxd``ILgfAE*Ge@r0R;9^-#c%W-c6M&Ek1Kq?46*=^ z;2$9rPqR~5^Y}VNT0Tr8U#e)^IqI#_h$&mZq;!v(RCk!HG)jh74kFHfau(s3H`G#1 zA`A#wWd_K3v0^0JmiS45Ff<7d$arnCG!0VV+M-=n+lLXX%mwnbSW7F|>gwuln#1Ihw!NO=-v)!Af;@C$@2XI9J`nWyvlSVF%ICb|fCz*L!PF+9Ma3{m0j z)KYMIc=tGF9kEp6ItisZ<+cD}qKR0DO@v(B2NJuVU*E;R&kye62!R}55_5h6BU6Y& zsfrF)2X#c`Lj|J|*Y+MO};)+<$W#8-ZIA|b%w<$y{@X8$9uEnEnB z*M#o-wTEs?+n~;fprkvJ13?Cu@2;;PO)*ZX?2-PMhCy+Zbm*QmWsI+)PDYCIZHs!J z=Mb$!h@+gE$n(@&6GYu$7oZm%ds?hw0N0tVoh8K*aWq|*g3(}bT?N?(qN@~XGH6`w zm=g?5;jyv&(%zcCpn!5>Z==MxU3K|DKH&7pBRgS3VI9%*bz^-ga(OP;bMyO}+9)kI zOBv=e%4;jmxcmUBg*Bx~hL2rZ05yVrJ2a07<3}JuQbx!8Wj6CCQ3(|d*fmRUpC z$QlmQyy^v-69~F>kHAOp5}DBtT$Jf#zi8^FxeZaNX^rDYCaJJWL(!MWd_~1%hkfX| zbi{}0nTvRj=cvZlN=NT)8j}#;#4iwbq?7PWuiT0FnjPeyJc>)iR~m}o3=#Kagymsc z&m4IK27}9f&fJj>UZkU0*`Ismf`>I=kB%t&SBV*Y?|{4~8{g5v5y5v6|| zbX`F17-B$iejW|JC)B=gw9k<_Xa@ymzf@f1gPxl$_NfE)kAB|Pmp_4|k8p46MPJlitgEXk>$UFWa;5hAPahlU_GuqA7BwsBhI(6iEKA!R zD$9)yz_7=toJ63#7p(hms`4p3>j&z8wKz>ewD6d2}emo9qYBT?)WTm zw&m!}@~pv+%8I2_wLoMIj~iVNv--Mju%WV$emLgKH7k}nzIMMyz6O|=rymPSC7yY{f+FH&ZUgcfs7Y7O$@ zVe8Sv#7j$f1v2Ft$J(EjMMj9EzZY}dh4h79vvJGKWI|}1Tj`u_)UEoyFRU88ZCyk{ z%o|Oqsc^I-(q37qv8$<0&sALUt8zS%(1l#;`Yv5{p~T-rYL?N3SRbr#8p2H1zE+~> z?}MMdau-u_r1_j=_2k`$mkM%xI;vr8_Dj-UtTjAJf9wZYi;IfA^`v{q2>7I#jo7IT z^<|wMliSlbkj2i?>JKFY64r~cm7}b%q~55c>M^7b5ioAG2Q|v|A(OGGbn|FYVmv^A zJeDcy)fNSG{I9H3`wU8^ny3;hc&H!%WN^{h7k_@Zd^K}@Qi6to`@@UzY>&{8ZW8R_ zeR48`jn!@@R_W$(TE2_H+mPTV(Z>NH!zio8uZ^W!q;+t?wGCwz(e`fdmfi`clD!Lj ztBr`S@m`-OuZ+Ua6REW9*o?686NR~fcCsFqPZ;b-;EA#;fI5*#H}e9Z<1rseunoRW zbqKE~7R~c2S=(t5IrPeHrQX6nRzprd=u-xfkvH;F@=`x0?QyDUe}$;#1#1n|G!6OHvZbr)a4|l5P#J=2HV! zB`0_+0K^W$@+vR%#m6-u(J}RLD#pDG{N#=6!RGl@--_GLt$}GxM~jcrlEADIWVzFm zLXe2c3iGtHzpexy_UCY7Mni>SLS#OJX|lC)rm=ZTJv(d?i!`d>iBcmm7`QlrhHvmg zY`xR15$~_pEFxb%5WWTM|8!O7U0SpBM3Q%3mOfVxUbcIHM*63CE^THnQxwe-cC( z&ew~7V{Py?g<1uRJMvx`L;)T$9AOH>R%8AGHAqHpH#$`6Smu5GWo7P6gZ&;Q7ai@x zZ|5`vkeAD=j`-3+YUS7N4go z#9@-2TEU!ct$(iA0^qy2aQr^xm(n$0St7KY0s1+TwY;Mwo&TcwCJ`J!I=-VMrFhC~ zww&;$d`^S6>D{&!uQy38Z-$&_109rureN|gNm2_{*^&FKxJJ^ggx^SJ{}>edC=%0y z%o+B0yC(_d_Q|>a2&n4#1_$$FEsszPt>jiy+HLFr#q%X@Y${p(N^noOo72R6i)bLI zB~)8-xhRheVu@Q<8wJm?SD-Lw`&j5TK*N`Cab{N!3644>q19YxrI#DW1R%m5o9SZT z@m2^6)~x&ofC|m4^xYMp_Qln)nW!zLdW#vf$35q!>D3!6wIkz&;cokr1%N^q*+hs; zS}%xmJ9cEDB~R{Xd{%_oDp@&wS_IJ%WyVOQ({5%!q(8(x7Yrn{6Ff+cKb)s9Lh=ww z%3rtV3afx{j~*Lg%wo61IThc4ggxLCbJ5dsSZ_YrL>pV6&8fvi!gAJ>!X^Yr)Va?~ zi@NPp_&#x&i62Pz2 zbvi#vd;@KujxBs|`aPc{DeBQbv8(~iY?$2E0CzC7&smb^j=Zkf$b~^S)hBW$-a)b} zErJ~O6E0+Fd<;qDhN7P&B52&#JogGx!#D5)a}{?KDD5#5K2Vg>*h-JdkOiPAuBmXZ zBbNtcY+j?WdNFpK)AJPhA`*3A@C9I7`jQsiDGpt5MIIe77MY{KeDNl{7_<66Dd$yP zgGn#_q5`eLJ7dSuCeVmf8Fk$61*|uaTbEYSvW|4$utBI-jKhC^W6%?vY(H2_Is3d< zsBgo~i2GW+Fr8w{(`T}IO%HQZz|`|d6|tqhfy13AcURBUK}wKsYUQeBQp~;w80I^p z^SNiO6KWvhz>|C6xq9^eMl%@LI=aIk3(jdy@7we2pz?#6v@^N~F2mJ^R|TAZ@2R=- z&C4sNzwTHRmr&fFc0KsU-Bi*WR@UjJCbCs*BEpBS)ZJuSY*PGSuZ|-4aS7k|-gM2c zayXZ(OBrvb)OIKWN8eMbbshe=@^#@(!o$!iI<8!~?MV1j%Q6aLFZz{GXwUbb zjz9WFJS)>K6Gnl~Bbp;aq%8d2@A!s*b0?taM zrD1R#+I&!6!^*IcX8Po9l zbhcsKi{zJ;-18RbSs+Ch3mi@gz=jH_dLASz+XzoLz*X-c)n*EA$8N`M$M6R3y8VPI zM2;Vq#^7l)`3Ej_Og6 znd?63$;Svpe|)Iu6!{Vja~po$A6&K=3&W07>TMBRV#fyLQfj|`nd{khd1p)3W#DMT z*vk9_LT3yDCyyK3n(_jnH9>xr8+s0BTr0CS{3}$1vbNmuGX_33Ql^D?Zb5x}^GxF- z6LtP9_M2D|HAPGQV4=Ia9Qxmb`B?TZA5I=1v^VP4ey*0gUl8Y;lTo4*5~n?$%K* z?g3}y$4Gql6905`%D!3lVTU$BT();#o?Jbx;yD5%@e|9pJ|Z`Blun+AO?~M@=j4d` z645^P+Sng+4{5PK`50%ZXc0B-qwL++&bwqrg{ZGY$sT>72bAG1PcZ{Gh#aS~bTSa> z>k`-P)Ba7LUT~V-#meGhC9|MMRdVd-p5jFOP1$A_$br3^()(SOl}WMn-6rf=?5R4= z^y2tFE18@T!)6ECEwa!jq49c4b^}=}-X6;6XG!rZnyiW6^9bAU3NJxD{y<8CEk0RDK01#^_U`1X2~C35r%X2ASgTCefvArXr0g&%69pK#P|expMcJLkZj&jXj<_Op*x zKnUnS8$5I|lSKByG3`yOr;@YI%eg;OO{2P?hg)jvD&arZfQi5fR5>K%DGbGX#3PpG zQ^3$p4Ovn}5o8rIDqXdQB&nE2XMrmI{G?30a);+&^TH+j+$9Ln&@032WW;Siw5M88 ztB4Ri5BVa(?VvW{xG(8=xbSB;(EyDN11Rir!Kyf=L1i4H^PDymJ}EFzIDcqXYG#WO zTZxA%zCwy+mmXVTc8XS)He0b$s$q);8!f`a3|7F?hT9O3Q|X%e+@bdMRkh%*-cw=4 zN!tLT$iV{2m4bREFbpa#3KV%4neZ}j+kY*ESy@e2ga&()t~DfuV`#6GnQ5`fvON3_ z>?GWDmx5Q%S-=LBt#Erw5Q{VN4n*XuM5XBE51W;wlGVeNiHyP#)DXl_5M9fd9Mfj* za=dDIvL_;#?|%Co!e@3=X*)K9PzKP~!%}R=i8_UL2F*Eq9#e8pB{3>!K~N36Vt1^R zvoD@f6*DbCI<~Z-HZ29sLR4RU)R(;m7c{}UU?9FpY;h5d%o%N2L|-n4s-*F$s#$H? zn{-r`@ml6LWxAzuso1_I5`Kg&|8DXbZftPZ=Tsb?az^Hmo3m+jz(IF2JyA@bRXdm; zg5V|Xyoq`ayM*+4bwIQbJKQL}ck+g^_eDjf_aypOeT3a^936nTuMT=IVyIQXIVoS1 z@17Ww+=NTMtMBCww7v7$NgksV_rsZZ@VN-2k7~~q;M(>`BcFIxT;;aCA?JC7^K>1Q$Z!GH6hH814Q<@l?wg})DD>p3vtwZ0XknRAaV1K(2Ygv%y@cOfGu zMgE&~r2~ogs6qa(rM)Cwzeq0}1$u4GIZLbQLR0JIX56_a`A&+DvM;=mTgSA){xNeu z6v1p>S6=+h&$xe2_?=eM5&TKv;FJXad%~YA#A6IrcV3Xj3)nAlJ?UC3;hH76C)bqJ zJY#ZUm#r#d(2Xw8Dt6m#@*uS&TDCjWd1RbUl#cQ}#{H_Ko6Dsrkr2Zp;5_p45aRXz zWz)nI(QY>kkuv^hP25#;BrDY8!>YH#qX1>LP#bzF2#OAgp8!03I)1C7r(iWGUR2@Tt_SwPAK8UgK`Pr$>AHA$WYDbtweeL$;+aG^UzJcxBi!M3W^Fzms6xYVT)Ze>`U zDpZ`ZoBP*Sg0v}pspzMDTqP;lyDeT5oy#1sONM&^r#l0P;Q^6r7`c$21GZ(46L!D% z0z~!!=QZTV4=OPaYO<)bQX~DAd1Xf^dC*@&KI*BNpE)d4@0GcdD?VcaSB${vPTM0G zLv`k6-RMOzwbMXBNHkJLfxDV!k#@?w!R&4L^j5Eb{TA6VdQXG%7uJV2Z|`3VA(4P| zdDC0HhtL*7)a$=$QerL+VD$d_%vfX1CEWRLU`#NJaQ5YjL{FrtV}<_#qd4MGb~n|~ zp4zy<3I4CLYlHTW9e;8+^N9aPSu;L6FnVA@Mh2exCvP4D*YWu*C;H3xK6ETJkMPf| z`$V`|$1=D9&Z0g)MFj%sU5+MpzLy`Ro1GZO&uWwNA)#g@mfEBILir&MyPy!Q}1L zEWUKpa(rEzyxBWEq;{;eyu*qgkk^hPWb_+)X&k z>$E)0tmO(6Cr2ptNWUdSFNx%MRujnR7myp=$)$(=m`d=?swPFR{)W+_?4#!NDn(3z z{JoBGfqzJkew3+Jd1EYb2kqa0)`1mo75@a3`2S`%@dPx$rW%AYL=w$UtDfD1vQG$z zdR$GWEgUigglJLr0D5~m_>h?m{zc}~4+3H_S26ynL-9kX=IW19eN|q|Mk=Sk1Do?) zv7JVLv&dfg9C}$BJ|tV+_q`&ra+^$Wo99h&wRYXAbHL&6&H%zN({z+ zY8Hpk!X8@iFZlwkarKUtt^KFt8fpyLjSX3swdfG0U357=CZA@mj;na)Bc4!gZhvB6 zKP4vf{+Lvx&1pMO@uCjH>MgC7^M|*)d$z2yt-}fKlo42Wdj9f)G%+*ETk7{2U-^#9yME|1s%y*e^^2Xps0gs*Az79e5D)BGHD&6wV=YlGw!aSD5H2D$`hVVmc&WgEw zfx;ss@RnQ?i4RIyLV2nYFp)f(Ghrzs<6a$6C)|f&oK~x``FtJYlf0OFT z)1vBhe{24omF0!|cbPy--W8=v))!;=+k&4M6~Z#cKQ${DM9Je~SpVSDqR&n{C~$B; zaNywh|4qZC;r`>iEs2p#DNgZ^bM{qXPt_kM)IS4X=s(U&B>(IDm4qM}BK|+E|9e9L z{0G=4{TG0d3==2#r-y&9Q%e5<26+AjU?!_cF#QAkdmc*u2RP^Z50KA?n>;J=KcDq) zEyVr<6$tzX;*uo$rA>9AmF!`%awQ17a a(;q02!QI{665N8j9D=*M`@uap!QD9!BuF5^EganccfU8g zYIoJl>aMO{yJxCq?P_3R5SqFYEF2yb(w~RcBNk_rk7+4^FM|GK zQ>76_fnQXoRAD&rdS%Sv5aAZg)HhZ;cmVH3KO#lPMxQGk2&SRc*09fUgBg#Kb%o9lId!PGf0)P6Ltob_V~0{_D(Nr8ou2Mfqd0ft zOi+0=d%?U=5XOKI35XUm7_RzFa|iC=$*E<0@a7HOs(1|Il2TAXK(og()wF4Z_k>DB z7qpdCHW&Jcx{mElar2m!WN)uK-6_cK1aamMo$p8)9WZKz8VAhVD9bn^(Qv-xlORk` zFH0bVS0wphdw#EM@DVD?&!cZ8LX$#onQFoFumX>f? z1WMV>+Kxiq)PI?hM6o7bq6OUPQg69Z8RsnAr12QSpX(8a?%F0y-HP}{41Ak=bY*oM zMB8NVlJ!{Iuhin#iPY6Oj`OR2MLUf)C4$Bxhb^nBpyU?UJ8F6%;ZyS@YqrpL!?FHM z`fIFln1)5}3)BcF3omkuD6M`GCdo(cRIWytw4bFihB_6I-&f0z^rMg6PP-w{e`%{y zcfd;hL)#GSf78~oi}Lk9U4SWq__rH&2+;oNh6_S@Aaa2A^0L^072Smu1m*+9fW$mj zTT(a$%K8U~3}iU@5CsZ^IxZS1E-dT8=`fiWN0UlJqXjly7pZDlV=NY$VQp7C38&>Y zwz@ihClkZ&s!hk4J2B_2+HCXSZFcvIz`ITNbA#7|4R^DGm*?cMs6#X>WrVXGWfH*V zsDZE~Fee$3RR>`pDQ_{^Ti{#tiBsNRJrteQ@vT+Q|45zxjtc;SRPjyj8~YM9K;Yul zS{7_YO>%_o=OZMS9y(V?X@#YJYR22x z2Sl*s)1J(x?X&pi)j>!}@KM?G=Q0)qn1BjE3sAf@geCp}CD#`)x8m~|i#2V3YB8s5xZ|{>~>t1lGPVdjB)S~$Fiq~&`l<>D+*i`tUaT&xueiP8J&_N4K zHCijZG(7sw^C@$y=2DQP;Q+&TwWvwWuWvLT;Jn0NmmI zrs?FGzJ-%d*-;7&w-3UfV=%lq4w1Rmn4iC@_is0CyhHK>e1|3TX4aDJ1p!+uPPiK8 zhSIiv-9`vQ(|NXVLaCfLd!DPDFV-ium*T~K^Eb@&4K400a`@f$uu)tOb$G1FmeW3c zfSg{B?jwA5u0m#JH%`vrgsh~#eu$YhSajuUC~4Z~?B;XViQ2z;eB1Ov8Ncmh#9E? z%N6jV0x}|8JEAbaaxJsEf6pDS3$IP)L?Ttjte33ZvwhYA$@nwBFRTX zb(%%_uD}Tcex2aU)OoZf?hau+SH*NJw7~J~2y`kp-@o}nJXK55{Y)9f!@K-6pcR}$ zG#1PVUJW^NHD^YJ+b~iQ=PL_x-(ZLv4TT=wC>mQa+;_lt)O~=xDKMv3MmjnuOA3+? zoF3=+g_ei4qfnhpEDLOe){xebP$Y?Q2WWj2tlC7kg%c@OjE>}EAjG9$B(=1H)bQga zz@^?(STF&+gaMKs9o+$}XUWrfO2xH`=i|{OBb3hn7}JZTNz%>?^LA|QgYV9 zDGm`$r~2c`Gd)gh!j8P+h8$@hL)&jj6AS1mHD%%4#&b$hQ}(b>Rh0_fEq?3jW?sV3 z-6Ci&6LT1N*yE~$r<7SeKavp85`r2q_t&dj?pure0kebPZDZiTY-~mP6CCk@?lW=f z6I>lnfH2n{x+L(9f>Tfx>x7;mnbo>pKM$SxI~|!24(9ULFF_S7a~W6(pHZBP%BM(h z)FLF$Gj3h%KLQqxFsZuXjbOHBllUFsj`5tKMiXks9glt^iX?+J@VJQ8=i{vwoHXl< zXiu6Y&u30MsiQ(b`KN98QkeMx$Iha`lr0y+1-vC;#>k86bWTx={*F^}zFBWXf`J3W494 z;$hR_#TB)+9HHE~YUOe6U#zN8&iAX-Be*;Ahd!K^O~?YBPo9zPPM)cQ@U*x+g5oesOB8NheKXso_zuP%kn;<92yBj?(^zzy`;RyW z8Jq?}g!6&QbJfqd`HAx_Svkp8Qlo|*-z@g?5alaEdn^@VK^PXEXsoJ;Ta)(N&9k$H&6s|5bT?U zx(DV8_R+5TJvj5X0RSf^R=k35`DTM!CV?_0PQbcZa`1O3N8i-R!oz3AH>m?4q_4mF+p_kN zedYYa_BHko!y_iMCZrOb72V~}U2XMET`*7jIg`f@&^UU5y|Zu0s}IWeGId0H?_=~{ zr?kBm^+Y~gi{*99@%&U}jD)9Le}8=nfOq zK<$SnItnZJIt$vg)Rc=ZK`MOJC=8C*T_17DvY!*G4>=S=Yp``|V1^z9U($jqz;j20 zZbIJK&K`b=qQiqS$>CZNIwRvUo6CoWN7YVYBrTJ=JZz(lT`(Ba;B*$Nu(F@c>1;cU zYf?^?rrJhrESO+ktEnj_W=bd|IpB!4!6`yIrb(u=&?1KsB^?)k-+${;7X&G zS?Vvq%ilhZtHI2OOo`cJ$Yb0T-izsE2t4*lhnM)?Zz^5gp+rhQ69qdJN50V+AK`v7 zxHR5vAguZd8%K8iuAf0}eRBW+?6)BGk@z{;ih=Hw~#sljFQC7HA=-LJpR~*Hbnm3A?Fyqi_aqhE2O%~CQ|Jj*Tf;DLcJ4yd6{u0 zMJvfqbhD*tY7<+TONXc+qUtM8?Z@{wth_UuC?s>DTa(TZ;vHu}2O(frNMkk%+tkLu zJQmkSD>`$)Q_M$pdDl*oWPaGvn8*!TyZl^nb*I_TaZ#Ud_b!CB@Mt?Cg$uMW3wTOw zrj*{5N}|aX&Hn2V=D8iOdBN=M^fMG0vzPeoeUdWhL{(^ zV(jL1-1G@QDPir={IUaHg&`EvR8KAK1Y%39wuP|+&@0Ygai!;?EmSc9RkT#WpMFdc z`jV#WYkY~G&bjPtUC%^oMAGV@bwJ14ICVn*(ttE+BkwSfLfgECRA}RVnu73pj9~1u z;lxq7wI}6!?3`-<4)15gc<|`vl>4)HDQ*nI14RAk)-h>lT+0eRH8NgMNdtiMD8(7X)QX;p=RFEO(8OFU zh!{}xmdm8y*~NRpfTn5pZeoev!L5UT=OW-5`7B1Xv*c)Nh1yWM(+f&s9Ez8w@a^ z>Rz0I7G`8_IeXKzv^JzVg=|T>n!eE9YWa;fg^u2W`5ir~g%j8Z8Y1a_?AeKUJYoQB zzNYy;5nTbTywgUrX1PJAnDfKbJQ7_;aZv%RmP9h@FduyJ5d#+yWTFH>y=$3! z|Abn`KKZpMGA1X6PToI#a1%B%ruizK(YBYpdRBW<`~{TsiM3!eRjkc z*93-^J^acAGbDI-@GMOg@HidB6d|INF`#T9!c*Gzi(xM$@Cc)s;OqpHJ#)+LXZLLf zkBlG4y#;IYfyZQ1B{htu`D0t>peTKhGEsV2`Q7}QsuFV7-~+8aX8zCCX70cMuLU+k z2Tj4{D1Nin3mRAlvvrB1O&-pW?l>IO)o+5@1{qGcv7VTx?&b~1v)3g-ZhS&47&X+r znftf%Jr$R0zTF6EC0P=%JY;7p=0(h((`w9tOEpK@6dzy$aW5P5t>@9B4oI*gwj+G| zq>O?SrVjmE<3E)+96ou7Y{q%fZ$b-iNVQYhZA2V)zGLVNHLWn|NZnE(U&K6g_IM9k z5XqCc8{J{dOEZNcaEa#G`~q`9BWe~-d5>hb_)fNC?g9iqv!R3Eh*eDy z7+~(@*3>AG@X)M$t)ATz**p0z1JuO`wv)MNBpX!@2QR94fxZ+P&tN!U>f9`r3}Gmd zvsw>wIgsycY)PP6wuTkgg0s)%#l)4)rhdfdr){h8YRE51lKC1CN(@7WHenM5Se}Y( z1tja=DYk(TN-xS(#9hjd()>C;WBCaJ&%(9Hs1VPj=FjQr-FyX_A8?532|9bAI|J~W z9{|4~s+N~3vu~N^$QlS0C%1HHR)#Zn%n{BSp}P%b;6e142qZ0-n5&g)m);J zwY#Oj@+ZUN@ffG~gUR@7j%5~MF98zNLFlIm2;fodgz9{vNfX%6><@Qt?MvmJ+N-= z5~h%mUxBT3=sf-s;E(gus%6n^!qRo$clF0D$bD;z(1X3|Bu?bZ&Pw^WRhn+wTK{b!;K^=QN;&V+lBuki`pA7z*7y6rJdKP zsQWGMrjKuhu%s>dhFab8J~vh!;8{^LRl!0Qo~?KEzUo%sz3+?usXK~d*Y+UJ&W+ME z)nRMU`l@kM8d0TyC!*a5QZz+ON|Lsy$w(8a7zQGRE7_V4Rs4?tAYdldmPM`NQW)O9 z4`V9gVYWZWaU2-jm7pn0N%YA+W`bMNYj3R#LVD=Jr`w0T?((4nw--N%s$;yDFgehLLn$xqm z3e-~R<{8@hrs?v6vh9piv7g?G88JX-5mFuon1Q@&%$_{qne?tf^Z_9|%F5i1P2X7f z?PDGf9pdbt+$z>_uF$HOINgu&Rh61L+w*wzCO4|1u(;fTIv%4e@1AUPCHeRLQDbpw zrqWG1lX>!r;d@eauY7+=NYj8`w}}_OIw(HDY(bNI@RmIb4kc&2$jW&0G6^O>=kOPk zP)jzr8IorF7BHV_qT)?t;oFk|;}L`Q^y67Xwu0(7&l-Q}$7=^heWk?Rg!PY!A8c3P z$%djaBSdTm3TQI9(OdnN6@M>o!H={OkrdEv3+)_2kvlPC#L#b470X_s^nkp+Ey+;599azd2>SMb3){HK(f4#pY)_S9-k7^E^*!&E3C=ry@dg5dhn|KqXPKtCU)mz(n~ zt@z@G9^_od2-xNA6tq{UPdLu2mO?N5X_(-JI@5odUaDZ1x1;Xf`g_O8UH{R}zlF5D z*CQ0!6<{%2-RoficPmsD7L!#JBl{t0G5A7S`n;m$o-Jp}duaYnoz+_laa&1Z3)W>L z@^^P3u>L3FAze_??Qc`RVDb_)YxuX_(}RWcw>2O=$9xi_uM52b9>Bko98zn1VT8E@ zTI*ZN#q{U<*Y=O_F2=3fPTwxf@*t1X@4~u4$HN)Yr>IPT7$<3Rik0ayxx#gsv@}Xo zOP3X)>$EDg)EUc2(y6)(7%PO*as1%+R!bF+C|2Kw8dt<-#5b%FN}lxP9M&$$>s&#{ ziNo6M!+6b8E2w+Qi)k&D;@K((%r=-n9EcgwTkfj`l_$P59%X)&V$9(kdCMsSG9giW zly~uToh*J~+O9^qs`~yw+7+((wE>)cA>3 zQk~{*I?Q(R0eH#B-!Dq02bDW%h0w}7LHM5+>Ovu1ZrJ9n01h{>fgOh*yBidbZBWRYdPqx5bu$196 zPACrc{TjaPxmKHcTQlzf`dhrgk~T`WpU(hQ?j)#3YA@!Y_hIm`*m|QYRjj zPQeeQZ!!)m^0(|!pF9ql_!L!vKPH`i1p32V%$4$GTR~=7TQ6kmf=pB{o633!U7P4X zgZnwlo(EhNe4#XNhp((3NMi0xE_(*9&MhE87(In*Kk8g^Cc0-mERK9Os!#7cQkTCr z^L44UcdAXy??#5+(k`ZFVz)NXI9e!pPH*LEj;@%0U$Gco0~iTx(i8++5>vMAek~tH z0>@9dB1>1hs^FJ^XBzJ8KP*&-4nH9zGqOY`5Atnn58bUH+G1+7$&xIH!F{BE3`}x{ zetbD>_~CG$dqn((`S$`IG?(p0N(cp2!1Lc1@ToKGMnEOC@8Vdmqo4VSVD}BS=2|DE z;@|OW>QqxDC6y3FBe5A1v|yEbnAE)+7Tb-}hTHAOJWQ+>M3p7YiDl>BjyuS8?h$%A zxBznp(}@Z+UVaFh=?TRlAZ7VDG1`2|%%|&AiyLG2UU3qd(v~^_EZ~^QZp7-tQ)|FjC&?Oaq&`Uqv<_tkjM?c zsprVNY(YW-hqVD~eXOfS6RnKI)owcb=yqi#dBAXfqJA!CT^%kF9?$H`Y8*G{$q6$? zF*jNf%i0lUceR}O@$JXhmI?!qI3kuy6zA(6DFbkd6eWLLRZq!PH4Bh-ZOY>>Y4Ye? zMR75Q3wU4%(56DON=a)E{UNf7+=dK#V0Y+mI@3k8ZkjzY+4ZEK<0kB{gqqqwbe;R@7t)G%ZIj8`t8UB>&Ro8*x@q~c-AKmi5!=-E`9=;;?Huhh{5v!o z)_rxN&!R&WP#C-%ilWw)N1x@gCJgJ{hC-5SmdVB6ri`-o#&=D@rywE~2x_?A$8wq4 zfk(u@q?YL7qP6@{RTlq`s*?K1X$!>WrJmeU_2}PbYS~@A>g>U$bJ1z0nh0Q58vs{ z-Rofb@YfDDyZVwe4C8Lhn=;z|#dOkdZyWhXf9|q^{bQLyrcRi#GRNfa$a|_9qr}Su z422XIIv+Ea>{u+|&;KbXK`)M&?4N?-|6g^nmRk*|*b%x>-%ewixoSjWda5XvZVn``KEU{w4xcT!-fAIg-!j}!AS6%{0 z`Mw99#)_Ax|% zn%qY?b?clN_d^7Kw1l(7^n20Z$c=iKeJJGt-yJdJ>^|6j_VB9iS|@X=w}?ceZ1KR} z#v@dqUBDOdWG$DB{16ZwO*ixn?l8}gdBOmQ&g*R)^0oig=h~Pz_lZszfkW5}v}Z7L zt>5j+FF@MRRYQZz0so{jbz>Nd5d`S5Ak)TI~hu2t|EmV|L(qYU0*VjRaDAn8T zfp@R}d&OEDA|8&^eH|IpOxsLQ%hb@LUKE6Be*&CFW)NDtR~I0jfP@ONP{vd*8nhAy z?6dPz+{D@}kx1P*YW99EXE_pNOEO`l7(@XyMjrzV_-Q5ikZfN5(W5u5NTM7mnj)Jy-5s-0>lq(bp` z=HG%T2h_huJyPl=0ck2MGC^v!5ZXUrJjrqu%RdPiAVNX0{TmBai1H6uU6|q@;H=>5 zr)>l%s0$1zD6anknqmF{GNi6!qOqteLBrrd{pXj3zp3OxihHX6fD!*R2H$@<6%hP! z;!kA|`A-`EK4bnIGyfX3gnxh>sq91usWBpG$bX~$vv;Kyir~XAvHw}*OvT_JN`3qP zk^bF>qW_8m1*OUP57=0g4Mx3;#c}$O71@X<}FiaRPsR{vQYJ5Uc path, + Map info) { if(LOG.isLoggable(INFO)) { String msg = "Circuit " + id + " " + status; - if(flags.length() > 0) msg += ", flags: " + flags; - if(purpose.length() > 0) msg += ", purpose: " + purpose; - if(hsState.length() > 0) msg += ", state: " + hsState; + String purpose = info.get("PURPOSE"); + if(purpose != null) msg += ", purpose: " + purpose; + String hsState = info.get("HS_STATE"); + if(hsState != null) msg += ", state: " + hsState; + String rendQuery = info.get("REND_QUERY"); + if(rendQuery != null) msg += ", service: " + rendQuery; + if(!path.isEmpty()) msg += ", path: " + shortenPath(path); LOG.info(msg); } if("BUILT".equals(status) && firstCircuit.getAndSet(false)) { @@ -649,6 +654,15 @@ class TorPlugin implements DuplexPlugin, EventHandler { } } + private String shortenPath(List path) { + StringBuilder s = new StringBuilder(); + for(String id : path) { + if(s.length() > 0) s.append(','); + s.append(id.substring(1, 7)); + } + return s.toString(); + } + public void streamStatus(String status, String id, String target) {} public void orConnStatus(String status, String orName) { diff --git a/jtorctl.patch b/jtorctl.patch index b1f32cb77..2375100a8 100644 --- a/jtorctl.patch +++ b/jtorctl.patch @@ -1,22 +1,38 @@ diff -Bbur jtorctl/net/freehaven/tor/control/EventHandler.java jtorctl-briar/net/freehaven/tor/control/EventHandler.java --- jtorctl/net/freehaven/tor/control/EventHandler.java 2014-04-02 11:26:56.000000000 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/EventHandler.java 2014-05-14 14:30:46.932545643 +0100 -@@ -20,10 +20,15 @@ ++++ jtorctl-briar/net/freehaven/tor/control/EventHandler.java 2014-05-14 16:54:29.291301601 +0100 +@@ -2,6 +2,9 @@ + // See LICENSE file for copying information + package net.freehaven.tor.control; + ++import java.util.List; ++import java.util.Map; ++ + /** + * Abstract interface whose methods are invoked when Tor sends us an event. + * +@@ -20,10 +23,21 @@ *
  • "CLOSED" : circuit closed (was built)
  • * * - * circID is the alphanumeric identifier of the affected circuit, - * and path is a comma-separated list of alphanumeric ServerIDs. + * circID is the alphanumeric identifier of the affected circuit. -+ * path is a comma-separated list of alphanumeric ServerIDs. -+ * flags is a comma-separated list of the circuit's build flags. -+ * purpose describes the purpose of the circuit. -+ * hsState describes the state of the circuit if it is a hidden -+ * service circuit. ++ * path contains the alphanumeric ServerIDs of the circuit's routers. ++ * info may include some or all of the following entries: ++ *
      ++ *
    • BUILD_FLAGS: a comma-separated list of the circuit's build ++ * flags.
    • ++ *
    • PURPOSE: the purpose of the circuit.
    • ++ *
    • HS_STATE: the state of the circuit if it is a hidden service ++ * circuit.
    • ++ *
    • REND_QUERY: the hidden service address if the circuit is a ++ * hidden service circuit.
    • ++ *
    */ - public void circuitStatus(String status, String circID, String path); -+ public void circuitStatus(String status, String circID, String path, -+ String flags, String purpose, String hsState); ++ public void circuitStatus(String status, String circID, List path, ++ Map info); /** * Invoked when a stream's status has changed. * Possible values for status are: @@ -175,14 +191,22 @@ diff -Bbur jtorctl/net/freehaven/tor/control/examples/Main.java jtorctl-briar/ne } diff -Bbur jtorctl/net/freehaven/tor/control/NullEventHandler.java jtorctl-briar/net/freehaven/tor/control/NullEventHandler.java --- jtorctl/net/freehaven/tor/control/NullEventHandler.java 2014-04-02 11:26:56.000000000 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/NullEventHandler.java 2014-05-14 14:33:04.821229388 +0100 -@@ -7,7 +7,8 @@ ++++ jtorctl-briar/net/freehaven/tor/control/NullEventHandler.java 2014-05-14 16:54:43.219370671 +0100 +@@ -2,12 +2,16 @@ + // See LICENSE file for copying information + package net.freehaven.tor.control; + ++import java.util.List; ++import java.util.Map; ++ + /** + * Implementation of EventHandler that ignores all events. Useful * when you only want to override one method. */ public class NullEventHandler implements EventHandler { - public void circuitStatus(String status, String circID, String path) {} -+ public void circuitStatus(String status, String circID, String path, -+ String flags, String purpose, String hsState) {} ++ public void circuitStatus(String status, String circID, List path, ++ Map info) {} public void streamStatus(String status, String streamID, String target) {} public void orConnStatus(String status, String orName) {} public void bandwidthUsed(long read, long written) {} @@ -241,8 +265,8 @@ diff -Bbur jtorctl/net/freehaven/tor/control/PasswordDigest.java jtorctl-briar/n diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java --- jtorctl/net/freehaven/tor/control/TorControlConnection.java 2014-04-02 11:26:56.000000000 +0100 -+++ jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java 2014-05-14 15:25:20.908780406 +0100 -@@ -2,96 +2,93 @@ ++++ jtorctl-briar/net/freehaven/tor/control/TorControlConnection.java 2014-05-14 16:59:18.428735366 +0100 +@@ -2,96 +2,94 @@ // See LICENSE file for copying information package net.freehaven.tor.control; @@ -261,6 +285,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; ++import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedList; @@ -382,7 +407,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b StringTokenizer st = new StringTokenizer(s, "\n"); while (st.hasMoreTokens()) { String line = st.nextToken(); -@@ -110,12 +107,11 @@ +@@ -110,12 +108,11 @@ debugOutput.print(">> .\n"); } @@ -398,7 +423,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b case '\r': case '\n': case '\\': -@@ -128,7 +124,7 @@ +@@ -128,7 +125,7 @@ return sb.toString(); } @@ -407,7 +432,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b ArrayList reply = new ArrayList(); char c; do { -@@ -153,7 +149,7 @@ +@@ -153,7 +150,7 @@ String msg = line.substring(4); String rest = null; if (c == '+') { @@ -416,7 +441,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b while (true) { line = input.readLine(); if (debugOutput != null) -@@ -172,8 +168,9 @@ +@@ -172,8 +169,9 @@ return reply; } @@ -428,7 +453,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b checkThread(); Waiter w = new Waiter(); if (debugOutput != null) -@@ -185,38 +182,55 @@ +@@ -185,38 +183,58 @@ output.flush(); waiters.addLast(w); } @@ -466,31 +491,34 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b String tp = line.msg.substring(0, idx).toUpperCase(); String rest = line.msg.substring(idx+1); if (tp.equals("CIRC")) { -+ String path = "", flags = "", purpose = "", hsState = ""; List lst = Bytes.splitStr(null, rest); - handler.circuitStatus(lst.get(1), - lst.get(0), - lst.get(1).equals("LAUNCHED") - || lst.size() < 2 ? "" - : lst.get(2)); -+ for(int i = 2; i < lst.size(); i++) { -+ String arg = lst.get(i); -+ idx = arg.indexOf('='); -+ if (idx == -1) { -+ path = arg; -+ } else { -+ String key = arg.substring(0, idx).toUpperCase(); -+ String value = arg.substring(idx+1); -+ if (key.equals("BUILDFLAGS")) -+ flags = value; -+ else if (key.equals("PURPOSE")) -+ purpose = value; -+ else if (key.equals("HS_STATE")) -+ hsState = value; ++ int size = lst.size(), firstKeyValue; ++ List path; ++ if (size < 3 || lst.get(1).equals("LAUNCHED")) { ++ path = Collections.emptyList(); ++ firstKeyValue = 2; ++ } else { ++ path = Arrays.asList(lst.get(2).split(",")); ++ path = Collections.unmodifiableList(path); ++ firstKeyValue = 3; ++ } ++ Map info = new HashMap(); ++ for (int i = firstKeyValue; i < size; i++) { ++ String kv = lst.get(i); ++ idx = kv.indexOf('='); ++ if (idx >= 0) { ++ String key = kv.substring(0, idx); ++ String value = kv.substring(idx+1); ++ info.put(key, value); + } + } -+ handler.circuitStatus(lst.get(1), lst.get(0), path, flags, -+ purpose, hsState); ++ info = Collections.unmodifiableMap(info); ++ handler.circuitStatus(lst.get(1), lst.get(0), path, info); } else if (tp.equals("STREAM")) { List lst = Bytes.splitStr(null, rest); - handler.streamStatus(lst.get(1), @@ -500,7 +528,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b // XXXX circID. } else if (tp.equals("ORCONN")) { List lst = Bytes.splitStr(null, rest); -@@ -240,23 +254,22 @@ +@@ -240,23 +258,22 @@ } } @@ -531,7 +559,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b } /** Set the EventHandler object that will be notified of any -@@ -271,50 +284,43 @@ +@@ -271,50 +288,43 @@ * This is necessary to handle asynchronous events and synchronous * responses that arrive independantly over the same socket. */ @@ -591,7 +619,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b Waiter w; synchronized (waiters) { w = waiters.removeFirst(); -@@ -324,20 +330,16 @@ +@@ -324,20 +334,16 @@ } } @@ -616,7 +644,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b } setConf(lst); } -@@ -345,34 +347,33 @@ +@@ -345,34 +351,33 @@ /** Changes the values of the configuration options stored in * kvList. Each list element in kvList is expected to be * String of the format "key value". @@ -658,7 +686,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b } b.append("\r\n"); sendAndWaitForResponse(b.toString(), null); -@@ -384,9 +385,8 @@ +@@ -384,9 +389,8 @@ public void resetConf(Collection keys) throws IOException { if (keys.size() == 0) return; @@ -670,7 +698,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b b.append(" ").append(key); } b.append("\r\n"); -@@ -402,10 +402,10 @@ +@@ -402,10 +406,10 @@ /** Requests the values of the configuration variables listed in keys. * Results are returned as a list of ConfigEntry objects. @@ -683,7 +711,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * Some options are context-sensitive, and depend on other options with * different keywords. These cannot be fetched directly. Currently there * is only one such option: clients should use the "HiddenServiceOptions" -@@ -413,61 +413,63 @@ +@@ -413,61 +417,63 @@ * HiddenServiceNodes, and HiddenServiceExcludeNodes option settings. */ public List getConf(Collection keys) throws IOException { @@ -767,7 +795,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * To authenticate under this scheme, the controller sends Tor the original * secret that was used to generate the password. */ -@@ -505,9 +507,6 @@ +@@ -505,9 +511,6 @@ Waiter w = new Waiter(); if (debugOutput != null) debugOutput.print(">> "+s); @@ -777,7 +805,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b synchronized (waiters) { output.write(s); output.flush(); -@@ -519,7 +518,7 @@ +@@ -519,7 +522,7 @@ * addresses should be replaced with connections to the specified replacement * addresses. Each element of kvLines is a String of the form * "old-address new-address". This function returns the new address mapping. @@ -786,7 +814,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * The client may decline to provide a body for the original address, and * instead send a special null address ("0.0.0.0" for IPv4, "::0" for IPv6, or * "." for hostname), signifying that the server should choose the original -@@ -527,56 +526,52 @@ +@@ -527,56 +530,52 @@ * should ensure that it returns an element of address space that is unlikely * to be in actual use. If there is already an address mapped to the * destination address, the server may reuse that mapping. @@ -856,7 +884,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * Recognized keys include: *
      *
    • "version" : The version of the server's software, including the name -@@ -605,17 +600,16 @@ +@@ -605,17 +604,16 @@ *
    */ public Map getInfo(Collection keys) throws IOException { @@ -879,7 +907,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b break; String k = line.msg.substring(0,idx); String v; -@@ -629,13 +623,9 @@ +@@ -629,13 +627,9 @@ return m; } @@ -895,7 +923,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b return m.get(key); } -@@ -644,40 +634,39 @@ +@@ -644,40 +638,39 @@ * to the specified path, or the circID is nonzero, in which case it is a * request for the server to extend an existing circuit with that ID according * to the specified path. @@ -943,7 +971,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * The descriptor, when parsed, must contain a number of well-specified * fields, including fields for its nickname and identity. */ -@@ -685,12 +674,12 @@ +@@ -685,12 +678,12 @@ // No need for return value? control-spec.txt says reply is merely "250 OK" on success... public String postDescriptor(String desc) throws IOException { List lst = sendAndWaitForResponse("+POSTDESCRIPTOR\r\n", desc); @@ -958,7 +986,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b * To be sure that the modified address will be used, this event must be sent * after a new stream event is received, and before attaching this stream to * a circuit. -@@ -720,8 +709,7 @@ +@@ -720,8 +713,7 @@ * * Tor may hold the stream open for a while to flush any data that is pending. */ @@ -968,7 +996,7 @@ diff -Bbur jtorctl/net/freehaven/tor/control/TorControlConnection.java jtorctl-b sendAndWaitForResponse("CLOSESTREAM "+streamID+" "+reason+"\r\n",null); } -@@ -729,8 +717,15 @@ +@@ -729,8 +721,15 @@ * If ifUnused is true, do not close the circuit unless it is unused. */ public void closeCircuit(String circID, boolean ifUnused) throws IOException {