From 8e3cd92b69210579c1a88b94d25c5fa193fd547b Mon Sep 17 00:00:00 2001 From: Balint Kovacs Date: Wed, 19 Oct 2011 11:44:43 +0200 Subject: [PATCH] Implemented explicit stop feature - stops the service until it is started manually Signed-off-by: Balint Kovacs --- AndroidManifest.xml | 1 + default.properties | 2 +- res/menu/main.xml | 8 ++- res/raw/tunnels.xsd | 57 ------------------- res/values/strings.xml | 3 + .../blint/ssldroid/BootStartupReceiver.java | 30 +++++++++- .../blint/ssldroid/NetworkChangeReceiver.java | 28 ++++++++- src/hu/blint/ssldroid/SSLDroid.java | 3 +- src/hu/blint/ssldroid/SSLDroidGui.java | 21 ++++++- .../blint/ssldroid/SSLDroidTunnelDetails.java | 10 ++-- .../blint/ssldroid/db/SSLDroidDbAdapter.java | 29 +++++++++- .../blint/ssldroid/db/SSLDroidDbHelper.java | 16 +++--- 12 files changed, 130 insertions(+), 78 deletions(-) delete mode 100644 res/raw/tunnels.xsd diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 54dabc4..feffde2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -12,6 +12,7 @@ + diff --git a/default.properties b/default.properties index 46769a7..e2e8061 100644 --- a/default.properties +++ b/default.properties @@ -8,4 +8,4 @@ # project structure. # Project target. -target=android-7 +target=android-8 diff --git a/res/menu/main.xml b/res/menu/main.xml index 198fd78..38841bb 100644 --- a/res/menu/main.xml +++ b/res/menu/main.xml @@ -1,8 +1,10 @@ - - - + + + + + diff --git a/res/raw/tunnels.xsd b/res/raw/tunnels.xsd deleted file mode 100644 index ae2bd67..0000000 --- a/res/raw/tunnels.xsd +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - A container to group tunnel settings. - - - - - - - - The schema version of the tunnel setting. - The current version is '1'. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The name of the tunnel. - - - - - diff --git a/res/values/strings.xml b/res/values/strings.xml index cab3e48..ac7d72f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11,6 +11,7 @@ Tunnel name Add tunnel Stop service + Stop service until started Start service No tunnels configured yet Delete tunnel @@ -18,6 +19,8 @@ No SD card present, please insert one to continue Read logs Reading log messages... + Provisioning + Please enter the URL for remote XML configuration Back Refresh diff --git a/src/hu/blint/ssldroid/BootStartupReceiver.java b/src/hu/blint/ssldroid/BootStartupReceiver.java index 92f12d0..8ce7a05 100644 --- a/src/hu/blint/ssldroid/BootStartupReceiver.java +++ b/src/hu/blint/ssldroid/BootStartupReceiver.java @@ -1,16 +1,44 @@ package hu.blint.ssldroid; +import hu.blint.ssldroid.db.SSLDroidDbAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.database.Cursor; +import android.util.Log; public class BootStartupReceiver extends BroadcastReceiver { + + private boolean isStopped(Context context){ + Boolean stopped = false; + SSLDroidDbAdapter dbHelper; + dbHelper = new SSLDroidDbAdapter(context); + dbHelper.open(); + Cursor cursor = dbHelper.getStopStatus(); + + int tunnelcount = cursor.getCount(); + Log.d("SSLDroid", "Tunnelcount: "+tunnelcount); + + //don't start if the stop status field is available + if (tunnelcount != 0){ + stopped = true; + } + + cursor.close(); + dbHelper.close(); + + return stopped; + } + @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent i = new Intent(); i.setAction("hu.blint.ssldroid.SSLDroid"); - context.startService(i); + if (!isStopped(context)) + context.startService(i); + else + Log.w("SSLDroid", "Not starting service as directed by explicit stop"); } } } \ No newline at end of file diff --git a/src/hu/blint/ssldroid/NetworkChangeReceiver.java b/src/hu/blint/ssldroid/NetworkChangeReceiver.java index 1722000..63c683e 100644 --- a/src/hu/blint/ssldroid/NetworkChangeReceiver.java +++ b/src/hu/blint/ssldroid/NetworkChangeReceiver.java @@ -1,14 +1,37 @@ package hu.blint.ssldroid; +import hu.blint.ssldroid.db.SSLDroidDbAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; public class NetworkChangeReceiver extends BroadcastReceiver { + private boolean isStopped(Context context){ + Boolean stopped = false; + SSLDroidDbAdapter dbHelper; + dbHelper = new SSLDroidDbAdapter(context); + dbHelper.open(); + Cursor cursor = dbHelper.getStopStatus(); + + int tunnelcount = cursor.getCount(); + Log.d("SSLDroid", "Tunnelcount: "+tunnelcount); + + //don't start if the stop status field is available + if (tunnelcount != 0){ + stopped = true; + } + + cursor.close(); + dbHelper.close(); + + return stopped; + } + @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE ); @@ -24,7 +47,10 @@ public class NetworkChangeReceiver extends BroadcastReceiver { Intent i = new Intent(); i.setAction("hu.blint.ssldroid.SSLDroid"); context.stopService(i); - context.startService(i); + if (!isStopped(context)) + context.startService(i); + else + Log.w("SSLDroid", "Not starting service as directed by explicit stop"); } } } diff --git a/src/hu/blint/ssldroid/SSLDroid.java b/src/hu/blint/ssldroid/SSLDroid.java index d9d2101..5335e88 100644 --- a/src/hu/blint/ssldroid/SSLDroid.java +++ b/src/hu/blint/ssldroid/SSLDroid.java @@ -4,6 +4,7 @@ import hu.blint.ssldroid.TcpProxy; import android.app.*; import android.content.Intent; import android.database.Cursor; +import android.os.Bundle; import android.os.IBinder; import android.util.Log; import hu.blint.ssldroid.db.SSLDroidDbAdapter; @@ -71,7 +72,7 @@ public class SSLDroid extends Service { @Override public IBinder onBind(Intent intent) { - return null; + return null; } @Override diff --git a/src/hu/blint/ssldroid/SSLDroidGui.java b/src/hu/blint/ssldroid/SSLDroidGui.java index 9dc650c..d158aaf 100644 --- a/src/hu/blint/ssldroid/SSLDroidGui.java +++ b/src/hu/blint/ssldroid/SSLDroidGui.java @@ -54,8 +54,14 @@ public class SSLDroidGui extends ListActivity { Log.d("SSLDroid", "Stopping service"); stopService(new Intent(this, SSLDroid.class)); return true; + case R.id.stopserviceforgood: + Log.d("SSLDroid", "Stopping service until explicitly started"); + dbHelper.setStopStatus(); + stopService(new Intent(this, SSLDroid.class)); + return true; case R.id.startservice: Log.d("SSLDroid", "Starting service"); + dbHelper.delStopStatus(); startService(new Intent(this, SSLDroid.class)); return true; case R.id.readlogs: @@ -75,8 +81,14 @@ public class SSLDroidGui extends ListActivity { Log.d("SSLDroid", "Stopping service"); stopService(new Intent(this, SSLDroid.class)); return true; + case R.id.stopserviceforgood: + Log.d("SSLDroid", "Stopping service until explicitly started"); + dbHelper.setStopStatus(); + stopService(new Intent(this, SSLDroid.class)); + return true; case R.id.startservice: Log.d("SSLDroid", "Starting service"); + dbHelper.delStopStatus(); startService(new Intent(this, SSLDroid.class)); return true; case R.id.readlogs: @@ -124,7 +136,6 @@ public class SSLDroidGui extends ListActivity { Intent i = new Intent(this, SSLDroidTunnelDetails.class); i.putExtra(SSLDroidDbAdapter.KEY_ROWID, id); // Activity returns an result if called with startActivityForResult - startActivityForResult(i, ACTIVITY_EDIT); } @@ -159,4 +170,12 @@ public class SSLDroidGui extends ListActivity { super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, DELETE_ID, 0, R.string.menu_delete); } + + @Override + public void onDestroy (){ + cursor.close(); + dbHelper.close(); + super.onDestroy(); + } + } diff --git a/src/hu/blint/ssldroid/SSLDroidTunnelDetails.java b/src/hu/blint/ssldroid/SSLDroidTunnelDetails.java index fd1ced1..b2ba62f 100644 --- a/src/hu/blint/ssldroid/SSLDroidTunnelDetails.java +++ b/src/hu/blint/ssldroid/SSLDroidTunnelDetails.java @@ -83,12 +83,12 @@ public class SSLDroidTunnelDetails extends Activity { confirmButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { if (name.getText().length() == 0) { - Toast.makeText(getBaseContext(), "Required tunnel name parameter not setup, skipping save", Toast.LENGTH_LONG).show(); + Toast.makeText(getBaseContext(), "Required tunnel name parameter not set up, skipping save", Toast.LENGTH_LONG).show(); return; } //local port validation if (localport.getText().length() == 0) { - Toast.makeText(getBaseContext(), "Required local port parameter not setup, skipping save", Toast.LENGTH_LONG).show(); + Toast.makeText(getBaseContext(), "Required local port parameter not set up, skipping save", Toast.LENGTH_LONG).show(); return; } else { @@ -120,7 +120,7 @@ public class SSLDroidTunnelDetails extends Activity { } //remote host validation if (remotehost.getText().length() == 0) { - Toast.makeText(getBaseContext(), "Required remote host parameter not setup, skipping save", Toast.LENGTH_LONG).show(); + Toast.makeText(getBaseContext(), "Required remote host parameter not set up, skipping save", Toast.LENGTH_LONG).show(); return; } else { @@ -137,7 +137,7 @@ public class SSLDroidTunnelDetails extends Activity { } //remote port validation if (remoteport.getText().length() == 0) { - Toast.makeText(getBaseContext(), "Required remote port parameter not setup, skipping save", Toast.LENGTH_LONG).show(); + Toast.makeText(getBaseContext(), "Required remote port parameter not set up, skipping save", Toast.LENGTH_LONG).show(); return; } else { @@ -155,7 +155,7 @@ public class SSLDroidTunnelDetails extends Activity { } } if (pkcsfile.getText().length() == 0) { - Toast.makeText(getBaseContext(), "Required PKCS12 file parameter not setup, skipping save", Toast.LENGTH_LONG).show(); + Toast.makeText(getBaseContext(), "Required PKCS12 file parameter not set up, skipping save", Toast.LENGTH_LONG).show(); return; } else { diff --git a/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java b/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java index d218fb1..5e8b481 100644 --- a/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java +++ b/src/hu/blint/ssldroid/db/SSLDroidDbAdapter.java @@ -16,7 +16,10 @@ public class SSLDroidDbAdapter { public static final String KEY_REMOTEPORT = "remoteport"; public static final String KEY_PKCSFILE = "pkcsfile"; public static final String KEY_PKCSPASS = "pkcspass"; + public static final String KEY_STATUS_NAME = "name"; + public static final String KEY_STATUS_VALUE = "value"; private static final String DATABASE_TABLE = "tunnels"; + private static final String STATUS_TABLE = "status"; private Context context; private SQLiteDatabase database; private SSLDroidDbHelper dbHelper; @@ -93,6 +96,30 @@ public class SSLDroidDbAdapter { /** * Return a Cursor positioned at the defined tunnel */ + public Cursor fetchStatus(String valuename) throws SQLException { + return database.query(STATUS_TABLE, new String[] { + KEY_STATUS_NAME, KEY_STATUS_VALUE + }, + KEY_STATUS_NAME + "='" + valuename + "'", null, null, null, null); + } + + public Cursor getStopStatus() { + return fetchStatus("stopped"); + } + + public boolean setStopStatus() { + ContentValues stopStatus = new ContentValues(); + stopStatus.put(KEY_STATUS_NAME, "stopped"); + stopStatus.put(KEY_STATUS_VALUE, "yes"); + if (getStopStatus().getCount() == 0) + database.insert(STATUS_TABLE, null, stopStatus); + return true; + } + + public boolean delStopStatus() { + return database.delete(STATUS_TABLE, KEY_STATUS_NAME+"= 'stopped'", null) > 0; + } + 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, @@ -104,7 +131,7 @@ public class SSLDroidDbAdapter { } return mCursor; } - + private ContentValues createContentValues(String name, int localport, String remotehost, int remoteport, String pkcsfile, String pkcspass) { ContentValues values = new ContentValues(); diff --git a/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java b/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java index 1d14746..80ab47d 100644 --- a/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java +++ b/src/hu/blint/ssldroid/db/SSLDroidDbHelper.java @@ -3,16 +3,17 @@ package hu.blint.ssldroid.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; public class SSLDroidDbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "applicationdata"; - - private static final int DATABASE_VERSION = 1; + private static final int DATABASE_VERSION = 2; // Database creation sql statement - private static final String DATABASE_CREATE = "create table tunnels (_id integer primary key autoincrement, " + private static final String DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS 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 );"; + private static final String STATUS_CREATE = "CREATE TABLE IF NOT EXISTS status (name text, value text);"; public SSLDroidDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); @@ -22,6 +23,7 @@ public class SSLDroidDbHelper extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE); + database.execSQL(STATUS_CREATE); } // Method is called during an update of the database, e.g. if you increase @@ -29,11 +31,11 @@ public class SSLDroidDbHelper extends SQLiteOpenHelper { @Override public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { - /* Log.w(SSLDroidDbHelper.class.getName(), + 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); */ + + newVersion + ", which will add a status table"); + database.execSQL("CREATE TABLE IF NOT EXISTS status (name text, value text);"); + onCreate(database); } }