more Dao work

This commit is contained in:
Vincent Breitmoser
2018-06-22 11:42:39 +02:00
parent 1556db897f
commit 921431b05f
6 changed files with 56 additions and 50 deletions

View File

@@ -127,11 +127,7 @@ public class OpenPgpSignatureResultBuilder {
ArrayList<String> allUserIds = signingRing.getUnorderedUserIds(); ArrayList<String> allUserIds = signingRing.getUnorderedUserIds();
ArrayList<String> confirmedUserIds; ArrayList<String> confirmedUserIds;
try { confirmedUserIds = mKeyRepository.getConfirmedUserIds(signingRing.getMasterKeyId());
confirmedUserIds = mKeyRepository.getConfirmedUserIds(signingRing.getMasterKeyId());
} catch (NotFoundException e) {
throw new IllegalStateException("Key didn't exist anymore for user id query!", e);
}
setUserIds(allUserIds, confirmedUserIds); setUserIds(allUserIds, confirmedUserIds);
mSenderStatusResult = processSenderStatusResult(allUserIds, confirmedUserIds); mSenderStatusResult = processSenderStatusResult(allUserIds, confirmedUserIds);

View File

@@ -1,7 +1,12 @@
package org.sufficientlysecure.keychain.provider; package org.sufficientlysecure.keychain.provider;
import java.util.ArrayList;
import java.util.List;
import android.arch.persistence.db.SupportSQLiteDatabase; import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.db.SupportSQLiteQuery;
import android.database.Cursor;
class AbstractDao { class AbstractDao {
@@ -24,4 +29,17 @@ class AbstractDao {
DatabaseNotifyManager getDatabaseNotifyManager() { DatabaseNotifyManager getDatabaseNotifyManager() {
return databaseNotifyManager; return databaseNotifyManager;
} }
<T> List<T> mapAllRows(SupportSQLiteQuery query, Mapper<T> mapper) {
ArrayList<T> result = new ArrayList<>();
try (Cursor cursor = getReadableDb().query(query)) {
T item = mapper.map(cursor);
result.add(item);
}
return result;
}
interface Mapper<T> {
T map(Cursor cursor);
}
} }

View File

@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
@@ -31,6 +32,8 @@ import android.net.Uri;
import com.squareup.sqldelight.SqlDelightQuery; import com.squareup.sqldelight.SqlDelightQuery;
import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.sufficientlysecure.keychain.model.KeyRingPublic; 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.LogType;
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; 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.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import timber.log.Timber; import timber.log.Timber;
@@ -239,25 +241,19 @@ public class KeyRepository extends AbstractDao {
} }
} }
public ArrayList<String> getConfirmedUserIds(long masterKeyId) throws NotFoundException { public List<UserId> getUserIds(long masterKeyId) {
Cursor cursor = contentResolver.query(UserPackets.buildUserIdsUri(masterKeyId), SqlDelightQuery query = UserPacket.FACTORY.selectUserIdsByMasterKeyId(masterKeyId);
new String[]{UserPackets.USER_ID}, UserPackets.VERIFIED + " = " + Certs.VERIFIED_SECRET, null, null return mapAllRows(query, UserPacket.USER_ID_MAPPER::map);
); }
if (cursor == null) {
throw new NotFoundException("Key id for requested user ids not found");
}
try { public ArrayList<String> getConfirmedUserIds(long masterKeyId) {
ArrayList<String> userIds = new ArrayList<>(cursor.getCount()); ArrayList<String> userIds = new ArrayList<>();
while (cursor.moveToNext()) { SqlDelightQuery query =
String userId = cursor.getString(0); UserPacket.FACTORY.selectUserIdsByMasterKeyIdAndVerification(masterKeyId, Certs.VERIFIED_SECRET);
userIds.add(userId); for (UserId userId : mapAllRows(query, UserPacket.USER_ID_MAPPER::map)) {
} userIds.add(userId.user_id());
return userIds;
} finally {
cursor.close();
} }
return userIds;
} }
private byte[] getKeyRingAsArmoredData(byte[] data) throws IOException, PgpGeneralException { private byte[] getKeyRingAsArmoredData(byte[] data) throws IOException, PgpGeneralException {

View File

@@ -67,7 +67,6 @@ import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyExpiryDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.EditUserIdDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Passphrase;
import timber.log.Timber; import timber.log.Timber;

View File

@@ -42,20 +42,22 @@ import android.graphics.BitmapFactory;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Data;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.util.Patterns; import android.util.Patterns;
import org.openintents.openpgp.util.OpenPgpUtils;
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.model.UserPacket.UserId;
import org.sufficientlysecure.keychain.provider.KeyRepository;
import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import timber.log.Timber; import timber.log.Timber;
public class ContactHelper { public class ContactHelper {
private static final Map<Long, Bitmap> photoCache = new HashMap<>(); private static final Map<Long, Bitmap> photoCache = new HashMap<>();
private final KeyRepository keyRepository;
private Context mContext; private Context mContext;
private ContentResolver mContentResolver; private ContentResolver mContentResolver;
@@ -63,6 +65,7 @@ public class ContactHelper {
public ContactHelper(Context context) { public ContactHelper(Context context) {
mContext = context; mContext = context;
mContentResolver = context.getContentResolver(); mContentResolver = context.getContentResolver();
keyRepository = KeyRepository.create(context);
} }
public List<String> getPossibleUserEmails() { public List<String> getPossibleUserEmails() {
@@ -838,29 +841,17 @@ public class ContactHelper {
*/ */
private void writeContactEmail(ArrayList<ContentProviderOperation> ops, private void writeContactEmail(ArrayList<ContentProviderOperation> ops,
long rawContactId, long masterKeyId) { long rawContactId, long masterKeyId) {
ops.add(selectByRawContactAndItemType( ContentProviderOperation deleteOp = selectByRawContactAndItemType(
ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI), ContentProviderOperation.newDelete(Data.CONTENT_URI), rawContactId, Email.CONTENT_ITEM_TYPE).build();
rawContactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).build()); ops.add(deleteOp);
Cursor ids = mContentResolver.query(UserPackets.buildUserIdsUri(masterKeyId),
new String[]{ for (UserId userId : keyRepository.getUserIds(masterKeyId)) {
UserPackets.USER_ID ContentProviderOperation insertOp =
}, referenceRawContact(ContentProviderOperation.newInsert(Data.CONTENT_URI), rawContactId)
UserPackets.IS_REVOKED + "=0", .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
null, null); .withValue(Email.DATA, userId.email())
if (ids != null) { .build();
while (ids.moveToNext()) { ops.add(insertOp);
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();
} }
} }

View File

@@ -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 ) 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 = ?; 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: selectUserAttributesByTypeAndMasterKeyId:
SELECT user_packets.master_key_id, user_packets.rank, attribute_data, is_primary, is_revoked, certs.verified SELECT user_packets.master_key_id, user_packets.rank, attribute_data, is_primary, is_revoked, certs.verified
FROM user_packets FROM user_packets