server: re-introduce the client/server versions
[fanfix.git] / src / be / nikiroo / utils / serial / server / ConnectActionServer.java
index 10d3440e7af4a4a09e5b7cdf06151ab15ac98f66..04bf3360512567163e021308f88f35c249e2f124 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;
+
 import be.nikiroo.utils.Version;
 
 /**
@@ -23,14 +26,16 @@ abstract class ConnectActionServer {
        protected ConnectAction action;
 
        /**
-        * Create a new {@link ConnectActionServer} with the current application
-        * version (see {@link Version#getCurrentVersion()}) as the server version.
+        * Create a new {@link ConnectActionServer}, using the current version.
         * 
         * @param s
         *            the socket to bind to
+        * @param key
+        *            an optional key to encrypt all the communications (if NULL,
+        *            everything will be sent in clear text)
         */
-       public ConnectActionServer(Socket s) {
-               this(s, Version.getCurrentVersion());
+       public ConnectActionServer(Socket s, String key) {
+               this(s, key, Version.getCurrentVersion());
        }
 
        /**
@@ -38,13 +43,17 @@ abstract class ConnectActionServer {
         * 
         * @param s
         *            the socket to bind to
-        * @param version
-        *            the server version
+        * @param key
+        *            an optional key to encrypt all the communications (if NULL,
+        *            everything will be sent in clear text)
+        * @param serverVersion
+        *            the version of this server,that will be sent to the client
         */
-       public ConnectActionServer(Socket s, Version version) {
-               action = new ConnectAction(s, true, version) {
+       public ConnectActionServer(Socket s, String key, Version serverVersion) {
+               action = new ConnectAction(s, true, key, serverVersion) {
                        @Override
                        protected void action(Version clientVersion) throws Exception {
+                               ConnectActionServer.this.serverHello();
                                ConnectActionServer.this.action(clientVersion);
                        }
 
@@ -60,6 +69,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).
         */
@@ -87,6 +113,8 @@ abstract class ConnectActionServer {
         * <p>
         * Example of usage: the client failed an authentication check, cut the
         * connection here and now.
+        * 
+        * @return TRUE when it is
         */
        public boolean isClosing() {
                return closing;
@@ -120,14 +148,14 @@ abstract class ConnectActionServer {
         * @return the amount of bytes sent
         */
        public long getBytesSent() {
-               return action.getBytesSent();
+               return action.getBytesWritten();
        }
 
        /**
         * Method that will be called when an action is performed on the server.
         * 
         * @param clientVersion
-        *            the client version
+        *            the version of the client connected to this server
         * 
         * @throws Exception
         *             in case of I/O error