Revision: 8395 http://languagetool.svn.sourceforge.net/languagetool/?rev=8395&view=rev Author: dnaber Date: 2012-11-13 22:13:04 +0000 (Tue, 13 Nov 2012) Log Message: ----------- https server: new property maxTextLength to limit the text length - longer texts will cause an error
Modified Paths: -------------- trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties Added Paths: ----------- trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties Modified: trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java =================================================================== --- trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java 2012-11-13 21:15:50 UTC (rev 8394) +++ trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java 2012-11-13 22:13:04 UTC (rev 8395) @@ -65,7 +65,9 @@ final SSLContext sslContext = getSslContext(config.getKeystore(), config.getKeyStorePassword()); final HttpsConfigurator configurator = getConfigurator(sslContext); ((HttpsServer)server).setHttpsConfigurator(configurator); - server.createContext("/", new LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally)); + final LanguageToolHttpHandler httpHandler = new LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally); + httpHandler.setMaxTextLength(config.getMaxTextLength()); + server.createContext("/", httpHandler); } catch (BindException e) { final ResourceBundle messages = JLanguageTool.getMessageBundle(); final String message = Tools.makeTexti18n(messages, "https_server_start_failed", host, Integer.toString(port)); @@ -112,8 +114,9 @@ System.out.println("Usage: " + HTTPSServer.class.getSimpleName() + " --config propertyFile [--port|-p port] [--public]"); System.out.println(" --config file a Java property file with values for:"); - System.out.println(" 'keystore' - a Java keystore with an SSL certificate"); - System.out.println(" 'password' - the keystore's password"); + System.out.println(" 'keystore' - a Java keystore with an SSL certificate"); + System.out.println(" 'password' - the keystore's password"); + System.out.println(" 'maxTextLength' - maximum text length, longer texts will cause an error (optional)"); printCommonOptions(); System.exit(1); } Modified: trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java =================================================================== --- trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java 2012-11-13 21:15:50 UTC (rev 8394) +++ trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java 2012-11-13 22:13:04 UTC (rev 8395) @@ -31,6 +31,8 @@ private final File keystore; private final String keyStorePassword; + private int maxTextLength = Integer.MAX_VALUE; + /** * @param keystore a Java keystore file as created with the <tt>keytool</tt> command * @param keyStorePassword the password for the keystore @@ -74,6 +76,7 @@ props.load(fis); keystore = new File(getProperty(props, "keystore", config)); keyStorePassword = getProperty(props, "password", config); + maxTextLength = Integer.parseInt(getOptionalProperty(props, "maxTextLength", Integer.toString(Integer.MAX_VALUE))); } finally { fis.close(); } @@ -82,6 +85,26 @@ } } + /** + * @param maxTextLength the maximum text length allowed (in number of characters), texts that are longer + * will cause an exception when being checked + */ + public void setMaxTextLength(int maxTextLength) { + this.maxTextLength = maxTextLength; + } + + int getMaxTextLength() { + return maxTextLength; + } + + File getKeystore() { + return keystore; + } + + String getKeyStorePassword() { + return keyStorePassword; + } + private String getProperty(Properties props, String propertyName, File config) { final String propertyValue = (String)props.get(propertyName); if (propertyValue == null || propertyValue.trim().isEmpty()) { @@ -90,11 +113,11 @@ return propertyValue; } - File getKeystore() { - return keystore; + private String getOptionalProperty(Properties props, String propertyName, String defaultValue) { + final String propertyValue = (String)props.get(propertyName); + if (propertyValue == null) { + return defaultValue; + } + return propertyValue; } - - String getKeyStorePassword() { - return keyStorePassword; - } } Modified: trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java =================================================================== --- trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java 2012-11-13 21:15:50 UTC (rev 8394) +++ trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java 2012-11-13 22:13:04 UTC (rev 8395) @@ -43,6 +43,7 @@ private String[] enabledRules = {}; private String[] disabledRules = {}; + private int maxTextLength = Integer.MAX_VALUE; /** * @param verbose print the input text in case of exceptions @@ -56,6 +57,10 @@ config = new Configuration(null); } + void setMaxTextLength(int maxTextLength) { + this.maxTextLength = maxTextLength; + } + @Override public void handle(HttpExchange httpExchange) throws IOException { final long timeStart = System.currentTimeMillis(); @@ -101,7 +106,7 @@ private Map<String, String> getRequestQuery(HttpExchange httpExchange, URI requestedUri) throws IOException { Map<String, String> parameters; - if ("post".equalsIgnoreCase(httpExchange.getRequestMethod())) { // POST + if ("post".equalsIgnoreCase(httpExchange.getRequestMethod())) { final InputStreamReader isr = new InputStreamReader(httpExchange.getRequestBody(), ENCODING); try { final BufferedReader br = new BufferedReader(isr); @@ -123,7 +128,6 @@ private void printListOfLanguages(HttpExchange httpExchange) throws IOException { httpExchange.getResponseHeaders().set("Content-Type", CONTENT_TYPE_VALUE); - //httpExchange.getResponseHeaders().set("Access-Control-Allow-Origin", "*"); final String response = getSupportedLanguagesAsXML(); httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.getBytes(ENCODING).length); httpExchange.getResponseBody().write(response.getBytes(ENCODING)); @@ -150,6 +154,9 @@ } private void checkText(String text, HttpExchange httpExchange, Map<String, String> parameters) throws Exception { + if (text.length() > maxTextLength) { + throw new IllegalArgumentException("Text is " + text.length() + " characters long, exceeding maximum length of " + maxTextLength); + } final String langParam = parameters.get("language"); final String autodetectParam = parameters.get("autodetect"); if (langParam == null && (autodetectParam == null || !autodetectParam.equals("1"))) { @@ -259,11 +266,9 @@ if (!useQuerySettings && internalServer && config.getUseGUIConfig()) { // use the GUI config values configureGUI(newLanguageTool); } - if (useQuerySettings) { Tools.selectRules(newLanguageTool, disabledRules, enabledRules); } - return newLanguageTool; } Modified: trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java =================================================================== --- trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java 2012-11-13 21:15:50 UTC (rev 8394) +++ trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java 2012-11-13 22:13:04 UTC (rev 8395) @@ -41,6 +41,7 @@ assertThat(config1.isVerbose(), is(false)); assertThat(config1.getKeystore().toString(), is("src/test/resources/org/languagetool/test-keystore.jks")); assertThat(config1.getKeyStorePassword(), is("mytest")); + assertThat(config1.getMaxTextLength(), is(50000)); final HTTPSServerConfig config2 = new HTTPSServerConfig(("-p 9999 --config " + propertyFile).split(" ")); assertThat(config2.getPort(), is(9999)); @@ -48,9 +49,22 @@ assertThat(config2.isVerbose(), is(false)); assertThat(config2.getKeystore().toString(), is("src/test/resources/org/languagetool/test-keystore.jks")); assertThat(config2.getKeyStorePassword(), is("mytest")); + assertThat(config2.getMaxTextLength(), is(50000)); } @Test + public void testMinimalPropertyFile() { + final String propertyFile = HTTPSServerConfigTest.class.getResource("/org/languagetool/server/https-server-minimal.properties").getFile(); + final HTTPSServerConfig config = new HTTPSServerConfig(("--config " + propertyFile).split(" ")); + assertThat(config.getPort(), is(8081)); + assertThat(config.isPublicAccess(), is(false)); + assertThat(config.isVerbose(), is(false)); + assertThat(config.getKeystore().toString(), is("src/test/resources/org/languagetool/test-keystore.jks")); + assertThat(config.getKeyStorePassword(), is("mytest")); + assertThat(config.getMaxTextLength(), is(Integer.MAX_VALUE)); + } + + @Test public void testMissingPropertyFile() { final String propertyFile = "/does-not-exist"; try { Modified: trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java =================================================================== --- trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java 2012-11-13 21:15:50 UTC (rev 8394) +++ trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java 2012-11-13 22:13:04 UTC (rev 8395) @@ -22,8 +22,10 @@ import java.io.File; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.SocketException; import java.net.URL; +import java.net.URLEncoder; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -42,6 +44,7 @@ } final File keyStoreFile = new File(keystore.getFile()); final HTTPSServerConfig config = new HTTPSServerConfig(keyStoreFile, KEYSTORE_PASSWORD); + config.setMaxTextLength(500); final HTTPSServer server = new HTTPSServer(config, false, HTTPServerConfig.DEFAULT_HOST, null); try { server.run(); @@ -52,15 +55,35 @@ } private void runTests() throws IOException { - final String httpsPrefix = "https://localhost:" + HTTPServerConfig.DEFAULT_PORT + "/"; try { final String httpPrefix = "http://localhost:" + HTTPServerConfig.DEFAULT_PORT + "/"; HTTPTools.checkAtUrl(new URL(httpPrefix + "?text=a+test&language=en")); fail("HTTP should not work, only HTTPS"); } catch (SocketException expected) {} + final String httpsPrefix = "https://localhost:" + HTTPServerConfig.DEFAULT_PORT + "/"; + final String result = HTTPTools.checkAtUrl(new URL(httpsPrefix + "?text=a+test&language=en")); assertTrue("Got " + result, result.contains("UPPERCASE_SENTENCE_START")); + + final StringBuilder longText = new StringBuilder(); + while (longText.length() < 490) { + longText.append("B "); + } + final String result2 = HTTPTools.checkAtUrl(new URL(httpsPrefix + "?text=" + encode(longText.toString()) + "&language=en")); + assertTrue("Got " + result2, !result2.contains("UPPERCASE_SENTENCE_START")); + assertTrue("Got " + result2, result2.contains("PHRASE_REPETITION")); + + final String overlyLongText = longText.toString() + " and some more to get over the limit of 500"; + try { + System.out.println("Now checking text that is too long, please ignore the following error..."); + HTTPTools.checkAtUrl(new URL(httpsPrefix + "?text=" + encode(overlyLongText) + "&language=en")); + fail(); + } catch (IOException expected) {} } + private String encode(String text) throws UnsupportedEncodingException { + return URLEncoder.encode(text, "utf-8"); + } + } Added: trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties =================================================================== --- trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties (rev 0) +++ trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties 2012-11-13 22:13:04 UTC (rev 8395) @@ -0,0 +1,2 @@ +keystore = src/test/resources/org/languagetool/test-keystore.jks +password = mytest Modified: trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties =================================================================== --- trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties 2012-11-13 21:15:50 UTC (rev 8394) +++ trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties 2012-11-13 22:13:04 UTC (rev 8395) @@ -1,2 +1,3 @@ keystore = src/test/resources/org/languagetool/test-keystore.jks password = mytest +maxTextLength = 50000 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ Languagetool-commits mailing list Languagetool-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/languagetool-commits