/** * Reads all PGPKeyRing objects from input * * @param inputData * @return */ private void generateListOfKeyrings(InputData inputData) { PositionAwareInputStream progressIn = new PositionAwareInputStream(inputData.getInputStream()); // need to have access to the bufferedInput, so we can reuse it for the possible // PGPObject chunks after the first one, e.g. files with several consecutive ASCII // armor blocks BufferedInputStream bufferedInput = new BufferedInputStream(progressIn); try { // parse all keyrings Iterator<UncachedKeyRing> it = UncachedKeyRing.fromStream(bufferedInput); while (it.hasNext()) { UncachedKeyRing ring = it.next(); ImportKeysListEntry item = new ImportKeysListEntry(getContext(), ring); mData.add(item); mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(ring.getEncoded())); } } catch (IOException e) { Log.e(Constants.TAG, "IOException on parsing key file! Return NoValidKeysException!", e); OperationResult.OperationLog log = new OperationResult.OperationLog(); log.add(OperationResult.LogType.MSG_GET_NO_VALID_KEYS, 0); GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_ERROR_NO_VALID_KEYS, log); mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mData, getKeyResult); } }
@NonNull public OperationResult execute(ChangeUnlockParcel unlockParcel, CryptoInputParcel cryptoInput) { OperationResult.OperationLog log = new OperationResult.OperationLog(); log.add(OperationResult.LogType.MSG_ED, 0); if (unlockParcel == null || unlockParcel.mMasterKeyId == null) { log.add(OperationResult.LogType.MSG_ED_ERROR_NO_PARCEL, 1); return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null); } // Perform actual modification PgpEditKeyResult modifyResult; { PgpKeyOperation keyOperations = new PgpKeyOperation(new ProgressScaler(mProgressable, 0, 70, 100)); try { log.add( OperationResult.LogType.MSG_ED_FETCHING, 1, KeyFormattingUtils.convertKeyIdToHex(unlockParcel.mMasterKeyId)); CanonicalizedSecretKeyRing secRing = mProviderHelper.getCanonicalizedSecretKeyRing(unlockParcel.mMasterKeyId); modifyResult = keyOperations.modifyKeyRingPassphrase(secRing, cryptoInput, unlockParcel); if (modifyResult.isPending()) { // obtain original passphrase from user log.add(modifyResult, 1); return new EditKeyResult(log, modifyResult); } } catch (ProviderHelper.NotFoundException e) { log.add(OperationResult.LogType.MSG_ED_ERROR_KEY_NOT_FOUND, 2); return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null); } } log.add(modifyResult, 1); if (!modifyResult.success()) { // error is already logged by modification return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null); } // Cannot cancel from here on out! mProgressable.setPreventCancel(); // It's a success, so this must be non-null now UncachedKeyRing ring = modifyResult.getRing(); SaveKeyringResult saveResult = mProviderHelper.saveSecretKeyRing(ring, new ProgressScaler(mProgressable, 70, 95, 100)); log.add(saveResult, 1); // If the save operation didn't succeed, exit here if (!saveResult.success()) { return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null); } updateProgress(R.string.progress_done, 100, 100); log.add(OperationResult.LogType.MSG_ED_SUCCESS, 0); return new EditKeyResult(EditKeyResult.RESULT_OK, log, ring.getMasterKeyId()); }