From 5051f144ae313bb05b63e196a8a39ed4f1b76636 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 23 Dec 2011 13:45:43 -0800 Subject: [PATCH] added a call path to call CLICommand without requiring a Channel --- core/src/main/java/hudson/cli/CLICommand.java | 18 ++++++++----- .../main/java/hudson/cli/CliManagerImpl.java | 26 ++++--------------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index c0dd18fb3b..f10f345642 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -135,6 +135,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { */ public transient Locale locale; + private transient Authentication transportAuth; /** * Gets the command name. @@ -170,7 +171,6 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { this.stdout = stdout; this.stderr = stderr; this.locale = locale; - this.channel = Channel.current(); registerOptionHandlers(); CmdLineParser p = new CmdLineParser(this); @@ -184,7 +184,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { try { p.parseArgument(args.toArray(new String[args.size()])); Authentication auth = authenticator.authenticate(); - if (auth== Jenkins.ANONYMOUS) + if (auth==Jenkins.ANONYMOUS) auth = loadStoredAuthentication(); sc.setAuthentication(auth); // run the CLI with the right credential if (!(this instanceof LoginCommand || this instanceof HelpCommand)) @@ -207,16 +207,18 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { } /** - * Loads the persisted authentication information from {@link ClientAuthenticationCache}. + * Loads the persisted authentication information from {@link ClientAuthenticationCache} + * if the current transport provides {@link Channel}. */ protected Authentication loadStoredAuthentication() throws InterruptedException { try { - return new ClientAuthenticationCache(channel).get(); + if (channel!=null) + return new ClientAuthenticationCache(channel).get(); } catch (IOException e) { stderr.println("Failed to access the stored credential"); e.printStackTrace(stderr); // recover - return Jenkins.ANONYMOUS; } + return Jenkins.ANONYMOUS; } /** @@ -256,11 +258,15 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { * If the transport doesn't do authentication, this method returns {@link jenkins.model.Jenkins#ANONYMOUS}. */ public Authentication getTransportAuthentication() { - Authentication a = channel.getProperty(TRANSPORT_AUTHENTICATION); + Authentication a = transportAuth; if (a==null) a = Jenkins.ANONYMOUS; return a; } + public void setTransportAuth(Authentication transportAuth) { + this.transportAuth = transportAuth; + } + /** * Executes the command, and return the exit code. * diff --git a/core/src/main/java/hudson/cli/CliManagerImpl.java b/core/src/main/java/hudson/cli/CliManagerImpl.java index 680b3a9c22..7a479a2ed2 100644 --- a/core/src/main/java/hudson/cli/CliManagerImpl.java +++ b/core/src/main/java/hudson/cli/CliManagerImpl.java @@ -23,36 +23,18 @@ */ package hudson.cli; -import hudson.model.User; import hudson.remoting.Channel; import hudson.remoting.Pipe; -import hudson.util.IOUtils; -import jenkins.model.Jenkins; -import org.apache.commons.discovery.resource.ClassLoaders; -import org.apache.commons.discovery.resource.classes.DiscoverClasses; -import org.apache.commons.discovery.resource.names.DiscoverServiceNames; -import org.apache.commons.discovery.ResourceNameIterator; -import org.apache.commons.discovery.ResourceClassIterator; -import org.kohsuke.args4j.spi.OptionHandler; -import org.kohsuke.args4j.CmdLineParser; -import org.jvnet.tiger_types.Types; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.KeyPair; -import java.security.PublicKey; -import java.util.List; -import java.util.Locale; -import java.util.Collections; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.Serializable; -import java.util.logging.Level; +import java.util.Collections; +import java.util.List; +import java.util.Locale; import java.util.logging.Logger; -import static java.util.logging.Level.*; - /** * {@link CliEntryPoint} implementation exposed to the remote CLI. * @@ -77,8 +59,10 @@ public class CliManagerImpl implements CliEntryPoint, Serializable { String subCmd = args.get(0); CLICommand cmd = CLICommand.clone(subCmd); if(cmd!=null) { + cmd.channel = Channel.current(); final CLICommand old = CLICommand.setCurrent(cmd); try { + cmd.setTransportAuth(Channel.current().getProperty(CLICommand.TRANSPORT_AUTHENTICATION)); return cmd.main(args.subList(1,args.size()),locale, stdin, out, err); } finally { CLICommand.setCurrent(old); -- GitLab