clean up KeychainDatabase a bit
This commit is contained in:
@@ -152,7 +152,7 @@ public class AndroidTestHelpers {
|
|||||||
|
|
||||||
public static void cleanupForTests(Context context) throws Exception {
|
public static void cleanupForTests(Context context) throws Exception {
|
||||||
|
|
||||||
new KeychainDatabase(context).clearDatabase();
|
KeychainDatabase.getInstance(context).clearDatabase();
|
||||||
|
|
||||||
// import these two, make sure they're there
|
// import these two, make sure they're there
|
||||||
importKeysFromResource(context, "x.sec.asc");
|
importKeysFromResource(context, "x.sec.asc");
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class EditKeyTest {
|
|||||||
public void test01Edit() throws Exception {
|
public void test01Edit() throws Exception {
|
||||||
Activity activity = mActivity.getActivity();
|
Activity activity = mActivity.getActivity();
|
||||||
|
|
||||||
new KeychainDatabase(activity).clearDatabase();
|
KeychainDatabase.getInstance(activity).clearDatabase();
|
||||||
|
|
||||||
// import key for testing, get a stable initial state
|
// import key for testing, get a stable initial state
|
||||||
importKeysFromResource(activity, "x.sec.asc");
|
importKeysFromResource(activity, "x.sec.asc");
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class CertificationDao {
|
|||||||
private final DatabaseNotifyManager databaseNotifyManager;
|
private final DatabaseNotifyManager databaseNotifyManager;
|
||||||
|
|
||||||
public static CertificationDao getInstance(Context context) {
|
public static CertificationDao getInstance(Context context) {
|
||||||
KeychainDatabase keychainDatabase = new KeychainDatabase(context);
|
KeychainDatabase keychainDatabase = KeychainDatabase.getInstance(context);
|
||||||
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
||||||
|
|
||||||
return new CertificationDao(keychainDatabase.getWritableDatabase(), databaseNotifyManager);
|
return new CertificationDao(keychainDatabase.getWritableDatabase(), databaseNotifyManager);
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ import org.sufficientlysecure.keychain.model.ApiApp;
|
|||||||
|
|
||||||
public class ApiAppDao extends AbstractDao {
|
public class ApiAppDao extends AbstractDao {
|
||||||
public static ApiAppDao getInstance(Context context) {
|
public static ApiAppDao getInstance(Context context) {
|
||||||
KeychainDatabase keychainDatabase = new KeychainDatabase(context);
|
KeychainDatabase keychainDatabase = KeychainDatabase.getInstance(context);
|
||||||
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
||||||
|
|
||||||
return new ApiAppDao(keychainDatabase, databaseNotifyManager);
|
return new ApiAppDao(keychainDatabase, databaseNotifyManager);
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import org.sufficientlysecure.keychain.model.AutocryptPeer.GossipOrigin;
|
|||||||
|
|
||||||
public class AutocryptPeerDao extends AbstractDao {
|
public class AutocryptPeerDao extends AbstractDao {
|
||||||
public static AutocryptPeerDao getInstance(Context context) {
|
public static AutocryptPeerDao getInstance(Context context) {
|
||||||
KeychainDatabase keychainDatabase = new KeychainDatabase(context);
|
KeychainDatabase keychainDatabase = KeychainDatabase.getInstance(context);
|
||||||
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
||||||
|
|
||||||
return new AutocryptPeerDao(keychainDatabase, databaseNotifyManager);
|
return new AutocryptPeerDao(keychainDatabase, databaseNotifyManager);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.sufficientlysecure.keychain.model.KeyMetadata;
|
|||||||
|
|
||||||
public class KeyMetadataDao extends AbstractDao {
|
public class KeyMetadataDao extends AbstractDao {
|
||||||
public static KeyMetadataDao create(Context context) {
|
public static KeyMetadataDao create(Context context) {
|
||||||
KeychainDatabase database = new KeychainDatabase(context);
|
KeychainDatabase database = KeychainDatabase.getInstance(context);
|
||||||
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
||||||
|
|
||||||
return new KeyMetadataDao(database, databaseNotifyManager);
|
return new KeyMetadataDao(database, databaseNotifyManager);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public class KeyRepository extends AbstractDao {
|
|||||||
ContentResolver contentResolver = context.getContentResolver();
|
ContentResolver contentResolver = context.getContentResolver();
|
||||||
LocalPublicKeyStorage localPublicKeyStorage = LocalPublicKeyStorage.getInstance(context);
|
LocalPublicKeyStorage localPublicKeyStorage = LocalPublicKeyStorage.getInstance(context);
|
||||||
LocalSecretKeyStorage localSecretKeyStorage = LocalSecretKeyStorage.getInstance(context);
|
LocalSecretKeyStorage localSecretKeyStorage = LocalSecretKeyStorage.getInstance(context);
|
||||||
KeychainDatabase database = new KeychainDatabase(context);
|
KeychainDatabase database = KeychainDatabase.getInstance(context);
|
||||||
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
||||||
|
|
||||||
return new KeyRepository(contentResolver, database, databaseNotifyManager, localPublicKeyStorage, localSecretKeyStorage);
|
return new KeyRepository(contentResolver, database, databaseNotifyManager, localPublicKeyStorage, localSecretKeyStorage);
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class KeyWritableRepository extends KeyRepository {
|
|||||||
LocalSecretKeyStorage localSecretKeyStorage = LocalSecretKeyStorage.getInstance(context);
|
LocalSecretKeyStorage localSecretKeyStorage = LocalSecretKeyStorage.getInstance(context);
|
||||||
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
|
||||||
AutocryptPeerDao autocryptPeerDao = AutocryptPeerDao.getInstance(context);
|
AutocryptPeerDao autocryptPeerDao = AutocryptPeerDao.getInstance(context);
|
||||||
KeychainDatabase database = new KeychainDatabase(context);
|
KeychainDatabase database = KeychainDatabase.getInstance(context);
|
||||||
|
|
||||||
return new KeyWritableRepository(context, database,
|
return new KeyWritableRepository(context, database,
|
||||||
localPublicKeyStorage, localSecretKeyStorage, databaseNotifyManager, autocryptPeerDao);
|
localPublicKeyStorage, localSecretKeyStorage, databaseNotifyManager, autocryptPeerDao);
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import android.content.Context;
|
|||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.SQLException;
|
import android.database.SQLException;
|
||||||
import android.database.sqlite.SQLiteException;
|
import android.database.sqlite.SQLiteException;
|
||||||
import android.provider.BaseColumns;
|
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.ApiAppsModel;
|
import org.sufficientlysecure.keychain.ApiAppsModel;
|
||||||
import org.sufficientlysecure.keychain.AutocryptPeersModel;
|
import org.sufficientlysecure.keychain.AutocryptPeersModel;
|
||||||
@@ -42,15 +41,10 @@ import org.sufficientlysecure.keychain.KeyMetadataModel;
|
|||||||
import org.sufficientlysecure.keychain.KeyRingsPublicModel;
|
import org.sufficientlysecure.keychain.KeyRingsPublicModel;
|
||||||
import org.sufficientlysecure.keychain.KeySignaturesModel;
|
import org.sufficientlysecure.keychain.KeySignaturesModel;
|
||||||
import org.sufficientlysecure.keychain.KeysModel;
|
import org.sufficientlysecure.keychain.KeysModel;
|
||||||
|
import org.sufficientlysecure.keychain.OverriddenWarningsModel;
|
||||||
import org.sufficientlysecure.keychain.UserPacketsModel;
|
import org.sufficientlysecure.keychain.UserPacketsModel;
|
||||||
import org.sufficientlysecure.keychain.model.ApiApp;
|
|
||||||
import org.sufficientlysecure.keychain.model.Certification;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAppsAllowedKeysColumns;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.CertsColumns;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingsColumns;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeySignaturesColumns;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeysColumns;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeysColumns;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.OverriddenWarnings;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPacketsColumns;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPacketsColumns;
|
||||||
import org.sufficientlysecure.keychain.util.Preferences;
|
import org.sufficientlysecure.keychain.util.Preferences;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
@@ -68,7 +62,15 @@ public class KeychainDatabase {
|
|||||||
private static final String DATABASE_NAME = "openkeychain.db";
|
private static final String DATABASE_NAME = "openkeychain.db";
|
||||||
private static final int DATABASE_VERSION = 29;
|
private static final int DATABASE_VERSION = 29;
|
||||||
private final SupportSQLiteOpenHelper supportSQLiteOpenHelper;
|
private final SupportSQLiteOpenHelper supportSQLiteOpenHelper;
|
||||||
private Context context;
|
|
||||||
|
private static KeychainDatabase sInstance;
|
||||||
|
|
||||||
|
public static KeychainDatabase getInstance(Context context) {
|
||||||
|
if (sInstance == null) {
|
||||||
|
sInstance = new KeychainDatabase(context.getApplicationContext());
|
||||||
|
}
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
public interface Tables {
|
public interface Tables {
|
||||||
String KEY_RINGS_PUBLIC = "keyrings_public";
|
String KEY_RINGS_PUBLIC = "keyrings_public";
|
||||||
@@ -80,98 +82,24 @@ public class KeychainDatabase {
|
|||||||
String OVERRIDDEN_WARNINGS = "overridden_warnings";
|
String OVERRIDDEN_WARNINGS = "overridden_warnings";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String CREATE_KEYS =
|
private KeychainDatabase(Context context) {
|
||||||
"CREATE TABLE IF NOT EXISTS " + Tables.KEYS + " ("
|
|
||||||
+ KeysColumns.MASTER_KEY_ID + " INTEGER, "
|
|
||||||
+ KeysColumns.RANK + " INTEGER, "
|
|
||||||
|
|
||||||
+ KeysColumns.KEY_ID + " INTEGER, "
|
|
||||||
+ KeysColumns.KEY_SIZE + " INTEGER, "
|
|
||||||
+ KeysColumns.KEY_CURVE_OID + " TEXT, "
|
|
||||||
+ KeysColumns.ALGORITHM + " INTEGER, "
|
|
||||||
+ KeysColumns.FINGERPRINT + " BLOB, "
|
|
||||||
|
|
||||||
+ KeysColumns.CAN_CERTIFY + " INTEGER, "
|
|
||||||
+ KeysColumns.CAN_SIGN + " INTEGER, "
|
|
||||||
+ KeysColumns.CAN_ENCRYPT + " INTEGER, "
|
|
||||||
+ KeysColumns.CAN_AUTHENTICATE + " INTEGER, "
|
|
||||||
+ KeysColumns.IS_REVOKED + " INTEGER, "
|
|
||||||
+ KeysColumns.HAS_SECRET + " INTEGER, "
|
|
||||||
+ KeysColumns.IS_SECURE + " INTEGER, "
|
|
||||||
|
|
||||||
+ KeysColumns.CREATION + " INTEGER, "
|
|
||||||
+ KeysColumns.EXPIRY + " INTEGER, "
|
|
||||||
|
|
||||||
+ "PRIMARY KEY(" + KeysColumns.MASTER_KEY_ID + ", " + KeysColumns.RANK + "),"
|
|
||||||
+ "FOREIGN KEY(" + KeysColumns.MASTER_KEY_ID + ") REFERENCES "
|
|
||||||
+ Tables.KEY_RINGS_PUBLIC + "(" + KeyRingsColumns.MASTER_KEY_ID + ") ON DELETE CASCADE"
|
|
||||||
+ ")";
|
|
||||||
|
|
||||||
private static final String CREATE_USER_PACKETS =
|
|
||||||
"CREATE TABLE IF NOT EXISTS " + Tables.USER_PACKETS + "("
|
|
||||||
+ UserPacketsColumns.MASTER_KEY_ID + " INTEGER, "
|
|
||||||
+ UserPacketsColumns.TYPE + " INT, "
|
|
||||||
+ UserPacketsColumns.USER_ID + " TEXT, "
|
|
||||||
+ UserPacketsColumns.NAME + " TEXT, "
|
|
||||||
+ UserPacketsColumns.EMAIL + " TEXT, "
|
|
||||||
+ UserPacketsColumns.COMMENT + " TEXT, "
|
|
||||||
+ UserPacketsColumns.ATTRIBUTE_DATA + " BLOB, "
|
|
||||||
|
|
||||||
+ UserPacketsColumns.IS_PRIMARY + " INTEGER, "
|
|
||||||
+ UserPacketsColumns.IS_REVOKED + " INTEGER, "
|
|
||||||
+ UserPacketsColumns.RANK+ " INTEGER, "
|
|
||||||
|
|
||||||
+ "PRIMARY KEY(" + UserPacketsColumns.MASTER_KEY_ID + ", " + UserPacketsColumns.RANK + "), "
|
|
||||||
+ "FOREIGN KEY(" + UserPacketsColumns.MASTER_KEY_ID + ") REFERENCES "
|
|
||||||
+ Tables.KEY_RINGS_PUBLIC + "(" + KeyRingsColumns.MASTER_KEY_ID + ") ON DELETE CASCADE"
|
|
||||||
+ ")";
|
|
||||||
|
|
||||||
private static final String CREATE_KEY_SIGNATURES =
|
|
||||||
"CREATE TABLE IF NOT EXISTS " + Tables.KEY_SIGNATURES + " ("
|
|
||||||
+ KeySignaturesColumns.MASTER_KEY_ID + " INTEGER NOT NULL, "
|
|
||||||
+ KeySignaturesColumns.SIGNER_KEY_ID + " INTEGER NOT NULL, "
|
|
||||||
+ "PRIMARY KEY(" + KeySignaturesColumns.MASTER_KEY_ID + ", " + KeySignaturesColumns.SIGNER_KEY_ID + "), "
|
|
||||||
+ "FOREIGN KEY(" + KeySignaturesColumns.MASTER_KEY_ID + ") REFERENCES "
|
|
||||||
+ Tables.KEY_RINGS_PUBLIC + "(" + KeyRingsColumns.MASTER_KEY_ID + ") ON DELETE CASCADE"
|
|
||||||
+ ")";
|
|
||||||
|
|
||||||
private static final String CREATE_API_APPS_ALLOWED_KEYS =
|
|
||||||
"CREATE TABLE IF NOT EXISTS " + Tables.API_ALLOWED_KEYS + " ("
|
|
||||||
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
||||||
+ ApiAppsAllowedKeysColumns.KEY_ID + " INTEGER, "
|
|
||||||
+ ApiAppsAllowedKeysColumns.PACKAGE_NAME + " TEXT NOT NULL, "
|
|
||||||
|
|
||||||
+ "UNIQUE(" + ApiAppsAllowedKeysColumns.KEY_ID + ", "
|
|
||||||
+ ApiAppsAllowedKeysColumns.PACKAGE_NAME + "), "
|
|
||||||
+ "FOREIGN KEY(" + ApiAppsAllowedKeysColumns.PACKAGE_NAME + ") REFERENCES "
|
|
||||||
+ "api_apps (" + ApiAppsAllowedKeysColumns.PACKAGE_NAME + ") ON DELETE CASCADE"
|
|
||||||
+ ")";
|
|
||||||
|
|
||||||
private static final String CREATE_OVERRIDDEN_WARNINGS =
|
|
||||||
"CREATE TABLE IF NOT EXISTS " + Tables.OVERRIDDEN_WARNINGS + " ("
|
|
||||||
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
|
||||||
+ OverriddenWarnings.IDENTIFIER + " TEXT NOT NULL UNIQUE "
|
|
||||||
+ ")";
|
|
||||||
|
|
||||||
public KeychainDatabase(Context context) {
|
|
||||||
this.context = context.getApplicationContext();
|
|
||||||
supportSQLiteOpenHelper =
|
supportSQLiteOpenHelper =
|
||||||
new FrameworkSQLiteOpenHelperFactory()
|
new FrameworkSQLiteOpenHelperFactory()
|
||||||
.create(Configuration.builder(context).name(DATABASE_NAME).callback(
|
.create(Configuration.builder(context).name(DATABASE_NAME).callback(
|
||||||
new Callback(DATABASE_VERSION) {
|
new Callback(DATABASE_VERSION) {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(SupportSQLiteDatabase db) {
|
public void onCreate(SupportSQLiteDatabase db) {
|
||||||
KeychainDatabase.this.onCreate(db);
|
KeychainDatabase.this.onCreate(db, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpgrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
|
public void onUpgrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
KeychainDatabase.this.onUpgrade(db, oldVersion, newVersion);
|
KeychainDatabase.this.onUpgrade(db, context, oldVersion, newVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDowngrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
|
public void onDowngrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
KeychainDatabase.this.onDowngrade(db, oldVersion, newVersion);
|
KeychainDatabase.this.onDowngrade();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -193,17 +121,17 @@ public class KeychainDatabase {
|
|||||||
return supportSQLiteOpenHelper.getWritableDatabase();
|
return supportSQLiteOpenHelper.getWritableDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onCreate(SupportSQLiteDatabase db) {
|
private void onCreate(SupportSQLiteDatabase db, Context context) {
|
||||||
Timber.w("Creating database...");
|
Timber.w("Creating database...");
|
||||||
|
|
||||||
db.execSQL(KeyRingsPublicModel.CREATE_TABLE);
|
db.execSQL(KeyRingsPublicModel.CREATE_TABLE);
|
||||||
db.execSQL(CREATE_KEYS);
|
db.execSQL(KeysModel.CREATE_TABLE);
|
||||||
db.execSQL(UserPacketsModel.CREATE_TABLE);
|
db.execSQL(UserPacketsModel.CREATE_TABLE);
|
||||||
db.execSQL(CertsModel.CREATE_TABLE);
|
db.execSQL(CertsModel.CREATE_TABLE);
|
||||||
db.execSQL(KeyMetadataModel.CREATE_TABLE);
|
db.execSQL(KeyMetadataModel.CREATE_TABLE);
|
||||||
db.execSQL(KeySignaturesModel.CREATE_TABLE);
|
db.execSQL(KeySignaturesModel.CREATE_TABLE);
|
||||||
db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
|
db.execSQL(ApiAppsModel.CREATE_TABLE);
|
||||||
db.execSQL(CREATE_OVERRIDDEN_WARNINGS);
|
db.execSQL(OverriddenWarningsModel.CREATE_TABLE);
|
||||||
db.execSQL(AutocryptPeersModel.CREATE_TABLE);
|
db.execSQL(AutocryptPeersModel.CREATE_TABLE);
|
||||||
db.execSQL(ApiAppsModel.CREATE_TABLE);
|
db.execSQL(ApiAppsModel.CREATE_TABLE);
|
||||||
db.execSQL(KeysModel.UNIFIEDKEYVIEW);
|
db.execSQL(KeysModel.UNIFIEDKEYVIEW);
|
||||||
@@ -219,7 +147,7 @@ public class KeychainDatabase {
|
|||||||
Preferences.getPreferences(context).setKeySignaturesTableInitialized();
|
Preferences.getPreferences(context).setKeySignaturesTableInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onUpgrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
|
private void onUpgrade(SupportSQLiteDatabase db, Context context, int oldVersion, int newVersion) {
|
||||||
Timber.d("Upgrading db from " + oldVersion + " to " + newVersion);
|
Timber.d("Upgrading db from " + oldVersion + " to " + newVersion);
|
||||||
|
|
||||||
switch (oldVersion) {
|
switch (oldVersion) {
|
||||||
@@ -258,7 +186,7 @@ public class KeychainDatabase {
|
|||||||
case 7:
|
case 7:
|
||||||
// new table for allowed key ids in API
|
// new table for allowed key ids in API
|
||||||
try {
|
try {
|
||||||
db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
|
db.execSQL(ApiAppsModel.CREATE_TABLE);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// never mind, the column probably already existed
|
// never mind, the column probably already existed
|
||||||
}
|
}
|
||||||
@@ -336,14 +264,6 @@ public class KeychainDatabase {
|
|||||||
case 19:
|
case 19:
|
||||||
// emergency fix for crashing consolidate
|
// emergency fix for crashing consolidate
|
||||||
db.execSQL("UPDATE keys SET is_secure = 1;");
|
db.execSQL("UPDATE keys SET is_secure = 1;");
|
||||||
/* TODO actually drop this table. leaving it around for now!
|
|
||||||
case 20:
|
|
||||||
db.execSQL("DROP TABLE api_accounts");
|
|
||||||
if (oldVersion == 20) {
|
|
||||||
// no need to consolidate
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
case 20:
|
case 20:
|
||||||
db.execSQL(
|
db.execSQL(
|
||||||
"CREATE TABLE IF NOT EXISTS overridden_warnings ("
|
"CREATE TABLE IF NOT EXISTS overridden_warnings ("
|
||||||
@@ -365,7 +285,7 @@ public class KeychainDatabase {
|
|||||||
+ "last_updated INTEGER NOT NULL, "
|
+ "last_updated INTEGER NOT NULL, "
|
||||||
+ "last_seen_key INTEGER NOT NULL, "
|
+ "last_seen_key INTEGER NOT NULL, "
|
||||||
+ "state INTEGER NOT NULL, "
|
+ "state INTEGER NOT NULL, "
|
||||||
+ "master_key_id INTEGER NULL, "
|
+ "master_key_id INTEGER, "
|
||||||
+ "PRIMARY KEY(package_name, identifier), "
|
+ "PRIMARY KEY(package_name, identifier), "
|
||||||
+ "FOREIGN KEY(package_name) REFERENCES api_apps(package_name) ON DELETE CASCADE"
|
+ "FOREIGN KEY(package_name) REFERENCES api_apps(package_name) ON DELETE CASCADE"
|
||||||
+ ")");
|
+ ")");
|
||||||
@@ -425,7 +345,7 @@ public class KeychainDatabase {
|
|||||||
|
|
||||||
case 25: {
|
case 25: {
|
||||||
try {
|
try {
|
||||||
migrateSecretKeysFromDbToLocalStorage(db);
|
migrateSecretKeysFromDbToLocalStorage(db, context);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new IllegalStateException("Error migrating secret keys! This is bad!!");
|
throw new IllegalStateException("Error migrating secret keys! This is bad!!");
|
||||||
}
|
}
|
||||||
@@ -439,15 +359,18 @@ public class KeychainDatabase {
|
|||||||
|
|
||||||
case 28:
|
case 28:
|
||||||
recreateUnifiedKeyView(db);
|
recreateUnifiedKeyView(db);
|
||||||
|
// drop old table from version 20
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS api_accounts");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void recreateUnifiedKeyView(SupportSQLiteDatabase db) {
|
private void recreateUnifiedKeyView(SupportSQLiteDatabase db) {
|
||||||
|
// noinspection deprecation
|
||||||
db.execSQL("DROP VIEW IF EXISTS " + KeysModel.UNIFIEDKEYVIEW_VIEW_NAME);
|
db.execSQL("DROP VIEW IF EXISTS " + KeysModel.UNIFIEDKEYVIEW_VIEW_NAME);
|
||||||
db.execSQL(KeysModel.UNIFIEDKEYVIEW);
|
db.execSQL(KeysModel.UNIFIEDKEYVIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void migrateSecretKeysFromDbToLocalStorage(SupportSQLiteDatabase db) throws IOException {
|
private void migrateSecretKeysFromDbToLocalStorage(SupportSQLiteDatabase db, Context context) throws IOException {
|
||||||
LocalSecretKeyStorage localSecretKeyStorage = LocalSecretKeyStorage.getInstance(context);
|
LocalSecretKeyStorage localSecretKeyStorage = LocalSecretKeyStorage.getInstance(context);
|
||||||
Cursor cursor = db.query("SELECT master_key_id, key_ring_data FROM keyrings_secret");
|
Cursor cursor = db.query("SELECT master_key_id, key_ring_data FROM keyrings_secret");
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
@@ -485,7 +408,7 @@ public class KeychainDatabase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onDowngrade(SupportSQLiteDatabase db, int oldVersion, int newVersion) {
|
private void onDowngrade() {
|
||||||
// Downgrade is ok for the debug version, makes it easier to work with branches
|
// Downgrade is ok for the debug version, makes it easier to work with branches
|
||||||
if (Constants.DEBUG) {
|
if (Constants.DEBUG) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ public class KeychainProvider extends ContentProvider implements SimpleContentRe
|
|||||||
|
|
||||||
public KeychainDatabase getDb() {
|
public KeychainDatabase getDb() {
|
||||||
if(mKeychainDatabase == null)
|
if(mKeychainDatabase == null)
|
||||||
mKeychainDatabase = new KeychainDatabase(getContext());
|
mKeychainDatabase = KeychainDatabase.getInstance(getContext());
|
||||||
return mKeychainDatabase;
|
return mKeychainDatabase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class OverriddenWarningsRepository {
|
|||||||
|
|
||||||
private KeychainDatabase getDb() {
|
private KeychainDatabase getDb() {
|
||||||
if (keychainDatabase == null) {
|
if (keychainDatabase == null) {
|
||||||
keychainDatabase = new KeychainDatabase(context);
|
keychainDatabase = KeychainDatabase.getInstance(context);
|
||||||
}
|
}
|
||||||
return keychainDatabase;
|
return keychainDatabase;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC
|
|||||||
|
|
||||||
String groupBy = null;
|
String groupBy = null;
|
||||||
|
|
||||||
SupportSQLiteDatabase db = new KeychainDatabase(getContext()).getReadableDatabase();
|
SupportSQLiteDatabase db = KeychainDatabase.getInstance(getContext()).getReadableDatabase();
|
||||||
|
|
||||||
String callingPackageName = apiPermissionHelper.getCurrentCallingPackage();
|
String callingPackageName = apiPermissionHelper.getCurrentCallingPackage();
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class IdentityDao {
|
|||||||
private final AutocryptPeerDao autocryptPeerDao;
|
private final AutocryptPeerDao autocryptPeerDao;
|
||||||
|
|
||||||
public static IdentityDao getInstance(Context context) {
|
public static IdentityDao getInstance(Context context) {
|
||||||
SupportSQLiteDatabase db = new KeychainDatabase(context).getWritableDatabase();
|
SupportSQLiteDatabase db = KeychainDatabase.getInstance(context).getWritableDatabase();
|
||||||
PackageManager packageManager = context.getPackageManager();
|
PackageManager packageManager = context.getPackageManager();
|
||||||
PackageIconGetter iconGetter = PackageIconGetter.getInstance(context);
|
PackageIconGetter iconGetter = PackageIconGetter.getInstance(context);
|
||||||
AutocryptPeerDao autocryptPeerDao = AutocryptPeerDao.getInstance(context);
|
AutocryptPeerDao autocryptPeerDao = AutocryptPeerDao.getInstance(context);
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS overridden_warnings (
|
||||||
|
_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
identifier TEXT NOT NULL UNIQUE
|
||||||
|
);
|
||||||
@@ -244,7 +244,7 @@ public class InteropTest {
|
|||||||
KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(verify.getMasterKeyId()) : null;
|
KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(verify.getMasterKeyId()) : null;
|
||||||
|
|
||||||
KeyWritableRepository helper = new KeyWritableRepository(RuntimeEnvironment.application,
|
KeyWritableRepository helper = new KeyWritableRepository(RuntimeEnvironment.application,
|
||||||
new KeychainDatabase(RuntimeEnvironment.application),
|
KeychainDatabase.getInstance(RuntimeEnvironment.application),
|
||||||
LocalPublicKeyStorage.getInstance(RuntimeEnvironment.application),
|
LocalPublicKeyStorage.getInstance(RuntimeEnvironment.application),
|
||||||
LocalSecretKeyStorage.getInstance(RuntimeEnvironment.application),
|
LocalSecretKeyStorage.getInstance(RuntimeEnvironment.application),
|
||||||
DatabaseNotifyManager.create(RuntimeEnvironment.application),
|
DatabaseNotifyManager.create(RuntimeEnvironment.application),
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class KeyRepositorySaveTest {
|
|||||||
result = KeyWritableRepository.create(RuntimeEnvironment.application).savePublicKeyRing(second);
|
result = KeyWritableRepository.create(RuntimeEnvironment.application).savePublicKeyRing(second);
|
||||||
Assert.assertFalse("second keyring import should fail", result.success());
|
Assert.assertFalse("second keyring import should fail", result.success());
|
||||||
|
|
||||||
new KeychainDatabase(RuntimeEnvironment.application).clearDatabase();
|
KeychainDatabase.getInstance(RuntimeEnvironment.application).clearDatabase();
|
||||||
|
|
||||||
// and the other way around
|
// and the other way around
|
||||||
result = KeyWritableRepository.create(RuntimeEnvironment.application).savePublicKeyRing(second);
|
result = KeyWritableRepository.create(RuntimeEnvironment.application).savePublicKeyRing(second);
|
||||||
|
|||||||
Reference in New Issue
Block a user