diff options
20 files changed, 332 insertions, 227 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java index e5f901c7f..c42446c9e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java @@ -50,13 +50,17 @@ public class ExportHelper { } public void deleteKey(Uri dataUri, Handler deleteHandler) { - // Create a new Messenger for the communication back - Messenger messenger = new Messenger(deleteHandler); - long masterKeyId = ProviderHelper.getMasterKeyId(mActivity, dataUri); - - DeleteKeyDialogFragment deleteKeyDialog = DeleteKeyDialogFragment.newInstance(messenger, - new long[]{ masterKeyId }); - deleteKeyDialog.show(mActivity.getSupportFragmentManager(), "deleteKeyDialog"); + try { + long masterKeyId = ProviderHelper.getMasterKeyId(mActivity, dataUri); + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(deleteHandler); + DeleteKeyDialogFragment deleteKeyDialog = DeleteKeyDialogFragment.newInstance(messenger, + new long[]{ masterKeyId }); + deleteKeyDialog.show(mActivity.getSupportFragmentManager(), "deleteKeyDialog"); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } } /** diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java index 1c1322e89..7b022b694 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java @@ -54,6 +54,7 @@ import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactory import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; +import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.PassphraseCacheService; @@ -199,7 +200,7 @@ public class PgpDecryptVerify { */ private PgpDecryptVerifyResult decryptVerify(InputStream in) throws IOException, PgpGeneralException, PGPException, SignatureException { - PgpDecryptVerifyResult returnData = new PgpDecryptVerifyResult(); + PgpDecryptVerifyResult result = new PgpDecryptVerifyResult(); PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPEncryptedDataList enc; @@ -227,6 +228,7 @@ public class PgpDecryptVerify { PGPPBEEncryptedData encryptedDataSymmetric = null; PGPSecretKey secretKey = null; Iterator<?> it = enc.getEncryptedDataObjects(); + boolean asymmetricPacketFound = false; boolean symmetricPacketFound = false; // find secret key while (it.hasNext()) { @@ -235,18 +237,31 @@ public class PgpDecryptVerify { updateProgress(R.string.progress_finding_key, currentProgress, 100); PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) obj; - long masterKeyId = ProviderHelper.getMasterKeyId(mContext, - KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(encData.getKeyID())) - ); - PGPSecretKeyRing secretKeyRing = ProviderHelper.getPGPSecretKeyRing(mContext, masterKeyId); + + long masterKeyId = 0; + PGPSecretKeyRing secretKeyRing = null; + try { + // get master key id for this encryption key id + masterKeyId = ProviderHelper.getMasterKeyId(mContext, + KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(encData.getKeyID())) + ); + // get actual keyring object based on master key id + secretKeyRing = ProviderHelper.getPGPSecretKeyRing(mContext, masterKeyId); + } catch (ProviderHelper.NotFoundException e) { + // continue with the next packet in the while loop + continue; + } if (secretKeyRing == null) { - throw new PgpGeneralException(mContext.getString(R.string.error_no_secret_key_found)); + // continue with the next packet in the while loop + continue; } secretKey = secretKeyRing.getSecretKey(encData.getKeyID()); if (secretKey == null) { - throw new PgpGeneralException(mContext.getString(R.string.error_no_secret_key_found)); + // continue with the next packet in the while loop + continue; } - // secret key exists in database + + /* secret key exists in database! */ // allow only a specific key for decryption? if (mAllowedKeyIds != null) { @@ -255,11 +270,15 @@ public class PgpDecryptVerify { Log.d(Constants.TAG, "masterKeyId: " + masterKeyId); if (!mAllowedKeyIds.contains(masterKeyId)) { - throw new PgpGeneralException( - mContext.getString(R.string.error_no_secret_key_found)); + // this key is in our db, but NOT allowed! + // continue with the next packet in the while loop + continue; } } + /* secret key exists in database and is allowed! */ + asymmetricPacketFound = true; + encryptedDataAsymmetric = encData; // if no passphrase was explicitly set try to get it from the cache service @@ -271,16 +290,20 @@ public class PgpDecryptVerify { // if passphrase was not cached, return here // indicating that a passphrase is missing! if (mPassphrase == null) { - returnData.setKeyIdPassphraseNeeded(masterKeyId); - returnData.setStatus(PgpDecryptVerifyResult.KEY_PASSHRASE_NEEDED); - return returnData; + result.setKeyIdPassphraseNeeded(masterKeyId); + result.setStatus(PgpDecryptVerifyResult.KEY_PASSHRASE_NEEDED); + return result; } } - // break out of while, only get first object here + // break out of while, only decrypt the first packet where we have a key // TODO???: There could be more pgp objects, which are not decrypted! break; } else if (mAllowSymmetricDecryption && obj instanceof PGPPBEEncryptedData) { + /* + * When mAllowSymmetricDecryption == true and we find a data packet here, + * we do not search for other available asymmetric packets! + */ symmetricPacketFound = true; encryptedDataSymmetric = (PGPPBEEncryptedData) obj; @@ -288,11 +311,11 @@ public class PgpDecryptVerify { // if no passphrase is given, return here // indicating that a passphrase is missing! if (mPassphrase == null) { - returnData.setStatus(PgpDecryptVerifyResult.SYMMETRIC_PASSHRASE_NEEDED); - return returnData; + result.setStatus(PgpDecryptVerifyResult.SYMMETRIC_PASSHRASE_NEEDED); + return result; } - // break out of while, only get first object here + // break out of while, only decrypt the first packet // TODO???: There could be more pgp objects, which are not decrypted! break; } @@ -311,11 +334,7 @@ public class PgpDecryptVerify { encryptedData = encryptedDataSymmetric; currentProgress += 5; - } else { - if (secretKey == null) { - throw new PgpGeneralException(mContext.getString(R.string.error_no_secret_key_found)); - } - + } else if (asymmetricPacketFound) { currentProgress += 5; updateProgress(R.string.progress_extracting_key, currentProgress, 100); PGPPrivateKey privateKey; @@ -341,6 +360,9 @@ public class PgpDecryptVerify { encryptedData = encryptedDataAsymmetric; currentProgress += 5; + } else { + // no packet has been found where we have the corresponding secret key in our db + throw new PgpGeneralException(mContext.getString(R.string.error_no_secret_key_found)); } PGPObjectFactory plainFact = new PGPObjectFactory(clear); @@ -368,8 +390,14 @@ public class PgpDecryptVerify { PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk; for (int i = 0; i < sigList.size(); ++i) { signature = sigList.get(i); - signatureKey = ProviderHelper - .getPGPPublicKeyRing(mContext, signature.getKeyID()).getPublicKey(); + + // TODO: rework this code, seems wonky! + try { + signatureKey = ProviderHelper + .getPGPPublicKeyRingWithKeyId(mContext, signature.getKeyID()).getPublicKey(); + } catch (ProviderHelper.NotFoundException e) { + Log.d(Constants.TAG, "key not found!"); + } if (signatureKeyId == 0) { signatureKeyId = signature.getKeyID(); } @@ -379,10 +407,12 @@ public class PgpDecryptVerify { signatureIndex = i; signatureKeyId = signature.getKeyID(); String userId = null; - PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingWithKeyId( - mContext, signatureKeyId); - if (signKeyRing != null) { + try { + PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingWithKeyId( + mContext, signatureKeyId); userId = PgpKeyHelper.getMainUserId(signKeyRing.getPublicKey()); + } catch (ProviderHelper.NotFoundException e) { + Log.d(Constants.TAG, "key not found!"); } signatureResult.setUserId(userId); break; @@ -398,6 +428,7 @@ public class PgpDecryptVerify { signature.init(contentVerifierBuilderProvider, signatureKey); } else { + Log.d(Constants.TAG, "SIGNATURE_UNKNOWN_PUB_KEY"); signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY); } @@ -436,6 +467,7 @@ public class PgpDecryptVerify { try { signature.update(buffer, 0, n); } catch (SignatureException e) { + Log.d(Constants.TAG, "SIGNATURE_ERROR"); signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR); signature = null; } @@ -469,7 +501,12 @@ public class PgpDecryptVerify { // TODO: implement CERTIFIED! if (validKeyBinding & validSignature) { + Log.d(Constants.TAG, "SIGNATURE_SUCCESS_UNCERTIFIED"); signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED); + } else { + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR); + Log.e(Constants.TAG, "Error!\nvalidKeyBinding: " + validKeyBinding + + "\nvalidSignature: " + validSignature); } } } @@ -493,8 +530,8 @@ public class PgpDecryptVerify { updateProgress(R.string.progress_done, 100, 100); - returnData.setSignatureResult(signatureResult); - return returnData; + result.setSignatureResult(signatureResult); + return result; } /** @@ -512,7 +549,7 @@ public class PgpDecryptVerify { */ private PgpDecryptVerifyResult verifyCleartextSignature(ArmoredInputStream aIn) throws IOException, PgpGeneralException, PGPException, SignatureException { - PgpDecryptVerifyResult returnData = new PgpDecryptVerifyResult(); + PgpDecryptVerifyResult result = new PgpDecryptVerifyResult(); OpenPgpSignatureResult signatureResult = new OpenPgpSignatureResult(); // cleartext signatures are never encrypted ;) signatureResult.setSignatureOnly(true); @@ -559,17 +596,21 @@ public class PgpDecryptVerify { // find data about this subkey HashMap<String, Object> data = ProviderHelper.getGenericData(mContext, KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(signature.getKeyID())), - new String[] { KeyRings.MASTER_KEY_ID, KeyRings.USER_ID }, - new int[] { ProviderHelper.FIELD_TYPE_INTEGER, ProviderHelper.FIELD_TYPE_STRING }); + new String[]{KeyRings.MASTER_KEY_ID, KeyRings.USER_ID}, + new int[]{ProviderHelper.FIELD_TYPE_INTEGER, ProviderHelper.FIELD_TYPE_STRING}); // any luck? otherwise, try next. - if(data.get(KeyRings.MASTER_KEY_ID) == null) { + if (data.get(KeyRings.MASTER_KEY_ID) == null) { signature = null; // do NOT reset signatureKeyId, that one is shown when no known one is found! continue; } // this one can't fail now (yay database constraints) - signatureKey = ProviderHelper.getPGPPublicKeyRing(mContext, (Long) data.get(KeyRings.MASTER_KEY_ID)).getPublicKey(); + try { + signatureKey = ProviderHelper.getPGPPublicKeyRing(mContext, (Long) data.get(KeyRings.MASTER_KEY_ID)).getPublicKey(); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } signatureResult.setUserId((String) data.get(KeyRings.USER_ID)); break; @@ -578,11 +619,12 @@ public class PgpDecryptVerify { signatureResult.setKeyId(signatureKeyId); if (signature == null) { + Log.d(Constants.TAG, "SIGNATURE_UNKNOWN_PUB_KEY"); signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY); - returnData.setSignatureResult(signatureResult); + result.setSignatureResult(signatureResult); updateProgress(R.string.progress_done, 100, 100); - return returnData; + return result; } JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = @@ -612,16 +654,21 @@ public class PgpDecryptVerify { boolean validKeyBinding = verifyKeyBinding(mContext, signature, signatureKey); boolean validSignature = signature.verify(); - if (validSignature & validKeyBinding) { + if (validKeyBinding & validSignature) { + Log.d(Constants.TAG, "SIGNATURE_SUCCESS_UNCERTIFIED"); signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED); + } else { + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR); + Log.e(Constants.TAG, "Error!\nvalidKeyBinding: " + validKeyBinding + + "\nvalidSignature: " + validSignature); } // TODO: what about SIGNATURE_SUCCESS_CERTIFIED and SIGNATURE_ERROR???? - returnData.setSignatureResult(signatureResult); + result.setSignatureResult(signatureResult); updateProgress(R.string.progress_done, 100, 100); - return returnData; + return result; } private static boolean verifyKeyBinding(Context context, @@ -629,11 +676,13 @@ public class PgpDecryptVerify { long signatureKeyId = signature.getKeyID(); boolean validKeyBinding = false; - PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingWithKeyId(context, - signatureKeyId); PGPPublicKey mKey = null; - if (signKeyRing != null) { + try { + PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingWithKeyId(context, + signatureKeyId); mKey = signKeyRing.getPublicKey(); + } catch (ProviderHelper.NotFoundException e) { + Log.d(Constants.TAG, "key not found"); } if (signature.getKeyID() != mKey.getKeyID()) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java index b329a6fc9..2b518c7e6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpHelper.java @@ -24,17 +24,12 @@ import android.content.pm.PackageManager.NameNotFoundException; import org.spongycastle.openpgp.PGPEncryptedDataList; import org.spongycastle.openpgp.PGPObjectFactory; -import org.spongycastle.openpgp.PGPPublicKeyEncryptedData; import org.spongycastle.openpgp.PGPPublicKeyRing; -import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPUtil; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.pgp.exception.NoAsymmetricEncryptionException; -import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; -import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ProgressDialogUpdater; @@ -43,7 +38,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.security.SecureRandom; -import java.util.Iterator; import java.util.regex.Pattern; public class PgpHelper { @@ -76,52 +70,6 @@ public class PgpHelper { return "OpenPGP Keychain v" + getVersion(context); } - public static long getDecryptionKeyId(Context context, InputStream inputStream) - throws PgpGeneralException, NoAsymmetricEncryptionException, IOException { - InputStream in = PGPUtil.getDecoderStream(inputStream); - PGPObjectFactory pgpF = new PGPObjectFactory(in); - PGPEncryptedDataList enc; - Object o = pgpF.nextObject(); - - // the first object might be a PGP marker packet. - if (o instanceof PGPEncryptedDataList) { - enc = (PGPEncryptedDataList) o; - } else { - enc = (PGPEncryptedDataList) pgpF.nextObject(); - } - - if (enc == null) { - throw new PgpGeneralException(context.getString(R.string.error_invalid_data)); - } - - // TODO: currently we always only look at the first known key - // find the secret key - PGPSecretKey secretKey = null; - Iterator<?> it = enc.getEncryptedDataObjects(); - boolean gotAsymmetricEncryption = false; - while (it.hasNext()) { - Object obj = it.next(); - if (obj instanceof PGPPublicKeyEncryptedData) { - gotAsymmetricEncryption = true; - PGPPublicKeyEncryptedData pbe = (PGPPublicKeyEncryptedData) obj; - secretKey = ProviderHelper.getPGPSecretKeyRing(context, pbe.getKeyID()).getSecretKey(); - if (secretKey != null) { - break; - } - } - } - - if (!gotAsymmetricEncryption) { - throw new NoAsymmetricEncryptionException(); - } - - if (secretKey == null) { - return Id.key.none; - } - - return secretKey.getKeyID(); - } - public static int getStreamContent(Context context, InputStream inStream) throws IOException { InputStream in = PGPUtil.getDecoderStream(inStream); PGPObjectFactory pgpF = new PGPObjectFactory(in); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java index 89a949922..854f065ec 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java @@ -194,11 +194,14 @@ public class PgpImportExport { arOutStream.setHeader("Version", PgpHelper.getFullVersion(mContext)); updateProgress(progress * 100 / masterKeyIdsSize, 100); - PGPPublicKeyRing publicKeyRing = - ProviderHelper.getPGPPublicKeyRing(mContext, pubKeyMasterId); - if (publicKeyRing != null) { + try { + PGPPublicKeyRing publicKeyRing = ProviderHelper.getPGPPublicKeyRing(mContext, pubKeyMasterId); + publicKeyRing.encode(arOutStream); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + // TODO: inform user? } if (mKeychainServiceListener.hasServiceStopped()) { @@ -217,12 +220,15 @@ public class PgpImportExport { arOutStream.setHeader("Version", PgpHelper.getFullVersion(mContext)); updateProgress(progress * 100 / masterKeyIdsSize, 100); - PGPSecretKeyRing secretKeyRing = - ProviderHelper.getPGPSecretKeyRing(mContext, secretKeyMasterId); - if (secretKeyRing != null) { + try { + PGPSecretKeyRing secretKeyRing = ProviderHelper.getPGPSecretKeyRing(mContext, secretKeyMasterId); secretKeyRing.encode(arOutStream); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + // TODO: inform user? } + if (mKeychainServiceListener.hasServiceStopped()) { arOutStream.close(); return null; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java index d4311367f..cd00f000c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyHelper.java @@ -201,9 +201,12 @@ public class PgpKeyHelper { } public static PGPPublicKey getEncryptPublicKey(Context context, long masterKeyId) { - PGPPublicKeyRing keyRing = ProviderHelper.getPGPPublicKeyRing(context, masterKeyId); - if (keyRing == null) { - Log.e(Constants.TAG, "keyRing is null!"); + PGPPublicKeyRing keyRing = null; + try { + keyRing = ProviderHelper.getPGPPublicKeyRing(context, masterKeyId); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + // TODO: throw exception here! return null; } Vector<PGPPublicKey> encryptKeys = getUsableEncryptKeys(keyRing); @@ -215,8 +218,12 @@ public class PgpKeyHelper { } public static PGPSecretKey getCertificationKey(Context context, long masterKeyId) { - PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId); - if (keyRing == null) { + PGPSecretKeyRing keyRing = null; + try { + keyRing = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + // TODO: throw exception here! return null; } Vector<PGPSecretKey> signingKeys = getUsableCertificationKeys(keyRing); @@ -227,8 +234,12 @@ public class PgpKeyHelper { } public static PGPSecretKey getSigningKey(Context context, long masterKeyId) { - PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId); - if (keyRing == null) { + PGPSecretKeyRing keyRing = null; + try { + keyRing = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + // TODO: throw exception here! return null; } Vector<PGPSecretKey> signingKeys = getUsableSigningKeys(keyRing); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java index 653d8bce4..53444f739 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java @@ -235,7 +235,11 @@ public class PgpSignEncrypt { PGPSecretKeyRing signingKeyRing = null; PGPPrivateKey signaturePrivateKey = null; if (enableSignature) { - signingKeyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(mContext, mSignatureKeyId); + try { + signingKeyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(mContext, mSignatureKeyId); + } catch (ProviderHelper.NotFoundException e) { + throw new PgpGeneralException(mContext.getString(R.string.error_signature_failed)); + } signingKey = PgpKeyHelper.getSigningKey(mContext, mSignatureKeyId); if (signingKey == null) { throw new PgpGeneralException(mContext.getString(R.string.error_signature_failed)); @@ -464,8 +468,12 @@ public class PgpSignEncrypt { throw new PgpGeneralException(mContext.getString(R.string.error_no_signature_key)); } - PGPSecretKeyRing signingKeyRing = - ProviderHelper.getPGPSecretKeyRingWithKeyId(mContext, mSignatureKeyId); + PGPSecretKeyRing signingKeyRing; + try { + signingKeyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(mContext, mSignatureKeyId); + } catch (ProviderHelper.NotFoundException e) { + throw new PgpGeneralException(mContext.getString(R.string.error_signature_failed)); + } PGPSecretKey signingKey = PgpKeyHelper.getSigningKey(mContext, mSignatureKeyId); if (signingKey == null) { throw new PgpGeneralException(mContext.getString(R.string.error_signature_failed)); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java index f39368e19..28376096d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java @@ -64,6 +64,15 @@ import java.util.Set; public class ProviderHelper { + public static class NotFoundException extends Exception { + public NotFoundException() { + } + + public NotFoundException(String name) { + super(name); + } + } + // If we ever switch to api level 11, we can ditch this whole mess! public static final int FIELD_TYPE_NULL = 1; // this is called integer to stay coherent with the constants in Cursor (api level 11) @@ -113,7 +122,7 @@ public class ProviderHelper { * Find the master key id related to a given query. The id will either be extracted from the * query, which should work for all specific /key_rings/ queries, or will be queried if it can't. */ - public static long getMasterKeyId(Context context, Uri queryUri) { + public static long getMasterKeyId(Context context, Uri queryUri) throws NotFoundException { // try extracting from the uri first String firstSegment = queryUri.getPathSegments().get(1); if(!firstSegment.equals("find")) try { @@ -123,10 +132,11 @@ public class ProviderHelper { Log.d(Constants.TAG, "Couldn't get masterKeyId from URI, querying..."); } Object data = getGenericData(context, queryUri, KeyRings.MASTER_KEY_ID, FIELD_TYPE_INTEGER); - if(data != null) + if(data != null) { return (Long) data; - // TODO better error handling? - return 0L; + } else { + throw new NotFoundException(); + } } public static Map<Long, PGPKeyRing> getPGPKeyRings(Context context, Uri queryUri) { @@ -149,33 +159,35 @@ public class ProviderHelper { return result; } - public static PGPKeyRing getPGPKeyRing(Context context, Uri queryUri) { + + public static PGPKeyRing getPGPKeyRing(Context context, Uri queryUri) throws NotFoundException { Map<Long, PGPKeyRing> result = getPGPKeyRings(context, queryUri); - if(result.isEmpty()) - return null; - return result.values().iterator().next(); + if(result.isEmpty()) { + throw new NotFoundException("PGPKeyRing object not found!"); + } else { + return result.values().iterator().next(); + } } - public static PGPPublicKeyRing getPGPPublicKeyRingWithKeyId(Context context, long keyId) { + public static PGPPublicKeyRing getPGPPublicKeyRingWithKeyId(Context context, long keyId) + throws NotFoundException { Uri uri = KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(keyId)); long masterKeyId = getMasterKeyId(context, uri); - if(masterKeyId != 0) - return getPGPPublicKeyRing(context, masterKeyId); - return null; + return getPGPPublicKeyRing(context, masterKeyId); } - public static PGPSecretKeyRing getPGPSecretKeyRingWithKeyId(Context context, long keyId) { + + public static PGPSecretKeyRing getPGPSecretKeyRingWithKeyId(Context context, long keyId) + throws NotFoundException { Uri uri = KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(keyId)); long masterKeyId = getMasterKeyId(context, uri); - if(masterKeyId != 0) - return getPGPSecretKeyRing(context, masterKeyId); - return null; + return getPGPSecretKeyRing(context, masterKeyId); } /** * Retrieves the actual PGPPublicKeyRing object from the database blob based on the masterKeyId */ public static PGPPublicKeyRing getPGPPublicKeyRing(Context context, - long masterKeyId) { + long masterKeyId) throws NotFoundException { Uri queryUri = KeyRingData.buildPublicKeyRingUri(Long.toString(masterKeyId)); return (PGPPublicKeyRing) getPGPKeyRing(context, queryUri); } @@ -184,7 +196,7 @@ public class ProviderHelper { * Retrieves the actual PGPSecretKeyRing object from the database blob based on the maserKeyId */ public static PGPSecretKeyRing getPGPSecretKeyRing(Context context, - long masterKeyId) { + long masterKeyId) throws NotFoundException { Uri queryUri = KeyRingData.buildSecretKeyRingUri(Long.toString(masterKeyId)); return (PGPSecretKeyRing) getPGPKeyRing(context, queryUri); } @@ -198,7 +210,12 @@ public class ProviderHelper { long masterKeyId = masterKey.getKeyID(); // IF there is a secret key, preserve it! - PGPSecretKeyRing secretRing = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId); + PGPSecretKeyRing secretRing = null; + try { + secretRing = ProviderHelper.getPGPSecretKeyRing(context, masterKeyId); + } catch (NotFoundException e) { + Log.e(Constants.TAG, "key not found!"); + } // delete old version of this keyRing, which also deletes all keys and userIds on cascade try { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java index 0a3ec3c3b..321d2a83f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java @@ -32,6 +32,7 @@ import android.widget.TextView; import com.beardedhen.androidbootstrap.BootstrapButton; +import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; @@ -40,6 +41,7 @@ import org.sufficientlysecure.keychain.ui.EditKeyActivity; import org.sufficientlysecure.keychain.ui.SelectSecretKeyLayoutFragment; import org.sufficientlysecure.keychain.ui.adapter.KeyValueSpinnerAdapter; import org.sufficientlysecure.keychain.util.AlgorithmNames; +import org.sufficientlysecure.keychain.util.Log; public class AccountSettingsFragment extends Fragment implements SelectSecretKeyLayoutFragment.SelectSecretKeyCallback { @@ -177,8 +179,12 @@ public class AccountSettingsFragment extends Fragment implements case REQUEST_CODE_CREATE_KEY: { if (resultCode == Activity.RESULT_OK) { // select newly created key - long masterKeyId = ProviderHelper.getMasterKeyId(getActivity(), data.getData()); - mSelectKeyFragment.selectKey(masterKeyId); + try { + long masterKeyId = ProviderHelper.getMasterKeyId(getActivity(), data.getData()); + mSelectKeyFragment.selectKey(masterKeyId); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } } break; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index 1c6aa7971..a663e6a12 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -834,7 +834,7 @@ public class KeychainIntentService extends IntentService if (e instanceof PgpGeneralMsgIdException) { e = ((PgpGeneralMsgIdException) e).getContextualized(this); } - Log.e(Constants.TAG, "ApgService Exception: ", e); + Log.e(Constants.TAG, "KeychainIntentService Exception: ", e); e.printStackTrace(); Bundle data = new Bundle(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index 962b304c7..cbc71ce6a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -33,7 +33,6 @@ import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.support.v4.util.LongSparseArray; -import android.util.Log; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPPrivateKey; @@ -48,6 +47,7 @@ import org.sufficientlysecure.keychain.helper.Preferences; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.util.Log; import java.util.Date; import java.util.Iterator; @@ -171,11 +171,12 @@ public class PassphraseCacheService extends Service { // try to get master key id which is used as an identifier for cached passphrases long masterKeyId = keyId; if (masterKeyId != Id.key.symmetric) { - masterKeyId = ProviderHelper.getMasterKeyId(this, - KeychainContract.KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(keyId))); - // Failure - if(masterKeyId == 0) + try { + masterKeyId = ProviderHelper.getMasterKeyId(this, + KeychainContract.KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(keyId))); + } catch (ProviderHelper.NotFoundException e) { return null; + } } Log.d(TAG, "getCachedPassphraseImpl() for masterKeyId " + masterKeyId); @@ -230,6 +231,8 @@ public class PassphraseCacheService extends Service { } } catch (PGPException e) { // silently catch + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); } return true; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java index de8a9cd6d..e2e09f052 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java @@ -224,8 +224,9 @@ public class CertifyKeyActivity extends ActionBarActivity implements * handles the UI bits of the signing process on the UI thread */ private void initiateSigning() { - PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRing(this, mPubKeyId); - if (pubring != null) { + try { + PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRing(this, mPubKeyId); + // if we have already signed this key, dont bother doing it again boolean alreadySigned = false; @@ -248,14 +249,14 @@ public class CertifyKeyActivity extends ActionBarActivity implements String passphrase = PassphraseCacheService.getCachedPassphrase(this, mMasterKeyId); if (passphrase == null) { PassphraseDialogFragment.show(this, mMasterKeyId, - new Handler() { - @Override - public void handleMessage(Message message) { - if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) { - startSigning(); + new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) { + startSigning(); + } } - } - }); + }); // bail out; need to wait until the user has entered the passphrase before trying again return; } else { @@ -268,6 +269,8 @@ public class CertifyKeyActivity extends ActionBarActivity implements setResult(RESULT_CANCELED); finish(); } + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java index 2169bbd77..ca75cbd4f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java @@ -87,7 +87,7 @@ public class DecryptMessageFragment extends DecryptFragment { String ciphertext = getArguments().getString(ARG_CIPHERTEXT); if (ciphertext != null) { - mMessage.setText(ciphertext); + mCiphertext = ciphertext; decryptStart(null); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index 3d910e45e..4e21b172e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -286,9 +286,13 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener } else { Log.d(Constants.TAG, "uri: " + mDataUri); - // get master key id using row id - long masterKeyId = ProviderHelper.getMasterKeyId(this, mDataUri); - finallyEdit(masterKeyId); + try { + // get master key id using row id + long masterKeyId = ProviderHelper.getMasterKeyId(this, mDataUri); + finallyEdit(masterKeyId); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } } } @@ -296,15 +300,16 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener private void finallyEdit(final long masterKeyId) { if (masterKeyId != 0) { PGPSecretKey masterKey = null; - mKeyRing = ProviderHelper.getPGPSecretKeyRing(this, masterKeyId); - if (mKeyRing != null) { + try { + mKeyRing = ProviderHelper.getPGPSecretKeyRing(this, masterKeyId); + masterKey = mKeyRing.getSecretKey(); mMasterCanSign = PgpKeyHelper.isCertificationKey(mKeyRing.getSecretKey()); for (PGPSecretKey key : new IterableIterator<PGPSecretKey>(mKeyRing.getSecretKeys())) { mKeys.add(key); mKeysUsages.add(-1); // get usage when view is created } - } else { + } catch (ProviderHelper.NotFoundException e) { Log.e(Constants.TAG, "Keyring not found with masterKeyId: " + masterKeyId); AppMsg.makeText(this, R.string.error_no_secret_key_found, AppMsg.STYLE_ALERT).show(); // TODO diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java index 8400cf397..2ec4dd89e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptAsymmetricFragment.java @@ -34,11 +34,14 @@ import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; +import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; +import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.util.Log; import java.util.HashMap; import java.util.Vector; @@ -143,28 +146,34 @@ public class EncryptAsymmetricFragment extends Fragment { private void preselectKeys(long preselectedSignatureKeyId, long[] preselectedEncryptionKeyIds) { if (preselectedSignatureKeyId != 0) { // TODO: don't use bouncy castle objects! - PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(getActivity(), - preselectedSignatureKeyId); - PGPSecretKey masterKey; - if (keyRing != null) { - masterKey = keyRing.getSecretKey(); + try { + PGPSecretKeyRing keyRing = ProviderHelper.getPGPSecretKeyRingWithKeyId(getActivity(), + preselectedSignatureKeyId); + + PGPSecretKey masterKey = keyRing.getSecretKey(); if (masterKey != null) { Vector<PGPSecretKey> signKeys = PgpKeyHelper.getUsableSigningKeys(keyRing); if (signKeys.size() > 0) { setSignatureKeyId(masterKey.getKeyID()); } } + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); } } if (preselectedEncryptionKeyIds != null) { Vector<Long> goodIds = new Vector<Long>(); for (int i = 0; i < preselectedEncryptionKeyIds.length; ++i) { - long id = ProviderHelper.getMasterKeyId(getActivity(), - KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(preselectedEncryptionKeyIds[i])) - ); // TODO check for available encrypt keys... is this even relevant? - goodIds.add(id); + try { + long id = ProviderHelper.getMasterKeyId(getActivity(), + KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(preselectedEncryptionKeyIds[i])) + ); + goodIds.add(id); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } } if (goodIds.size() > 0) { long[] keyIds = new long[goodIds.size()]; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java index 294fadab2..0dc36a792 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewCertActivity.java @@ -145,14 +145,14 @@ public class ViewCertActivity extends ActionBarActivity } PGPSignature sig = PgpConversionHelper.BytesToPGPSignature(data.getBlob(INDEX_DATA)); - PGPKeyRing signeeRing = ProviderHelper.getPGPKeyRing(this, - KeychainContract.KeyRingData.buildPublicKeyRingUri( - Long.toString(data.getLong(INDEX_MASTER_KEY_ID)))); - PGPKeyRing signerRing = ProviderHelper.getPGPKeyRing(this, - KeychainContract.KeyRingData.buildPublicKeyRingUri( - Long.toString(sig.getKeyID()))); - - if (signerRing != null) { + try { + PGPKeyRing signeeRing = ProviderHelper.getPGPKeyRing(this, + KeychainContract.KeyRingData.buildPublicKeyRingUri( + Long.toString(data.getLong(INDEX_MASTER_KEY_ID)))); + PGPKeyRing signerRing = ProviderHelper.getPGPKeyRing(this, + KeychainContract.KeyRingData.buildPublicKeyRingUri( + Long.toString(sig.getKeyID()))); + try { sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider( Constants.BOUNCY_CASTLE_PROVIDER_NAME), signeeRing.getPublicKey()); @@ -170,7 +170,7 @@ public class ViewCertActivity extends ActionBarActivity mStatus.setText("error!"); mStatus.setTextColor(getResources().getColor(R.color.alert)); } - } else { + } catch (ProviderHelper.NotFoundException e) { mStatus.setText("key unavailable"); mStatus.setTextColor(getResources().getColor(R.color.black)); } @@ -234,17 +234,20 @@ public class ViewCertActivity extends ActionBarActivity } else { viewIntent = new Intent(this, ViewKeyActivityJB.class); } - // - long signerMasterKeyId = ProviderHelper.getMasterKeyId(this, - KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mSignerKeyId)) - ); - // TODO notify user of this, maybe offer download? - if (mSignerKeyId == 0L) - return true; - viewIntent.setData(KeyRings.buildGenericKeyRingUri( - Long.toString(signerMasterKeyId)) - ); - startActivity(viewIntent); + + try { + long signerMasterKeyId = ProviderHelper.getMasterKeyId(this, + KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(Long.toString(mSignerKeyId)) + ); + viewIntent.setData(KeyRings.buildGenericKeyRingUri( + Long.toString(signerMasterKeyId)) + ); + startActivity(viewIntent); + } catch (ProviderHelper.NotFoundException e) { + // TODO notify user of this, maybe offer download? + Log.e(Constants.TAG, "key not found!", e); + } + return true; } return super.onOptionsItemSelected(item); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index cce34139c..e01f3397b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -43,6 +43,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter; import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.ShareQrCodeDialogFragment; +import org.sufficientlysecure.keychain.util.Log; import java.util.ArrayList; import java.util.HashMap; @@ -184,7 +185,7 @@ public class ViewKeyActivity extends ActionBarActivity { } private void shareKey(Uri dataUri, boolean fingerprintOnly) { - String content; + String content = null; if (fingerprintOnly) { byte[] data = (byte[]) ProviderHelper.getGenericData( this, KeychainContract.KeyRings.buildUnifiedKeyRingUri(dataUri), @@ -199,27 +200,36 @@ public class ViewKeyActivity extends ActionBarActivity { } } else { // get public keyring as ascii armored string - long masterKeyId = ProviderHelper.getMasterKeyId(this, dataUri); - ArrayList<String> keyringArmored = ProviderHelper.getKeyRingsAsArmoredString( - this, new long[]{masterKeyId}); + try { + long masterKeyId = ProviderHelper.getMasterKeyId(this, dataUri); - content = keyringArmored.get(0); + ArrayList<String> keyringArmored = ProviderHelper.getKeyRingsAsArmoredString( + this, new long[]{masterKeyId}); - // Android will fail with android.os.TransactionTooLargeException if key is too big - // see http://www.lonestarprod.com/?p=34 - if (content.length() >= 86389) { - Toast.makeText(getApplicationContext(), R.string.key_too_big_for_sharing, - Toast.LENGTH_LONG).show(); - return; + content = keyringArmored.get(0); + + // Android will fail with android.os.TransactionTooLargeException if key is too big + // see http://www.lonestarprod.com/?p=34 + if (content.length() >= 86389) { + Toast.makeText(getApplicationContext(), R.string.key_too_big_for_sharing, + Toast.LENGTH_LONG).show(); + return; + } + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); } } - // let user choose application - Intent sendIntent = new Intent(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, content); - sendIntent.setType("text/plain"); - startActivity(Intent.createChooser(sendIntent, - getResources().getText(R.string.action_share_key_with))); + if (content != null) { + // let user choose application + Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, content); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, + getResources().getText(R.string.action_share_key_with))); + } else { + Log.e(Constants.TAG, "content is null!"); + } } private void shareKeyQrCode(Uri dataUri, boolean fingerprintOnly) { @@ -230,13 +240,18 @@ public class ViewKeyActivity extends ActionBarActivity { private void copyToClipboard(Uri dataUri) { // get public keyring as ascii armored string - long masterKeyId = ProviderHelper.getMasterKeyId(this, dataUri); - ArrayList<String> keyringArmored = ProviderHelper.getKeyRingsAsArmoredString( - this, new long[]{masterKeyId}); + try { + long masterKeyId = ProviderHelper.getMasterKeyId(this, dataUri); - ClipboardReflection.copyToClipboard(this, keyringArmored.get(0)); - Toast.makeText(getApplicationContext(), R.string.key_copied_to_clipboard, Toast.LENGTH_LONG) - .show(); + ArrayList<String> keyringArmored = ProviderHelper.getKeyRingsAsArmoredString( + this, new long[]{masterKeyId}); + + ClipboardReflection.copyToClipboard(this, keyringArmored.get(0)); + Toast.makeText(getApplicationContext(), R.string.key_copied_to_clipboard, Toast.LENGTH_LONG) + .show(); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } } private void shareNfc() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivityJB.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivityJB.java index 6dc0413bb..6f52ea916 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivityJB.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivityJB.java @@ -93,6 +93,9 @@ public class ViewKeyActivityJB extends ViewKeyActivity implements CreateNdefMess } catch(IOException e) { Log.e(Constants.TAG, "Error parsing keyring", e); return null; + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + return null; } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java index 6e96a338a..3d4002696 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java @@ -328,14 +328,18 @@ public class ViewKeyMainFragment extends Fragment implements private void encryptToContact(Uri dataUri) { // TODO preselect from uri? should be feasible without trivial query - long keyId = ProviderHelper.getMasterKeyId(getActivity(), dataUri); - - long[] encryptionKeyIds = new long[]{ keyId }; - Intent intent = new Intent(getActivity(), EncryptActivity.class); - intent.setAction(EncryptActivity.ACTION_ENCRYPT); - intent.putExtra(EncryptActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds); - // used instead of startActivity set actionbar based on callingPackage - startActivityForResult(intent, 0); + try { + long keyId = ProviderHelper.getMasterKeyId(getActivity(), dataUri); + + long[] encryptionKeyIds = new long[]{ keyId }; + Intent intent = new Intent(getActivity(), EncryptActivity.class); + intent.setAction(EncryptActivity.ACTION_ENCRYPT); + intent.putExtra(EncryptActivity.EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds); + // used instead of startActivity set actionbar based on callingPackage + startActivityForResult(intent, 0); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } } private void certifyKey(Uri dataUri) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java index a3feab959..74bc73952 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java @@ -139,9 +139,9 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor secretKey = null; alert.setMessage(R.string.passphrase_for_symmetric_encryption); } else { - secretKey = ProviderHelper.getPGPSecretKeyRing(activity, secretKeyId).getSecretKey(); - - if (secretKey == null) { + try { + secretKey = ProviderHelper.getPGPSecretKeyRing(activity, secretKeyId).getSecretKey(); + } catch (ProviderHelper.NotFoundException e) { alert.setTitle(R.string.title_key_not_found); alert.setMessage(getString(R.string.key_not_found, secretKeyId)); alert.setPositiveButton(android.R.string.ok, new OnClickListener() { @@ -153,6 +153,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor mCanKB = false; return alert.create(); } + String userId = PgpKeyHelper.getMainUserIdSafe(activity, secretKey); Log.d(Constants.TAG, "User id: '" + userId + "'"); @@ -194,9 +195,13 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor sendMessageToHandler(MESSAGE_CANCEL); return; } else { - clickSecretKey = PgpKeyHelper.getKeyNum(ProviderHelper - .getPGPSecretKeyRingWithKeyId(activity, secretKeyId), - curKeyIndex); + try { + clickSecretKey = PgpKeyHelper.getKeyNum(ProviderHelper + .getPGPSecretKeyRingWithKeyId(activity, secretKeyId), + curKeyIndex); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } curKeyIndex++; // does post-increment work like C? continue; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java index b6ff139df..d2d21093e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ShareQrCodeDialogFragment.java @@ -33,6 +33,7 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; +import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.QrCodeUtils; import java.util.ArrayList; @@ -106,7 +107,12 @@ public class ShareQrCodeDialogFragment extends DialogFragment { mText.setText(R.string.share_qr_code_dialog_start); // TODO works, but - long masterKeyId = ProviderHelper.getMasterKeyId(getActivity(), dataUri); + long masterKeyId = 0; + try { + masterKeyId = ProviderHelper.getMasterKeyId(getActivity(), dataUri); + } catch (ProviderHelper.NotFoundException e) { + Log.e(Constants.TAG, "key not found!", e); + } // get public keyring as ascii armored string ArrayList<String> keyringArmored = ProviderHelper.getKeyRingsAsArmoredString( getActivity(), new long[] { masterKeyId }); |