From a2dcb579ff5d3565e7e6c6afe37878855361595b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 16 Feb 2016 00:36:27 +0100 Subject: Add backup API --- .../keychain/operations/BackupOperation.java | 37 ++++++++++++++++------ 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java index b3a2fd481..7c2f9d6b2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java @@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.operations; import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -97,6 +98,12 @@ public class BackupOperation extends BaseOperation { @NonNull public ExportResult execute(@NonNull BackupKeyringParcel backupInput, @Nullable CryptoInputParcel cryptoInput) { + return execute(backupInput, cryptoInput, null); + } + + @NonNull + public ExportResult execute(@NonNull BackupKeyringParcel backupInput, @Nullable CryptoInputParcel cryptoInput, + OutputStream outputStream) { OperationLog log = new OperationLog(); if (backupInput.mMasterKeyIds != null) { @@ -107,18 +114,23 @@ public class BackupOperation extends BaseOperation { try { - boolean nonEncryptedOutput = backupInput.mSymmetricPassphrase == null; + boolean nonEncryptedOutput = cryptoInput == null; - Uri backupOutputUri = nonEncryptedOutput - ? backupInput.mOutputUri - : TemporaryFileProvider.createFile(mContext); + Uri plainUri = null; + OutputStream plainOut; + if (nonEncryptedOutput && backupInput.mOutputUri == null) { + plainOut = outputStream; + } else if (nonEncryptedOutput) { + plainOut = mContext.getContentResolver().openOutputStream(backupInput.mOutputUri); + } else { + plainUri = TemporaryFileProvider.createFile(mContext); + plainOut = mContext.getContentResolver().openOutputStream(plainUri); + } int exportedDataSize; { // export key data, and possibly return if we don't encrypt - - DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream( - mContext.getContentResolver().openOutputStream(backupOutputUri))); + DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(plainOut)); boolean backupSuccess = exportKeysToStream( log, backupInput.mMasterKeyIds, backupInput.mExportSecret, outStream); @@ -140,11 +152,11 @@ public class BackupOperation extends BaseOperation { PgpSignEncryptOperation pseOp = new PgpSignEncryptOperation(mContext, mProviderHelper, mProgressable, mCancelled); PgpSignEncryptInputParcel inputParcel = new PgpSignEncryptInputParcel(); - inputParcel.setSymmetricPassphrase(backupInput.mSymmetricPassphrase); + inputParcel.setSymmetricPassphrase(cryptoInput.getPassphrase()); inputParcel.setEnableAsciiArmorOutput(true); inputParcel.setAddBackupHeader(true); - InputStream inStream = mContext.getContentResolver().openInputStream(backupOutputUri); + InputStream inStream = mContext.getContentResolver().openInputStream(plainUri); String filename; if (backupInput.mMasterKeyIds != null && backupInput.mMasterKeyIds.length == 1) { @@ -156,7 +168,12 @@ public class BackupOperation extends BaseOperation { InputData inputData = new InputData(inStream, exportedDataSize, filename); - OutputStream outStream = mContext.getContentResolver().openOutputStream(backupInput.mOutputUri); + OutputStream outStream; + if (backupInput.mOutputUri == null) { + outStream = outputStream; + } else { + outStream = mContext.getContentResolver().openOutputStream(backupInput.mOutputUri); + } outStream = new BufferedOutputStream(outStream); PgpSignEncryptResult encryptResult = pseOp.execute(inputParcel, new CryptoInputParcel(), inputData, outStream); -- cgit v1.2.3