From 99fb986ac4c0038498e402780522caa11c6188fc Mon Sep 17 00:00:00 2001 From: Balint Kovacs Date: Thu, 24 Mar 2011 20:59:48 +0100 Subject: [PATCH] New icon and some minor reformattings Signed-off-by: Balint Kovacs --- AndroidManifest.xml | 45 ++-- bin/SSLDroid.apk | Bin 18203 -> 16147 bytes bin/classes.dex | Bin 10740 -> 10844 bytes bin/resources.ap_ | Bin 11195 -> 9054 bytes res/drawable-hdpi/icon.png | Bin 4147 -> 3041 bytes res/drawable-ldpi/icon.png | Bin 1723 -> 1431 bytes res/drawable-mdpi/icon.png | Bin 2574 -> 1992 bytes src/hu/blint/ssldroid/SSLDroid.java | 75 ++++-- src/hu/blint/ssldroid/SSLDroidGui.java | 46 ++-- src/hu/blint/ssldroid/TcpProxy.java | 353 ++++++++++++++----------- 10 files changed, 288 insertions(+), 231 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ac8a37d..d02df83 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,23 +1,30 @@ - + package="hu.blint.ssldroid" android:versionCode="1" + android:versionName="1.0"> + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - \ No newline at end of file diff --git a/bin/SSLDroid.apk b/bin/SSLDroid.apk index c991f20158ba5da57912582539dfe7454d1c69af..15a982a0c0dfc7704f20e35881d9770dae931420 100644 GIT binary patch delta 13195 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 z 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 delta 4881 zcmZXY3vd#L?vekum7_phzZ~l_9dEROAkvK~a%wU?em|B_;DP7Qu2@ z2T#B;xB%gpNF7`O17I**1J}Xza3hR?@h}&b!87nWd<e24<3ZIum!fm zPB;kf!AUp;slReL1E0a?Z~?vnDHE|F2$_%rRWJ-j!9=(n?t&(0hKJ#|umQHfZg>G+ zfmh)Tcn40yC-8L{&p*49NC9+#8W;$};b$-%=E7oF16yDZ9Dsvx1dhTncppx~8TcG7 zLS|>$h9vZaesDF6fO=@?oD!LgF%9m7d*D7;2fN{AI0`4=kMJ>^g@41>@EzD)cz>V> zIzcz+2P2>!rov2^4fn%hSPtvq>Fc@df*0X6cn3a!PvIO~fQyh`E|L!sD27U?g@JGl zWbwobog?;a)61#z%}hI<4~2eozn^%nbsCbb8+mV3J? zS&5?$;vP@$MGN5x=m2v(eFTk4g^YK#SdO7F&yTS~YkgI%AD3b|>gjtZ8=vS4P$d0i zuB!=gTpd>?&tMc2TJ36uJnHFsS4Dp3#do;cRrb2tM_zKZLf&;%OYL%(bEJS&BITKCC{N{p0B#l^;2c?2aGOW1=Y9l z%e@g+V7-N(^g2i~qj$M}rl&3CD|wObBfqOxPj!v!cb2uDuJhst(QcI28R?edk<4~8 zT1MKPv1_0^Z_OfC(_|T1rZ%kz7CTFWxfdbPa2 z522}ACg(R8b!;&jsAId(DX)`GZvN#obO^r>d)$0fHgwsO=*^Vd{bW1)nRfQxcJ?7`?f6YE@6YJpJo_yA1!(-Dr+)e~ z?jI+Ta_76u4(0~u+sud=?Oq$)>jd{Y*|{YvlA6Jg(`cYEY*8&Pqh(w;z$<8b)7VH{ z2b{;$+mx`e=aHvxOI*fEUhbTpL9tAh%nEBe+CtoHmpKU^?_G$xIvfrU)Cr*V;UFb- zRzfTgdjOe677-jmR=&we=G(tFacjTCeYV8?Z_?lx$%|+w>A@d#65QsD%1&})3$lmC z_t1im78><)O4B|%)}ih%cRt82HcvTUWp{SI%#J#}LZ#MQ<<3o^TZf&Zjt+U8$&_(c z7Ipi%b+Z|fk8yoMydPuF3v>#0llr6DduLW#MtWo7N;ZLb`e^Btk(795jq~4-)8%;l(mZ5K6316lv%88Lofe68{b7xk$b_ zzUxS2tJ(EX%pVL4xogU8bEh~>iK)BJCl32k84?T)yiU5CH6|G1W`m*4P0|x-kf^oB z945EgHXDtpw(U3cYQ1if)wb_3lk8#pH<;w+`SWjySKEQ+a^69jC^iSEbHCM8(zLh9 zn!ihO&2BOVjN81Yp+OAqS}Gm(%_kig(VBqF)e%tT!`~7JQ=e}}lqKSw67Q<{VH_@<_Io)pp z{_21+(HxT-NV6KN{D#s2e_9}DZ0$kT8+*0cVRl~2(E84-u9hba!%5iICS$CEO$`&8 ztSKcAjWfnJD~+k4&4wA(wlpWKS)2UQG6Df@op1gB2np zo^*@ICR5tdbg}EF)AT6Itzn`?R<1eW%&ELQbt>Y13}PAgFZ7*{xJxW%VwreLq8hPd zS=bw+8u1ay#@okd-AD-Qc$DvqFAz48gZGbU*er<|vmTDaxtOtxl@?E@bOG@dMIFr6 zB4aidQ_EzoNSIZrMA5>9zJ(>lW@8CY-eku^R54bGHrJ`ttnO^m>|i7#mnK^ObSNE( zuTL7T2a>+n`DB?{UuDd0c)Q9nXV8nVy4skNx;N_?MpMg{)1oKw8}+2EoADqx#P*~+ z6x)mY^N@bL^c12$5&6+Epg$AoH&a)={#0c1anrp>e=ahKmQ%+m>;QJUw4BxqW%Q(` uryPrX?O1xsmVt)1u*PO!Bz_sB;>dI$QO*8c%xsEd&R diff --git a/bin/resources.ap_ b/bin/resources.ap_ index 30b719ce99ad7738a03fa4907c0bcdb905047a30..3d6a417b6f9d0e49f42e0b031da515192cb399c4 100644 GIT binary patch delta 6668 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 delta 8843 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 delta 4127 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 THn9;^00000NkvXXu0mjfao(n; delta 1708 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 N002ovPDHLkV1g=>!LR@T delta 2565 zcmV+g3i|cP4~`U&BYz3iNklQ`Og{P|9^0MHK0_ue5La$BvqW(E{R@m;+b z+04~`K@~=KAlzM05bd(Nnm)?dxa?uEJXv zeu+q80Dqrd@f`f#Ip`ZXfIAz$i21em;CTN_=xEu3VAVXlcIsQuGdfb46xxDaSk?R` zH2PP;NRz%=?4~pTga_dz#}k`EC}jbv!cw~BHsU&lZlE=|p3FXv_J;eB)>By1vJIEU zj-b8%el*o|VkG)LqNx#TG>Jvj^jIte!!+RY)PJLY@)%lY-vfVDGlHHLY+U$V^iLdv zrg-Q+#?(5pRz7B(*J9e@sgV7wrlqlyV{Kn>8(4v2;-jwVy`N*NVyb04`0ujrO_sVN?6}QB&QD z4GSJe%j~t7rPZQi-XruqkF`oeU>Uj=euKg#v9@g+*0gTHJN>UCC)o`?7zD@J3ChBdeQ!oN8-bK z)HDs<-97KETX)x2xXJ)=m{^cXOT|Ert2__P^~`+Z&V#E9S;5N`C++P3qk^?v1rVm~ zjBq;ys6=tD0*LR676fk>l#4%C0c@r#(S$vBrrWXt+)4|uIHPyU|>La6h%92y4IPufI$9>Xu!@y z`TaNgtg&41@PwMwBdmSm7)xAWDStg10dJ$le#VeeKMN{LP+@#9)=Dy}s; zItmd)fR<7PtqBfRa1}tbFQyiv?qISgtA=i5gaug^9(5La2LFf?gTH4Ln}4k+ErF;= z-IQ`Bh0yq$6zokLP=AUI^S+6dO%L-+9m!-89*>7Y@(fexVMT0Y#VqQ+u?`Qld2!+h zqUjMX>VbzxMA73u+GgKvc?r?JS(VpwP!0HUiC7TuULkc_CJBKkqFd8gJbY!X=N|2>}SVTgb;KG z8CTHJxE0O8PV71L7+pwiVw}GVjqS6>G`g99Zl)=$51*L-G}qEGnSbbqHaCQ79+E=u zUXCOZ35jAMRz%R%0(P!0FMv=sk>Nr8%+OzY^c-M9@+ zfz=G`qj2+%Zca?2GF_~Ag8Z{+AH9ziZejL@FI=nNq3nz#ELXAuA;T*>;hBqKa81dvd z<6{SYg-4wiWq)s33zYnF+JI;-;N=Ylg%+L3uVj~+sx~~d^k>|VJ=ov3eJauU2EUa}8?jjAVjIdWLN~x|EkQziRAeJZ(CKl9w41uafUTzJe$=`uZi++SY2K7JA ze8&>W!#h=xt|D?2FrFI2zR-_dmv$9EzO;Scl}c_fpno-CaqR=VUaUvk>@F_89b@tH zs8R!*QKY;INJ<2_U+K6Ca3e9Gsl2{qY0%a7J?uICWgHuLfj+MB=GkAN1&ifT#2u}B z+2S#~$5jA(Qn^;H%CCmIae4AE-Dsng|Hl*Ov!z72k3ZnJs{pp|+pW`DDueC#mEWOf z=ucJ!dVgwUH@>j^1>TL0u`W8w;Jx`gA+b`%0Pb1H4q!VDoLX66B>p}bl~W&?H8pNf zf56)2Czv7W0=b~Qsa8^~W179L%2Mj#vRQCqI=|0g@wJLYT$WSW0u+`LdvR`TFYo?W zayL$LjI=%o=2*#5$-d=&T?LTKRr`!ux`mZK+kfjHWDJu_CL5173+G1viO%M)LDgs( zNkBJ&R^GCHEN-WinlC}A7?9kRIDY*2SZ{CdB=-Xmlu3c=bp$!2FUGt5ujP&Eh%~%T zAMQdgEh5EUr9e)lIFdhgjYQNO<97+7V?K4FDt+}iT+enfv5qJ;aLMZpj@?R-eY*9u||RB?bS+IKo}Kc5yWnb blIs5eNSY+j744LC00000NkvXXu0mjfa9`Z- diff --git a/src/hu/blint/ssldroid/SSLDroid.java b/src/hu/blint/ssldroid/SSLDroid.java index 9616e34..ccc9346 100644 --- a/src/hu/blint/ssldroid/SSLDroid.java +++ b/src/hu/blint/ssldroid/SSLDroid.java @@ -2,6 +2,8 @@ package hu.blint.ssldroid; import hu.blint.ssldroid.TcpProxy; import android.app.*; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.util.Log; @@ -11,40 +13,57 @@ public class SSLDroid extends Service { final String TAG = "SSLDroid"; TcpProxy tp; - + @Override - public void onCreate() { - Toast.makeText(this, "SSLDroid Service Started", Toast.LENGTH_LONG).show(); - Log.d(TAG, "onStart"); - } + public void onCreate() { + // Toast.makeText(this, "SSLDroid Service Started", + // Toast.LENGTH_LONG).show(); + // Log.d(TAG, "onStart"); + } @Override public void onStart(Intent intent, int startid) { - int listenPort = 9999; // port to listen on - int targetPort = 443; // port to connect to - String targetHost = "sogo.balabit.com"; //remote host - String keyFile = "/mnt/sdcard/blint-imaps.p12"; - String keyPass = "titkos"; + int listenPort = 9999; // port to listen on + int targetPort = 443; // port to connect to + String targetHost = "sogo.balabit.com"; // remote host + String keyFile = "/mnt/sdcard/blint-imaps.p12"; + String keyPass = "titkos"; - Toast.makeText(this, "SSLDroid Service Created", Toast.LENGTH_LONG).show(); + Toast.makeText(this, "SSLDroid Service Started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onCreate"); - - tp = new TcpProxy(); - try { - tp.serve(listenPort, targetHost, targetPort, keyFile, keyPass); - } catch (Exception e) { - Log.d(TAG, "SSLDroid Sulyos Errorhiba" + e.getMessage()); - } - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - @Override - public void onDestroy() { - tp.stop(); - } + tp = new TcpProxy(); + try { + tp.serve(listenPort, targetHost, targetPort, keyFile, keyPass); + } catch (Exception e) { + Log.d(TAG, "SSLDroid Sulyos Errorhiba" + e.getMessage()); + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onDestroy() { + try { + tp.stop(); + } catch (Exception e) { + Log.d("SSLDroid", "Error stopping service: " + e.getMessage()); + } + } } + +/* +public class MyStartupIntentReceiver extends BroadcastReceiver{ + @Override + public void onReceive(Context context, Intent intent) { + } + Intent serviceIntent = new Intent(); + serviceIntent.setAction("hu.blint.ssldroid"); + context.startService(serviceIntent); + } + +*/ \ No newline at end of file diff --git a/src/hu/blint/ssldroid/SSLDroidGui.java b/src/hu/blint/ssldroid/SSLDroidGui.java index b016f55..9062112 100644 --- a/src/hu/blint/ssldroid/SSLDroidGui.java +++ b/src/hu/blint/ssldroid/SSLDroidGui.java @@ -9,31 +9,31 @@ import android.view.View.OnClickListener; import android.widget.Button; public class SSLDroidGui extends Activity implements OnClickListener { - private static final String TAG = "ServicesDemo"; - Button buttonStart, buttonStop; + private static final String TAG = "ServicesDemo"; + Button buttonStart, buttonStop; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); - buttonStart = (Button) findViewById(R.id.buttonStart); - buttonStop = (Button) findViewById(R.id.buttonStop); + buttonStart = (Button) findViewById(R.id.buttonStart); + buttonStop = (Button) findViewById(R.id.buttonStop); - buttonStart.setOnClickListener(this); - buttonStop.setOnClickListener(this); - } + buttonStart.setOnClickListener(this); + buttonStop.setOnClickListener(this); + } - public void onClick(View src) { - switch (src.getId()) { - case R.id.buttonStart: - Log.d(TAG, "onClick: starting service"); - startService(new Intent(this, SSLDroid.class)); - break; - case R.id.buttonStop: - Log.d(TAG, "onClick: stopping service"); - stopService(new Intent(this, SSLDroid.class)); - break; - } - } + public void onClick(View src) { + switch (src.getId()) { + case R.id.buttonStart: + Log.d(TAG, "onClick: starting service"); + startService(new Intent(this, SSLDroid.class)); + break; + case R.id.buttonStop: + Log.d(TAG, "onClick: stopping service"); + stopService(new Intent(this, SSLDroid.class)); + break; + } + } } \ No newline at end of file diff --git a/src/hu/blint/ssldroid/TcpProxy.java b/src/hu/blint/ssldroid/TcpProxy.java index 2e1483d..dd1a007 100644 --- a/src/hu/blint/ssldroid/TcpProxy.java +++ b/src/hu/blint/ssldroid/TcpProxy.java @@ -17,179 +17,210 @@ import android.util.Log; import android.widget.Toast; /** - * This is a modified version of the TcpTunnelGui utility - * borrowed from the xml.apache.org project. - * @author Balint Kovacs (blint@blint.hu) + * This is a modified version of the TcpTunnelGui utility borrowed from the + * xml.apache.org project. */ public class TcpProxy { - int listenPort; - String tunnelHost; - int tunnelPort; - String keyFile, keyPass; - Relay inRelay, outRelay; - Thread server = null; + int listenPort; + String tunnelHost; + int tunnelPort; + String keyFile, keyPass; + Relay inRelay, outRelay; + Thread server = null; - public TcpProxy() { - } - - public TcpProxy(int listenPort, String tunnelHost, int tunnelPort, String keyFile, String keyPass) { - this.listenPort = listenPort; - this.tunnelHost = tunnelHost; - this.tunnelPort = tunnelPort; - this.keyFile = keyFile; - this.keyPass = keyPass; - } - - public int getListenPort() { - return listenPort; - } - - public String getTunnelHost() { - return tunnelHost; - } - - public int getTunnelPort() { - return tunnelPort; - } - - public String getKeyFile() { - return keyFile; - } - public String getKeyPass() { - return keyPass; - } - - private static SSLSocketFactory sslSocketFactory; - public static final SSLSocketFactory getSocketFactory(String pkcsFile, String pwd) { - if (sslSocketFactory == null) { - try { - KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509"); - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - keyStore.load(new FileInputStream(pkcsFile), pwd.toCharArray()); - keyManagerFactory.init(keyStore, pwd.toCharArray()); - SSLContext context = SSLContext.getInstance("TLS"); - context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); - sslSocketFactory = (SSLSocketFactory) context.getSocketFactory(); - - } catch (FileNotFoundException e) { - Log.d("SSLDroid","Error loading the client certificate file:" + e.getMessage()); - //Toast.makeText(none, "SSLDroid Sulyos Errorhiba" + e.getMessage(), Toast.LENGTH_LONG).show(); - } catch (KeyManagementException e) { - Log.d("SSLDroid","No SSL algorithm support: " + e.getMessage()); - } catch (NoSuchAlgorithmException e) { - Log.d("SSLDroid","No common SSL algorithm found: " + e.getMessage()); - } catch (KeyStoreException e) { - Log.d("SSLDroid","Error setting up keystore:" + e.getMessage()); - } catch (java.security.cert.CertificateException e) { - Log.d("SSLDroid","Error loading the client certificate:" + e.getMessage()); - } catch (IOException e) { - Log.d("SSLDroid","Error loading the client certificate file:" + e.getMessage()); - } catch (UnrecoverableKeyException e) { - Log.d("SSLDroid","Error loading the client certificate:" + e.getMessage()); - } - } - return sslSocketFactory; + public TcpProxy() { } - - public void serve(int listenPort, String tunnelHost, int tunnelPort, String keyFile, String keyPass) throws IOException { - final TcpProxy ttg = new TcpProxy(listenPort, tunnelHost, tunnelPort, keyFile, keyPass); - - // create the server thread - server = new Thread() { - public void run() { - ServerSocket ss = null; - try { - ss = new ServerSocket(ttg.getListenPort()); - Log.d("SSLDroid","Listening for connections on port " + ttg.getListenPort() + " ..."); - } catch (Exception e) { - Log.d("SSLDroid", "Error setting up listening socket: " + e.getMessage()); - //e.printStackTrace(); - System.exit(1); - } - while (true) { - try { - // accept the connection from my client - Socket sc = ss.accept(); - Socket st; - - try { - st = (SSLSocket) getSocketFactory(ttg.getKeyFile(), ttg.getKeyPass()).createSocket(ttg.getTunnelHost(), ttg.getTunnelPort()); - ((SSLSocket)st).startHandshake(); - } catch (Exception e) { - Log.d("SSLDroid","SSL failure: " + e.toString()); - st = new Socket(ttg.getTunnelHost(),ttg.getTunnelPort()); - } - Log.d("SSLDroid","Tunnelling port " + ttg.getListenPort() + " to port " + ttg.getTunnelPort() + " on host " + ttg.getTunnelHost() + " ..."); + public TcpProxy(int listenPort, String tunnelHost, int tunnelPort, + String keyFile, String keyPass) { + this.listenPort = listenPort; + this.tunnelHost = tunnelHost; + this.tunnelPort = tunnelPort; + this.keyFile = keyFile; + this.keyPass = keyPass; + } - // relay the stuff thru - Thread fromBrowserToServer = new Relay(sc.getInputStream(), st.getOutputStream(), "<<< B2S <<<"); - Thread fromServerToBrowser = new Relay(st.getInputStream(), sc.getOutputStream(), ">>> S2B >>>"); + public int getListenPort() { + return listenPort; + } - fromBrowserToServer.start(); - fromServerToBrowser.start(); + public String getTunnelHost() { + return tunnelHost; + } - if (server.isInterrupted()) - ss.close(); - - } catch (Exception ee) { - Log.d("SSLDroid","Ouch: "+ ee.getMessage()); - //ee.printStackTrace(); - } - } - } - }; - server.start(); - } + public int getTunnelPort() { + return tunnelPort; + } - public void stop(){ - if (server != null) - server.interrupt(); - } - - public static class Relay extends Thread { - private InputStream in; - private OutputStream out; - private final static int BUFSIZ = 4096; - private byte buf[] = new byte[BUFSIZ]; + public String getKeyFile() { + return keyFile; + } - public Relay(InputStream in, OutputStream out, String prefix) { - this.in = in; - this.out = out; - } + public String getKeyPass() { + return keyPass; + } - public void run() { - int n = 0; + private static SSLSocketFactory sslSocketFactory; - try { - while ((n = in.read(buf)) > 0) { - out.write(buf, 0, n); - out.flush(); + public static final SSLSocketFactory getSocketFactory(String pkcsFile, + String pwd) { + if (sslSocketFactory == null) { + try { + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509"); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + keyStore.load(new FileInputStream(pkcsFile), pwd.toCharArray()); + keyManagerFactory.init(keyStore, pwd.toCharArray()); + SSLContext context = SSLContext.getInstance("TLS"); + context.init(keyManagerFactory.getKeyManagers(), null, + new SecureRandom()); + sslSocketFactory = (SSLSocketFactory) context + .getSocketFactory(); - for (int i = 0; i < n; i++) { - if (buf[i] == 7) - buf[i] = '#'; - } - - if (Thread.interrupted()) { - //We've been interrupted: no more serving. - return; - } - } - } catch (SocketException e) { - Log.d("SSLDroid", e.getMessage()); - } catch (IOException e) { - Log.d("SSLDroid", e.getMessage()); - } finally { - try { - in.close(); - out.close(); - } catch (IOException e) { - Log.d("SSLDroid", e.getMessage()); - } - } + } catch (FileNotFoundException e) { + Log.d("SSLDroid", "Error loading the client certificate file:" + + e.getMessage()); + // Toast.makeText(none, "SSLDroid Sulyos Errorhiba" + + // e.getMessage(), Toast.LENGTH_LONG).show(); + } catch (KeyManagementException e) { + Log + .d("SSLDroid", "No SSL algorithm support: " + + e.getMessage()); + } catch (NoSuchAlgorithmException e) { + Log.d("SSLDroid", "No common SSL algorithm found: " + + e.getMessage()); + } catch (KeyStoreException e) { + Log + .d("SSLDroid", "Error setting up keystore:" + + e.getMessage()); + } catch (java.security.cert.CertificateException e) { + Log.d("SSLDroid", "Error loading the client certificate:" + + e.getMessage()); + } catch (IOException e) { + Log.d("SSLDroid", "Error loading the client certificate file:" + + e.getMessage()); + } catch (UnrecoverableKeyException e) { + Log.d("SSLDroid", "Error loading the client certificate:" + + e.getMessage()); + } + } + return sslSocketFactory; + } - Log.d("SSLDroid", "Quitting stream proxy..."); - } - } + public void serve(int listenPort, String tunnelHost, int tunnelPort, + String keyFile, String keyPass) throws IOException { + final TcpProxy ttg = new TcpProxy(listenPort, tunnelHost, tunnelPort, + keyFile, keyPass); + + // create the server thread + server = new Thread() { + public void run() { + ServerSocket ss = null; + try { + ss = new ServerSocket(ttg.getListenPort()); + Log.d("SSLDroid", "Listening for connections on port " + + ttg.getListenPort() + " ..."); + } catch (Exception e) { + Log.d("SSLDroid", "Error setting up listening socket: " + + e.getMessage()); + // e.printStackTrace(); + System.exit(1); + } + while (true) { + try { + // accept the connection from my client + Socket sc = ss.accept(); + Socket st; + + try { + st = (SSLSocket) getSocketFactory(ttg.getKeyFile(), + ttg.getKeyPass()).createSocket( + ttg.getTunnelHost(), ttg.getTunnelPort()); + ((SSLSocket) st).startHandshake(); + } catch (Exception e) { + Log.d("SSLDroid", "SSL failure: " + e.toString()); + st = new Socket(ttg.getTunnelHost(), ttg.getTunnelPort()); + } + + Log.d("SSLDroid", "Tunnelling port " + + ttg.getListenPort() + " to port " + + ttg.getTunnelPort() + " on host " + + ttg.getTunnelHost() + " ..."); + + // relay the stuff thru + Thread fromBrowserToServer = new Relay(sc + .getInputStream(), st.getOutputStream(), + "<<< B2S <<<"); + Thread fromServerToBrowser = new Relay(st + .getInputStream(), sc.getOutputStream(), + ">>> S2B >>>"); + + fromBrowserToServer.start(); + fromServerToBrowser.start(); + + if (server.isInterrupted()) { + ss.close(); + return; + } + + } catch (Exception ee) { + Log.d("SSLDroid", "Ouch: " + ee.getMessage()); + // ee.printStackTrace(); + } + } + } + }; + server.start(); + } + + public void stop() { + if (server != null) + server.interrupt(); + Log.d("SSLDroid", "Stopping service"); + } + + public static class Relay extends Thread { + private InputStream in; + private OutputStream out; + private final static int BUFSIZ = 4096; + private byte buf[] = new byte[BUFSIZ]; + + public Relay(InputStream in, OutputStream out, String prefix) { + this.in = in; + this.out = out; + } + + public void run() { + int n = 0; + + try { + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + out.flush(); + + for (int i = 0; i < n; i++) { + if (buf[i] == 7) + buf[i] = '#'; + } + + if (Thread.interrupted()) { + // We've been interrupted: no more serving. + return; + } + } + } catch (SocketException e) { + Log.d("SSLDroid", e.getMessage()); + } catch (IOException e) { + Log.d("SSLDroid", e.getMessage()); + } finally { + try { + in.close(); + out.close(); + } catch (IOException e) { + Log.d("SSLDroid", e.getMessage()); + } + } + + Log.d("SSLDroid", "Quitting stream proxy..."); + } + } } \ No newline at end of file