diff options
Diffstat (limited to 'org.eclipse.jgit.pgm/src/org/eclipse')
4 files changed, 297 insertions, 46 deletions
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java new file mode 100644 index 0000000000..bdaccb0657 --- /dev/null +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleAuthenticator.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2009, Google Inc. + * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.console; + +import java.io.Console; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.text.MessageFormat; + +import org.eclipse.jgit.util.CachedAuthenticator; + +import org.eclipse.jgit.pgm.internal.CLIText; + +/** + * Basic network prompt for username/password when using the console. + * + * @since 4.0 + */ +public class ConsoleAuthenticator extends CachedAuthenticator { + /** Install this authenticator implementation into the JVM. */ + public static void install() { + final ConsoleAuthenticator c = new ConsoleAuthenticator(); + if (c.cons == null) + throw new NoClassDefFoundError( + CLIText.get().noSystemConsoleAvailable); + Authenticator.setDefault(c); + } + + private final Console cons = System.console(); + + @Override + protected PasswordAuthentication promptPasswordAuthentication() { + final String realm = formatRealm(); + String username = cons.readLine(MessageFormat.format( + CLIText.get().usernameFor + " ", realm)); //$NON-NLS-1$ + if (username == null || username.isEmpty()) { + return null; + } + char[] password = cons.readPassword(CLIText.get().password + " "); //$NON-NLS-1$ + if (password == null) { + password = new char[0]; + } + return new PasswordAuthentication(username, password); + } + + private String formatRealm() { + final StringBuilder realm = new StringBuilder(); + if (getRequestorType() == RequestorType.PROXY) { + realm.append(getRequestorType()); + realm.append(" "); //$NON-NLS-1$ + realm.append(getRequestingHost()); + if (getRequestingPort() > 0) { + realm.append(":"); //$NON-NLS-1$ + realm.append(getRequestingPort()); + } + } else { + realm.append(getRequestingURL()); + } + return realm.toString(); + } +} diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java new file mode 100644 index 0000000000..e805add814 --- /dev/null +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/console/ConsoleCredentialsProvider.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2010, Google Inc. + * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> + * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.console; + +import java.io.Console; + +import org.eclipse.jgit.errors.UnsupportedCredentialItem; +import org.eclipse.jgit.transport.ChainingCredentialsProvider; +import org.eclipse.jgit.transport.CredentialItem; +import org.eclipse.jgit.transport.CredentialsProvider; +import org.eclipse.jgit.transport.NetRCCredentialsProvider; +import org.eclipse.jgit.transport.URIish; + +import org.eclipse.jgit.pgm.internal.CLIText; + +/** + * Interacts with the user during authentication by using the text console. + * + * @since 4.0 + */ +public class ConsoleCredentialsProvider extends CredentialsProvider { + /** Install this implementation as the default. */ + public static void install() { + final ConsoleCredentialsProvider c = new ConsoleCredentialsProvider(); + if (c.cons == null) + throw new NoClassDefFoundError( + CLIText.get().noSystemConsoleAvailable); + CredentialsProvider cp = new ChainingCredentialsProvider( + new NetRCCredentialsProvider(), c); + CredentialsProvider.setDefault(cp); + } + + private final Console cons = System.console(); + + @Override + public boolean isInteractive() { + return true; + } + + @Override + public boolean supports(CredentialItem... items) { + for (CredentialItem i : items) { + if (i instanceof CredentialItem.StringType) + continue; + + else if (i instanceof CredentialItem.CharArrayType) + continue; + + else if (i instanceof CredentialItem.YesNoType) + continue; + + else if (i instanceof CredentialItem.InformationalMessage) + continue; + + else + return false; + } + return true; + } + + @Override + public boolean get(URIish uri, CredentialItem... items) + throws UnsupportedCredentialItem { + boolean ok = true; + for (int i = 0; i < items.length && ok; i++) { + CredentialItem item = items[i]; + + if (item instanceof CredentialItem.StringType) + ok = get((CredentialItem.StringType) item); + + else if (item instanceof CredentialItem.CharArrayType) + ok = get((CredentialItem.CharArrayType) item); + + else if (item instanceof CredentialItem.YesNoType) + ok = get((CredentialItem.YesNoType) item); + + else if (item instanceof CredentialItem.InformationalMessage) + ok = get((CredentialItem.InformationalMessage) item); + + else + throw new UnsupportedCredentialItem(uri, item.getPromptText()); + } + return ok; + } + + private boolean get(CredentialItem.StringType item) { + if (item.isValueSecure()) { + char[] v = cons.readPassword("%s: ", item.getPromptText()); //$NON-NLS-1$ + if (v != null) { + item.setValue(new String(v)); + return true; + } else { + return false; + } + } else { + String v = cons.readLine("%s: ", item.getPromptText()); //$NON-NLS-1$ + if (v != null) { + item.setValue(v); + return true; + } else { + return false; + } + } + } + + private boolean get(CredentialItem.CharArrayType item) { + if (item.isValueSecure()) { + char[] v = cons.readPassword("%s: ", item.getPromptText()); //$NON-NLS-1$ + if (v != null) { + item.setValueNoCopy(v); + return true; + } else { + return false; + } + } else { + String v = cons.readLine("%s: ", item.getPromptText()); //$NON-NLS-1$ + if (v != null) { + item.setValueNoCopy(v.toCharArray()); + return true; + } else { + return false; + } + } + } + + private boolean get(CredentialItem.InformationalMessage item) { + cons.printf("%s\n", item.getPromptText()); //$NON-NLS-1$ + cons.flush(); + return true; + } + + private boolean get(CredentialItem.YesNoType item) { + String r = cons.readLine("%s [%s/%s]? ", item.getPromptText(), //$NON-NLS-1$ + CLIText.get().answerYes, CLIText.get().answerNo); + if (r != null) { + item.setValue(CLIText.get().answerYes.equalsIgnoreCase(r)); + return true; + } else { + return false; + } + } +} diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java index 7151de794d..38c3a2fcd4 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java @@ -47,15 +47,14 @@ package org.eclipse.jgit.pgm; import java.io.File; import java.io.IOException; import java.io.PrintWriter; -import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; -import org.eclipse.jgit.awtui.AwtAuthenticator; -import org.eclipse.jgit.awtui.AwtCredentialsProvider; +import org.eclipse.jgit.console.ConsoleAuthenticator; +import org.eclipse.jgit.console.ConsoleCredentialsProvider; import org.eclipse.jgit.errors.TransportException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryBuilder; @@ -116,10 +115,8 @@ public class Main { */ protected void run(final String[] argv) { try { - if (!installConsole()) { - AwtAuthenticator.install(); - AwtCredentialsProvider.install(); - } + ConsoleAuthenticator.install(); + ConsoleCredentialsProvider.install(); configureHttpProxy(); execute(argv); } catch (Die err) { @@ -249,45 +246,6 @@ public class Main { return rb.build(); } - private static boolean installConsole() { - try { - install("org.eclipse.jgit.console.ConsoleAuthenticator"); //$NON-NLS-1$ - install("org.eclipse.jgit.console.ConsoleCredentialsProvider"); //$NON-NLS-1$ - return true; - } catch (ClassNotFoundException e) { - return false; - } catch (NoClassDefFoundError e) { - return false; - } catch (UnsupportedClassVersionError e) { - return false; - - } catch (IllegalArgumentException e) { - throw new RuntimeException(CLIText.get().cannotSetupConsole, e); - } catch (SecurityException e) { - throw new RuntimeException(CLIText.get().cannotSetupConsole, e); - } catch (IllegalAccessException e) { - throw new RuntimeException(CLIText.get().cannotSetupConsole, e); - } catch (InvocationTargetException e) { - throw new RuntimeException(CLIText.get().cannotSetupConsole, e); - } catch (NoSuchMethodException e) { - throw new RuntimeException(CLIText.get().cannotSetupConsole, e); - } - } - - private static void install(final String name) - throws IllegalAccessException, InvocationTargetException, - NoSuchMethodException, ClassNotFoundException { - try { - Class.forName(name).getMethod("install").invoke(null); //$NON-NLS-1$ - } catch (InvocationTargetException e) { - if (e.getCause() instanceof RuntimeException) - throw (RuntimeException) e.getCause(); - if (e.getCause() instanceof Error) - throw (Error) e.getCause(); - throw e; - } - } - /** * Configure the JRE's standard HTTP based on <code>http_proxy</code>. * <p> diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java index e7d995e6ae..433ddf2b13 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java @@ -77,6 +77,8 @@ public class CLIText extends TranslationBundle { // @formatter:off /***/ public String alreadyOnBranch; /***/ public String alreadyUpToDate; + /***/ public String answerNo; + /***/ public String answerYes; /***/ public String authorInfo; /***/ public String averageMSPerRead; /***/ public String branchAlreadyExists; @@ -191,6 +193,7 @@ public class CLIText extends TranslationBundle { /***/ public String noSuchRemoteRef; /***/ public String noTREESectionInIndex; /***/ public String nonFastForward; + /***/ public String noSystemConsoleAvailable; /***/ public String notABranch; /***/ public String notACommit; /***/ public String notAGitRepository; @@ -208,6 +211,7 @@ public class CLIText extends TranslationBundle { /***/ public String onBranch; /***/ public String onlyOneMetaVarExpectedIn; /***/ public String onlyOneOfIncludeOnlyAllInteractiveCanBeUsed; + /***/ public String password; /***/ public String pathspecDidNotMatch; /***/ public String pushTo; /***/ public String pathsRequired; @@ -245,4 +249,5 @@ public class CLIText extends TranslationBundle { /***/ public String unsupportedOperation; /***/ public String untrackedFiles; /***/ public String updating; + /***/ public String usernameFor; } |