提交 5051f144 编写于 作者: K Kohsuke Kawaguchi

added a call path to call CLICommand without requiring a Channel

上级 c1f8fef7
...@@ -135,6 +135,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { ...@@ -135,6 +135,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
*/ */
public transient Locale locale; public transient Locale locale;
private transient Authentication transportAuth;
/** /**
* Gets the command name. * Gets the command name.
...@@ -170,7 +171,6 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { ...@@ -170,7 +171,6 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
this.stdout = stdout; this.stdout = stdout;
this.stderr = stderr; this.stderr = stderr;
this.locale = locale; this.locale = locale;
this.channel = Channel.current();
registerOptionHandlers(); registerOptionHandlers();
CmdLineParser p = new CmdLineParser(this); CmdLineParser p = new CmdLineParser(this);
...@@ -184,7 +184,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { ...@@ -184,7 +184,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
try { try {
p.parseArgument(args.toArray(new String[args.size()])); p.parseArgument(args.toArray(new String[args.size()]));
Authentication auth = authenticator.authenticate(); Authentication auth = authenticator.authenticate();
if (auth== Jenkins.ANONYMOUS) if (auth==Jenkins.ANONYMOUS)
auth = loadStoredAuthentication(); auth = loadStoredAuthentication();
sc.setAuthentication(auth); // run the CLI with the right credential sc.setAuthentication(auth); // run the CLI with the right credential
if (!(this instanceof LoginCommand || this instanceof HelpCommand)) if (!(this instanceof LoginCommand || this instanceof HelpCommand))
...@@ -207,16 +207,18 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { ...@@ -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 { protected Authentication loadStoredAuthentication() throws InterruptedException {
try { try {
return new ClientAuthenticationCache(channel).get(); if (channel!=null)
return new ClientAuthenticationCache(channel).get();
} catch (IOException e) { } catch (IOException e) {
stderr.println("Failed to access the stored credential"); stderr.println("Failed to access the stored credential");
e.printStackTrace(stderr); // recover e.printStackTrace(stderr); // recover
return Jenkins.ANONYMOUS;
} }
return Jenkins.ANONYMOUS;
} }
/** /**
...@@ -256,11 +258,15 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { ...@@ -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}. * If the transport doesn't do authentication, this method returns {@link jenkins.model.Jenkins#ANONYMOUS}.
*/ */
public Authentication getTransportAuthentication() { public Authentication getTransportAuthentication() {
Authentication a = channel.getProperty(TRANSPORT_AUTHENTICATION); Authentication a = transportAuth;
if (a==null) a = Jenkins.ANONYMOUS; if (a==null) a = Jenkins.ANONYMOUS;
return a; return a;
} }
public void setTransportAuth(Authentication transportAuth) {
this.transportAuth = transportAuth;
}
/** /**
* Executes the command, and return the exit code. * Executes the command, and return the exit code.
* *
......
...@@ -23,36 +23,18 @@ ...@@ -23,36 +23,18 @@
*/ */
package hudson.cli; package hudson.cli;
import hudson.model.User;
import hudson.remoting.Channel; import hudson.remoting.Channel;
import hudson.remoting.Pipe; 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.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.io.Serializable; 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 java.util.logging.Logger;
import static java.util.logging.Level.*;
/** /**
* {@link CliEntryPoint} implementation exposed to the remote CLI. * {@link CliEntryPoint} implementation exposed to the remote CLI.
* *
...@@ -77,8 +59,10 @@ public class CliManagerImpl implements CliEntryPoint, Serializable { ...@@ -77,8 +59,10 @@ public class CliManagerImpl implements CliEntryPoint, Serializable {
String subCmd = args.get(0); String subCmd = args.get(0);
CLICommand cmd = CLICommand.clone(subCmd); CLICommand cmd = CLICommand.clone(subCmd);
if(cmd!=null) { if(cmd!=null) {
cmd.channel = Channel.current();
final CLICommand old = CLICommand.setCurrent(cmd); final CLICommand old = CLICommand.setCurrent(cmd);
try { try {
cmd.setTransportAuth(Channel.current().getProperty(CLICommand.TRANSPORT_AUTHENTICATION));
return cmd.main(args.subList(1,args.size()),locale, stdin, out, err); return cmd.main(args.subList(1,args.size()),locale, stdin, out, err);
} finally { } finally {
CLICommand.setCurrent(old); CLICommand.setCurrent(old);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册