Do not Strigprep JIDs from database

Mateusz "maxmati" Nowoty?ski created

Change summary

src/main/java/eu/siacs/conversations/entities/Contact.java      |  2 
src/main/java/eu/siacs/conversations/entities/Conversation.java |  4 
src/main/java/eu/siacs/conversations/entities/Message.java      |  4 
src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java          | 14 +-
4 files changed, 13 insertions(+), 11 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Contact.java 🔗

@@ -80,7 +80,7 @@ public class Contact implements ListItem, Blockable {
 				cursor.getLong(cursor.getColumnIndex(LAST_TIME)));
 		final Jid jid;
 		try {
-			jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(JID)));
+			jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(JID)), true);
 		} catch (final InvalidJidException e) {
 			// TODO: Borked DB... handle this somehow?
 			return null;

src/main/java/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -2,10 +2,8 @@ package eu.siacs.conversations.entities;
 
 import android.content.ContentValues;
 import android.database.Cursor;
-import android.os.SystemClock;
 
 import net.java.otr4j.OtrException;
-import net.java.otr4j.crypto.OtrCryptoEngineImpl;
 import net.java.otr4j.crypto.OtrCryptoException;
 import net.java.otr4j.session.SessionID;
 import net.java.otr4j.session.SessionImpl;
@@ -371,7 +369,7 @@ public class Conversation extends AbstractEntity implements Blockable {
 	public static Conversation fromCursor(Cursor cursor) {
 		Jid jid;
 		try {
-			jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(CONTACTJID)));
+			jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(CONTACTJID)), true);
 		} catch (final InvalidJidException e) {
 			// Borked DB..
 			jid = null;

src/main/java/eu/siacs/conversations/entities/Message.java 🔗

@@ -117,7 +117,7 @@ public class Message extends AbstractEntity {
 		try {
 			String value = cursor.getString(cursor.getColumnIndex(COUNTERPART));
 			if (value != null) {
-				jid = Jid.fromString(value);
+				jid = Jid.fromString(value, true);
 			} else {
 				jid = null;
 			}
@@ -128,7 +128,7 @@ public class Message extends AbstractEntity {
 		try {
 			String value = cursor.getString(cursor.getColumnIndex(TRUE_COUNTERPART));
 			if (value != null) {
-				trueCounterpart = Jid.fromString(value);
+				trueCounterpart = Jid.fromString(value, true);
 			} else {
 				trueCounterpart = null;
 			}

src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java 🔗

@@ -46,7 +46,11 @@ public final class Jid {
 	}
 
 	public static Jid fromString(final String jid) throws InvalidJidException {
-		return new Jid(jid);
+		return Jid.fromString(jid, false);
+	}
+
+	public static Jid fromString(final String jid, final boolean safe) throws InvalidJidException {
+		return new Jid(jid, safe);
 	}
 
 	public static Jid fromParts(final String localpart,
@@ -61,10 +65,10 @@ public final class Jid {
 		if (resourcepart != null && !resourcepart.isEmpty()) {
 			out = out + "/" + resourcepart;
 		}
-		return new Jid(out);
+		return new Jid(out, false);
 	}
 
-	private Jid(final String jid) throws InvalidJidException {
+	private Jid(final String jid, final boolean safe) throws InvalidJidException {
 		if (jid == null) throw new InvalidJidException(InvalidJidException.IS_NULL);
 
 		Jid fromCache = Jid.cache.get(jid);
@@ -104,7 +108,7 @@ public final class Jid {
 		} else {
 			final String lp = jid.substring(0, atLoc);
 			try {
-				localpart = Config.DISABLE_STRING_PREP ? lp : Stringprep.nodeprep(lp);
+				localpart = Config.DISABLE_STRING_PREP || safe ? lp : Stringprep.nodeprep(lp);
 			} catch (final StringprepException e) {
 				throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e);
 			}
@@ -119,7 +123,7 @@ public final class Jid {
 		if (slashCount > 0) {
 			final String rp = jid.substring(slashLoc + 1, jid.length());
 			try {
-				resourcepart = Config.DISABLE_STRING_PREP ? rp : Stringprep.resourceprep(rp);
+				resourcepart = Config.DISABLE_STRING_PREP || safe ? rp : Stringprep.resourceprep(rp);
 			} catch (final StringprepException e) {
 				throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e);
 			}