server: add a HELLO handshake
authorNiki Roo <niki@nikiroo.be>
Thu, 2 May 2019 19:30:02 +0000 (21:30 +0200)
committerNiki Roo <niki@nikiroo.be>
Thu, 2 May 2019 19:30:02 +0000 (21:30 +0200)
src/be/nikiroo/utils/serial/server/ConnectActionClient.java
src/be/nikiroo/utils/serial/server/ConnectActionClientObject.java
src/be/nikiroo/utils/serial/server/ConnectActionClientString.java
src/be/nikiroo/utils/serial/server/ConnectActionServer.java
src/be/nikiroo/utils/serial/server/ConnectActionServerObject.java
src/be/nikiroo/utils/serial/server/ConnectActionServerString.java
src/be/nikiroo/utils/serial/server/Server.java
src/be/nikiroo/utils/serial/server/ServerBridge.java
src/be/nikiroo/utils/serial/server/ServerObject.java
src/be/nikiroo/utils/serial/server/ServerString.java
src/be/nikiroo/utils/test_code/SerialServerTest.java

index 31b71b92af80eb8383fba1099e548fff5a4cd750..1b92b42235a91e471cb650b2e8dc48608a1d6dc3 100644 (file)
@@ -4,6 +4,8 @@ import java.io.IOException;
 import java.net.Socket;
 import java.net.UnknownHostException;
 
+import javax.net.ssl.SSLException;
+
 /**
  * Base class used for the client basic handling.
  * <p>
@@ -57,6 +59,7 @@ abstract class ConnectActionClient {
                action = new ConnectAction(s, false, key) {
                        @Override
                        protected void action() throws Exception {
+                               ConnectActionClient.this.clientHello();
                                ConnectActionClient.this.action();
                        }
 
@@ -67,6 +70,25 @@ abstract class ConnectActionClient {
                };
        }
 
+       /**
+        * Send the HELLO message (send a String "HELLO" to the server, to check I/O
+        * and encryption modes).
+        * <p>
+        * Will automatically handle the answer (the server must answer "HELLO" in
+        * kind).
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        * @throws SSLException
+        *             in case of encryption error
+        */
+       protected void clientHello() throws IOException {
+               String HELLO = action.sendString("HELLO");
+               if (!"HELLO".equals(HELLO)) {
+                       throw new SSLException("Server did not accept the encryption key");
+               }
+       }
+
        /**
         * Actually start the process and call the action (synchronous).
         */
index da13be5b1bcebb3ddfe191e2f155ca4124096961..791f850b085819e1ac24480a2226358d708d194a 100644 (file)
@@ -4,8 +4,6 @@ import java.io.IOException;
 import java.net.Socket;
 import java.net.UnknownHostException;
 
-import be.nikiroo.utils.Version;
-
 /**
  * Class used for the client basic handling.
  * <p>
@@ -16,9 +14,7 @@ import be.nikiroo.utils.Version;
  */
 public class ConnectActionClientObject extends ConnectActionClient {
        /**
-        * Create a new {@link ConnectActionClientObject} with the current
-        * application version (see {@link Version#getCurrentVersion()}) as the
-        * client version.
+        * Create a new {@link ConnectActionClientObject} .
         * 
         * @param s
         *            the socket to bind to
@@ -31,9 +27,7 @@ public class ConnectActionClientObject extends ConnectActionClient {
        }
 
        /**
-        * Create a new {@link ConnectActionClientObject} with the current
-        * application version (see {@link Version#getCurrentVersion()}) as the
-        * client version.
+        * Create a new {@link ConnectActionClientObject}.
         * 
         * @param host
         *            the host to bind to
index 366070c6acc4cd5788d4811069eec6b48eb1e4bf..17da668a6db7f5e737f683d270e9396509d35d4f 100644 (file)
@@ -4,8 +4,6 @@ import java.io.IOException;
 import java.net.Socket;
 import java.net.UnknownHostException;
 
-import be.nikiroo.utils.Version;
-
 /**
  * Class used for the client basic handling.
  * <p>
@@ -16,9 +14,7 @@ import be.nikiroo.utils.Version;
  */
 public class ConnectActionClientString extends ConnectActionClient {
        /**
-        * Create a new {@link ConnectActionClientString} with the current
-        * application version (see {@link Version#getCurrentVersion()}) as the
-        * client version.
+        * Create a new {@link ConnectActionClientString}.
         * 
         * @param s
         *            the socket to bind to
@@ -31,9 +27,7 @@ public class ConnectActionClientString extends ConnectActionClient {
        }
 
        /**
-        * Create a new {@link ConnectActionClientString} with the current
-        * application version (see {@link Version#getCurrentVersion()}) as the
-        * client version.
+        * Create a new {@link ConnectActionClientString}.
         * 
         * @param host
         *            the host to bind to
index d0ddb92acd253cb5befda49760c5803e379e1688..42a562d2069bcf275d15dc7dc9316ea1875dcd83 100644 (file)
@@ -1,7 +1,10 @@
 package be.nikiroo.utils.serial.server;
 
+import java.io.IOException;
 import java.net.Socket;
 
+import javax.net.ssl.SSLException;
+
 /**
  * Base class used for the server basic handling.
  * <p>
@@ -33,6 +36,7 @@ abstract class ConnectActionServer {
                action = new ConnectAction(s, true, key) {
                        @Override
                        protected void action() throws Exception {
+                               ConnectActionServer.this.serverHello();
                                ConnectActionServer.this.action();
                        }
 
@@ -43,6 +47,23 @@ abstract class ConnectActionServer {
                };
        }
 
+       /**
+        * Send the HELLO message (check that the client sends a String "HELLO" and
+        * send it back, to check I/O and encryption modes).
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        * @throws SSLException
+        *             in case of encryption error
+        */
+       protected void serverHello() throws IOException, SSLException {
+               String HELLO = action.recString();
+               if (!"HELLO".equals(HELLO)) {
+                       throw new SSLException("Server did not accept the encryption key");
+               }
+               action.sendString(HELLO);
+       }
+
        /**
         * Actually start the process and call the action (synchronous).
         */
index 3457a08f74cb01fad266ea2ad58e0b6d7fa35f2d..07d986763438abeee1bc84e4ca97e984bf0688ee 100644 (file)
@@ -3,8 +3,6 @@ package be.nikiroo.utils.serial.server;
 import java.io.IOException;
 import java.net.Socket;
 
-import be.nikiroo.utils.Version;
-
 /**
  * Class used for the server basic handling.
  * <p>
@@ -15,9 +13,7 @@ import be.nikiroo.utils.Version;
  */
 public class ConnectActionServerObject extends ConnectActionServer {
        /**
-        * Create a new {@link ConnectActionServerObject} with the current
-        * application version (see {@link Version#getCurrentVersion()}) as the
-        * server version.
+        * Create a new {@link ConnectActionServerObject} as the server version.
         * 
         * @param s
         *            the socket to bind to
index 2c3ad8ff1e31c9919ebe4ff06820d351c13c5e63..8d113c1dc5db3fe968ed0f10b6fae59fbdb62be3 100644 (file)
@@ -3,8 +3,6 @@ package be.nikiroo.utils.serial.server;
 import java.io.IOException;
 import java.net.Socket;
 
-import be.nikiroo.utils.Version;
-
 /**
  * Class used for the server basic handling.
  * <p>
@@ -15,9 +13,7 @@ import be.nikiroo.utils.Version;
  */
 public class ConnectActionServerString extends ConnectActionServer {
        /**
-        * Create a new {@link ConnectActionServerString} with the current
-        * application version (see {@link Version#getCurrentVersion()}) as the
-        * server version.
+        * Create a new {@link ConnectActionServerString} as the server version.
         * 
         * @param s
         *            the socket to bind to
index 932a705136d5a550df5dc5a7d8992b5e313c37fe..04701590e1c669c7d2dd143e7c9d3e921052b5b5 100644 (file)
@@ -324,8 +324,7 @@ abstract class Server implements Runnable {
                                exiting = true;
 
                                try {
-                                       new ConnectActionClientObject(new Socket((String) null,
-                                                       port), key).connect();
+                                       getConnectionToMe().connect();
                                        long time = 0;
                                        while (ss != null && timeout > 0 && timeout > time) {
                                                Thread.sleep(10);
@@ -349,6 +348,20 @@ abstract class Server implements Runnable {
                }
        }
 
+       /**
+        * Return a connection to this server (used by the Exit code to send an exit
+        * message).
+        * 
+        * @return the connection
+        * 
+        * @throws UnknownHostException
+        *             the host should always be NULL (localhost)
+        * @throws IOException
+        *             in case of I/O error
+        */
+       abstract protected ConnectActionClient getConnectionToMe()
+                       throws UnknownHostException, IOException;
+
        /**
         * Change the number of currently serviced actions.
         * 
@@ -403,48 +416,4 @@ abstract class Server implements Runnable {
        @SuppressWarnings("unused")
        protected void onRequestDone(long id, long bytesReceived, long bytesSent) {
        }
-
-       /**
-        * Create a {@link Socket}.
-        * 
-        * @param host
-        *            the host to connect to
-        * @param port
-        *            the port to connect to
-        * 
-        * @return the {@link Socket}
-        * 
-        * @throws IOException
-        *             in case of I/O error
-        * @throws UnknownHostException
-        *             if the host is not known
-        * @throws IllegalArgumentException
-        *             if the port parameter is outside the specified range of valid
-        *             port values, which is between 0 and 65535, inclusive
-        */
-       @Deprecated
-       static Socket createSocket(String host, int port) throws IOException {
-               return new Socket(host, port);
-       }
-
-       /**
-        * Create a {@link ServerSocket}.
-        * 
-        * @param port
-        *            the port to accept connections on
-        * 
-        * @return the {@link ServerSocket}
-        * 
-        * @throws IOException
-        *             in case of I/O error
-        * @throws UnknownHostException
-        *             if the IP address of the host could not be determined
-        * @throws IllegalArgumentException
-        *             if the port parameter is outside the specified range of valid
-        *             port values, which is between 0 and 65535, inclusive
-        */
-       @Deprecated
-       static ServerSocket createSocketServer(int port) throws IOException {
-               return new ServerSocket(port);
-       }
 }
index 84433fe9d4f9516c90acaf39d6359fce1e1e25b8..25d451c51577cb581c05c1daf14e702aec99b86b 100644 (file)
@@ -198,6 +198,13 @@ public class ServerBridge extends Server {
                trace("<<< SERVER", data);
        }
 
+       @Override
+       protected ConnectActionClient getConnectionToMe()
+                       throws UnknownHostException, IOException {
+               return new ConnectActionClientString(new Socket((String) null,
+                               getPort()), key);
+       }
+
        @Override
        public void run() {
                getTraceHandler().trace(
index f79776696cdc2e6c5fae13e6ed0f733c814268c2..dcd1badd1ad4ade60b87313c3b0960b2b883752e 100644 (file)
@@ -95,6 +95,13 @@ abstract public class ServerObject extends Server {
                };
        }
 
+       @Override
+       protected ConnectActionClient getConnectionToMe()
+                       throws UnknownHostException, IOException {
+               return new ConnectActionClientObject(new Socket((String) null,
+                               getPort()), key);
+       }
+
        /**
         * This is the method that is called on each client request.
         * <p>
index 6fe4ad0df1a6aeb4d37aaba4de6a5f5bdf1ce306..6a0d4f462c48d1adfc46f5723bd240514cdf020e 100644 (file)
@@ -95,6 +95,13 @@ abstract public class ServerString extends Server {
                };
        }
 
+       @Override
+       protected ConnectActionClient getConnectionToMe()
+                       throws UnknownHostException, IOException {
+               return new ConnectActionClientString(new Socket((String) null,
+                               getPort()), key);
+       }
+
        /**
         * This is the method that is called on each client request.
         * <p>
index 956499a40f3e43cac07998ffa5f9c20764b7bc70..28eb8bb6fc04f48b4cdcbd92711aa7cb1670f0b1 100644 (file)
@@ -2,6 +2,7 @@ package be.nikiroo.utils.test_code;
 
 import java.net.URL;
 
+import be.nikiroo.utils.TraceHandler;
 import be.nikiroo.utils.serial.server.ConnectActionClientObject;
 import be.nikiroo.utils.serial.server.ConnectActionClientString;
 import be.nikiroo.utils.serial.server.ConnectActionServerObject;
@@ -81,7 +82,7 @@ class SerialServerTest extends TestLauncher {
 
                                try {
                                        try {
-                                               new ConnectActionClientObject(null, port, key) {
+                                               new ConnectActionClientString(null, port, key) {
                                                        @Override
                                                        public void action() throws Exception {
                                                                rec[0] = "ok";