diff --git a/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java b/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java index 54ae0b7..c1b1b56 100644 --- a/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java +++ b/src/java/org/jivesoftware/multiplexer/net/XMLLightweightParser.java @@ -11,12 +11,16 @@ package org.jivesoftware.multiplexer.net; import org.apache.mina.common.ByteBuffer; +import org.jivesoftware.util.JiveGlobals; import org.jivesoftware.util.Log; +import org.jivesoftware.util.PropertyEventDispatcher; +import org.jivesoftware.util.PropertyEventListener; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * This is a Light-Weight XML Parser. @@ -30,6 +34,8 @@ * @author Gaston Dombiak */ class XMLLightweightParser { + private static final String MAX_PROPERTY_NAME = "xmpp.parser.buffer.size"; + private static int maxBufferSize; // Chars that rappresent CDATA section start protected static char[] CDATA_START = {'<', '!', '[', 'C', 'D', 'A', 'T', 'A', '['}; // Chars that rappresent CDATA section end @@ -84,6 +90,13 @@ Charset encoder; + static { + // Set default max buffer size to 1MB. If limit is reached then close connection + maxBufferSize = JiveGlobals.getIntProperty(MAX_PROPERTY_NAME, 1048576); + // Listen for changes to this property + PropertyEventDispatcher.addListener(new PropertyListener()); + } + public XMLLightweightParser(String charset) { encoder = Charset.forName(charset); } @@ -147,7 +160,7 @@ invalidateBuffer(); // Check that the buffer is not bigger than 1 Megabyte. For security reasons // we will abort parsing when 1 Mega of queued chars was found. - if (buffer.length() > 1048576) { + if (buffer.length() > maxBufferSize) { throw new Exception("Stopped parsing never ending stanza"); } CharBuffer charBuffer = encoder.decode(byteBuffer.buf()); @@ -330,4 +343,30 @@ foundMsg(""); } } + + private static class PropertyListener implements PropertyEventListener { + public void propertySet(String property, Map params) { + if (MAX_PROPERTY_NAME.equals(property)) { + String value = (String) params.get("value"); + if (value != null) { + maxBufferSize = Integer.parseInt(value); + } + } + } + + public void propertyDeleted(String property, Map params) { + if (MAX_PROPERTY_NAME.equals(property)) { + // Use default value when none was specified + maxBufferSize = 1048576; + } + } + + public void xmlPropertySet(String property, Map params) { + // Do nothing + } + + public void xmlPropertyDeleted(String property, Map params) { + // Do nothing + } + } } diff --git a/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java b/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java index a4b4194..02b7c5a 100644 --- a/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java +++ b/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java @@ -423,7 +423,7 @@ /** Listens for changes to Jive properties that affect the HTTP server manager. */ private class HttpServerPropertyListener implements PropertyEventListener { - public void propertySet(String property, Map params) { + public void propertySet(String property, Map params) { if (property.equalsIgnoreCase(HTTP_BIND_ENABLED)) { doEnableHttpBind(Boolean.valueOf(params.get("value").toString())); } @@ -451,7 +451,7 @@ } } - public void propertyDeleted(String property, Map params) { + public void propertyDeleted(String property, Map params) { if (property.equalsIgnoreCase(HTTP_BIND_ENABLED)) { doEnableHttpBind(HTTP_BIND_ENABLED_DEFAULT); } @@ -463,10 +463,10 @@ } } - public void xmlPropertySet(String property, Map params) { + public void xmlPropertySet(String property, Map params) { } - public void xmlPropertyDeleted(String property, Map params) { + public void xmlPropertyDeleted(String property, Map params) { } } diff --git a/src/java/org/jivesoftware/util/PropertyEventListener.java b/src/java/org/jivesoftware/util/PropertyEventListener.java index 9121d12..6cdb85a 100644 --- a/src/java/org/jivesoftware/util/PropertyEventListener.java +++ b/src/java/org/jivesoftware/util/PropertyEventListener.java @@ -28,7 +28,7 @@ * @param property the property. * @param params event parameters. */ - public void propertySet(String property, Map params); + public void propertySet(String property, Map params); /** * A property was deleted. @@ -36,7 +36,7 @@ * @param property the deleted. * @param params event parameters. */ - public void propertyDeleted(String property, Map params); + public void propertyDeleted(String property, Map params); /** * An XML property was set. @@ -44,7 +44,7 @@ * @param property the property. * @param params event parameters. */ - public void xmlPropertySet(String property, Map params); + public void xmlPropertySet(String property, Map params); /** * An XML property was deleted. @@ -52,6 +52,6 @@ * @param property the property. * @param params event parameters. */ - public void xmlPropertyDeleted(String property, Map params); + public void xmlPropertyDeleted(String property, Map params); -} \ No newline at end of file +}