upload: identify key by masterKeyId only

This commit is contained in:
Vincent Breitmoser 2015-09-26 18:10:24 +02:00
parent 676a863b14
commit dc9e068790
5 changed files with 42 additions and 34 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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>() {

View file

@ -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

View file

@ -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