Fix issue where we could give storageIds to MMS groups or emails.

Things like force-unread and mute could be applied to MMS groups or
unregistered users (the worst kind being email SMS contacts) that could
result in crashes down the line.

Includes a DB migration to clean up the bad stuff.
This commit is contained in:
Greyson Parrelli 2021-04-29 23:55:13 -04:00
parent 2f30d29351
commit d58f68cb44
2 changed files with 17 additions and 2 deletions

View file

@ -2662,12 +2662,17 @@ public class RecipientDatabase extends Database {
/**
* Does not trigger any recipient refreshes -- it is assumed the caller handles this.
* Will *not* give storageIds to those that shouldn't get them (e.g. MMS groups, unregistered
* users).
*/
void rotateStorageId(@NonNull RecipientId recipientId) {
ContentValues values = new ContentValues(1);
values.put(STORAGE_SERVICE_ID, Base64.encodeBytes(StorageSyncHelper.generateKey()));
databaseHelper.getWritableDatabase().update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(recipientId));
String query = ID + " = ? AND (" + GROUP_TYPE + " IN (?, ?) OR " + REGISTERED + " = ?)";
String[] args = SqlUtil.buildArgs(recipientId, GroupType.SIGNAL_V1.getId(), GroupType.SIGNAL_V2.getId(), RegisteredState.REGISTERED.getId());
databaseHelper.getWritableDatabase().update(TABLE_NAME, values, query, args);
}
/**

View file

@ -179,8 +179,9 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab
private static final int CLEAN_STORAGE_IDS_WITHOUT_INFO = 95;
private static final int CLEAN_REACTION_NOTIFICATIONS = 96;
private static final int STORAGE_SERVICE_REFACTOR = 97;
private static final int CLEAR_MMS_STORAGE_IDS = 98;
private static final int DATABASE_VERSION = 97;
private static final int DATABASE_VERSION = 98;
private static final String DATABASE_NAME = "signal.db";
private final Context context;
@ -1438,6 +1439,15 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper implements SignalDatab
Log.d(TAG, String.format(Locale.US, "For storage service refactor migration, there were %d inserts, %d updated, and %d deletes. Cleared the dirty status on %d rows.", insertCount, updateCount, deleteCount, dirtyCount));
}
if (oldVersion < CLEAR_MMS_STORAGE_IDS) {
ContentValues deleteValues = new ContentValues();
deleteValues.putNull("storage_service_key");
int deleteCount = db.update("recipient", deleteValues, "storage_service_key NOT NULL AND (group_type = 1 OR (group_type = 0 AND phone IS NULL AND uuid IS NULL))", null);
Log.d(TAG, "Cleared storageIds from " + deleteCount + " rows. They were either MMS groups or empty contacts.");
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();