mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 19:22:14 -05:00
fixed <unknown> user id bug, restructured code
This commit is contained in:
parent
cbc3b8ae4e
commit
66cab704e7
@ -37,7 +37,7 @@ public class PGPConversionHelper {
|
|||||||
* @param keys
|
* @param keys
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static byte[] PGPSecretKeyListToBytes(Vector<PGPSecretKey> keys) {
|
public static byte[] PGPSecretKeyListToBytes(ArrayList<PGPSecretKey> keys) {
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
for (PGPSecretKey key : keys) {
|
for (PGPSecretKey key : keys) {
|
||||||
try {
|
try {
|
||||||
|
@ -220,6 +220,19 @@ public class PGPMain {
|
|||||||
return mEditPassPhrase;
|
return mEditPassPhrase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void updateProgress(ProgressDialogUpdater progress, int message, int current,
|
||||||
|
int total) {
|
||||||
|
if (progress != null) {
|
||||||
|
progress.setProgress(message, current, total);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateProgress(ProgressDialogUpdater progress, int current, int total) {
|
||||||
|
if (progress != null) {
|
||||||
|
progress.setProgress(current, total);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new secret key. The returned PGPSecretKeyRing contains only one newly generated key
|
* Creates new secret key. The returned PGPSecretKeyRing contains only one newly generated key
|
||||||
* when this key is the new masterkey. If a masterkey is supplied in the parameters
|
* when this key is the new masterkey. If a masterkey is supplied in the parameters
|
||||||
@ -309,7 +322,6 @@ public class PGPMain {
|
|||||||
|
|
||||||
PGPKeyRingGenerator ringGen = null;
|
PGPKeyRingGenerator ringGen = null;
|
||||||
if (masterSecretKey == null) {
|
if (masterSecretKey == null) {
|
||||||
|
|
||||||
// build keyRing with only this one master key in it!
|
// build keyRing with only this one master key in it!
|
||||||
ringGen = new PGPKeyRingGenerator(PGPSignature.DEFAULT_CERTIFICATION, keyPair, "",
|
ringGen = new PGPKeyRingGenerator(PGPSignature.DEFAULT_CERTIFICATION, keyPair, "",
|
||||||
sha1Calc, null, null, certificationSignerBuilder, keyEncryptor);
|
sha1Calc, null, null, certificationSignerBuilder, keyEncryptor);
|
||||||
@ -336,71 +348,16 @@ public class PGPMain {
|
|||||||
throws PGPMain.GeneralException, NoSuchProviderException, PGPException,
|
throws PGPMain.GeneralException, NoSuchProviderException, PGPException,
|
||||||
NoSuchAlgorithmException, SignatureException, IOException, Database.GeneralException {
|
NoSuchAlgorithmException, SignatureException, IOException, Database.GeneralException {
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_buildingKey, 0, 100);
|
||||||
progress.setProgress(R.string.progress_buildingKey, 0, 100);
|
|
||||||
|
|
||||||
if (oldPassPhrase == null || oldPassPhrase.equals("")) {
|
if (oldPassPhrase == null || oldPassPhrase.equals("")) {
|
||||||
oldPassPhrase = "";
|
oldPassPhrase = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newPassPhrase == null || newPassPhrase.equals("")) {
|
if (newPassPhrase == null || newPassPhrase.equals("")) {
|
||||||
newPassPhrase = "";
|
newPassPhrase = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: What is with this code?
|
updateProgress(progress, R.string.progress_preparingMasterKey, 10, 100);
|
||||||
// Vector<String> userIds = new Vector<String>();
|
|
||||||
// Vector<PGPSecretKey> keys = new Vector<PGPSecretKey>();
|
|
||||||
|
|
||||||
// ViewGroup userIdEditors = userIdsView.getEditors();
|
|
||||||
// ViewGroup keyEditors = keysView.getEditors();
|
|
||||||
//
|
|
||||||
// boolean gotMainUserId = false;
|
|
||||||
// for (int i = 0; i < userIdEditors.getChildCount(); ++i) {
|
|
||||||
// UserIdEditor editor = (UserIdEditor) userIdEditors.getChildAt(i);
|
|
||||||
// String userId = null;
|
|
||||||
// try {
|
|
||||||
// userId = editor.getValue();
|
|
||||||
// } catch (UserIdEditor.NoNameException e) {
|
|
||||||
// throw new Apg.GeneralException(context.getString(R.string.error_userIdNeedsAName));
|
|
||||||
// } catch (UserIdEditor.NoEmailException e) {
|
|
||||||
// throw new Apg.GeneralException(
|
|
||||||
// context.getString(R.string.error_userIdNeedsAnEmailAddress));
|
|
||||||
// } catch (UserIdEditor.InvalidEmailException e) {
|
|
||||||
// throw new Apg.GeneralException("" + e);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (userId.equals("")) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (editor.isMainUserId()) {
|
|
||||||
// userIds.insertElementAt(userId, 0);
|
|
||||||
// gotMainUserId = true;
|
|
||||||
// } else {
|
|
||||||
// userIds.add(userId);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (userIds.size() == 0) {
|
|
||||||
// throw new Apg.GeneralException(context.getString(R.string.error_keyNeedsAUserId));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!gotMainUserId) {
|
|
||||||
// throw new Apg.GeneralException(
|
|
||||||
// context.getString(R.string.error_mainUserIdMustNotBeEmpty));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (keyEditors.getChildCount() == 0) {
|
|
||||||
// throw new Apg.GeneralException(context.getString(R.string.error_keyNeedsMasterKey));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// for (int i = 0; i < keyEditors.getChildCount(); ++i) {
|
|
||||||
// KeyEditor editor = (KeyEditor) keyEditors.getChildAt(i);
|
|
||||||
// keys.add(editor.getValue());
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (progress != null)
|
|
||||||
progress.setProgress(R.string.progress_preparingMasterKey, 10, 100);
|
|
||||||
|
|
||||||
int usageId = keysUsages.get(0);
|
int usageId = keysUsages.get(0);
|
||||||
boolean canSign = (usageId == Id.choice.usage.sign_only || usageId == Id.choice.usage.sign_and_encrypt);
|
boolean canSign = (usageId == Id.choice.usage.sign_only || usageId == Id.choice.usage.sign_and_encrypt);
|
||||||
@ -411,20 +368,17 @@ public class PGPMain {
|
|||||||
PGPSecretKey masterKey = keys.get(0);
|
PGPSecretKey masterKey = keys.get(0);
|
||||||
PGPPublicKey masterPublicKey = masterKey.getPublicKey();
|
PGPPublicKey masterPublicKey = masterKey.getPublicKey();
|
||||||
|
|
||||||
// TODO: why was this done?:
|
// Somehow, the PGPPublicKey already has an empty certification attached to it, we remove
|
||||||
// PGPPublicKey tmpKey = masterKey.getPublicKey();
|
// that now before adding the new ones
|
||||||
// PGPPublicKey masterPublicKey = new PGPPublicKey(tmpKey.getAlgorithm(),
|
masterPublicKey = PGPPublicKey.removeCertification(masterPublicKey, "");
|
||||||
// tmpKey.getKey(new BouncyCastleProvider()), tmpKey.getCreationTime());
|
|
||||||
|
|
||||||
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider(
|
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider(
|
||||||
BOUNCY_CASTLE_PROVIDER_NAME).build(oldPassPhrase.toCharArray());
|
BOUNCY_CASTLE_PROVIDER_NAME).build(oldPassPhrase.toCharArray());
|
||||||
PGPPrivateKey masterPrivateKey = masterKey.extractPrivateKey(keyDecryptor);
|
PGPPrivateKey masterPrivateKey = masterKey.extractPrivateKey(keyDecryptor);
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_certifyingMasterKey, 20, 100);
|
||||||
progress.setProgress(R.string.progress_certifyingMasterKey, 20, 100);
|
|
||||||
for (int i = 0; i < userIds.size(); ++i) {
|
|
||||||
String userId = userIds.get(i);
|
|
||||||
|
|
||||||
|
for (String userId : userIds) {
|
||||||
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
||||||
masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA1)
|
masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA1)
|
||||||
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME);
|
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
@ -437,7 +391,7 @@ public class PGPMain {
|
|||||||
masterPublicKey = PGPPublicKey.addCertification(masterPublicKey, userId, certification);
|
masterPublicKey = PGPPublicKey.addCertification(masterPublicKey, userId, certification);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: cross-certify the master key with every sub key
|
// TODO: cross-certify the master key with every sub key (APG 1)
|
||||||
|
|
||||||
PGPKeyPair masterKeyPair = new PGPKeyPair(masterPublicKey, masterPrivateKey);
|
PGPKeyPair masterKeyPair = new PGPKeyPair(masterPublicKey, masterPrivateKey);
|
||||||
|
|
||||||
@ -454,7 +408,7 @@ public class PGPMain {
|
|||||||
hashedPacketsGen.setPreferredHashAlgorithms(true, PREFERRED_HASH_ALGORITHMS);
|
hashedPacketsGen.setPreferredHashAlgorithms(true, PREFERRED_HASH_ALGORITHMS);
|
||||||
hashedPacketsGen.setPreferredCompressionAlgorithms(true, PREFERRED_COMPRESSION_ALGORITHMS);
|
hashedPacketsGen.setPreferredCompressionAlgorithms(true, PREFERRED_COMPRESSION_ALGORITHMS);
|
||||||
|
|
||||||
// TODO: this doesn't work quite right yet
|
// TODO: this doesn't work quite right yet (APG 1)
|
||||||
// if (keyEditor.getExpiryDate() != null) {
|
// if (keyEditor.getExpiryDate() != null) {
|
||||||
// GregorianCalendar creationDate = new GregorianCalendar();
|
// GregorianCalendar creationDate = new GregorianCalendar();
|
||||||
// creationDate.setTime(getCreationDate(masterKey));
|
// creationDate.setTime(getCreationDate(masterKey));
|
||||||
@ -467,9 +421,7 @@ public class PGPMain {
|
|||||||
// hashedPacketsGen.setKeyExpirationTime(true, numDays * 86400);
|
// hashedPacketsGen.setKeyExpirationTime(true, numDays * 86400);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (progress != null) {
|
updateProgress(progress, R.string.progress_buildingMasterKeyRing, 30, 100);
|
||||||
progress.setProgress(R.string.progress_buildingMasterKeyRing, 30, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
// define hashing and signing algos
|
// define hashing and signing algos
|
||||||
PGPDigestCalculator sha1Calc = new JcaPGPDigestCalculatorProviderBuilder().build().get(
|
PGPDigestCalculator sha1Calc = new JcaPGPDigestCalculatorProviderBuilder().build().get(
|
||||||
@ -486,11 +438,11 @@ public class PGPMain {
|
|||||||
masterKeyPair, mainUserId, sha1Calc, hashedPacketsGen.generate(),
|
masterKeyPair, mainUserId, sha1Calc, hashedPacketsGen.generate(),
|
||||||
unhashedPacketsGen.generate(), certificationSignerBuilder, keyEncryptor);
|
unhashedPacketsGen.generate(), certificationSignerBuilder, keyEncryptor);
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_addingSubKeys, 40, 100);
|
||||||
progress.setProgress(R.string.progress_addingSubKeys, 40, 100);
|
|
||||||
for (int i = 1; i < keys.size(); ++i) {
|
for (int i = 1; i < keys.size(); ++i) {
|
||||||
if (progress != null)
|
updateProgress(progress, 40 + 50 * (i - 1) / (keys.size() - 1), 100);
|
||||||
progress.setProgress(40 + 50 * (i - 1) / (keys.size() - 1), 100);
|
|
||||||
PGPSecretKey subKey = keys.get(i);
|
PGPSecretKey subKey = keys.get(i);
|
||||||
PGPPublicKey subPublicKey = subKey.getPublicKey();
|
PGPPublicKey subPublicKey = subKey.getPublicKey();
|
||||||
|
|
||||||
@ -498,7 +450,7 @@ public class PGPMain {
|
|||||||
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(oldPassPhrase.toCharArray());
|
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(oldPassPhrase.toCharArray());
|
||||||
PGPPrivateKey subPrivateKey = subKey.extractPrivateKey(keyDecryptor2);
|
PGPPrivateKey subPrivateKey = subKey.extractPrivateKey(keyDecryptor2);
|
||||||
|
|
||||||
// TODO: now used without algorithm and creation time?!
|
// TODO: now used without algorithm and creation time?! (APG 1)
|
||||||
PGPKeyPair subKeyPair = new PGPKeyPair(subPublicKey, subPrivateKey);
|
PGPKeyPair subKeyPair = new PGPKeyPair(subPublicKey, subPrivateKey);
|
||||||
|
|
||||||
hashedPacketsGen = new PGPSignatureSubpacketGenerator();
|
hashedPacketsGen = new PGPSignatureSubpacketGenerator();
|
||||||
@ -517,7 +469,7 @@ public class PGPMain {
|
|||||||
}
|
}
|
||||||
hashedPacketsGen.setKeyFlags(true, keyFlags);
|
hashedPacketsGen.setKeyFlags(true, keyFlags);
|
||||||
|
|
||||||
// TODO: this doesn't work quite right yet
|
// TODO: this doesn't work quite right yet (APG 1)
|
||||||
// if (keyEditor.getExpiryDate() != null) {
|
// if (keyEditor.getExpiryDate() != null) {
|
||||||
// GregorianCalendar creationDate = new GregorianCalendar();
|
// GregorianCalendar creationDate = new GregorianCalendar();
|
||||||
// creationDate.setTime(getCreationDate(masterKey));
|
// creationDate.setTime(getCreationDate(masterKey));
|
||||||
@ -536,13 +488,12 @@ public class PGPMain {
|
|||||||
PGPSecretKeyRing secretKeyRing = keyGen.generateSecretKeyRing();
|
PGPSecretKeyRing secretKeyRing = keyGen.generateSecretKeyRing();
|
||||||
PGPPublicKeyRing publicKeyRing = keyGen.generatePublicKeyRing();
|
PGPPublicKeyRing publicKeyRing = keyGen.generatePublicKeyRing();
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_savingKeyRing, 90, 100);
|
||||||
progress.setProgress(R.string.progress_savingKeyRing, 90, 100);
|
|
||||||
mDatabase.saveKeyRing(secretKeyRing);
|
mDatabase.saveKeyRing(secretKeyRing);
|
||||||
mDatabase.saveKeyRing(publicKeyRing);
|
mDatabase.saveKeyRing(publicKeyRing);
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int storeKeyRingInCache(PGPKeyRing keyring) {
|
public static int storeKeyRingInCache(PGPKeyRing keyring) {
|
||||||
@ -655,9 +606,8 @@ public class PGPMain {
|
|||||||
++badKeys;
|
++badKeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null) {
|
updateProgress(progress, (int) (100 * progressIn.position() / data.getSize()), 100);
|
||||||
progress.setProgress((int) (100 * progressIn.position() / data.getSize()), 100);
|
|
||||||
}
|
|
||||||
// TODO: needed?
|
// TODO: needed?
|
||||||
// obj = objectFactory.nextObject();
|
// obj = objectFactory.nextObject();
|
||||||
|
|
||||||
@ -671,8 +621,7 @@ public class PGPMain {
|
|||||||
returnData.putInt(ApgService.RESULT_IMPORT_UPDATED, oldKeys);
|
returnData.putInt(ApgService.RESULT_IMPORT_UPDATED, oldKeys);
|
||||||
returnData.putInt(ApgService.RESULT_IMPORT_BAD, badKeys);
|
returnData.putInt(ApgService.RESULT_IMPORT_BAD, badKeys);
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
|
|
||||||
return returnData;
|
return returnData;
|
||||||
}
|
}
|
||||||
@ -683,11 +632,9 @@ public class PGPMain {
|
|||||||
Bundle returnData = new Bundle();
|
Bundle returnData = new Bundle();
|
||||||
|
|
||||||
if (keyRingIds.size() == 1) {
|
if (keyRingIds.size() == 1) {
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_exportingKey, 0, 100);
|
||||||
progress.setProgress(R.string.progress_exportingKey, 0, 100);
|
|
||||||
} else {
|
} else {
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_exportingKeys, 0, 100);
|
||||||
progress.setProgress(R.string.progress_exportingKeys, 0, 100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
|
||||||
@ -698,8 +645,7 @@ public class PGPMain {
|
|||||||
|
|
||||||
int numKeys = 0;
|
int numKeys = 0;
|
||||||
for (int i = 0; i < keyRingIds.size(); ++i) {
|
for (int i = 0; i < keyRingIds.size(); ++i) {
|
||||||
if (progress != null)
|
updateProgress(progress, i * 100 / keyRingIds.size(), 100);
|
||||||
progress.setProgress(i * 100 / keyRingIds.size(), 100);
|
|
||||||
Object obj = mDatabase.getKeyRing(keyRingIds.get(i));
|
Object obj = mDatabase.getKeyRing(keyRingIds.get(i));
|
||||||
PGPPublicKeyRing publicKeyRing;
|
PGPPublicKeyRing publicKeyRing;
|
||||||
PGPSecretKeyRing secretKeyRing;
|
PGPSecretKeyRing secretKeyRing;
|
||||||
@ -718,8 +664,7 @@ public class PGPMain {
|
|||||||
out.close();
|
out.close();
|
||||||
returnData.putInt(ApgService.RESULT_EXPORT, numKeys);
|
returnData.putInt(ApgService.RESULT_EXPORT, numKeys);
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
|
|
||||||
return returnData;
|
return returnData;
|
||||||
}
|
}
|
||||||
@ -859,8 +804,7 @@ public class PGPMain {
|
|||||||
context.getString(R.string.error_couldNotExtractPrivateKey));
|
context.getString(R.string.error_couldNotExtractPrivateKey));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingStreams, 5, 100);
|
||||||
progress.setProgress(R.string.progress_preparingStreams, 5, 100);
|
|
||||||
|
|
||||||
// encrypt and compress input file content
|
// encrypt and compress input file content
|
||||||
JcePGPDataEncryptorBuilder encryptorBuilder = new JcePGPDataEncryptorBuilder(
|
JcePGPDataEncryptorBuilder encryptorBuilder = new JcePGPDataEncryptorBuilder(
|
||||||
@ -934,8 +878,7 @@ public class PGPMain {
|
|||||||
// file name not needed, so empty string
|
// file name not needed, so empty string
|
||||||
OutputStream pOut = literalGen.open(bcpgOut, PGPLiteralData.BINARY, "", new Date(),
|
OutputStream pOut = literalGen.open(bcpgOut, PGPLiteralData.BINARY, "", new Date(),
|
||||||
new byte[1 << 16]);
|
new byte[1 << 16]);
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_encrypting, 20, 100);
|
||||||
progress.setProgress(R.string.progress_encrypting, 20, 100);
|
|
||||||
|
|
||||||
long done = 0;
|
long done = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
@ -952,16 +895,14 @@ public class PGPMain {
|
|||||||
}
|
}
|
||||||
done += n;
|
done += n;
|
||||||
if (data.getSize() != 0) {
|
if (data.getSize() != 0) {
|
||||||
if (progress != null)
|
updateProgress(progress, (int) (20 + (95 - 20) * done / data.getSize()), 100);
|
||||||
progress.setProgress((int) (20 + (95 - 20) * done / data.getSize()), 100);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
literalGen.close();
|
literalGen.close();
|
||||||
|
|
||||||
if (signatureKeyId != Id.key.none) {
|
if (signatureKeyId != Id.key.none) {
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_generatingSignature, 95, 100);
|
||||||
progress.setProgress(R.string.progress_generatingSignature, 95, 100);
|
|
||||||
if (forceV3Signature) {
|
if (forceV3Signature) {
|
||||||
signatureV3Generator.generate().encode(pOut);
|
signatureV3Generator.generate().encode(pOut);
|
||||||
} else {
|
} else {
|
||||||
@ -976,8 +917,7 @@ public class PGPMain {
|
|||||||
armorOut.close();
|
armorOut.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void signText(Context context, InputData data, OutputStream outStream,
|
public static void signText(Context context, InputData data, OutputStream outStream,
|
||||||
@ -1015,11 +955,9 @@ public class PGPMain {
|
|||||||
armorOut.close();
|
armorOut.close();
|
||||||
throw new GeneralException(context.getString(R.string.error_couldNotExtractPrivateKey));
|
throw new GeneralException(context.getString(R.string.error_couldNotExtractPrivateKey));
|
||||||
}
|
}
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingStreams, 0, 100);
|
||||||
progress.setProgress(R.string.progress_preparingStreams, 0, 100);
|
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingSignature, 30, 100);
|
||||||
progress.setProgress(R.string.progress_preparingSignature, 30, 100);
|
|
||||||
|
|
||||||
PGPSignatureGenerator signatureGenerator = null;
|
PGPSignatureGenerator signatureGenerator = null;
|
||||||
PGPV3SignatureGenerator signatureV3Generator = null;
|
PGPV3SignatureGenerator signatureV3Generator = null;
|
||||||
@ -1042,8 +980,7 @@ public class PGPMain {
|
|||||||
signatureGenerator.setHashedSubpackets(spGen.generate());
|
signatureGenerator.setHashedSubpackets(spGen.generate());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_signing, 40, 100);
|
||||||
progress.setProgress(R.string.progress_signing, 40, 100);
|
|
||||||
|
|
||||||
armorOut.beginClearText(hashAlgorithm);
|
armorOut.beginClearText(hashAlgorithm);
|
||||||
|
|
||||||
@ -1086,8 +1023,7 @@ public class PGPMain {
|
|||||||
}
|
}
|
||||||
armorOut.close();
|
armorOut.close();
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void generateSignature(Context context, InputData data, OutputStream outStream,
|
public static void generateSignature(Context context, InputData data, OutputStream outStream,
|
||||||
@ -1132,11 +1068,9 @@ public class PGPMain {
|
|||||||
if (signaturePrivateKey == null) {
|
if (signaturePrivateKey == null) {
|
||||||
throw new GeneralException(context.getString(R.string.error_couldNotExtractPrivateKey));
|
throw new GeneralException(context.getString(R.string.error_couldNotExtractPrivateKey));
|
||||||
}
|
}
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingStreams, 0, 100);
|
||||||
progress.setProgress(R.string.progress_preparingStreams, 0, 100);
|
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingSignature, 30, 100);
|
||||||
progress.setProgress(R.string.progress_preparingSignature, 30, 100);
|
|
||||||
|
|
||||||
PGPSignatureGenerator signatureGenerator = null;
|
PGPSignatureGenerator signatureGenerator = null;
|
||||||
PGPV3SignatureGenerator signatureV3Generator = null;
|
PGPV3SignatureGenerator signatureV3Generator = null;
|
||||||
@ -1164,8 +1098,7 @@ public class PGPMain {
|
|||||||
signatureGenerator.setHashedSubpackets(spGen.generate());
|
signatureGenerator.setHashedSubpackets(spGen.generate());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_signing, 40, 100);
|
||||||
progress.setProgress(R.string.progress_signing, 40, 100);
|
|
||||||
|
|
||||||
InputStream inStream = data.getInputStream();
|
InputStream inStream = data.getInputStream();
|
||||||
if (binary) {
|
if (binary) {
|
||||||
@ -1382,8 +1315,7 @@ public class PGPMain {
|
|||||||
context.getString(R.string.error_noSymmetricEncryptionPacket));
|
context.getString(R.string.error_noSymmetricEncryptionPacket));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingStreams, currentProgress, 100);
|
||||||
progress.setProgress(R.string.progress_preparingStreams, currentProgress, 100);
|
|
||||||
|
|
||||||
PGPDigestCalculatorProvider digestCalcProvider = new JcaPGPDigestCalculatorProviderBuilder()
|
PGPDigestCalculatorProvider digestCalcProvider = new JcaPGPDigestCalculatorProviderBuilder()
|
||||||
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build();
|
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build();
|
||||||
@ -1419,8 +1351,7 @@ public class PGPMain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentProgress += 5;
|
currentProgress += 5;
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_extractingKey, currentProgress, 100);
|
||||||
progress.setProgress(R.string.progress_extractingKey, currentProgress, 100);
|
|
||||||
PGPPrivateKey privateKey = null;
|
PGPPrivateKey privateKey = null;
|
||||||
try {
|
try {
|
||||||
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder()
|
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder()
|
||||||
@ -1434,8 +1365,7 @@ public class PGPMain {
|
|||||||
context.getString(R.string.error_couldNotExtractPrivateKey));
|
context.getString(R.string.error_couldNotExtractPrivateKey));
|
||||||
}
|
}
|
||||||
currentProgress += 5;
|
currentProgress += 5;
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_preparingStreams, currentProgress, 100);
|
||||||
progress.setProgress(R.string.progress_preparingStreams, currentProgress, 100);
|
|
||||||
|
|
||||||
PublicKeyDataDecryptorFactory decryptorFactory = new JcePublicKeyDataDecryptorFactoryBuilder()
|
PublicKeyDataDecryptorFactory decryptorFactory = new JcePublicKeyDataDecryptorFactoryBuilder()
|
||||||
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(privateKey);
|
.setProvider(BOUNCY_CASTLE_PROVIDER_NAME).build(privateKey);
|
||||||
@ -1546,8 +1476,7 @@ public class PGPMain {
|
|||||||
currentProgress = (int) (startProgress + (endProgress - startProgress)
|
currentProgress = (int) (startProgress + (endProgress - startProgress)
|
||||||
* (data.getStreamPosition() - startPos) / (data.getSize() - startPos));
|
* (data.getStreamPosition() - startPos) / (data.getSize() - startPos));
|
||||||
}
|
}
|
||||||
if (progress != null)
|
updateProgress(progress, currentProgress, 100);
|
||||||
progress.setProgress(currentProgress, 100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signature != null) {
|
if (signature != null) {
|
||||||
@ -1576,8 +1505,7 @@ public class PGPMain {
|
|||||||
// no integrity check
|
// no integrity check
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
return returnData;
|
return returnData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1589,8 +1517,7 @@ public class PGPMain {
|
|||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
ArmoredInputStream aIn = new ArmoredInputStream(data.getInputStream());
|
ArmoredInputStream aIn = new ArmoredInputStream(data.getInputStream());
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 0, 100);
|
||||||
progress.setProgress(R.string.progress_done, 0, 100);
|
|
||||||
|
|
||||||
// mostly taken from ClearSignedFileProcessor
|
// mostly taken from ClearSignedFileProcessor
|
||||||
ByteArrayOutputStream lineOut = new ByteArrayOutputStream();
|
ByteArrayOutputStream lineOut = new ByteArrayOutputStream();
|
||||||
@ -1615,8 +1542,7 @@ public class PGPMain {
|
|||||||
|
|
||||||
returnData.putBoolean(ApgService.RESULT_SIGNATURE, true);
|
returnData.putBoolean(ApgService.RESULT_SIGNATURE, true);
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_processingSignature, 60, 100);
|
||||||
progress.setProgress(R.string.progress_processingSignature, 60, 100);
|
|
||||||
PGPObjectFactory pgpFact = new PGPObjectFactory(aIn);
|
PGPObjectFactory pgpFact = new PGPObjectFactory(aIn);
|
||||||
|
|
||||||
PGPSignatureList sigList = (PGPSignatureList) pgpFact.nextObject();
|
PGPSignatureList sigList = (PGPSignatureList) pgpFact.nextObject();
|
||||||
@ -1690,8 +1616,7 @@ public class PGPMain {
|
|||||||
|
|
||||||
returnData.putBoolean(ApgService.RESULT_SIGNATURE_SUCCESS, signature.verify());
|
returnData.putBoolean(ApgService.RESULT_SIGNATURE_SUCCESS, signature.verify());
|
||||||
|
|
||||||
if (progress != null)
|
updateProgress(progress, R.string.progress_done, 100, 100);
|
||||||
progress.setProgress(R.string.progress_done, 100, 100);
|
|
||||||
return returnData;
|
return returnData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,6 +148,7 @@ public class Database extends SQLiteOpenHelper {
|
|||||||
KeyRings.TYPE + " " + KeyRings.TYPE_type + ", " +
|
KeyRings.TYPE + " " + KeyRings.TYPE_type + ", " +
|
||||||
KeyRings.WHO_ID + " " + KeyRings.WHO_ID_type + ", " +
|
KeyRings.WHO_ID + " " + KeyRings.WHO_ID_type + ", " +
|
||||||
KeyRings.KEY_RING_DATA + " " + KeyRings.KEY_RING_DATA_type + ");");
|
KeyRings.KEY_RING_DATA + " " + KeyRings.KEY_RING_DATA_type + ");");
|
||||||
|
|
||||||
|
|
||||||
db.execSQL("CREATE TABLE " + Keys.TABLE_NAME + " (" +
|
db.execSQL("CREATE TABLE " + Keys.TABLE_NAME + " (" +
|
||||||
Keys._ID + " " + Keys._ID_type + "," +
|
Keys._ID + " " + Keys._ID_type + "," +
|
||||||
|
@ -529,13 +529,10 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
|
|||||||
if (newPassPhrase == null) {
|
if (newPassPhrase == null) {
|
||||||
newPassPhrase = oldPassPhrase;
|
newPassPhrase = oldPassPhrase;
|
||||||
}
|
}
|
||||||
@SuppressWarnings("unchecked")
|
ArrayList<String> userIds = data.getStringArrayList(USER_IDS);
|
||||||
ArrayList<String> userIds = (ArrayList<String>) data.getSerializable(USER_IDS);
|
|
||||||
ArrayList<PGPSecretKey> keys = PGPConversionHelper.BytesToPGPSecretKeyList(data
|
ArrayList<PGPSecretKey> keys = PGPConversionHelper.BytesToPGPSecretKeyList(data
|
||||||
.getByteArray(KEYS));
|
.getByteArray(KEYS));
|
||||||
@SuppressWarnings("unchecked")
|
ArrayList<Integer> keysUsages = data.getIntegerArrayList(KEYS_USAGES);
|
||||||
ArrayList<Integer> keysUsages = (ArrayList<Integer>) data
|
|
||||||
.getSerializable(KEYS_USAGES);
|
|
||||||
long masterKeyId = data.getLong(MASTER_KEY_ID);
|
long masterKeyId = data.getLong(MASTER_KEY_ID);
|
||||||
|
|
||||||
/* Operation */
|
/* Operation */
|
||||||
|
@ -58,6 +58,7 @@ import android.widget.LinearLayout;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Vector;
|
import java.util.Vector;
|
||||||
|
|
||||||
@ -73,7 +74,6 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
public static final String EXTRA_GENERATE_DEFAULT_KEYS = "generateDefaultKeys";
|
public static final String EXTRA_GENERATE_DEFAULT_KEYS = "generateDefaultKeys";
|
||||||
public static final String EXTRA_KEY_ID = "keyId";
|
public static final String EXTRA_KEY_ID = "keyId";
|
||||||
|
|
||||||
private Intent mIntent = null;
|
|
||||||
private ActionBar mActionBar;
|
private ActionBar mActionBar;
|
||||||
|
|
||||||
private PGPSecretKeyRing mKeyRing = null;
|
private PGPSecretKeyRing mKeyRing = null;
|
||||||
@ -150,136 +150,12 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
mKeysUsages = new Vector<Integer>();
|
mKeysUsages = new Vector<Integer>();
|
||||||
|
|
||||||
// Catch Intents opened from other apps
|
// Catch Intents opened from other apps
|
||||||
mIntent = getIntent();
|
Intent intent = getIntent();
|
||||||
|
String action = intent.getAction();
|
||||||
// Handle intents
|
if (ACTION_CREATE_KEY.equals(action)) {
|
||||||
Bundle extras = mIntent.getExtras();
|
handleActionCreateKey(intent);
|
||||||
if (ACTION_CREATE_KEY.equals(mIntent.getAction())) {
|
} else if (ACTION_EDIT_KEY.equals(action)) {
|
||||||
mActionBar.setTitle(R.string.title_createKey);
|
handleActionEditKey(intent);
|
||||||
|
|
||||||
mCurrentPassPhrase = "";
|
|
||||||
|
|
||||||
if (extras != null) {
|
|
||||||
// if userId is given, prefill the fields
|
|
||||||
if (extras.containsKey(EXTRA_USER_IDS)) {
|
|
||||||
Log.d(Constants.TAG, "UserIds are given!");
|
|
||||||
mUserIds.add(extras.getString(EXTRA_USER_IDS));
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no passphrase is given
|
|
||||||
if (extras.containsKey(EXTRA_NO_PASSPHRASE)) {
|
|
||||||
boolean noPassphrase = extras.getBoolean(EXTRA_NO_PASSPHRASE);
|
|
||||||
if (noPassphrase) {
|
|
||||||
// check "no passphrase" checkbox and remove button
|
|
||||||
mNoPassphrase.setChecked(true);
|
|
||||||
mChangePassPhrase.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate key
|
|
||||||
if (extras.containsKey(EXTRA_GENERATE_DEFAULT_KEYS)) {
|
|
||||||
boolean generateDefaultKeys = extras.getBoolean(EXTRA_GENERATE_DEFAULT_KEYS);
|
|
||||||
if (generateDefaultKeys) {
|
|
||||||
|
|
||||||
// build layout in handler after generating keys not directly in onCreate
|
|
||||||
mBuildLayout = false;
|
|
||||||
|
|
||||||
// Send all information needed to service generate keys in other thread
|
|
||||||
Intent intent = new Intent(this, ApgService.class);
|
|
||||||
intent.putExtra(ApgService.EXTRA_ACTION,
|
|
||||||
ApgService.ACTION_GENERATE_DEFAULT_RSA_KEYS);
|
|
||||||
|
|
||||||
// fill values for this action
|
|
||||||
Bundle data = new Bundle();
|
|
||||||
data.putString(ApgService.SYMMETRIC_PASSPHRASE, mCurrentPassPhrase);
|
|
||||||
|
|
||||||
intent.putExtra(ApgService.EXTRA_DATA, data);
|
|
||||||
|
|
||||||
// Message is received after generating is done in ApgService
|
|
||||||
ApgServiceHandler saveHandler = new ApgServiceHandler(this,
|
|
||||||
R.string.progress_generating, ProgressDialog.STYLE_SPINNER) {
|
|
||||||
public void handleMessage(Message message) {
|
|
||||||
// handle messages by standard ApgHandler first
|
|
||||||
super.handleMessage(message);
|
|
||||||
|
|
||||||
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
|
|
||||||
// get new key from data bundle returned from service
|
|
||||||
Bundle data = message.getData();
|
|
||||||
PGPSecretKeyRing masterKeyRing = PGPConversionHelper
|
|
||||||
.BytesToPGPSecretKeyRing(data
|
|
||||||
.getByteArray(ApgService.RESULT_NEW_KEY));
|
|
||||||
PGPSecretKeyRing subKeyRing = PGPConversionHelper
|
|
||||||
.BytesToPGPSecretKeyRing(data
|
|
||||||
.getByteArray(ApgService.RESULT_NEW_KEY2));
|
|
||||||
|
|
||||||
// add master key
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<PGPSecretKey> masterIt = masterKeyRing.getSecretKeys();
|
|
||||||
mKeys.add(masterIt.next());
|
|
||||||
mKeysUsages.add(Id.choice.usage.sign_only);
|
|
||||||
|
|
||||||
// add sub key
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Iterator<PGPSecretKey> subIt = subKeyRing.getSecretKeys();
|
|
||||||
subIt.next(); // masterkey
|
|
||||||
mKeys.add(subIt.next());
|
|
||||||
mKeysUsages.add(Id.choice.usage.encrypt_only);
|
|
||||||
|
|
||||||
buildLayout();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a new Messenger for the communication back
|
|
||||||
Messenger messenger = new Messenger(saveHandler);
|
|
||||||
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
|
|
||||||
|
|
||||||
saveHandler.showProgressDialog(this);
|
|
||||||
|
|
||||||
// start service with intent
|
|
||||||
startService(intent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ACTION_EDIT_KEY.equals(mIntent.getAction())) {
|
|
||||||
mActionBar.setTitle(R.string.title_editKey);
|
|
||||||
|
|
||||||
mCurrentPassPhrase = PGPMain.getEditPassPhrase();
|
|
||||||
if (mCurrentPassPhrase == null) {
|
|
||||||
mCurrentPassPhrase = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mCurrentPassPhrase.equals("")) {
|
|
||||||
// check "no passphrase" checkbox and remove button
|
|
||||||
mNoPassphrase.setChecked(true);
|
|
||||||
mChangePassPhrase.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (extras != null) {
|
|
||||||
|
|
||||||
if (extras.containsKey(EXTRA_KEY_ID)) {
|
|
||||||
long keyId = mIntent.getExtras().getLong(EXTRA_KEY_ID);
|
|
||||||
|
|
||||||
if (keyId != 0) {
|
|
||||||
PGPSecretKey masterKey = null;
|
|
||||||
mKeyRing = PGPMain.getSecretKeyRing(keyId);
|
|
||||||
if (mKeyRing != null) {
|
|
||||||
masterKey = PGPHelper.getMasterKey(mKeyRing);
|
|
||||||
for (PGPSecretKey key : new IterableIterator<PGPSecretKey>(
|
|
||||||
mKeyRing.getSecretKeys())) {
|
|
||||||
mKeys.add(key);
|
|
||||||
mKeysUsages.add(-1); // get usage when view is created
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (masterKey != null) {
|
|
||||||
for (String userId : new IterableIterator<String>(
|
|
||||||
masterKey.getUserIDs())) {
|
|
||||||
mUserIds.add(userId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mChangePassPhrase.setOnClickListener(new OnClickListener() {
|
mChangePassPhrase.setOnClickListener(new OnClickListener() {
|
||||||
@ -309,6 +185,149 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle intent action to create new key
|
||||||
|
*
|
||||||
|
* @param intent
|
||||||
|
*/
|
||||||
|
private void handleActionCreateKey(Intent intent) {
|
||||||
|
Bundle extras = intent.getExtras();
|
||||||
|
|
||||||
|
mActionBar.setTitle(R.string.title_createKey);
|
||||||
|
|
||||||
|
mCurrentPassPhrase = "";
|
||||||
|
|
||||||
|
if (extras != null) {
|
||||||
|
// if userId is given, prefill the fields
|
||||||
|
if (extras.containsKey(EXTRA_USER_IDS)) {
|
||||||
|
Log.d(Constants.TAG, "UserIds are given!");
|
||||||
|
mUserIds.add(extras.getString(EXTRA_USER_IDS));
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no passphrase is given
|
||||||
|
if (extras.containsKey(EXTRA_NO_PASSPHRASE)) {
|
||||||
|
boolean noPassphrase = extras.getBoolean(EXTRA_NO_PASSPHRASE);
|
||||||
|
if (noPassphrase) {
|
||||||
|
// check "no passphrase" checkbox and remove button
|
||||||
|
mNoPassphrase.setChecked(true);
|
||||||
|
mChangePassPhrase.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate key
|
||||||
|
if (extras.containsKey(EXTRA_GENERATE_DEFAULT_KEYS)) {
|
||||||
|
boolean generateDefaultKeys = extras.getBoolean(EXTRA_GENERATE_DEFAULT_KEYS);
|
||||||
|
if (generateDefaultKeys) {
|
||||||
|
|
||||||
|
// build layout in handler after generating keys not directly in onCreate
|
||||||
|
mBuildLayout = false;
|
||||||
|
|
||||||
|
// Send all information needed to service generate keys in other thread
|
||||||
|
Intent serviceIntent = new Intent(this, ApgService.class);
|
||||||
|
serviceIntent.putExtra(ApgService.EXTRA_ACTION,
|
||||||
|
ApgService.ACTION_GENERATE_DEFAULT_RSA_KEYS);
|
||||||
|
|
||||||
|
// fill values for this action
|
||||||
|
Bundle data = new Bundle();
|
||||||
|
data.putString(ApgService.SYMMETRIC_PASSPHRASE, mCurrentPassPhrase);
|
||||||
|
|
||||||
|
serviceIntent.putExtra(ApgService.EXTRA_DATA, data);
|
||||||
|
|
||||||
|
// Message is received after generating is done in ApgService
|
||||||
|
ApgServiceHandler saveHandler = new ApgServiceHandler(this,
|
||||||
|
R.string.progress_generating, ProgressDialog.STYLE_SPINNER) {
|
||||||
|
public void handleMessage(Message message) {
|
||||||
|
// handle messages by standard ApgHandler first
|
||||||
|
super.handleMessage(message);
|
||||||
|
|
||||||
|
if (message.arg1 == ApgServiceHandler.MESSAGE_OKAY) {
|
||||||
|
// get new key from data bundle returned from service
|
||||||
|
Bundle data = message.getData();
|
||||||
|
PGPSecretKeyRing masterKeyRing = PGPConversionHelper
|
||||||
|
.BytesToPGPSecretKeyRing(data
|
||||||
|
.getByteArray(ApgService.RESULT_NEW_KEY));
|
||||||
|
PGPSecretKeyRing subKeyRing = PGPConversionHelper
|
||||||
|
.BytesToPGPSecretKeyRing(data
|
||||||
|
.getByteArray(ApgService.RESULT_NEW_KEY2));
|
||||||
|
|
||||||
|
// add master key
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Iterator<PGPSecretKey> masterIt = masterKeyRing.getSecretKeys();
|
||||||
|
mKeys.add(masterIt.next());
|
||||||
|
mKeysUsages.add(Id.choice.usage.sign_only);
|
||||||
|
|
||||||
|
// add sub key
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Iterator<PGPSecretKey> subIt = subKeyRing.getSecretKeys();
|
||||||
|
subIt.next(); // masterkey
|
||||||
|
mKeys.add(subIt.next());
|
||||||
|
mKeysUsages.add(Id.choice.usage.encrypt_only);
|
||||||
|
|
||||||
|
buildLayout();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create a new Messenger for the communication back
|
||||||
|
Messenger messenger = new Messenger(saveHandler);
|
||||||
|
serviceIntent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
|
||||||
|
|
||||||
|
saveHandler.showProgressDialog(this);
|
||||||
|
|
||||||
|
// start service with intent
|
||||||
|
startService(serviceIntent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle intent action to edit existing key
|
||||||
|
*
|
||||||
|
* @param intent
|
||||||
|
*/
|
||||||
|
private void handleActionEditKey(Intent intent) {
|
||||||
|
Bundle extras = intent.getExtras();
|
||||||
|
|
||||||
|
mActionBar.setTitle(R.string.title_editKey);
|
||||||
|
|
||||||
|
mCurrentPassPhrase = PGPMain.getEditPassPhrase();
|
||||||
|
if (mCurrentPassPhrase == null) {
|
||||||
|
mCurrentPassPhrase = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mCurrentPassPhrase.equals("")) {
|
||||||
|
// check "no passphrase" checkbox and remove button
|
||||||
|
mNoPassphrase.setChecked(true);
|
||||||
|
mChangePassPhrase.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extras != null) {
|
||||||
|
if (extras.containsKey(EXTRA_KEY_ID)) {
|
||||||
|
long keyId = extras.getLong(EXTRA_KEY_ID);
|
||||||
|
|
||||||
|
if (keyId != 0) {
|
||||||
|
PGPSecretKey masterKey = null;
|
||||||
|
mKeyRing = PGPMain.getSecretKeyRing(keyId);
|
||||||
|
if (mKeyRing != null) {
|
||||||
|
masterKey = PGPHelper.getMasterKey(mKeyRing);
|
||||||
|
for (PGPSecretKey key : new IterableIterator<PGPSecretKey>(
|
||||||
|
mKeyRing.getSecretKeys())) {
|
||||||
|
mKeys.add(key);
|
||||||
|
mKeysUsages.add(-1); // get usage when view is created
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (masterKey != null) {
|
||||||
|
for (String userId : new IterableIterator<String>(masterKey.getUserIDs())) {
|
||||||
|
Log.d(Constants.TAG, "Added userId " + userId);
|
||||||
|
mUserIds.add(userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows the dialog to set a new passphrase
|
* Shows the dialog to set a new passphrase
|
||||||
*/
|
*/
|
||||||
@ -400,10 +419,10 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
Bundle data = new Bundle();
|
Bundle data = new Bundle();
|
||||||
data.putString(ApgService.CURRENT_PASSPHRASE, mCurrentPassPhrase);
|
data.putString(ApgService.CURRENT_PASSPHRASE, mCurrentPassPhrase);
|
||||||
data.putString(ApgService.NEW_PASSPHRASE, mNewPassPhrase);
|
data.putString(ApgService.NEW_PASSPHRASE, mNewPassPhrase);
|
||||||
data.putSerializable(ApgService.USER_IDS, getUserIds(mUserIdsView));
|
data.putStringArrayList(ApgService.USER_IDS, getUserIds(mUserIdsView));
|
||||||
Vector<PGPSecretKey> keys = getKeys(mKeysView);
|
ArrayList<PGPSecretKey> keys = getKeys(mKeysView);
|
||||||
data.putByteArray(ApgService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys));
|
data.putByteArray(ApgService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys));
|
||||||
data.putSerializable(ApgService.KEYS_USAGES, getKeysUsages(mKeysView));
|
data.putIntegerArrayList(ApgService.KEYS_USAGES, getKeysUsages(mKeysView));
|
||||||
data.putLong(ApgService.MASTER_KEY_ID, getMasterKeyId());
|
data.putLong(ApgService.MASTER_KEY_ID, getMasterKeyId());
|
||||||
|
|
||||||
intent.putExtra(ApgService.EXTRA_DATA, data);
|
intent.putExtra(ApgService.EXTRA_DATA, data);
|
||||||
@ -441,8 +460,8 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
* @param userIdsView
|
* @param userIdsView
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Vector<String> getUserIds(SectionView userIdsView) throws PGPMain.GeneralException {
|
private ArrayList<String> getUserIds(SectionView userIdsView) throws PGPMain.GeneralException {
|
||||||
Vector<String> userIds = new Vector<String>();
|
ArrayList<String> userIds = new ArrayList<String>();
|
||||||
|
|
||||||
ViewGroup userIdEditors = userIdsView.getEditors();
|
ViewGroup userIdEditors = userIdsView.getEditors();
|
||||||
|
|
||||||
@ -466,7 +485,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (editor.isMainUserId()) {
|
if (editor.isMainUserId()) {
|
||||||
userIds.insertElementAt(userId, 0);
|
userIds.add(0, userId);
|
||||||
gotMainUserId = true;
|
gotMainUserId = true;
|
||||||
} else {
|
} else {
|
||||||
userIds.add(userId);
|
userIds.add(userId);
|
||||||
@ -490,8 +509,8 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
* @param keysView
|
* @param keysView
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Vector<PGPSecretKey> getKeys(SectionView keysView) throws PGPMain.GeneralException {
|
private ArrayList<PGPSecretKey> getKeys(SectionView keysView) throws PGPMain.GeneralException {
|
||||||
Vector<PGPSecretKey> keys = new Vector<PGPSecretKey>();
|
ArrayList<PGPSecretKey> keys = new ArrayList<PGPSecretKey>();
|
||||||
|
|
||||||
ViewGroup keyEditors = keysView.getEditors();
|
ViewGroup keyEditors = keysView.getEditors();
|
||||||
|
|
||||||
@ -513,8 +532,8 @@ public class EditKeyActivity extends SherlockFragmentActivity {
|
|||||||
* @param keysView
|
* @param keysView
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Vector<Integer> getKeysUsages(SectionView keysView) throws PGPMain.GeneralException {
|
private ArrayList<Integer> getKeysUsages(SectionView keysView) throws PGPMain.GeneralException {
|
||||||
Vector<Integer> getKeysUsages = new Vector<Integer>();
|
ArrayList<Integer> getKeysUsages = new ArrayList<Integer>();
|
||||||
|
|
||||||
ViewGroup keyEditors = keysView.getEditors();
|
ViewGroup keyEditors = keysView.getEditors();
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ package org.thialfihar.android.apg.ui.widget;
|
|||||||
import org.spongycastle.openpgp.PGPSecretKey;
|
import org.spongycastle.openpgp.PGPSecretKey;
|
||||||
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
||||||
import org.thialfihar.android.apg.Id;
|
import org.thialfihar.android.apg.Id;
|
||||||
import org.thialfihar.android.apg.helper.PGPMain;
|
|
||||||
import org.thialfihar.android.apg.helper.PGPConversionHelper;
|
import org.thialfihar.android.apg.helper.PGPConversionHelper;
|
||||||
import org.thialfihar.android.apg.service.ApgServiceHandler;
|
import org.thialfihar.android.apg.service.ApgServiceHandler;
|
||||||
import org.thialfihar.android.apg.service.ApgService;
|
import org.thialfihar.android.apg.service.ApgService;
|
||||||
|
@ -42,6 +42,7 @@ public class UserIdEditor extends LinearLayout implements Editor, OnClickListene
|
|||||||
|
|
||||||
// see http://www.regular-expressions.info/email.html
|
// see http://www.regular-expressions.info/email.html
|
||||||
// RFC 2822 if we omit the syntax using double quotes and square brackets
|
// RFC 2822 if we omit the syntax using double quotes and square brackets
|
||||||
|
// android.util.Patterns.EMAIL_ADDRESS is only available as of Android 2.2+
|
||||||
private static final Pattern EMAIL_PATTERN = Pattern
|
private static final Pattern EMAIL_PATTERN = Pattern
|
||||||
.compile(
|
.compile(
|
||||||
"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?",
|
"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?",
|
||||||
|
Loading…
Reference in New Issue
Block a user