aboutsummaryrefslogtreecommitdiffstats
path: root/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java
diff options
context:
space:
mode:
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.java108
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);
}