From 921431b05f7fd6b9b916442df6c66c929a4a8060 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 22 Jun 2018 11:42:39 +0200 Subject: [PATCH] more Dao work --- .../pgp/OpenPgpSignatureResultBuilder.java | 6 +-- .../keychain/provider/AbstractDao.java | 18 ++++++++ .../keychain/provider/KeyRepository.java | 32 ++++++-------- .../keychain/ui/EditKeyFragment.java | 1 - .../keychain/util/ContactHelper.java | 43 ++++++++----------- .../keychain/UserPackets.sq | 6 +++ 6 files changed, 56 insertions(+), 50 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java index f7034800b..fa6f97f8e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/OpenPgpSignatureResultBuilder.java @@ -127,11 +127,7 @@ public class OpenPgpSignatureResultBuilder { ArrayList allUserIds = signingRing.getUnorderedUserIds(); ArrayList confirmedUserIds; - try { - confirmedUserIds = mKeyRepository.getConfirmedUserIds(signingRing.getMasterKeyId()); - } catch (NotFoundException e) { - throw new IllegalStateException("Key didn't exist anymore for user id query!", e); - } + confirmedUserIds = mKeyRepository.getConfirmedUserIds(signingRing.getMasterKeyId()); setUserIds(allUserIds, confirmedUserIds); mSenderStatusResult = processSenderStatusResult(allUserIds, confirmedUserIds); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/AbstractDao.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/AbstractDao.java index 89e084989..9ad28f8d8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/AbstractDao.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/AbstractDao.java @@ -1,7 +1,12 @@ package org.sufficientlysecure.keychain.provider; +import java.util.ArrayList; +import java.util.List; + import android.arch.persistence.db.SupportSQLiteDatabase; +import android.arch.persistence.db.SupportSQLiteQuery; +import android.database.Cursor; class AbstractDao { @@ -24,4 +29,17 @@ class AbstractDao { DatabaseNotifyManager getDatabaseNotifyManager() { return databaseNotifyManager; } + + List mapAllRows(SupportSQLiteQuery query, Mapper mapper) { + ArrayList result = new ArrayList<>(); + try (Cursor cursor = getReadableDb().query(query)) { + T item = mapper.map(cursor); + result.add(item); + } + return result; + } + + interface Mapper { + T map(Cursor cursor); + } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java index c8ca026f4..6c278f2c3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeyRepository.java @@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import android.content.ContentResolver; import android.content.Context; @@ -31,6 +32,8 @@ import android.net.Uri; import com.squareup.sqldelight.SqlDelightQuery; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.sufficientlysecure.keychain.model.KeyRingPublic; +import org.sufficientlysecure.keychain.model.UserPacket; +import org.sufficientlysecure.keychain.model.UserPacket.UserId; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; @@ -39,7 +42,6 @@ import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; import timber.log.Timber; @@ -239,25 +241,19 @@ public class KeyRepository extends AbstractDao { } } - public ArrayList getConfirmedUserIds(long masterKeyId) throws NotFoundException { - Cursor cursor = contentResolver.query(UserPackets.buildUserIdsUri(masterKeyId), - new String[]{UserPackets.USER_ID}, UserPackets.VERIFIED + " = " + Certs.VERIFIED_SECRET, null, null - ); - if (cursor == null) { - throw new NotFoundException("Key id for requested user ids not found"); - } + public List getUserIds(long masterKeyId) { + SqlDelightQuery query = UserPacket.FACTORY.selectUserIdsByMasterKeyId(masterKeyId); + return mapAllRows(query, UserPacket.USER_ID_MAPPER::map); + } - try { - ArrayList userIds = new ArrayList<>(cursor.getCount()); - while (cursor.moveToNext()) { - String userId = cursor.getString(0); - userIds.add(userId); - } - - return userIds; - } finally { - cursor.close(); + public ArrayList getConfirmedUserIds(long masterKeyId) { + ArrayList userIds = new ArrayList<>(); + SqlDelightQuery query = + UserPacket.FACTORY.selectUserIdsByMasterKeyIdAndVerification(masterKeyId, Certs.VERIFIED_SECRET); + for (UserId userId : mapAllRows(query, UserPacket.USER_ID_MAPPER::map)) { + userIds.add(userId.user_id()); } + return userIds; } private byte[] getKeyRingAsArmoredData(byte[] data) throws IOException, PgpGeneralException { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index aec5fac3c..10c62dda3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -67,7 +67,6 @@ import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyExpiryDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; import org.sufficientlysecure.keychain.ui.util.Notify; -import org.sufficientlysecure.keychain.util.Passphrase; import timber.log.Timber; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 40bc57519..985880b75 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -42,20 +42,22 @@ import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.provider.ContactsContract; +import android.provider.ContactsContract.CommonDataKinds.Email; +import android.provider.ContactsContract.Data; import android.support.v4.content.ContextCompat; import android.util.Patterns; -import org.openintents.openpgp.util.OpenPgpUtils; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.pgp.KeyRing; +import org.sufficientlysecure.keychain.model.UserPacket.UserId; +import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeychainContract; -import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets; import timber.log.Timber; public class ContactHelper { private static final Map photoCache = new HashMap<>(); + private final KeyRepository keyRepository; private Context mContext; private ContentResolver mContentResolver; @@ -63,6 +65,7 @@ public class ContactHelper { public ContactHelper(Context context) { mContext = context; mContentResolver = context.getContentResolver(); + keyRepository = KeyRepository.create(context); } public List getPossibleUserEmails() { @@ -838,29 +841,17 @@ public class ContactHelper { */ private void writeContactEmail(ArrayList ops, long rawContactId, long masterKeyId) { - ops.add(selectByRawContactAndItemType( - ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI), - rawContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).build()); - Cursor ids = mContentResolver.query(UserPackets.buildUserIdsUri(masterKeyId), - new String[]{ - UserPackets.USER_ID - }, - UserPackets.IS_REVOKED + "=0", - null, null); - if (ids != null) { - while (ids.moveToNext()) { - OpenPgpUtils.UserId userId = KeyRing.splitUserId(ids.getString(0)); - if (userId.email != null) { - ops.add(referenceRawContact( - ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI), - rawContactId) - .withValue(ContactsContract.Data.MIMETYPE, - ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) - .withValue(ContactsContract.CommonDataKinds.Email.DATA, userId.email) - .build()); - } - } - ids.close(); + ContentProviderOperation deleteOp = selectByRawContactAndItemType( + ContentProviderOperation.newDelete(Data.CONTENT_URI), rawContactId, Email.CONTENT_ITEM_TYPE).build(); + ops.add(deleteOp); + + for (UserId userId : keyRepository.getUserIds(masterKeyId)) { + ContentProviderOperation insertOp = + referenceRawContact(ContentProviderOperation.newInsert(Data.CONTENT_URI), rawContactId) + .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) + .withValue(Email.DATA, userId.email()) + .build(); + ops.add(insertOp); } } diff --git a/OpenKeychain/src/main/sqldelight/org/sufficientlysecure/keychain/UserPackets.sq b/OpenKeychain/src/main/sqldelight/org/sufficientlysecure/keychain/UserPackets.sq index 062869b34..42bca407d 100644 --- a/OpenKeychain/src/main/sqldelight/org/sufficientlysecure/keychain/UserPackets.sq +++ b/OpenKeychain/src/main/sqldelight/org/sufficientlysecure/keychain/UserPackets.sq @@ -22,6 +22,12 @@ SELECT user_packets.master_key_id, user_packets.rank, user_id, name, email, comm LEFT JOIN certs ON ( user_packets.master_key_id = certs.master_key_id AND user_packets.rank = certs.rank AND certs.verified > 0 ) WHERE user_packets.type IS NULL AND user_packets.is_revoked = 0 AND user_packets.master_key_id = ?; +selectUserIdsByMasterKeyIdAndVerification: +SELECT user_packets.master_key_id, user_packets.rank, user_id, name, email, comment, is_primary, is_revoked, certs.verified + FROM user_packets + LEFT JOIN certs ON ( user_packets.master_key_id = certs.master_key_id AND user_packets.rank = certs.rank AND certs.verified > 0 ) + WHERE user_packets.type IS NULL AND user_packets.is_revoked = 0 AND user_packets.master_key_id = ? AND certs.verified = ?; + selectUserAttributesByTypeAndMasterKeyId: SELECT user_packets.master_key_id, user_packets.rank, attribute_data, is_primary, is_revoked, certs.verified FROM user_packets