diff options
Diffstat (limited to 'OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java')
-rw-r--r-- | OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java | 108 |
1 files changed, 105 insertions, 3 deletions
diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java index 8b0efdbbd..f072e13be 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -29,6 +29,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; import org.sufficientlysecure.keychain.provider.KeychainContract.KeysColumns; import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds; import org.sufficientlysecure.keychain.provider.KeychainContract.UserIdsColumns; +import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables; import org.sufficientlysecure.keychain.util.Log; @@ -83,6 +84,13 @@ public class KeychainProvider extends ContentProvider { private static final int UNIFIED_KEY_RING = 401; + private static final int CERTS = 401; + private static final int CERTS_BY_KEY_ID = 402; + private static final int CERTS_BY_ROW_ID = 403; + private static final int CERTS_BY_KEY_ROW_ID = 404; + private static final int CERTS_BY_KEY_ROW_ID_ALL = 405; + private static final int CERTS_BY_CERTIFIER_ID = 406; + // private static final int DATA_STREAM = 401; protected UriMatcher mUriMatcher; @@ -239,6 +247,24 @@ public class KeychainProvider extends ContentProvider { + KeychainContract.PATH_UNIFIED, UNIFIED_KEY_RING); /** + * certifications + * <pre> + * + * key_rings/unified + * + */ + matcher.addURI(authority, KeychainContract.BASE_CERTS, CERTS); + matcher.addURI(authority, KeychainContract.BASE_CERTS + "/#", CERTS_BY_ROW_ID); + matcher.addURI(authority, KeychainContract.BASE_CERTS + "/" + + KeychainContract.PATH_BY_KEY_ROW_ID + "/#", CERTS_BY_KEY_ROW_ID); + matcher.addURI(authority, KeychainContract.BASE_CERTS + "/" + + KeychainContract.PATH_BY_KEY_ROW_ID + "/#/all", CERTS_BY_KEY_ROW_ID_ALL); + matcher.addURI(authority, KeychainContract.BASE_CERTS + "/" + + KeychainContract.PATH_BY_KEY_ID + "/#", CERTS_BY_KEY_ID); + matcher.addURI(authority, KeychainContract.BASE_CERTS + "/" + + KeychainContract.PATH_BY_CERTIFIER_ID + "/#", CERTS_BY_CERTIFIER_ID); + + /** * data stream * * <pre> @@ -465,6 +491,8 @@ public class KeychainProvider extends ContentProvider { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); SQLiteDatabase db = mApgDatabase.getReadableDatabase(); + String groupBy = null; + int match = mUriMatcher.match(uri); // screw that switch @@ -530,6 +558,7 @@ public class KeychainProvider extends ContentProvider { return c; } + boolean all = false; switch (match) { case PUBLIC_KEY_RING: case SECRET_KEY_RING: @@ -657,8 +686,25 @@ public class KeychainProvider extends ContentProvider { case PUBLIC_KEY_RING_USER_ID: case SECRET_KEY_RING_USER_ID: - qb.setTables(Tables.USER_IDS); - qb.appendWhere(UserIdsColumns.KEY_RING_ROW_ID + " = "); + qb.setTables(Tables.USER_IDS + + " LEFT JOIN " + Tables.CERTS + + " ON (" + + Tables.USER_IDS + "." + UserIds.KEY_RING_ROW_ID + " = " + + Tables.CERTS + "." + Certs.KEY_RING_ROW_ID + + " AND " + Tables.USER_IDS + "." + UserIds.RANK + " = " + + Tables.CERTS + "." + Certs.RANK + + ")"); + + groupBy = Tables.USER_IDS + "." + UserIds.RANK; + + HashMap<String, String> pmap = new HashMap<String, String>(); + pmap.put(UserIds._ID, Tables.USER_IDS + "." + UserIds._ID); + pmap.put(UserIds.USER_ID, Tables.USER_IDS + "." + UserIds.USER_ID); + pmap.put(UserIds.RANK, Tables.USER_IDS + "." + UserIds.RANK); + pmap.put("verified", "COUNT(" + Tables.CERTS + "." + Certs._ID + ") AS verified"); + qb.setProjectionMap(pmap); + + qb.appendWhere(Tables.USER_IDS + "." + UserIdsColumns.KEY_RING_ROW_ID + " = "); qb.appendWhereEscapeString(uri.getPathSegments().get(2)); break; @@ -674,6 +720,56 @@ public class KeychainProvider extends ContentProvider { break; + case CERTS_BY_ROW_ID: + case CERTS_BY_KEY_ROW_ID_ALL: + all = true; + case CERTS_BY_KEY_ROW_ID: + qb.setTables(Tables.CERTS + + " JOIN " + Tables.USER_IDS + " ON (" + + Tables.CERTS + "." + Certs.KEY_RING_ROW_ID + " = " + + Tables.USER_IDS + "." + UserIds.KEY_RING_ROW_ID + + " AND " + + Tables.CERTS + "." + Certs.RANK + " = " + + Tables.USER_IDS + "." + UserIds.RANK + // noooooooot sure about this~ database design + + ")" + (all ? " LEFT" : "") + + " JOIN " + Tables.KEYS + " ON (" + + Tables.CERTS + "." + Certs.KEY_ID_CERTIFIER + " = " + + Tables.KEYS + "." + Keys.KEY_ID + + ") LEFT JOIN " + Tables.USER_IDS + " AS signer ON (" + + Tables.KEYS + "." + Keys.KEY_RING_ROW_ID + " = " + + "signer." + UserIds.KEY_RING_ROW_ID + + " AND " + + Tables.KEYS + "." + Keys.RANK + " = " + + "signer." + UserIds.RANK + + ")"); + + // groupBy = Tables.USER_IDS + "." + UserIds.RANK; + + HashMap<String, String> pmap2 = new HashMap<String, String>(); + pmap2.put(Certs._ID, Tables.CERTS + "." + Certs._ID); + pmap2.put(Certs.KEY_ID, Tables.CERTS + "." + Certs.KEY_ID); + pmap2.put(Certs.RANK, Tables.CERTS + "." + Certs.RANK); + pmap2.put(Certs.CREATION, Tables.CERTS + "." + Certs.CREATION); + pmap2.put(Certs.KEY_ID_CERTIFIER, Tables.CERTS + "." + Certs.KEY_ID_CERTIFIER); + pmap2.put(Certs.KEY_DATA, Tables.CERTS + "." + Certs.KEY_DATA); + pmap2.put(Certs.VERIFIED, Tables.CERTS + "." + Certs.VERIFIED); + // verified key data + pmap2.put(UserIds.USER_ID, Tables.USER_IDS + "." + UserIds.USER_ID); + // verifying key data + pmap2.put("signer_uid", "signer." + UserIds.USER_ID + " AS signer_uid"); + qb.setProjectionMap(pmap2); + + if(match == CERTS_BY_ROW_ID) { + qb.appendWhere(Tables.CERTS + "." + Certs._ID + " = "); + qb.appendWhereEscapeString(uri.getPathSegments().get(1)); + } else { + qb.appendWhere(Tables.CERTS + "." + Certs.KEY_RING_ROW_ID + " = "); + qb.appendWhereEscapeString(uri.getPathSegments().get(2)); + } + + break; + case API_APPS: qb.setTables(Tables.API_APPS); @@ -705,7 +801,7 @@ public class KeychainProvider extends ContentProvider { orderBy = sortOrder; } - Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy); + Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, null, orderBy); // Tell the cursor what uri to watch, so it knows when its source data changes c.setNotificationUri(getContext().getContentResolver(), uri); @@ -784,6 +880,12 @@ public class KeychainProvider extends ContentProvider { rowUri = ApiApps.buildIdUri(Long.toString(rowId)); break; + case CERTS_BY_ROW_ID: + rowId = db.insertOrThrow(Tables.CERTS, null, values); + // kinda useless.. should this be buildCertsByKeyRowIdUri? + rowUri = Certs.buildCertsUri(Long.toString(rowId)); + + break; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } |