write prepped string to db. use display version everywhere else

This commit is contained in:
Daniel Gultsch 2016-10-20 17:31:46 +02:00
parent c3423d6ffe
commit 44ce5df359
6 changed files with 45 additions and 32 deletions

View File

@ -185,8 +185,8 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
} }
private void fillMap(SQLiteAxolotlStore store) { private void fillMap(SQLiteAxolotlStore store) {
List<Integer> deviceIds = store.getSubDeviceSessions(account.getJid().toBareJid().toString()); List<Integer> deviceIds = store.getSubDeviceSessions(account.getJid().toBareJid().toPreppedString());
putDevicesForJid(account.getJid().toBareJid().toString(), deviceIds, store); putDevicesForJid(account.getJid().toBareJid().toPreppedString(), deviceIds, store);
for (Contact contact : account.getRoster().getContacts()) { for (Contact contact : account.getRoster().getContacts()) {
Jid bareJid = contact.getJid().toBareJid(); Jid bareJid = contact.getJid().toBareJid();
String address = bareJid.toString(); String address = bareJid.toString();
@ -220,7 +220,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
public void clearErrorFor(Jid jid) { public void clearErrorFor(Jid jid) {
synchronized (MAP_LOCK) { synchronized (MAP_LOCK) {
Map<Integer, FetchStatus> devices = this.map.get(jid.toBareJid().toString()); Map<Integer, FetchStatus> devices = this.map.get(jid.toBareJid().toPreppedString());
if (devices == null) { if (devices == null) {
return; return;
} }
@ -257,28 +257,28 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
} }
public Set<IdentityKey> getKeysWithTrust(XmppAxolotlSession.Trust trust) { public Set<IdentityKey> getKeysWithTrust(XmppAxolotlSession.Trust trust) {
return axolotlStore.getContactKeysWithTrust(account.getJid().toBareJid().toString(), trust); return axolotlStore.getContactKeysWithTrust(account.getJid().toBareJid().toPreppedString(), trust);
} }
public Set<IdentityKey> getKeysWithTrust(XmppAxolotlSession.Trust trust, Jid jid) { public Set<IdentityKey> getKeysWithTrust(XmppAxolotlSession.Trust trust, Jid jid) {
return axolotlStore.getContactKeysWithTrust(jid.toBareJid().toString(), trust); return axolotlStore.getContactKeysWithTrust(jid.toBareJid().toPreppedString(), trust);
} }
public Set<IdentityKey> getKeysWithTrust(XmppAxolotlSession.Trust trust, List<Jid> jids) { public Set<IdentityKey> getKeysWithTrust(XmppAxolotlSession.Trust trust, List<Jid> jids) {
Set<IdentityKey> keys = new HashSet<>(); Set<IdentityKey> keys = new HashSet<>();
for(Jid jid : jids) { for(Jid jid : jids) {
keys.addAll(axolotlStore.getContactKeysWithTrust(jid.toString(), trust)); keys.addAll(axolotlStore.getContactKeysWithTrust(jid.toPreppedString(), trust));
} }
return keys; return keys;
} }
public long getNumTrustedKeys(Jid jid) { public long getNumTrustedKeys(Jid jid) {
return axolotlStore.getContactNumTrustedKeys(jid.toBareJid().toString()); return axolotlStore.getContactNumTrustedKeys(jid.toBareJid().toPreppedString());
} }
public boolean anyTargetHasNoTrustedKeys(List<Jid> jids) { public boolean anyTargetHasNoTrustedKeys(List<Jid> jids) {
for(Jid jid : jids) { for(Jid jid : jids) {
if (axolotlStore.getContactNumTrustedKeys(jid.toBareJid().toString()) == 0) { if (axolotlStore.getContactNumTrustedKeys(jid.toBareJid().toPreppedString()) == 0) {
return true; return true;
} }
} }
@ -286,7 +286,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
} }
private AxolotlAddress getAddressForJid(Jid jid) { private AxolotlAddress getAddressForJid(Jid jid) {
return new AxolotlAddress(jid.toString(), 0); return new AxolotlAddress(jid.toPreppedString(), 0);
} }
private Set<XmppAxolotlSession> findOwnSessions() { private Set<XmppAxolotlSession> findOwnSessions() {
@ -359,7 +359,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
final XmppAxolotlSession.Trust from, final XmppAxolotlSession.Trust from,
final XmppAxolotlSession.Trust to) { final XmppAxolotlSession.Trust to) {
for (Integer deviceId : deviceIds) { for (Integer deviceId : deviceIds) {
AxolotlAddress address = new AxolotlAddress(jid.toBareJid().toString(), deviceId); AxolotlAddress address = new AxolotlAddress(jid.toBareJid().toPreppedString(), deviceId);
XmppAxolotlSession session = sessions.get(address); XmppAxolotlSession session = sessions.get(address);
if (session != null && session.getFingerprint() != null if (session != null && session.getFingerprint() != null
&& session.getTrust() == from) { && session.getTrust() == from) {
@ -381,13 +381,13 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
publishOwnDeviceId(deviceIds); publishOwnDeviceId(deviceIds);
} }
for (Integer deviceId : deviceIds) { for (Integer deviceId : deviceIds) {
AxolotlAddress ownDeviceAddress = new AxolotlAddress(jid.toBareJid().toString(), deviceId); AxolotlAddress ownDeviceAddress = new AxolotlAddress(jid.toBareJid().toPreppedString(), deviceId);
if (sessions.get(ownDeviceAddress) == null) { if (sessions.get(ownDeviceAddress) == null) {
buildSessionFromPEP(ownDeviceAddress); buildSessionFromPEP(ownDeviceAddress);
} }
} }
} }
Set<Integer> expiredDevices = new HashSet<>(axolotlStore.getSubDeviceSessions(jid.toBareJid().toString())); Set<Integer> expiredDevices = new HashSet<>(axolotlStore.getSubDeviceSessions(jid.toBareJid().toPreppedString()));
expiredDevices.removeAll(deviceIds); expiredDevices.removeAll(deviceIds);
setTrustOnSessions(jid, expiredDevices, XmppAxolotlSession.Trust.TRUSTED, setTrustOnSessions(jid, expiredDevices, XmppAxolotlSession.Trust.TRUSTED,
XmppAxolotlSession.Trust.INACTIVE_TRUSTED); XmppAxolotlSession.Trust.INACTIVE_TRUSTED);
@ -759,7 +759,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
} }
private void finishBuildingSessionsFromPEP(final AxolotlAddress address) { private void finishBuildingSessionsFromPEP(final AxolotlAddress address) {
AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toString(), 0); AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toPreppedString(), 0);
if (!fetchStatusMap.getAll(ownAddress).containsValue(FetchStatus.PENDING) if (!fetchStatusMap.getAll(ownAddress).containsValue(FetchStatus.PENDING)
&& !fetchStatusMap.getAll(address).containsValue(FetchStatus.PENDING)) { && !fetchStatusMap.getAll(address).containsValue(FetchStatus.PENDING)) {
FetchStatus report = null; FetchStatus report = null;
@ -873,7 +873,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
} }
if (deviceIds.get(account.getJid().toBareJid()) != null) { if (deviceIds.get(account.getJid().toBareJid()) != null) {
for (Integer ownId : this.deviceIds.get(account.getJid().toBareJid())) { for (Integer ownId : this.deviceIds.get(account.getJid().toBareJid())) {
AxolotlAddress address = new AxolotlAddress(account.getJid().toBareJid().toString(), ownId); AxolotlAddress address = new AxolotlAddress(account.getJid().toBareJid().toPreppedString(), ownId);
if (sessions.get(address) == null) { if (sessions.get(address) == null) {
IdentityKey identityKey = axolotlStore.loadSession(address).getSessionState().getRemoteIdentityKey(); IdentityKey identityKey = axolotlStore.loadSession(address).getSessionState().getRemoteIdentityKey();
if (identityKey != null) { if (identityKey != null) {
@ -933,12 +933,12 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
} }
public boolean hasPendingKeyFetches(Account account, List<Jid> jids) { public boolean hasPendingKeyFetches(Account account, List<Jid> jids) {
AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toString(), 0); AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toPreppedString(), 0);
if (fetchStatusMap.getAll(ownAddress).containsValue(FetchStatus.PENDING)) { if (fetchStatusMap.getAll(ownAddress).containsValue(FetchStatus.PENDING)) {
return true; return true;
} }
for(Jid jid : jids) { for(Jid jid : jids) {
AxolotlAddress foreignAddress = new AxolotlAddress(jid.toBareJid().toString(), 0); AxolotlAddress foreignAddress = new AxolotlAddress(jid.toBareJid().toPreppedString(), 0);
if (fetchStatusMap.getAll(foreignAddress).containsValue(FetchStatus.PENDING)) { if (fetchStatusMap.getAll(foreignAddress).containsValue(FetchStatus.PENDING)) {
return true; return true;
} }

View File

@ -196,7 +196,7 @@ public class Contact implements ListItem, Blockable {
values.put(ACCOUNT, accountUuid); values.put(ACCOUNT, accountUuid);
values.put(SYSTEMNAME, systemName); values.put(SYSTEMNAME, systemName);
values.put(SERVERNAME, serverName); values.put(SERVERNAME, serverName);
values.put(JID, jid.toString()); values.put(JID, jid.toPreppedString());
values.put(OPTIONS, subscription); values.put(OPTIONS, subscription);
values.put(SYSTEMACCOUNT, systemAccount); values.put(SYSTEMACCOUNT, systemAccount);
values.put(PHOTOURI, photoUri); values.put(PHOTOURI, photoUri);
@ -209,10 +209,6 @@ public class Contact implements ListItem, Blockable {
} }
} }
public int getSubscription() {
return this.subscription;
}
public Account getAccount() { public Account getAccount() {
return this.account; return this.account;
} }

View File

@ -506,7 +506,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
values.put(NAME, name); values.put(NAME, name);
values.put(CONTACT, contactUuid); values.put(CONTACT, contactUuid);
values.put(ACCOUNT, accountUuid); values.put(ACCOUNT, accountUuid);
values.put(CONTACTJID, contactJid.toString()); values.put(CONTACTJID, contactJid.toPreppedString());
values.put(CREATED, created); values.put(CREATED, created);
values.put(STATUS, status); values.put(STATUS, status);
values.put(MODE, mode); values.put(MODE, mode);

View File

@ -205,12 +205,12 @@ public class Message extends AbstractEntity {
if (counterpart == null) { if (counterpart == null) {
values.putNull(COUNTERPART); values.putNull(COUNTERPART);
} else { } else {
values.put(COUNTERPART, counterpart.toString()); values.put(COUNTERPART, counterpart.toPreppedString());
} }
if (trueCounterpart == null) { if (trueCounterpart == null) {
values.putNull(TRUE_COUNTERPART); values.putNull(TRUE_COUNTERPART);
} else { } else {
values.put(TRUE_COUNTERPART, trueCounterpart.toString()); values.put(TRUE_COUNTERPART, trueCounterpart.toPreppedString());
} }
values.put(BODY, body); values.put(BODY, body);
values.put(TIME_SENT, timeSent); values.put(TIME_SENT, timeSent);

View File

@ -287,7 +287,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
continue; continue;
} }
int ownDeviceId = Integer.valueOf(ownDeviceIdString); int ownDeviceId = Integer.valueOf(ownDeviceIdString);
AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toString(), ownDeviceId); AxolotlAddress ownAddress = new AxolotlAddress(account.getJid().toBareJid().toPreppedString(), ownDeviceId);
deleteSession(db, account, ownAddress); deleteSession(db, account, ownAddress);
IdentityKeyPair identityKeyPair = loadOwnIdentityKeyPair(db, account); IdentityKeyPair identityKeyPair = loadOwnIdentityKeyPair(db, account);
if (identityKeyPair != null) { if (identityKeyPair != null) {
@ -345,7 +345,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
try { try {
newJid = Jid.fromString( newJid = Jid.fromString(
cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID)) cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID))
).toString(); ).toPreppedString();
} catch (InvalidJidException ignored) { } catch (InvalidJidException ignored) {
Log.e(Config.LOGTAG, "Failed to migrate Conversation CONTACTJID " Log.e(Config.LOGTAG, "Failed to migrate Conversation CONTACTJID "
+ cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID)) + cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID))
@ -370,7 +370,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
try { try {
newJid = Jid.fromString( newJid = Jid.fromString(
cursor.getString(cursor.getColumnIndex(Contact.JID)) cursor.getString(cursor.getColumnIndex(Contact.JID))
).toString(); ).toPreppedString();
} catch (InvalidJidException ignored) { } catch (InvalidJidException ignored) {
Log.e(Config.LOGTAG, "Failed to migrate Contact JID " Log.e(Config.LOGTAG, "Failed to migrate Contact JID "
+ cursor.getString(cursor.getColumnIndex(Contact.JID)) + cursor.getString(cursor.getColumnIndex(Contact.JID))
@ -578,8 +578,8 @@ public class DatabaseBackend extends SQLiteOpenHelper {
public Conversation findConversation(final Account account, final Jid contactJid) { public Conversation findConversation(final Account account, final Jid contactJid) {
SQLiteDatabase db = this.getReadableDatabase(); SQLiteDatabase db = this.getReadableDatabase();
String[] selectionArgs = {account.getUuid(), String[] selectionArgs = {account.getUuid(),
contactJid.toBareJid().toString() + "/%", contactJid.toBareJid().toPreppedString() + "/%",
contactJid.toBareJid().toString() contactJid.toBareJid().toPreppedString()
}; };
Cursor cursor = db.query(Conversation.TABLENAME, null, Cursor cursor = db.query(Conversation.TABLENAME, null,
Conversation.ACCOUNT + "=? AND (" + Conversation.CONTACTJID Conversation.ACCOUNT + "=? AND (" + Conversation.CONTACTJID
@ -691,7 +691,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
db.insert(Contact.TABLENAME, null, contact.getContentValues()); db.insert(Contact.TABLENAME, null, contact.getContentValues());
} else { } else {
String where = Contact.ACCOUNT + "=? AND " + Contact.JID + "=?"; String where = Contact.ACCOUNT + "=? AND " + Contact.JID + "=?";
String[] whereArgs = {account.getUuid(), contact.getJid().toString()}; String[] whereArgs = {account.getUuid(), contact.getJid().toPreppedString()};
db.delete(Contact.TABLENAME, where, whereArgs); db.delete(Contact.TABLENAME, where, whereArgs);
} }
} }
@ -1025,7 +1025,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
} }
private IdentityKeyPair loadOwnIdentityKeyPair(SQLiteDatabase db, Account account) { private IdentityKeyPair loadOwnIdentityKeyPair(SQLiteDatabase db, Account account) {
String name = account.getJid().toBareJid().toString(); String name = account.getJid().toBareJid().toPreppedString();
IdentityKeyPair identityKeyPair = null; IdentityKeyPair identityKeyPair = null;
Cursor cursor = getIdentityKeyCursor(db, account, name, true); Cursor cursor = getIdentityKeyCursor(db, account, name, true);
if (cursor.getCount() != 0) { if (cursor.getCount() != 0) {
@ -1181,7 +1181,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
} }
public void storeOwnIdentityKeyPair(Account account, IdentityKeyPair identityKeyPair) { public void storeOwnIdentityKeyPair(Account account, IdentityKeyPair identityKeyPair) {
storeIdentityKey(account, account.getJid().toBareJid().toString(), true, identityKeyPair.getPublicKey().getFingerprint().replaceAll("\\s", ""), Base64.encodeToString(identityKeyPair.serialize(), Base64.DEFAULT), XmppAxolotlSession.Trust.TRUSTED); storeIdentityKey(account, account.getJid().toBareJid().toPreppedString(), true, identityKeyPair.getPublicKey().getFingerprint().replaceAll("\\s", ""), Base64.encodeToString(identityKeyPair.serialize(), Base64.DEFAULT), XmppAxolotlSession.Trust.TRUSTED);
} }

View File

@ -21,6 +21,10 @@ public final class Jid {
private final String domainpart; private final String domainpart;
private final String resourcepart; private final String resourcepart;
// It's much more efficient to store the ful JID as well as the parts instead of figuring them
// all out every time (since some characters are displayed but aren't used for comparisons).
private final String displayjid;
public String getLocalpart() { public String getLocalpart() {
return localpart; return localpart;
} }
@ -69,6 +73,7 @@ public final class Jid {
Jid fromCache = Jid.cache.get(jid); Jid fromCache = Jid.cache.get(jid);
if (fromCache != null) { if (fromCache != null) {
displayjid = fromCache.displayjid;
localpart = fromCache.localpart; localpart = fromCache.localpart;
domainpart = fromCache.domainpart; domainpart = fromCache.domainpart;
resourcepart = fromCache.resourcepart; resourcepart = fromCache.resourcepart;
@ -89,6 +94,8 @@ public final class Jid {
throw new InvalidJidException(InvalidJidException.INVALID_CHARACTER); throw new InvalidJidException(InvalidJidException.INVALID_CHARACTER);
} }
String finaljid;
final int domainpartStart; final int domainpartStart;
final int atLoc = jid.indexOf("@"); final int atLoc = jid.indexOf("@");
final int slashLoc = jid.indexOf("/"); final int slashLoc = jid.indexOf("/");
@ -96,6 +103,7 @@ public final class Jid {
// or there are one or more "@" signs but they're all in the resourcepart (eg. "example.net/@/rp@"): // or there are one or more "@" signs but they're all in the resourcepart (eg. "example.net/@/rp@"):
if (atCount == 0 || (atCount > 0 && slashLoc != -1 && atLoc > slashLoc)) { if (atCount == 0 || (atCount > 0 && slashLoc != -1 && atLoc > slashLoc)) {
localpart = ""; localpart = "";
finaljid = "";
domainpartStart = 0; domainpartStart = 0;
} else { } else {
final String lp = jid.substring(0, atLoc); final String lp = jid.substring(0, atLoc);
@ -108,6 +116,7 @@ public final class Jid {
throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH);
} }
domainpartStart = atLoc + 1; domainpartStart = atLoc + 1;
finaljid = lp + "@";
} }
final String dp; final String dp;
@ -126,6 +135,7 @@ public final class Jid {
} catch (final StringprepException e) { } catch (final StringprepException e) {
throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e);
} }
finaljid = finaljid + dp + "/" + rp;
} else { } else {
resourcepart = ""; resourcepart = "";
try{ try{
@ -133,6 +143,7 @@ public final class Jid {
} catch (final StringprepException e) { } catch (final StringprepException e) {
throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e);
} }
finaljid = finaljid + dp;
} }
// Remove trailing "." before storing the domain part. // Remove trailing "." before storing the domain part.
@ -156,6 +167,8 @@ public final class Jid {
} }
Jid.cache.put(jid, this); Jid.cache.put(jid, this);
this.displayjid = finaljid;
} }
public Jid toBareJid() { public Jid toBareJid() {
@ -178,6 +191,10 @@ public final class Jid {
@Override @Override
public String toString() { public String toString() {
return displayjid;
}
public String toPreppedString() {
String out; String out;
if (hasLocalpart()) { if (hasLocalpart()) {
out = localpart + '@' + domainpart; out = localpart + '@' + domainpart;