Updated Branches: refs/heads/master 9ffe7f302 -> 10eee408a
VYSPER-346: domain check in JIDs is now considering different casings. perform sanity checks on XMPPServer instantiation. Project: http://git-wip-us.apache.org/repos/asf/mina-vysper/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-vysper/commit/10eee408 Tree: http://git-wip-us.apache.org/repos/asf/mina-vysper/tree/10eee408 Diff: http://git-wip-us.apache.org/repos/asf/mina-vysper/diff/10eee408 Branch: refs/heads/master Commit: 10eee408ace00c05d5059031fe80672f635c6ebd Parents: 9ffe7f3 Author: Bernd Fondermann <[email protected]> Authored: Mon Jul 8 16:49:15 2013 +0200 Committer: Bernd Fondermann <[email protected]> Committed: Mon Jul 8 16:49:15 2013 +0200 ---------------------------------------------------------------------- .../vysper/xmpp/addressing/EntityImpl.java | 7 +++++- .../vysper/xmpp/addressing/EntityUtils.java | 2 +- .../InBandRegistrationHandler.java | 3 ++- .../vysper/xmpp/protocol/ProtocolWorker.java | 5 ++-- .../apache/vysper/xmpp/server/XMPPServer.java | 12 ++++++++++ .../xmpp/addressing/EntityUtilsTestCase.java | 16 +++++++++++++ .../vysper/xmpp/server/XMPPServerTestCase.java | 24 ++++++++++++++++++++ .../extension/xep0045_muc/MUCModule.java | 4 ++-- .../xep0060_pubsub/PublishSubscribeModule.java | 2 +- 9 files changed, 67 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java b/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java index 7c3227b..0c6e05a 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityImpl.java @@ -159,7 +159,7 @@ public class EntityImpl implements Entity { final Entity that = (Entity) o; - if (domain != null ? !domain.equals(that.getDomain()) : that.getDomain() != null) + if (!checkDomainsEqual(that)) return false; if (isNodeSet() != that.isNodeSet()) return false; @@ -177,6 +177,11 @@ public class EntityImpl implements Entity { return true; } + public boolean checkDomainsEqual(Entity that) { + if (domain == null) return that.getDomain() == null; + return domain.toLowerCase().equals(that.getDomain().toLowerCase()); + } + @Override public int hashCode() { int result; http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityUtils.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityUtils.java b/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityUtils.java index 0a9f128..92cd722 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityUtils.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/addressing/EntityUtils.java @@ -33,7 +33,7 @@ public class EntityUtils { * @return TRUE iff toVerify JID equals the server's JID */ public static boolean isAddressingServer(Entity toVerify, Entity serverJID) { - return toVerify.getDomain().equals(serverJID.getDomain()); + return toVerify.getDomain().toLowerCase().equals(serverJID.getDomain().toLowerCase()); } /** http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java index a0f74ed..189f260 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java @@ -25,6 +25,7 @@ import org.apache.vysper.xml.fragment.XMLSemanticError; import org.apache.vysper.xmpp.addressing.Entity; import org.apache.vysper.xmpp.addressing.EntityFormatException; import org.apache.vysper.xmpp.addressing.EntityImpl; +import org.apache.vysper.xmpp.addressing.EntityUtils; import org.apache.vysper.xmpp.authentication.AccountCreationException; import org.apache.vysper.xmpp.authentication.AccountManagement; import org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler; @@ -128,7 +129,7 @@ public class InBandRegistrationHandler extends DefaultIQHandler { Entity user; if(username.contains("@")) { user = EntityImpl.parse(username); - if(!serverRuntimeContext.getServerEnitity().getDomain().equals(user.getDomain())) { + if(!EntityUtils.isAddressingServer(serverRuntimeContext.getServerEnitity(), user)) { throw new XMLSemanticError("Username must be in the same domain as the server"); } } else { http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java index 1f4c20d..9f98c12 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import org.apache.vysper.xmpp.addressing.Entity; +import org.apache.vysper.xmpp.addressing.EntityUtils; import org.apache.vysper.xmpp.modules.extension.xep0077_inbandreg.InBandRegistrationHandler; import org.apache.vysper.xmpp.protocol.exception.TLSException; import org.apache.vysper.xmpp.protocol.worker.AuthenticatedProtocolWorker; @@ -125,7 +126,7 @@ public class ProtocolWorker implements StanzaProcessor { coreStanza, StanzaErrorType.MODIFY, "Missing from attribute", null, null); ResponseWriter.writeResponse(sessionContext, errorStanza); return; - } else if(!from.getDomain().equals(sessionContext.getInitiatingEntity().getDomain())) { + } else if(!EntityUtils.isAddressingServer(sessionContext.getInitiatingEntity(), from)) { // make sure the from attribute refers to the correct remote server Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER, @@ -141,7 +142,7 @@ public class ProtocolWorker implements StanzaProcessor { coreStanza, StanzaErrorType.MODIFY, "Missing to attribute", null, null); ResponseWriter.writeResponse(sessionContext, errorStanza); return; - } else if(!to.getDomain().equals(serverRuntimeContext.getServerEnitity().getDomain())) { + } else if(!EntityUtils.isAddressingServer(serverRuntimeContext.getServerEnitity(), to)) { // TODO what's the appropriate error? StreamErrorCondition.IMPROPER_ADDRESSING? Stanza errorStanza = ServerErrorResponses.getStanzaError(StanzaErrorCondition.BAD_REQUEST, coreStanza, StanzaErrorType.MODIFY, "Invalid to attribute", null, null); http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java ---------------------------------------------------------------------- diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java index 72e25e6..01baafb 100644 --- a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java +++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java @@ -29,6 +29,7 @@ import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.vysper.storage.StorageProviderRegistry; import org.apache.vysper.storage.logstanzas.LogStorageProvider; +import org.apache.vysper.xmpp.addressing.EntityFormatException; import org.apache.vysper.xmpp.addressing.EntityImpl; import org.apache.vysper.xmpp.authentication.AccountManagement; import org.apache.vysper.xmpp.authentication.Plain; @@ -88,6 +89,17 @@ public class XMPPServer { private int maxExternalRelayThreads = -1; public XMPPServer(String domain) { + if (StringUtils.isBlank(domain)) { + throw new IllegalArgumentException("server domain cannot be blank, empty or NULL"); + } + if (!domain.equals(domain.toLowerCase())) { + throw new IllegalArgumentException("server domain must be given in all lower-case letters, but was: " + domain); + } + try { + EntityImpl.parse(domain); + } catch (EntityFormatException e) { + throw new IllegalArgumentException("server domain must be a valid domain name, but was: " + domain); + } this.serverDomain = domain; // default list of SASL mechanisms http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/test/java/org/apache/vysper/xmpp/addressing/EntityUtilsTestCase.java ---------------------------------------------------------------------- diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/addressing/EntityUtilsTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/addressing/EntityUtilsTestCase.java index 5c36b35..d9f1454 100644 --- a/server/core/src/test/java/org/apache/vysper/xmpp/addressing/EntityUtilsTestCase.java +++ b/server/core/src/test/java/org/apache/vysper/xmpp/addressing/EntityUtilsTestCase.java @@ -42,6 +42,22 @@ public class EntityUtilsTestCase extends TestCase { assertAddressingServer("[email protected]/xyz"); assertNotAddressingServer("foovysper.org"); assertNotAddressingServer("foo.org"); + + } + + public void testIsMixedCasing() { + assertAddressingServer("vYsper.org"); + assertAddressingServer("VYSPER.ORG"); + assertAddressingServer("vysper.org"); + assertAddressingServer("vysper.ORG"); + assertAddressingServer("Vysper.ORG"); + assertAddressingServer("Vysper.Org"); + assertNotAddressingServer("foo.vYsper.org"); + assertAddressingServer("[email protected]"); + assertAddressingServer("[email protected]/xyz"); + assertNotAddressingServer("foovYsper.org"); + assertNotAddressingServer("foo.org"); + assertNotAddressingServer("fOO.org"); } http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/core/src/test/java/org/apache/vysper/xmpp/server/XMPPServerTestCase.java ---------------------------------------------------------------------- diff --git a/server/core/src/test/java/org/apache/vysper/xmpp/server/XMPPServerTestCase.java b/server/core/src/test/java/org/apache/vysper/xmpp/server/XMPPServerTestCase.java new file mode 100644 index 0000000..4a02ca1 --- /dev/null +++ b/server/core/src/test/java/org/apache/vysper/xmpp/server/XMPPServerTestCase.java @@ -0,0 +1,24 @@ +package org.apache.vysper.xmpp.server; + +import junit.framework.TestCase; + +/** + */ +public class XMPPServerTestCase extends TestCase { + + public void testDomainName() { + expectConstructorIAE(""); + expectConstructorIAE(null); + expectConstructorIAE(" "); + expectConstructorIAE("vYsper.org"); + } + + private void expectConstructorIAE(String domain) { + try { + new XMPPServer(domain); + fail("expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // success, fail through + } + } +} http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java ---------------------------------------------------------------------- diff --git a/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java b/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java index f25960d..71f4422 100644 --- a/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java +++ b/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java @@ -148,7 +148,7 @@ public class MUCModule extends DefaultDiscoAwareModule implements Component, Com } public List<InfoElement> getComponentInfosFor(InfoRequest request) throws ServiceDiscoveryRequestException { - if (!fullDomain.getDomain().equals(request.getTo().getDomain())) + if (!EntityUtils.isAddressingServer(fullDomain, request.getTo())) return null; if (request.getTo().getNode() == null) { @@ -198,7 +198,7 @@ public class MUCModule extends DefaultDiscoAwareModule implements Component, Com return componentItem; } return null; - } else if (fullDomain.getDomain().equals(to.getDomain())) { + } else if (EntityUtils.isAddressingServer(fullDomain, to)) { // might be an items request on a room Room room = conference.findRoom(to.getBareJID()); if (room != null) { http://git-wip-us.apache.org/repos/asf/mina-vysper/blob/10eee408/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java ---------------------------------------------------------------------- diff --git a/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java b/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java index c79850c..fca334c 100644 --- a/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java +++ b/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java @@ -171,7 +171,7 @@ public class PublishSubscribeModule extends DefaultDiscoAwareModule implements C * @see ComponentInfoRequestListener#getComponentInfosFor(org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest) */ public List<InfoElement> getComponentInfosFor(InfoRequest request) throws ServiceDiscoveryRequestException { - if (!fullDomain.getDomain().equals(request.getTo().getDomain())) + if (!EntityUtils.isAddressingServer(fullDomain, request.getTo())) return null; CollectionNode root = serviceConfiguration.getRootNode();
