mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-27 19:22:14 -05:00
Merge branch 'master' into automatic-contact-discovery
Conflicts: OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
This commit is contained in:
commit
e2164f571e
@ -19,16 +19,13 @@ package org.sufficientlysecure.keychain.helper;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
|
||||||
|
|
||||||
public class ActionBarHelper {
|
public class ActionBarHelper {
|
||||||
|
|
||||||
|
@ -32,17 +32,17 @@ import java.util.Date;
|
|||||||
public class ImportKeysListEntry implements Serializable, Parcelable {
|
public class ImportKeysListEntry implements Serializable, Parcelable {
|
||||||
private static final long serialVersionUID = -7797972103284992662L;
|
private static final long serialVersionUID = -7797972103284992662L;
|
||||||
|
|
||||||
public ArrayList<String> userIds;
|
private ArrayList<String> mUserIds;
|
||||||
public long keyId;
|
private long mKeyId;
|
||||||
public String keyIdHex;
|
private String mKeyIdHex;
|
||||||
public boolean revoked;
|
private boolean mRevoked;
|
||||||
public boolean expired;
|
private boolean mExpired;
|
||||||
public Date date; // TODO: not displayed
|
private Date mDate; // TODO: not displayed
|
||||||
public String fingerprintHex;
|
private String mFingerprintHex;
|
||||||
public int bitStrength;
|
private int mBitStrength;
|
||||||
public String algorithm;
|
private String mAlgorithm;
|
||||||
public boolean secretKey;
|
private boolean mSecretKey;
|
||||||
public String mPrimaryUserId;
|
private String mPrimaryUserId;
|
||||||
private String mExtraData;
|
private String mExtraData;
|
||||||
private String mQuery;
|
private String mQuery;
|
||||||
private String mOrigin;
|
private String mOrigin;
|
||||||
@ -56,16 +56,16 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
|
|||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeString(mPrimaryUserId);
|
dest.writeString(mPrimaryUserId);
|
||||||
dest.writeStringList(userIds);
|
dest.writeStringList(mUserIds);
|
||||||
dest.writeLong(keyId);
|
dest.writeLong(mKeyId);
|
||||||
dest.writeByte((byte) (revoked ? 1 : 0));
|
dest.writeByte((byte) (mRevoked ? 1 : 0));
|
||||||
dest.writeByte((byte) (expired ? 1 : 0));
|
dest.writeByte((byte) (mExpired ? 1 : 0));
|
||||||
dest.writeSerializable(date);
|
dest.writeSerializable(mDate);
|
||||||
dest.writeString(fingerprintHex);
|
dest.writeString(mFingerprintHex);
|
||||||
dest.writeString(keyIdHex);
|
dest.writeString(mKeyIdHex);
|
||||||
dest.writeInt(bitStrength);
|
dest.writeInt(mBitStrength);
|
||||||
dest.writeString(algorithm);
|
dest.writeString(mAlgorithm);
|
||||||
dest.writeByte((byte) (secretKey ? 1 : 0));
|
dest.writeByte((byte) (mSecretKey ? 1 : 0));
|
||||||
dest.writeByte((byte) (mSelected ? 1 : 0));
|
dest.writeByte((byte) (mSelected ? 1 : 0));
|
||||||
dest.writeString(mExtraData);
|
dest.writeString(mExtraData);
|
||||||
dest.writeString(mOrigin);
|
dest.writeString(mOrigin);
|
||||||
@ -75,17 +75,17 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
|
|||||||
public ImportKeysListEntry createFromParcel(final Parcel source) {
|
public ImportKeysListEntry createFromParcel(final Parcel source) {
|
||||||
ImportKeysListEntry vr = new ImportKeysListEntry();
|
ImportKeysListEntry vr = new ImportKeysListEntry();
|
||||||
vr.mPrimaryUserId = source.readString();
|
vr.mPrimaryUserId = source.readString();
|
||||||
vr.userIds = new ArrayList<String>();
|
vr.mUserIds = new ArrayList<String>();
|
||||||
source.readStringList(vr.userIds);
|
source.readStringList(vr.mUserIds);
|
||||||
vr.keyId = source.readLong();
|
vr.mKeyId = source.readLong();
|
||||||
vr.revoked = source.readByte() == 1;
|
vr.mRevoked = source.readByte() == 1;
|
||||||
vr.expired = source.readByte() == 1;
|
vr.mExpired = source.readByte() == 1;
|
||||||
vr.date = (Date) source.readSerializable();
|
vr.mDate = (Date) source.readSerializable();
|
||||||
vr.fingerprintHex = source.readString();
|
vr.mFingerprintHex = source.readString();
|
||||||
vr.keyIdHex = source.readString();
|
vr.mKeyIdHex = source.readString();
|
||||||
vr.bitStrength = source.readInt();
|
vr.mBitStrength = source.readInt();
|
||||||
vr.algorithm = source.readString();
|
vr.mAlgorithm = source.readString();
|
||||||
vr.secretKey = source.readByte() == 1;
|
vr.mSecretKey = source.readByte() == 1;
|
||||||
vr.mSelected = source.readByte() == 1;
|
vr.mSelected = source.readByte() == 1;
|
||||||
vr.mExtraData = source.readString();
|
vr.mExtraData = source.readString();
|
||||||
vr.mOrigin = source.readString();
|
vr.mOrigin = source.readString();
|
||||||
@ -99,7 +99,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public String getKeyIdHex() {
|
public String getKeyIdHex() {
|
||||||
return keyIdHex;
|
return mKeyIdHex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSelected() {
|
public boolean isSelected() {
|
||||||
@ -111,79 +111,79 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isExpired() {
|
public boolean isExpired() {
|
||||||
return expired;
|
return mExpired;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExpired(boolean expired) {
|
public void setExpired(boolean expired) {
|
||||||
this.expired = expired;
|
this.mExpired = expired;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getKeyId() {
|
public long getKeyId() {
|
||||||
return keyId;
|
return mKeyId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setKeyId(long keyId) {
|
public void setKeyId(long keyId) {
|
||||||
this.keyId = keyId;
|
this.mKeyId = keyId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setKeyIdHex(String keyIdHex) {
|
public void setKeyIdHex(String keyIdHex) {
|
||||||
this.keyIdHex = keyIdHex;
|
this.mKeyIdHex = keyIdHex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRevoked() {
|
public boolean isRevoked() {
|
||||||
return revoked;
|
return mRevoked;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRevoked(boolean revoked) {
|
public void setRevoked(boolean revoked) {
|
||||||
this.revoked = revoked;
|
this.mRevoked = revoked;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date getDate() {
|
public Date getDate() {
|
||||||
return date;
|
return mDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDate(Date date) {
|
public void setDate(Date date) {
|
||||||
this.date = date;
|
this.mDate = date;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFingerprintHex() {
|
public String getFingerprintHex() {
|
||||||
return fingerprintHex;
|
return mFingerprintHex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFingerprintHex(String fingerprintHex) {
|
public void setFingerprintHex(String fingerprintHex) {
|
||||||
this.fingerprintHex = fingerprintHex;
|
this.mFingerprintHex = fingerprintHex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getBitStrength() {
|
public int getBitStrength() {
|
||||||
return bitStrength;
|
return mBitStrength;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBitStrength(int bitStrength) {
|
public void setBitStrength(int bitStrength) {
|
||||||
this.bitStrength = bitStrength;
|
this.mBitStrength = bitStrength;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAlgorithm() {
|
public String getAlgorithm() {
|
||||||
return algorithm;
|
return mAlgorithm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAlgorithm(String algorithm) {
|
public void setAlgorithm(String algorithm) {
|
||||||
this.algorithm = algorithm;
|
this.mAlgorithm = algorithm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSecretKey() {
|
public boolean isSecretKey() {
|
||||||
return secretKey;
|
return mSecretKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSecretKey(boolean secretKey) {
|
public void setSecretKey(boolean secretKey) {
|
||||||
this.secretKey = secretKey;
|
this.mSecretKey = secretKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<String> getUserIds() {
|
public ArrayList<String> getUserIds() {
|
||||||
return userIds;
|
return mUserIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUserIds(ArrayList<String> userIds) {
|
public void setUserIds(ArrayList<String> userIds) {
|
||||||
this.userIds = userIds;
|
this.mUserIds = userIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPrimaryUserId() {
|
public String getPrimaryUserId() {
|
||||||
@ -223,10 +223,10 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
|
|||||||
*/
|
*/
|
||||||
public ImportKeysListEntry() {
|
public ImportKeysListEntry() {
|
||||||
// keys from keyserver are always public keys; from keybase too
|
// keys from keyserver are always public keys; from keybase too
|
||||||
secretKey = false;
|
mSecretKey = false;
|
||||||
// do not select by default
|
// do not select by default
|
||||||
mSelected = false;
|
mSelected = false;
|
||||||
userIds = new ArrayList<String>();
|
mUserIds = new ArrayList<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -237,24 +237,24 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
|
|||||||
// selected is default
|
// selected is default
|
||||||
this.mSelected = true;
|
this.mSelected = true;
|
||||||
|
|
||||||
secretKey = ring.isSecret();
|
mSecretKey = ring.isSecret();
|
||||||
UncachedPublicKey key = ring.getPublicKey();
|
UncachedPublicKey key = ring.getPublicKey();
|
||||||
|
|
||||||
mPrimaryUserId = key.getPrimaryUserId();
|
mPrimaryUserId = key.getPrimaryUserId();
|
||||||
userIds = key.getUnorderedUserIds();
|
mUserIds = key.getUnorderedUserIds();
|
||||||
|
|
||||||
// if there was no user id flagged as primary, use the first one
|
// if there was no user id flagged as primary, use the first one
|
||||||
if (mPrimaryUserId == null) {
|
if (mPrimaryUserId == null) {
|
||||||
mPrimaryUserId = userIds.get(0);
|
mPrimaryUserId = mUserIds.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.keyId = key.getKeyId();
|
this.mKeyId = key.getKeyId();
|
||||||
this.keyIdHex = PgpKeyHelper.convertKeyIdToHex(keyId);
|
this.mKeyIdHex = PgpKeyHelper.convertKeyIdToHex(mKeyId);
|
||||||
|
|
||||||
this.revoked = key.maybeRevoked();
|
this.mRevoked = key.maybeRevoked();
|
||||||
this.fingerprintHex = PgpKeyHelper.convertFingerprintToHex(key.getFingerprint());
|
this.mFingerprintHex = PgpKeyHelper.convertFingerprintToHex(key.getFingerprint());
|
||||||
this.bitStrength = key.getBitStrength();
|
this.mBitStrength = key.getBitStrength();
|
||||||
final int algorithm = key.getAlgorithm();
|
final int algorithm = key.getAlgorithm();
|
||||||
this.algorithm = PgpKeyHelper.getAlgorithmInfo(context, algorithm);
|
this.mAlgorithm = PgpKeyHelper.getAlgorithmInfo(context, algorithm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,7 +146,8 @@ public class KeybaseKeyserver extends Keyserver {
|
|||||||
try {
|
try {
|
||||||
JSONObject json = new JSONObject(text);
|
JSONObject json = new JSONObject(text);
|
||||||
if (JWalk.getInt(json, "status", "code") != 0) {
|
if (JWalk.getInt(json, "status", "code") != 0) {
|
||||||
throw new QueryFailedException("Keybase autocomplete search failed");
|
throw new QueryFailedException("Keybase.io query failed: " + path + "?" +
|
||||||
|
query);
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
|
@ -3,11 +3,6 @@ package org.sufficientlysecure.keychain.keyimport;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/** This is a trivial wrapper around UncachedKeyRing which implements Parcelable. It exists
|
/** This is a trivial wrapper around UncachedKeyRing which implements Parcelable. It exists
|
||||||
* for the sole purpose of keeping spongycastle and android imports in separate packages.
|
* for the sole purpose of keeping spongycastle and android imports in separate packages.
|
||||||
*/
|
*/
|
||||||
@ -40,12 +35,15 @@ public class ParcelableKeyRing implements Parcelable {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UncachedKeyRing getUncachedKeyRing() throws PgpGeneralException, IOException {
|
public byte[] getBytes() {
|
||||||
return UncachedKeyRing.decodeFromData(mBytes);
|
return mBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExpectedFingerprint() {
|
||||||
|
return mExpectedFingerprint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@ package org.sufficientlysecure.keychain.pgp;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/** An abstract KeyRing.
|
/** An abstract KeyRing.
|
||||||
*
|
*
|
||||||
* This is an abstract class for all KeyRing constructs. It serves as a common
|
* This is an abstract class for all KeyRing constructs. It serves as a common
|
||||||
@ -19,6 +22,10 @@ public abstract class KeyRing {
|
|||||||
|
|
||||||
abstract public String getPrimaryUserId() throws PgpGeneralException;
|
abstract public String getPrimaryUserId() throws PgpGeneralException;
|
||||||
|
|
||||||
|
public String[] getSplitPrimaryUserId() throws PgpGeneralException {
|
||||||
|
return splitUserId(getPrimaryUserId());
|
||||||
|
}
|
||||||
|
|
||||||
abstract public boolean isRevoked() throws PgpGeneralException;
|
abstract public boolean isRevoked() throws PgpGeneralException;
|
||||||
|
|
||||||
abstract public boolean canCertify() throws PgpGeneralException;
|
abstract public boolean canCertify() throws PgpGeneralException;
|
||||||
@ -33,4 +40,39 @@ public abstract class KeyRing {
|
|||||||
|
|
||||||
abstract public int getVerified() throws PgpGeneralException;
|
abstract public int getVerified() throws PgpGeneralException;
|
||||||
|
|
||||||
|
private static final Pattern USER_ID_PATTERN = Pattern.compile("^(.*?)(?: \\((.*)\\))?(?: <(.*)>)?$");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits userId string into naming part, email part, and comment part
|
||||||
|
*
|
||||||
|
* @param userId
|
||||||
|
* @return array with naming (0), email (1), comment (2)
|
||||||
|
*/
|
||||||
|
public static String[] splitUserId(String userId) {
|
||||||
|
String[] result = new String[]{null, null, null};
|
||||||
|
|
||||||
|
if (userId == null || userId.equals("")) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* User ID matching:
|
||||||
|
* http://fiddle.re/t4p6f
|
||||||
|
*
|
||||||
|
* test cases:
|
||||||
|
* "Max Mustermann (this is a comment) <max@example.com>"
|
||||||
|
* "Max Mustermann <max@example.com>"
|
||||||
|
* "Max Mustermann (this is a comment)"
|
||||||
|
* "Max Mustermann [this is nothing]"
|
||||||
|
*/
|
||||||
|
Matcher matcher = USER_ID_PATTERN.matcher(userId);
|
||||||
|
if (matcher.matches()) {
|
||||||
|
result[0] = matcher.group(1);
|
||||||
|
result[1] = matcher.group(3);
|
||||||
|
result[2] = matcher.group(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.sufficientlysecure.keychain.pgp;
|
package org.sufficientlysecure.keychain.pgp;
|
||||||
|
|
||||||
import org.spongycastle.openpgp.PGPKeyRing;
|
|
||||||
import org.spongycastle.openpgp.PGPObjectFactory;
|
import org.spongycastle.openpgp.PGPObjectFactory;
|
||||||
import org.spongycastle.openpgp.PGPSecretKey;
|
import org.spongycastle.openpgp.PGPSecretKey;
|
||||||
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
||||||
|
@ -24,7 +24,6 @@ import android.content.pm.PackageManager.NameNotFoundException;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.pgp.Progressable;
|
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -26,13 +26,13 @@ import org.spongycastle.bcpg.ArmoredOutputStream;
|
|||||||
import org.spongycastle.openpgp.PGPException;
|
import org.spongycastle.openpgp.PGPException;
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
||||||
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
|
|
||||||
import org.sufficientlysecure.keychain.keyimport.Keyserver.AddKeyException;
|
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
@ -139,7 +139,18 @@ public class PgpImportExport {
|
|||||||
int position = 0;
|
int position = 0;
|
||||||
for (ParcelableKeyRing entry : entries) {
|
for (ParcelableKeyRing entry : entries) {
|
||||||
try {
|
try {
|
||||||
UncachedKeyRing key = entry.getUncachedKeyRing();
|
UncachedKeyRing key = UncachedKeyRing.decodeFromData(entry.getBytes());
|
||||||
|
|
||||||
|
String expectedFp = entry.getExpectedFingerprint();
|
||||||
|
if(expectedFp != null) {
|
||||||
|
if(!PgpKeyHelper.convertFingerprintToHex(key.getFingerprint()).equals(expectedFp)) {
|
||||||
|
Log.e(Constants.TAG, "Actual key fingerprint is not the same as expected!");
|
||||||
|
badKeys += 1;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
Log.d(Constants.TAG, "Actual key fingerprint matches expected one.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mProviderHelper.savePublicKeyRing(key);
|
mProviderHelper.savePublicKeyRing(key);
|
||||||
/*switch(status) {
|
/*switch(status) {
|
||||||
|
@ -24,151 +24,19 @@ import android.text.Spannable;
|
|||||||
import android.text.SpannableStringBuilder;
|
import android.text.SpannableStringBuilder;
|
||||||
import android.text.style.ForegroundColorSpan;
|
import android.text.style.ForegroundColorSpan;
|
||||||
|
|
||||||
import org.spongycastle.bcpg.sig.KeyFlags;
|
|
||||||
import org.spongycastle.openpgp.PGPPublicKey;
|
import org.spongycastle.openpgp.PGPPublicKey;
|
||||||
import org.spongycastle.openpgp.PGPPublicKeyRing;
|
|
||||||
import org.spongycastle.openpgp.PGPSecretKey;
|
|
||||||
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
|
||||||
import org.spongycastle.openpgp.PGPSignature;
|
|
||||||
import org.spongycastle.openpgp.PGPSignatureSubpacketVector;
|
|
||||||
import org.spongycastle.util.encoders.Hex;
|
import org.spongycastle.util.encoders.Hex;
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.util.IterableIterator;
|
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.security.DigestException;
|
import java.security.DigestException;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.GregorianCalendar;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Vector;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class PgpKeyHelper {
|
public class PgpKeyHelper {
|
||||||
|
|
||||||
private static final Pattern USER_ID_PATTERN = Pattern.compile("^(.*?)(?: \\((.*)\\))?(?: <(.*)>)?$");
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public static Date getCreationDate(PGPPublicKey key) {
|
|
||||||
return key.getCreationTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public static Date getExpiryDate(PGPPublicKey key) {
|
|
||||||
Date creationDate = getCreationDate(key);
|
|
||||||
if (key.getValidDays() == 0) {
|
|
||||||
// no expiry
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
Calendar calendar = GregorianCalendar.getInstance();
|
|
||||||
calendar.setTime(creationDate);
|
|
||||||
calendar.add(Calendar.DATE, key.getValidDays());
|
|
||||||
|
|
||||||
return calendar.getTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static boolean isEncryptionKey(PGPPublicKey key) {
|
|
||||||
if (!key.isEncryptionKey()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key.getVersion() <= 3) {
|
|
||||||
// this must be true now
|
|
||||||
return key.isEncryptionKey();
|
|
||||||
}
|
|
||||||
|
|
||||||
// special cases
|
|
||||||
if (key.getAlgorithm() == PGPPublicKey.ELGAMAL_ENCRYPT) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key.getAlgorithm() == PGPPublicKey.RSA_ENCRYPT) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (PGPSignature sig : new IterableIterator<PGPSignature>(key.getSignatures())) {
|
|
||||||
if (key.isMasterKey() && sig.getKeyID() != key.getKeyID()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();
|
|
||||||
|
|
||||||
if (hashed != null
|
|
||||||
&& (hashed.getKeyFlags() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
PGPSignatureSubpacketVector unhashed = sig.getUnhashedSubPackets();
|
|
||||||
|
|
||||||
if (unhashed != null
|
|
||||||
&& (unhashed.getKeyFlags() & (KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE)) != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static boolean isSigningKey(PGPPublicKey key) {
|
|
||||||
if (key.getVersion() <= 3) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// special case
|
|
||||||
if (key.getAlgorithm() == PGPPublicKey.RSA_SIGN) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (PGPSignature sig : new IterableIterator<PGPSignature>(key.getSignatures())) {
|
|
||||||
if (key.isMasterKey() && sig.getKeyID() != key.getKeyID()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();
|
|
||||||
|
|
||||||
if (hashed != null && (hashed.getKeyFlags() & KeyFlags.SIGN_DATA) != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
PGPSignatureSubpacketVector unhashed = sig.getUnhashedSubPackets();
|
|
||||||
|
|
||||||
if (unhashed != null && (unhashed.getKeyFlags() & KeyFlags.SIGN_DATA) != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static boolean isCertificationKey(PGPPublicKey key) {
|
|
||||||
if (key.getVersion() <= 3) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (PGPSignature sig : new IterableIterator<PGPSignature>(key.getSignatures())) {
|
|
||||||
if (key.isMasterKey() && sig.getKeyID() != key.getKeyID()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
PGPSignatureSubpacketVector hashed = sig.getHashedSubPackets();
|
|
||||||
|
|
||||||
if (hashed != null && (hashed.getKeyFlags() & KeyFlags.CERTIFY_OTHER) != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
PGPSignatureSubpacketVector unhashed = sig.getUnhashedSubPackets();
|
|
||||||
|
|
||||||
if (unhashed != null && (unhashed.getKeyFlags() & KeyFlags.CERTIFY_OTHER) != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Only used in HkpKeyServer. Get rid of this one!
|
* TODO: Only used in HkpKeyServer. Get rid of this one!
|
||||||
*/
|
*/
|
||||||
@ -358,37 +226,4 @@ public class PgpKeyHelper {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Splits userId string into naming part, email part, and comment part
|
|
||||||
*
|
|
||||||
* @param userId
|
|
||||||
* @return array with naming (0), email (1), comment (2)
|
|
||||||
*/
|
|
||||||
public static String[] splitUserId(String userId) {
|
|
||||||
String[] result = new String[]{null, null, null};
|
|
||||||
|
|
||||||
if (userId == null || userId.equals("")) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* User ID matching:
|
|
||||||
* http://fiddle.re/t4p6f
|
|
||||||
*
|
|
||||||
* test cases:
|
|
||||||
* "Max Mustermann (this is a comment) <max@example.com>"
|
|
||||||
* "Max Mustermann <max@example.com>"
|
|
||||||
* "Max Mustermann (this is a comment)"
|
|
||||||
* "Max Mustermann [this is nothing]"
|
|
||||||
*/
|
|
||||||
Matcher matcher = USER_ID_PATTERN.matcher(userId);
|
|
||||||
if (matcher.matches()) {
|
|
||||||
result[0] = matcher.group(1);
|
|
||||||
result[1] = matcher.group(3);
|
|
||||||
result[2] = matcher.group(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ import java.util.Calendar;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class UncachedPublicKey {
|
public class UncachedPublicKey {
|
||||||
protected final PGPPublicKey mPublicKey;
|
protected final PGPPublicKey mPublicKey;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.sufficientlysecure.keychain.pgp;
|
package org.sufficientlysecure.keychain.pgp;
|
||||||
|
|
||||||
import org.spongycastle.openpgp.PGPKeyRing;
|
import org.spongycastle.openpgp.PGPKeyRing;
|
||||||
import org.spongycastle.openpgp.PGPPublicKey;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.util.IterableIterator;
|
import org.sufficientlysecure.keychain.util.IterableIterator;
|
||||||
|
|
||||||
@ -53,9 +52,9 @@ public abstract class WrappedKeyRing extends KeyRing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public long getEncryptId() throws PgpGeneralException {
|
public long getEncryptId() throws PgpGeneralException {
|
||||||
for(PGPPublicKey key : new IterableIterator<PGPPublicKey>(getRing().getPublicKeys())) {
|
for(WrappedPublicKey key : publicKeyIterator()) {
|
||||||
if(PgpKeyHelper.isEncryptionKey(key)) {
|
if(key.canEncrypt()) {
|
||||||
return key.getKeyID();
|
return key.getKeyId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new PgpGeneralException("No valid encryption key found!");
|
throw new PgpGeneralException("No valid encryption key found!");
|
||||||
@ -71,9 +70,9 @@ public abstract class WrappedKeyRing extends KeyRing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public long getSignId() throws PgpGeneralException {
|
public long getSignId() throws PgpGeneralException {
|
||||||
for(PGPPublicKey key : new IterableIterator<PGPPublicKey>(getRing().getPublicKeys())) {
|
for(WrappedPublicKey key : publicKeyIterator()) {
|
||||||
if(PgpKeyHelper.isSigningKey(key)) {
|
if(key.canSign()) {
|
||||||
return key.getKeyID();
|
return key.getKeyId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new PgpGeneralException("No valid signing key found!");
|
throw new PgpGeneralException("No valid signing key found!");
|
||||||
@ -94,4 +93,6 @@ public abstract class WrappedKeyRing extends KeyRing {
|
|||||||
|
|
||||||
abstract PGPKeyRing getRing();
|
abstract PGPKeyRing getRing();
|
||||||
|
|
||||||
|
abstract public IterableIterator<WrappedPublicKey> publicKeyIterator();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ public class WrappedPublicKeyRing extends WrappedKeyRing {
|
|||||||
return validPrimaryKeyBinding;
|
return validPrimaryKeyBinding;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IterableIterator<WrappedPublicKey> iterator() {
|
public IterableIterator<WrappedPublicKey> publicKeyIterator() {
|
||||||
final Iterator<PGPPublicKey> it = getRing().getPublicKeys();
|
final Iterator<PGPPublicKey> it = getRing().getPublicKeys();
|
||||||
return new IterableIterator<WrappedPublicKey>(new Iterator<WrappedPublicKey>() {
|
return new IterableIterator<WrappedPublicKey>(new Iterator<WrappedPublicKey>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -4,7 +4,7 @@ import org.spongycastle.openpgp.PGPException;
|
|||||||
import org.spongycastle.openpgp.PGPKeyRing;
|
import org.spongycastle.openpgp.PGPKeyRing;
|
||||||
import org.spongycastle.openpgp.PGPObjectFactory;
|
import org.spongycastle.openpgp.PGPObjectFactory;
|
||||||
import org.spongycastle.openpgp.PGPPrivateKey;
|
import org.spongycastle.openpgp.PGPPrivateKey;
|
||||||
import org.spongycastle.openpgp.PGPPublicKeyRing;
|
import org.spongycastle.openpgp.PGPPublicKey;
|
||||||
import org.spongycastle.openpgp.PGPSecretKey;
|
import org.spongycastle.openpgp.PGPSecretKey;
|
||||||
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
import org.spongycastle.openpgp.PGPSecretKeyRing;
|
||||||
import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
|
import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
|
||||||
@ -114,7 +114,7 @@ public class WrappedSecretKeyRing extends WrappedKeyRing {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IterableIterator<WrappedSecretKey> iterator() {
|
public IterableIterator<WrappedSecretKey> secretKeyIterator() {
|
||||||
final Iterator<PGPSecretKey> it = mRing.getSecretKeys();
|
final Iterator<PGPSecretKey> it = mRing.getSecretKeys();
|
||||||
return new IterableIterator<WrappedSecretKey>(new Iterator<WrappedSecretKey>() {
|
return new IterableIterator<WrappedSecretKey>(new Iterator<WrappedSecretKey>() {
|
||||||
@Override
|
@Override
|
||||||
@ -134,6 +134,26 @@ public class WrappedSecretKeyRing extends WrappedKeyRing {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IterableIterator<WrappedPublicKey> publicKeyIterator() {
|
||||||
|
final Iterator<PGPPublicKey> it = getRing().getPublicKeys();
|
||||||
|
return new IterableIterator<WrappedPublicKey>(new Iterator<WrappedPublicKey>() {
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return it.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WrappedPublicKey next() {
|
||||||
|
return new WrappedPublicKey(WrappedSecretKeyRing.this, it.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public UncachedKeyRing getUncached() {
|
public UncachedKeyRing getUncached() {
|
||||||
return new UncachedKeyRing(mRing);
|
return new UncachedKeyRing(mRing);
|
||||||
}
|
}
|
||||||
|
@ -29,12 +29,12 @@ import android.support.v4.util.LongSparseArray;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpHelper;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
|
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.UncachedPublicKey;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
|
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.ApiApps;
|
||||||
@ -150,11 +150,11 @@ public class ProviderHelper {
|
|||||||
if (data != null) {
|
if (data != null) {
|
||||||
try {
|
try {
|
||||||
result.put(masterKeyId,
|
result.put(masterKeyId,
|
||||||
UncachedKeyRing.decodePublicFromData(data).getPublicKey());
|
UncachedKeyRing.decodeFromData(data).getPublicKey());
|
||||||
} catch(PgpGeneralException e) {
|
} catch(PgpGeneralException e) {
|
||||||
Log.e(Constants.TAG, "Error parsing keyring, skipping.");
|
Log.e(Constants.TAG, "Error parsing keyring, skipping " + masterKeyId, e);
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
Log.e(Constants.TAG, "IO error, skipping keyring");
|
Log.e(Constants.TAG, "IO error, skipping keyring" + masterKeyId, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (cursor.moveToNext());
|
} while (cursor.moveToNext());
|
||||||
|
@ -33,11 +33,9 @@ import org.sufficientlysecure.keychain.helper.OtherHelper;
|
|||||||
import org.sufficientlysecure.keychain.helper.Preferences;
|
import org.sufficientlysecure.keychain.helper.Preferences;
|
||||||
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
|
import org.sufficientlysecure.keychain.keyimport.HkpKeyserver;
|
||||||
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.UncachedSecretKey;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSecretKey;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
|
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
|
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpHelper;
|
||||||
@ -46,14 +44,16 @@ import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;
|
|||||||
import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt;
|
import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt;
|
||||||
import org.sufficientlysecure.keychain.pgp.Progressable;
|
import org.sufficientlysecure.keychain.pgp.Progressable;
|
||||||
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
|
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.UncachedSecretKey;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedSecretKey;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
|
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
|
||||||
import org.sufficientlysecure.keychain.util.InputData;
|
import org.sufficientlysecure.keychain.util.InputData;
|
||||||
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
|
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
import org.sufficientlysecure.keychain.util.ProgressScaler;
|
import org.sufficientlysecure.keychain.util.ProgressScaler;
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ import com.beardedhen.androidbootstrap.BootstrapButton;
|
|||||||
|
|
||||||
import org.openintents.openpgp.OpenPgpSignatureResult;
|
import org.openintents.openpgp.OpenPgpSignatureResult;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
|
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
|
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
|
||||||
@ -111,7 +112,7 @@ public class DecryptFragment extends Fragment {
|
|||||||
mSignatureKeyId = signatureResult.getKeyId();
|
mSignatureKeyId = signatureResult.getKeyId();
|
||||||
|
|
||||||
String userId = signatureResult.getUserId();
|
String userId = signatureResult.getUserId();
|
||||||
String[] userIdSplit = PgpKeyHelper.splitUserId(userId);
|
String[] userIdSplit = KeyRing.splitUserId(userId);
|
||||||
if (userIdSplit[0] != null) {
|
if (userIdSplit[0] != null) {
|
||||||
mUserId.setText(userIdSplit[0]);
|
mUserId.setText(userIdSplit[0]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -28,7 +28,6 @@ import android.view.View.OnClickListener;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
|
||||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
|
||||||
import com.devspark.appmsg.AppMsg;
|
import com.devspark.appmsg.AppMsg;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
|
@ -47,11 +47,11 @@ import org.sufficientlysecure.keychain.Constants;
|
|||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.ActionBarHelper;
|
import org.sufficientlysecure.keychain.helper.ActionBarHelper;
|
||||||
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.PgpConversionHelper;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.UncachedSecretKey;
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSecretKey;
|
import org.sufficientlysecure.keychain.pgp.WrappedSecretKey;
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing;
|
import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpConversionHelper;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.UncachedSecretKey;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
@ -289,7 +289,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
|
|||||||
WrappedSecretKeyRing keyRing = new ProviderHelper(this).getWrappedSecretKeyRing(secretUri);
|
WrappedSecretKeyRing keyRing = new ProviderHelper(this).getWrappedSecretKeyRing(secretUri);
|
||||||
|
|
||||||
mMasterCanSign = keyRing.getSubKey().canCertify();
|
mMasterCanSign = keyRing.getSubKey().canCertify();
|
||||||
for (WrappedSecretKey key : keyRing.iterator()) {
|
for (WrappedSecretKey key : keyRing.secretKeyIterator()) {
|
||||||
// Turn into uncached instance
|
// Turn into uncached instance
|
||||||
mKeys.add(key.getUncached());
|
mKeys.add(key.getUncached());
|
||||||
mKeysUsages.add(key.getKeyUsage()); // get usage when view is created
|
mKeysUsages.add(key.getKeyUsage()); // get usage when view is created
|
||||||
@ -300,7 +300,7 @@ public class EditKeyActivity extends ActionBarActivity implements EditorListener
|
|||||||
Log.d(Constants.TAG, "Added userId " + userId);
|
Log.d(Constants.TAG, "Added userId " + userId);
|
||||||
if (!isSet) {
|
if (!isSet) {
|
||||||
isSet = true;
|
isSet = true;
|
||||||
String[] parts = PgpKeyHelper.splitUserId(userId);
|
String[] parts = KeyRing.splitUserId(userId);
|
||||||
if (parts[0] != null) {
|
if (parts[0] != null) {
|
||||||
setTitle(parts[0]);
|
setTitle(parts[0]);
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,6 @@ import com.beardedhen.androidbootstrap.BootstrapButton;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
|
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
@ -199,10 +198,9 @@ public class EncryptAsymmetricFragment extends Fragment {
|
|||||||
// See if we can get a user_id from a unified query
|
// See if we can get a user_id from a unified query
|
||||||
String[] userId;
|
String[] userId;
|
||||||
try {
|
try {
|
||||||
String userIdResult = (String) mProviderHelper.getUnifiedData(
|
userId = mProviderHelper.getCachedPublicKeyRing(
|
||||||
mSecretKeyId, KeyRings.USER_ID, ProviderHelper.FIELD_TYPE_STRING);
|
KeyRings.buildUnifiedKeyRingUri(mSecretKeyId)).getSplitPrimaryUserId();
|
||||||
userId = PgpKeyHelper.splitUserId(userIdResult);
|
} catch (PgpGeneralException e) {
|
||||||
} catch (ProviderHelper.NotFoundException e) {
|
|
||||||
userId = null;
|
userId = null;
|
||||||
}
|
}
|
||||||
if (userId != null && userId[0] != null) {
|
if (userId != null && userId[0] != null) {
|
||||||
|
@ -25,7 +25,6 @@ import android.support.v7.app.ActionBarActivity;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
|
import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.TabsAdapter;
|
|
||||||
import org.sufficientlysecure.keychain.util.SlidingTabLayout;
|
import org.sufficientlysecure.keychain.util.SlidingTabLayout;
|
||||||
|
|
||||||
public class HelpActivity extends ActionBarActivity {
|
public class HelpActivity extends ActionBarActivity {
|
||||||
|
@ -42,11 +42,11 @@ import com.devspark.appmsg.AppMsg;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
import org.sufficientlysecure.keychain.service.KeychainIntentService;
|
||||||
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
|
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
|
||||||
import org.sufficientlysecure.keychain.ui.dialog.BadImportKeyDialogFragment;
|
import org.sufficientlysecure.keychain.ui.dialog.BadImportKeyDialogFragment;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@
|
|||||||
package org.sufficientlysecure.keychain.ui;
|
package org.sufficientlysecure.keychain.ui;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -31,9 +31,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import public keys from the Keybase.io directory. First cut: just raw search.
|
* Import public keys from the Keybase.io directory. First cut: just raw search.
|
||||||
|
@ -32,15 +32,15 @@ import com.devspark.appmsg.AppMsg;
|
|||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.Preferences;
|
import org.sufficientlysecure.keychain.helper.Preferences;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper;
|
import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter;
|
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListKeybaseLoader;
|
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListKeybaseLoader;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
|
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader;
|
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader;
|
||||||
import org.sufficientlysecure.keychain.util.InputData;
|
import org.sufficientlysecure.keychain.util.InputData;
|
||||||
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.sufficientlysecure.keychain.ui;
|
package org.sufficientlysecure.keychain.ui;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@ -33,8 +32,8 @@ import android.support.v4.app.LoaderManager;
|
|||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.content.Loader;
|
import android.support.v4.content.Loader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
import android.support.v4.view.MenuItemCompat;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
|
||||||
import android.support.v4.widget.CursorAdapter;
|
import android.support.v4.widget.CursorAdapter;
|
||||||
|
import android.support.v7.app.ActionBarActivity;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.ActionMode;
|
import android.view.ActionMode;
|
||||||
@ -59,7 +58,7 @@ import com.devspark.appmsg.AppMsg;
|
|||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRingData;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
|
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
|
||||||
@ -475,7 +474,7 @@ public class KeyListFragment extends LoaderFragment
|
|||||||
|
|
||||||
{ // set name and stuff, common to both key types
|
{ // set name and stuff, common to both key types
|
||||||
String userId = cursor.getString(INDEX_USER_ID);
|
String userId = cursor.getString(INDEX_USER_ID);
|
||||||
String[] userIdSplit = PgpKeyHelper.splitUserId(userId);
|
String[] userIdSplit = KeyRing.splitUserId(userId);
|
||||||
if (userIdSplit[0] != null) {
|
if (userIdSplit[0] != null) {
|
||||||
h.mMainUserId.setText(highlighter.highlight(userIdSplit[0]));
|
h.mMainUserId.setText(highlighter.highlight(userIdSplit[0]));
|
||||||
} else {
|
} else {
|
||||||
|
@ -35,6 +35,7 @@ import android.widget.TextView;
|
|||||||
import com.beardedhen.androidbootstrap.BootstrapButton;
|
import com.beardedhen.androidbootstrap.BootstrapButton;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||||
|
|
||||||
@ -158,7 +159,7 @@ public class SelectSecretKeyLayoutFragment extends Fragment implements LoaderMan
|
|||||||
String userID = data.getString(INDEX_USER_ID);
|
String userID = data.getString(INDEX_USER_ID);
|
||||||
long masterKeyID = data.getLong(INDEX_MASTER_KEY_ID);
|
long masterKeyID = data.getLong(INDEX_MASTER_KEY_ID);
|
||||||
|
|
||||||
String splitUserID[] = PgpKeyHelper.splitUserId(userID);
|
String splitUserID[] = KeyRing.splitUserId(userID);
|
||||||
|
|
||||||
if (splitUserID[0] != null) {
|
if (splitUserID[0] != null) {
|
||||||
userName = splitUserID[0];
|
userName = splitUserID[0];
|
||||||
|
@ -34,8 +34,8 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
|
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
|
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
|
||||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
|
||||||
|
@ -51,6 +51,7 @@ import org.sufficientlysecure.keychain.Constants;
|
|||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.ContactHelper;
|
import org.sufficientlysecure.keychain.helper.ContactHelper;
|
||||||
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
import org.sufficientlysecure.keychain.helper.ExportHelper;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
import org.sufficientlysecure.keychain.provider.KeychainContract;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
@ -58,7 +59,6 @@ import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;
|
|||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
import org.sufficientlysecure.keychain.util.SlidingTabLayout;
|
import org.sufficientlysecure.keychain.util.SlidingTabLayout;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
@ -420,7 +420,7 @@ public class ViewKeyActivity extends ActionBarActivity implements
|
|||||||
case LOADER_ID_UNIFIED: {
|
case LOADER_ID_UNIFIED: {
|
||||||
if (data.moveToFirst()) {
|
if (data.moveToFirst()) {
|
||||||
// get name, email, and comment from USER_ID
|
// get name, email, and comment from USER_ID
|
||||||
String[] mainUserId = PgpKeyHelper.splitUserId(data.getString(INDEX_UNIFIED_USER_ID));
|
String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_UNIFIED_USER_ID));
|
||||||
if (mainUserId[0] != null) {
|
if (mainUserId[0] != null) {
|
||||||
setTitle(mainUserId[0]);
|
setTitle(mainUserId[0]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -35,6 +35,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
|
import org.sufficientlysecure.keychain.pgp.WrappedSignature;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
|
||||||
@ -218,7 +219,7 @@ public class ViewKeyCertsFragment extends LoaderFragment
|
|||||||
TextView wSignStatus = (TextView) view.findViewById(R.id.signStatus);
|
TextView wSignStatus = (TextView) view.findViewById(R.id.signStatus);
|
||||||
|
|
||||||
String signerKeyId = PgpKeyHelper.convertKeyIdToHex(cursor.getLong(mIndexSignerKeyId));
|
String signerKeyId = PgpKeyHelper.convertKeyIdToHex(cursor.getLong(mIndexSignerKeyId));
|
||||||
String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexSignerUserId));
|
String[] userId = KeyRing.splitUserId(cursor.getString(mIndexSignerUserId));
|
||||||
if (userId[0] != null) {
|
if (userId[0] != null) {
|
||||||
wSignerName.setText(userId[0]);
|
wSignerName.setText(userId[0]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -18,31 +18,22 @@
|
|||||||
package org.sufficientlysecure.keychain.ui;
|
package org.sufficientlysecure.keychain.ui;
|
||||||
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Color;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.app.LoaderManager;
|
import android.support.v4.app.LoaderManager;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.content.Loader;
|
import android.support.v4.content.Loader;
|
||||||
import android.text.format.DateFormat;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
|
||||||
import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter;
|
import org.sufficientlysecure.keychain.ui.adapter.ViewKeyKeysAdapter;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
|
|
||||||
public class ViewKeyKeysFragment extends LoaderFragment implements
|
public class ViewKeyKeysFragment extends LoaderFragment implements
|
||||||
LoaderManager.LoaderCallbacks<Cursor> {
|
LoaderManager.LoaderCallbacks<Cursor> {
|
||||||
|
@ -169,18 +169,10 @@ public class ViewKeyMainFragment extends LoaderFragment implements
|
|||||||
case LOADER_ID_UNIFIED: {
|
case LOADER_ID_UNIFIED: {
|
||||||
if (data.moveToFirst()) {
|
if (data.moveToFirst()) {
|
||||||
if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
|
if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
|
||||||
// certify button
|
|
||||||
mActionCertify.setVisibility(View.GONE);
|
|
||||||
mActionCertifyDivider.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
// edit button
|
// edit button
|
||||||
mActionEdit.setVisibility(View.VISIBLE);
|
mActionEdit.setVisibility(View.VISIBLE);
|
||||||
mActionEditDivider.setVisibility(View.VISIBLE);
|
mActionEditDivider.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
// certify button
|
|
||||||
mActionCertify.setVisibility(View.VISIBLE);
|
|
||||||
mActionCertifyDivider.setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
// edit button
|
// edit button
|
||||||
mActionEdit.setVisibility(View.GONE);
|
mActionEdit.setVisibility(View.GONE);
|
||||||
mActionEditDivider.setVisibility(View.GONE);
|
mActionEditDivider.setVisibility(View.GONE);
|
||||||
|
@ -24,7 +24,6 @@ import android.net.Uri;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.app.LoaderManager;
|
import android.support.v4.app.LoaderManager;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.content.Loader;
|
import android.support.v4.content.Loader;
|
||||||
@ -32,7 +31,6 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.devspark.appmsg.AppMsg;
|
import com.devspark.appmsg.AppMsg;
|
||||||
|
@ -32,8 +32,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
|
||||||
import org.sufficientlysecure.keychain.util.Highlighter;
|
import org.sufficientlysecure.keychain.util.Highlighter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -120,13 +119,13 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// main user id
|
// main user id
|
||||||
String userId = entry.userIds.get(0);
|
String userId = entry.getUserIds().get(0);
|
||||||
String[] userIdSplit = PgpKeyHelper.splitUserId(userId);
|
String[] userIdSplit = KeyRing.splitUserId(userId);
|
||||||
|
|
||||||
// name
|
// name
|
||||||
if (userIdSplit[0] != null) {
|
if (userIdSplit[0] != null) {
|
||||||
// show red user id if it is a secret key
|
// show red user id if it is a secret key
|
||||||
if (entry.secretKey) {
|
if (entry.isSecretKey()) {
|
||||||
holder.mainUserId.setText(mActivity.getString(R.string.secret_key)
|
holder.mainUserId.setText(mActivity.getString(R.string.secret_key)
|
||||||
+ " " + userIdSplit[0]);
|
+ " " + userIdSplit[0]);
|
||||||
holder.mainUserId.setTextColor(Color.RED);
|
holder.mainUserId.setTextColor(Color.RED);
|
||||||
@ -147,30 +146,26 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
|
|||||||
holder.mainUserIdRest.setVisibility(View.GONE);
|
holder.mainUserIdRest.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
holder.keyId.setText(entry.keyIdHex);
|
holder.keyId.setText(entry.getKeyIdHex());
|
||||||
|
|
||||||
if (entry.fingerprintHex != null) {
|
// don't show full fingerprint on key import
|
||||||
holder.fingerprint.setVisibility(View.VISIBLE);
|
|
||||||
holder.fingerprint.setText(PgpKeyHelper.colorizeFingerprint(entry.fingerprintHex));
|
|
||||||
} else {
|
|
||||||
holder.fingerprint.setVisibility(View.GONE);
|
holder.fingerprint.setVisibility(View.GONE);
|
||||||
}
|
|
||||||
|
|
||||||
if (entry.bitStrength != 0 && entry.algorithm != null) {
|
if (entry.getBitStrength() != 0 && entry.getAlgorithm() != null) {
|
||||||
holder.algorithm.setText("" + entry.bitStrength + "/" + entry.algorithm);
|
holder.algorithm.setText("" + entry.getBitStrength() + "/" + entry.getAlgorithm());
|
||||||
holder.algorithm.setVisibility(View.VISIBLE);
|
holder.algorithm.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
holder.algorithm.setVisibility(View.INVISIBLE);
|
holder.algorithm.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry.revoked) {
|
if (entry.isRevoked()) {
|
||||||
holder.status.setVisibility(View.VISIBLE);
|
holder.status.setVisibility(View.VISIBLE);
|
||||||
holder.status.setText(R.string.revoked);
|
holder.status.setText(R.string.revoked);
|
||||||
} else {
|
} else {
|
||||||
holder.status.setVisibility(View.GONE);
|
holder.status.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry.userIds.size() == 1) {
|
if (entry.getUserIds().size() == 1) {
|
||||||
holder.userIdsList.setVisibility(View.GONE);
|
holder.userIdsList.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
holder.userIdsList.setVisibility(View.VISIBLE);
|
holder.userIdsList.setVisibility(View.VISIBLE);
|
||||||
@ -178,7 +173,7 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
|
|||||||
// clear view from holder
|
// clear view from holder
|
||||||
holder.userIdsList.removeAllViews();
|
holder.userIdsList.removeAllViews();
|
||||||
|
|
||||||
Iterator<String> it = entry.userIds.iterator();
|
Iterator<String> it = entry.getUserIds().iterator();
|
||||||
// skip primary user id
|
// skip primary user id
|
||||||
it.next();
|
it.next();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
|
@ -22,8 +22,8 @@ import android.support.v4.content.AsyncTaskLoader;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
|
||||||
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
|
||||||
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
|
import org.sufficientlysecure.keychain.keyimport.KeybaseKeyserver;
|
||||||
|
import org.sufficientlysecure.keychain.keyimport.Keyserver;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -28,6 +28,7 @@ import android.widget.ListView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
import org.sufficientlysecure.keychain.util.Highlighter;
|
import org.sufficientlysecure.keychain.util.Highlighter;
|
||||||
@ -112,7 +113,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
|
|||||||
ViewHolderItem h = (ViewHolderItem) view.getTag();
|
ViewHolderItem h = (ViewHolderItem) view.getTag();
|
||||||
|
|
||||||
String userId = cursor.getString(mIndexUserId);
|
String userId = cursor.getString(mIndexUserId);
|
||||||
String[] userIdSplit = PgpKeyHelper.splitUserId(userId);
|
String[] userIdSplit = KeyRing.splitUserId(userId);
|
||||||
|
|
||||||
if (userIdSplit[0] != null) {
|
if (userIdSplit[0] != null) {
|
||||||
h.mainUserId.setText(highlighter.highlight(userIdSplit[0]));
|
h.mainUserId.setText(highlighter.highlight(userIdSplit[0]));
|
||||||
|
@ -27,12 +27,11 @@ import android.widget.AdapterView;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.OtherHelper;
|
import org.sufficientlysecure.keychain.helper.OtherHelper;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
|
||||||
|
|
||||||
@ -112,7 +111,7 @@ public class ViewKeyUserIdsAdapter extends CursorAdapter implements AdapterView.
|
|||||||
TextView vComment = (TextView) view.findViewById(R.id.comment);
|
TextView vComment = (TextView) view.findViewById(R.id.comment);
|
||||||
ImageView vVerified = (ImageView) view.findViewById(R.id.certified);
|
ImageView vVerified = (ImageView) view.findViewById(R.id.certified);
|
||||||
|
|
||||||
String[] userId = PgpKeyHelper.splitUserId(cursor.getString(mIndexUserId));
|
String[] userId = KeyRing.splitUserId(cursor.getString(mIndexUserId));
|
||||||
if (userId[0] != null) {
|
if (userId[0] != null) {
|
||||||
vName.setText(userId[0]);
|
vName.setText(userId[0]);
|
||||||
} else {
|
} else {
|
||||||
|
@ -199,7 +199,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor
|
|||||||
|
|
||||||
WrappedSecretKey unlockedSecretKey = null;
|
WrappedSecretKey unlockedSecretKey = null;
|
||||||
|
|
||||||
for(WrappedSecretKey clickSecretKey : secretRing.iterator()) {
|
for(WrappedSecretKey clickSecretKey : secretRing.secretKeyIterator()) {
|
||||||
try {
|
try {
|
||||||
boolean unlocked = clickSecretKey.unlock(passphrase);
|
boolean unlocked = clickSecretKey.unlock(passphrase);
|
||||||
if (unlocked) {
|
if (unlocked) {
|
||||||
|
@ -36,7 +36,7 @@ import com.beardedhen.androidbootstrap.BootstrapButton;
|
|||||||
|
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.ContactHelper;
|
import org.sufficientlysecure.keychain.helper.ContactHelper;
|
||||||
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
|
import org.sufficientlysecure.keychain.pgp.KeyRing;
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ public class UserIdEditor extends LinearLayout implements Editor, OnClickListene
|
|||||||
mIsNewId = isNewId;
|
mIsNewId = isNewId;
|
||||||
mOriginalID = userId;
|
mOriginalID = userId;
|
||||||
|
|
||||||
String[] result = PgpKeyHelper.splitUserId(userId);
|
String[] result = KeyRing.splitUserId(userId);
|
||||||
if (result[0] != null) {
|
if (result[0] != null) {
|
||||||
mName.setText(result[0]);
|
mName.setText(result[0]);
|
||||||
mOriginalName = result[0];
|
mOriginalName = result[0];
|
||||||
|
Loading…
Reference in New Issue
Block a user