From 422b11fdefd5ccd541a0c0a59c6684e5fb1c66eb Mon Sep 17 00:00:00 2001 From: Balint Kovacs Date: Wed, 20 Apr 2011 18:10:34 +0200 Subject: [PATCH] Heavy refactoring, implemented proper GUI Migrated settings to be sqlite-based and the GUI to be based on ListActivity Signed-off-by: Balint Kovacs --- AndroidManifest.xml | 2 + bin/SSLDroid.apk | Bin 27200 -> 34790 bytes bin/classes.dex | Bin 17760 -> 25916 bytes bin/resources.ap_ | Bin 16866 -> 20410 bytes res/layout/main.xml | 29 +-- res/layout/tunnel_details.xml | 68 +++++ res/layout/tunnel_list.xml | 9 + res/layout/tunnel_list_item.xml | 14 ++ res/menu/main.xml | 7 + res/values/strings.xml | 16 +- src/hu/blint/ssldroid/SSLDroid.java | 101 ++++---- src/hu/blint/ssldroid/SSLDroidGui.java | 235 ++++++++++-------- .../blint/ssldroid/SSLDroidTunnelDetails.java | 166 +++++++++++++ src/hu/blint/ssldroid/TcpProxy.java | 3 + .../blint/ssldroid/db/SSLDroidDbAdapter.java | 109 ++++++++ .../blint/ssldroid/db/SSLDroidDbHelper.java | 39 +++ 16 files changed, 614 insertions(+), 184 deletions(-) create mode 100644 res/layout/tunnel_details.xml create mode 100644 res/layout/tunnel_list.xml create mode 100644 res/layout/tunnel_list_item.xml create mode 100644 res/menu/main.xml create mode 100644 src/hu/blint/ssldroid/SSLDroidTunnelDetails.java create mode 100644 src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java create mode 100644 src/hu/blint/ssldroid/db/SSLDroidDbHelper.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 88ba21f..9b11f93 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -9,6 +9,8 @@ + diff --git a/bin/SSLDroid.apk b/bin/SSLDroid.apk index f25cb156f293e2f400b9b2cb24e8a6dc8f04b64c..237d209c8d98c27d9caad2c2087c56ca9b7114a9 100644 GIT binary patch delta 20215 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 B=*0j4 delta 12727 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 f@2p<3jkMt9z1q_xad=5d%}& literal 17760 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 diff --git a/bin/resources.ap_ b/bin/resources.ap_ index 728932ec56110613e7c08a9fe35f0ec185e49c17..ca8a129873013cfd7515870f42f2a6f9acf34187 100644 GIT binary patch delta 6381 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 delta 2971 zcmZuz3p|ur8$UCMF@{_-%@A2rZV8inLy;~Lg=lD%TgYYHR@U&+E~b*U-gM8ntk`67 zS7A~qZE`6!3F{V-N<<;acit)c?bm+i{r%@T&vX9I^PF>@_ndcbaB=;=;EGvGq+6NC z7-3tS-KX&YxRcO?C1j*xXJcrawZdBY&e-d*)deR@y&H0p-`idJZI3H~u-H4vmbf`k zjK1AlBFg#H?h>EW#fbG?@#21w_PWz`l`Mb5bnynIa0jYN)5BV$nDmy57A48cN8Lb@ zre`B=LV}z5$m@qyaxsS-yi?mXyXBT~TI${U#Y=P(UA>RGuV8y4-04l!#azI|vc?Zq={ZPo|%l*#hvojF(K#zVsAj5CWrywWRvmOrlmkwF&`NDit=2e ztKP{sajH7$Ew1H*_mR(jKUYr{wRYceu8eP1DH!hwAAGT6mSmZOSGhvg-c*@AWL#tu zLa7~GoA>_yPc|h}4UDWbBhw?U7w*J*?n%+_Gvuw@z$+Z)Hy^gC@Xh=blu=~2JAQpP zXL;`Z&%|+bdINhoU$*Mk#qZifOXIEC`pHj;+vml%spj|iZztmh9 zXtAdBtf%Ba{|J?Chp=^@FZ!HgiH|coQD(j0Bv)|s%v70SKnR6dZNQuz5uAV0v8}Zu zGu=K%fIB^$xlYez$CHDRzcLG&)vRWuX2PW$E)y!8?6(t>$%6HI*-9gXiqL>Z0rFP$d_pD!g%#}b%L zl#eg1%Fi`sxjt&uzL7r=QTNe(Yq#X)q3-jeU2gQD6Mt|`{;IO;iW^9qa_9Vcz2?ZV z{A))FwcdGqACc zqO;^q7uzVNdF_xz&)TVmOQvt7WOtp+wM!c|kIrmiT8VUtoJx%DRW=pr7U3p()rF}A z$>t?(tdlH8WavpUb#A?sF>&RzMDcbJ%UK2JDngC{2nkK3TJ(exK;gW5B z@v&idYH`%DE6!(wEah^wKg|xiWtgWeD;8H^yM}*^WL_DcJ0i7WjCZR|vtca86d@%bezrCDrlk0*=Dh|qn+1t;Ai*!d z<#7MQI7zNg`otcJ4L@?VPKIJy>~M9!QzF~=ujDytH~YcR;wjvxOc#fe!r+mcgaeZ) zwI+`Q!{O&&6G~lI8!msIK3yxZL6P-yjhwApho|1?RyWPbfT4p`HZ29#g*9#cIpY$F z1scpiM}0-~u0XV~^>UG!bKVUkXRPJ&xCIrYE&I zZ=C3TyRMJiJ>;Ic?><5iQwyocZMnvdtg-_E+52-B3@^+p(kH{lp{bD-2{wR zZ+UR?cRHJ;`Pj=+q~_|F%xtE=n+%V&CHr|qWc^^_y;eu2ciD7TM33t6@pbIfyT(_> z8|cWFN2;HXOIy|3_1v2|^{T!1R%JkgF^_*3IU2^1M%GVj#7}2j`aQtmut1E_q{1`k zd%tXO!rC;R8$MoA&Ng7=>VXSZ5^NgHSh zi1V?m@1m`LsHfAl%i*AW1=?M{lCqz_lg)$TC;@}VtP(c>_m`P*2Z_Q<)1Enbh3!(txF@ywkqCzkrSP+*W zx*(KbjHM7O@#y>tRdjGgCF-mdj9Y@%X(=LVAPR&5H4qE}K_u+^fl#Q0!CwH#Uje>;=&%oii)oi$P-|Oy}(_+IAem){E+|dZ|6I_#zu!vY; zqF}MYV2og4EI%j#_;+MOXeGj2SPiiHgu=RE*|9kr3 diff --git a/res/layout/main.xml b/res/layout/main.xml index de86a89..097bbb0 100644 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -3,27 +3,28 @@ android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:gravity="center"> - - - + android:gravity="center" + android:paddingLeft="10dip" + android:paddingRight="10dip"> + + + + - - - + + + + + + + + - - - - - \ No newline at end of file diff --git a/res/layout/tunnel_details.xml b/res/layout/tunnel_details.xml new file mode 100644 index 0000000..5abf36c --- /dev/null +++ b/res/layout/tunnel_details.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/tunnel_list.xml b/res/layout/tunnel_list.xml new file mode 100644 index 0000000..994f278 --- /dev/null +++ b/res/layout/tunnel_list.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/res/layout/tunnel_list_item.xml b/res/layout/tunnel_list_item.xml new file mode 100644 index 0000000..b0faba8 --- /dev/null +++ b/res/layout/tunnel_list_item.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/res/menu/main.xml b/res/menu/main.xml new file mode 100644 index 0000000..cfc1a96 --- /dev/null +++ b/res/menu/main.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 15e5ca6..b43a30f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3,11 +3,17 @@ Hello World, SSLDroidGui! SSLDroid Service Control - Local port to listen on - Remote host to connect to - Remote port to connect to - PKCS12 file to use for auth + Local port + Remote host + Remote port + PKCS12 file Apply - PKCS12 password + PKCS12 pass + Tunnel name + Add tunnel + Stop service + Start service + No tunnels configured yet + Delete tunnel diff --git a/src/hu/blint/ssldroid/SSLDroid.java b/src/hu/blint/ssldroid/SSLDroid.java index 0e3ff43..4a12e5e 100644 --- a/src/hu/blint/ssldroid/SSLDroid.java +++ b/src/hu/blint/ssldroid/SSLDroid.java @@ -3,75 +3,59 @@ package hu.blint.ssldroid; import hu.blint.ssldroid.TcpProxy; import android.app.*; import android.content.Intent; -import android.content.SharedPreferences; +import android.database.Cursor; import android.os.IBinder; import android.util.Log; -import android.widget.Toast; +import hu.blint.ssldroid.db.SSLDroidDbAdapter; public class SSLDroid extends Service { final String TAG = "SSLDroid"; - public static final String PREFS_NAME = "MyPrefsFile"; + public static final String PREFS_NAME = "SSLDroid"; TcpProxy tp[]; + private SSLDroidDbAdapter dbHelper; @Override public void onCreate() { - // Restore preferences - SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); - int settingLocalport = settings.getInt("0.localPort", 0); - String settingRemotehost = settings.getString("0.remoteHost", ""); - int settingRemoteport = settings.getInt("0.remotePort", 0); - String settingPkcsfile = settings.getString("0.pkcsFile", ""); - String settingPkcspass = settings.getString("0.pkcsPass", ""); - - int listenPort; - int targetPort; - String targetHost; - String keyFile; - String keyPass; - - if (settingLocalport!=0) - listenPort = settingLocalport; - else { - Toast.makeText(this, "Please set up local port first", Toast.LENGTH_LONG).show(); - return; - } - if (settingRemotehost!="") - targetHost = settingRemotehost; - else { - Toast.makeText(this, "Please set up remote host first", Toast.LENGTH_LONG).show(); - return; - } - if (settingRemoteport!=0) - targetPort = settingRemoteport; - else { - Toast.makeText(this, "Please set up remote port first", Toast.LENGTH_LONG).show(); - return; - } - if (settingPkcsfile!="") - keyFile = settingPkcsfile; - else { - Toast.makeText(this, "Please set up PKCS12 file first", Toast.LENGTH_LONG).show(); - return; - } - keyPass = settingPkcspass; + dbHelper = new SSLDroidDbAdapter(this); + dbHelper.open(); + Cursor cursor = dbHelper.fetchAllTunnels(); - //Toast.makeText(this, "SSLDroid Service Started", Toast.LENGTH_LONG).show(); - createNotification(0, true, "SSLDroid is running", listenPort+"->"+targetHost+":"+targetPort); - Log.d(TAG, "SSLDroid Service Started"); - - //createNotification("test", "This is a test of the emergency broadcast system"); - - tp = new TcpProxy[2]; - try { - tp[0] = new TcpProxy(); - tp[0].serve(listenPort, targetHost, targetPort, keyFile, keyPass); - tp[1] = new TcpProxy(); - tp[1].serve(9998, "imaps.balabit.hu", 993, keyFile, keyPass); - } catch (Exception e) { - Log.d(TAG, "Error:" + e.toString()); + int tunnelcount = cursor.getCount(); + + //skip start if the db is empty yet + if (tunnelcount == 0) + return; + + tp = new TcpProxy[tunnelcount]; + + int i; + for (i=0; i 0) { + rowId = id; + } + } else { + dbHelper.updateTunnel(rowId, sName, sLocalport, sRemotehost, sRemoteport, sPkcsfile, sPkcspass); + } + Log.d("SSLDroid", "Saving settings..."); + + //restart the service + stopService(new Intent(this, SSLDroid.class)); + startService(new Intent(this, SSLDroid.class)); + Log.d("SSLDroid", "Restarting service after settings save..."); + + } +} + diff --git a/src/hu/blint/ssldroid/TcpProxy.java b/src/hu/blint/ssldroid/TcpProxy.java index a928be4..510b966 100644 --- a/src/hu/blint/ssldroid/TcpProxy.java +++ b/src/hu/blint/ssldroid/TcpProxy.java @@ -68,5 +68,8 @@ public class TcpProxy { Log.d("SSLDroid", "Stopping service"); } + public boolean isAlive(){ + return ss.isBound(); + } } diff --git a/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java b/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java new file mode 100644 index 0000000..1e2d690 --- /dev/null +++ b/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java @@ -0,0 +1,109 @@ +package hu.blint.ssldroid.db; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; + +public class SSLDroidDbAdapter { + + // Database fields + public static final String KEY_ROWID = "_id"; + public static final String KEY_NAME = "name"; + public static final String KEY_LOCALPORT = "localport"; + public static final String KEY_REMOTEHOST = "remotehost"; + public static final String KEY_REMOTEPORT = "remoteport"; + public static final String KEY_PKCSFILE = "pkcsfile"; + public static final String KEY_PKCSPASS = "pkcspass"; + private static final String DATABASE_TABLE = "tunnels"; + private Context context; + private SQLiteDatabase database; + private SSLDroidDbHelper dbHelper; + + public SSLDroidDbAdapter(Context context) { + this.context = context; + } + + public SSLDroidDbAdapter open() throws SQLException { + dbHelper = new SSLDroidDbHelper(context); + database = dbHelper.getWritableDatabase(); + return this; + } + + public void close() { + dbHelper.close(); + database.close(); + } + + /** + * Create a new tunnel If the tunnel is successfully created return the new + * rowId for that note, otherwise return a -1 to indicate failure. + */ + public long createTunnel(String name, int localport, String remotehost, int remoteport, + String pkcsfile, String pkcspass) { + ContentValues initialValues = createContentValues(name, localport, remotehost, + remoteport, pkcsfile, pkcspass); + + return database.insert(DATABASE_TABLE, null, initialValues); + } + + /** + * Update the tunnel + */ + public boolean updateTunnel(long rowId, String name, int localport, String remotehost, + int remoteport, String pkcsfile, String pkcspass) { + ContentValues updateValues = createContentValues(name, localport, remotehost, + remoteport, pkcsfile, pkcspass); + + return database.update(DATABASE_TABLE, updateValues, KEY_ROWID + "=" + + rowId, null) > 0; + } + + /** + * Deletes tunnel + */ + public boolean deleteTunnel(long rowId) { + return database.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; + } + + /** + * Return a Cursor over the list of all tunnel in the database + * + * @return Cursor over all notes + */ + public Cursor fetchAllTunnels() { + return database.query(DATABASE_TABLE, new String[] { KEY_ROWID, + KEY_NAME, KEY_LOCALPORT, KEY_REMOTEHOST, KEY_REMOTEPORT, KEY_PKCSFILE, + KEY_PKCSPASS }, null, null, null, null, null); + } + + /** + * Return a Cursor positioned at the defined tunnel + */ + public Cursor fetchTunnel(long rowId) throws SQLException { + Cursor mCursor = database.query(true, DATABASE_TABLE, new String[] { + KEY_ROWID, KEY_NAME, KEY_LOCALPORT, KEY_REMOTEHOST, KEY_REMOTEPORT, + KEY_PKCSFILE, KEY_PKCSPASS }, + KEY_ROWID + "=" + rowId, null, null, null, null, null); + if (mCursor != null) { + mCursor.moveToFirst(); + } + return mCursor; + } + + private ContentValues createContentValues(String name, int localport, String remotehost, int remoteport, + String pkcsfile, String pkcspass) { + ContentValues values = new ContentValues(); + values.put(KEY_NAME, name); + values.put(KEY_LOCALPORT, localport); + values.put(KEY_REMOTEHOST, remotehost); + values.put(KEY_REMOTEPORT, remoteport); + values.put(KEY_REMOTEPORT, remoteport); + values.put(KEY_PKCSFILE, pkcsfile); + values.put(KEY_PKCSPASS, pkcspass); + return values; + } +} + + diff --git a/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java b/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java new file mode 100644 index 0000000..0d2446e --- /dev/null +++ b/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java @@ -0,0 +1,39 @@ +package hu.blint.ssldroid.db; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class SSLDroidDbHelper extends SQLiteOpenHelper { + private static final String DATABASE_NAME = "applicationdata"; + + private static final int DATABASE_VERSION = 1; + + // Database creation sql statement + private static final String DATABASE_CREATE = "create table tunnels (_id integer primary key autoincrement, " + + "name text not null, localport integer not null, remotehost text not null, " + + "remoteport integer not null, pkcsfile text not null, pkcspass text );"; + + public SSLDroidDbHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + // Method is called during creation of the database + @Override + public void onCreate(SQLiteDatabase database) { + database.execSQL(DATABASE_CREATE); + } + + // Method is called during an update of the database, e.g. if you increase + // the database version + @Override + public void onUpgrade(SQLiteDatabase database, int oldVersion, + int newVersion) { + /* Log.w(SSLDroidDbHelper.class.getName(), + "Upgrading database from version " + oldVersion + " to " + + newVersion + ", which will destroy all old data"); + database.execSQL("DROP TABLE IF EXISTS todo"); + onCreate(database); */ + } +} +