From 24ef87535f922354e4f468496c1577d0329b23f8 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 29 Dec 2015 00:17:13 +0100 Subject: keylist: filter results by all user ids for search (fixes #1645) --- .../keychain/provider/KeychainContract.java | 6 ++++++ .../keychain/provider/KeychainProvider.java | 21 ++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider') 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 ee28b5f36..177f07344 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainContract.java @@ -109,6 +109,7 @@ public class KeychainContract { public static final String PATH_FIND = "find"; public static final String PATH_BY_EMAIL = "email"; public static final String PATH_BY_SUBKEY = "subkey"; + public static final String PATH_BY_USER_ID = "user_id"; public static final String PATH_PUBLIC = "public"; public static final String PATH_SECRET = "secret"; @@ -174,6 +175,11 @@ public class KeychainContract { .appendPath(PATH_BY_EMAIL).appendPath(email).build(); } + public static Uri buildUnifiedKeyRingsFindByUserIdUri(String query) { + return CONTENT_URI.buildUpon().appendPath(PATH_FIND) + .appendPath(PATH_BY_USER_ID).appendPath(query).build(); + } + public static Uri buildUnifiedKeyRingsFindBySubkeyUri(long subkey) { return CONTENT_URI.buildUpon().appendPath(PATH_FIND) .appendPath(PATH_BY_SUBKEY).appendPath(Long.toString(subkey)).build(); 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 104343074..87b8a3b65 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -28,6 +28,7 @@ import android.database.sqlite.SQLiteConstraintException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; +import android.support.annotation.NonNull; import android.text.TextUtils; import org.sufficientlysecure.keychain.Constants; @@ -75,6 +76,7 @@ public class KeychainProvider extends ContentProvider { private static final int KEY_RINGS_FIND_BY_EMAIL = 400; private static final int KEY_RINGS_FIND_BY_SUBKEY = 401; + private static final int KEY_RINGS_FIND_BY_USER_ID = 402; private static final int UPDATED_KEYS = 500; private static final int UPDATED_KEYS_SPECIFIC = 501; @@ -126,6 +128,9 @@ public class KeychainProvider extends ContentProvider { matcher.addURI(authority, KeychainContract.BASE_KEY_RINGS + "/" + KeychainContract.PATH_FIND + "/" + KeychainContract.PATH_BY_SUBKEY + "/*", KEY_RINGS_FIND_BY_SUBKEY); + matcher.addURI(authority, KeychainContract.BASE_KEY_RINGS + "/" + + KeychainContract.PATH_FIND + "/" + KeychainContract.PATH_BY_USER_ID + "/*", + KEY_RINGS_FIND_BY_USER_ID); /** * list key_ring specifics @@ -226,7 +231,7 @@ public class KeychainProvider extends ContentProvider { * {@inheritDoc} */ @Override - public String getType(Uri uri) { + public String getType(@NonNull Uri uri) { final int match = mUriMatcher.match(uri); switch (match) { case KEY_RING_PUBLIC: @@ -270,7 +275,7 @@ public class KeychainProvider extends ContentProvider { * {@inheritDoc} */ @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.v(Constants.TAG, "query(uri=" + uri + ", proj=" + Arrays.toString(projection) + ")"); @@ -285,7 +290,8 @@ public class KeychainProvider extends ContentProvider { case KEY_RING_UNIFIED: case KEY_RINGS_UNIFIED: case KEY_RINGS_FIND_BY_EMAIL: - case KEY_RINGS_FIND_BY_SUBKEY: { + case KEY_RINGS_FIND_BY_SUBKEY: + case KEY_RINGS_FIND_BY_USER_ID: { HashMap projectionMap = new HashMap<>(); projectionMap.put(KeyRings._ID, Tables.KEYS + ".oid AS _id"); projectionMap.put(KeyRings.MASTER_KEY_ID, Tables.KEYS + "." + Keys.MASTER_KEY_ID); @@ -432,7 +438,8 @@ public class KeychainProvider extends ContentProvider { } break; } - case KEY_RINGS_FIND_BY_EMAIL: { + case KEY_RINGS_FIND_BY_EMAIL: + case KEY_RINGS_FIND_BY_USER_ID: { String chunks[] = uri.getLastPathSegment().split(" *, *"); boolean gotCondition = false; String emailWhere = ""; @@ -446,7 +453,11 @@ public class KeychainProvider extends ContentProvider { } emailWhere += "tmp." + UserPackets.USER_ID + " LIKE "; // match '*', so it has to be at the *end* of the user id - emailWhere += DatabaseUtils.sqlEscapeString("%<" + chunks[i] + ">"); + if (match == KEY_RINGS_FIND_BY_EMAIL) { + emailWhere += DatabaseUtils.sqlEscapeString("%<" + chunks[i] + ">"); + } else { + emailWhere += DatabaseUtils.sqlEscapeString("%" + chunks[i] + "%"); + } gotCondition = true; } if(gotCondition) { -- cgit v1.2.3