Do not catch Throwables, but rather Exceptions
[controller.git] / opendaylight / netconf / netconf-ssh / src / main / java / org / opendaylight / controller / netconf / ssh / threads / SocketThread.java
index e5da03b4cf4c9d97765ce098a8c2761b0eda8e39..e07c7ed6ac901156aa2d6c23a75114bd523584da 100644 (file)
@@ -1,6 +1,23 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.controller.netconf.ssh.threads;
 
 
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+
+import javax.annotation.concurrent.ThreadSafe;
+
+import org.opendaylight.controller.netconf.ssh.authentication.AuthProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import ch.ethz.ssh2.AuthenticationResult;
 import ch.ethz.ssh2.PtySettings;
 import ch.ethz.ssh2.ServerAuthenticationCallback;
@@ -9,25 +26,15 @@ import ch.ethz.ssh2.ServerConnectionCallback;
 import ch.ethz.ssh2.ServerSession;
 import ch.ethz.ssh2.ServerSessionCallback;
 import ch.ethz.ssh2.SimpleServerSessionCallback;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import javax.annotation.concurrent.ThreadSafe;
-import org.opendaylight.controller.netconf.ssh.authentication.AuthProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @ThreadSafe
-public class SocketThread implements Runnable, ServerAuthenticationCallback, ServerConnectionCallback
-{
-
-    private Socket socket;
-    private static final String USER = "netconf";
-    private static final String PASSWORD = "netconf";
-    private InetSocketAddress clientAddress;
+public class SocketThread implements Runnable, ServerAuthenticationCallback, ServerConnectionCallback {
     private static final Logger logger =  LoggerFactory.getLogger(SocketThread.class);
+
+    private final Socket socket;
+    private final InetSocketAddress clientAddress;
     private ServerConnection conn = null;
-    private long sessionId;
+    private final long sessionId;
     private String currentUser;
     private final String remoteAddressWithPort;
     private final AuthProvider authProvider;
@@ -59,8 +66,8 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
         conn = new ServerConnection(socket);
         try {
             conn.setPEMHostKey(authProvider.getPEMAsCharArray(),"netconf");
-        } catch (IOException e) {
-            e.printStackTrace();
+        } catch (Exception e) {
+            logger.debug("Server authentication setup failed.");
         }
         conn.setAuthenticationCallback(this);
         conn.setServerConnectionCallback(this);
@@ -70,6 +77,7 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
             logger.error("SocketThread error ",e);
         }
     }
+    @Override
     public ServerSessionCallback acceptSession(final ServerSession session)
     {
         SimpleServerSessionCallback cb = new SimpleServerSessionCallback()
@@ -78,6 +86,7 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
             public Runnable requestSubsystem(final ServerSession ss, final String subsystem) throws IOException
             {
                 return new Runnable(){
+                    @Override
                     public void run()
                     {
                         if (subsystem.equals("netconf")){
@@ -100,14 +109,15 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
                                 netconf_ssh_output.setDaemon(false);
                                 netconf_ssh_output.start();
 
-                            } catch (Throwable t){
-                                logger.error("SSH bridge couldn't create echo socket",t.getMessage(),t);
+                            } catch (Exception t) {
+                                logger.error("SSH bridge could not create echo socket: {}", t.getMessage(), t);
 
                                 try {
                                     if (netconf_ssh_input!=null){
                                         netconf_ssh_input.join();
                                     }
                                 } catch (InterruptedException e) {
+                                    Thread.currentThread().interrupt();
                                    logger.error("netconf_ssh_input join error ",e);
                                 }
 
@@ -116,9 +126,9 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
                                         netconf_ssh_output.join();
                                     }
                                 } catch (InterruptedException e) {
+                                    Thread.currentThread().interrupt();
                                     logger.error("netconf_ssh_output join error ",e);
                                 }
-
                             }
                         } else {
                             try {
@@ -136,6 +146,7 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
             {
                 return new Runnable()
                 {
+                    @Override
                     public void run()
                     {
                         //noop
@@ -148,6 +159,7 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
             {
                 return new Runnable()
                 {
+                    @Override
                     public void run()
                     {
                         //noop
@@ -159,22 +171,26 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
         return cb;
     }
 
+    @Override
     public String initAuthentication(ServerConnection sc)
     {
         logger.trace("Established connection with host {}",remoteAddressWithPort);
         return "Established connection with host "+remoteAddressWithPort+"\r\n";
     }
 
+    @Override
     public String[] getRemainingAuthMethods(ServerConnection sc)
     {
         return new String[] { ServerAuthenticationCallback.METHOD_PASSWORD };
     }
 
+    @Override
     public AuthenticationResult authenticateWithNone(ServerConnection sc, String username)
     {
         return AuthenticationResult.FAILURE;
     }
 
+    @Override
     public AuthenticationResult authenticateWithPassword(ServerConnection sc, String username, String password)
     {
 
@@ -185,11 +201,12 @@ public class SocketThread implements Runnable, ServerAuthenticationCallback, Ser
                 return AuthenticationResult.SUCCESS;
             }
         } catch (Exception e){
-            logger.info("Authentication failed due to :" + e.getLocalizedMessage());
+            logger.warn("Authentication failed due to :" + e.getLocalizedMessage());
         }
         return AuthenticationResult.FAILURE;
     }
 
+    @Override
     public AuthenticationResult authenticateWithPublicKey(ServerConnection sc, String username, String algorithm,
             byte[] publickey, byte[] signature)
     {