write migration to store raw localparts in account table

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java | 79 
1 file changed, 59 insertions(+), 20 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -48,6 +48,8 @@ import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.jxmpp.jid.parts.Localpart;
+import org.jxmpp.stringprep.XmppStringprepException;
 import org.whispersystems.libsignal.IdentityKey;
 import org.whispersystems.libsignal.IdentityKeyPair;
 import org.whispersystems.libsignal.InvalidKeyException;
@@ -59,7 +61,7 @@ import org.whispersystems.libsignal.state.SignedPreKeyRecord;
 public class DatabaseBackend extends SQLiteOpenHelper {
 
     private static final String DATABASE_NAME = "history";
-    private static final int DATABASE_VERSION = 52;
+    private static final int DATABASE_VERSION = 53;
 
     private static boolean requiresMessageIndexRebuild = false;
     private static DatabaseBackend instance = null;
@@ -1053,6 +1055,37 @@ public class DatabaseBackend extends SQLiteOpenHelper {
                             + Message.REACTIONS
                             + " TEXT");
         }
+        if (oldVersion < 53 && newVersion >= 53) {
+            try (final Cursor cursor =
+                    db.query(
+                            Account.TABLENAME,
+                            new String[] {Account.UUID, Account.USERNAME},
+                            null,
+                            null,
+                            null,
+                            null,
+                            null)) {
+                while (cursor != null && cursor.moveToNext()) {
+                    final var uuid = cursor.getString(0);
+                    final var username = cursor.getString(1);
+                    final Localpart localpart;
+                    try {
+                        localpart = Localpart.fromUnescaped(username);
+                    } catch (final XmppStringprepException e) {
+                        Log.d(Config.LOGTAG, "unable to parse jid");
+                        continue;
+                    }
+                    final var contentValues = new ContentValues();
+                    contentValues.putNull(Account.ROSTERVERSION);
+                    contentValues.put(Account.USERNAME, localpart.toString());
+                    db.update(
+                            Account.TABLENAME,
+                            contentValues,
+                            Account.UUID + "=?",
+                            new String[] {uuid});
+                }
+            }
+        }
     }
 
     private void canonicalizeJids(SQLiteDatabase db) {
@@ -1064,21 +1097,24 @@ public class DatabaseBackend extends SQLiteOpenHelper {
             String newJid;
             try {
                 newJid =
-                        Jid.of(cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID)))
+                        Jid.of(
+                                        cursor.getString(
+                                                cursor.getColumnIndexOrThrow(
+                                                        Conversation.CONTACTJID)))
                                 .toString();
-            } catch (IllegalArgumentException ignored) {
+            } catch (final IllegalArgumentException e) {
                 Log.e(
                         Config.LOGTAG,
                         "Failed to migrate Conversation CONTACTJID "
-                                + cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID))
-                                + ": "
-                                + ignored
-                                + ". Skipping...");
+                                + cursor.getString(
+                                        cursor.getColumnIndexOrThrow(Conversation.CONTACTJID))
+                                + ". Skipping...",
+                        e);
                 continue;
             }
 
             final String[] updateArgs = {
-                newJid, cursor.getString(cursor.getColumnIndex(Conversation.UUID)),
+                newJid, cursor.getString(cursor.getColumnIndexOrThrow(Conversation.UUID)),
             };
             db.execSQL(
                     "update "
@@ -1098,12 +1134,14 @@ public class DatabaseBackend extends SQLiteOpenHelper {
         while (cursor.moveToNext()) {
             String newJid;
             try {
-                newJid = Jid.of(cursor.getString(cursor.getColumnIndex(Contact.JID))).toString();
+                newJid =
+                        Jid.of(cursor.getString(cursor.getColumnIndexOrThrow(Contact.JID)))
+                                .toString();
             } catch (final IllegalArgumentException e) {
                 Log.e(
                         Config.LOGTAG,
                         "Failed to migrate Contact JID "
-                                + cursor.getString(cursor.getColumnIndex(Contact.JID))
+                                + cursor.getString(cursor.getColumnIndexOrThrow(Contact.JID))
                                 + ":  Skipping...",
                         e);
                 continue;
@@ -1111,8 +1149,8 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 
             final String[] updateArgs = {
                 newJid,
-                cursor.getString(cursor.getColumnIndex(Contact.ACCOUNT)),
-                cursor.getString(cursor.getColumnIndex(Contact.JID)),
+                cursor.getString(cursor.getColumnIndexOrThrow(Contact.ACCOUNT)),
+                cursor.getString(cursor.getColumnIndexOrThrow(Contact.JID)),
             };
             db.execSQL(
                     "update "
@@ -1137,24 +1175,25 @@ public class DatabaseBackend extends SQLiteOpenHelper {
             try {
                 newServer =
                         Jid.of(
-                                        cursor.getString(cursor.getColumnIndex(Account.USERNAME)),
-                                        cursor.getString(cursor.getColumnIndex(Account.SERVER)),
+                                        cursor.getString(
+                                                cursor.getColumnIndexOrThrow(Account.USERNAME)),
+                                        cursor.getString(
+                                                cursor.getColumnIndexOrThrow(Account.SERVER)),
                                         null)
                                 .getDomain()
                                 .toString();
-            } catch (IllegalArgumentException ignored) {
+            } catch (final IllegalArgumentException e) {
                 Log.e(
                         Config.LOGTAG,
                         "Failed to migrate Account SERVER "
-                                + cursor.getString(cursor.getColumnIndex(Account.SERVER))
-                                + ": "
-                                + ignored
-                                + ". Skipping...");
+                                + cursor.getString(cursor.getColumnIndexOrThrow(Account.SERVER))
+                                + ". Skipping...",
+                        e);
                 continue;
             }
 
             String[] updateArgs = {
-                newServer, cursor.getString(cursor.getColumnIndex(Account.UUID)),
+                newServer, cursor.getString(cursor.getColumnIndexOrThrow(Account.UUID)),
             };
             db.execSQL(
                     "update "