diff options
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java')
-rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java | 146 |
1 files changed, 128 insertions, 18 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java index c4be467e4..e2d0c03c9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java @@ -21,6 +21,8 @@ package org.sufficientlysecure.keychain.service; import android.os.Parcel; import android.os.Parcelable; +import org.sufficientlysecure.keychain.pgp.WrappedUserAttribute; + import java.io.Serializable; import java.util.ArrayList; @@ -46,9 +48,10 @@ public class SaveKeyringParcel implements Parcelable { // the key fingerprint, for safety. MUST be null for a new key. public byte[] mFingerprint; - public String mNewPassphrase; + public ChangeUnlockParcel mNewUnlock; public ArrayList<String> mAddUserIds; + public ArrayList<WrappedUserAttribute> mAddUserAttribute; public ArrayList<SubkeyAdd> mAddSubKeys; public ArrayList<SubkeyChange> mChangeSubKeys; @@ -56,7 +59,6 @@ public class SaveKeyringParcel implements Parcelable { public ArrayList<String> mRevokeUserIds; public ArrayList<Long> mRevokeSubKeys; - public ArrayList<Long> mStripSubKeys; public SaveKeyringParcel() { reset(); @@ -69,14 +71,31 @@ public class SaveKeyringParcel implements Parcelable { } public void reset() { - mNewPassphrase = null; - mAddUserIds = new ArrayList<String>(); - mAddSubKeys = new ArrayList<SubkeyAdd>(); + mNewUnlock = null; + mAddUserIds = new ArrayList<>(); + mAddUserAttribute = new ArrayList<>(); + mAddSubKeys = new ArrayList<>(); mChangePrimaryUserId = null; - mChangeSubKeys = new ArrayList<SubkeyChange>(); - mRevokeUserIds = new ArrayList<String>(); - mRevokeSubKeys = new ArrayList<Long>(); - mStripSubKeys = new ArrayList<Long>(); + mChangeSubKeys = new ArrayList<>(); + mRevokeUserIds = new ArrayList<>(); + mRevokeSubKeys = new ArrayList<>(); + } + + /** Returns true iff this parcel does not contain any operations which require a passphrase. */ + public boolean isRestrictedOnly() { + if (mNewUnlock != null || !mAddUserIds.isEmpty() || !mAddUserAttribute.isEmpty() + || !mAddSubKeys.isEmpty() || mChangePrimaryUserId != null || !mRevokeSubKeys .isEmpty() + || !mRevokeSubKeys.isEmpty()) { + return false; + } + + for (SubkeyChange change : mChangeSubKeys) { + if (change.mRecertify || change.mFlags != null || change.mExpiry != null) { + return false; + } + } + + return true; } // performance gain for using Parcelable here would probably be negligible, @@ -109,26 +128,53 @@ public class SaveKeyringParcel implements Parcelable { } public static class SubkeyChange implements Serializable { - public long mKeyId; + public final long mKeyId; public Integer mFlags; // this is a long unix timestamp, in seconds (NOT MILLISECONDS!) public Long mExpiry; + // if this flag is true, the key will be recertified even if all above + // values are no-ops + public boolean mRecertify; + // if this flag is true, the subkey should be changed to a stripped key + public boolean mDummyStrip; + // if this is non-null, the subkey will be changed to a divert-to-card + // key for the given serial number + public byte[] mDummyDivert; public SubkeyChange(long keyId) { mKeyId = keyId; } + public SubkeyChange(long keyId, boolean recertify) { + mKeyId = keyId; + mRecertify = recertify; + } + public SubkeyChange(long keyId, Integer flags, Long expiry) { mKeyId = keyId; mFlags = flags; mExpiry = expiry; } + public SubkeyChange(long keyId, boolean dummyStrip, byte[] dummyDivert) { + this(keyId, null, null); + + // these flags are mutually exclusive! + if (dummyStrip && dummyDivert != null) { + throw new AssertionError( + "cannot set strip and divert flags at the same time - this is a bug!"); + } + mDummyStrip = dummyStrip; + mDummyDivert = dummyDivert; + } + @Override public String toString() { String out = "mKeyId: " + mKeyId + ", "; out += "mFlags: " + mFlags + ", "; - out += "mExpiry: " + mExpiry; + out += "mExpiry: " + mExpiry + ", "; + out += "mDummyStrip: " + mDummyStrip + ", "; + out += "mDummyDivert: [" + (mDummyDivert == null ? 0 : mDummyDivert.length) + " bytes]"; return out; } @@ -159,9 +205,10 @@ public class SaveKeyringParcel implements Parcelable { mMasterKeyId = source.readInt() != 0 ? source.readLong() : null; mFingerprint = source.createByteArray(); - mNewPassphrase = source.readString(); + mNewUnlock = source.readParcelable(getClass().getClassLoader()); mAddUserIds = source.createStringArrayList(); + mAddUserAttribute = (ArrayList<WrappedUserAttribute>) source.readSerializable(); mAddSubKeys = (ArrayList<SubkeyAdd>) source.readSerializable(); mChangeSubKeys = (ArrayList<SubkeyChange>) source.readSerializable(); @@ -169,7 +216,6 @@ public class SaveKeyringParcel implements Parcelable { mRevokeUserIds = source.createStringArrayList(); mRevokeSubKeys = (ArrayList<Long>) source.readSerializable(); - mStripSubKeys = (ArrayList<Long>) source.readSerializable(); } @Override @@ -180,9 +226,11 @@ public class SaveKeyringParcel implements Parcelable { } destination.writeByteArray(mFingerprint); - destination.writeString(mNewPassphrase); + // yes, null values are ok for parcelables + destination.writeParcelable(mNewUnlock, 0); destination.writeStringList(mAddUserIds); + destination.writeSerializable(mAddUserAttribute); destination.writeSerializable(mAddSubKeys); destination.writeSerializable(mChangeSubKeys); @@ -190,7 +238,6 @@ public class SaveKeyringParcel implements Parcelable { destination.writeStringList(mRevokeUserIds); destination.writeSerializable(mRevokeSubKeys); - destination.writeSerializable(mStripSubKeys); } public static final Creator<SaveKeyringParcel> CREATOR = new Creator<SaveKeyringParcel>() { @@ -211,14 +258,14 @@ public class SaveKeyringParcel implements Parcelable { @Override public String toString() { String out = "mMasterKeyId: " + mMasterKeyId + "\n"; - out += "mNewPassphrase: " + mNewPassphrase + "\n"; + out += "mNewUnlock: " + mNewUnlock + "\n"; out += "mAddUserIds: " + mAddUserIds + "\n"; + out += "mAddUserAttribute: " + mAddUserAttribute + "\n"; out += "mAddSubKeys: " + mAddSubKeys + "\n"; out += "mChangeSubKeys: " + mChangeSubKeys + "\n"; out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n"; out += "mRevokeUserIds: " + mRevokeUserIds + "\n"; - out += "mRevokeSubKeys: " + mRevokeSubKeys + "\n"; - out += "mStripSubKeys: " + mStripSubKeys; + out += "mRevokeSubKeys: " + mRevokeSubKeys; return out; } @@ -238,4 +285,67 @@ public class SaveKeyringParcel implements Parcelable { // BRAINPOOL_P256, BRAINPOOL_P384, BRAINPOOL_P512 } + /** This subclass contains information on how the passphrase should be changed. + * + * If no changes are to be made, this class should NOT be used! + * + * At this point, there must be *exactly one* non-null value here, which specifies the type + * of unlocking mechanism to use. + * + */ + public static class ChangeUnlockParcel implements Parcelable { + + // The new passphrase to use + public final String mNewPassphrase; + // A new pin to use. Must only contain [0-9]+ + public final String mNewPin; + + public ChangeUnlockParcel(String newPassphrase) { + this(newPassphrase, null); + } + public ChangeUnlockParcel(String newPassphrase, String newPin) { + if (newPassphrase == null && newPin == null) { + throw new RuntimeException("Cannot set both passphrase and pin. THIS IS A BUG!"); + } + if (newPin != null && !newPin.matches("[0-9]+")) { + throw new RuntimeException("Pin must be numeric digits only. THIS IS A BUG!"); + } + mNewPassphrase = newPassphrase; + mNewPin = newPin; + } + + public ChangeUnlockParcel(Parcel source) { + mNewPassphrase = source.readString(); + mNewPin = source.readString(); + } + + @Override + public void writeToParcel(Parcel destination, int flags) { + destination.writeString(mNewPassphrase); + destination.writeString(mNewPin); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator<ChangeUnlockParcel> CREATOR = new Creator<ChangeUnlockParcel>() { + public ChangeUnlockParcel createFromParcel(final Parcel source) { + return new ChangeUnlockParcel(source); + } + + public ChangeUnlockParcel[] newArray(final int size) { + return new ChangeUnlockParcel[size]; + } + }; + + public String toString() { + return mNewPassphrase != null + ? ("passphrase (" + mNewPassphrase + ")") + : ("pin (" + mNewPin + ")"); + } + + } + } |