mirror of
https://github.com/moparisthebest/open-keychain
synced 2025-02-26 00:11:52 -05:00
move last parts of import logic from kis into operation
This commit is contained in:
parent
e4e2d647c8
commit
2bb7c3bcef
@ -30,6 +30,7 @@ import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
|
|||||||
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
||||||
import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
|
import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||||
|
import org.sufficientlysecure.keychain.operations.results.ConsolidateResult;
|
||||||
import org.sufficientlysecure.keychain.operations.results.ExportResult;
|
import org.sufficientlysecure.keychain.operations.results.ExportResult;
|
||||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
|
import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
|
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;
|
||||||
@ -44,9 +45,12 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.LogTyp
|
|||||||
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
|
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
|
||||||
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
|
||||||
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
|
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
|
||||||
|
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
|
||||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||||
import org.sufficientlysecure.keychain.util.FileHelper;
|
import org.sufficientlysecure.keychain.util.FileHelper;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
import org.sufficientlysecure.keychain.util.ParcelableFileCache;
|
||||||
|
import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
|
||||||
import org.sufficientlysecure.keychain.util.ProgressScaler;
|
import org.sufficientlysecure.keychain.util.ProgressScaler;
|
||||||
|
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
@ -58,6 +62,7 @@ import java.io.IOException;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
/** An operation class which implements high level import and export
|
/** An operation class which implements high level import and export
|
||||||
@ -123,6 +128,35 @@ public class ImportExportOperation extends BaseOperation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ImportKeyResult importKeyRings(List<ParcelableKeyRing> entries, String keyServerUri) {
|
||||||
|
|
||||||
|
Iterator<ParcelableKeyRing> it = entries.iterator();
|
||||||
|
int numEntries = entries.size();
|
||||||
|
|
||||||
|
return importKeyRings(it, numEntries, keyServerUri);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImportKeyResult importKeyRings(ParcelableFileCache<ParcelableKeyRing> cache, String keyServerUri) {
|
||||||
|
|
||||||
|
// get entries from cached file
|
||||||
|
try {
|
||||||
|
IteratorWithSize<ParcelableKeyRing> it = cache.readCache();
|
||||||
|
int numEntries = it.getSize();
|
||||||
|
|
||||||
|
return importKeyRings(it, numEntries, keyServerUri);
|
||||||
|
} catch (IOException e) {
|
||||||
|
|
||||||
|
// Special treatment here, we need a lot
|
||||||
|
OperationLog log = new OperationLog();
|
||||||
|
log.add(LogType.MSG_IMPORT, 0, 0);
|
||||||
|
log.add(LogType.MSG_IMPORT_ERROR_IO, 0, 0);
|
||||||
|
|
||||||
|
return new ImportKeyResult(ImportKeyResult.RESULT_ERROR, log);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public ImportKeyResult importKeyRings(Iterator<ParcelableKeyRing> entries, int num, String keyServerUri) {
|
public ImportKeyResult importKeyRings(Iterator<ParcelableKeyRing> entries, int num, String keyServerUri) {
|
||||||
updateProgress(R.string.progress_importing, 0, 100);
|
updateProgress(R.string.progress_importing, 0, 100);
|
||||||
|
|
||||||
@ -131,9 +165,7 @@ public class ImportExportOperation extends BaseOperation {
|
|||||||
|
|
||||||
// If there aren't even any keys, do nothing here.
|
// If there aren't even any keys, do nothing here.
|
||||||
if (entries == null || !entries.hasNext()) {
|
if (entries == null || !entries.hasNext()) {
|
||||||
return new ImportKeyResult(
|
return new ImportKeyResult(ImportKeyResult.RESULT_FAIL_NOTHING, log);
|
||||||
ImportKeyResult.RESULT_FAIL_NOTHING, log, 0, 0, 0, 0,
|
|
||||||
new long[]{});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int newKeys = 0, oldKeys = 0, badKeys = 0, secret = 0;
|
int newKeys = 0, oldKeys = 0, badKeys = 0, secret = 0;
|
||||||
@ -293,6 +325,16 @@ public class ImportExportOperation extends BaseOperation {
|
|||||||
position++;
|
position++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special: consolidate on secret key import (cannot be cancelled!)
|
||||||
|
if (secret > 0) {
|
||||||
|
setPreventCancel();
|
||||||
|
ConsolidateResult result = mProviderHelper.consolidateDatabaseStep1(mProgressable);
|
||||||
|
log.add(result, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special: make sure new data is synced into contacts
|
||||||
|
ContactSyncAdapterService.requestSync();
|
||||||
|
|
||||||
// convert to long array
|
// convert to long array
|
||||||
long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()];
|
long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()];
|
||||||
for (int i = 0; i < importedMasterKeyIds.size(); ++i) {
|
for (int i = 0; i < importedMasterKeyIds.size(); ++i) {
|
||||||
|
@ -83,6 +83,10 @@ public class ImportKeyResult extends OperationResult {
|
|||||||
mImportedMasterKeyIds = source.createLongArray();
|
mImportedMasterKeyIds = source.createLongArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ImportKeyResult(int result, OperationLog log) {
|
||||||
|
this(result, log, 0, 0, 0, 0, new long[] { });
|
||||||
|
}
|
||||||
|
|
||||||
public ImportKeyResult(int result, OperationLog log,
|
public ImportKeyResult(int result, OperationLog log,
|
||||||
int newKeys, int updatedKeys, int badKeys, int secret,
|
int newKeys, int updatedKeys, int badKeys, int secret,
|
||||||
long[] importedMasterKeyIds) {
|
long[] importedMasterKeyIds) {
|
||||||
|
@ -654,6 +654,7 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
MSG_IMPORT_FINGERPRINT_ERROR (LogLevel.ERROR, R.string.msg_import_fingerprint_error),
|
MSG_IMPORT_FINGERPRINT_ERROR (LogLevel.ERROR, R.string.msg_import_fingerprint_error),
|
||||||
MSG_IMPORT_FINGERPRINT_OK (LogLevel.DEBUG, R.string.msg_import_fingerprint_ok),
|
MSG_IMPORT_FINGERPRINT_OK (LogLevel.DEBUG, R.string.msg_import_fingerprint_ok),
|
||||||
MSG_IMPORT_ERROR (LogLevel.ERROR, R.string.msg_import_error),
|
MSG_IMPORT_ERROR (LogLevel.ERROR, R.string.msg_import_error),
|
||||||
|
MSG_IMPORT_ERROR_IO (LogLevel.ERROR, R.string.msg_import_error_io),
|
||||||
MSG_IMPORT_PARTIAL (LogLevel.ERROR, R.string.msg_import_partial),
|
MSG_IMPORT_PARTIAL (LogLevel.ERROR, R.string.msg_import_partial),
|
||||||
MSG_IMPORT_SUCCESS (LogLevel.OK, R.string.msg_import_success),
|
MSG_IMPORT_SUCCESS (LogLevel.OK, R.string.msg_import_success),
|
||||||
|
|
||||||
|
@ -403,49 +403,28 @@ public class KeychainIntentService extends IntentService implements Progressable
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ACTION_IMPORT_KEYRING:
|
case ACTION_IMPORT_KEYRING: {
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
String keyServer = data.getString(IMPORT_KEY_SERVER);
|
String keyServer = data.getString(IMPORT_KEY_SERVER);
|
||||||
Iterator<ParcelableKeyRing> entries;
|
|
||||||
int numEntries;
|
|
||||||
if (data.containsKey(IMPORT_KEY_LIST)) {
|
|
||||||
// get entries from intent
|
|
||||||
ArrayList<ParcelableKeyRing> list = data.getParcelableArrayList(IMPORT_KEY_LIST);
|
ArrayList<ParcelableKeyRing> list = data.getParcelableArrayList(IMPORT_KEY_LIST);
|
||||||
entries = list.iterator();
|
|
||||||
numEntries = list.size();
|
|
||||||
} else {
|
|
||||||
// get entries from cached file
|
|
||||||
ParcelableFileCache<ParcelableKeyRing> cache =
|
ParcelableFileCache<ParcelableKeyRing> cache =
|
||||||
new ParcelableFileCache<>(this, "key_import.pcl");
|
new ParcelableFileCache<>(this, "key_import.pcl");
|
||||||
IteratorWithSize<ParcelableKeyRing> it = cache.readCache();
|
|
||||||
entries = it;
|
|
||||||
numEntries = it.getSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operation
|
// Operation
|
||||||
ImportExportOperation importExportOperation = new ImportExportOperation(
|
ImportExportOperation importExportOperation = new ImportExportOperation(
|
||||||
this, providerHelper, this, mActionCanceled);
|
this, providerHelper, this, mActionCanceled);
|
||||||
ImportKeyResult result = importExportOperation.importKeyRings(entries, numEntries, keyServer);
|
// Either list or cache must be null, no guarantees otherwise.
|
||||||
|
ImportKeyResult result = list != null
|
||||||
// Special: consolidate on secret key import (cannot be cancelled!)
|
? importExportOperation.importKeyRings(list, keyServer)
|
||||||
if (result.mSecret > 0) {
|
: importExportOperation.importKeyRings(cache, keyServer);
|
||||||
// TODO move this into the import operation
|
|
||||||
providerHelper.consolidateDatabaseStep1(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special: make sure new data is synced into contacts
|
|
||||||
ContactSyncAdapterService.requestSync();
|
|
||||||
|
|
||||||
// Result
|
// Result
|
||||||
sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
|
sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);
|
||||||
} catch (Exception e) {
|
|
||||||
sendErrorToHandler(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
case ACTION_SIGN_ENCRYPT:
|
case ACTION_SIGN_ENCRYPT:
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -1021,6 +1021,7 @@
|
|||||||
<string name="msg_import_fingerprint_ok">"Fingerprint check OK"</string>
|
<string name="msg_import_fingerprint_ok">"Fingerprint check OK"</string>
|
||||||
<string name="msg_import_merge">"Merging retrieved data"</string>
|
<string name="msg_import_merge">"Merging retrieved data"</string>
|
||||||
<string name="msg_import_error">"Import operation failed!"</string>
|
<string name="msg_import_error">"Import operation failed!"</string>
|
||||||
|
<string name="msg_import_error_io">"Import operation failed due to i/o error!"</string>
|
||||||
<string name="msg_import_partial">"Import operation successful, with errors!"</string>
|
<string name="msg_import_partial">"Import operation successful, with errors!"</string>
|
||||||
<string name="msg_import_success">"Import operation successful!"</string>
|
<string name="msg_import_success">"Import operation successful!"</string>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user