aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-04-11 20:25:50 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-04-14 13:06:49 +0200
commit227155d484766a620a2f9467a248c844fca26382 (patch)
tree736238cd070ae89774dfdb9939095c37d60dd01a
parente02e9e6707612db592fdfb3ae834fef5cbb0def0 (diff)
downloadopen-keychain-227155d484766a620a2f9467a248c844fca26382.tar.gz
open-keychain-227155d484766a620a2f9467a248c844fca26382.tar.bz2
open-keychain-227155d484766a620a2f9467a248c844fca26382.zip
add debug backup/restore options to main menu
Closes #543
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java45
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java34
-rw-r--r--OpenKeychain/src/main/res/menu/key_list.xml12
3 files changed, 90 insertions, 1 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
index b3165d347..80fa914b2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -36,6 +36,9 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
import org.sufficientlysecure.keychain.util.Log;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
public class KeychainDatabase extends SQLiteOpenHelper {
@@ -210,7 +213,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
}
}
- if(!hasApgDb)
+ if(!hasApgDb || true)
return;
Log.d(Constants.TAG, "apg.db exists! Importing...");
@@ -300,4 +303,44 @@ public class KeychainDatabase extends SQLiteOpenHelper {
Log.d(Constants.TAG, "All done, (not) deleting apg.db");
}
+
+ private static void copy(File in, File out) throws IOException {
+ FileInputStream ss = new FileInputStream(in);
+ FileOutputStream ds = new FileOutputStream(out);
+ byte[] buf = new byte[512];
+ while(ss.available() > 0) {
+ int count = ss.read(buf, 0, 512);
+ ds.write(buf, 0, count);
+ }
+ }
+
+ public static void debugRead(Context context) throws IOException {
+ if(!Constants.DEBUG) {
+ return;
+ }
+ File in = context.getDatabasePath("debug.db");
+ File out = context.getDatabasePath("openkeychain.db");
+ if(!in.canRead()) {
+ throw new IOException("Cannot read " + in.getName());
+ }
+ if(!out.canRead()) {
+ throw new IOException("Cannot write " + out.getName());
+ }
+ copy(in, out);
+ }
+
+ public static void debugWrite(Context context) throws IOException {
+ if(!Constants.DEBUG) {
+ return;
+ }
+ File in = context.getDatabasePath("openkeychain.db");
+ File out = context.getDatabasePath("debug.db");
+ if(!in.canRead()) {
+ throw new IOException("Cannot read " + in.getName());
+ }
+ if(!out.canRead()) {
+ throw new IOException("Cannot write " + out.getName());
+ }
+ copy(in, out);
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
index 8db643583..de16142d6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java
@@ -22,9 +22,16 @@ import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
+import com.devspark.appmsg.AppMsg;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ExportHelper;
+import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.provider.KeychainDatabase;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.io.IOException;
public class KeyListActivity extends DrawerActivity {
@@ -46,6 +53,12 @@ public class KeyListActivity extends DrawerActivity {
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.key_list, menu);
+
+ if(Constants.DEBUG) {
+ menu.findItem(R.id.menu_key_list_debug_read).setVisible(true);
+ menu.findItem(R.id.menu_key_list_debug_write).setVisible(true);
+ }
+
return true;
}
@@ -68,6 +81,27 @@ public class KeyListActivity extends DrawerActivity {
mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
return true;
+ case R.id.menu_key_list_debug_read:
+ try {
+ KeychainDatabase.debugRead(this);
+ AppMsg.makeText(this, "Restored from backup", AppMsg.STYLE_CONFIRM).show();
+ getContentResolver().notifyChange(KeychainContract.KeyRings.CONTENT_URI, null);
+ } catch(IOException e) {
+ Log.e(Constants.TAG, "IO Error", e);
+ AppMsg.makeText(this, "IO Error: " + e.getMessage(), AppMsg.STYLE_ALERT).show();
+ }
+ return true;
+
+ case R.id.menu_key_list_debug_write:
+ try {
+ KeychainDatabase.debugWrite(this);
+ AppMsg.makeText(this, "Backup successful", AppMsg.STYLE_CONFIRM).show();
+ } catch(IOException e) {
+ Log.e(Constants.TAG, "IO Error", e);
+ AppMsg.makeText(this, "IO Error: " + e.getMessage(), AppMsg.STYLE_ALERT).show();
+ }
+ return true;
+
default:
return super.onOptionsItemSelected(item);
}
diff --git a/OpenKeychain/src/main/res/menu/key_list.xml b/OpenKeychain/src/main/res/menu/key_list.xml
index 3f80b616d..ebb7314b8 100644
--- a/OpenKeychain/src/main/res/menu/key_list.xml
+++ b/OpenKeychain/src/main/res/menu/key_list.xml
@@ -31,4 +31,16 @@
app:showAsAction="never"
android:title="@string/menu_create_key_expert" />
+ <item
+ android:id="@+id/menu_key_list_debug_read"
+ app:showAsAction="never"
+ android:title="Debug / DB restore"
+ android:visible="false" />
+
+ <item
+ android:id="@+id/menu_key_list_debug_write"
+ app:showAsAction="never"
+ android:title="Debug / DB backup"
+ android:visible="false" />
+
</menu>