mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 19:22:14 -05:00
commit
d703a1cb0c
@ -36,6 +36,9 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns;
|
|||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class KeychainDatabase extends SQLiteOpenHelper {
|
public class KeychainDatabase extends SQLiteOpenHelper {
|
||||||
@ -179,10 +182,6 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
if (!db.isReadOnly()) {
|
if (!db.isReadOnly()) {
|
||||||
// Enable foreign key constraints
|
// Enable foreign key constraints
|
||||||
db.execSQL("PRAGMA foreign_keys=ON;");
|
db.execSQL("PRAGMA foreign_keys=ON;");
|
||||||
// TODO remove, once we remove the "always migrate" debug stuff
|
|
||||||
// db.execSQL("DROP TABLE user_ids;");
|
|
||||||
db.execSQL(CREATE_USER_IDS);
|
|
||||||
db.execSQL(CREATE_CERTS);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,7 +204,8 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
for(String db : dbs) {
|
for(String db : dbs) {
|
||||||
if(db.equals("apg.db")) {
|
if(db.equals("apg.db")) {
|
||||||
hasApgDb = true;
|
hasApgDb = true;
|
||||||
break;
|
} else if(db.equals("apg_old.db")) {
|
||||||
|
Log.d(Constants.TAG, "Found apg_old.db");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -283,9 +283,12 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move to a different file (but don't delete, just to be safe)
|
||||||
|
Log.d(Constants.TAG, "All done - moving apg.db to apg_old.db");
|
||||||
|
context.getDatabasePath("apg.db").renameTo(context.getDatabasePath("apg_old.db"));
|
||||||
|
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
Log.e(Constants.TAG, "Error importing apg db!", e);
|
Log.e(Constants.TAG, "Error importing apg.db!", e);
|
||||||
return;
|
|
||||||
} finally {
|
} finally {
|
||||||
if(c != null) {
|
if(c != null) {
|
||||||
c.close();
|
c.close();
|
||||||
@ -295,9 +298,45 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO delete old db, if we are sure this works
|
}
|
||||||
// context.deleteDatabase("apg.db");
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,16 @@ import android.os.Bundle;
|
|||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import com.devspark.appmsg.AppMsg;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
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 {
|
public class KeyListActivity extends DrawerActivity {
|
||||||
|
|
||||||
@ -46,6 +53,12 @@ public class KeyListActivity extends DrawerActivity {
|
|||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
super.onCreateOptionsMenu(menu);
|
super.onCreateOptionsMenu(menu);
|
||||||
getMenuInflater().inflate(R.menu.key_list, 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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +81,27 @@ public class KeyListActivity extends DrawerActivity {
|
|||||||
mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
|
mExportHelper.showExportKeysDialog(null, Constants.Path.APP_DIR_FILE, true);
|
||||||
return 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:
|
default:
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
@ -31,4 +31,16 @@
|
|||||||
app:showAsAction="never"
|
app:showAsAction="never"
|
||||||
android:title="@string/menu_create_key_expert" />
|
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>
|
</menu>
|
||||||
|
Loading…
Reference in New Issue
Block a user