Merge branch 'master' of github.com:open-keychain/open-keychain

This commit is contained in:
Dominik Schürmann 2014-08-01 09:34:10 +02:00
commit 6ab19ca363
3 changed files with 72 additions and 15 deletions

View File

@ -1,5 +1,6 @@
package org.sufficientlysecure.keychain.provider; package org.sufficientlysecure.keychain.provider;
import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
@ -33,6 +34,7 @@ public class CachedPublicKeyRing extends KeyRing {
mUri = uri; mUri = uri;
} }
@Override
public long getMasterKeyId() throws PgpGeneralException { public long getMasterKeyId() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
@ -59,6 +61,17 @@ public class CachedPublicKeyRing extends KeyRing {
return getMasterKeyId(); return getMasterKeyId();
} }
public byte[] getFingerprint() throws PgpGeneralException {
try {
Object data = mProviderHelper.getGenericData(mUri,
KeychainContract.KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB);
return (byte[]) data;
} catch (ProviderHelper.NotFoundException e) {
throw new PgpGeneralException(e);
}
}
@Override
public String getPrimaryUserId() throws PgpGeneralException { public String getPrimaryUserId() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
@ -74,6 +87,7 @@ public class CachedPublicKeyRing extends KeyRing {
return getPrimaryUserId(); return getPrimaryUserId();
} }
@Override
public boolean isRevoked() throws PgpGeneralException { public boolean isRevoked() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
@ -85,6 +99,7 @@ public class CachedPublicKeyRing extends KeyRing {
} }
} }
@Override
public boolean canCertify() throws PgpGeneralException { public boolean canCertify() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
@ -96,21 +111,32 @@ public class CachedPublicKeyRing extends KeyRing {
} }
} }
@Override
public long getEncryptId() throws PgpGeneralException { public long getEncryptId() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Cursor subkeys = getSubkeys();
KeychainContract.KeyRings.MASTER_KEY_ID, // TODO if (subkeys != null) {
ProviderHelper.FIELD_TYPE_INTEGER); try {
return (Long) data; while (subkeys.moveToNext()) {
} catch(ProviderHelper.NotFoundException e) { if (subkeys.getInt(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.CAN_ENCRYPT)) != 0) {
return subkeys.getLong(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.KEY_ID));
}
}
} finally {
subkeys.close();
}
}
} catch(Exception e) {
throw new PgpGeneralException(e); throw new PgpGeneralException(e);
} }
throw new PgpGeneralException("No encrypt key found");
} }
@Override
public boolean hasEncrypt() throws PgpGeneralException { public boolean hasEncrypt() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
KeychainContract.KeyRings.CAN_ENCRYPT, // TODO KeychainContract.KeyRings.HAS_ENCRYPT,
ProviderHelper.FIELD_TYPE_INTEGER); ProviderHelper.FIELD_TYPE_INTEGER);
return (Long) data > 0; return (Long) data > 0;
} catch(ProviderHelper.NotFoundException e) { } catch(ProviderHelper.NotFoundException e) {
@ -118,21 +144,32 @@ public class CachedPublicKeyRing extends KeyRing {
} }
} }
@Override
public long getSignId() throws PgpGeneralException { public long getSignId() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Cursor subkeys = getSubkeys();
KeychainContract.KeyRings.MASTER_KEY_ID, // TODO if (subkeys != null) {
ProviderHelper.FIELD_TYPE_INTEGER); try {
return (Long) data; while (subkeys.moveToNext()) {
} catch(ProviderHelper.NotFoundException e) { if (subkeys.getInt(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.CAN_SIGN)) != 0) {
return subkeys.getLong(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.KEY_ID));
}
}
} finally {
subkeys.close();
}
}
} catch(Exception e) {
throw new PgpGeneralException(e); throw new PgpGeneralException(e);
} }
throw new PgpGeneralException("No sign key found");
} }
@Override
public boolean hasSign() throws PgpGeneralException { public boolean hasSign() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
KeychainContract.KeyRings.CAN_SIGN, // TODO KeychainContract.KeyRings.HAS_SIGN,
ProviderHelper.FIELD_TYPE_INTEGER); ProviderHelper.FIELD_TYPE_INTEGER);
return (Long) data > 0; return (Long) data > 0;
} catch(ProviderHelper.NotFoundException e) { } catch(ProviderHelper.NotFoundException e) {
@ -140,6 +177,7 @@ public class CachedPublicKeyRing extends KeyRing {
} }
} }
@Override
public int getVerified() throws PgpGeneralException { public int getVerified() throws PgpGeneralException {
try { try {
Object data = mProviderHelper.getGenericData(mUri, Object data = mProviderHelper.getGenericData(mUri,
@ -160,6 +198,10 @@ public class CachedPublicKeyRing extends KeyRing {
} catch(ProviderHelper.NotFoundException e) { } catch(ProviderHelper.NotFoundException e) {
throw new PgpGeneralException(e); throw new PgpGeneralException(e);
} }
}
private Cursor getSubkeys() throws PgpGeneralException {
Uri keysUri = KeychainContract.Keys.buildKeysUri(Long.toString(extractOrGetMasterKeyId()));
return mProviderHelper.getContentResolver().query(keysUri, null, null, null, null);
} }
} }

View File

@ -1024,4 +1024,8 @@ public class ProviderHelper {
} }
} }
} }
public ContentResolver getContentResolver() {
return mContentResolver;
}
} }

View File

@ -135,6 +135,9 @@ public class KeychainIntentService extends IntentService
// delete file securely // delete file securely
public static final String DELETE_FILE = "deleteFile"; public static final String DELETE_FILE = "deleteFile";
// import key
public static final String IMPORT_KEY_LIST = "import_key_list";
// export key // export key
public static final String EXPORT_OUTPUT_STREAM = "export_output_stream"; public static final String EXPORT_OUTPUT_STREAM = "export_output_stream";
public static final String EXPORT_FILENAME = "export_filename"; public static final String EXPORT_FILENAME = "export_filename";
@ -384,9 +387,15 @@ public class KeychainIntentService extends IntentService
} }
} else if (ACTION_IMPORT_KEYRING.equals(action)) { } else if (ACTION_IMPORT_KEYRING.equals(action)) {
try { try {
List<ParcelableKeyRing> entries;
if (data.containsKey(IMPORT_KEY_LIST)) {
// get entries from intent
entries = data.getParcelableArrayList(IMPORT_KEY_LIST);
} else {
// get entries from cached file // get entries from cached file
FileImportCache cache = new FileImportCache(this); FileImportCache cache = new FileImportCache(this);
List<ParcelableKeyRing> entries = cache.readCache(); entries = cache.readCache();
}
PgpImportExport pgpImportExport = new PgpImportExport(this, this); PgpImportExport pgpImportExport = new PgpImportExport(this, this);
ImportKeyResult result = pgpImportExport.importKeyRings(entries); ImportKeyResult result = pgpImportExport.importKeyRings(entries);
@ -520,6 +529,8 @@ public class KeychainIntentService extends IntentService
FileImportCache cache = new FileImportCache(this); FileImportCache cache = new FileImportCache(this);
cache.writeCache(keyRings); cache.writeCache(keyRings);
Bundle importData = new Bundle(); Bundle importData = new Bundle();
// This is not going through binder, nothing to fear of
importData.putParcelableArrayList(IMPORT_KEY_LIST, keyRings);
importIntent.putExtra(EXTRA_DATA, importData); importIntent.putExtra(EXTRA_DATA, importData);
importIntent.putExtra(EXTRA_MESSENGER, mMessenger); importIntent.putExtra(EXTRA_MESSENGER, mMessenger);