diff options
Diffstat (limited to 'OpenKeychain/src/main/java')
2 files changed, 58 insertions, 12 deletions
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 7eb78a3d6..aa0207a6a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/CachedPublicKeyRing.java @@ -1,5 +1,6 @@  package org.sufficientlysecure.keychain.provider; +import android.database.Cursor;  import android.net.Uri;  import org.sufficientlysecure.keychain.Constants; @@ -33,6 +34,7 @@ public class CachedPublicKeyRing extends KeyRing {          mUri = uri;      } +    @Override      public long getMasterKeyId() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, @@ -59,6 +61,17 @@ public class CachedPublicKeyRing extends KeyRing {          return getMasterKeyId();      } +    public byte[] getFingerprint() throws PgpGeneralException { +        try { +            Object data = mProviderHelper.getGenericData(mUri, +                    KeychainContract.KeyRings.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB); +            return (byte[]) data; +        } catch (ProviderHelper.NotFoundException e) { +            throw new PgpGeneralException(e); +        } +    } + +    @Override      public String getPrimaryUserId() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, @@ -74,6 +87,7 @@ public class CachedPublicKeyRing extends KeyRing {          return getPrimaryUserId();      } +    @Override      public boolean isRevoked() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, @@ -85,6 +99,7 @@ public class CachedPublicKeyRing extends KeyRing {          }      } +    @Override      public boolean canCertify() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, @@ -96,21 +111,32 @@ public class CachedPublicKeyRing extends KeyRing {          }      } +    @Override      public long getEncryptId() throws PgpGeneralException {          try { -            Object data = mProviderHelper.getGenericData(mUri, -                    KeychainContract.KeyRings.MASTER_KEY_ID, // TODO -                    ProviderHelper.FIELD_TYPE_INTEGER); -            return (Long) data; -        } catch(ProviderHelper.NotFoundException e) { +            Cursor subkeys = getSubkeys(); +            if (subkeys != null) { +                try { +                    while (subkeys.moveToNext()) { +                        if (subkeys.getInt(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.CAN_ENCRYPT)) != 0) { +                            return subkeys.getLong(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.KEY_ID)); +                        } +                    } +                } finally { +                    subkeys.close(); +                } +            } +        } catch(Exception e) {              throw new PgpGeneralException(e);          } +        throw new PgpGeneralException("No encrypt key found");      } +    @Override      public boolean hasEncrypt() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, -                    KeychainContract.KeyRings.CAN_ENCRYPT, // TODO +                    KeychainContract.KeyRings.HAS_ENCRYPT,                      ProviderHelper.FIELD_TYPE_INTEGER);              return (Long) data > 0;          } catch(ProviderHelper.NotFoundException e) { @@ -118,21 +144,32 @@ public class CachedPublicKeyRing extends KeyRing {          }      } +    @Override      public long getSignId() throws PgpGeneralException {          try { -            Object data = mProviderHelper.getGenericData(mUri, -                    KeychainContract.KeyRings.MASTER_KEY_ID, // TODO -                    ProviderHelper.FIELD_TYPE_INTEGER); -            return (Long) data; -        } catch(ProviderHelper.NotFoundException e) { +            Cursor subkeys = getSubkeys(); +            if (subkeys != null) { +                try { +                    while (subkeys.moveToNext()) { +                        if (subkeys.getInt(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.CAN_SIGN)) != 0) { +                            return subkeys.getLong(subkeys.getColumnIndexOrThrow(KeychainContract.Keys.KEY_ID)); +                        } +                    } +                } finally { +                    subkeys.close(); +                } +            } +        } catch(Exception e) {              throw new PgpGeneralException(e);          } +        throw new PgpGeneralException("No sign key found");      } +    @Override      public boolean hasSign() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, -                    KeychainContract.KeyRings.CAN_SIGN, // TODO +                    KeychainContract.KeyRings.HAS_SIGN,                      ProviderHelper.FIELD_TYPE_INTEGER);              return (Long) data > 0;          } catch(ProviderHelper.NotFoundException e) { @@ -140,6 +177,7 @@ public class CachedPublicKeyRing extends KeyRing {          }      } +    @Override      public int getVerified() throws PgpGeneralException {          try {              Object data = mProviderHelper.getGenericData(mUri, @@ -160,6 +198,10 @@ public class CachedPublicKeyRing extends KeyRing {          } catch(ProviderHelper.NotFoundException e) {              throw new PgpGeneralException(e);          } +    } +    private Cursor getSubkeys() throws PgpGeneralException { +        Uri keysUri = KeychainContract.Keys.buildKeysUri(Long.toString(extractOrGetMasterKeyId())); +        return mProviderHelper.getContentResolver().query(keysUri, null, null, null, null);      }  } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java index 9b35903f6..aa85577e0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java @@ -1024,4 +1024,8 @@ public class ProviderHelper {              }          }      } + +    public ContentResolver getContentResolver() { +        return mContentResolver; +    }  }  | 
