introduce AbstractDao, fix import of keys (missing delete in KeychainProvider)
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user