From f0a0796d339f37d546f971cc879e8bd87db2b461 Mon Sep 17 00:00:00 2001 From: Jonathan Lennox Date: Thu, 9 Sep 2021 17:28:25 +0000 Subject: [PATCH 01/20] Update documentation of default SecurityMode. --- .../java/org/jivesoftware/smack/ConnectionConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java index 23e664e94..2a0165009 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionConfiguration.java @@ -405,7 +405,7 @@ public abstract class ConnectionConfiguration { /** * Returns the TLS security mode used when making the connection. By default, - * the mode is {@link SecurityMode#ifpossible}. + * the mode is {@link SecurityMode#required}. * * @return the security mode. */ @@ -960,7 +960,7 @@ public abstract class ConnectionConfiguration { /** * Sets the TLS security mode used when making the connection. By default, - * the mode is {@link SecurityMode#ifpossible}. + * the mode is {@link SecurityMode#required}. * * @param securityMode the security mode. * @return a reference to this builder. From 8ae5ef1f513d4b3b24c291991215d04f96016453 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 13 Sep 2021 09:55:15 +0200 Subject: [PATCH 02/20] [socks5] Ensure that the local SOCKS5 proxy is running (if enabled) In 9352225f444b ("Rework SOCKS5 unit tests so that they can be run in parallel") the call to getSocks5Proxy() in Socks5BytestreamManager.getLocalStreamHost() was removed. Since getSocks5Proxy() does also start the local proxy, if it is not already running, this caused Smack to no longer automatically start the local proxy. This commit re-adds the call to getSocks5Proxy() and fixes SMACK-912. --- .../smackx/bytestreams/socks5/Socks5BytestreamManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java index f257efa6e..46b438d72 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java @@ -658,6 +658,9 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream * is not running */ public List getLocalStreamHost() { + // Ensure that the local SOCKS5 proxy is running (if enabled). + Socks5Proxy.getSocks5Proxy(); + List streamHosts = new ArrayList<>(); XMPPConnection connection = connection(); From 55299fb7e7c4e3636beba180868cab62f5e06cfe Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 13 Sep 2021 10:10:55 +0200 Subject: [PATCH 03/20] [core] Assert that 'event' is not END_DOCUMENT in forwardToEndTagOfDepth() --- .../src/main/java/org/jivesoftware/smack/util/ParserUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java index 8f67c5ccf..be526aaba 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java @@ -79,6 +79,7 @@ public class ParserUtils { throws XmlPullParserException, IOException { XmlPullParser.Event event = parser.getEventType(); while (!(event == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == depth)) { + assert event != XmlPullParser.Event.END_DOCUMENT; event = parser.next(); } } From 09710b3203ef7110d1566f1cc8d58b70678a8ae0 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 13 Sep 2021 18:23:59 +0200 Subject: [PATCH 04/20] [socks5] Fix javadoc of getLocalStreamHost() The method does no longer return null. Reported-by: Simon Abykov --- .../smackx/bytestreams/socks5/Socks5BytestreamManager.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java index 46b438d72..573a7cb42 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java @@ -652,10 +652,9 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream /** * Returns the stream host information of the local SOCKS5 proxy containing the IP address and - * the port or null if local SOCKS5 proxy is not running. + * the port. The returned list may be empty if the local SOCKS5 proxy is not running. * - * @return the stream host information of the local SOCKS5 proxy or null if local SOCKS5 proxy - * is not running + * @return the stream host information of the local SOCKS5 proxy */ public List getLocalStreamHost() { // Ensure that the local SOCKS5 proxy is running (if enabled). From b57cf8375f38d609ec6c6d9597585d1b49d3f806 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 13 Sep 2021 18:25:44 +0200 Subject: [PATCH 05/20] [socks5] Remove stale null check The method getLocalStreamHost() does no longer return 'null', hence the null check is unnecessary. --- .../smackx/bytestreams/socks5/Socks5BytestreamManager.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java index 573a7cb42..7d8b1a12b 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5BytestreamManager.java @@ -615,9 +615,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream if (annouceLocalStreamHost) { // add local proxy on first position if exists List localProxies = getLocalStreamHost(); - if (localProxies != null) { - streamHosts.addAll(localProxies); - } + streamHosts.addAll(localProxies); } // query SOCKS5 proxies for network settings From 49ad8c0954e31c757f3d5c14f967f7617191135d Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 27 Sep 2021 13:55:52 +0200 Subject: [PATCH 06/20] [disco] Add DisocverInfo.nullSafeContainsFuture(DiscoverInfo, CharSequence) --- .../jivesoftware/smackx/disco/packet/DiscoverInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java index b4d3f7554..abe18f630 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/packet/DiscoverInfo.java @@ -258,6 +258,14 @@ public class DiscoverInfo extends IQ implements DiscoverInfoView { return features.contains(new Feature(feature)); } + public static boolean nullSafeContainsFeature(DiscoverInfo discoverInfo, CharSequence feature) { + if (discoverInfo == null) { + return false; + } + + return discoverInfo.containsFeature(feature); + } + @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { xml.optAttribute("node", getNode()); From ae4ff244a3bd0203cde772107cf2d0ffabaf42d6 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 27 Sep 2021 13:56:15 +0200 Subject: [PATCH 07/20] [muc] Check mucServicedDiscoInfo for null in serviceSupportsStableIds() Fixes SMACK-913. --- .../main/java/org/jivesoftware/smackx/muc/MultiUserChat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index 7e0c0359b..b80f3582d 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -2558,7 +2558,7 @@ public class MultiUserChat { } public boolean serviceSupportsStableIds() { - return mucServiceDiscoInfo.containsFeature(MultiUserChatConstants.STABLE_ID_FEATURE); + return DiscoverInfo.nullSafeContainsFeature(mucServiceDiscoInfo, MultiUserChatConstants.STABLE_ID_FEATURE); } @Override From ec456399b584968ec22892a3c03e8c80e0d0d06f Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Mon, 27 Sep 2021 14:14:01 +0200 Subject: [PATCH 08/20] [carbons] Remove erroneous assert statement in connectionClosed() The assert statement in CarbonManager's connectionClosed() connection listener callback was erroneous. A connection may be connected, but never was authenticated. If now the connection is closed, then carbonsListener was never setup (via the authenticated() callback), causing the assert to throw an exception. --- .../java/org/jivesoftware/smackx/carbons/CarbonManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java index 196484c97..f5b231d1e 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/carbons/CarbonManager.java @@ -154,8 +154,7 @@ public final class CarbonManager extends Manager { // because we also reset in authenticated() if the stream got not resumed, but for maximum correctness, // also reset here. enabled_state = false; - boolean removed = connection().removeSyncStanzaListener(carbonsListener); - assert removed; + connection().removeSyncStanzaListener(carbonsListener); } @Override public void authenticated(XMPPConnection connection, boolean resumed) { From 52a49769f9a825a8c0252efcad0d96635fb257a6 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 5 Oct 2021 20:42:42 +0200 Subject: [PATCH 09/20] [muc] Check for self-presence first in presence listener Fixes SMACK-914 --- .../org/jivesoftware/smackx/muc/MultiUserChat.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index b80f3582d..800b50555 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -212,7 +212,12 @@ public class MultiUserChat { switch (presence.getType()) { case available: Presence oldPresence = occupantsMap.put(from, presence); - if (oldPresence != null) { + if (mucUser.getStatus().contains(MUCUser.Status.PRESENCE_TO_SELF_110)) { + processedReflectedSelfPresence = true; + synchronized (this) { + notify(); + } + } else if (oldPresence != null) { // Get the previous occupant's affiliation & role MUCUser mucExtension = MUCUser.from(oldPresence); MUCAffiliation oldAffiliation = mucExtension.getItem().getAffiliation(); @@ -228,11 +233,6 @@ public class MultiUserChat { newAffiliation, isUserStatusModification, from); - } else if (mucUser.getStatus().contains(MUCUser.Status.PRESENCE_TO_SELF_110)) { - processedReflectedSelfPresence = true; - synchronized (this) { - notify(); - } } else { // A new occupant has joined the room for (ParticipantStatusListener listener : participantStatusListeners) { From 105c74b22bce25ee98a8f68ef65f5c8885abddfc Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 5 Oct 2021 20:47:35 +0200 Subject: [PATCH 10/20] [muc] Call userHasLeft() *after* the leave presence was sent Calling userHasLeft before sending the leave presence may result in invalid state as the MUC presence lister may modify the MUCs local state, e.g., occupantsMap, conurrently with the leave operation. If we reset it after the leave presence was send and acknowledged, then this can not happen as the server will not longer send any MUC related presences to us. Also fixes SMACK-914. In theory 52a49769f9a8 ("[muc] Check for self-presence first in presence listener") alone would fix SMACK-914, but this also fixes it indepentendly of 52a49769f9a8. Both commits are sensible, so both are applied. --- .../org/jivesoftware/smackx/muc/MultiUserChat.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index 800b50555..6e10a66ea 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -789,11 +789,14 @@ public class MultiUserChat { StanzaFilter reflectedLeavePresenceFilter = new AndFilter(reflectedLeavePresenceFilters); - // Reset occupant information first so that we are assume that we left the room even if sendStanza() would - // throw. - userHasLeft(); - - Presence reflectedLeavePresence = connection.createStanzaCollectorAndSend(reflectedLeavePresenceFilter, leavePresence).nextResultOrThrow(); + Presence reflectedLeavePresence; + try { + reflectedLeavePresence = connection.createStanzaCollectorAndSend(reflectedLeavePresenceFilter, leavePresence).nextResultOrThrow(); + } finally { + // Reset occupant information after we send the leave presence. This ensures that we only call userHasLeft() + // and reset the local MUC state after we successfully left the MUC (or if an exception occurred). + userHasLeft(); + } return reflectedLeavePresence; } From 820adf88653e6fe3d6b1e59489379966dfbf5dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BC=D1=8F=D0=BD=20=D0=9C=D0=B8=D0=BD=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Tue, 12 Oct 2021 13:06:05 -0700 Subject: [PATCH 11/20] [muc] Also process destory message if it contains Fixes SMACK-915 --- .../smackx/muc/MultiUserChat.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index b80f3582d..1565b2544 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -259,23 +259,24 @@ public class MultiUserChat { listener.left(from); } } + } - Destroy destroy = mucUser.getDestroy(); - // The room has been destroyed. - if (destroy != null) { - EntityBareJid alternateMucJid = destroy.getJid(); - final MultiUserChat alternateMuc; - if (alternateMucJid == null) { - alternateMuc = null; - } else { - alternateMuc = multiUserChatManager.getMultiUserChat(alternateMucJid); - } + Destroy destroy = mucUser.getDestroy(); + // The room has been destroyed. + if (destroy != null) { + EntityBareJid alternateMucJid = destroy.getJid(); + final MultiUserChat alternateMuc; + if (alternateMucJid == null) { + alternateMuc = null; + } else { + alternateMuc = multiUserChatManager.getMultiUserChat(alternateMucJid); + } - for (UserStatusListener listener : userStatusListeners) { - listener.roomDestroyed(alternateMuc, destroy.getReason()); - } + for (UserStatusListener listener : userStatusListeners) { + listener.roomDestroyed(alternateMuc, destroy.getReason()); } } + if (isUserStatusModification) { for (UserStatusListener listener : userStatusListeners) { listener.removed(mucUser, presence); From 9b339efbc1cff33326f0284c23a3860074ae9457 Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Sat, 16 Oct 2021 21:09:01 +0200 Subject: [PATCH 12/20] Prevent password enforcement for SASL anonymous requirePassword from 92f4aadfdc45c144763c2e2a1921c2fa9a6db90b already excludes SASL external, but missed SASL anonymous. --- .../java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java b/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java index fd99732fe..79b9eff48 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/sasl/core/SASLAnonymous.java @@ -60,4 +60,8 @@ public class SASLAnonymous extends SASLMechanism { // SASL Anonymous is always successful :) } + @Override + public boolean requiresPassword() { + return false; + } } From 8074ddd60a0abe77ea257af4a113e558e69a8c8f Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Sat, 16 Oct 2021 21:22:42 +0200 Subject: [PATCH 13/20] Fix BOSH connection establishment AbstractXMPPConnection waits for the flag lastFeaturesReceived since 57961a8cc1f2df6ecc1afa8c4f8460794d8d2dce, but it is never set from BOSH connections. Use parseFeaturesAndNotify instead of parseFeatures to set the signal. Similarly the XmlEnvironment is not set from bosh, but required in ParserUtils.getXmlLang. --- .../jivesoftware/smack/bosh/XMPPBOSHConnection.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java index c3d7109f8..a88507719 100644 --- a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java +++ b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java @@ -43,6 +43,7 @@ import org.jivesoftware.smack.packet.StanzaError; import org.jivesoftware.smack.util.CloseableUtil; import org.jivesoftware.smack.util.PacketParserUtils; import org.jivesoftware.smack.xml.XmlPullParser; +import org.jivesoftware.smack.xml.XmlPullParserException; import org.igniterealtime.jbosh.AbstractBody; import org.igniterealtime.jbosh.BOSHClient; @@ -200,6 +201,13 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection { + getHost() + ":" + getPort() + "."; throw new SmackException.SmackMessageException(errorMessage); } + + try { + XmlPullParser parser = PacketParserUtils.getParserFor(""); + onStreamOpen(parser); + } catch (XmlPullParserException | IOException e) { + throw new AssertionError("Failed to setup stream environment", e); + } } @Override @@ -511,7 +519,7 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection { parseAndProcessStanza(parser); break; case "features": - parseFeatures(parser); + parseFeaturesAndNotify(parser); break; case "error": // Some BOSH error isn't stream error. From b675aac81b6d4a78b744dbd744baab938d782fdc Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Sun, 17 Oct 2021 15:57:48 +0200 Subject: [PATCH 14/20] Make Smack jars OSGi bundles Fixes SMACK-343 by using bnd instead of the deprecated Gradle plugin that was previously used and removed in commit d06f533bb975f41a5e86c990e1bb830b7e7dc923. --- build.gradle | 14 +++++++++++--- smack-core/build.gradle | 13 +++++++++++++ smack-xmlparser-stax/build.gradle | 15 +++++++++++++++ smack-xmlparser-xpp3/build.gradle | 15 +++++++++++++++ smack-xmlparser/build.gradle | 14 ++++++++++++++ 5 files changed, 68 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index d80fbb28c..3991e96ed 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { dependencies { classpath 'org.kordamp.gradle:clirr-gradle-plugin:0.2.2' classpath "org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.3.1" + classpath "biz.aQute.bnd:biz.aQute.bnd.gradle:6.0.0" } } @@ -413,6 +414,7 @@ subprojects { apply plugin: 'signing' apply plugin: 'checkstyle' apply plugin: 'org.kordamp.gradle.clirr' + apply plugin: 'biz.aQute.bnd.builder' checkstyle { toolVersion = '8.27' @@ -575,9 +577,15 @@ project(':smack-omemo').clirr.enabled = false project(':smack-omemo-signal').clirr.enabled = false subprojects*.jar { - manifest { - from sharedManifest - } + manifest { + from sharedManifest + } + bundle { + bnd( + '-removeheaders': 'Tool, Bnd-*', + '-exportcontents': '*', + ) + } } configure(subprojects - gplLicensedProjects) { diff --git a/smack-core/build.gradle b/smack-core/build.gradle index b0cd79641..6b35345e8 100644 --- a/smack-core/build.gradle +++ b/smack-core/build.gradle @@ -1,3 +1,8 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack core components.""" @@ -55,3 +60,11 @@ task createVersionResource(type: CreateFileTask) { } compileJava.dependsOn(createVersionResource) + +jar { + bundle { + bnd( + 'DynamicImport-Package': '*', + ) + } +} diff --git a/smack-xmlparser-stax/build.gradle b/smack-xmlparser-stax/build.gradle index d4e21ba8f..5012907c1 100644 --- a/smack-xmlparser-stax/build.gradle +++ b/smack-xmlparser-stax/build.gradle @@ -1,3 +1,8 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack XML parser using Stax.""" @@ -5,3 +10,13 @@ dependencies { compile project(':smack-xmlparser') //testCompile project(path: ":smack-xmlparser", configuration: "testRuntime") } + +jar { + bundle { + bnd( + // see http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html + 'Require-Capability': 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"', + 'Provide-Capability': "osgi.serviceloader;osgi.serviceloader=org.jivesoftware.smack.xml.XmlPullParserFactory;register:=org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory", + ) + } +} diff --git a/smack-xmlparser-xpp3/build.gradle b/smack-xmlparser-xpp3/build.gradle index a0afd7c4a..f0a9f56c6 100644 --- a/smack-xmlparser-xpp3/build.gradle +++ b/smack-xmlparser-xpp3/build.gradle @@ -1,3 +1,8 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack XML parser using XPP3.""" @@ -11,3 +16,13 @@ dependencies { api project(':smack-xmlparser') //testCompile project(path: ":smack-xmlparser", configuration: "testRuntime") } + +jar { + bundle { + bnd( + // see http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html + 'Require-Capability': 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"', + 'Provide-Capability': "osgi.serviceloader;osgi.serviceloader=org.jivesoftware.smack.xml.XmlPullParserFactory;register:=org.jivesoftware.smack.xml.xpp3.Xpp3XmlPullParserFactory", + ) + } +} diff --git a/smack-xmlparser/build.gradle b/smack-xmlparser/build.gradle index 46318a504..513a2b153 100644 --- a/smack-xmlparser/build.gradle +++ b/smack-xmlparser/build.gradle @@ -1,2 +1,16 @@ +// Note that this is also declared in the main build.gradle for +// subprojects, but since evaluationDependsOnChildren is enabled we +// need to declare it here too to have bundle{bnd{...}} available +apply plugin: 'biz.aQute.bnd.builder' + description = """\ Smack XML parser fundamentals""" + +jar { + bundle { + bnd( + // see http://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html + 'Require-Capability': 'osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"', + ) + } +} From 27ff37fa98d82203b9bf2a9e7404b5967990bf9d Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Sun, 17 Oct 2021 16:06:41 +0200 Subject: [PATCH 15/20] Add getter for the stanza associated with the exception Fixes SMACK-916 --- .../java/org/jivesoftware/smack/XMPPException.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java b/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java index ce4c0a4f0..f7235fb48 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/XMPPException.java @@ -120,6 +120,16 @@ public abstract class XMPPException extends Exception { return error; } + /** + * Gets the stanza associated with this exception. + * + * @return the stanza from which this exception was created or {@code null} if the exception is not from a + * stanza. + */ + public Stanza getStanza() { + return stanza; + } + /** * Get the request which triggered the error response causing this exception. * From 585bcb4dc8d6a2164945ff3dd9b55cad9472f872 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 19 Oct 2021 11:16:35 +0200 Subject: [PATCH 16/20] [jingle] Add empty element optimization for --- .../jivesoftware/smackx/jingle/element/JingleContent.java | 5 +++++ .../org/jivesoftware/smackx/jingle/JingleContentTest.java | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java index 171231a9b..4a73db0a0 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java @@ -145,6 +145,11 @@ public final class JingleContent implements FullyQualifiedElement { xml.optAttribute(DISPOSITION_ATTRIBUTE_NAME, disposition); xml.attribute(NAME_ATTRIBUTE_NAME, name); xml.optAttribute(SENDERS_ATTRIBUTE_NAME, senders); + + if (description == null && transport == null) { + return xml.closeEmptyElement(); + } + xml.rightAngleBracket(); xml.optAppend(description); diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java index 45904af4e..946ae95e8 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java @@ -75,8 +75,7 @@ public class JingleContentTest extends SmackTestSuite { assertEquals(content1.toXML().toString(), builder.build().toXML().toString()); String xml = - "" + - ""; + ""; assertEquals(xml, content1.toXML().toString()); } } From b243a40e26ebb1e0f33c80c91372dc1124a3fa0f Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 19 Oct 2021 11:29:23 +0200 Subject: [PATCH 17/20] [core] Pass down the XML environment in IQChildElementXmlStringBuilder This allows to avoid redundant XML namespaces within IQs, like for example here: Fixes SMACK-917 Reported-by: Jonathan Lennox --- .../org/jivesoftware/smack/packet/IQ.java | 19 +++++++++---------- .../smack/util/XmlStringBuilder.java | 12 +++++++----- .../ibb/packet/DataPacketExtension.java | 2 +- .../workgroup/packet/RoomInvitation.java | 2 +- .../smackx/workgroup/packet/RoomTransfer.java | 2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java index 0f412b602..6af350a66 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java @@ -202,7 +202,7 @@ public abstract class IQ extends Stanza implements IqView { // Add the query section if there is one. IQChildElementXmlStringBuilder iqChildElement = getIQChildElementBuilder( - new IQChildElementXmlStringBuilder(this)); + new IQChildElementXmlStringBuilder(getChildElementName(), getChildElementNamespace(), null, xml.getXmlEnvironment())); // TOOD: Document the cases where iqChildElement is null but childElementName not. And if there are none, change // the logic. if (iqChildElement == null) { @@ -399,17 +399,16 @@ public abstract class IQ extends Stanza implements IqView { private boolean isEmptyElement; - private IQChildElementXmlStringBuilder(IQ iq) { - this(iq.getChildElementName(), iq.getChildElementNamespace()); + public IQChildElementXmlStringBuilder(ExtensionElement extensionElement, + XmlEnvironment enclosingXmlEnvironment) { + this(extensionElement.getElementName(), extensionElement.getNamespace(), extensionElement.getLanguage(), + enclosingXmlEnvironment); } - public IQChildElementXmlStringBuilder(ExtensionElement pe) { - this(pe.getElementName(), pe.getNamespace()); - } - - private IQChildElementXmlStringBuilder(String element, String namespace) { - prelude(element, namespace); - this.element = element; + private IQChildElementXmlStringBuilder(String elementName, String xmlNs, String xmlLang, + XmlEnvironment enclosingXmlEnvironment) { + super(elementName, xmlNs, xmlLang, enclosingXmlEnvironment); + this.element = elementName; } public void setEmptyElement() { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java b/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java index a494307e7..5a1fae11f 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java @@ -1,6 +1,6 @@ /** * - * Copyright 2014-2020 Florian Schmaus + * Copyright 2014-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,11 +53,13 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { } public XmlStringBuilder(FullyQualifiedElement element, XmlEnvironment enclosingXmlEnvironment) { - sb = new LazyStringBuilder(); - halfOpenElement(element); + this(element.getElementName(), element.getNamespace(), element.getLanguage(), enclosingXmlEnvironment); + } + + public XmlStringBuilder(String elementName, String xmlNs, String xmlLang, XmlEnvironment enclosingXmlEnvironment) { + sb = new LazyStringBuilder(); + halfOpenElement(elementName); - String xmlNs = element.getNamespace(); - String xmlLang = element.getLanguage(); if (enclosingXmlEnvironment == null) { xmlnsAttribute(xmlNs); xmllangAttribute(xmlLang); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java index 532ac9a11..008c941c6 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/ibb/packet/DataPacketExtension.java @@ -153,7 +153,7 @@ public class DataPacketExtension implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); + XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this, enclosingNamespace)); xml.closeElement(this); return xml; } diff --git a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java index d2e56b29d..c7577e727 100644 --- a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java +++ b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomInvitation.java @@ -114,7 +114,7 @@ public class RoomInvitation implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); + XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this, enclosingNamespace)); xml.closeElement(this); return xml; } diff --git a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java index 0e8012aae..09b09f657 100644 --- a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java +++ b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/RoomTransfer.java @@ -109,7 +109,7 @@ public class RoomTransfer implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); + XmlStringBuilder xml = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this, enclosingNamespace)); xml.closeElement(this); return xml; } From a3840659aa626d921ab05beabd627a36a283e3d8 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 19 Oct 2021 11:31:08 +0200 Subject: [PATCH 18/20] [jingle] Mimic Manager.connection() in JingleTransportManager Eventually JingleTransportManager should be a subclass of Manager (or be replaced by Manager), as JingleTransportManager holds a strong reference to the XMPPConnection. This could cause memory leaks. But for now, we mimic the Manager API in JingleTransportManger to make a future transition to Manager easier. --- .../smackx/jingle/transports/JingleTransportManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java index 5b348c5d3..8c91c8976 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/JingleTransportManager.java @@ -36,6 +36,10 @@ public abstract class JingleTransportManager i } public XMPPConnection getConnection() { + return connection(); + } + + public XMPPConnection connection() { return connection; } From 453ca6aeb06d97ffaa9e9937e17877ccc83958df Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 19 Oct 2021 11:32:51 +0200 Subject: [PATCH 19/20] [jingle] Make Jingle.Builder extend IqBuilder This makes Jingle.Builder to follow the new IqBuilder pattern, allowing to construct Jingle IQs with a given stanza ID (mostly useful for unit tests). --- .../smackx/jingle/JingleUtil.java | 16 +++--- .../smackx/jingle/element/Jingle.java | 53 ++++++++++++++++--- .../jingle/provider/JingleProvider.java | 11 ++-- .../jingle_s5b/JingleS5BTransportManager.java | 8 +-- .../smackx/jingle/JingleTest.java | 6 +-- 5 files changed, 67 insertions(+), 27 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java index 1ac93c448..1cac1f095 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java @@ -51,7 +51,7 @@ public class JingleUtil { JingleContentDescription description, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.session_initiate) .setSessionId(sessionId) .setInitiator(connection.getUser()); @@ -116,7 +116,7 @@ public class JingleUtil { JingleContentDescription description, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setResponder(connection.getUser()) .setAction(JingleAction.session_accept) .setSessionId(sessionId); @@ -151,7 +151,7 @@ public class JingleUtil { } public Jingle createSessionTerminate(FullJid recipient, String sessionId, JingleReason reason) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.session_terminate) .setSessionId(sessionId) .setReason(reason); @@ -230,7 +230,7 @@ public class JingleUtil { public Jingle createSessionTerminateContentCancel(FullJid recipient, String sessionId, JingleContent.Creator contentCreator, String contentName) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.session_terminate) .setSessionId(sessionId); @@ -312,7 +312,7 @@ public class JingleUtil { } public Jingle createSessionPing(FullJid recipient, String sessionId) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setSessionId(sessionId) .setAction(JingleAction.session_info); @@ -341,7 +341,7 @@ public class JingleUtil { public Jingle createTransportReplace(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Creator contentCreator, String contentName, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setInitiator(initiator) .setSessionId(sessionId) .setAction(JingleAction.transport_replace); @@ -368,7 +368,7 @@ public class JingleUtil { public Jingle createTransportAccept(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Creator contentCreator, String contentName, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.transport_accept) .setInitiator(initiator) .setSessionId(sessionId); @@ -395,7 +395,7 @@ public class JingleUtil { public Jingle createTransportReject(FullJid recipient, FullJid initiator, String sessionId, JingleContent.Creator contentCreator, String contentName, JingleContentTransport transport) { - Jingle.Builder jb = Jingle.getBuilder(); + Jingle.Builder jb = Jingle.builder(connection); jb.setAction(JingleAction.transport_reject) .setInitiator(initiator) .setSessionId(sessionId); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java index 40acf187a..7598d1894 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/Jingle.java @@ -1,6 +1,6 @@ /** * - * Copyright 2003-2007 Jive Software, 2014-2017 Florian Schmaus + * Copyright 2003-2007 Jive Software, 2014-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.IQ; +import org.jivesoftware.smack.packet.IqBuilder; +import org.jivesoftware.smack.packet.IqData; +import org.jivesoftware.smack.packet.id.StandardStanzaIdSource; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.StringUtils; @@ -65,9 +69,9 @@ public final class Jingle extends IQ { private final List contents; - private Jingle(String sessionId, JingleAction action, FullJid initiator, FullJid responder, JingleReason reason, + private Jingle(Builder builder, String sessionId, JingleAction action, FullJid initiator, FullJid responder, JingleReason reason, List contents) { - super(ELEMENT, NAMESPACE); + super(builder, ELEMENT, NAMESPACE); this.sessionId = StringUtils.requireNotNullNorEmpty(sessionId, "Jingle session ID must not be null"); this.action = Objects.requireNonNull(action, "Jingle action must not be null"); this.initiator = initiator; @@ -169,11 +173,31 @@ public final class Jingle extends IQ { return xml; } + /** + * Deprecated, do not use. + * + * @return a builder. + * @deprecated use {@link #builder(XMPPConnection)} instead. + */ + @Deprecated + // TODO: Remove in Smack 4.6. public static Builder getBuilder() { - return new Builder(); + return builder(StandardStanzaIdSource.DEFAULT.getNewStanzaId()); } - public static final class Builder { + public static Builder builder(XMPPConnection connection) { + return new Builder(connection); + } + + public static Builder builder(IqData iqData) { + return new Builder(iqData); + } + + public static Builder builder(String stanzaId) { + return new Builder(stanzaId); + } + + public static final class Builder extends IqBuilder { private String sid; private JingleAction action; @@ -186,7 +210,16 @@ public final class Jingle extends IQ { private List contents; - private Builder() { + Builder(IqData iqCommon) { + super(iqCommon); + } + + Builder(XMPPConnection connection) { + super(connection); + } + + Builder(String stanzaId) { + super(stanzaId); } public Builder setSessionId(String sessionId) { @@ -228,8 +261,14 @@ public final class Jingle extends IQ { return this; } + @Override public Jingle build() { - return new Jingle(sid, action, initiator, responder, reason, contents); + return new Jingle(this, sid, action, initiator, responder, reason, contents); + } + + @Override + public Builder getThis() { + return this; } } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java index 8ff1e269b..f6c352a75 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/provider/JingleProvider.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017-2019 Florian Schmaus + * Copyright 2017-2021 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,11 +19,12 @@ package org.jivesoftware.smackx.jingle.provider; import java.io.IOException; import java.util.logging.Logger; +import org.jivesoftware.smack.packet.IqData; import org.jivesoftware.smack.packet.StandardExtensionElement; import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.parsing.SmackParsingException; import org.jivesoftware.smack.parsing.StandardExtensionElementProvider; -import org.jivesoftware.smack.provider.IQProvider; +import org.jivesoftware.smack.provider.IqProvider; import org.jivesoftware.smack.util.ParserUtils; import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smack.xml.XmlPullParserException; @@ -40,13 +41,13 @@ import org.jivesoftware.smackx.jingle.element.UnknownJingleContentTransport; import org.jxmpp.jid.FullJid; -public class JingleProvider extends IQProvider { +public class JingleProvider extends IqProvider { private static final Logger LOGGER = Logger.getLogger(JingleProvider.class.getName()); @Override - public Jingle parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException { - Jingle.Builder builder = Jingle.getBuilder(); + public Jingle parse(XmlPullParser parser, int initialDepth, IqData iqData, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException { + Jingle.Builder builder = Jingle.builder(iqData); String actionString = parser.getAttributeValue("", Jingle.ACTION_ATTRIBUTE_NAME); if (actionString != null) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java index 60b1e9f88..cae0f8e11 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/JingleS5BTransportManager.java @@ -148,7 +148,7 @@ public final class JingleS5BTransportManager extends JingleTransportManager { builder.build(); }); @@ -48,7 +48,7 @@ public class JingleTest extends SmackTestSuite { public void onlySessionIdBuilderTest() { String sessionId = "testSessionId"; - Jingle.Builder builder = Jingle.getBuilder(); + Jingle.Builder builder = Jingle.builder("id"); builder.setSessionId(sessionId); assertThrows(IllegalArgumentException.class, () -> { builder.build(); @@ -59,7 +59,7 @@ public class JingleTest extends SmackTestSuite { public void parserTest() throws XmppStringprepException { String sessionId = "testSessionId"; - Jingle.Builder builder = Jingle.getBuilder(); + Jingle.Builder builder = Jingle.builder("id"); builder.setSessionId(sessionId); builder.setAction(JingleAction.session_initiate); From 6f67553fcf4d8340f15e47f8a6bf711efcf98971 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Tue, 19 Oct 2021 11:34:07 +0200 Subject: [PATCH 20/20] [jingle] Add unit test to check that there are no redundant namespaces Related to SMACK-917. --- .../smackx/jingle/element/JingleTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java new file mode 100644 index 000000000..ae198617f --- /dev/null +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/element/JingleTest.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2021 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jingle.element; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.jivesoftware.smack.packet.StreamOpen; + +import org.junit.jupiter.api.Test; + +public class JingleTest { + + @Test + public void noRedundantNamespaceTest() { + Jingle.Builder jingleBuilder = Jingle.builder("test-id"); + jingleBuilder.setSessionId("MySession"); + jingleBuilder.setAction(JingleAction.content_accept); + + JingleContent.Builder jingleContentBuilder = JingleContent.getBuilder(); + jingleContentBuilder.setName("Hello world"); + jingleContentBuilder.setCreator(JingleContent.Creator.initiator); + + jingleBuilder.addJingleContent(jingleContentBuilder.build()); + Jingle iq = jingleBuilder.build(); + + String actualXml = iq.toXML(StreamOpen.CLIENT_NAMESPACE).toString(); + String expectedXml + = "" + + "" + + "" + + ""; + assertEquals(expectedXml, actualXml); + } +}