Add option to BackupOperation to export only secret keys
This commit is contained in:
@@ -129,8 +129,8 @@ public class BackupOperation extends BaseOperation<BackupKeyringParcel> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CountingOutputStream outStream = new CountingOutputStream(new BufferedOutputStream(plainOut));
|
CountingOutputStream outStream = new CountingOutputStream(new BufferedOutputStream(plainOut));
|
||||||
boolean backupSuccess = exportKeysToStream(
|
boolean backupSuccess = exportKeysToStream(log, backupInput.getMasterKeyIds(),
|
||||||
log, backupInput.getMasterKeyIds(), backupInput.getExportSecret(), outStream);
|
backupInput.getExportSecret(), backupInput.getExportPublic(), outStream);
|
||||||
|
|
||||||
if (!backupSuccess) {
|
if (!backupSuccess) {
|
||||||
// if there was an error, it will be in the log so we just have to return
|
// if there was an error, it will be in the log so we just have to return
|
||||||
@@ -214,7 +214,8 @@ public class BackupOperation extends BaseOperation<BackupKeyringParcel> {
|
|||||||
pgpSignEncryptData, CryptoInputParcel.createCryptoInputParcel(), inputData, outStream);
|
pgpSignEncryptData, CryptoInputParcel.createCryptoInputParcel(), inputData, outStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean exportKeysToStream(OperationLog log, long[] masterKeyIds, boolean exportSecret, OutputStream outStream) {
|
boolean exportKeysToStream(OperationLog log, long[] masterKeyIds, boolean exportSecret, boolean exportPublic,
|
||||||
|
OutputStream outStream) {
|
||||||
// noinspection unused TODO use these in a log entry
|
// noinspection unused TODO use these in a log entry
|
||||||
int okSecret = 0, okPublic = 0;
|
int okSecret = 0, okPublic = 0;
|
||||||
|
|
||||||
@@ -240,9 +241,15 @@ public class BackupOperation extends BaseOperation<BackupKeyringParcel> {
|
|||||||
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
|
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
|
||||||
log.add(LogType.MSG_BACKUP_PUBLIC, 1, KeyFormattingUtils.beautifyKeyId(masterKeyId));
|
log.add(LogType.MSG_BACKUP_PUBLIC, 1, KeyFormattingUtils.beautifyKeyId(masterKeyId));
|
||||||
|
|
||||||
if (writePublicKeyToStream(masterKeyId, log, outStream)) {
|
boolean publicKeyWriteOk = false;
|
||||||
okPublic += 1;
|
if (exportPublic) {
|
||||||
|
publicKeyWriteOk = writePublicKeyToStream(masterKeyId, log, outStream);
|
||||||
|
if (publicKeyWriteOk) {
|
||||||
|
okPublic += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (publicKeyWriteOk || !exportPublic) {
|
||||||
boolean hasSecret = cursor.getInt(INDEX_HAS_ANY_SECRET) > 0;
|
boolean hasSecret = cursor.getInt(INDEX_HAS_ANY_SECRET) > 0;
|
||||||
if (exportSecret && hasSecret) {
|
if (exportSecret && hasSecret) {
|
||||||
log.add(LogType.MSG_BACKUP_SECRET, 2, KeyFormattingUtils.beautifyKeyId(masterKeyId));
|
log.add(LogType.MSG_BACKUP_SECRET, 2, KeyFormattingUtils.beautifyKeyId(masterKeyId));
|
||||||
|
|||||||
@@ -731,7 +731,7 @@ public class OpenPgpService extends Service {
|
|||||||
// the backup code is cached in CryptoInputParcelCacheService, now we can proceed
|
// the backup code is cached in CryptoInputParcelCacheService, now we can proceed
|
||||||
|
|
||||||
BackupKeyringParcel input = BackupKeyringParcel
|
BackupKeyringParcel input = BackupKeyringParcel
|
||||||
.createBackupKeyringParcel(masterKeyIds, backupSecret, true, enableAsciiArmorOutput, null);
|
.create(masterKeyIds, backupSecret, true, enableAsciiArmorOutput, null);
|
||||||
BackupOperation op = new BackupOperation(this, mKeyRepository, null);
|
BackupOperation op = new BackupOperation(this, mKeyRepository, null);
|
||||||
ExportResult pgpResult = op.execute(input, inputParcel, outputStream);
|
ExportResult pgpResult = op.execute(input, inputParcel, outputStream);
|
||||||
|
|
||||||
|
|||||||
@@ -31,14 +31,20 @@ public abstract class BackupKeyringParcel implements Parcelable {
|
|||||||
@SuppressWarnings("mutable")
|
@SuppressWarnings("mutable")
|
||||||
public abstract long[] getMasterKeyIds();
|
public abstract long[] getMasterKeyIds();
|
||||||
public abstract boolean getExportSecret();
|
public abstract boolean getExportSecret();
|
||||||
|
public abstract boolean getExportPublic();
|
||||||
public abstract boolean getIsEncrypted();
|
public abstract boolean getIsEncrypted();
|
||||||
public abstract boolean getEnableAsciiArmorOutput();
|
public abstract boolean getEnableAsciiArmorOutput();
|
||||||
@Nullable
|
@Nullable
|
||||||
public abstract Uri getOutputUri();
|
public abstract Uri getOutputUri();
|
||||||
|
|
||||||
public static BackupKeyringParcel createBackupKeyringParcel(long[] masterKeyIds, boolean exportSecret,
|
public static BackupKeyringParcel create(long[] masterKeyIds, boolean exportSecret,
|
||||||
boolean isEncrypted, boolean enableAsciiArmorOutput, Uri outputUri) {
|
boolean isEncrypted, boolean enableAsciiArmorOutput, Uri outputUri) {
|
||||||
return new AutoValue_BackupKeyringParcel(
|
return new AutoValue_BackupKeyringParcel(
|
||||||
masterKeyIds, exportSecret, isEncrypted, enableAsciiArmorOutput, outputUri);
|
masterKeyIds, exportSecret, true, isEncrypted, enableAsciiArmorOutput, outputUri);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BackupKeyringParcel createExportAutocryptSetupMessage(long[] masterKeyIds) {
|
||||||
|
return new AutoValue_BackupKeyringParcel(
|
||||||
|
masterKeyIds, true, false, true, true, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -610,7 +610,7 @@ public class BackupCodeFragment extends CryptoOperationFragment<BackupKeyringPar
|
|||||||
@Override
|
@Override
|
||||||
public BackupKeyringParcel createOperationInput() {
|
public BackupKeyringParcel createOperationInput() {
|
||||||
return BackupKeyringParcel
|
return BackupKeyringParcel
|
||||||
.createBackupKeyringParcel(mMasterKeyIds, mExportSecret, true, true, mCachedBackupUri);
|
.create(mMasterKeyIds, mExportSecret, true, true, mCachedBackupUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ public class BackupOperationTest {
|
|||||||
assertTrue("second keyring has local certification", checkForLocal(mStaticRing2));
|
assertTrue("second keyring has local certification", checkForLocal(mStaticRing2));
|
||||||
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
boolean result = op.exportKeysToStream(new OperationLog(), null, false, out);
|
boolean result = op.exportKeysToStream(new OperationLog(), null, false, true, out);
|
||||||
|
|
||||||
assertTrue("export must be a success", result);
|
assertTrue("export must be a success", result);
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ public class BackupOperationTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
out = new ByteArrayOutputStream();
|
out = new ByteArrayOutputStream();
|
||||||
result = op.exportKeysToStream(new OperationLog(), null, true, out);
|
result = op.exportKeysToStream(new OperationLog(), null, true, true, out);
|
||||||
|
|
||||||
assertTrue("export must be a success", result);
|
assertTrue("export must be a success", result);
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ public class BackupOperationTest {
|
|||||||
BackupOperation op = new BackupOperation(spyApplication,
|
BackupOperation op = new BackupOperation(spyApplication,
|
||||||
KeyWritableRepository.create(RuntimeEnvironment.application), null);
|
KeyWritableRepository.create(RuntimeEnvironment.application), null);
|
||||||
|
|
||||||
BackupKeyringParcel parcel = BackupKeyringParcel.createBackupKeyringParcel(
|
BackupKeyringParcel parcel = BackupKeyringParcel.create(
|
||||||
new long[] { mStaticRing1.getMasterKeyId() }, false, false, true, fakeOutputUri);
|
new long[] { mStaticRing1.getMasterKeyId() }, false, false, true, fakeOutputUri);
|
||||||
|
|
||||||
ExportResult result = op.execute(parcel, null);
|
ExportResult result = op.execute(parcel, null);
|
||||||
@@ -309,7 +309,7 @@ public class BackupOperationTest {
|
|||||||
BackupOperation op = new BackupOperation(spyApplication,
|
BackupOperation op = new BackupOperation(spyApplication,
|
||||||
KeyWritableRepository.create(RuntimeEnvironment.application), null);
|
KeyWritableRepository.create(RuntimeEnvironment.application), null);
|
||||||
|
|
||||||
BackupKeyringParcel parcel = BackupKeyringParcel.createBackupKeyringParcel(
|
BackupKeyringParcel parcel = BackupKeyringParcel.create(
|
||||||
new long[] { mStaticRing1.getMasterKeyId() }, false, true, true, fakeOutputUri);
|
new long[] { mStaticRing1.getMasterKeyId() }, false, true, true, fakeOutputUri);
|
||||||
CryptoInputParcel inputParcel = CryptoInputParcel.createCryptoInputParcel(passphrase);
|
CryptoInputParcel inputParcel = CryptoInputParcel.createCryptoInputParcel(passphrase);
|
||||||
ExportResult result = op.execute(parcel, inputParcel);
|
ExportResult result = op.execute(parcel, inputParcel);
|
||||||
|
|||||||
Reference in New Issue
Block a user