From bff97731deed4c599dcb6c3a2887c9f47165dd3f Mon Sep 17 00:00:00 2001 From: steckbrief Date: Fri, 11 May 2018 19:49:27 +0200 Subject: introduces JidUtil for Jid creation, fixes duplication of childs while adding childs with xmlns and name --- .../de/thedevstack/conversationsplus/Config.java | 1 - .../conversationsplus/crypto/OtrService.java | 11 +- .../crypto/axolotl/AxolotlServiceImpl.java | 9 +- .../conversationsplus/entities/Account.java | 5 +- .../conversationsplus/entities/Contact.java | 3 +- .../conversationsplus/entities/Conversation.java | 6 +- .../conversationsplus/entities/Message.java | 7 +- .../conversationsplus/entities/MucOptions.java | 3 +- .../persistance/DatabaseBackend.java | 7 +- .../services/XmppConnectionService.java | 12 +- .../ui/ContactDetailsActivity.java | 6 +- .../conversationsplus/ui/ConversationActivity.java | 3 +- .../conversationsplus/ui/EditAccountActivity.java | 7 +- .../conversationsplus/ui/EnterJidDialog.java | 9 +- .../ui/ManageAccountActivity.java | 3 +- .../conversationsplus/ui/ShareWithActivity.java | 6 +- .../ui/StartConversationActivity.java | 9 +- .../conversationsplus/ui/TrustKeysActivity.java | 3 +- .../conversationsplus/ui/VerifyOTRActivity.java | 4 +- .../conversationsplus/ui/XmppActivity.java | 13 +- .../ui/forms/FormJidSingleFieldWrapper.java | 4 +- .../conversationsplus/utils/CryptoHelper.java | 3 +- .../conversationsplus/utils/ExceptionHelper.java | 4 +- .../conversationsplus/utils/XmppUri.java | 7 +- .../thedevstack/conversationsplus/xml/Element.java | 6 +- .../conversationsplus/xmpp/XmppConnection.java | 3 +- .../conversationsplus/xmpp/forms/Field.java | 4 +- .../conversationsplus/xmpp/jid/Jid.java | 151 +-------------------- .../conversationsplus/xmpp/jid/JidUtil.java | 145 ++++++++++++++++++++ .../xmpp/jingle/stanzas/JinglePacket.java | 4 +- 30 files changed, 241 insertions(+), 217 deletions(-) create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/jid/JidUtil.java diff --git a/src/main/java/de/thedevstack/conversationsplus/Config.java b/src/main/java/de/thedevstack/conversationsplus/Config.java index a6825246..50c1faf9 100644 --- a/src/main/java/de/thedevstack/conversationsplus/Config.java +++ b/src/main/java/de/thedevstack/conversationsplus/Config.java @@ -68,7 +68,6 @@ public final class Config { public static final boolean DISABLE_PROXY_LOOKUP = BuildConfig.DISABLE_PROXY_LOOKUP; //useful to debug ibb public static final boolean DISABLE_HTTP_UPLOAD = BuildConfig.DISABLE_HTTP_UPLOAD; - public static final boolean DISABLE_STRING_PREP = BuildConfig.DISABLE_STRING_PREP; // setting to true might increase startup performance public static final boolean EXTENDED_SM_LOGGING = BuildConfig.EXTENDED_SM_LOGGING; // log stanza counts public static final boolean RESET_ATTEMPT_COUNT_ON_NETWORK_CHANGE = BuildConfig.RESET_ATTEMPT_COUNT_ON_NETWORK_CHANGE; //setting to true might increase power consumption diff --git a/src/main/java/de/thedevstack/conversationsplus/crypto/OtrService.java b/src/main/java/de/thedevstack/conversationsplus/crypto/OtrService.java index 34023d9f..56ee4dbc 100644 --- a/src/main/java/de/thedevstack/conversationsplus/crypto/OtrService.java +++ b/src/main/java/de/thedevstack/conversationsplus/crypto/OtrService.java @@ -35,6 +35,7 @@ import de.thedevstack.conversationsplus.xmpp.chatstate.ChatState; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.xmpp.stanzas.MessagePacket; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost { @@ -102,7 +103,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost { @Override public void askForSecret(SessionID id, InstanceTag instanceTag, String question) { try { - final Jid jid = Jid.fromSessionID(id); + final Jid jid = JidUtil.fromSessionID(id); Conversation conversation = this.mXmppConnectionService.find(this.account,jid); if (conversation!=null) { conversation.smp().hint = question; @@ -182,7 +183,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost { packet.setBody(body); MessageGenerator.addMessageHints(packet); try { - Jid jid = Jid.fromSessionID(session); + Jid jid = JidUtil.fromSessionID(session); Conversation conversation = mXmppConnectionService.find(account,jid); if (conversation != null && conversation.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) { if (ConversationsPlusPreferences.chatStates()) { @@ -227,7 +228,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost { private void setSmpStatus(SessionID id, int status) { try { - final Jid jid = Jid.fromSessionID(id); + final Jid jid = JidUtil.fromSessionID(id); Conversation conversation = this.mXmppConnectionService.find(this.account,jid); if (conversation!=null) { conversation.smp().status = status; @@ -259,7 +260,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost { public void sendOtrErrorMessage(SessionID session, String errorText) { try { - Jid jid = Jid.fromSessionID(session); + Jid jid = JidUtil.fromSessionID(session); Conversation conversation = mXmppConnectionService.find(account, jid); String id = conversation == null ? null : conversation.getLastReceivedOtrMessageId(); if (id != null) { @@ -285,7 +286,7 @@ public class OtrService extends OtrCryptoEngineImpl implements OtrEngineHost { public void verify(SessionID id, String fingerprint, boolean approved) { Logging.d(Config.LOGTAG,"OtrService.verify("+id.toString()+","+fingerprint+","+String.valueOf(approved)+")"); try { - final Jid jid = Jid.fromSessionID(id); + final Jid jid = JidUtil.fromSessionID(id); Conversation conversation = this.mXmppConnectionService.find(this.account,jid); if (conversation!=null) { if (approved) { diff --git a/src/main/java/de/thedevstack/conversationsplus/crypto/axolotl/AxolotlServiceImpl.java b/src/main/java/de/thedevstack/conversationsplus/crypto/axolotl/AxolotlServiceImpl.java index 3569a7a5..cdf78761 100644 --- a/src/main/java/de/thedevstack/conversationsplus/crypto/axolotl/AxolotlServiceImpl.java +++ b/src/main/java/de/thedevstack/conversationsplus/crypto/axolotl/AxolotlServiceImpl.java @@ -52,6 +52,7 @@ import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacketReceiver; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class AxolotlServiceImpl implements OnAdvancedStreamFeaturesLoaded, AxolotlService { @@ -166,7 +167,7 @@ public class AxolotlServiceImpl implements OnAdvancedStreamFeaturesLoaded, Axolo Bundle information = CryptoHelper.extractCertificateInformation(certificate); try { final String cn = information.getString("subject_cn"); - final Jid jid = Jid.fromString(bareJid); + final Jid jid = JidUtil.fromString(bareJid); Log.d(Config.LOGTAG,"setting common name for "+jid+" to "+cn); account.getRoster().getContact(jid).setCommonName(cn); } catch (final InvalidJidException ignored) { @@ -660,7 +661,7 @@ public class AxolotlServiceImpl implements OnAdvancedStreamFeaturesLoaded, Axolo final AxolotlAddress address = session.getRemoteAddress(); final IdentityKey identityKey = session.getIdentityKey(); try { - IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveVerificationForDevice(Jid.fromString(address.getName()), address.getDeviceId()); + IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveVerificationForDevice(JidUtil.fromString(address.getName()), address.getDeviceId()); mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { @@ -681,7 +682,7 @@ public class AxolotlServiceImpl implements OnAdvancedStreamFeaturesLoaded, Axolo Bundle information = CryptoHelper.extractCertificateInformation(verification.first[0]); try { final String cn = information.getString("subject_cn"); - final Jid jid = Jid.fromString(address.getName()); + final Jid jid = JidUtil.fromString(address.getName()); Log.d(Config.LOGTAG,"setting common name for "+jid+" to "+cn); account.getRoster().getContact(jid).setCommonName(cn); } catch (final InvalidJidException ignored) { @@ -733,7 +734,7 @@ public class AxolotlServiceImpl implements OnAdvancedStreamFeaturesLoaded, Axolo try { IqPacket bundlesPacket = mXmppConnectionService.getIqGenerator().retrieveBundlesForDevice( - Jid.fromString(address.getName()), address.getDeviceId()); + JidUtil.fromString(address.getName()), address.getDeviceId()); Log.d(Config.LOGTAG, AxolotlServiceImpl.getLogprefix(account) + "Retrieving bundle: " + bundlesPacket); mXmppConnectionService.sendIqPacket(account, bundlesPacket, new OnIqPacketReceived() { diff --git a/src/main/java/de/thedevstack/conversationsplus/entities/Account.java b/src/main/java/de/thedevstack/conversationsplus/entities/Account.java index 1c7ad288..2421d86e 100644 --- a/src/main/java/de/thedevstack/conversationsplus/entities/Account.java +++ b/src/main/java/de/thedevstack/conversationsplus/entities/Account.java @@ -32,6 +32,7 @@ import de.thedevstack.conversationsplus.utils.SimpleCryptoUtil; import de.thedevstack.conversationsplus.xmpp.XmppConnection; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class Account extends AbstractEntity { @@ -201,7 +202,7 @@ public class Account extends AbstractEntity { public static Account fromCursor(final Cursor cursor) { Jid jid = null; try { - jid = Jid.fromParts(cursor.getString(cursor.getColumnIndex(USERNAME)), + jid = JidUtil.fromParts(cursor.getString(cursor.getColumnIndex(USERNAME)), cursor.getString(cursor.getColumnIndex(SERVER)), "mobile"); } catch (final InvalidJidException ignored) { } @@ -294,7 +295,7 @@ public class Account extends AbstractEntity { final String oldResource = jid.getResourcepart(); if (oldResource == null || !oldResource.equals(resource)) { try { - jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource); + jid = JidUtil.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource); return true; } catch (final InvalidJidException ignored) { return true; diff --git a/src/main/java/de/thedevstack/conversationsplus/entities/Contact.java b/src/main/java/de/thedevstack/conversationsplus/entities/Contact.java index 3dc7c10a..dd832b9b 100644 --- a/src/main/java/de/thedevstack/conversationsplus/entities/Contact.java +++ b/src/main/java/de/thedevstack/conversationsplus/entities/Contact.java @@ -17,6 +17,7 @@ import de.thedevstack.conversationsplus.xml.Element; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.dto.Avatar; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class Contact implements ListItem, Blockable { public static final String TABLENAME = "contacts"; @@ -87,7 +88,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)), true); + jid = JidUtil.fromString(cursor.getString(cursor.getColumnIndex(JID)), true); } catch (final InvalidJidException e) { // TODO: Borked DB... handle this somehow? return null; diff --git a/src/main/java/de/thedevstack/conversationsplus/entities/Conversation.java b/src/main/java/de/thedevstack/conversationsplus/entities/Conversation.java index 0cce63f4..19f21610 100644 --- a/src/main/java/de/thedevstack/conversationsplus/entities/Conversation.java +++ b/src/main/java/de/thedevstack/conversationsplus/entities/Conversation.java @@ -22,7 +22,6 @@ import java.util.NavigableSet; import java.util.TreeSet; import de.thedevstack.conversationsplus.dto.LoadAvatarFor; -import de.thedevstack.conversationsplus.enums.MessageDirection; import de.thedevstack.conversationsplus.enums.MessageStatus; import de.thedevstack.conversationsplus.utils.MessageUtil; import de.thedevstack.conversationsplus.Config; @@ -30,6 +29,7 @@ import de.thedevstack.conversationsplus.crypto.axolotl.AxolotlService; import de.thedevstack.conversationsplus.xmpp.chatstate.ChatState; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class Conversation extends AbstractEntity implements Blockable, LoadAvatarFor { public static final String TABLENAME = "conversations"; @@ -461,7 +461,7 @@ public class Conversation extends AbstractEntity implements Blockable, LoadAvata public static Conversation fromCursor(Cursor cursor) { Jid jid; try { - jid = Jid.fromString(cursor.getString(cursor.getColumnIndex(CONTACTJID)), true); + jid = JidUtil.fromString(cursor.getString(cursor.getColumnIndex(CONTACTJID)), true); } catch (final InvalidJidException e) { // Borked DB.. jid = null; @@ -826,7 +826,7 @@ public class Conversation extends AbstractEntity implements Blockable, LoadAvata JSONArray array = this.attributes.getJSONArray(key); for (int i = 0; i < array.length(); ++i) { try { - list.add(Jid.fromString(array.getString(i))); + list.add(JidUtil.fromString(array.getString(i))); } catch (InvalidJidException e) { //ignored } diff --git a/src/main/java/de/thedevstack/conversationsplus/entities/Message.java b/src/main/java/de/thedevstack/conversationsplus/entities/Message.java index 86adb4af..debcaca1 100644 --- a/src/main/java/de/thedevstack/conversationsplus/entities/Message.java +++ b/src/main/java/de/thedevstack/conversationsplus/entities/Message.java @@ -17,6 +17,7 @@ import de.thedevstack.conversationsplus.utils.MessageParserUtil; import de.thedevstack.conversationsplus.utils.MimeUtils; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class Message extends AbstractEntity implements LoadAvatarFor { @@ -151,7 +152,7 @@ public class Message extends AbstractEntity implements LoadAvatarFor { try { String value = cursor.getString(cursor.getColumnIndex(COUNTERPART)); if (value != null) { - jid = Jid.fromString(value, true); + jid = JidUtil.fromString(value, true); } else { jid = null; } @@ -162,7 +163,7 @@ public class Message extends AbstractEntity implements LoadAvatarFor { try { String value = cursor.getString(cursor.getColumnIndex(TRUE_COUNTERPART)); if (value != null) { - trueCounterpart = Jid.fromString(value, true); + trueCounterpart = JidUtil.fromString(value, true); } else { trueCounterpart = null; } @@ -449,7 +450,7 @@ public class Message extends AbstractEntity implements LoadAvatarFor { return true; } else if (presences.size() >= 1) { try { - counterpart = Jid.fromParts(conversation.getJid().getLocalpart(), + counterpart = JidUtil.fromParts(conversation.getJid().getLocalpart(), conversation.getJid().getDomainpart(), presences.asStringArray()[0]); return true; diff --git a/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java b/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java index abc45f0b..6b578c2b 100644 --- a/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java +++ b/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java @@ -17,6 +17,7 @@ import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.dto.Avatar; import de.thedevstack.conversationsplus.xmpp.mam.Mam; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; @SuppressLint("DefaultLocale") public class MucOptions { @@ -463,7 +464,7 @@ public class MucOptions { public Jid createJoinJid(String nick) { try { - return Jid.fromString(this.conversation.getJid().toBareJid().toString() + "/" + nick); + return JidUtil.fromString(this.conversation.getJid().toBareJid().toString() + "/" + nick); } catch (final InvalidJidException e) { return null; } diff --git a/src/main/java/de/thedevstack/conversationsplus/persistance/DatabaseBackend.java b/src/main/java/de/thedevstack/conversationsplus/persistance/DatabaseBackend.java index fd227e5a..d006628e 100644 --- a/src/main/java/de/thedevstack/conversationsplus/persistance/DatabaseBackend.java +++ b/src/main/java/de/thedevstack/conversationsplus/persistance/DatabaseBackend.java @@ -50,6 +50,7 @@ import de.thedevstack.conversationsplus.persistance.db.access.MessageDatabaseAcc import de.thedevstack.conversationsplus.utils.SimpleCryptoUtil; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class DatabaseBackend extends SQLiteOpenHelper { @@ -297,7 +298,7 @@ public class DatabaseBackend extends SQLiteOpenHelper { while (cursor.moveToNext()) { String newJid; try { - newJid = Jid.fromString( + newJid = JidUtil.fromString( cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID)) ).toString(); } catch (InvalidJidException ignored) { @@ -322,7 +323,7 @@ public class DatabaseBackend extends SQLiteOpenHelper { while (cursor.moveToNext()) { String newJid; try { - newJid = Jid.fromString( + newJid = JidUtil.fromString( cursor.getString(cursor.getColumnIndex(Contact.JID)) ).toString(); } catch (InvalidJidException ignored) { @@ -349,7 +350,7 @@ public class DatabaseBackend extends SQLiteOpenHelper { while (cursor.moveToNext()) { String newServer; try { - newServer = Jid.fromParts( + newServer = JidUtil.fromParts( cursor.getString(cursor.getColumnIndex(Account.USERNAME)), cursor.getString(cursor.getColumnIndex(Account.SERVER)), "mobile" diff --git a/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java b/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java index 2285a29d..a6dff1f0 100644 --- a/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java +++ b/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java @@ -55,7 +55,6 @@ import java.util.concurrent.CopyOnWriteArrayList; import de.thedevstack.android.logcat.Logging; import de.thedevstack.conversationsplus.ConversationsPlusApplication; import de.thedevstack.conversationsplus.ConversationsPlusPreferences; -import de.thedevstack.conversationsplus.enums.MessageDirection; import de.thedevstack.conversationsplus.enums.MessageStatus; import de.thedevstack.conversationsplus.services.avatar.AvatarCache; import de.thedevstack.conversationsplus.services.avatar.AvatarService; @@ -83,6 +82,7 @@ import de.thedevstack.conversationsplus.xmpp.openpgp.OpenPgpXep; import de.thedevstack.conversationsplus.xmpp.ping.PingXep; import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacketReceiver; import de.thedevstack.conversationsplus.xmpp.time.EntityTimeXep; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; import de.tzur.conversations.Settings; import de.thedevstack.conversationsplus.Config; import de.thedevstack.conversationsplus.R; @@ -406,7 +406,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa case ACTION_DISABLE_ACCOUNT: try { String jid = intent.getStringExtra("account"); - Account account = jid == null ? null : findAccountByJid(Jid.fromString(jid)); + Account account = jid == null ? null : findAccountByJid(JidUtil.fromString(jid)); if (account != null) { account.setOption(Account.OPTION_DISABLED, true); updateAccount(account); @@ -795,7 +795,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa SessionImpl otrSession = conversation.getOtrSession(); if (otrSession != null && otrSession.getSessionStatus() == SessionStatus.ENCRYPTED) { try { - message.setCounterpart(Jid.fromSessionID(otrSession.getSessionID())); + message.setCounterpart(JidUtil.fromSessionID(otrSession.getSessionID())); } catch (InvalidJidException e) { break; } @@ -992,7 +992,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } Jid jid; try { - jid = Jid.fromString(phoneContact.getString("jid")); + jid = JidUtil.fromString(phoneContact.getString("jid")); } catch (final InvalidJidException e) { continue; } @@ -1789,7 +1789,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa return; } String name = new BigInteger(75, ConversationsPlusApplication.getSecureRandom()).toString(32); - Jid jid = Jid.fromParts(name, server, null); + Jid jid = JidUtil.fromParts(name, server, null); final Conversation conversation = findOrCreateConversation(account, jid, true); joinMuc(conversation, new OnConferenceJoined() { @Override @@ -2002,7 +2002,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void onMessageFound(Message message) { SessionID id = otrSession.getSessionID(); try { - message.setCounterpart(Jid.fromString(id.getAccountID() + "/" + id.getUserID())); + message.setCounterpart(JidUtil.fromString(id.getAccountID() + "/" + id.getUserID())); } catch (InvalidJidException e) { return; } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/ContactDetailsActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/ContactDetailsActivity.java index 245b7a38..9b054d03 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/ContactDetailsActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/ContactDetailsActivity.java @@ -44,7 +44,6 @@ import de.thedevstack.conversationsplus.crypto.axolotl.XmppAxolotlSession; import de.thedevstack.conversationsplus.entities.Account; import de.thedevstack.conversationsplus.entities.Contact; import de.thedevstack.conversationsplus.entities.ListItem; -import de.thedevstack.conversationsplus.services.avatar.AvatarService; import de.thedevstack.conversationsplus.services.XmppConnectionService.OnAccountUpdate; import de.thedevstack.conversationsplus.services.XmppConnectionService.OnRosterUpdate; import de.thedevstack.conversationsplus.utils.CryptoHelper; @@ -55,6 +54,7 @@ import de.thedevstack.conversationsplus.xmpp.OnUpdateBlocklist; import de.thedevstack.conversationsplus.xmpp.XmppConnection; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class ContactDetailsActivity extends XmppActivity implements OnAccountUpdate, OnRosterUpdate, OnUpdateBlocklist, OnKeyStatusUpdated { public static final String ACTION_VIEW_CONTACT = "view_contact"; @@ -184,11 +184,11 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd super.onCreate(savedInstanceState); if (getIntent().getAction().equals(ACTION_VIEW_CONTACT)) { try { - this.accountJid = Jid.fromString(getIntent().getExtras().getString(EXTRA_ACCOUNT)); + this.accountJid = JidUtil.fromString(getIntent().getExtras().getString(EXTRA_ACCOUNT)); } catch (final InvalidJidException ignored) { } try { - this.contactJid = Jid.fromString(getIntent().getExtras().getString("contact")); + this.contactJid = JidUtil.fromString(getIntent().getExtras().getString("contact")); } catch (final InvalidJidException ignored) { } } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/ConversationActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/ConversationActivity.java index 69c1f817..f3e2539a 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/ConversationActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/ConversationActivity.java @@ -50,6 +50,7 @@ import de.thedevstack.conversationsplus.services.filetransfer.FileTransferManage import de.thedevstack.conversationsplus.utils.AccountUtil; import de.thedevstack.conversationsplus.utils.UIHelper; import de.thedevstack.conversationsplus.xmpp.chatstate.ChatState; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; import de.timroes.android.listview.EnhancedListView; import de.thedevstack.conversationsplus.Config; @@ -1249,7 +1250,7 @@ public class ConversationActivity extends XmppActivity if (pm) { Jid jid = getSelectedConversation().getJid(); try { - Jid next = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), nick); + Jid next = JidUtil.fromParts(jid.getLocalpart(), jid.getDomainpart(), nick); this.privateMessageWith(next); } catch (final InvalidJidException ignored) { //do nothing diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/EditAccountActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/EditAccountActivity.java index 725e10a9..1f8fd7f7 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/EditAccountActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/EditAccountActivity.java @@ -61,6 +61,7 @@ import de.thedevstack.conversationsplus.xmpp.forms.Data; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.dto.Avatar; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class EditAccountActivity extends XmppActivity implements OnAccountUpdate, OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched { @@ -132,9 +133,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate final Jid jid; try { if (Config.DOMAIN_LOCK != null) { - jid = Jid.fromParts(mAccountJid.getText().toString(), Config.DOMAIN_LOCK, null); + jid = JidUtil.fromParts(mAccountJid.getText().toString(), Config.DOMAIN_LOCK, null); } else { - jid = Jid.fromString(mAccountJid.getText().toString()); + jid = JidUtil.fromString(mAccountJid.getText().toString()); } } catch (final InvalidJidException e) { if (Config.DOMAIN_LOCK != null) { @@ -504,7 +505,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate super.onStart(); if (getIntent() != null) { try { - this.jidToEdit = Jid.fromString(getIntent().getStringExtra("jid")); + this.jidToEdit = JidUtil.fromString(getIntent().getStringExtra("jid")); } catch (final InvalidJidException | NullPointerException ignored) { this.jidToEdit = null; } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/EnterJidDialog.java b/src/main/java/de/thedevstack/conversationsplus/ui/EnterJidDialog.java index 9e52d390..5bef1624 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/EnterJidDialog.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/EnterJidDialog.java @@ -16,6 +16,7 @@ import de.thedevstack.conversationsplus.R; import de.thedevstack.conversationsplus.ui.adapter.KnownHostsAdapter; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class EnterJidDialog { public interface OnEnterJidDialogPositiveListener { @@ -91,9 +92,9 @@ public class EnterJidDialog { } try { if (Config.DOMAIN_LOCK != null) { - accountJid = Jid.fromParts((String) spinner.getSelectedItem(), Config.DOMAIN_LOCK, null); + accountJid = JidUtil.fromParts((String) spinner.getSelectedItem(), Config.DOMAIN_LOCK, null); } else { - accountJid = Jid.fromString((String) spinner.getSelectedItem()); + accountJid = JidUtil.fromString((String) spinner.getSelectedItem()); } } catch (final InvalidJidException e) { return; @@ -101,9 +102,9 @@ public class EnterJidDialog { final Jid contactJid; try { if (lock) { - contactJid = Jid.fromParts(jid.getText().toString(), Config.DOMAIN_LOCK, null); + contactJid = JidUtil.fromParts(jid.getText().toString(), Config.DOMAIN_LOCK, null); } else { - contactJid = Jid.fromString(jid.getText().toString()); + contactJid = JidUtil.fromString(jid.getText().toString()); } } catch (final InvalidJidException e) { jid.setError(context.getString(lock ? R.string.invalid_username : R.string.invalid_jid)); diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/ManageAccountActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/ManageAccountActivity.java index e376b6b3..b620f1ed 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/ManageAccountActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/ManageAccountActivity.java @@ -35,6 +35,7 @@ import de.thedevstack.conversationsplus.services.XmppConnectionService.OnAccount import de.thedevstack.conversationsplus.ui.adapter.AccountAdapter; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class ManageAccountActivity extends XmppActivity implements OnAccountUpdate, KeyChainAliasCallback, XmppConnectionService.OnAccountCreated { @@ -81,7 +82,7 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda String jid = savedInstanceState.getString(STATE_SELECTED_ACCOUNT); if (jid != null) { try { - this.selectedAccountJid = Jid.fromString(jid); + this.selectedAccountJid = JidUtil.fromString(jid); } catch (InvalidJidException e) { this.selectedAccountJid = null; } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/ShareWithActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/ShareWithActivity.java index 080c7a51..117e0160 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/ShareWithActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/ShareWithActivity.java @@ -34,7 +34,7 @@ import de.thedevstack.conversationsplus.utils.ConversationUtil; import de.thedevstack.conversationsplus.utils.FileUtils; import de.thedevstack.conversationsplus.utils.MessageUtil; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; -import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class ShareWithActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate { @@ -250,7 +250,7 @@ public class ShareWithActivity extends XmppActivity implements XmppConnectionSer }else{ Account account; try { - account = xmppConnectionService.findAccountByJid(Jid.fromString(share.account)); + account = xmppConnectionService.findAccountByJid(JidUtil.fromString(share.account)); } catch (final InvalidJidException e) { account = null; } @@ -260,7 +260,7 @@ public class ShareWithActivity extends XmppActivity implements XmppConnectionSer try { conversation = xmppConnectionService - .findOrCreateConversation(account, Jid.fromString(share.contact), false); + .findOrCreateConversation(account, JidUtil.fromString(share.contact), false); } catch (final InvalidJidException e) { return; } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/StartConversationActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/StartConversationActivity.java index 2dc8d1a5..d159d044 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/StartConversationActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/StartConversationActivity.java @@ -74,6 +74,7 @@ import de.thedevstack.conversationsplus.xmpp.OnUpdateBlocklist; import de.thedevstack.conversationsplus.xmpp.XmppConnection; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class StartConversationActivity extends XmppActivity implements OnRosterUpdate, OnUpdateBlocklist { @@ -424,9 +425,9 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU final Jid conferenceJid; try { if (lock) { - conferenceJid = Jid.fromParts(jid.getText().toString(),Config.CONFERENCE_DOMAIN_LOCK, null); + conferenceJid = JidUtil.fromParts(jid.getText().toString(),Config.CONFERENCE_DOMAIN_LOCK, null); } else { - conferenceJid = Jid.fromString(jid.getText().toString()); + conferenceJid = JidUtil.fromString(jid.getText().toString()); } } catch (final InvalidJidException e) { jid.setError(getString(lock ? R.string.invalid_conference_name : R.string.invalid_jid)); @@ -476,9 +477,9 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU Jid jid; try { if (Config.DOMAIN_LOCK != null) { - jid = Jid.fromParts((String) spinner.getSelectedItem(), Config.DOMAIN_LOCK, null); + jid = JidUtil.fromParts((String) spinner.getSelectedItem(), Config.DOMAIN_LOCK, null); } else { - jid = Jid.fromString((String) spinner.getSelectedItem()); + jid = JidUtil.fromString((String) spinner.getSelectedItem()); } } catch (final InvalidJidException e) { return null; diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/TrustKeysActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/TrustKeysActivity.java index dfddbb78..850a6c38 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/TrustKeysActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/TrustKeysActivity.java @@ -28,6 +28,7 @@ import de.thedevstack.conversationsplus.utils.ui.TextViewUtil; import de.thedevstack.conversationsplus.xmpp.OnKeyStatusUpdated; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class TrustKeysActivity extends XmppActivity implements OnKeyStatusUpdated { private List contactJids; @@ -77,7 +78,7 @@ public class TrustKeysActivity extends XmppActivity implements OnKeyStatusUpdate this.contactJids = new ArrayList<>(); for(String jid : getIntent().getStringArrayExtra("contacts")) { try { - this.contactJids.add(Jid.fromString(jid)); + this.contactJids.add(JidUtil.fromString(jid)); } catch (InvalidJidException e) { e.printStackTrace(); } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/VerifyOTRActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/VerifyOTRActivity.java index d6b3d838..fe427361 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/VerifyOTRActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/VerifyOTRActivity.java @@ -29,7 +29,7 @@ import de.thedevstack.conversationsplus.utils.CryptoHelper; import de.thedevstack.conversationsplus.utils.XmppUri; import de.thedevstack.conversationsplus.utils.ui.TextViewUtil; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; -import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class VerifyOTRActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate { @@ -203,7 +203,7 @@ public class VerifyOTRActivity extends XmppActivity implements XmppConnectionSer return false; } try { - this.mConversation = this.xmppConnectionService.find(this.mAccount,Jid.fromString(intent.getExtras().getString("contact"))); + this.mConversation = this.xmppConnectionService.find(this.mAccount, JidUtil.fromString(intent.getExtras().getString("contact"))); if (this.mConversation == null) { return false; } diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/XmppActivity.java b/src/main/java/de/thedevstack/conversationsplus/ui/XmppActivity.java index 21292cec..516bd214 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/XmppActivity.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/XmppActivity.java @@ -70,6 +70,7 @@ import de.thedevstack.conversationsplus.xmpp.OnKeyStatusUpdated; import de.thedevstack.conversationsplus.xmpp.OnUpdateBlocklist; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public abstract class XmppActivity extends Activity { @@ -771,7 +772,7 @@ public abstract class XmppActivity extends Activity { SessionID id = conversation.getOtrSession().getSessionID(); Jid jid; try { - jid = Jid.fromString(id.getAccountID() + "/" + id.getUserID()); + jid = JidUtil.fromString(id.getAccountID() + "/" + id.getUserID()); } catch (InvalidJidException e) { jid = null; } @@ -796,7 +797,7 @@ public abstract class XmppActivity extends Activity { } else if (presences.size() == 1) { String presence = presences.asStringArray()[0]; try { - conversation.setNextCounterpart(Jid.fromParts(contact.getJid().getLocalpart(),contact.getJid().getDomainpart(),presence)); + conversation.setNextCounterpart(JidUtil.fromParts(contact.getJid().getLocalpart(),contact.getJid().getDomainpart(),presence)); } catch (InvalidJidException e) { conversation.setNextCounterpart(null); } @@ -831,7 +832,7 @@ public abstract class XmppActivity extends Activity { @Override public void onClick(DialogInterface dialog, int which) { try { - conversation.setNextCounterpart(Jid.fromParts(contact.getJid().getLocalpart(),contact.getJid().getDomainpart(),presence.toString())); + conversation.setNextCounterpart(JidUtil.fromParts(contact.getJid().getLocalpart(),contact.getJid().getDomainpart(),presence.toString())); } catch (InvalidJidException e) { conversation.setNextCounterpart(null); } @@ -950,7 +951,7 @@ public abstract class XmppActivity extends Activity { protected Account extractAccount(Intent intent) { String jid = intent != null ? intent.getStringExtra(EXTRA_ACCOUNT) : null; try { - return jid != null ? xmppConnectionService.findAccountByJid(Jid.fromString(jid)) : null; + return jid != null ? xmppConnectionService.findAccountByJid(JidUtil.fromString(jid)) : null; } catch (InvalidJidException e) { return null; } @@ -970,10 +971,10 @@ public abstract class XmppActivity extends Activity { if (data.getBooleanExtra("multiple", false)) { String[] toAdd = data.getStringArrayExtra("contacts"); for (String item : toAdd) { - invite.jids.add(Jid.fromString(item)); + invite.jids.add(JidUtil.fromString(item)); } } else { - invite.jids.add(Jid.fromString(data.getStringExtra("contact"))); + invite.jids.add(JidUtil.fromString(data.getStringExtra("contact"))); } } catch (final InvalidJidException ignored) { return null; diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/forms/FormJidSingleFieldWrapper.java b/src/main/java/de/thedevstack/conversationsplus/ui/forms/FormJidSingleFieldWrapper.java index c86653bf..383e7003 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/forms/FormJidSingleFieldWrapper.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/forms/FormJidSingleFieldWrapper.java @@ -8,7 +8,7 @@ import java.util.List; import de.thedevstack.conversationsplus.R; import de.thedevstack.conversationsplus.xmpp.forms.Field; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; -import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class FormJidSingleFieldWrapper extends FormTextFieldWrapper { @@ -23,7 +23,7 @@ public class FormJidSingleFieldWrapper extends FormTextFieldWrapper { String value = getValue(); if (!value.isEmpty()) { try { - Jid.fromString(value); + JidUtil.fromString(value); } catch (InvalidJidException e) { editText.setError(context.getString(R.string.invalid_jid)); editText.requestFocus(); diff --git a/src/main/java/de/thedevstack/conversationsplus/utils/CryptoHelper.java b/src/main/java/de/thedevstack/conversationsplus/utils/CryptoHelper.java index 7e4a4fc5..663ea5b5 100644 --- a/src/main/java/de/thedevstack/conversationsplus/utils/CryptoHelper.java +++ b/src/main/java/de/thedevstack/conversationsplus/utils/CryptoHelper.java @@ -26,6 +26,7 @@ import de.thedevstack.conversationsplus.R; import de.thedevstack.conversationsplus.entities.Message; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public final class CryptoHelper { public static final String FILETRANSFER = "?FILETRANSFERv1:"; @@ -150,7 +151,7 @@ public final class CryptoHelper { } String name = IETFUtils.valueToString(x500name.getRDNs(BCStyle.CN)[0].getFirst().getValue()); if (emails.size() >= 1) { - return new Pair<>(Jid.fromString(emails.get(0)), name); + return new Pair<>(JidUtil.fromString(emails.get(0)), name); } else { return null; } diff --git a/src/main/java/de/thedevstack/conversationsplus/utils/ExceptionHelper.java b/src/main/java/de/thedevstack/conversationsplus/utils/ExceptionHelper.java index 907e7fd7..ac160960 100644 --- a/src/main/java/de/thedevstack/conversationsplus/utils/ExceptionHelper.java +++ b/src/main/java/de/thedevstack/conversationsplus/utils/ExceptionHelper.java @@ -25,7 +25,7 @@ import de.thedevstack.conversationsplus.entities.Message; import de.thedevstack.conversationsplus.services.XmppConnectionService; import de.thedevstack.conversationsplus.ui.ConversationActivity; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; -import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class ExceptionHelper { public static void init(Context context) { @@ -92,7 +92,7 @@ public class ExceptionHelper { Conversation conversation = null; try { conversation = service.findOrCreateConversation(finalAccount, - Jid.fromString(activity.getString(R.string.cplus_bugreport_jabberid)), false); + JidUtil.fromString(activity.getString(R.string.cplus_bugreport_jabberid)), false); } catch (final InvalidJidException ignored) { } Message message = MessageUtil.createOutgoingMessage(conversation, report.toString()); diff --git a/src/main/java/de/thedevstack/conversationsplus/utils/XmppUri.java b/src/main/java/de/thedevstack/conversationsplus/utils/XmppUri.java index 5d3a2694..8d5967b6 100644 --- a/src/main/java/de/thedevstack/conversationsplus/utils/XmppUri.java +++ b/src/main/java/de/thedevstack/conversationsplus/utils/XmppUri.java @@ -7,6 +7,7 @@ import java.net.URLDecoder; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class XmppUri { @@ -19,7 +20,7 @@ public class XmppUri { parse(Uri.parse(uri)); } catch (IllegalArgumentException e) { try { - jid = Jid.fromString(uri).toBareJid().toString(); + jid = JidUtil.fromString(uri).toBareJid().toString(); } catch (InvalidJidException e2) { jid = null; } @@ -50,7 +51,7 @@ public class XmppUri { } } else { try { - jid = Jid.fromString(uri.toString()).toBareJid().toString(); + jid = JidUtil.fromString(uri.toString()).toBareJid().toString(); } catch (final InvalidJidException ignored) { jid = null; } @@ -73,7 +74,7 @@ public class XmppUri { public Jid getJid() { try { - return this.jid == null ? null :Jid.fromString(this.jid.toLowerCase()); + return this.jid == null ? null : JidUtil.fromString(this.jid.toLowerCase()); } catch (InvalidJidException e) { return null; } diff --git a/src/main/java/de/thedevstack/conversationsplus/xml/Element.java b/src/main/java/de/thedevstack/conversationsplus/xml/Element.java index 95ed4c4e..ba37d6c0 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xml/Element.java +++ b/src/main/java/de/thedevstack/conversationsplus/xml/Element.java @@ -8,6 +8,7 @@ import de.thedevstack.android.logcat.Logging; import de.thedevstack.conversationsplus.Config; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class Element { private final String name; @@ -37,7 +38,6 @@ public class Element { public Element addChild(String name, String xmlns) { Element child = new Element(name); child.setAttribute("xmlns", xmlns); - children.add(child); return this.addChild(child); } @@ -47,7 +47,7 @@ public class Element { public Element setContent(String content) { this.content = content; - this.children.clear(); + this.clearChildren(); return this; } @@ -159,7 +159,7 @@ public class Element { final String jid = this.getAttribute(name); if (jid != null && !jid.isEmpty()) { try { - return Jid.fromString(jid); + return JidUtil.fromString(jid); } catch (final InvalidJidException e) { Logging.e(Config.LOGTAG, "could not parse jid " + jid); return null; diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java index f6e6edb8..14f2a648 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java @@ -96,6 +96,7 @@ import de.thedevstack.conversationsplus.xmpp.stanzas.streammgmt.AckPacket; import de.thedevstack.conversationsplus.xmpp.stanzas.streammgmt.EnablePacket; import de.thedevstack.conversationsplus.xmpp.stanzas.streammgmt.RequestPacket; import de.thedevstack.conversationsplus.xmpp.stanzas.streammgmt.ResumePacket; +import de.thedevstack.conversationsplus.xmpp.jid.JidUtil; public class XmppConnection implements Runnable { private static final int DEFAULT_PORT = 5222; @@ -898,7 +899,7 @@ public class XmppConnection implements Runnable { final Element jid = bind.findChild("jid"); if (jid != null && jid.getContent() != null) { try { - account.setResource(Jid.fromString(jid.getContent()).getResourcepart()); + account.setResource(JidUtil.fromString(jid.getContent()).getResourcepart()); } catch (final InvalidJidException e) { // TODO: Handle the case where an external JID is technically invalid? } diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/forms/Field.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/forms/Field.java index 88b3155c..0509d473 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/forms/Field.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/forms/Field.java @@ -23,12 +23,12 @@ public class Field extends Element { } public void setValue(String value) { - this.children.clear(); + this.clearChildren(); this.addChild("value").setContent(value); } public void setValues(Collection values) { - this.children.clear(); + this.clearChildren(); for(String value : values) { this.addChild("value").setContent(value); } diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/Jid.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/Jid.java index bb32e821..a85c0bed 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/Jid.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/Jid.java @@ -1,22 +1,12 @@ package de.thedevstack.conversationsplus.xmpp.jid; -import android.util.LruCache; - -import net.java.otr4j.session.SessionID; - import java.net.IDN; -import de.thedevstack.conversationsplus.Config; -import gnu.inet.encoding.Stringprep; -import gnu.inet.encoding.StringprepException; - /** * The `Jid' class provides an immutable representation of a JID. */ public final class Jid { - private static LruCache cache = new LruCache<>(1024); - private final String localpart; private final String domainpart; private final String resourcepart; @@ -37,143 +27,16 @@ public final class Jid { return resourcepart; } - public static Jid fromSessionID(final SessionID id) throws InvalidJidException{ - if (id.getUserID().isEmpty()) { - return Jid.fromString(id.getAccountID()); - } else { - return Jid.fromString(id.getAccountID()+"/"+id.getUserID()); - } - } - - public static Jid fromString(final String jid) throws InvalidJidException { - 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, - final String domainpart, - final String resourcepart) throws InvalidJidException { - String out; - if (localpart == null || localpart.isEmpty()) { - out = domainpart; - } else { - out = localpart + "@" + domainpart; - } - if (resourcepart != null && !resourcepart.isEmpty()) { - out = out + "/" + resourcepart; - } - return new Jid(out, false); - } - - 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); - if (fromCache != null) { - displayjid = fromCache.displayjid; - localpart = fromCache.localpart; - domainpart = fromCache.domainpart; - resourcepart = fromCache.resourcepart; - return; - } - - // Hackish Android way to count the number of chars in a string... should work everywhere. - final int atCount = jid.length() - jid.replace("@", "").length(); - final int slashCount = jid.length() - jid.replace("/", "").length(); - - // Throw an error if there's anything obvious wrong with the JID... - if (jid.isEmpty() || jid.length() > 3071) { - throw new InvalidJidException(InvalidJidException.INVALID_LENGTH); - } - - // Go ahead and check if the localpart or resourcepart is empty. - if (jid.startsWith("@") || (jid.endsWith("@") && slashCount == 0) || jid.startsWith("/") || (jid.endsWith("/") && slashCount < 2)) { - throw new InvalidJidException(InvalidJidException.INVALID_CHARACTER); - } - - String finaljid; - - final int domainpartStart; - final int atLoc = jid.indexOf("@"); - final int slashLoc = jid.indexOf("/"); - // If there is no "@" in the JID (eg. "example.net" or "example.net/resource") - // 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)) { - localpart = ""; - finaljid = ""; - domainpartStart = 0; - } else { - final String lp = jid.substring(0, atLoc); - try { - localpart = Config.DISABLE_STRING_PREP || safe ? lp : Stringprep.nodeprep(lp); - } catch (final StringprepException e) { - throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); - } - if (localpart.isEmpty() || localpart.length() > 1023) { - throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); - } - domainpartStart = atLoc + 1; - finaljid = lp + "@"; - } - - final String dp; - if (slashCount > 0) { - final String rp = jid.substring(slashLoc + 1, jid.length()); - try { - resourcepart = Config.DISABLE_STRING_PREP || safe ? rp : Stringprep.resourceprep(rp); - } catch (final StringprepException e) { - throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); - } - if (resourcepart.isEmpty() || resourcepart.length() > 1023) { - throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); - } - try { - dp = IDN.toUnicode(Stringprep.nameprep(jid.substring(domainpartStart, slashLoc)), IDN.USE_STD3_ASCII_RULES); - } catch (final StringprepException e) { - throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); - } - finaljid = finaljid + dp + "/" + rp; - } else { - resourcepart = ""; - try{ - dp = IDN.toUnicode(Stringprep.nameprep(jid.substring(domainpartStart, jid.length())), IDN.USE_STD3_ASCII_RULES); - } catch (final StringprepException e) { - throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); - } - finaljid = finaljid + dp; - } - - // Remove trailing "." before storing the domain part. - if (dp.endsWith(".")) { - try { - domainpart = IDN.toASCII(dp.substring(0, dp.length() - 1), IDN.USE_STD3_ASCII_RULES); - } catch (final IllegalArgumentException e) { - throw new InvalidJidException(e); - } - } else { - try { - domainpart = IDN.toASCII(dp, IDN.USE_STD3_ASCII_RULES); - } catch (final IllegalArgumentException e) { - throw new InvalidJidException(e); - } - } - - // TODO: Find a proper domain validation library; validate individual parts, separators, etc. - if (domainpart.isEmpty() || domainpart.length() > 1023) { - throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); - } - - Jid.cache.put(jid, this); - - this.displayjid = finaljid; + Jid(String displayjid, String local, String domain, String resource) throws InvalidJidException { + this.displayjid = displayjid; + this.localpart = local; + this.domainpart = (null == domain) ? "" : domain; + this.resourcepart = (null == resource) ? "" : resource; } public Jid toBareJid() { try { - return resourcepart.isEmpty() ? this : fromParts(localpart, domainpart, ""); + return resourcepart.isEmpty() ? this : JidUtil.fromParts(localpart, domainpart, ""); } catch (final InvalidJidException e) { // This should never happen. throw new AssertionError("Jid " + this.toString() + " invalid"); @@ -182,7 +45,7 @@ public final class Jid { public Jid toDomainJid() { try { - return resourcepart.isEmpty() && localpart.isEmpty() ? this : fromString(getDomainpart()); + return resourcepart.isEmpty() && localpart.isEmpty() ? this : JidUtil.fromString(getDomainpart()); } catch (final InvalidJidException e) { // This should never happen. throw new AssertionError("Jid " + this.toString() + " invalid"); diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/JidUtil.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/JidUtil.java new file mode 100644 index 00000000..433f1f4f --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/jid/JidUtil.java @@ -0,0 +1,145 @@ +package de.thedevstack.conversationsplus.xmpp.jid; + +import android.util.LruCache; + +import net.java.otr4j.session.SessionID; + +import java.net.IDN; + +import gnu.inet.encoding.Stringprep; +import gnu.inet.encoding.StringprepException; + +/** + */ +public class JidUtil { + private static LruCache cache = new LruCache<>(1024); + + public static Jid fromSessionID(final SessionID id) throws InvalidJidException { + if (id.getUserID().isEmpty()) { + return fromString(id.getAccountID()); + } else { + return fromString(id.getAccountID()+"/"+id.getUserID()); + } + } + + public static Jid fromString(final String jid) throws InvalidJidException { + return fromString(jid, false); + } + + public static Jid fromString(final String jid, final boolean safe) throws InvalidJidException { + if (jid == null) throw new InvalidJidException(InvalidJidException.IS_NULL); + + Jid fromCache = JidUtil.cache.get(jid); + if (fromCache != null) { + return fromCache; + } + + // Hackish Android way to count the number of chars in a string... should work everywhere. + final int atCount = jid.length() - jid.replace("@", "").length(); + final int slashCount = jid.length() - jid.replace("/", "").length(); + + // Throw an error if there's anything obvious wrong with the JID... + if (jid.isEmpty() || jid.length() > 3071) { + throw new InvalidJidException(InvalidJidException.INVALID_LENGTH); + } + + // Go ahead and check if the localpart or resourcepart is empty. + if (jid.startsWith("@") || (jid.endsWith("@") && slashCount == 0) || jid.startsWith("/") || (jid.endsWith("/") && slashCount < 2)) { + throw new InvalidJidException(InvalidJidException.INVALID_CHARACTER); + } + + String finaljid; + String localpart; + String domainpart; + String resourcepart; + + final int domainpartStart; + final int atLoc = jid.indexOf("@"); + final int slashLoc = jid.indexOf("/"); + // If there is no "@" in the JID (eg. "example.net" or "example.net/resource") + // 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)) { + localpart = ""; + finaljid = ""; + domainpartStart = 0; + } else { + final String lp = jid.substring(0, atLoc); + try { + localpart = safe ? lp : Stringprep.nodeprep(lp); + } catch (final StringprepException e) { + throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); + } + if (localpart.isEmpty() || localpart.length() > 1023) { + throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); + } + domainpartStart = atLoc + 1; + finaljid = lp + "@"; + } + + final String dp; + if (slashCount > 0) { + final String rp = jid.substring(slashLoc + 1, jid.length()); + try { + resourcepart = safe ? rp : Stringprep.resourceprep(rp); + } catch (final StringprepException e) { + throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); + } + if (resourcepart.isEmpty() || resourcepart.length() > 1023) { + throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); + } + try { + dp = IDN.toUnicode(Stringprep.nameprep(jid.substring(domainpartStart, slashLoc)), IDN.USE_STD3_ASCII_RULES); + } catch (final StringprepException e) { + throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); + } + finaljid = finaljid + dp + "/" + rp; + } else { + resourcepart = ""; + try{ + dp = IDN.toUnicode(Stringprep.nameprep(jid.substring(domainpartStart, jid.length())), IDN.USE_STD3_ASCII_RULES); + } catch (final StringprepException e) { + throw new InvalidJidException(InvalidJidException.STRINGPREP_FAIL, e); + } + finaljid = finaljid + dp; + } + + // Remove trailing "." before storing the domain part. + if (dp.endsWith(".")) { + try { + domainpart = IDN.toASCII(dp.substring(0, dp.length() - 1), IDN.USE_STD3_ASCII_RULES); + } catch (final IllegalArgumentException e) { + throw new InvalidJidException(e); + } + } else { + try { + domainpart = IDN.toASCII(dp, IDN.USE_STD3_ASCII_RULES); + } catch (final IllegalArgumentException e) { + throw new InvalidJidException(e); + } + } + + // TODO: Find a proper domain validation library; validate individual parts, separators, etc. + if (domainpart.isEmpty() || domainpart.length() > 1023) { + throw new InvalidJidException(InvalidJidException.INVALID_PART_LENGTH); + } + + Jid createdJid = new Jid(finaljid, localpart, domainpart, resourcepart); + + JidUtil.cache.put(jid, createdJid); + + return createdJid; + } + + public static Jid fromParts(final String localpart, final String domainpart, final String resourcepart) throws InvalidJidException { + String out; + if (localpart == null || localpart.isEmpty()) { + out = domainpart; + } else { + out = localpart + "@" + domainpart; + } + if (resourcepart != null && !resourcepart.isEmpty()) { + out = out + "/" + resourcepart; + } + return JidUtil.fromString(out, false); + } +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/stanzas/JinglePacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/stanzas/JinglePacket.java index db771a0a..63e86c24 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/stanzas/JinglePacket.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/jingle/stanzas/JinglePacket.java @@ -51,7 +51,7 @@ public class JinglePacket extends IqPacket { } private void build() { - this.children.clear(); + this.clearChildren(); this.jingle.clearChildren(); this.jingle.setAttribute("xmlns", "urn:xmpp:jingle:1"); if (this.content != null) { @@ -60,7 +60,7 @@ public class JinglePacket extends IqPacket { if (this.reason != null) { jingle.addChild(this.reason); } - this.children.add(jingle); + this.addChild(jingle); this.setAttribute("type", "set"); } -- cgit v1.2.3