stripped support: add has_secret column to keys table

This commit is contained in:
Vincent Breitmoser
2014-04-16 17:29:31 +02:00
parent cd8458f34d
commit 66b8b86695
8 changed files with 29 additions and 18 deletions

View File

@@ -42,6 +42,7 @@ public class KeychainContract {
String CAN_ENCRYPT = "can_encrypt"; String CAN_ENCRYPT = "can_encrypt";
String CAN_CERTIFY = "can_certify"; String CAN_CERTIFY = "can_certify";
String IS_REVOKED = "is_revoked"; String IS_REVOKED = "is_revoked";
String HAS_SECRET = "has_secret";
String CREATION = "creation"; String CREATION = "creation";
String EXPIRY = "expiry"; String EXPIRY = "expiry";
@@ -106,7 +107,7 @@ public class KeychainContract {
public static final String MASTER_KEY_ID = KeysColumns.MASTER_KEY_ID; public static final String MASTER_KEY_ID = KeysColumns.MASTER_KEY_ID;
public static final String IS_REVOKED = KeysColumns.IS_REVOKED; public static final String IS_REVOKED = KeysColumns.IS_REVOKED;
public static final String VERIFIED = CertsColumns.VERIFIED; public static final String VERIFIED = CertsColumns.VERIFIED;
public static final String HAS_SECRET = "has_secret"; public static final String HAS_ANY_SECRET = "has_any_secret";
public static final String HAS_ENCRYPT = "has_encrypt"; public static final String HAS_ENCRYPT = "has_encrypt";
public static final String HAS_SIGN = "has_encrypt"; public static final String HAS_SIGN = "has_encrypt";

View File

@@ -84,6 +84,7 @@ public class KeychainDatabase extends SQLiteOpenHelper {
+ KeysColumns.CAN_SIGN + " BOOLEAN, " + KeysColumns.CAN_SIGN + " BOOLEAN, "
+ KeysColumns.CAN_ENCRYPT + " BOOLEAN, " + KeysColumns.CAN_ENCRYPT + " BOOLEAN, "
+ KeysColumns.IS_REVOKED + " BOOLEAN, " + KeysColumns.IS_REVOKED + " BOOLEAN, "
+ KeysColumns.HAS_SECRET + " BOOLEAN, "
+ KeysColumns.CREATION + " INTEGER, " + KeysColumns.CREATION + " INTEGER, "
+ KeysColumns.EXPIRY + " INTEGER, " + KeysColumns.EXPIRY + " INTEGER, "
@@ -187,6 +188,11 @@ public class KeychainDatabase extends SQLiteOpenHelper {
if (!db.isReadOnly()) { if (!db.isReadOnly()) {
// Enable foreign key constraints // Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;"); db.execSQL("PRAGMA foreign_keys=ON;");
// TODO this is a dev hack, remove for release!
try {
db.execSQL("ALTER TABLE keys ADD COLUMN has_secret BOOLEAN");
} catch(Exception e) {
}
} }
} }

View File

@@ -254,16 +254,18 @@ public class KeychainProvider extends ContentProvider {
projectionMap.put(KeyRings.FINGERPRINT, Keys.FINGERPRINT); projectionMap.put(KeyRings.FINGERPRINT, Keys.FINGERPRINT);
projectionMap.put(KeyRings.USER_ID, UserIds.USER_ID); projectionMap.put(KeyRings.USER_ID, UserIds.USER_ID);
projectionMap.put(KeyRings.VERIFIED, KeyRings.VERIFIED); projectionMap.put(KeyRings.VERIFIED, KeyRings.VERIFIED);
projectionMap.put(KeyRings.HAS_SECRET, projectionMap.put(KeyRings.HAS_SECRET, KeyRings.HAS_SECRET);
projectionMap.put(KeyRings.HAS_ANY_SECRET,
"(EXISTS (SELECT * FROM " + Tables.KEY_RINGS_SECRET "(EXISTS (SELECT * FROM " + Tables.KEY_RINGS_SECRET
+ " WHERE " + Tables.KEY_RINGS_SECRET + "." + KeyRingData.MASTER_KEY_ID + " WHERE " + Tables.KEY_RINGS_SECRET + "." + KeyRingData.MASTER_KEY_ID
+ " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID + " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID
+ ")) AS " + KeyRings.HAS_SECRET); + ")) AS " + KeyRings.HAS_ANY_SECRET);
projectionMap.put(KeyRings.HAS_ENCRYPT, projectionMap.put(KeyRings.HAS_ENCRYPT,
"(EXISTS (SELECT COUNT(*) FROM " + Tables.KEYS + " AS k" "(EXISTS (SELECT COUNT(*) FROM " + Tables.KEYS + " AS k"
+" WHERE k." + Keys.MASTER_KEY_ID +" WHERE k." + Keys.MASTER_KEY_ID
+ " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID + " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID
+ " AND k." + Keys.IS_REVOKED + " = 0" + " AND k." + Keys.IS_REVOKED + " = 0"
+ " AND k." + Keys.HAS_SECRET + " = 1"
+ " AND k." + Keys.CAN_ENCRYPT + " = 1" + " AND k." + Keys.CAN_ENCRYPT + " = 1"
+ " AND ( k." + Keys.EXPIRY + " IS NULL OR k." + Keys.EXPIRY + " AND ( k." + Keys.EXPIRY + " IS NULL OR k." + Keys.EXPIRY
+ " >= '" + new Date().getTime() / 1000 + "' )" + " >= '" + new Date().getTime() / 1000 + "' )"
@@ -273,6 +275,7 @@ public class KeychainProvider extends ContentProvider {
+" WHERE k." + Keys.MASTER_KEY_ID +" WHERE k." + Keys.MASTER_KEY_ID
+ " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID + " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID
+ " AND k." + Keys.IS_REVOKED + " = 0" + " AND k." + Keys.IS_REVOKED + " = 0"
+ " AND k." + Keys.HAS_SECRET + " = 1"
+ " AND k." + Keys.CAN_SIGN + " = 1" + " AND k." + Keys.CAN_SIGN + " = 1"
+ " AND ( k." + Keys.EXPIRY + " IS NULL OR k." + Keys.EXPIRY + " AND ( k." + Keys.EXPIRY + " IS NULL OR k." + Keys.EXPIRY
+ " >= '" + new Date().getTime() / 1000 + "' )" + " >= '" + new Date().getTime() / 1000 + "' )"
@@ -373,6 +376,7 @@ public class KeychainProvider extends ContentProvider {
projectionMap.put(Keys.CAN_CERTIFY, Keys.CAN_CERTIFY); projectionMap.put(Keys.CAN_CERTIFY, Keys.CAN_CERTIFY);
projectionMap.put(Keys.CAN_ENCRYPT, Keys.CAN_ENCRYPT); projectionMap.put(Keys.CAN_ENCRYPT, Keys.CAN_ENCRYPT);
projectionMap.put(Keys.CAN_SIGN, Keys.CAN_SIGN); projectionMap.put(Keys.CAN_SIGN, Keys.CAN_SIGN);
projectionMap.put(Keys.HAS_SECRET, Keys.HAS_SECRET);
projectionMap.put(Keys.CREATION, Keys.CREATION); projectionMap.put(Keys.CREATION, Keys.CREATION);
projectionMap.put(Keys.EXPIRY, Keys.EXPIRY); projectionMap.put(Keys.EXPIRY, Keys.EXPIRY);
projectionMap.put(Keys.ALGORITHM, Keys.ALGORITHM); projectionMap.put(Keys.ALGORITHM, Keys.ALGORITHM);

View File

@@ -685,7 +685,7 @@ public class KeychainIntentService extends IntentService
} }
Cursor cursor = getContentResolver().query(KeyRings.buildUnifiedKeyRingsUri(), Cursor cursor = getContentResolver().query(KeyRings.buildUnifiedKeyRingsUri(),
new String[]{KeyRings.MASTER_KEY_ID, KeyRings.HAS_SECRET}, new String[]{KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET},
selection, null, null); selection, null, null);
try { try {
cursor.moveToFirst(); cursor.moveToFirst();

View File

@@ -256,7 +256,7 @@ public class KeyListFragment extends Fragment
KeyRings.IS_REVOKED, KeyRings.IS_REVOKED,
KeyRings.EXPIRY, KeyRings.EXPIRY,
KeyRings.VERIFIED, KeyRings.VERIFIED,
KeyRings.HAS_SECRET KeyRings.HAS_ANY_SECRET
}; };
static final int INDEX_MASTER_KEY_ID = 1; static final int INDEX_MASTER_KEY_ID = 1;
@@ -264,10 +264,10 @@ public class KeyListFragment extends Fragment
static final int INDEX_IS_REVOKED = 3; static final int INDEX_IS_REVOKED = 3;
static final int INDEX_EXPIRY = 4; static final int INDEX_EXPIRY = 4;
static final int INDEX_VERIFIED = 5; static final int INDEX_VERIFIED = 5;
static final int INDEX_HAS_SECRET = 6; static final int INDEX_HAS_ANY_SECRET = 6;
static final String ORDER = // IN THE COURT static final String ORDER = // IN THE COURT
KeyRings.HAS_SECRET + " DESC, " + KeyRings.USER_ID + " ASC"; KeyRings.HAS_ANY_SECRET + " DESC, " + KeyRings.USER_ID + " ASC";
@Override @Override
@@ -518,7 +518,7 @@ public class KeyListFragment extends Fragment
{ // set edit button and revoked info, specific by key type { // set edit button and revoked info, specific by key type
if (cursor.getInt(KeyListFragment.INDEX_HAS_SECRET) != 0) { if (cursor.getInt(KeyListFragment.INDEX_HAS_ANY_SECRET) != 0) {
// this is a secret key - show the edit mButton // this is a secret key - show the edit mButton
h.mStatusDivider.setVisibility(View.VISIBLE); h.mStatusDivider.setVisibility(View.VISIBLE);
h.mStatusLayout.setVisibility(View.VISIBLE); h.mStatusLayout.setVisibility(View.VISIBLE);
@@ -564,7 +564,7 @@ public class KeyListFragment extends Fragment
throw new IllegalStateException("couldn't move cursor to position " + id); throw new IllegalStateException("couldn't move cursor to position " + id);
} }
return mCursor.getInt(INDEX_HAS_SECRET) != 0; return mCursor.getInt(INDEX_HAS_ANY_SECRET) != 0;
} }
public long getMasterKeyId(int id) { public long getMasterKeyId(int id) {
if (!mCursor.moveToPosition(id)) { if (!mCursor.moveToPosition(id)) {
@@ -604,7 +604,7 @@ public class KeyListFragment extends Fragment
throw new IllegalStateException("couldn't move cursor to position " + position); throw new IllegalStateException("couldn't move cursor to position " + position);
} }
if (mCursor.getInt(KeyListFragment.INDEX_HAS_SECRET) != 0) { if (mCursor.getInt(KeyListFragment.INDEX_HAS_ANY_SECRET) != 0) {
{ // set contact count { // set contact count
int num = mCursor.getCount(); int num = mCursor.getCount();
String contactsTotal = getResources().getQuantityString(R.plurals.n_contacts, num, num); String contactsTotal = getResources().getQuantityString(R.plurals.n_contacts, num, num);
@@ -643,7 +643,7 @@ public class KeyListFragment extends Fragment
} }
// early breakout: all secret keys are assigned id 0 // early breakout: all secret keys are assigned id 0
if (mCursor.getInt(KeyListFragment.INDEX_HAS_SECRET) != 0) { if (mCursor.getInt(KeyListFragment.INDEX_HAS_ANY_SECRET) != 0) {
return 1L; return 1L;
} }
// otherwise, return the first character of the name as ID // otherwise, return the first character of the name as ID

View File

@@ -117,10 +117,10 @@ public class SelectSecretKeyFragment extends ListFragment implements
KeyRings.IS_REVOKED, KeyRings.IS_REVOKED,
KeyRings.CAN_CERTIFY, KeyRings.CAN_CERTIFY,
KeyRings.HAS_SIGN, KeyRings.HAS_SIGN,
KeyRings.HAS_SECRET KeyRings.HAS_ANY_SECRET
}; };
String where = KeyRings.HAS_SECRET + " = 1"; String where = KeyRings.HAS_ANY_SECRET + " = 1";
// Now create and return a CursorLoader that will take care of // Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed. // creating a Cursor for the data being displayed.

View File

@@ -158,13 +158,13 @@ public class ViewKeyMainFragment extends Fragment implements
} }
static final String[] UNIFIED_PROJECTION = new String[] { static final String[] UNIFIED_PROJECTION = new String[] {
KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_SECRET, KeyRings._ID, KeyRings.MASTER_KEY_ID, KeyRings.HAS_ANY_SECRET,
KeyRings.USER_ID, KeyRings.FINGERPRINT, KeyRings.USER_ID, KeyRings.FINGERPRINT,
KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY, KeyRings.ALGORITHM, KeyRings.KEY_SIZE, KeyRings.CREATION, KeyRings.EXPIRY,
}; };
static final int INDEX_UNIFIED_MKI = 1; static final int INDEX_UNIFIED_MKI = 1;
static final int INDEX_UNIFIED_HAS_SECRET = 2; static final int INDEX_UNIFIED_HAS_ANY_SECRET = 2;
static final int INDEX_UNIFIED_UID = 3; static final int INDEX_UNIFIED_UID = 3;
static final int INDEX_UNIFIED_FINGERPRINT = 4; static final int INDEX_UNIFIED_FINGERPRINT = 4;
static final int INDEX_UNIFIED_ALGORITHM = 5; static final int INDEX_UNIFIED_ALGORITHM = 5;
@@ -225,7 +225,7 @@ public class ViewKeyMainFragment extends Fragment implements
mEmail.setText(mainUserId[1]); mEmail.setText(mainUserId[1]);
mComment.setText(mainUserId[2]); mComment.setText(mainUserId[2]);
if (data.getInt(INDEX_UNIFIED_HAS_SECRET) != 0) { if (data.getInt(INDEX_UNIFIED_HAS_ANY_SECRET) != 0) {
mSecretKey.setTextColor(getResources().getColor(R.color.emphasis)); mSecretKey.setTextColor(getResources().getColor(R.color.emphasis));
mSecretKey.setText(R.string.secret_key_yes); mSecretKey.setText(R.string.secret_key_yes);

View File

@@ -91,10 +91,10 @@ public class DeleteKeyDialogFragment extends DialogFragment {
HashMap<String, Object> data = new ProviderHelper(activity).getUnifiedData(masterKeyId, new String[]{ HashMap<String, Object> data = new ProviderHelper(activity).getUnifiedData(masterKeyId, new String[]{
KeyRings.USER_ID, KeyRings.USER_ID,
KeyRings.HAS_SECRET KeyRings.HAS_ANY_SECRET
}, new int[]{ProviderHelper.FIELD_TYPE_STRING, ProviderHelper.FIELD_TYPE_INTEGER}); }, new int[]{ProviderHelper.FIELD_TYPE_STRING, ProviderHelper.FIELD_TYPE_INTEGER});
String userId = (String) data.get(KeyRings.USER_ID); String userId = (String) data.get(KeyRings.USER_ID);
boolean hasSecret = ((Long) data.get(KeyRings.HAS_SECRET)) == 1; boolean hasSecret = ((Long) data.get(KeyRings.HAS_ANY_SECRET)) == 1;
// Set message depending on which key it is. // Set message depending on which key it is.
mMainMessage.setText(getString( mMainMessage.setText(getString(