introduce AbstractDao, fix import of keys (missing delete in KeychainProvider)

This commit is contained in:
Vincent Breitmoser
2018-06-22 10:53:04 +02:00
parent 587b8b4cc9
commit 1556db897f
21 changed files with 166 additions and 144 deletions

View File

@@ -0,0 +1,27 @@
package org.sufficientlysecure.keychain.provider;
import android.arch.persistence.db.SupportSQLiteDatabase;
class AbstractDao {
private final KeychainDatabase db;
private final DatabaseNotifyManager databaseNotifyManager;
AbstractDao(KeychainDatabase db, DatabaseNotifyManager databaseNotifyManager) {
this.db = db;
this.databaseNotifyManager = databaseNotifyManager;
}
SupportSQLiteDatabase getReadableDb() {
return db.getReadableDatabase();
}
SupportSQLiteDatabase getWritableDb() {
return db.getWritableDatabase();
}
DatabaseNotifyManager getDatabaseNotifyManager() {
return databaseNotifyManager;
}
}

View File

@@ -23,7 +23,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
@@ -36,16 +35,20 @@ import org.sufficientlysecure.keychain.model.ApiAllowedKey;
import org.sufficientlysecure.keychain.model.ApiApp; import org.sufficientlysecure.keychain.model.ApiApp;
public class ApiDataAccessObject { public class ApiAppDao extends AbstractDao {
private final SupportSQLiteDatabase db; public static ApiAppDao getInstance(Context context) {
public ApiDataAccessObject(Context context) {
KeychainDatabase keychainDatabase = new KeychainDatabase(context); KeychainDatabase keychainDatabase = new KeychainDatabase(context);
db = keychainDatabase.getWritableDatabase(); DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
return new ApiAppDao(keychainDatabase, databaseNotifyManager);
}
private ApiAppDao(KeychainDatabase keychainDatabase, DatabaseNotifyManager databaseNotifyManager) {
super(keychainDatabase, databaseNotifyManager);
} }
public ApiApp getApiApp(String packageName) { public ApiApp getApiApp(String packageName) {
try (Cursor cursor = db.query(ApiApp.FACTORY.selectByPackageName(packageName))) { try (Cursor cursor = getReadableDb().query(ApiApp.FACTORY.selectByPackageName(packageName))) {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
return ApiApp.FACTORY.selectByPackageNameMapper().map(cursor); return ApiApp.FACTORY.selectByPackageNameMapper().map(cursor);
} }
@@ -54,7 +57,7 @@ public class ApiDataAccessObject {
} }
public byte[] getApiAppCertificate(String packageName) { public byte[] getApiAppCertificate(String packageName) {
try (Cursor cursor = db.query(ApiApp.FACTORY.getCertificate(packageName))) { try (Cursor cursor = getReadableDb().query(ApiApp.FACTORY.getCertificate(packageName))) {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
return ApiApp.FACTORY.getCertificateMapper().map(cursor); return ApiApp.FACTORY.getCertificateMapper().map(cursor);
} }
@@ -63,13 +66,13 @@ public class ApiDataAccessObject {
} }
public void insertApiApp(ApiApp apiApp) { public void insertApiApp(ApiApp apiApp) {
InsertApiApp statement = new ApiAppsModel.InsertApiApp(db); InsertApiApp statement = new ApiAppsModel.InsertApiApp(getWritableDb());
statement.bind(apiApp.package_name(), apiApp.package_signature()); statement.bind(apiApp.package_name(), apiApp.package_signature());
statement.execute(); statement.execute();
} }
public void deleteApiApp(String packageName) { public void deleteApiApp(String packageName) {
DeleteByPackageName deleteByPackageName = new DeleteByPackageName(db); DeleteByPackageName deleteByPackageName = new DeleteByPackageName(getWritableDb());
deleteByPackageName.bind(packageName); deleteByPackageName.bind(packageName);
deleteByPackageName.executeUpdateDelete(); deleteByPackageName.executeUpdateDelete();
} }
@@ -77,7 +80,7 @@ public class ApiDataAccessObject {
public HashSet<Long> getAllowedKeyIdsForApp(String packageName) { public HashSet<Long> getAllowedKeyIdsForApp(String packageName) {
SqlDelightQuery allowedKeys = ApiAllowedKey.FACTORY.getAllowedKeys(packageName); SqlDelightQuery allowedKeys = ApiAllowedKey.FACTORY.getAllowedKeys(packageName);
HashSet<Long> keyIds = new HashSet<>(); HashSet<Long> keyIds = new HashSet<>();
try (Cursor cursor = db.query(allowedKeys)) { try (Cursor cursor = getReadableDb().query(allowedKeys)) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
long allowedKeyId = ApiAllowedKey.FACTORY.getAllowedKeysMapper().map(cursor); long allowedKeyId = ApiAllowedKey.FACTORY.getAllowedKeysMapper().map(cursor);
keyIds.add(allowedKeyId); keyIds.add(allowedKeyId);
@@ -87,11 +90,11 @@ public class ApiDataAccessObject {
} }
public void saveAllowedKeyIdsForApp(String packageName, Set<Long> allowedKeyIds) { public void saveAllowedKeyIdsForApp(String packageName, Set<Long> allowedKeyIds) {
ApiAllowedKey.DeleteByPackageName deleteByPackageName = new ApiAllowedKey.DeleteByPackageName(db); ApiAllowedKey.DeleteByPackageName deleteByPackageName = new ApiAllowedKey.DeleteByPackageName(getWritableDb());
deleteByPackageName.bind(packageName); deleteByPackageName.bind(packageName);
deleteByPackageName.executeUpdateDelete(); deleteByPackageName.executeUpdateDelete();
InsertAllowedKey statement = new InsertAllowedKey(db); InsertAllowedKey statement = new InsertAllowedKey(getWritableDb());
for (Long keyId : allowedKeyIds) { for (Long keyId : allowedKeyIds) {
statement.bind(packageName, keyId); statement.bind(packageName, keyId);
statement.execute(); statement.execute();
@@ -99,7 +102,7 @@ public class ApiDataAccessObject {
} }
public void addAllowedKeyIdForApp(String packageName, long allowedKeyId) { public void addAllowedKeyIdForApp(String packageName, long allowedKeyId) {
InsertAllowedKey statement = new InsertAllowedKey(db); InsertAllowedKey statement = new InsertAllowedKey(getWritableDb());
statement.bind(packageName, allowedKeyId); statement.bind(packageName, allowedKeyId);
statement.execute(); statement.execute();
} }
@@ -108,7 +111,7 @@ public class ApiDataAccessObject {
SqlDelightQuery query = ApiApp.FACTORY.selectAll(); SqlDelightQuery query = ApiApp.FACTORY.selectAll();
ArrayList<ApiApp> result = new ArrayList<>(); ArrayList<ApiApp> result = new ArrayList<>();
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
ApiApp apiApp = ApiApp.FACTORY.selectAllMapper().map(cursor); ApiApp apiApp = ApiApp.FACTORY.selectAllMapper().map(cursor);
result.add(apiApp); result.add(apiApp);

View File

@@ -22,7 +22,6 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@@ -39,25 +38,21 @@ import org.sufficientlysecure.keychain.model.AutocryptPeer.AutocryptKeyStatus;
import org.sufficientlysecure.keychain.model.AutocryptPeer.GossipOrigin; import org.sufficientlysecure.keychain.model.AutocryptPeer.GossipOrigin;
public class AutocryptPeerDao { public class AutocryptPeerDao extends AbstractDao {
private final SupportSQLiteDatabase db;
private final DatabaseNotifyManager databaseNotifyManager;
public static AutocryptPeerDao getInstance(Context context) { public static AutocryptPeerDao getInstance(Context context) {
KeychainDatabase keychainDatabase = new KeychainDatabase(context); KeychainDatabase keychainDatabase = new KeychainDatabase(context);
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context); DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
return new AutocryptPeerDao(keychainDatabase.getWritableDatabase(), databaseNotifyManager); return new AutocryptPeerDao(keychainDatabase, databaseNotifyManager);
} }
private AutocryptPeerDao(SupportSQLiteDatabase writableDatabase, DatabaseNotifyManager databaseNotifyManager) { private AutocryptPeerDao(KeychainDatabase database, DatabaseNotifyManager databaseNotifyManager) {
this.db = writableDatabase; super(database, databaseNotifyManager);
this.databaseNotifyManager = databaseNotifyManager;
} }
public Long getMasterKeyIdForAutocryptPeer(String autocryptId) { public Long getMasterKeyIdForAutocryptPeer(String autocryptId) {
SqlDelightQuery query = AutocryptPeer.FACTORY.selectMasterKeyIdByIdentifier(autocryptId); SqlDelightQuery query = AutocryptPeer.FACTORY.selectMasterKeyIdByIdentifier(autocryptId);
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
return AutocryptPeer.FACTORY.selectMasterKeyIdByIdentifierMapper().map(cursor); return AutocryptPeer.FACTORY.selectMasterKeyIdByIdentifierMapper().map(cursor);
} }
@@ -74,10 +69,10 @@ public class AutocryptPeerDao {
return null; return null;
} }
public List<AutocryptPeer> getAutocryptPeers(String packageName, String... autocryptId) { private List<AutocryptPeer> getAutocryptPeers(String packageName, String... autocryptId) {
ArrayList<AutocryptPeer> result = new ArrayList<>(autocryptId.length); ArrayList<AutocryptPeer> result = new ArrayList<>(autocryptId.length);
SqlDelightQuery query = AutocryptPeer.FACTORY.selectByIdentifiers(packageName, autocryptId); SqlDelightQuery query = AutocryptPeer.FACTORY.selectByIdentifiers(packageName, autocryptId);
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
if (cursor.moveToNext()) { if (cursor.moveToNext()) {
AutocryptPeer autocryptPeer = AutocryptPeer.PEER_MAPPER.map(cursor); AutocryptPeer autocryptPeer = AutocryptPeer.PEER_MAPPER.map(cursor);
result.add(autocryptPeer); result.add(autocryptPeer);
@@ -89,7 +84,7 @@ public class AutocryptPeerDao {
public List<AutocryptKeyStatus> getAutocryptKeyStatus(String packageName, String[] autocryptIds) { public List<AutocryptKeyStatus> getAutocryptKeyStatus(String packageName, String[] autocryptIds) {
ArrayList<AutocryptKeyStatus> result = new ArrayList<>(autocryptIds.length); ArrayList<AutocryptKeyStatus> result = new ArrayList<>(autocryptIds.length);
SqlDelightQuery query = AutocryptPeer.FACTORY.selectAutocryptKeyStatus(packageName, autocryptIds, System.currentTimeMillis()); SqlDelightQuery query = AutocryptPeer.FACTORY.selectAutocryptKeyStatus(packageName, autocryptIds, System.currentTimeMillis());
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
if (cursor.moveToNext()) { if (cursor.moveToNext()) {
AutocryptKeyStatus autocryptPeer = AutocryptPeer.KEY_STATUS_MAPPER.map(cursor); AutocryptKeyStatus autocryptPeer = AutocryptPeer.KEY_STATUS_MAPPER.map(cursor);
result.add(autocryptPeer); result.add(autocryptPeer);
@@ -99,12 +94,12 @@ public class AutocryptPeerDao {
} }
public void insertOrUpdateLastSeen(String packageName, String autocryptId, Date date) { public void insertOrUpdateLastSeen(String packageName, String autocryptId, Date date) {
UpdateLastSeen updateStatement = new UpdateLastSeen(db, AutocryptPeer.FACTORY); UpdateLastSeen updateStatement = new UpdateLastSeen(getWritableDb(), AutocryptPeer.FACTORY);
updateStatement.bind(packageName, autocryptId, date); updateStatement.bind(packageName, autocryptId, date);
int updated = updateStatement.executeUpdateDelete(); int updated = updateStatement.executeUpdateDelete();
if (updated == 0) { if (updated == 0) {
InsertPeer insertStatement = new InsertPeer(db, AutocryptPeer.FACTORY); InsertPeer insertStatement = new InsertPeer(getWritableDb(), AutocryptPeer.FACTORY);
insertStatement.bind(packageName, autocryptId, date); insertStatement.bind(packageName, autocryptId, date);
insertStatement.executeInsert(); insertStatement.executeInsert();
} }
@@ -112,30 +107,30 @@ public class AutocryptPeerDao {
public void updateKey(String packageName, String autocryptId, Date effectiveDate, long masterKeyId, public void updateKey(String packageName, String autocryptId, Date effectiveDate, long masterKeyId,
boolean isMutual) { boolean isMutual) {
UpdateKey updateStatement = new UpdateKey(db, AutocryptPeer.FACTORY); UpdateKey updateStatement = new UpdateKey(getWritableDb(), AutocryptPeer.FACTORY);
updateStatement.bind(packageName, autocryptId, effectiveDate, masterKeyId, isMutual); updateStatement.bind(packageName, autocryptId, effectiveDate, masterKeyId, isMutual);
int rowsUpdated = updateStatement.executeUpdateDelete(); int rowsUpdated = updateStatement.executeUpdateDelete();
if (rowsUpdated == 0) { if (rowsUpdated == 0) {
throw new IllegalStateException("No rows updated! Was this peer inserted before the update?"); throw new IllegalStateException("No rows updated! Was this peer inserted before the update?");
} }
databaseNotifyManager.notifyAutocryptUpdate(autocryptId, masterKeyId); getDatabaseNotifyManager().notifyAutocryptUpdate(autocryptId, masterKeyId);
} }
public void updateKeyGossip(String packageName, String autocryptId, Date effectiveDate, long masterKeyId, public void updateKeyGossip(String packageName, String autocryptId, Date effectiveDate, long masterKeyId,
GossipOrigin origin) { GossipOrigin origin) {
UpdateGossipKey updateStatement = new UpdateGossipKey(db, AutocryptPeer.FACTORY); UpdateGossipKey updateStatement = new UpdateGossipKey(getWritableDb(), AutocryptPeer.FACTORY);
updateStatement.bind(packageName, autocryptId, effectiveDate, masterKeyId, origin); updateStatement.bind(packageName, autocryptId, effectiveDate, masterKeyId, origin);
int rowsUpdated = updateStatement.executeUpdateDelete(); int rowsUpdated = updateStatement.executeUpdateDelete();
if (rowsUpdated == 0) { if (rowsUpdated == 0) {
throw new IllegalStateException("No rows updated! Was this peer inserted before the update?"); throw new IllegalStateException("No rows updated! Was this peer inserted before the update?");
} }
databaseNotifyManager.notifyAutocryptUpdate(autocryptId, masterKeyId); getDatabaseNotifyManager().notifyAutocryptUpdate(autocryptId, masterKeyId);
} }
public List<AutocryptPeer> getAutocryptPeersForKey(long masterKeyId) { public List<AutocryptPeer> getAutocryptPeersForKey(long masterKeyId) {
ArrayList<AutocryptPeer> result = new ArrayList<>(); ArrayList<AutocryptPeer> result = new ArrayList<>();
SqlDelightQuery query = AutocryptPeer.FACTORY.selectByMasterKeyId(masterKeyId); SqlDelightQuery query = AutocryptPeer.FACTORY.selectByMasterKeyId(masterKeyId);
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
if (cursor.moveToNext()) { if (cursor.moveToNext()) {
AutocryptPeer autocryptPeer = AutocryptPeer.PEER_MAPPER.map(cursor); AutocryptPeer autocryptPeer = AutocryptPeer.PEER_MAPPER.map(cursor);
result.add(autocryptPeer); result.add(autocryptPeer);
@@ -146,16 +141,16 @@ public class AutocryptPeerDao {
public void deleteByIdentifier(String packageName, String autocryptId) { public void deleteByIdentifier(String packageName, String autocryptId) {
Long masterKeyId = getMasterKeyIdForAutocryptPeer(autocryptId); Long masterKeyId = getMasterKeyIdForAutocryptPeer(autocryptId);
DeleteByIdentifier deleteStatement = new DeleteByIdentifier(db); DeleteByIdentifier deleteStatement = new DeleteByIdentifier(getReadableDb());
deleteStatement.bind(packageName, autocryptId); deleteStatement.bind(packageName, autocryptId);
deleteStatement.execute(); deleteStatement.execute();
if (masterKeyId != null) { if (masterKeyId != null) {
databaseNotifyManager.notifyAutocryptDelete(autocryptId, masterKeyId); getDatabaseNotifyManager().notifyAutocryptDelete(autocryptId, masterKeyId);
} }
} }
public void deleteByMasterKeyId(long masterKeyId) { public void deleteByMasterKeyId(long masterKeyId) {
DeleteByMasterKeyId deleteStatement = new DeleteByMasterKeyId(db); DeleteByMasterKeyId deleteStatement = new DeleteByMasterKeyId(getReadableDb());
deleteStatement.bind(masterKeyId); deleteStatement.bind(masterKeyId);
deleteStatement.execute(); deleteStatement.execute();
} }

View File

@@ -6,7 +6,6 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
@@ -15,26 +14,21 @@ import org.sufficientlysecure.keychain.KeyMetadataModel.ReplaceKeyMetadata;
import org.sufficientlysecure.keychain.model.KeyMetadata; import org.sufficientlysecure.keychain.model.KeyMetadata;
public class KeyMetadataDao { public class KeyMetadataDao extends AbstractDao {
private final SupportSQLiteDatabase db;
private DatabaseNotifyManager databaseNotifyManager;
public static KeyMetadataDao create(Context context) { public static KeyMetadataDao create(Context context) {
SupportSQLiteDatabase supportSQLiteDatabase = new KeychainDatabase(context).getWritableDatabase(); KeychainDatabase database = new KeychainDatabase(context);
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context); DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
return new KeyMetadataDao(supportSQLiteDatabase, databaseNotifyManager); return new KeyMetadataDao(database, databaseNotifyManager);
} }
private KeyMetadataDao(SupportSQLiteDatabase supportSQLiteDatabase, DatabaseNotifyManager databaseNotifyManager) { private KeyMetadataDao(KeychainDatabase database, DatabaseNotifyManager databaseNotifyManager) {
this.db = supportSQLiteDatabase; super(database, databaseNotifyManager);
this.databaseNotifyManager = databaseNotifyManager;
} }
public KeyMetadata getKeyMetadata(long masterKeyId) { public KeyMetadata getKeyMetadata(long masterKeyId) {
SqlDelightQuery query = KeyMetadata.FACTORY.selectByMasterKeyId(masterKeyId); SqlDelightQuery query = KeyMetadata.FACTORY.selectByMasterKeyId(masterKeyId);
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
return KeyMetadata.FACTORY.selectByMasterKeyIdMapper().map(cursor); return KeyMetadata.FACTORY.selectByMasterKeyIdMapper().map(cursor);
} }
@@ -43,22 +37,22 @@ public class KeyMetadataDao {
} }
public void resetAllLastUpdatedTimes() { public void resetAllLastUpdatedTimes() {
new KeyMetadata.DeleteAllLastUpdatedTimes(db).execute(); new KeyMetadata.DeleteAllLastUpdatedTimes(getWritableDb()).execute();
} }
public void renewKeyLastUpdatedTime(long masterKeyId, boolean seenOnKeyservers) { public void renewKeyLastUpdatedTime(long masterKeyId, boolean seenOnKeyservers) {
ReplaceKeyMetadata replaceStatement = new ReplaceKeyMetadata(db, KeyMetadata.FACTORY); ReplaceKeyMetadata replaceStatement = new ReplaceKeyMetadata(getWritableDb(), KeyMetadata.FACTORY);
replaceStatement.bind(masterKeyId, new Date(), seenOnKeyservers); replaceStatement.bind(masterKeyId, new Date(), seenOnKeyservers);
replaceStatement.executeInsert(); replaceStatement.executeInsert();
databaseNotifyManager.notifyKeyMetadataChange(masterKeyId); getDatabaseNotifyManager().notifyKeyMetadataChange(masterKeyId);
} }
public List<byte[]> getFingerprintsForKeysOlderThan(long olderThan, TimeUnit timeUnit) { public List<byte[]> getFingerprintsForKeysOlderThan(long olderThan, TimeUnit timeUnit) {
SqlDelightQuery query = KeyMetadata.FACTORY.selectFingerprintsForKeysOlderThan(new Date(timeUnit.toMillis(olderThan))); SqlDelightQuery query = KeyMetadata.FACTORY.selectFingerprintsForKeysOlderThan(new Date(timeUnit.toMillis(olderThan)));
List<byte[]> fingerprintList = new ArrayList<>(); List<byte[]> fingerprintList = new ArrayList<>();
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
byte[] fingerprint = KeyMetadata.FACTORY.selectFingerprintsForKeysOlderThanMapper().map(cursor); byte[] fingerprint = KeyMetadata.FACTORY.selectFingerprintsForKeysOlderThanMapper().map(cursor);
fingerprintList.add(fingerprint); fingerprintList.add(fingerprint);

View File

@@ -23,7 +23,6 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
@@ -44,7 +43,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import timber.log.Timber; import timber.log.Timber;
public class KeyRepository { public class KeyRepository extends AbstractDao {
// If we ever switch to api level 11, we can ditch this whole mess! // If we ever switch to api level 11, we can ditch this whole mess!
public static final int FIELD_TYPE_NULL = 1; public static final int FIELD_TYPE_NULL = 1;
// this is called integer to stay coherent with the constants in Cursor (api level 11) // this is called integer to stay coherent with the constants in Cursor (api level 11)
@@ -56,7 +55,6 @@ public class KeyRepository {
final ContentResolver contentResolver; final ContentResolver contentResolver;
final LocalPublicKeyStorage mLocalPublicKeyStorage; final LocalPublicKeyStorage mLocalPublicKeyStorage;
final LocalSecretKeyStorage localSecretKeyStorage; final LocalSecretKeyStorage localSecretKeyStorage;
final SupportSQLiteDatabase db;
OperationLog mLog; OperationLog mLog;
int mIndent; int mIndent;
@@ -65,23 +63,26 @@ public class KeyRepository {
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);
SupportSQLiteDatabase db = new KeychainDatabase(context).getWritableDatabase(); KeychainDatabase database = new KeychainDatabase(context);
DatabaseNotifyManager databaseNotifyManager = DatabaseNotifyManager.create(context);
return new KeyRepository(contentResolver, db, localPublicKeyStorage, localSecretKeyStorage); return new KeyRepository(contentResolver, database, databaseNotifyManager, localPublicKeyStorage, localSecretKeyStorage);
} }
private KeyRepository(ContentResolver contentResolver, SupportSQLiteDatabase db, private KeyRepository(ContentResolver contentResolver, KeychainDatabase database,
DatabaseNotifyManager databaseNotifyManager,
LocalPublicKeyStorage localPublicKeyStorage, LocalPublicKeyStorage localPublicKeyStorage,
LocalSecretKeyStorage localSecretKeyStorage) { LocalSecretKeyStorage localSecretKeyStorage) {
this(contentResolver, db, localPublicKeyStorage, localSecretKeyStorage, new OperationLog(), 0); this(contentResolver, database, databaseNotifyManager, localPublicKeyStorage, localSecretKeyStorage, new OperationLog(), 0);
} }
KeyRepository(ContentResolver contentResolver, SupportSQLiteDatabase db, KeyRepository(ContentResolver contentResolver, KeychainDatabase database,
DatabaseNotifyManager databaseNotifyManager,
LocalPublicKeyStorage localPublicKeyStorage, LocalPublicKeyStorage localPublicKeyStorage,
LocalSecretKeyStorage localSecretKeyStorage, LocalSecretKeyStorage localSecretKeyStorage,
OperationLog log, int indent) { OperationLog log, int indent) {
super(database, databaseNotifyManager);
this.contentResolver = contentResolver; this.contentResolver = contentResolver;
this.db = db;
mLocalPublicKeyStorage = localPublicKeyStorage; mLocalPublicKeyStorage = localPublicKeyStorage;
this.localSecretKeyStorage = localSecretKeyStorage; this.localSecretKeyStorage = localSecretKeyStorage;
mIndent = indent; mIndent = indent;
@@ -288,7 +289,7 @@ public class KeyRepository {
public final byte[] loadPublicKeyRingData(long masterKeyId) throws NotFoundException { public final byte[] loadPublicKeyRingData(long masterKeyId) throws NotFoundException {
SqlDelightQuery query = KeyRingPublic.FACTORY.selectByMasterKeyId(masterKeyId); SqlDelightQuery query = KeyRingPublic.FACTORY.selectByMasterKeyId(masterKeyId);
try (Cursor cursor = db.query(query)) { try (Cursor cursor = getReadableDb().query(query)) {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
KeyRingPublic keyRingPublic = KeyRingPublic.MAPPER.map(cursor); KeyRingPublic keyRingPublic = KeyRingPublic.MAPPER.map(cursor);
byte[] keyRingData = keyRingPublic.key_ring_data(); byte[] keyRingData = keyRingPublic.key_ring_data();

View File

@@ -25,7 +25,6 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.content.ContentProviderOperation; import android.content.ContentProviderOperation;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
@@ -92,25 +91,26 @@ 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);
SupportSQLiteDatabase db = new KeychainDatabase(context).getWritableDatabase(); KeychainDatabase database = new KeychainDatabase(context);
return new KeyWritableRepository(context, db,
return new KeyWritableRepository(context, database,
localPublicKeyStorage, localSecretKeyStorage, databaseNotifyManager, autocryptPeerDao); localPublicKeyStorage, localSecretKeyStorage, databaseNotifyManager, autocryptPeerDao);
} }
@VisibleForTesting @VisibleForTesting
KeyWritableRepository(Context context, KeyWritableRepository(Context context,
SupportSQLiteDatabase db, LocalPublicKeyStorage localPublicKeyStorage, KeychainDatabase database, LocalPublicKeyStorage localPublicKeyStorage,
LocalSecretKeyStorage localSecretKeyStorage, LocalSecretKeyStorage localSecretKeyStorage,
DatabaseNotifyManager databaseNotifyManager, AutocryptPeerDao autocryptPeerDao) { DatabaseNotifyManager databaseNotifyManager, AutocryptPeerDao autocryptPeerDao) {
this(context, db, localPublicKeyStorage, localSecretKeyStorage, databaseNotifyManager, new OperationLog(), 0, this(context, database, localPublicKeyStorage, localSecretKeyStorage, databaseNotifyManager, new OperationLog(), 0,
autocryptPeerDao); autocryptPeerDao);
} }
private KeyWritableRepository(Context context, SupportSQLiteDatabase db, private KeyWritableRepository(Context context, KeychainDatabase database,
LocalPublicKeyStorage localPublicKeyStorage, LocalPublicKeyStorage localPublicKeyStorage,
LocalSecretKeyStorage localSecretKeyStorage, DatabaseNotifyManager databaseNotifyManager, LocalSecretKeyStorage localSecretKeyStorage, DatabaseNotifyManager databaseNotifyManager,
OperationLog log, int indent, AutocryptPeerDao autocryptPeerDao) { OperationLog log, int indent, AutocryptPeerDao autocryptPeerDao) {
super(context.getContentResolver(), db, localPublicKeyStorage, localSecretKeyStorage, log, indent); super(context.getContentResolver(), database, databaseNotifyManager, localPublicKeyStorage, localSecretKeyStorage, log, indent);
this.context = context; this.context = context;
this.databaseNotifyManager = databaseNotifyManager; this.databaseNotifyManager = databaseNotifyManager;
@@ -535,9 +535,11 @@ public class KeyWritableRepository extends KeyRepository {
try { try {
// delete old version of this keyRing (from database only!), which also deletes all keys and userIds on cascade // delete old version of this keyRing (from database only!), which also deletes all keys and userIds on cascade
int deleted = contentResolver.delete( DeleteByMasterKeyId deleteStatement = new DeleteByMasterKeyId(getWritableDb());
KeyRingData.buildPublicKeyRingUri(masterKeyId), null, null); deleteStatement.bind(masterKeyId);
if (deleted > 0) { int deletedRows = deleteStatement.executeUpdateDelete();
if (deletedRows > 0) {
log(LogType.MSG_IP_DELETE_OLD_OK); log(LogType.MSG_IP_DELETE_OLD_OK);
result |= SaveKeyringResult.UPDATED; result |= SaveKeyringResult.UPDATED;
} else { } else {
@@ -595,7 +597,7 @@ public class KeyWritableRepository extends KeyRepository {
} }
autocryptPeerDao.deleteByMasterKeyId(masterKeyId); autocryptPeerDao.deleteByMasterKeyId(masterKeyId);
DeleteByMasterKeyId deleteStatement = new DeleteByMasterKeyId(db); DeleteByMasterKeyId deleteStatement = new DeleteByMasterKeyId(getWritableDb());
deleteStatement.bind(masterKeyId); deleteStatement.bind(masterKeyId);
int deletedRows = deleteStatement.executeUpdateDelete(); int deletedRows = deleteStatement.executeUpdateDelete();

View File

@@ -26,7 +26,7 @@ import android.net.Uri;
* from {#android.content.ContentResolver}. It is used to allow substitution * from {#android.content.ContentResolver}. It is used to allow substitution
* of a ContentResolver in DAOs. * of a ContentResolver in DAOs.
* *
* @see ApiDataAccessObject * @see ApiAppDao
*/ */
public interface SimpleContentResolverInterface { public interface SimpleContentResolverInterface {
Cursor query(Uri contentUri, String[] projection, String selection, String[] selectionArgs, String sortOrder); Cursor query(Uri contentUri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

View File

@@ -35,7 +35,7 @@ import android.os.Binder;
import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.OpenPgpError;
import org.openintents.openpgp.util.OpenPgpApi; import org.openintents.openpgp.util.OpenPgpApi;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import timber.log.Timber; import timber.log.Timber;
@@ -45,13 +45,13 @@ import timber.log.Timber;
public class ApiPermissionHelper { public class ApiPermissionHelper {
private final Context mContext; private final Context mContext;
private final ApiDataAccessObject mApiDao; private final ApiAppDao mApiAppDao;
private PackageManager mPackageManager; private PackageManager mPackageManager;
public ApiPermissionHelper(Context context, ApiDataAccessObject apiDao) { public ApiPermissionHelper(Context context, ApiAppDao apiAppDao) {
mContext = context; mContext = context;
mPackageManager = context.getPackageManager(); mPackageManager = context.getPackageManager();
mApiDao = apiDao; mApiAppDao = apiAppDao;
} }
public static class WrongPackageCertificateException extends Exception { public static class WrongPackageCertificateException extends Exception {
@@ -206,7 +206,7 @@ public class ApiPermissionHelper {
public boolean isPackageAllowed(String packageName) throws WrongPackageCertificateException { public boolean isPackageAllowed(String packageName) throws WrongPackageCertificateException {
Timber.d("isPackageAllowed packageName: " + packageName); Timber.d("isPackageAllowed packageName: " + packageName);
byte[] storedPackageCert = mApiDao.getApiAppCertificate(packageName); byte[] storedPackageCert = mApiAppDao.getApiAppCertificate(packageName);
boolean isKnownPackage = storedPackageCert != null; boolean isKnownPackage = storedPackageCert != null;
if (!isKnownPackage) { if (!isKnownPackage) {

View File

@@ -38,7 +38,7 @@ import android.text.TextUtils;
import org.sufficientlysecure.keychain.BuildConfig; import org.sufficientlysecure.keychain.BuildConfig;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
@@ -102,7 +102,7 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC
throw new NullPointerException("Context can't be null during onCreate!"); throw new NullPointerException("Context can't be null during onCreate!");
} }
apiPermissionHelper = new ApiPermissionHelper(context, new ApiDataAccessObject(getContext())); apiPermissionHelper = new ApiPermissionHelper(context, ApiAppDao.getInstance(getContext()));
return true; return true;
} }

View File

@@ -67,7 +67,7 @@ import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.SecurityProblem; import org.sufficientlysecure.keychain.pgp.SecurityProblem;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.AutocryptPeerDao; import org.sufficientlysecure.keychain.provider.AutocryptPeerDao;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeyRepository;
@@ -97,7 +97,7 @@ public class OpenPgpService extends Service {
private ApiPermissionHelper mApiPermissionHelper; private ApiPermissionHelper mApiPermissionHelper;
private KeyRepository mKeyRepository; private KeyRepository mKeyRepository;
private ApiDataAccessObject mApiDao; private ApiAppDao mApiAppDao;
private OpenPgpServiceKeyIdExtractor mKeyIdExtractor; private OpenPgpServiceKeyIdExtractor mKeyIdExtractor;
private ApiPendingIntentFactory mApiPendingIntentFactory; private ApiPendingIntentFactory mApiPendingIntentFactory;
@@ -105,8 +105,8 @@ public class OpenPgpService extends Service {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mKeyRepository = KeyRepository.create(this); mKeyRepository = KeyRepository.create(this);
mApiDao = new ApiDataAccessObject(this); mApiAppDao = ApiAppDao.getInstance(this);
mApiPermissionHelper = new ApiPermissionHelper(this, mApiDao); mApiPermissionHelper = new ApiPermissionHelper(this, mApiAppDao);
mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext()); mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext());
mKeyIdExtractor = OpenPgpServiceKeyIdExtractor.getInstance(getContentResolver(), mApiPendingIntentFactory); mKeyIdExtractor = OpenPgpServiceKeyIdExtractor.getInstance(getContentResolver(), mApiPendingIntentFactory);
} }
@@ -915,7 +915,7 @@ public class OpenPgpService extends Service {
private HashSet<Long> getAllowedKeyIds() { private HashSet<Long> getAllowedKeyIds() {
String currentPkg = mApiPermissionHelper.getCurrentCallingPackage(); String currentPkg = mApiPermissionHelper.getCurrentCallingPackage();
return mApiDao.getAllowedKeyIdsForApp(currentPkg); return mApiAppDao.getAllowedKeyIdsForApp(currentPkg);
} }
/** /**

View File

@@ -23,7 +23,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
public class PackageUninstallReceiver extends BroadcastReceiver { public class PackageUninstallReceiver extends BroadcastReceiver {
@@ -36,8 +36,8 @@ public class PackageUninstallReceiver extends BroadcastReceiver {
} }
String packageName = uri.getEncodedSchemeSpecificPart(); String packageName = uri.getEncodedSchemeSpecificPart();
ApiDataAccessObject apiDao = new ApiDataAccessObject(context); ApiAppDao apiAppDao = ApiAppDao.getInstance(context);
apiDao.deleteApiApp(packageName); apiAppDao.deleteApiApp(packageName);
} }
} }
} }

View File

@@ -45,7 +45,7 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKey;
import org.sufficientlysecure.keychain.pgp.SshPublicKey; import org.sufficientlysecure.keychain.pgp.SshPublicKey;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeyRepository;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
@@ -63,7 +63,7 @@ public class SshAuthenticationService extends Service {
private ApiPermissionHelper mApiPermissionHelper; private ApiPermissionHelper mApiPermissionHelper;
private KeyRepository mKeyRepository; private KeyRepository mKeyRepository;
private ApiDataAccessObject mApiDao; private ApiAppDao mApiAppDao;
private ApiPendingIntentFactory mApiPendingIntentFactory; private ApiPendingIntentFactory mApiPendingIntentFactory;
private static final List<Integer> SUPPORTED_VERSIONS = Collections.unmodifiableList(Collections.singletonList(1)); private static final List<Integer> SUPPORTED_VERSIONS = Collections.unmodifiableList(Collections.singletonList(1));
@@ -74,9 +74,9 @@ public class SshAuthenticationService extends Service {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mApiPermissionHelper = new ApiPermissionHelper(this, new ApiDataAccessObject(this)); mApiPermissionHelper = new ApiPermissionHelper(this, ApiAppDao.getInstance(this));
mKeyRepository = KeyRepository.create(this); mKeyRepository = KeyRepository.create(this);
mApiDao = new ApiDataAccessObject(this); mApiAppDao = ApiAppDao.getInstance(this);
mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext()); mApiPendingIntentFactory = new ApiPendingIntentFactory(getBaseContext());
} }
@@ -394,7 +394,7 @@ public class SshAuthenticationService extends Service {
private HashSet<Long> getAllowedKeyIds() { private HashSet<Long> getAllowedKeyIds() {
String currentPkg = mApiPermissionHelper.getCurrentCallingPackage(); String currentPkg = mApiPermissionHelper.getCurrentCallingPackage();
return mApiDao.getAllowedKeyIdsForApp(currentPkg); return mApiAppDao.getAllowedKeyIdsForApp(currentPkg);
} }
/** /**

View File

@@ -37,7 +37,7 @@ import org.bouncycastle.util.encoders.Hex;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.model.ApiApp; import org.sufficientlysecure.keychain.model.ApiApp;
import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.ui.base.BaseActivity; import org.sufficientlysecure.keychain.ui.base.BaseActivity;
import org.sufficientlysecure.keychain.ui.dialog.AdvancedAppSettingsDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.AdvancedAppSettingsDialogFragment;
import timber.log.Timber; import timber.log.Timber;
@@ -54,7 +54,7 @@ public class AppSettingsActivity extends BaseActivity {
// model // model
ApiApp mApiApp; ApiApp mApiApp;
private ApiDataAccessObject apiDataAccessObject; private ApiAppDao apiAppDao;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -76,7 +76,7 @@ public class AppSettingsActivity extends BaseActivity {
return; return;
} }
apiDataAccessObject = new ApiDataAccessObject(this); apiAppDao = ApiAppDao.getInstance(this);
loadData(savedInstanceState); loadData(savedInstanceState);
} }
@@ -170,7 +170,7 @@ public class AppSettingsActivity extends BaseActivity {
} }
private void loadData(Bundle savedInstanceState) { private void loadData(Bundle savedInstanceState) {
mApiApp = apiDataAccessObject.getApiApp(packageName); mApiApp = apiAppDao.getApiApp(packageName);
// get application name and icon from package manager // get application name and icon from package manager
String appName; String appName;
@@ -211,7 +211,7 @@ public class AppSettingsActivity extends BaseActivity {
} }
private void revokeAccess() { private void revokeAccess() {
apiDataAccessObject.deleteApiApp(packageName); apiAppDao.deleteApiApp(packageName);
finish(); finish();
} }

View File

@@ -33,7 +33,7 @@ import android.widget.ListView;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ListFragmentWorkaround; import org.sufficientlysecure.keychain.compatibility.ListFragmentWorkaround;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter; import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter;
import org.sufficientlysecure.keychain.ui.adapter.KeySelectableAdapter; import org.sufficientlysecure.keychain.ui.adapter.KeySelectableAdapter;
@@ -44,7 +44,7 @@ public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround i
private static final String ARG_PACKAGE_NAME = "package_name"; private static final String ARG_PACKAGE_NAME = "package_name";
private KeySelectableAdapter mAdapter; private KeySelectableAdapter mAdapter;
private ApiDataAccessObject mApiDao; private ApiAppDao mApiAppDao;
private String packageName; private String packageName;
@@ -66,7 +66,7 @@ public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround i
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mApiDao = new ApiDataAccessObject(getActivity()); mApiAppDao = ApiAppDao.getInstance(getActivity());
} }
@Override @Override
@@ -104,7 +104,7 @@ public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround i
// application this would come from a resource. // application this would come from a resource.
setEmptyText(getString(R.string.list_empty)); setEmptyText(getString(R.string.list_empty));
Set<Long> checked = mApiDao.getAllowedKeyIdsForApp(packageName); Set<Long> checked = mApiAppDao.getAllowedKeyIdsForApp(packageName);
mAdapter = new KeySelectableAdapter(getActivity(), null, 0, checked); mAdapter = new KeySelectableAdapter(getActivity(), null, 0, checked);
setListAdapter(mAdapter); setListAdapter(mAdapter);
getListView().setOnItemClickListener(mAdapter); getListView().setOnItemClickListener(mAdapter);
@@ -137,7 +137,7 @@ public class AppSettingsAllowedKeysListFragment extends ListFragmentWorkaround i
} */ } */
public void saveAllowedKeys() { public void saveAllowedKeys() {
mApiDao.saveAllowedKeyIdsForApp(packageName, getSelectedMasterKeyIds()); mApiAppDao.saveAllowedKeyIdsForApp(packageName, getSelectedMasterKeyIds());
} }
@Override @Override

View File

@@ -41,7 +41,7 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.model.ApiApp; import org.sufficientlysecure.keychain.model.ApiApp;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.remote.ui.AppsListFragment.ApiAppAdapter; import org.sufficientlysecure.keychain.remote.ui.AppsListFragment.ApiAppAdapter;
import org.sufficientlysecure.keychain.ui.base.RecyclerFragment; import org.sufficientlysecure.keychain.ui.base.RecyclerFragment;
import org.sufficientlysecure.keychain.ui.keyview.loader.AsyncTaskLiveData; import org.sufficientlysecure.keychain.ui.keyview.loader.AsyncTaskLiveData;
@@ -169,14 +169,14 @@ public class AppsListFragment extends RecyclerFragment<ApiAppAdapter> {
} }
public static class ApiAppsLiveData extends AsyncTaskLiveData<List<ListedApp>> { public static class ApiAppsLiveData extends AsyncTaskLiveData<List<ListedApp>> {
private final ApiDataAccessObject apiDao; private final ApiAppDao apiAppDao;
private final PackageManager packageManager; private final PackageManager packageManager;
ApiAppsLiveData(Context context) { ApiAppsLiveData(Context context) {
super(context, null); super(context, null);
packageManager = getContext().getPackageManager(); packageManager = getContext().getPackageManager();
apiDao = new ApiDataAccessObject(context); apiAppDao = ApiAppDao.getInstance(context);
} }
@Override @Override
@@ -191,7 +191,7 @@ public class AppsListFragment extends RecyclerFragment<ApiAppAdapter> {
} }
private void loadRegisteredApps(ArrayList<ListedApp> result) { private void loadRegisteredApps(ArrayList<ListedApp> result) {
List<ApiApp> registeredApiApps = apiDao.getAllApiApps(); List<ApiApp> registeredApiApps = apiAppDao.getAllApiApps();
for (ApiApp apiApp : registeredApiApps) { for (ApiApp apiApp : registeredApiApps) {
ListedApp listedApp; ListedApp listedApp;

View File

@@ -27,12 +27,12 @@ import android.graphics.drawable.Drawable;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.model.ApiApp; import org.sufficientlysecure.keychain.model.ApiApp;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import timber.log.Timber; import timber.log.Timber;
class RemoteRegisterPresenter { class RemoteRegisterPresenter {
private final ApiDataAccessObject apiDao; private final ApiAppDao apiAppDao;
private final PackageManager packageManager; private final PackageManager packageManager;
private final Context context; private final Context context;
@@ -45,7 +45,7 @@ class RemoteRegisterPresenter {
RemoteRegisterPresenter(Context context) { RemoteRegisterPresenter(Context context) {
this.context = context; this.context = context;
apiDao = new ApiDataAccessObject(context); apiAppDao = ApiAppDao.getInstance(context);
packageManager = context.getPackageManager(); packageManager = context.getPackageManager();
} }
@@ -76,7 +76,7 @@ class RemoteRegisterPresenter {
} }
void onClickAllow() { void onClickAllow() {
apiDao.insertApiApp(apiApp); apiAppDao.insertApiApp(apiApp);
view.finishWithResult(resultData); view.finishWithResult(resultData);
} }

View File

@@ -29,7 +29,7 @@ import org.openintents.openpgp.util.OpenPgpUtils.UserId;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeyRepository;
import org.sufficientlysecure.keychain.provider.KeyRepository.NotFoundException; import org.sufficientlysecure.keychain.provider.KeyRepository.NotFoundException;
@@ -42,7 +42,7 @@ import timber.log.Timber;
class RequestKeyPermissionPresenter { class RequestKeyPermissionPresenter {
private final Context context; private final Context context;
private final PackageManager packageManager; private final PackageManager packageManager;
private final ApiDataAccessObject apiDataAccessObject; private final ApiAppDao apiAppDao;
private final ApiPermissionHelper apiPermissionHelper; private final ApiPermissionHelper apiPermissionHelper;
private RequestKeyPermissionMvpView view; private RequestKeyPermissionMvpView view;
@@ -54,19 +54,19 @@ class RequestKeyPermissionPresenter {
static RequestKeyPermissionPresenter createRequestKeyPermissionPresenter(Context context) { static RequestKeyPermissionPresenter createRequestKeyPermissionPresenter(Context context) {
PackageManager packageManager = context.getPackageManager(); PackageManager packageManager = context.getPackageManager();
ApiDataAccessObject apiDataAccessObject = new ApiDataAccessObject(context); ApiAppDao apiAppDao = ApiAppDao.getInstance(context);
ApiPermissionHelper apiPermissionHelper = new ApiPermissionHelper(context, apiDataAccessObject); ApiPermissionHelper apiPermissionHelper = new ApiPermissionHelper(context, apiAppDao);
KeyRepository keyRepository = KeyRepository keyRepository =
KeyRepository.create(context); KeyRepository.create(context);
return new RequestKeyPermissionPresenter(context, apiDataAccessObject, apiPermissionHelper, packageManager, return new RequestKeyPermissionPresenter(context, apiAppDao, apiPermissionHelper, packageManager,
keyRepository); keyRepository);
} }
private RequestKeyPermissionPresenter(Context context, ApiDataAccessObject apiDataAccessObject, private RequestKeyPermissionPresenter(Context context, ApiAppDao apiAppDao,
ApiPermissionHelper apiPermissionHelper, PackageManager packageManager, KeyRepository keyRepository) { ApiPermissionHelper apiPermissionHelper, PackageManager packageManager, KeyRepository keyRepository) {
this.context = context; this.context = context;
this.apiDataAccessObject = apiDataAccessObject; this.apiAppDao = apiAppDao;
this.apiPermissionHelper = apiPermissionHelper; this.apiPermissionHelper = apiPermissionHelper;
this.packageManager = packageManager; this.packageManager = packageManager;
this.keyRepository = keyRepository; this.keyRepository = keyRepository;
@@ -160,7 +160,7 @@ class RequestKeyPermissionPresenter {
} }
void onClickAllow() { void onClickAllow() {
apiDataAccessObject.addAllowedKeyIdForApp(packageName, masterKeyId); apiAppDao.addAllowedKeyIdForApp(packageName, masterKeyId);
view.finish(); view.finish();
} }

View File

@@ -32,7 +32,7 @@ import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpUtils; import org.openintents.openpgp.util.OpenPgpUtils;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.remote.ui.adapter.SelectSignKeyAdapter; import org.sufficientlysecure.keychain.remote.ui.adapter.SelectSignKeyAdapter;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity; import org.sufficientlysecure.keychain.ui.CreateKeyActivity;
@@ -49,7 +49,7 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<SelectSignKeyA
private Intent mResult; private Intent mResult;
private String mPrefUid; private String mPrefUid;
private ApiDataAccessObject mApiDao; private ApiAppDao mApiAppDao;
private String mPackageName; private String mPackageName;
/** /**
@@ -71,7 +71,7 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<SelectSignKeyA
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mApiDao = new ApiDataAccessObject(getActivity()); mApiAppDao = ApiAppDao.getInstance(getActivity());
} }
/** /**
@@ -173,7 +173,7 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment<SelectSignKeyA
@Override @Override
public void onSelectKeyItemClicked(long masterKeyId) { public void onSelectKeyItemClicked(long masterKeyId) {
mApiDao.addAllowedKeyIdForApp(mPackageName, masterKeyId); mApiAppDao.addAllowedKeyIdForApp(mPackageName, masterKeyId);
mResult.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, masterKeyId); mResult.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, masterKeyId);
getActivity().setResult(Activity.RESULT_OK, mResult); getActivity().setResult(Activity.RESULT_OK, mResult);

View File

@@ -52,7 +52,7 @@ import com.mikepenz.materialdrawer.util.KeyboardUtil;
import org.openintents.ssh.authentication.SshAuthenticationApi; import org.openintents.ssh.authentication.SshAuthenticationApi;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.livedata.KeyInfoInteractor.KeyInfo; import org.sufficientlysecure.keychain.livedata.KeyInfoInteractor.KeyInfo;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.remote.ui.RemoteSecurityTokenOperationActivity; import org.sufficientlysecure.keychain.remote.ui.RemoteSecurityTokenOperationActivity;
import org.sufficientlysecure.keychain.remote.ui.dialog.RemoteSelectAuthenticationKeyPresenter.RemoteSelectAuthenticationKeyView; import org.sufficientlysecure.keychain.remote.ui.dialog.RemoteSelectAuthenticationKeyPresenter.RemoteSelectAuthenticationKeyView;
import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
@@ -101,8 +101,8 @@ public class RemoteSelectAuthenticationKeyActivity extends FragmentActivity {
Intent originalIntent = callingIntent.getParcelableExtra( Intent originalIntent = callingIntent.getParcelableExtra(
RemoteSecurityTokenOperationActivity.EXTRA_DATA); RemoteSecurityTokenOperationActivity.EXTRA_DATA);
ApiDataAccessObject apiDao = new ApiDataAccessObject(getBaseContext()); ApiAppDao apiAppDao = ApiAppDao.getInstance(getBaseContext());
apiDao.addAllowedKeyIdForApp(packageName, masterKeyId); apiAppDao.addAllowedKeyIdForApp(packageName, masterKeyId);
originalIntent.putExtra(SshAuthenticationApi.EXTRA_KEY_ID, String.valueOf(masterKeyId)); originalIntent.putExtra(SshAuthenticationApi.EXTRA_KEY_ID, String.valueOf(masterKeyId));

View File

@@ -38,7 +38,7 @@ import org.sufficientlysecure.keychain.model.ApiApp;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
@@ -57,14 +57,14 @@ class RemoteSelectIdentityKeyPresenter {
private UserId userId; private UserId userId;
private long selectedMasterKeyId; private long selectedMasterKeyId;
private byte[] generatedKeyData; private byte[] generatedKeyData;
private ApiDataAccessObject apiDao; private ApiAppDao apiAppDao;
private ApiApp apiApp; private ApiApp apiApp;
RemoteSelectIdentityKeyPresenter(Context context, RemoteSelectIdViewModel viewModel, LifecycleOwner lifecycleOwner) { RemoteSelectIdentityKeyPresenter(Context context, RemoteSelectIdViewModel viewModel, LifecycleOwner lifecycleOwner) {
this.context = context; this.context = context;
this.viewModel = viewModel; this.viewModel = viewModel;
this.apiDao = new ApiDataAccessObject(context); this.apiAppDao = ApiAppDao.getInstance(context);
packageManager = context.getPackageManager(); packageManager = context.getPackageManager();
@@ -200,15 +200,15 @@ class RemoteSelectIdentityKeyPresenter {
} }
void onHighlightFinished() { void onHighlightFinished() {
apiDao.insertApiApp(apiApp); apiAppDao.insertApiApp(apiApp);
apiDao.addAllowedKeyIdForApp(apiApp.package_name(), selectedMasterKeyId); apiAppDao.addAllowedKeyIdForApp(apiApp.package_name(), selectedMasterKeyId);
view.finishAndReturn(selectedMasterKeyId); view.finishAndReturn(selectedMasterKeyId);
} }
void onImportOpSuccess(ImportKeyResult result) { void onImportOpSuccess(ImportKeyResult result) {
long importedMasterKeyId = result.getImportedMasterKeyIds()[0]; long importedMasterKeyId = result.getImportedMasterKeyIds()[0];
apiDao.insertApiApp(apiApp); apiAppDao.insertApiApp(apiApp);
apiDao.addAllowedKeyIdForApp(apiApp.package_name(), selectedMasterKeyId); apiAppDao.addAllowedKeyIdForApp(apiApp.package_name(), selectedMasterKeyId);
view.finishAndReturn(importedMasterKeyId); view.finishAndReturn(importedMasterKeyId);
} }

View File

@@ -24,7 +24,7 @@ import org.sufficientlysecure.keychain.operations.CertifyOperation;
import org.sufficientlysecure.keychain.operations.results.CertifyResult; import org.sufficientlysecure.keychain.operations.results.CertifyResult;
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult; import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiAppDao;
import org.sufficientlysecure.keychain.provider.AutocryptPeerDao; import org.sufficientlysecure.keychain.provider.AutocryptPeerDao;
import org.sufficientlysecure.keychain.provider.KeyRepositorySaveTest; import org.sufficientlysecure.keychain.provider.KeyRepositorySaveTest;
import org.sufficientlysecure.keychain.provider.KeyWritableRepository; import org.sufficientlysecure.keychain.provider.KeyWritableRepository;
@@ -63,7 +63,7 @@ public class KeychainExternalProviderTest {
KeyWritableRepository.create(RuntimeEnvironment.application); KeyWritableRepository.create(RuntimeEnvironment.application);
ContentResolver contentResolver = RuntimeEnvironment.application.getContentResolver(); ContentResolver contentResolver = RuntimeEnvironment.application.getContentResolver();
ApiPermissionHelper apiPermissionHelper; ApiPermissionHelper apiPermissionHelper;
ApiDataAccessObject apiDao; ApiAppDao apiAppDao;
AutocryptPeerDao autocryptPeerDao; AutocryptPeerDao autocryptPeerDao;
@@ -80,16 +80,16 @@ public class KeychainExternalProviderTest {
ShadowBinder.setCallingUid(PACKAGE_UID); ShadowBinder.setCallingUid(PACKAGE_UID);
apiDao = new ApiDataAccessObject(RuntimeEnvironment.application); apiAppDao = ApiAppDao.getInstance(RuntimeEnvironment.application);
apiPermissionHelper = new ApiPermissionHelper(RuntimeEnvironment.application, apiDao); apiPermissionHelper = new ApiPermissionHelper(RuntimeEnvironment.application, apiAppDao);
autocryptPeerDao = AutocryptPeerDao.getInstance(RuntimeEnvironment.application); autocryptPeerDao = AutocryptPeerDao.getInstance(RuntimeEnvironment.application);
apiDao.insertApiApp(ApiApp.create(PACKAGE_NAME, PACKAGE_SIGNATURE)); apiAppDao.insertApiApp(ApiApp.create(PACKAGE_NAME, PACKAGE_SIGNATURE));
} }
@Test(expected = AccessControlException.class) @Test(expected = AccessControlException.class)
public void testPermission__withMissingPackage() throws Exception { public void testPermission__withMissingPackage() throws Exception {
apiDao.deleteApiApp(PACKAGE_NAME); apiAppDao.deleteApiApp(PACKAGE_NAME);
contentResolver.query( contentResolver.query(
EmailStatus.CONTENT_URI, EmailStatus.CONTENT_URI,
@@ -100,8 +100,8 @@ public class KeychainExternalProviderTest {
@Test(expected = AccessControlException.class) @Test(expected = AccessControlException.class)
public void testPermission__withWrongPackageCert() throws Exception { public void testPermission__withWrongPackageCert() throws Exception {
apiDao.deleteApiApp(PACKAGE_NAME); apiAppDao.deleteApiApp(PACKAGE_NAME);
apiDao.insertApiApp(ApiApp.create(PACKAGE_NAME, new byte[] { 1, 2, 4 })); apiAppDao.insertApiApp(ApiApp.create(PACKAGE_NAME, new byte[] { 1, 2, 4 }));
contentResolver.query( contentResolver.query(
EmailStatus.CONTENT_URI, EmailStatus.CONTENT_URI,