提交 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 {
*/
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.
*
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册