Revision: 8391
          
http://languagetool.svn.sourceforge.net/languagetool/?rev=8391&view=rev
Author:   dnaber
Date:     2012-11-13 20:59:52 +0000 (Tue, 13 Nov 2012)
Log Message:
-----------
https server: load config from property file for easier extensibility and 
better security (password not used as parameter on command line)

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/HTTPServer.java
    trunk/JLanguageTool/src/main/java/org/languagetool/server/Server.java
    
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java

Added Paths:
-----------
    trunk/JLanguageTool/src/test/resources/org/languagetool/server/
    
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.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 09:03:01 UTC (rev 8390)
+++ trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java  
2012-11-13 20:59:52 UTC (rev 8391)
@@ -110,10 +110,11 @@
   public static void main(String[] args) throws IOException {
     if (args.length > 7 || usageRequested(args)) {
       System.out.println("Usage: " + HTTPSServer.class.getSimpleName()
-              + " [-p|--port port] [--public] [--keystore keystorefile] 
[--password password]");
+              + " --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");
       printCommonOptions();
-      System.out.println("  --keystore    a Java keystore with the SSL 
certificate");
-      System.out.println("  --password    password for the Java keystore");
       System.exit(1);
     }
     final boolean runInternal = false;

Modified: 
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
===================================================================
--- 
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
    2012-11-13 09:03:01 UTC (rev 8390)
+++ 
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
    2012-11-13 20:59:52 UTC (rev 8391)
@@ -19,14 +19,17 @@
 package org.languagetool.server;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
 
 /**
  * @since 2.0
  */
 public class HTTPSServerConfig extends HTTPServerConfig {
 
-  private File keystore;
-  private String keyStorePassword;
+  private final File keystore;
+  private final String keyStorePassword;
 
   /**
    * @param keystore a Java keystore file as created with the <tt>keytool</tt> 
command
@@ -55,26 +58,43 @@
    */
   HTTPSServerConfig(String[] args) {
     super(args);
+    File config = null;
     for (int i = 0; i < args.length; i++) {
-      if ("--keystore".equals(args[i])) {
-        keystore = new File(args[++i]);
-      } else if ("--password".equals(args[i])) {
-        keyStorePassword = args[++i];
+      if ("--config".equals(args[i])) {
+        config = new File(args[++i]);
       }
     }
-    if (keystore == null) {
-      throw new IllegalArgumentException("Parameter --keystore must be set");
+    if (config == null) {
+      throw new IllegalArgumentException("Parameter --config must be set and 
point to a property file");
     }
-    if (keyStorePassword == null) {
-      throw new IllegalArgumentException("Parameter --password must be set");
+    try {
+      final Properties props = new Properties();
+      final FileInputStream fis = new FileInputStream(config);
+      try {
+        props.load(fis);
+        keystore = new File(getProperty(props, "keystore", config));
+        keyStorePassword = getProperty(props, "password", config);
+      } finally {
+        fis.close();
+      }
+    } catch (IOException e) {
+      throw new RuntimeException("Could not load properties from '" + config + 
"'", e);
     }
   }
 
-  public File getKeystore() {
+  private String getProperty(Properties props, String propertyName, File 
config) {
+    final String propertyValue = (String)props.get(propertyName);
+    if (propertyValue == null || propertyValue.trim().isEmpty()) {
+      throw new IllegalArgumentException("Property '" + propertyName + "' must 
be set in " + config);
+    }
+    return propertyValue;
+  }
+
+  File getKeystore() {
     return keystore;
   }
 
-  public String getKeyStorePassword() {
+  String getKeyStorePassword() {
     return keyStorePassword;
   }
 }

Modified: 
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPServer.java
===================================================================
--- trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPServer.java   
2012-11-13 09:03:01 UTC (rev 8390)
+++ trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPServer.java   
2012-11-13 20:59:52 UTC (rev 8391)
@@ -105,9 +105,8 @@
 
   public static void main(String[] args) throws IOException {
     if (args.length > 3 || usageRequested(args)) {
-      System.out.println("Usage: " + HTTPServer.class.getSimpleName() + " 
[-p|--port port] [--public]");
-      System.out.println("  -p, --port  port to bind to, defaults to " + 
DEFAULT_PORT + " if not specified");
-      System.out.println("  --public    allow this server process to be 
connected from anywhere (not recommended)");
+      System.out.println("Usage: " + HTTPServer.class.getSimpleName() + " 
[--port|-p port] [--public]");
+      printCommonOptions();
       System.exit(1);
     }
     final boolean runInternal = false;

Modified: trunk/JLanguageTool/src/main/java/org/languagetool/server/Server.java
===================================================================
--- trunk/JLanguageTool/src/main/java/org/languagetool/server/Server.java       
2012-11-13 09:03:01 UTC (rev 8390)
+++ trunk/JLanguageTool/src/main/java/org/languagetool/server/Server.java       
2012-11-13 20:59:52 UTC (rev 8391)
@@ -67,8 +67,8 @@
   }
 
   protected static void printCommonOptions() {
-    System.out.println("  -p, --port    port to bind to, defaults to " + 
DEFAULT_PORT + " if not specified");
-    System.out.println("  --public      allow this server process to be 
connected from anywhere (not recommended)");
+    System.out.println("  --port, -p     port to bind to, defaults to " + 
DEFAULT_PORT + " if not specified");
+    System.out.println("  --public       allow this server process to be 
connected from anywhere (not recommended)");
   }
 
 }

Modified: 
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
===================================================================
--- 
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
        2012-11-13 09:03:01 UTC (rev 8390)
+++ 
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
        2012-11-13 20:59:52 UTC (rev 8391)
@@ -33,19 +33,21 @@
       fail();
     } catch (IllegalArgumentException expected) {}
 
-    final HTTPSServerConfig config1 = new HTTPSServerConfig("--public 
--keystore foo --password xxx".split(" "));
+    final String propertyFile = 
HTTPSServerConfigTest.class.getResource("/org/languagetool/server/https-server.properties").getFile();
+
+    final HTTPSServerConfig config1 = new HTTPSServerConfig(("--public 
--config " + propertyFile).split(" "));
     assertThat(config1.getPort(), is(HTTPServerConfig.DEFAULT_PORT));
     assertThat(config1.isPublicAccess(), is(true));
     assertThat(config1.isVerbose(), is(false));
-    assertThat(config1.getKeystore().getName(), is("foo"));
-    assertThat(config1.getKeyStorePassword(), is("xxx"));
+    assertThat(config1.getKeystore().toString(), 
is("src/test/resources/org/languagetool/test-keystore.jks"));
+    assertThat(config1.getKeyStorePassword(), is("mytest"));
 
-    final HTTPSServerConfig config2 = new HTTPSServerConfig("-p 9999 
--keystore /tmp/foo.kjs --password pwd".split(" "));
+    final HTTPSServerConfig config2 = new HTTPSServerConfig(("-p 9999 --config 
" + propertyFile).split(" "));
     assertThat(config2.getPort(), is(9999));
     assertThat(config2.isPublicAccess(), is(false));
     assertThat(config2.isVerbose(), is(false));
-    assertThat(config2.getKeystore().getAbsolutePath(), is("/tmp/foo.kjs"));
-    assertThat(config2.getKeyStorePassword(), is("pwd"));
+    assertThat(config2.getKeystore().toString(), 
is("src/test/resources/org/languagetool/test-keystore.jks"));
+    assertThat(config2.getKeyStorePassword(), is("mytest"));
   }
 
 }

Added: 
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
===================================================================
--- 
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
                              (rev 0)
+++ 
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
      2012-11-13 20:59:52 UTC (rev 8391)
@@ -0,0 +1,2 @@
+keystore = src/test/resources/org/languagetool/test-keystore.jks
+password = mytest

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
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-commits

Reply via email to