certs: more fixes, almost working now

This commit is contained in:
Vincent Breitmoser 2014-04-05 21:38:03 +02:00
parent aa6f5118f5
commit 2802718efb
5 changed files with 52 additions and 38 deletions

View File

@ -369,19 +369,29 @@ public class KeychainProvider extends ContentProvider {
case KEY_RING_USER_IDS: {
HashMap<String, String> projectionMap = new HashMap<String, String>();
projectionMap.put(UserIds._ID, Tables.USER_IDS + ".oid AS _id");
projectionMap.put(UserIds.MASTER_KEY_ID, UserIds.MASTER_KEY_ID);
projectionMap.put(UserIds.USER_ID, UserIds.USER_ID);
projectionMap.put(UserIds.RANK, UserIds.RANK);
projectionMap.put(UserIds.IS_PRIMARY, UserIds.IS_PRIMARY);
projectionMap.put(UserIds.VERIFIED, "0 AS " + UserIds.VERIFIED);
projectionMap.put(UserIds.MASTER_KEY_ID, Tables.USER_IDS + "." + UserIds.MASTER_KEY_ID);
projectionMap.put(UserIds.USER_ID, Tables.USER_IDS + "." + UserIds.USER_ID);
projectionMap.put(UserIds.RANK, Tables.USER_IDS + "." + UserIds.RANK);
projectionMap.put(UserIds.IS_PRIMARY, Tables.USER_IDS + "." + UserIds.IS_PRIMARY);
// we take the minimum (>0) here, where "1" is "verified by known secret key"
projectionMap.put(UserIds.VERIFIED, "MIN(" + Certs.VERIFIED + ") AS " + UserIds.VERIFIED);
qb.setProjectionMap(projectionMap);
qb.setTables(Tables.USER_IDS);
qb.appendWhere(UserIds.MASTER_KEY_ID + " = ");
qb.setTables(Tables.USER_IDS
+ " LEFT JOIN " + Tables.CERTS + " ON ("
+ Tables.USER_IDS + "." + UserIds.MASTER_KEY_ID + " = "
+ Tables.CERTS + "." + Certs.MASTER_KEY_ID
+ " AND " + Tables.USER_IDS + "." + UserIds.RANK + " = "
+ Tables.CERTS + "." + Certs.RANK
+ " AND " + Tables.CERTS + "." + Certs.VERIFIED + " > 0"
+ ")");
groupBy = Tables.USER_IDS + "." + UserIds.RANK;
qb.appendWhere(Tables.USER_IDS + "." + UserIds.MASTER_KEY_ID + " = ");
qb.appendWhereEscapeString(uri.getPathSegments().get(1));
if (TextUtils.isEmpty(sortOrder)) {
sortOrder = UserIds.RANK + " ASC";
sortOrder = Tables.USER_IDS + "." + UserIds.RANK + " ASC";
}
break;
@ -433,9 +443,7 @@ public class KeychainProvider extends ContentProvider {
projectionMap.put(Certs.KEY_ID_CERTIFIER, Tables.CERTS + "." + Certs.KEY_ID_CERTIFIER);
projectionMap.put(Certs.VERIFIED, Tables.CERTS + "." + Certs.VERIFIED);
projectionMap.put(Certs.KEY_DATA, Tables.CERTS + "." + Certs.KEY_DATA);
// verified key data
projectionMap.put(Certs.USER_ID, Tables.USER_IDS + "." + UserIds.USER_ID);
// verifying key data
projectionMap.put(Certs.SIGNER_UID, "signer." + UserIds.USER_ID + " AS " + Certs.SIGNER_UID);
qb.setProjectionMap(projectionMap);
@ -447,7 +455,7 @@ public class KeychainProvider extends ContentProvider {
+ Tables.CERTS + "." + Certs.RANK + " = "
+ Tables.USER_IDS + "." + UserIds.RANK
+ ") LEFT JOIN " + Tables.USER_IDS + " AS signer ON ("
+ Tables.CERTS + "." + Keys.MASTER_KEY_ID + " = "
+ Tables.CERTS + "." + Certs.KEY_ID_CERTIFIER + " = "
+ "signer." + UserIds.MASTER_KEY_ID
+ " AND "
+ "signer." + Keys.RANK + " = 0"
@ -553,7 +561,9 @@ public class KeychainProvider extends ContentProvider {
break;
case KEY_RING_CERTS:
db.insertOrThrow(Tables.CERTS, null, values);
// we replace here, keeping only the latest signature
// TODO this would be better handled in saveKeyRing directly!
db.replaceOrThrow(Tables.CERTS, null, values);
keyId = values.getAsLong(Certs.MASTER_KEY_ID);
break;

View File

@ -223,6 +223,9 @@ public class ProviderHelper {
// get a list of owned secret keys, for verification filtering
Map<Long, PGPKeyRing> allKeyRings = getPGPKeyRings(context, KeyRingData.buildSecretKeyRingUri());
// special case: available secret keys verify themselves!
if(secretRing != null)
allKeyRings.put(secretRing.getSecretKey().getKeyID(), secretRing);
int userIdRank = 0;
for (String userId : new IterableIterator<String>(masterKey.getUserIDs())) {

View File

@ -38,8 +38,8 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables;
import org.sufficientlysecure.keychain.util.Log;
import se.emilsjolander.stickylistheaders.ApiLevelTooLowException;
@ -52,20 +52,20 @@ public class ViewKeyCertsFragment extends Fragment
// These are the rows that we will retrieve.
static final String[] PROJECTION = new String[] {
KeychainContract.Certs._ID,
KeychainContract.Certs.MASTER_KEY_ID,
KeychainContract.Certs.VERIFIED,
KeychainContract.Certs.RANK,
KeychainContract.Certs.KEY_ID_CERTIFIER,
KeychainContract.Certs.USER_ID,
KeychainContract.Certs.SIGNER_UID
Certs._ID,
Certs.MASTER_KEY_ID,
Certs.VERIFIED,
Certs.RANK,
Certs.KEY_ID_CERTIFIER,
Certs.USER_ID,
Certs.SIGNER_UID
};
// sort by our user id,
static final String SORT_ORDER =
KeychainDatabase.Tables.USER_IDS + "." + KeychainContract.UserIds.RANK + " ASC, "
+ KeychainDatabase.Tables.CERTS + "." + KeychainContract.Certs.VERIFIED + " DESC, "
+ KeychainContract.Certs.SIGNER_UID + " ASC";
Tables.CERTS + "." + Certs.RANK + " ASC, "
+ Certs.VERIFIED + " DESC, "
+ Certs.SIGNER_UID + " ASC";
public static final String ARG_DATA_URI = "data_uri";
@ -133,7 +133,7 @@ public class ViewKeyCertsFragment extends Fragment
}
Uri uri = getArguments().getParcelable(ARG_DATA_URI);
mBaseUri = KeychainContract.Certs.buildCertsUri(uri);
mBaseUri = Certs.buildCertsUri(uri);
mStickyList.setAreHeadersSticky(true);
mStickyList.setDrawingListUnderStickyHeader(false);
@ -185,7 +185,7 @@ public class ViewKeyCertsFragment extends Fragment
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent viewIntent = null;
viewIntent = new Intent(getActivity(), ViewCertActivity.class);
viewIntent.setData(KeychainContract.Certs.buildCertsUri(Long.toString(id)));
viewIntent.setData(Certs.buildCertsUri(Long.toString(id)));
startActivity(viewIntent);
}
@ -230,12 +230,12 @@ public class ViewKeyCertsFragment extends Fragment
private void initIndex(Cursor cursor) {
if (cursor != null) {
mIndexCertId = cursor.getColumnIndexOrThrow(KeychainContract.Certs.MASTER_KEY_ID);
mIndexUserId = cursor.getColumnIndexOrThrow(KeychainContract.UserIds.USER_ID);
mIndexRank = cursor.getColumnIndexOrThrow(KeychainContract.UserIds.RANK);
mIndexVerified = cursor.getColumnIndexOrThrow(KeychainContract.Certs.VERIFIED);
mIndexSignerKeyId = cursor.getColumnIndexOrThrow(KeychainContract.Certs.KEY_ID_CERTIFIER);
mIndexSignerUserId = cursor.getColumnIndexOrThrow(KeychainContract.Certs.SIGNER_UID);
mIndexCertId = cursor.getColumnIndexOrThrow(Certs.MASTER_KEY_ID);
mIndexUserId = cursor.getColumnIndexOrThrow(Certs.USER_ID);
mIndexRank = cursor.getColumnIndexOrThrow(Certs.RANK);
mIndexVerified = cursor.getColumnIndexOrThrow(Certs.VERIFIED);
mIndexSignerKeyId = cursor.getColumnIndexOrThrow(Certs.KEY_ID_CERTIFIER);
mIndexSignerUserId = cursor.getColumnIndexOrThrow(Certs.SIGNER_UID);
}
}

View File

@ -39,7 +39,6 @@ import com.beardedhen.androidbootstrap.BootstrapButton;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
@ -176,7 +175,7 @@ public class ViewKeyMainFragment extends Fragment implements
static final int INDEX_UNIFIED_EXPIRY = 8;
static final String[] USER_IDS_PROJECTION = new String[] {
UserIds._ID, UserIds.USER_ID, UserIds.RANK,
UserIds._ID, UserIds.USER_ID, UserIds.RANK, UserIds.VERIFIED
};
static final String[] KEYS_PROJECTION = new String[] {

View File

@ -84,7 +84,7 @@ public class ViewKeyUserIdsAdapter extends CursorAdapter {
if (cursor != null) {
mIndexUserId = cursor.getColumnIndexOrThrow(UserIds.USER_ID);
mIndexRank = cursor.getColumnIndexOrThrow(UserIds.RANK);
// mVerifiedId = cursor.getColumnIndexOrThrow(UserIds.VERIFIED);
mVerifiedId = cursor.getColumnIndexOrThrow(UserIds.VERIFIED);
}
}
@ -106,10 +106,12 @@ public class ViewKeyUserIdsAdapter extends CursorAdapter {
}
vAddress.setText(userId[1]);
int verified = 1; // cursor.getInt(mVerifiedId);
// TODO introduce own resource for this :)
if(verified > 0)
int verified = cursor.getInt(mVerifiedId);
// TODO introduce own resources for this :)
if(verified == 1)
vVerified.setImageResource(android.R.drawable.presence_online);
else if(verified > 1)
vVerified.setImageResource(android.R.drawable.presence_away);
else
vVerified.setImageResource(android.R.drawable.presence_invisible);