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);