upload: identify key by masterKeyId only
This commit is contained in:
parent
676a863b14
commit
dc9e068790
|
@ -17,17 +17,21 @@
|
||||||
|
|
||||||
package org.sufficientlysecure.keychain.operations;
|
package org.sufficientlysecure.keychain.operations;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
|
import org.sufficientlysecure.keychain.operations.results.EditKeyResult;
|
||||||
import org.sufficientlysecure.keychain.operations.results.ExportResult;
|
|
||||||
import org.sufficientlysecure.keychain.operations.results.InputPendingResult;
|
import org.sufficientlysecure.keychain.operations.results.InputPendingResult;
|
||||||
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
|
import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType;
|
||||||
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
|
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
|
||||||
import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
|
import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult;
|
||||||
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
|
import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult;
|
||||||
|
import org.sufficientlysecure.keychain.operations.results.UploadResult;
|
||||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
|
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;
|
||||||
import org.sufficientlysecure.keychain.pgp.Progressable;
|
import org.sufficientlysecure.keychain.pgp.Progressable;
|
||||||
|
@ -35,17 +39,14 @@ import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException;
|
||||||
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
|
import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
|
||||||
import org.sufficientlysecure.keychain.service.ExportKeyringParcel;
|
|
||||||
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
|
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
|
||||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
||||||
|
import org.sufficientlysecure.keychain.service.UploadKeyringParcel;
|
||||||
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
|
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
|
||||||
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
|
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
|
||||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||||
import org.sufficientlysecure.keychain.util.ProgressScaler;
|
import org.sufficientlysecure.keychain.util.ProgressScaler;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An operation which implements a high level key edit operation.
|
* An operation which implements a high level key edit operation.
|
||||||
* <p/>
|
* <p/>
|
||||||
|
@ -133,6 +134,16 @@ public class EditKeyOperation extends BaseOperation<SaveKeyringParcel> {
|
||||||
// It's a success, so this must be non-null now
|
// It's a success, so this must be non-null now
|
||||||
UncachedKeyRing ring = modifyResult.getRing();
|
UncachedKeyRing ring = modifyResult.getRing();
|
||||||
|
|
||||||
|
// Save the new keyring.
|
||||||
|
SaveKeyringResult saveResult = mProviderHelper
|
||||||
|
.saveSecretKeyRing(ring, new ProgressScaler(mProgressable, 60, 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);
|
||||||
|
}
|
||||||
|
|
||||||
if (saveParcel.isUpload()) {
|
if (saveParcel.isUpload()) {
|
||||||
UncachedKeyRing publicKeyRing;
|
UncachedKeyRing publicKeyRing;
|
||||||
try {
|
try {
|
||||||
|
@ -142,12 +153,11 @@ public class EditKeyOperation extends BaseOperation<SaveKeyringParcel> {
|
||||||
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
|
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExportKeyringParcel exportKeyringParcel =
|
UploadKeyringParcel exportKeyringParcel =
|
||||||
new ExportKeyringParcel(saveParcel.getUploadKeyserver(),
|
new UploadKeyringParcel(saveParcel.getUploadKeyserver(), ring.getMasterKeyId());
|
||||||
publicKeyRing);
|
|
||||||
|
|
||||||
ExportResult uploadResult =
|
UploadResult uploadResult =
|
||||||
new ExportOperation(mContext, mProviderHelper, mProgressable)
|
new UploadOperation(mContext, mProviderHelper, mProgressable)
|
||||||
.execute(exportKeyringParcel, cryptoInput);
|
.execute(exportKeyringParcel, cryptoInput);
|
||||||
|
|
||||||
if (uploadResult.isPending()) {
|
if (uploadResult.isPending()) {
|
||||||
|
@ -163,16 +173,6 @@ public class EditKeyOperation extends BaseOperation<SaveKeyringParcel> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the new keyring.
|
|
||||||
SaveKeyringResult saveResult = mProviderHelper
|
|
||||||
.saveSecretKeyRing(ring, new ProgressScaler(mProgressable, 60, 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
// There is a new passphrase - cache it
|
// There is a new passphrase - cache it
|
||||||
if (saveParcel.mNewUnlock != null && cryptoInput.mCachePassphrase) {
|
if (saveParcel.mNewUnlock != null && cryptoInput.mCachePassphrase) {
|
||||||
log.add(LogType.MSG_ED_CACHING_NEW, 1);
|
log.add(LogType.MSG_ED_CACHING_NEW, 1);
|
||||||
|
|
|
@ -86,7 +86,7 @@ public class UploadOperation extends BaseOperation<UploadKeyringParcel> {
|
||||||
HkpKeyserver hkpKeyserver = new HkpKeyserver(exportInput.mKeyserver);
|
HkpKeyserver hkpKeyserver = new HkpKeyserver(exportInput.mKeyserver);
|
||||||
try {
|
try {
|
||||||
CanonicalizedPublicKeyRing keyring = mProviderHelper.getCanonicalizedPublicKeyRing(
|
CanonicalizedPublicKeyRing keyring = mProviderHelper.getCanonicalizedPublicKeyRing(
|
||||||
exportInput.mCanonicalizedPublicKeyringUri);
|
exportInput.mMasterKeyId);
|
||||||
return uploadKeyRingToServer(hkpKeyserver, keyring.getUncachedKeyRing(), proxy);
|
return uploadKeyRingToServer(hkpKeyserver, keyring.getUncachedKeyRing(), proxy);
|
||||||
} catch (ProviderHelper.NotFoundException e) {
|
} catch (ProviderHelper.NotFoundException e) {
|
||||||
Log.e(Constants.TAG, "error uploading key", e);
|
Log.e(Constants.TAG, "error uploading key", e);
|
||||||
|
|
|
@ -20,23 +20,22 @@
|
||||||
package org.sufficientlysecure.keychain.service;
|
package org.sufficientlysecure.keychain.service;
|
||||||
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
|
||||||
public class UploadKeyringParcel implements Parcelable {
|
public class UploadKeyringParcel implements Parcelable {
|
||||||
public String mKeyserver;
|
public String mKeyserver;
|
||||||
public Uri mCanonicalizedPublicKeyringUri;
|
public long mMasterKeyId;
|
||||||
|
|
||||||
public UploadKeyringParcel(String keyserver, Uri keyringUri) {
|
public UploadKeyringParcel(String keyserver, long masterKeyId) {
|
||||||
mKeyserver = keyserver;
|
mKeyserver = keyserver;
|
||||||
mCanonicalizedPublicKeyringUri = keyringUri;
|
mMasterKeyId = masterKeyId;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected UploadKeyringParcel(Parcel in) {
|
protected UploadKeyringParcel(Parcel in) {
|
||||||
mKeyserver = in.readString();
|
mKeyserver = in.readString();
|
||||||
mCanonicalizedPublicKeyringUri = (Uri) in.readValue(Uri.class.getClassLoader());
|
mMasterKeyId = in.readLong();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -47,7 +46,7 @@ public class UploadKeyringParcel implements Parcelable {
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeString(mKeyserver);
|
dest.writeString(mKeyserver);
|
||||||
dest.writeValue(mCanonicalizedPublicKeyringUri);
|
dest.writeValue(mMasterKeyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<UploadKeyringParcel> CREATOR = new Creator<UploadKeyringParcel>() {
|
public static final Creator<UploadKeyringParcel> CREATOR = new Creator<UploadKeyringParcel>() {
|
||||||
|
|
|
@ -407,7 +407,7 @@ public class CreateKeyFinalFragment extends Fragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
// set data uri as path to keyring
|
// set data uri as path to keyring
|
||||||
final Uri blobUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(saveKeyResult.mMasterKeyId);
|
final long masterKeyId = saveKeyResult.mMasterKeyId;
|
||||||
// upload to favorite keyserver
|
// upload to favorite keyserver
|
||||||
final String keyserver = Preferences.getPreferences(activity).getPreferredKeyserver();
|
final String keyserver = Preferences.getPreferences(activity).getPreferredKeyserver();
|
||||||
|
|
||||||
|
@ -416,7 +416,7 @@ public class CreateKeyFinalFragment extends Fragment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UploadKeyringParcel createOperationInput() {
|
public UploadKeyringParcel createOperationInput() {
|
||||||
return new UploadKeyringParcel(keyserver, blobUri);
|
return new UploadKeyringParcel(keyserver, masterKeyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -31,8 +31,10 @@ import android.widget.Spinner;
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.operations.results.UploadResult;
|
import org.sufficientlysecure.keychain.operations.results.UploadResult;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
import org.sufficientlysecure.keychain.service.UploadKeyringParcel;
|
import org.sufficientlysecure.keychain.service.UploadKeyringParcel;
|
||||||
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
|
import org.sufficientlysecure.keychain.ui.base.BaseActivity;
|
||||||
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
|
||||||
|
@ -51,7 +53,7 @@ public class UploadKeyActivity extends BaseActivity
|
||||||
|
|
||||||
// CryptoOperationHelper.Callback vars
|
// CryptoOperationHelper.Callback vars
|
||||||
private String mKeyserver;
|
private String mKeyserver;
|
||||||
private Uri mUnifiedKeyringUri;
|
private long mMasterKeyId;
|
||||||
private CryptoOperationHelper<UploadKeyringParcel, UploadResult> mUploadOpHelper;
|
private CryptoOperationHelper<UploadKeyringParcel, UploadResult> mUploadOpHelper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -86,6 +88,16 @@ public class UploadKeyActivity extends BaseActivity
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mMasterKeyId = new ProviderHelper(this).getCachedPublicKeyRing(
|
||||||
|
KeyRings.buildUnifiedKeyRingUri(mDataUri)).getMasterKeyId();
|
||||||
|
} catch (PgpKeyNotFoundException e) {
|
||||||
|
Log.e(Constants.TAG, "Intent data pointed to bad key!");
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -102,9 +114,6 @@ public class UploadKeyActivity extends BaseActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
private void uploadKey() {
|
private void uploadKey() {
|
||||||
Uri blobUri = KeyRings.buildUnifiedKeyRingUri(mDataUri);
|
|
||||||
mUnifiedKeyringUri = blobUri;
|
|
||||||
|
|
||||||
String server = (String) mKeyServerSpinner.getSelectedItem();
|
String server = (String) mKeyServerSpinner.getSelectedItem();
|
||||||
mKeyserver = server;
|
mKeyserver = server;
|
||||||
|
|
||||||
|
@ -127,7 +136,7 @@ public class UploadKeyActivity extends BaseActivity
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UploadKeyringParcel createOperationInput() {
|
public UploadKeyringParcel createOperationInput() {
|
||||||
return new UploadKeyringParcel(mKeyserver, mUnifiedKeyringUri);
|
return new UploadKeyringParcel(mKeyserver, mMasterKeyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue