Author: jlmonteiro
Date: Fri May 30 09:42:46 2014
New Revision: 1598526

URL: http://svn.apache.org/r1598526
Log:
OPENEJB-2096 openejb-ssh loging only works with a single thread

Modified:
    
tomee/tomee/trunk/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
    
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBCommands.java
    
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBJaasPasswordAuthenticator.java
    
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBShellFactory.java
    
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/SSHServer.java

Modified: 
tomee/tomee/trunk/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java?rev=1598526&r1=1598525&r2=1598526&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
 Fri May 30 09:42:46 2014
@@ -90,8 +90,8 @@ public class CliRunnable implements Runn
 
             //noinspection unchecked
             final IAnnotationFinder finder = new AnnotationFinder(new 
ConfigurableClasspathArchive(new 
ConfigurableClasspathArchive.FakeModule(loader, Collections.EMPTY_MAP),
-                                                                               
                    true,
-                                                                               
                    urlSet.getUrls()));
+                    true,
+                    urlSet.getUrls()));
             for (final Annotated<Class<?>> cmd : 
finder.findMetaAnnotatedClasses(Command.class)) {
                 try {
                     final Command annotation = 
cmd.getAnnotation(Command.class);
@@ -117,7 +117,7 @@ public class CliRunnable implements Runn
     private OutputStream err;
     private OutputStream out;
     private InputStream sin;
-    private final String username;
+    private String username;
     private final String bind;
     private final int port;
 
@@ -148,6 +148,10 @@ public class CliRunnable implements Runn
         }
     }
 
+    public void setUsername(final String username) {
+        this.username = username;
+    }
+
     public void setInputStream(final InputStream in) {
         sin = in;
     }
@@ -186,12 +190,12 @@ public class CliRunnable implements Runn
 
             String line;
             final StringBuilder builtWelcome = new StringBuilder("Apache 
OpenEJB ")
-                                                   
.append(OpenEjbVersion.get().getVersion())
-                                                   .append("    build: ")
-                                                   
.append(OpenEjbVersion.get().getDate())
-                                                   .append("-")
-                                                   
.append(OpenEjbVersion.get().getTime())
-                                                   .append(lineSep);
+                    .append(OpenEjbVersion.get().getVersion())
+                    .append("    build: ")
+                    .append(OpenEjbVersion.get().getDate())
+                    .append("-")
+                    .append(OpenEjbVersion.get().getTime())
+                    .append(lineSep);
             if (tomee) {
                 
builtWelcome.append(OS_LINE_SEP).append(PROPERTIES.getProperty(WELCOME_TOMEE_KEY));
             } else {
@@ -201,10 +205,10 @@ public class CliRunnable implements Runn
 
             streamManager.writeOut(OpenEjbVersion.get().getUrl());
             streamManager.writeOut(builtWelcome.toString()
-                                               .replace("$bind", bind)
-                                               .replace("$port", 
Integer.toString(port))
-                                               .replace("$name", NAME)
-                                               .replace(OS_LINE_SEP, lineSep));
+                    .replace("$bind", bind)
+                    .replace("$port", Integer.toString(port))
+                    .replace("$name", NAME)
+                    .replace(OS_LINE_SEP, lineSep));
 
             while ((line = reader.readLine(prompt())) != null) {
                 // exit simply let us go out of the loop
@@ -275,8 +279,8 @@ public class CliRunnable implements Runn
             prompt.append(PROMPT);
         }
         prompt.append(" @ ")
-              .append(bind).append(":").append(port)
-              .append(PROMPT_SUFFIX);
+                .append(bind).append(":").append(port)
+                .append(PROMPT_SUFFIX);
         return prompt.toString();
     }
 }

Modified: 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBCommands.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBCommands.java?rev=1598526&r1=1598525&r2=1598526&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBCommands.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBCommands.java
 Fri May 30 09:42:46 2014
@@ -20,6 +20,8 @@ import org.apache.openejb.server.cli.Cli
 import org.apache.sshd.server.Command;
 import org.apache.sshd.server.Environment;
 import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.SessionAware;
+import org.apache.sshd.server.session.ServerSession;
 
 import javax.security.auth.Subject;
 import javax.security.auth.login.LoginContext;
@@ -29,13 +31,12 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.security.PrivilegedAction;
 
-public class OpenEJBCommands extends CliRunnable implements Command, Runnable {
+public class OpenEJBCommands extends CliRunnable implements Command, Runnable, 
SessionAware {
     private ExitCallback cbk;
-    private final LoginContext loginContext;
+    private LoginContext loginContext;
 
-    public OpenEJBCommands(String bind, int port, String username, 
LoginContext lc) {
-        super(bind, port, username, "\r\n");
-        loginContext = lc;
+    public OpenEJBCommands(String bind, int port) {
+        super(bind, port, null, "\r\n");
     }
 
     @Override
@@ -70,6 +71,9 @@ public class OpenEJBCommands extends Cli
 
     @Override
     public void run() {
+        if (loginContext == null) {
+            throw new IllegalStateException("No user logged");
+        }
         try {
             Subject.doAs(loginContext.getSubject(), new 
PrivilegedAction<Object>() {
                 @Override
@@ -87,4 +91,16 @@ public class OpenEJBCommands extends Cli
             cbk.onExit(0);
         }
     }
+
+    @Override
+    public void setSession(final ServerSession session) {
+        final String username = 
session.getAttribute(OpenEJBJaasPasswordAuthenticator.USERNAME_KEY);
+        if (username == null) {
+            throw new IllegalStateException("No username in the session");
+        }
+
+        setUsername(username);
+        loginContext = 
session.getAttribute(OpenEJBJaasPasswordAuthenticator.LOGIN_CONTEXT_KEY);
+    }
 }
+

Modified: 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBJaasPasswordAuthenticator.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBJaasPasswordAuthenticator.java?rev=1598526&r1=1598525&r2=1598526&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBJaasPasswordAuthenticator.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBJaasPasswordAuthenticator.java
 Fri May 30 09:42:46 2014
@@ -18,7 +18,9 @@ package org.apache.openejb.server.ssh;
 
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
+import org.apache.sshd.common.Session;
 import org.apache.sshd.server.jaas.JaasPasswordAuthenticator;
+import org.apache.sshd.server.session.ServerSession;
 
 import javax.security.auth.Subject;
 import javax.security.auth.callback.Callback;
@@ -32,32 +34,30 @@ import java.io.IOException;
 public class OpenEJBJaasPasswordAuthenticator extends 
JaasPasswordAuthenticator {
     private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB_SERVER, 
OpenEJBJaasPasswordAuthenticator.class);
 
-    private OpenEJBShellFactory shellFactory;
-
-    public OpenEJBJaasPasswordAuthenticator(OpenEJBShellFactory sf) {
-        this.shellFactory = sf;
-    }
+    public static final Session.AttributeKey<String> USERNAME_KEY = new 
Session.AttributeKey<String>();
+    public static final Session.AttributeKey<LoginContext> LOGIN_CONTEXT_KEY = 
new Session.AttributeKey<LoginContext>();
 
     @Override
-    public boolean authenticate(final String username, final String password) {
+    public boolean authenticate(final String username, final String password, 
final ServerSession session) {
         try {
             final Subject subject = new Subject();
             final LoginContext loginContext = new LoginContext(getDomain(), 
subject, new CallbackHandler() {
                 public void handle(Callback[] callbacks) throws IOException, 
UnsupportedCallbackException {
-                    for (int i = 0; i < callbacks.length; i++) {
-                        if (callbacks[i] instanceof NameCallback) {
-                            ((NameCallback) callbacks[i]).setName(username);
-                        } else if (callbacks[i] instanceof PasswordCallback) {
-                            ((PasswordCallback) 
callbacks[i]).setPassword(password.toCharArray());
+                    for (final Callback callback : callbacks) {
+                        if (callback instanceof NameCallback) {
+                            ((NameCallback) callback).setName(username);
+                        } else if (callback instanceof PasswordCallback) {
+                            ((PasswordCallback) 
callback).setPassword(password.toCharArray());
                         } else {
-                            throw new 
UnsupportedCallbackException(callbacks[i]);
+                            throw new UnsupportedCallbackException(callback);
                         }
                     }
                 }
             });
             loginContext.login();
-            shellFactory.setUsername(username);
-            shellFactory.setLoginContext(loginContext);
+
+            session.setAttribute(USERNAME_KEY, username);
+            session.setAttribute(LOGIN_CONTEXT_KEY, loginContext);
             return true;
         } catch (Exception e) {
             LOGGER.debug("can't log using username '" + username + "'", e);

Modified: 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBShellFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBShellFactory.java?rev=1598526&r1=1598525&r2=1598526&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBShellFactory.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/OpenEJBShellFactory.java
 Fri May 30 09:42:46 2014
@@ -19,13 +19,9 @@ package org.apache.openejb.server.ssh;
 import org.apache.sshd.common.Factory;
 import org.apache.sshd.server.Command;
 
-import javax.security.auth.login.LoginContext;
-
 public class OpenEJBShellFactory implements Factory<Command> {
     private String bind;
     private int port;
-    private ThreadLocal<String> username = new ThreadLocal<String>();
-    private ThreadLocal<LoginContext> loginContext = new 
ThreadLocal<LoginContext>();
 
     public OpenEJBShellFactory(String bind, int port) {
         this.bind = bind;
@@ -34,14 +30,6 @@ public class OpenEJBShellFactory impleme
 
     @Override
     public Command create() {
-        return new OpenEJBCommands(bind, port, username.get(), 
loginContext.get());
-    }
-
-    public void setUsername(final String username) {
-        this.username.set(username);
-    }
-
-    public void setLoginContext(final LoginContext lc) {
-        loginContext.set(lc);
+        return new OpenEJBCommands(bind, port);
     }
 }

Modified: 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/SSHServer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/SSHServer.java?rev=1598526&r1=1598525&r2=1598526&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/SSHServer.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ssh/src/main/java/org/apache/openejb/server/ssh/SSHServer.java
 Fri May 30 09:42:46 2014
@@ -57,7 +57,7 @@ public class SSHServer implements Server
         final OpenEJBShellFactory sf = new OpenEJBShellFactory(bind, port);
         sshServer.setShellFactory(sf);
 
-        final JaasPasswordAuthenticator authenticator = new 
OpenEJBJaasPasswordAuthenticator(sf);
+        final JaasPasswordAuthenticator authenticator = new 
OpenEJBJaasPasswordAuthenticator();
         authenticator.setDomain(domain);
         sshServer.setPasswordAuthenticator(authenticator);
 


Reply via email to