aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2018-06-10 12:12:05 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2018-06-10 12:12:16 +0200
commit0f8f6746ed5c7ce68203618e2528267dab466ffb (patch)
tree166acd90e5b0b228d8b80e50e64f1e7718245167
parentd2cb1e7bf5af1e401c8f1f982987190831dbc5b6 (diff)
parent4ef8769f81949d1b5759645bdba969b6b5a7289a (diff)
downloadjgit-0f8f6746ed5c7ce68203618e2528267dab466ffb.tar.gz
jgit-0f8f6746ed5c7ce68203618e2528267dab466ffb.zip
Merge branch 'stable-5.0'
* stable-5.0: Ensure Jsch checks all configured algorithms RawTextTest#testBinary: use array comparison to compare arrays LFS: Better SSH authentication token timeout handling Ensure DirectoryStream is closed promptly Validate branch names on branch creation Change-Id: Ic4f6a24b6ccee6730eee3fd5dcb0d1f3e291c478 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java7
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java12
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java3
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java32
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java21
5 files changed, 65 insertions, 10 deletions
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java
index 25a70c745a..3ac69923f2 100644
--- a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java
+++ b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsConnectionFactory.java
@@ -273,7 +273,7 @@ public class LfsConnectionFactory {
}
private static final class AuthCache {
- private static final long AUTH_CACHE_EAGER_TIMEOUT = 100;
+ private static final long AUTH_CACHE_EAGER_TIMEOUT = 500;
private static final SimpleDateFormat ISO_FORMAT = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSSX"); //$NON-NLS-1$
@@ -290,8 +290,9 @@ public class LfsConnectionFactory {
this.cachedAction = action;
try {
if (action.expiresIn != null && !action.expiresIn.isEmpty()) {
- this.validUntil = System.currentTimeMillis()
- + Long.parseLong(action.expiresIn);
+ this.validUntil = (System.currentTimeMillis()
+ + Long.parseLong(action.expiresIn))
+ - AUTH_CACHE_EAGER_TIMEOUT;
} else if (action.expiresAt != null
&& !action.expiresAt.isEmpty()) {
this.validUntil = ISO_FORMAT.parse(action.expiresAt)
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java
index 2fe40b99ed..08f1fdfacf 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/BranchCommandTest.java
@@ -191,6 +191,18 @@ public class BranchCommandTest extends RepositoryTestCase {
- allBefore);
}
+ @Test(expected = InvalidRefNameException.class)
+ public void testInvalidBranchHEAD() throws Exception {
+ git.branchCreate().setName("HEAD").call();
+ fail("Create branch with invalid ref name should fail");
+ }
+
+ @Test(expected = InvalidRefNameException.class)
+ public void testInvalidBranchDash() throws Exception {
+ git.branchCreate().setName("-x").call();
+ fail("Create branch with invalid ref name should fail");
+ }
+
@Test
public void testListAllBranchesShouldNotDie() throws Exception {
setUpRepoWithRemote().branchList().setListMode(ListMode.ALL).call();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java
index 8cf3eedfdd..58a8b2d468 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RawTextTest.java
@@ -45,6 +45,7 @@
package org.eclipse.jgit.diff;
import static org.eclipse.jgit.lib.Constants.CHARSET;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
@@ -69,7 +70,7 @@ public class RawTextTest {
String input = "foo-a\nf\0o-b\n";
byte[] data = Constants.encodeASCII(input);
final RawText a = new RawText(data);
- assertEquals(a.content, data);
+ assertArrayEquals(a.content, data);
assertEquals(a.size(), 1);
assertEquals(a.getString(0, 1, false), input);
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
index 29baf4cd63..ba6f3f11b4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
@@ -43,6 +43,9 @@
*/
package org.eclipse.jgit.api;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+
import java.io.IOException;
import java.text.MessageFormat;
@@ -78,7 +81,7 @@ public class CreateBranchCommand extends GitCommand<Ref> {
private SetupUpstreamMode upstreamMode;
- private String startPoint = Constants.HEAD;
+ private String startPoint = HEAD;
private RevCommit startCommit;
@@ -121,7 +124,7 @@ public class CreateBranchCommand extends GitCommand<Ref> {
try (RevWalk revWalk = new RevWalk(repo)) {
Ref refToCheck = repo.findRef(name);
boolean exists = refToCheck != null
- && refToCheck.getName().startsWith(Constants.R_HEADS);
+ && refToCheck.getName().startsWith(R_HEADS);
if (!force && exists)
throw new RefAlreadyExistsException(MessageFormat.format(
JGitText.get().refAlreadyExists1, name));
@@ -153,7 +156,7 @@ public class CreateBranchCommand extends GitCommand<Ref> {
else
refLogMessage = "branch: Created from commit " + baseCommit; //$NON-NLS-1$
- } else if (startPointFullName.startsWith(Constants.R_HEADS)
+ } else if (startPointFullName.startsWith(R_HEADS)
|| startPointFullName.startsWith(Constants.R_REMOTES)) {
baseBranch = startPointFullName;
if (exists)
@@ -171,7 +174,7 @@ public class CreateBranchCommand extends GitCommand<Ref> {
+ startPointFullName;
}
- RefUpdate updateRef = repo.updateRef(Constants.R_HEADS + name);
+ RefUpdate updateRef = repo.updateRef(R_HEADS + name);
updateRef.setNewObjectId(startAt);
updateRef.setRefLogMessage(refLogMessage, false);
Result updateResult;
@@ -279,17 +282,34 @@ public class CreateBranchCommand extends GitCommand<Ref> {
}
private String getStartPointOrHead() {
- return startPoint != null ? startPoint : Constants.HEAD;
+ return startPoint != null ? startPoint : HEAD;
}
private void processOptions() throws InvalidRefNameException {
if (name == null
- || !Repository.isValidRefName(Constants.R_HEADS + name))
+ || !Repository.isValidRefName(R_HEADS + name)
+ || !isValidBranchName(name))
throw new InvalidRefNameException(MessageFormat.format(JGitText
.get().branchNameInvalid, name == null ? "<null>" : name)); //$NON-NLS-1$
}
/**
+ * Check if the given branch name is valid
+ *
+ * @param branchName
+ * branch name to check
+ * @return {@code true} if the branch name is valid
+ *
+ * @since 5.0
+ */
+ public static boolean isValidBranchName(String branchName) {
+ if (HEAD.equals(branchName)) {
+ return false;
+ }
+ return !branchName.startsWith("-"); //$NON-NLS-1$
+ }
+
+ /**
* Set the name of the new branch
*
* @param name
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
index ea2f4b1e3e..1d5248a15d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/JschConfigSessionFactory.java
@@ -70,6 +70,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jcraft.jsch.ConfigRepository;
+import com.jcraft.jsch.ConfigRepository.Config;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
@@ -222,10 +223,30 @@ public abstract class JschConfigSessionFactory extends SshSessionFactory {
session.setUserInfo(new CredentialsProviderUserInfo(session,
credentialsProvider));
}
+ safeConfig(session, hc.getConfig());
configure(hc, session);
return session;
}
+ private void safeConfig(Session session, Config cfg) {
+ // Ensure that Jsch checks all configured algorithms, not just its
+ // built-in ones. Otherwise it may propose an algorithm for which it
+ // doesn't have an implementation, and then run into an NPE if that
+ // algorithm ends up being chosen.
+ copyConfigValueToSession(session, cfg, "Ciphers", "CheckCiphers"); //$NON-NLS-1$ //$NON-NLS-2$
+ copyConfigValueToSession(session, cfg, "KexAlgorithms", "CheckKexes"); //$NON-NLS-1$ //$NON-NLS-2$
+ copyConfigValueToSession(session, cfg, "HostKeyAlgorithms", //$NON-NLS-1$
+ "CheckSignatures"); //$NON-NLS-1$
+ }
+
+ private void copyConfigValueToSession(Session session, Config cfg,
+ String from, String to) {
+ String value = cfg.getValue(from);
+ if (value != null) {
+ session.setConfig(to, value);
+ }
+ }
+
private void setUserName(Session session, String userName) {
// Jsch 0.1.54 picks up the user name from the ssh config, even if an
// explicit user name was given! We must correct that if ~/.ssh/config