diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java index 78345a12f..a64bedb6b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java @@ -217,10 +217,25 @@ public class CachedPublicKeyRing extends KeyRing { } } - public boolean hasAuthentication() throws PgpKeyNotFoundException { + public boolean hasSecretAuthentication() throws PgpKeyNotFoundException { return getSecretAuthenticationId() != 0; } + public long getAuthenticationId() throws PgpKeyNotFoundException { + try { + Object data = mKeyRepository.getGenericData(mUri, + KeyRings.HAS_AUTHENTICATE, + KeyRepository.FIELD_TYPE_INTEGER); + return (Long) data; + } catch(KeyWritableRepository.NotFoundException e) { + throw new PgpKeyNotFoundException(e); + } + } + + public boolean hasAuthentication() throws PgpKeyNotFoundException { + return getAuthenticationId() != 0; + } + @Override public int getVerified() throws PgpKeyNotFoundException { try { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java index caa491a86..01ae4b5dd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java @@ -154,6 +154,7 @@ public class KeychainContract { public static final String HAS_ENCRYPT = "has_encrypt"; public static final String HAS_SIGN_SECRET = "has_sign_secret"; public static final String HAS_CERTIFY_SECRET = "has_certify_secret"; + public static final String HAS_AUTHENTICATE = "has_authenticate"; public static final String HAS_AUTHENTICATE_SECRET = "has_authenticate_secret"; public static final String HAS_DUPLICATE_USER_ID = "has_duplicate_user_id"; public static final String API_KNOWN_TO_PACKAGE_NAMES = "known_to_apps"; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java index 605bdcbe9..b5747b1a1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -353,6 +353,8 @@ public class KeychainProvider extends ContentProvider { "kE." + Keys.KEY_ID + " AS " + KeyRings.HAS_ENCRYPT); projectionMap.put(KeyRings.HAS_SIGN_SECRET, "kS." + Keys.KEY_ID + " AS " + KeyRings.HAS_SIGN_SECRET); + projectionMap.put(KeyRings.HAS_AUTHENTICATE, + "kA." + Keys.KEY_ID + " AS " + KeyRings.HAS_AUTHENTICATE); projectionMap.put(KeyRings.HAS_AUTHENTICATE_SECRET, "kA." + Keys.KEY_ID + " AS " + KeyRings.HAS_AUTHENTICATE_SECRET); projectionMap.put(KeyRings.HAS_CERTIFY_SECRET, @@ -409,6 +411,16 @@ public class KeychainProvider extends ContentProvider { + " AND ( kS." + Keys.EXPIRY + " IS NULL OR kS." + Keys.EXPIRY + " >= " + new Date().getTime() / 1000 + " )" + ")" : "") + + (plist.contains(KeyRings.HAS_AUTHENTICATE) ? + " LEFT JOIN " + Tables.KEYS + " AS kA ON (" + +"kA." + Keys.MASTER_KEY_ID + + " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID + + " AND kA." + Keys.IS_REVOKED + " = 0" + + " AND kA." + Keys.IS_SECURE + " = 1" + + " AND kA." + Keys.CAN_AUTHENTICATE + " = 1" + + " AND ( kA." + Keys.EXPIRY + " IS NULL OR kA." + Keys.EXPIRY + + " >= " + new Date().getTime() / 1000 + " )" + + ")" : "") + (plist.contains(KeyRings.HAS_AUTHENTICATE_SECRET) ? " LEFT JOIN " + Tables.KEYS + " AS kA ON (" +"kA." + Keys.MASTER_KEY_ID