Repository: karaf Updated Branches: refs/heads/master f03731719 -> dffc30f75
KARAF-2772 Move ConsoleFactory to separate package, simplify interface Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/c724c426 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/c724c426 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/c724c426 Branch: refs/heads/master Commit: c724c4263a62c0bbf0a96b13782e6336e15ce5e4 Parents: 79cf409 Author: Christian Schneider <[email protected]> Authored: Fri Feb 21 21:10:00 2014 +0100 Committer: Christian Schneider <[email protected]> Committed: Fri Feb 21 21:10:00 2014 +0100 ---------------------------------------------------------------------- shell/console/pom.xml | 1 + .../karaf/shell/console/ConsoleFactory.java | 35 -------- .../shell/console/factory/ConsoleFactory.java | 30 +++++++ .../impl/jline/ConsoleFactoryService.java | 63 +++----------- .../console/impl/jline/DelayedStarted.java | 8 +- .../console/impl/jline/LocalConsoleManager.java | 86 +++++++++++--------- .../impl/SecuredCommandProcessorImpl.java | 5 +- .../org/apache/karaf/shell/util/ShellUtil.java | 15 ++++ .../OSGI-INF/blueprint/karaf-console.xml | 6 +- .../karaf/shell/ssh/ShellFactoryImpl.java | 23 +++--- .../resources/OSGI-INF/blueprint/shell-ssh.xml | 14 +--- .../karaf/webconsole/gogo/GogoPlugin.java | 35 ++++---- .../OSGI-INF/blueprint/webconsole-gogo.xml | 6 +- 13 files changed, 148 insertions(+), 179 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/pom.xml ---------------------------------------------------------------------- diff --git a/shell/console/pom.xml b/shell/console/pom.xml index f7bd2f5..7b6b65d 100644 --- a/shell/console/pom.xml +++ b/shell/console/pom.xml @@ -155,6 +155,7 @@ org.apache.karaf.shell.console.commands;version=2.3.0, org.apache.karaf.shell.console.completer;version=${project.version}, org.apache.karaf.shell.console.completer;version=2.3.0, + org.apache.karaf.shell.console.factory;version=${project.version}, org.apache.karaf.shell.inject;version=${project.version}, org.apache.karaf.shell.util;version=${project.version}, org.apache.karaf.shell.util;version=2.3.0, http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java b/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java deleted file mode 100644 index f3ac066..0000000 --- a/shell/console/src/main/java/org/apache/karaf/shell/console/ConsoleFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.karaf.shell.console; - -import java.io.InputStream; -import java.io.PrintStream; - -import javax.security.auth.Subject; - -import jline.Terminal; - -import org.apache.felix.service.command.CommandProcessor; -import org.apache.felix.service.threadio.ThreadIO; - -public interface ConsoleFactory { - Console create(CommandProcessor processor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, final Terminal term, String encoding, Runnable closeCallback); - Console createLocal(CommandProcessor processor, ThreadIO threadIO, Terminal terminal, String encoding, Runnable closeCallback); - void startConsoleAs(Console console, Subject subject, String threadName); -} http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java b/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java new file mode 100644 index 0000000..cf16648 --- /dev/null +++ b/shell/console/src/main/java/org/apache/karaf/shell/console/factory/ConsoleFactory.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.karaf.shell.console.factory; + +import java.io.InputStream; +import java.io.PrintStream; + +import jline.Terminal; + +import org.apache.karaf.shell.console.Console; + +public interface ConsoleFactory { + Console create(InputStream in, PrintStream out, PrintStream err, final Terminal term, String encoding, Runnable closeCallback); +} http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java index 93a0b95..2bb853a 100644 --- a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java +++ b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleFactoryService.java @@ -21,23 +21,20 @@ package org.apache.karaf.shell.console.impl.jline; import java.io.InputStream; import java.io.PrintStream; import java.lang.management.ManagementFactory; -import java.security.PrivilegedAction; import java.util.Iterator; import java.util.List; import java.util.Properties; -import javax.security.auth.Subject; - import jline.Terminal; import org.apache.felix.service.command.CommandProcessor; import org.apache.felix.service.command.CommandSession; import org.apache.felix.service.command.Function; import org.apache.felix.service.threadio.ThreadIO; -import org.apache.karaf.jaas.boot.principal.UserPrincipal; import org.apache.karaf.jaas.modules.JaasHelper; import org.apache.karaf.shell.console.Console; -import org.apache.karaf.shell.console.ConsoleFactory; +import org.apache.karaf.shell.console.factory.ConsoleFactory; +import org.apache.karaf.shell.util.ShellUtil; import org.osgi.framework.BundleContext; public class ConsoleFactoryService implements ConsoleFactory { @@ -50,27 +47,23 @@ public class ConsoleFactoryService implements ConsoleFactory { private final BundleContext bundleContext; - public ConsoleFactoryService(BundleContext bc) { + private CommandProcessor processor; + + private ThreadIO threadIO; + + public ConsoleFactoryService(BundleContext bc, CommandProcessor processor, ThreadIO threadIO) { bundleContext = bc; + this.processor = processor; + this.threadIO = threadIO; } @Override - public Console createLocal(CommandProcessor processor, ThreadIO threadIO, final Terminal terminal, String encoding, Runnable closeCallback) { - return create(processor, - threadIO, - StreamWrapUtil.reWrapIn(terminal, System.in), - StreamWrapUtil.reWrap(System.out), - StreamWrapUtil.reWrap(System.err), - terminal, - encoding, - closeCallback); - } - - @Override - public Console create(CommandProcessor processor, ThreadIO threadIO, InputStream in, PrintStream out, PrintStream err, final Terminal terminal, + public Console create(InputStream in, PrintStream out, PrintStream err, final Terminal terminal, String encoding, Runnable closeCallback) { ConsoleImpl console = new ConsoleImpl(processor, threadIO, in, out, err, terminal, encoding, closeCallback, bundleContext); CommandSession session = console.getSession(); + + session.put("USER", ShellUtil.getCurrentUserName()); session.put("APPLICATION", System.getProperty("karaf.name", "root")); session.put("#LINES", new Function() { public Object execute(CommandSession session, List<Object> arguments) throws Exception { @@ -102,37 +95,5 @@ public class ConsoleFactoryService implements ConsoleFactory { session.put(key, System.getProperty(key)); } } - - @Override - public void startConsoleAs(final Console console, final Subject subject, String consoleType) { - final String userName = getUserName(subject); - new Thread(console, "Karaf Console " + consoleType + " user " + userName) { - @Override - public void run() { - if (subject != null) { - CommandSession session = console.getSession(); - session.put("USER", userName); - JaasHelper.doAs(subject, new PrivilegedAction<Object>() { - public Object run() { - doRun(); - return null; - } - }); - } else { - doRun(); - } - } - protected void doRun() { - super.run(); - } - }.start(); - } - private String getUserName(final Subject subject) { - if (subject != null && subject.getPrincipals().iterator().hasNext()) { - return subject.getPrincipals(UserPrincipal.class).iterator().next().getName(); - } else { - return null; - } - } } http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java index a874fb1..87fb284 100644 --- a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java +++ b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/DelayedStarted.java @@ -36,10 +36,10 @@ class DelayedStarted extends Thread implements FrameworkListener { private final Runnable console; private final BundleContext bundleContext; - DelayedStarted(Runnable console, BundleContext bundleContext, InputStream in) { - super("Karaf Shell Console Thread"); - this.console = console; - this.bundleContext = bundleContext; + DelayedStarted(Runnable console, String name, BundleContext bundleContext, InputStream in) { + super(name); + this.console = console; + this.bundleContext = bundleContext; this.in = in; int defaultStartLevel = Integer.parseInt(System.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL)); int startLevel = bundleContext.getBundle(0).adapt(FrameworkStartLevel.class).getStartLevel(); http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java index 9ea2f96..906a9ad 100644 --- a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java +++ b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java @@ -19,50 +19,42 @@ package org.apache.karaf.shell.console.impl.jline; import java.nio.charset.Charset; +import java.security.PrivilegedAction; import javax.security.auth.Subject; import jline.Terminal; -import org.apache.felix.service.command.CommandProcessor; + import org.apache.felix.service.command.CommandSession; -import org.apache.felix.service.threadio.ThreadIO; import org.apache.karaf.jaas.boot.principal.RolePrincipal; import org.apache.karaf.jaas.boot.principal.UserPrincipal; +import org.apache.karaf.jaas.modules.JaasHelper; import org.apache.karaf.shell.console.Console; -import org.apache.karaf.shell.console.ConsoleFactory; +import org.apache.karaf.shell.console.factory.ConsoleFactory; +import org.apache.karaf.shell.util.ShellUtil; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class LocalConsoleManager { - private static final Logger LOGGER = LoggerFactory.getLogger(LocalConsoleManager.class); - private ConsoleFactory consoleFactory; private BundleContext bundleContext; private TerminalFactory terminalFactory; private Console console; private boolean start; private final int defaultStartLevel; - private CommandProcessor commandProcessor; - private ThreadIO threadIO; - private ServiceRegistration registration; + private ServiceRegistration<?> registration; public LocalConsoleManager(boolean start, String defaultStartLevel, BundleContext bundleContext, TerminalFactory terminalFactory, - ConsoleFactory consoleFactory, - CommandProcessor commandProcessor, - ThreadIO threadIO) throws Exception { + ConsoleFactory consoleFactory) throws Exception { this.start = start; this.defaultStartLevel = Integer.parseInt(defaultStartLevel); this.bundleContext = bundleContext; this.terminalFactory = terminalFactory; this.consoleFactory = consoleFactory; - this.commandProcessor = commandProcessor; - this.threadIO = threadIO; start(); } @@ -70,18 +62,10 @@ public class LocalConsoleManager { if (!start) { return; } - final Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal("karaf")); - - String roles = System.getProperty("karaf.local.roles"); - if (roles != null) { - for (String role : roles.split("[,]")) { - subject.getPrincipals().add(new RolePrincipal(role.trim())); - } - } + final Terminal terminal = terminalFactory.getTerminal(); - Runnable callback = new Runnable() { + final Runnable callback = new Runnable() { public void run() { try { bundleContext.getBundle(0).stop(); @@ -90,6 +74,35 @@ public class LocalConsoleManager { } } }; + + + final Subject subject = createLocalKarafSubject(); + this.console = JaasHelper.<Console>doAs(subject, new PrivilegedAction<Console>() { + public Console run() { + String encoding = getEncoding(); + console = consoleFactory.create( + StreamWrapUtil.reWrapIn(terminal, System.in), + StreamWrapUtil.reWrap(System.out), + StreamWrapUtil.reWrap(System.err), + terminal, + encoding, + callback); + String name = "Karaf local console user " + ShellUtil.getCurrentUserName(); + boolean delayconsole = Boolean.parseBoolean(System.getProperty("karaf.delay.console")); + if (delayconsole) { + DelayedStarted watcher = new DelayedStarted(console, name, bundleContext, System.in); + new Thread(watcher).start(); + } else { + new Thread(console, name).start(); + } + return console; + } + }); + registration = bundleContext.registerService(CommandSession.class, console.getSession(), null); + + } + + private String getEncoding() { String ctype = System.getenv("LC_CTYPE"); String encoding = ctype; if (encoding != null && encoding.indexOf('.') > 0) { @@ -97,23 +110,20 @@ public class LocalConsoleManager { } else { encoding = System.getProperty("input.encoding", Charset.defaultCharset().name()); } - this.console = consoleFactory.createLocal(this.commandProcessor, this.threadIO, terminal, encoding, callback); + return encoding; + } - registration = bundleContext.registerService(CommandSession.class, console.getSession(), null); + private Subject createLocalKarafSubject() { + final Subject subject = new Subject(); + subject.getPrincipals().add(new UserPrincipal("karaf")); - Runnable consoleStarter = new Runnable() { - public void run() { - consoleFactory.startConsoleAs(console, subject, "Local"); + String roles = System.getProperty("karaf.local.roles"); + if (roles != null) { + for (String role : roles.split("[,]")) { + subject.getPrincipals().add(new RolePrincipal(role.trim())); } - }; - - boolean delayconsole = Boolean.parseBoolean(System.getProperty("karaf.delay.console")); - if (delayconsole) { - DelayedStarted watcher = new DelayedStarted(consoleStarter, bundleContext, System.in); - new Thread(watcher).start(); - } else { - consoleStarter.run(); } + return subject; } public void stop() throws Exception { http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java b/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java index 84224c4..bb47d74 100644 --- a/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java +++ b/shell/console/src/main/java/org/apache/karaf/shell/security/impl/SecuredCommandProcessorImpl.java @@ -25,6 +25,7 @@ import org.apache.felix.service.command.Converter; import org.apache.felix.service.command.Function; import org.apache.felix.service.threadio.ThreadIO; import org.apache.karaf.jaas.boot.principal.RolePrincipal; +import org.apache.karaf.shell.util.ShellUtil; import org.osgi.framework.BundleContext; import org.osgi.framework.Filter; import org.osgi.framework.InvalidSyntaxException; @@ -32,6 +33,8 @@ import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; import javax.security.auth.Subject; + +import java.nio.file.attribute.UserPrincipal; import java.security.AccessControlContext; import java.security.AccessController; import java.util.ArrayList; @@ -62,7 +65,7 @@ public class SecuredCommandProcessorImpl extends CommandProcessorImpl { Set<RolePrincipal> rolePrincipals = sub.getPrincipals(RolePrincipal.class); if (rolePrincipals.size() == 0) - throw new SecurityException("Current user has no associated roles."); + throw new SecurityException("Current user " + ShellUtil.getCurrentUserName() + " has no associated roles."); // TODO cater for custom roles StringBuilder sb = new StringBuilder(); http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java ---------------------------------------------------------------------- diff --git a/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java b/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java index 388a0a6..e8a1d6a 100644 --- a/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java +++ b/shell/console/src/main/java/org/apache/karaf/shell/util/ShellUtil.java @@ -26,8 +26,13 @@ import static org.apache.karaf.shell.commands.ansi.SimpleAnsi.INTENSITY_NORMAL; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; +import java.security.AccessControlContext; +import java.security.AccessController; + +import javax.security.auth.Subject; import org.apache.felix.service.command.CommandSession; +import org.apache.karaf.jaas.boot.principal.UserPrincipal; import org.apache.karaf.shell.commands.CommandException; import org.apache.karaf.shell.console.SessionProperties; import org.osgi.framework.Bundle; @@ -171,4 +176,14 @@ public class ShellUtil { } } + public static String getCurrentUserName() { + AccessControlContext acc = AccessController.getContext(); + final Subject subject = Subject.getSubject(acc); + if (subject != null && subject.getPrincipals(UserPrincipal.class).iterator().hasNext()) { + return subject.getPrincipals(UserPrincipal.class).iterator().next().getName(); + } else { + return null; + } + } + } http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml ---------------------------------------------------------------------- diff --git a/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml b/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml index bbe0c5b..f8b8837 100644 --- a/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml +++ b/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml @@ -31,8 +31,10 @@ <bean id="consoleFactoryService" class="org.apache.karaf.shell.console.impl.jline.ConsoleFactoryService"> <argument ref="blueprintBundleContext"/> + <argument ref="commandProcessor"/> + <argument ref="threadIO"/> </bean> - <service interface="org.apache.karaf.shell.console.ConsoleFactory" ref="consoleFactoryService"/> + <service interface="org.apache.karaf.shell.console.factory.ConsoleFactory" ref="consoleFactoryService"/> <bean id="consoleFactory" class="org.apache.karaf.shell.console.impl.jline.LocalConsoleManager" destroy-method="stop"> @@ -41,8 +43,6 @@ <argument ref="blueprintBundleContext"/> <argument ref="terminalFactory"/> <argument ref="consoleFactoryService"/> - <argument ref="commandProcessor"/> - <argument ref="threadIO"/> </bean> <bean id="converters" class="org.apache.karaf.shell.console.impl.Converters"> http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java ---------------------------------------------------------------------- diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java index 08bf0d8..657193b 100644 --- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java +++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java @@ -24,18 +24,18 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; +import java.security.PrivilegedAction; import java.util.Map; import javax.security.auth.Subject; import jline.Terminal; -import org.apache.felix.service.command.CommandProcessor; import org.apache.felix.service.command.CommandSession; +import org.apache.karaf.jaas.modules.JaasHelper; import org.apache.karaf.shell.console.Console; -import org.apache.karaf.shell.console.ConsoleFactory; -import org.apache.felix.service.command.Function; -import org.apache.felix.service.threadio.ThreadIO; +import org.apache.karaf.shell.console.factory.ConsoleFactory; +import org.apache.karaf.shell.util.ShellUtil; import org.apache.sshd.common.Factory; import org.apache.sshd.server.Command; import org.apache.sshd.server.Environment; @@ -49,14 +49,10 @@ import org.osgi.service.blueprint.container.ReifiedType; * Shell. */ public class ShellFactoryImpl implements Factory<Command> { - private CommandProcessor commandProcessor; private ConsoleFactory consoleFactory; - private ThreadIO threadIO; - public ShellFactoryImpl(CommandProcessor commandProcessor, ConsoleFactory consoleFactory, ThreadIO threadIO) { - this.commandProcessor = commandProcessor; + public ShellFactoryImpl(ConsoleFactory consoleFactory) { this.consoleFactory = consoleFactory; - this.threadIO = threadIO; } public Command create() { @@ -110,13 +106,18 @@ public class ShellFactoryImpl implements Factory<Command> { if (encoding != null && encoding.indexOf('.') > 0) { encoding = encoding.substring(encoding.indexOf('.') + 1); } - Console console = consoleFactory.create(commandProcessor, threadIO, in, + final Console console = consoleFactory.create(in, lfToCrLfPrintStream(out), lfToCrLfPrintStream(err), terminal, encoding, destroyCallback); final CommandSession session = console.getSession(); for (Map.Entry<String, String> e : env.getEnv().entrySet()) { session.put(e.getKey(), e.getValue()); } - consoleFactory.startConsoleAs(console, subject, "ssh"); + JaasHelper.doAs(subject, new PrivilegedAction<Object>() { + public Object run() { + new Thread(console, "Karaf ssh console user " + ShellUtil.getCurrentUserName()).start(); + return null; + } + }); } catch (Exception e) { throw (IOException) new IOException("Unable to start shell").initCause(e); } http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml ---------------------------------------------------------------------- diff --git a/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml b/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml index fc63ceb..7a58288 100644 --- a/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml +++ b/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml @@ -24,13 +24,11 @@ default-activation="lazy"> <type-converters> - <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl" factory-method="getConverter" > - - </bean> + <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl" factory-method="getConverter" /> <bean class="org.apache.karaf.shell.ssh.UserAuthFactoriesFactory" factory-method="getConverter" /> </type-converters> - <reference id="consoleFactory" interface="org.apache.karaf.shell.console.ConsoleFactory" /> + <reference id="consoleFactory" interface="org.apache.karaf.shell.console.factory.ConsoleFactory" /> <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"> <ext:default-properties> @@ -93,9 +91,7 @@ </property> <property name="shellFactory"> <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl"> - <argument ref="commandProcessor"/> <argument ref="consoleFactory"/> - <argument ref="threadIO"/> </bean> </property> <property name="commandFactory"> @@ -148,10 +144,6 @@ <property name="idleTimeout" value="${sshIdleTimeout}"/> </bean> - <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor"> - </reference> - - <reference id="threadIO" interface="org.apache.felix.service.threadio.ThreadIO"> - </reference> + <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor"/> </blueprint> http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java ---------------------------------------------------------------------- diff --git a/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java b/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java index 077c31b..dcfb00d 100644 --- a/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java +++ b/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java @@ -40,11 +40,10 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.felix.service.command.CommandProcessor; -import org.apache.felix.service.threadio.ThreadIO; -import org.apache.karaf.shell.console.Console; -import org.apache.karaf.shell.console.ConsoleFactory; import org.apache.felix.webconsole.AbstractWebConsolePlugin; +import org.apache.karaf.jaas.boot.principal.UserPrincipal; +import org.apache.karaf.shell.console.Console; +import org.apache.karaf.shell.console.factory.ConsoleFactory; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,9 +61,7 @@ public class GogoPlugin extends AbstractWebConsolePlugin { public static final int TERM_HEIGHT = 39; private BundleContext bundleContext; - private CommandProcessor commandProcessor; private ConsoleFactory consoleFactory; - private ThreadIO threadIO; @Override protected boolean isHtmlRequest(HttpServletRequest request) { @@ -75,18 +72,10 @@ public class GogoPlugin extends AbstractWebConsolePlugin { this.bundleContext = bundleContext; } - public void setCommandProcessor(CommandProcessor commandProcessor) { - this.commandProcessor = commandProcessor; - } - public void setConsoleFactory(ConsoleFactory consoleFactory) { this.consoleFactory = consoleFactory; } - public void setThreadIO(ThreadIO threadIO) { - this.threadIO = threadIO; - } - public void start() { super.activate(bundleContext); this.logger.info(LABEL + " plugin activated"); @@ -195,19 +184,15 @@ public class GogoPlugin extends AbstractWebConsolePlugin { in = new PipedOutputStream(); out = new PipedInputStream(); PrintStream pipedOut = new PrintStream(new PipedOutputStream(out), true); - - AccessControlContext acc = AccessController.getContext(); - final Subject subject = Subject.getSubject(acc); - Console console = consoleFactory.create(commandProcessor, - threadIO, + Console console = consoleFactory.create( new PipedInputStream(in), pipedOut, pipedOut, new WebTerminal(TERM_WIDTH, TERM_HEIGHT), null, null); - consoleFactory.startConsoleAs(console, subject, "Web"); + new Thread(console, "Karaf web console user " + getCurrentUserName()).start(); } catch (IOException e) { e.printStackTrace(); throw e; @@ -217,6 +202,16 @@ public class GogoPlugin extends AbstractWebConsolePlugin { } new Thread(this).start(); } + + private String getCurrentUserName() { + AccessControlContext acc = AccessController.getContext(); + final Subject subject = Subject.getSubject(acc); + if (subject != null && subject.getPrincipals().iterator().hasNext()) { + return subject.getPrincipals(UserPrincipal.class).iterator().next().getName(); + } else { + return null; + } + } public boolean isClosed() { return closed; http://git-wip-us.apache.org/repos/asf/karaf/blob/c724c426/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml ---------------------------------------------------------------------- diff --git a/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml b/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml index 9a17021..79fc42c 100644 --- a/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml +++ b/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml @@ -19,13 +19,9 @@ --> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy"> - <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor" /> - <reference id="consoleFactory" interface="org.apache.karaf.shell.console.ConsoleFactory"/> - <reference id="threadIO" interface="org.apache.felix.service.threadio.ThreadIO" /> + <reference id="consoleFactory" interface="org.apache.karaf.shell.console.factory.ConsoleFactory"/> <bean id="gogoPlugin" class="org.apache.karaf.webconsole.gogo.GogoPlugin" init-method="start" destroy-method="stop"> - <property name="commandProcessor" ref="commandProcessor" /> - <property name="threadIO" ref="threadIO" /> <property name="bundleContext" ref="blueprintBundleContext" /> <property name="consoleFactory" ref="consoleFactory"/> </bean>
