Browse Source
Adds default git command line behaviour of reading credentials for https connections from .netrc file. Bug: 428229 Change-Id: I88699ca5da6a20bdeaed24b7e3899cc1022b8e7c Signed-off-by: Alexey Kuznetsov <axet@me.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>stable-3.5
Alexey Kuznetsov
11 years ago
committed by
Matthias Sohn
4 changed files with 629 additions and 0 deletions
@ -0,0 +1,191 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2014, Alexey Kuznetsov <axet@me.com> |
||||||
|
* |
||||||
|
* 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.transport; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals; |
||||||
|
import static org.junit.Assert.assertNull; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.OutputStreamWriter; |
||||||
|
|
||||||
|
import org.eclipse.jgit.junit.RepositoryTestCase; |
||||||
|
import org.eclipse.jgit.util.FileUtils; |
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
public class NetRCTest extends RepositoryTestCase { |
||||||
|
private File home; |
||||||
|
|
||||||
|
private NetRC netrc; |
||||||
|
|
||||||
|
private File configFile; |
||||||
|
|
||||||
|
@Before |
||||||
|
public void setUp() throws Exception { |
||||||
|
super.setUp(); |
||||||
|
|
||||||
|
home = new File(trash, "home"); |
||||||
|
FileUtils.mkdir(home); |
||||||
|
|
||||||
|
configFile = new File(home, ".netrc"); |
||||||
|
} |
||||||
|
|
||||||
|
private void config(final String data) throws IOException { |
||||||
|
final OutputStreamWriter fw = new OutputStreamWriter( |
||||||
|
new FileOutputStream(configFile), "UTF-8"); |
||||||
|
fw.write(data); |
||||||
|
fw.close(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testNetRCFile() throws Exception { |
||||||
|
config("machine my.host login test password 2222" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "#machine ignore.host.example login ignoreuser password 5555" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "machine twolinehost.example #login kuznetsov.alexey password 5555" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "login twologin password 6666" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "machine afterlinehost.example login test1 password 8888" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "machine macdef.example login test7 password 7777 macdef mac1" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "init +apc 1" + "\n" |
||||||
|
|
||||||
|
+ "init2 +apc 2" + "\n"); |
||||||
|
|
||||||
|
netrc = new NetRC(configFile); |
||||||
|
|
||||||
|
assertNull(netrc.getEntry("ignore.host.example")); |
||||||
|
|
||||||
|
assertNull(netrc.getEntry("cignore.host.example")); |
||||||
|
|
||||||
|
assertEquals("twologin", netrc.getEntry("twolinehost.example").login); |
||||||
|
assertEquals("6666", new String( |
||||||
|
netrc.getEntry("twolinehost.example").password)); |
||||||
|
|
||||||
|
assertEquals("test1", netrc.getEntry("afterlinehost.example").login); |
||||||
|
assertEquals("8888", new String( |
||||||
|
netrc.getEntry("afterlinehost.example").password)); |
||||||
|
|
||||||
|
// macdef test
|
||||||
|
assertEquals("test7", netrc.getEntry("macdef.example").login); |
||||||
|
assertEquals("7777", new String( |
||||||
|
netrc.getEntry("macdef.example").password)); |
||||||
|
assertEquals("init +apc 1" + "\n" + "init2 +apc 2" + "\n", |
||||||
|
netrc.getEntry("macdef.example").macbody); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testNetRCDefault() throws Exception { |
||||||
|
config("machine my.host login test password 2222" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "#machine ignore.host.example login ignoreuser password 5555" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "machine twolinehost.example #login kuznetsov.alexey password 5555" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "login twologin password 6666" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "machine afterlinehost.example login test1 password 8888" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "machine macdef.example login test7 password 7777 macdef mac1" |
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "init +apc 1" + "\n" |
||||||
|
|
||||||
|
+ "init2 +apc 2" + "\n" |
||||||
|
|
||||||
|
+ "\n" |
||||||
|
|
||||||
|
+ "default login test5 password 3333" + "\n" |
||||||
|
|
||||||
|
); |
||||||
|
|
||||||
|
netrc = new NetRC(configFile); |
||||||
|
|
||||||
|
// default test
|
||||||
|
assertEquals("test5", netrc.getEntry("ignore.host.example").login); |
||||||
|
assertEquals("3333", new String( |
||||||
|
netrc.getEntry("ignore.host.example").password)); |
||||||
|
|
||||||
|
// default test
|
||||||
|
assertEquals("test5", new String( |
||||||
|
netrc.getEntry("ignore.host.example").login)); |
||||||
|
assertEquals("3333", new String( |
||||||
|
netrc.getEntry("ignore.host.example").password)); |
||||||
|
|
||||||
|
// default test
|
||||||
|
assertEquals("test5", netrc.getEntry("cignore.host.example").login); |
||||||
|
assertEquals("3333", new String( |
||||||
|
netrc.getEntry("cignore.host.example").password)); |
||||||
|
|
||||||
|
assertEquals("twologin", netrc.getEntry("twolinehost.example").login); |
||||||
|
assertEquals("6666", new String( |
||||||
|
netrc.getEntry("twolinehost.example").password)); |
||||||
|
|
||||||
|
assertEquals("test1", netrc.getEntry("afterlinehost.example").login); |
||||||
|
assertEquals("8888", new String( |
||||||
|
netrc.getEntry("afterlinehost.example").password)); |
||||||
|
|
||||||
|
// macdef test
|
||||||
|
assertEquals("test7", netrc.getEntry("macdef.example").login); |
||||||
|
assertEquals("7777", new String( |
||||||
|
netrc.getEntry("macdef.example").password)); |
||||||
|
assertEquals("init +apc 1" + "\n" + "init2 +apc 2" + "\n", |
||||||
|
netrc.getEntry("macdef.example").macbody); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,319 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2014, Alexey Kuznetsov <axet@me.com> |
||||||
|
* |
||||||
|
* 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.transport; |
||||||
|
|
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.File; |
||||||
|
import java.io.FileReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Collection; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.TreeMap; |
||||||
|
import java.util.regex.Matcher; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
import org.eclipse.jgit.util.FS; |
||||||
|
|
||||||
|
/** |
||||||
|
* NetRC file parser. |
||||||
|
* |
||||||
|
* @since 3.5 |
||||||
|
*/ |
||||||
|
public class NetRC { |
||||||
|
static final Pattern NETRC = Pattern.compile("(\\S+)"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
/** |
||||||
|
* 'default' netrc entry. This is the same as machine name except that |
||||||
|
* default matches any name. There can be only one default token, and it |
||||||
|
* must be after all machine tokens. |
||||||
|
*/ |
||||||
|
static final String DEFAULT_ENTRY = "default"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/** |
||||||
|
* .netrc file entry |
||||||
|
*/ |
||||||
|
public static class NetRCEntry { |
||||||
|
/** |
||||||
|
* login netrc entry |
||||||
|
*/ |
||||||
|
public String login; |
||||||
|
|
||||||
|
/** |
||||||
|
* password netrc entry |
||||||
|
*/ |
||||||
|
public char[] password; |
||||||
|
|
||||||
|
/** |
||||||
|
* machine netrc entry |
||||||
|
*/ |
||||||
|
public String machine; |
||||||
|
|
||||||
|
/** |
||||||
|
* account netrc entry |
||||||
|
*/ |
||||||
|
public String account; |
||||||
|
|
||||||
|
/** |
||||||
|
* macdef netrc entry. Defines a macro. This token functions like the |
||||||
|
* ftp macdef command functions. A macro is defined with the specified |
||||||
|
* name; its contents begins with the next .netrc line and continues |
||||||
|
* until a null line (consecutive new-line characters) is encountered. |
||||||
|
* If a macro named init is defined, it is automatically executed as the |
||||||
|
* last step in the auto-login process. |
||||||
|
*/ |
||||||
|
public String macdef; |
||||||
|
|
||||||
|
/** |
||||||
|
* macro script body of macdef entry. |
||||||
|
*/ |
||||||
|
public String macbody; |
||||||
|
|
||||||
|
/** |
||||||
|
* Default constructor |
||||||
|
*/ |
||||||
|
public NetRCEntry() { |
||||||
|
} |
||||||
|
|
||||||
|
boolean complete() { |
||||||
|
return login != null && password != null && machine != null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private File netrc; |
||||||
|
|
||||||
|
private long lastModified; |
||||||
|
|
||||||
|
private Map<String, NetRCEntry> hosts = new HashMap<String, NetRCEntry>(); |
||||||
|
|
||||||
|
private static final TreeMap<String, State> STATE = new TreeMap<String, NetRC.State>() { |
||||||
|
private static final long serialVersionUID = -4285910831814853334L; |
||||||
|
{ |
||||||
|
put("machine", State.MACHINE); //$NON-NLS-1$
|
||||||
|
put("login", State.LOGIN); //$NON-NLS-1$
|
||||||
|
put("password", State.PASSWORD); //$NON-NLS-1$
|
||||||
|
put(DEFAULT_ENTRY, State.DEFAULT); |
||||||
|
put("account", State.ACCOUNT); //$NON-NLS-1$
|
||||||
|
put("macdef", State.MACDEF); //$NON-NLS-1$
|
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
enum State { |
||||||
|
COMMAND, MACHINE, LOGIN, PASSWORD, DEFAULT, ACCOUNT, MACDEF |
||||||
|
} |
||||||
|
|
||||||
|
/** */ |
||||||
|
public NetRC() { |
||||||
|
netrc = getDefaultFile(); |
||||||
|
if (netrc != null) |
||||||
|
parse(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param netrc |
||||||
|
* the .netrc file |
||||||
|
*/ |
||||||
|
public NetRC(File netrc) { |
||||||
|
this.netrc = netrc; |
||||||
|
parse(); |
||||||
|
} |
||||||
|
|
||||||
|
private static File getDefaultFile() { |
||||||
|
File home = FS.DETECTED.userHome(); |
||||||
|
File netrc = new File(home, ".netrc"); //$NON-NLS-1$
|
||||||
|
if (netrc.exists()) |
||||||
|
return netrc; |
||||||
|
|
||||||
|
netrc = new File(home, "_netrc"); //$NON-NLS-1$
|
||||||
|
if (netrc.exists()) |
||||||
|
return netrc; |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get entry by host name |
||||||
|
* |
||||||
|
* @param host |
||||||
|
* @return entry associated with host name or null |
||||||
|
*/ |
||||||
|
public NetRCEntry getEntry(String host) { |
||||||
|
if (netrc == null) |
||||||
|
return null; |
||||||
|
|
||||||
|
if (this.lastModified != this.netrc.lastModified()) |
||||||
|
parse(); |
||||||
|
|
||||||
|
NetRCEntry entry = this.hosts.get(host); |
||||||
|
|
||||||
|
if (entry == null) |
||||||
|
entry = this.hosts.get(DEFAULT_ENTRY); |
||||||
|
|
||||||
|
return entry; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return all entries collected from .netrc file |
||||||
|
*/ |
||||||
|
public Collection<NetRCEntry> getEntries() { |
||||||
|
return hosts.values(); |
||||||
|
} |
||||||
|
|
||||||
|
private void parse() { |
||||||
|
this.hosts.clear(); |
||||||
|
this.lastModified = this.netrc.lastModified(); |
||||||
|
|
||||||
|
BufferedReader r = null; |
||||||
|
try { |
||||||
|
r = new BufferedReader(new FileReader(netrc)); |
||||||
|
String line = null; |
||||||
|
|
||||||
|
NetRCEntry entry = new NetRCEntry(); |
||||||
|
|
||||||
|
State state = State.COMMAND; |
||||||
|
|
||||||
|
String macbody = ""; //$NON-NLS-1$
|
||||||
|
|
||||||
|
Matcher matcher = NETRC.matcher(""); //$NON-NLS-1$
|
||||||
|
while ((line = r.readLine()) != null) { |
||||||
|
|
||||||
|
// reading macbody
|
||||||
|
if (entry.macdef != null && entry.macbody == null) { |
||||||
|
if (line.length() == 0) { |
||||||
|
entry.macbody = macbody; |
||||||
|
macbody = ""; //$NON-NLS-1$
|
||||||
|
continue; |
||||||
|
} |
||||||
|
macbody += line + "\n"; //$NON-NLS-1$;
|
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
matcher.reset(line); |
||||||
|
while (matcher.find()) { |
||||||
|
String command = matcher.group().toLowerCase(); |
||||||
|
if (command.startsWith("#")) { //$NON-NLS-1$
|
||||||
|
matcher.reset(""); //$NON-NLS-1$
|
||||||
|
continue; |
||||||
|
} |
||||||
|
state = STATE.get(command); |
||||||
|
if (state == null) |
||||||
|
state = State.COMMAND; |
||||||
|
|
||||||
|
switch (state) { |
||||||
|
case COMMAND: |
||||||
|
break; |
||||||
|
case ACCOUNT: |
||||||
|
if (entry.account != null && entry.complete()) { |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
entry = new NetRCEntry(); |
||||||
|
} |
||||||
|
if (matcher.find()) |
||||||
|
entry.account = matcher.group(); |
||||||
|
state = State.COMMAND; |
||||||
|
break; |
||||||
|
case LOGIN: |
||||||
|
if (entry.login != null && entry.complete()) { |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
entry = new NetRCEntry(); |
||||||
|
} |
||||||
|
if (matcher.find()) |
||||||
|
entry.login = matcher.group(); |
||||||
|
state = State.COMMAND; |
||||||
|
break; |
||||||
|
case PASSWORD: |
||||||
|
if (entry.password != null && entry.complete()) { |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
entry = new NetRCEntry(); |
||||||
|
} |
||||||
|
if (matcher.find()) |
||||||
|
entry.password = matcher.group().toCharArray(); |
||||||
|
state = State.COMMAND; |
||||||
|
break; |
||||||
|
case DEFAULT: |
||||||
|
if (entry.machine != null && entry.complete()) { |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
entry = new NetRCEntry(); |
||||||
|
} |
||||||
|
entry.machine = DEFAULT_ENTRY; |
||||||
|
state = State.COMMAND; |
||||||
|
break; |
||||||
|
case MACDEF: |
||||||
|
if (entry.macdef != null && entry.complete()) { |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
entry = new NetRCEntry(); |
||||||
|
} |
||||||
|
if (matcher.find()) |
||||||
|
entry.macdef = matcher.group(); |
||||||
|
state = State.COMMAND; |
||||||
|
break; |
||||||
|
case MACHINE: |
||||||
|
if (entry.machine != null && entry.complete()) { |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
entry = new NetRCEntry(); |
||||||
|
} |
||||||
|
if (matcher.find()) |
||||||
|
entry.machine = matcher.group(); |
||||||
|
state = State.COMMAND; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// reading macbody on EOF
|
||||||
|
if (entry.macdef != null && entry.macbody == null) |
||||||
|
entry.macbody = macbody; |
||||||
|
|
||||||
|
if (entry.complete()) |
||||||
|
hosts.put(entry.machine, entry); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} finally { |
||||||
|
try { |
||||||
|
if (r != null) |
||||||
|
r.close(); |
||||||
|
} catch (IOException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,116 @@ |
|||||||
|
/* |
||||||
|
* Copyright (C) 2014, Alexey Kuznetsov <axet@me.com> |
||||||
|
* |
||||||
|
* 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.transport; |
||||||
|
|
||||||
|
import org.eclipse.jgit.errors.UnsupportedCredentialItem; |
||||||
|
import org.eclipse.jgit.transport.NetRC.NetRCEntry; |
||||||
|
|
||||||
|
/** |
||||||
|
* Simple .netrc credentials provider. It can lookup the first machine entry |
||||||
|
* from your .netrc file. |
||||||
|
* |
||||||
|
* @since 3.5 |
||||||
|
*/ |
||||||
|
public class NetRCCredentialsProvider extends CredentialsProvider { |
||||||
|
|
||||||
|
NetRC netrc = new NetRC(); |
||||||
|
|
||||||
|
/** */ |
||||||
|
public NetRCCredentialsProvider() { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Install default provider for the .netrc parser. |
||||||
|
*/ |
||||||
|
public static void install() { |
||||||
|
CredentialsProvider.setDefault(new NetRCCredentialsProvider()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean supports(CredentialItem... items) { |
||||||
|
for (CredentialItem i : items) { |
||||||
|
if (i instanceof CredentialItem.Username) |
||||||
|
continue; |
||||||
|
else if (i instanceof CredentialItem.Password) |
||||||
|
continue; |
||||||
|
else |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean get(URIish uri, CredentialItem... items) |
||||||
|
throws UnsupportedCredentialItem { |
||||||
|
NetRCEntry cc = netrc.getEntry(uri.getHost()); |
||||||
|
|
||||||
|
if (cc == null) |
||||||
|
return false; |
||||||
|
|
||||||
|
for (CredentialItem i : items) { |
||||||
|
if (i instanceof CredentialItem.Username) { |
||||||
|
((CredentialItem.Username) i).setValue(cc.login); |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (i instanceof CredentialItem.Password) { |
||||||
|
((CredentialItem.Password) i).setValue(cc.password); |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (i instanceof CredentialItem.StringType) { |
||||||
|
if (i.getPromptText().equals("Password: ")) { //$NON-NLS-1$
|
||||||
|
((CredentialItem.StringType) i).setValue(new String( |
||||||
|
cc.password)); |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
throw new UnsupportedCredentialItem(uri, i.getClass().getName() |
||||||
|
+ ":" + i.getPromptText()); //$NON-NLS-1$
|
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isInteractive() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue