more Dao work
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user