aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-09-09 09:26:03 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-09-09 09:26:03 +0200
commit7c67f7a7154cc4da2c53aeb338d9bff2cbc3985a (patch)
treee87d4c549dc44906ebbb75a60b3f3937a19c8282 /OpenKeychain/src/main/java
parentc344158c3789180d9ca273f59e32076c6ae81272 (diff)
downloadopen-keychain-7c67f7a7154cc4da2c53aeb338d9bff2cbc3985a.tar.gz
open-keychain-7c67f7a7154cc4da2c53aeb338d9bff2cbc3985a.tar.bz2
open-keychain-7c67f7a7154cc4da2c53aeb338d9bff2cbc3985a.zip
Consolidate on database upgrade
Diffstat (limited to 'OpenKeychain/src/main/java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java22
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java18
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileImportCache.java)13
7 files changed, 52 insertions, 27 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
index b435b886d..67b172200 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java
@@ -104,8 +104,8 @@ public class KeychainApplication extends Application {
*/
public void checkConsolidateRecovery() {
if (Preferences.getPreferences(this).getCachedConsolidate()) {
- // do something which calls ProviderHelper.consolidateDatabaseStep2 with a progressable
Intent consolidateIntent = new Intent(this, ConsolidateDialogActivity.class);
+ consolidateIntent.putExtra(ConsolidateDialogActivity.EXTRA_CONSOLIDATE_RECOVERY, true);
consolidateIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(consolidateIntent);
}
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 0bb43d47f..4d62f67a9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java
@@ -19,6 +19,7 @@
package org.sufficientlysecure.keychain.provider;
import android.content.Context;
+import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
@@ -33,6 +34,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingsColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeysColumns;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns;
+import org.sufficientlysecure.keychain.ui.ConsolidateDialogActivity;
import org.sufficientlysecure.keychain.util.Log;
import java.io.File;
@@ -52,8 +54,9 @@ import java.io.IOException;
*/
public class KeychainDatabase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "openkeychain.db";
- private static final int DATABASE_VERSION = 3;
+ private static final int DATABASE_VERSION = 4;
static Boolean apgHack = false;
+ private Context mContext;
public interface Tables {
String KEY_RINGS_PUBLIC = "keyrings_public";
@@ -164,6 +167,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
KeychainDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ mContext = context;
// make sure this is only done once, on the first instance!
boolean iAmIt = false;
@@ -203,21 +207,35 @@ public class KeychainDatabase extends SQLiteOpenHelper {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // add has_secret for all who are upgrading from a beta version
+ Log.d(Constants.TAG, "Upgrading db from " + oldVersion + " to " + newVersion);
+
switch (oldVersion) {
case 1:
+ // add has_secret for all who are upgrading from a beta version
try {
db.execSQL("ALTER TABLE keys ADD COLUMN has_secret BOOLEAN");
} catch(Exception e){
// never mind, the column probably already existed
}
+ // fall through
case 2:
+ // ECC support
try {
db.execSQL("ALTER TABLE keys ADD COLUMN " + KeysColumns.KEY_CURVE_OID + " TEXT");
} catch(Exception e){
// never mind, the column probably already existed
}
+ // fall through
+ case 3:
+ // better s2k detection, we need consolidate
+ // fall through
}
+
+ // always do consolidate after upgrade
+ Intent consolidateIntent = new Intent(mContext.getApplicationContext(), ConsolidateDialogActivity.class);
+ consolidateIntent.putExtra(ConsolidateDialogActivity.EXTRA_CONSOLIDATE_RECOVERY, false);
+ consolidateIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.getApplicationContext().startActivity(consolidateIntent);
}
/** This method tries to import data from a provided database.
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index 186a0fc88..af7bdb139 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -59,7 +59,7 @@ import org.sufficientlysecure.keychain.service.OperationResultParcel.LogType;
import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog;
import org.sufficientlysecure.keychain.service.OperationResults.ConsolidateResult;
import org.sufficientlysecure.keychain.service.OperationResults.SaveKeyringResult;
-import org.sufficientlysecure.keychain.util.FileImportCache;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache;
import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressFixedScaler;
@@ -889,8 +889,8 @@ public class ProviderHelper {
Preferences.getPreferences(mContext).setCachedConsolidateNumSecrets(cursor.getCount());
- FileImportCache<ParcelableKeyRing> cache =
- new FileImportCache<ParcelableKeyRing>(mContext, "consolidate_secret.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cache =
+ new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_secret.pcl");
cache.writeCache(new Iterator<ParcelableKeyRing>() {
ParcelableKeyRing ring;
@@ -951,8 +951,8 @@ public class ProviderHelper {
Preferences.getPreferences(mContext).setCachedConsolidateNumPublics(cursor.getCount());
- FileImportCache<ParcelableKeyRing> cache =
- new FileImportCache<ParcelableKeyRing>(mContext, "consolidate_public.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cache =
+ new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_public.pcl");
cache.writeCache(new Iterator<ParcelableKeyRing>() {
ParcelableKeyRing ring;
@@ -1041,10 +1041,10 @@ public class ProviderHelper {
log(LogLevel.DEBUG, LogType.MSG_CON_DB_CLEAR);
mContentResolver.delete(KeyRings.buildUnifiedKeyRingsUri(), null, null);
- FileImportCache<ParcelableKeyRing> cacheSecret =
- new FileImportCache<ParcelableKeyRing>(mContext, "consolidate_secret.pcl");
- FileImportCache<ParcelableKeyRing> cachePublic =
- new FileImportCache<ParcelableKeyRing>(mContext, "consolidate_public.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cacheSecret =
+ new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_secret.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cachePublic =
+ new ParcelableFileCache<ParcelableKeyRing>(mContext, "consolidate_public.pcl");
// 3. Re-Import secret keyrings from cache
if (numSecrets > 0) try {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index b9746aee5..08f51d692 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -61,7 +61,7 @@ import org.sufficientlysecure.keychain.service.OperationResults.ConsolidateResul
import org.sufficientlysecure.keychain.service.OperationResults.EditKeyResult;
import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;
import org.sufficientlysecure.keychain.service.OperationResults.SaveKeyringResult;
-import org.sufficientlysecure.keychain.util.FileImportCache;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ProgressScaler;
@@ -512,8 +512,8 @@ public class KeychainIntentService extends IntentService implements Progressable
entries = data.getParcelableArrayList(IMPORT_KEY_LIST);
} else {
// get entries from cached file
- FileImportCache<ParcelableKeyRing> cache =
- new FileImportCache<ParcelableKeyRing>(this, "key_import.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cache =
+ new ParcelableFileCache<ParcelableKeyRing>(this, "key_import.pcl");
entries = cache.readCacheIntoList();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
index edc05e28d..0d8905c5b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
@@ -34,17 +34,20 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
*/
public class ConsolidateDialogActivity extends FragmentActivity {
+ public static final String EXTRA_CONSOLIDATE_RECOVERY = "consolidate_recovery";
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this activity itself has no content view (see manifest)
- consolidateRecovery();
+ boolean recovery = getIntent().getBooleanExtra(EXTRA_CONSOLIDATE_RECOVERY, false);
+ consolidateRecovery(recovery);
}
- private void consolidateRecovery() {
+ private void consolidateRecovery(boolean recovery) {
// Message is received after importing is done in KeychainIntentService
KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(
this,
@@ -81,7 +84,7 @@ public class ConsolidateDialogActivity extends FragmentActivity {
// fill values for this action
Bundle data = new Bundle();
- data.putBoolean(KeychainIntentService.CONSOLIDATE_RECOVERY, true);
+ data.putBoolean(KeychainIntentService.CONSOLIDATE_RECOVERY, recovery);
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
// Create a new Messenger for the communication back
@@ -93,7 +96,6 @@ public class ConsolidateDialogActivity extends FragmentActivity {
// start service with intent
startService(intent);
-
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index f74e4fdd6..3e949cfae 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -19,8 +19,6 @@ package org.sufficientlysecure.keychain.ui;
import android.annotation.TargetApi;
import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
@@ -52,7 +50,7 @@ import org.sufficientlysecure.keychain.service.OperationResultParcel;
import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;
-import org.sufficientlysecure.keychain.util.FileImportCache;
+import org.sufficientlysecure.keychain.util.ParcelableFileCache;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Notify;
@@ -505,8 +503,8 @@ public class ImportKeysActivity extends ActionBarActivity {
// to prevent Java Binder problems on heavy imports
// read FileImportCache for more info.
try {
- FileImportCache<ParcelableKeyRing> cache =
- new FileImportCache<ParcelableKeyRing>(this, "key_import.pcl");
+ ParcelableFileCache<ParcelableKeyRing> cache =
+ new ParcelableFileCache<ParcelableKeyRing>(this, "key_import.pcl");
cache.writeCache(selectedEntries);
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileImportCache.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
index 09275fc95..111bf0124 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FileImportCache.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
@@ -29,6 +29,7 @@ import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
@@ -42,13 +43,13 @@ import java.util.List;
* To overcome this problem, we cache large Parcelables into a file in our private cache directory
* instead of sending them through IPC.
*/
-public class FileImportCache<E extends Parcelable> {
+public class ParcelableFileCache<E extends Parcelable> {
private Context mContext;
private final String mFilename;
- public FileImportCache(Context context, String filename) {
+ public ParcelableFileCache(Context context, String filename) {
mContext = context;
mFilename = filename;
}
@@ -104,7 +105,13 @@ public class FileImportCache<E extends Parcelable> {
}
final File tempFile = new File(cacheDir, mFilename);
- final DataInputStream ois = new DataInputStream(new FileInputStream(tempFile));
+ final DataInputStream ois;
+ try {
+ ois = new DataInputStream(new FileInputStream(tempFile));
+ } catch (FileNotFoundException e) {
+ Log.e(Constants.TAG, "parcel import file not existing", e);
+ throw new IOException(e);
+ }
return new Iterator<E>() {