DirCacheCheckoutMaliciousPathTest: Open Git and RevWalk in t-w-r

Change-Id: Iacb4e25f0ada74b1a01e448216cb02c7ec18b2d7
Signed-off-by: David Pursehouse <david.pursehouse@sonymobile.com>
This commit is contained in:
David Pursehouse 2016-02-15 17:14:09 +09:00
parent 30c9ec88d1
commit 259dca06ec
1 changed files with 62 additions and 61 deletions

View File

@ -338,68 +338,69 @@ private void testMaliciousPathGoodSecondCheckout(String... paths) throws Excepti
*/ */
private void testMaliciousPath(boolean good, boolean secondCheckout, private void testMaliciousPath(boolean good, boolean secondCheckout,
String... path) throws GitAPIException, IOException { String... path) throws GitAPIException, IOException {
Git git = new Git(db); try (Git git = new Git(db);
ObjectInserter newObjectInserter; RevWalk revWalk = new RevWalk(git.getRepository())) {
newObjectInserter = git.getRepository().newObjectInserter(); ObjectInserter newObjectInserter;
ObjectId blobId = newObjectInserter.insert(Constants.OBJ_BLOB, newObjectInserter = git.getRepository().newObjectInserter();
"data".getBytes()); ObjectId blobId = newObjectInserter.insert(Constants.OBJ_BLOB,
newObjectInserter = git.getRepository().newObjectInserter(); "data".getBytes());
FileMode mode = FileMode.REGULAR_FILE; newObjectInserter = git.getRepository().newObjectInserter();
ObjectId insertId = blobId; FileMode mode = FileMode.REGULAR_FILE;
for (int i = path.length - 1; i >= 0; --i) { ObjectId insertId = blobId;
TreeFormatter treeFormatter = new TreeFormatter(); for (int i = path.length - 1; i >= 0; --i) {
treeFormatter.append("goodpath", mode, insertId); TreeFormatter treeFormatter = new TreeFormatter();
insertId = newObjectInserter.insert(treeFormatter); treeFormatter.append("goodpath", mode, insertId);
mode = FileMode.TREE; insertId = newObjectInserter.insert(treeFormatter);
} mode = FileMode.TREE;
newObjectInserter = git.getRepository().newObjectInserter(); }
CommitBuilder commitBuilder = new CommitBuilder(); newObjectInserter = git.getRepository().newObjectInserter();
commitBuilder.setAuthor(author); CommitBuilder commitBuilder = new CommitBuilder();
commitBuilder.setCommitter(committer); commitBuilder.setAuthor(author);
commitBuilder.setMessage("foo#1"); commitBuilder.setCommitter(committer);
commitBuilder.setTreeId(insertId); commitBuilder.setMessage("foo#1");
ObjectId firstCommitId = newObjectInserter.insert(commitBuilder); commitBuilder.setTreeId(insertId);
ObjectId firstCommitId = newObjectInserter.insert(commitBuilder);
newObjectInserter = git.getRepository().newObjectInserter();
mode = FileMode.REGULAR_FILE; newObjectInserter = git.getRepository().newObjectInserter();
insertId = blobId; mode = FileMode.REGULAR_FILE;
for (int i = path.length - 1; i >= 0; --i) { insertId = blobId;
TreeFormatter treeFormatter = new TreeFormatter(); for (int i = path.length - 1; i >= 0; --i) {
treeFormatter.append(path[i], mode, insertId); TreeFormatter treeFormatter = new TreeFormatter();
insertId = newObjectInserter.insert(treeFormatter); treeFormatter.append(path[i], mode, insertId);
mode = FileMode.TREE; insertId = newObjectInserter.insert(treeFormatter);
} mode = FileMode.TREE;
}
// Create another commit
commitBuilder = new CommitBuilder(); // Create another commit
commitBuilder.setAuthor(author); commitBuilder = new CommitBuilder();
commitBuilder.setCommitter(committer); commitBuilder.setAuthor(author);
commitBuilder.setMessage("foo#2"); commitBuilder.setCommitter(committer);
commitBuilder.setTreeId(insertId); commitBuilder.setMessage("foo#2");
commitBuilder.setParentId(firstCommitId); commitBuilder.setTreeId(insertId);
ObjectId commitId = newObjectInserter.insert(commitBuilder); commitBuilder.setParentId(firstCommitId);
ObjectId commitId = newObjectInserter.insert(commitBuilder);
RevWalk revWalk = new RevWalk(git.getRepository());
if (!secondCheckout) if (!secondCheckout)
git.checkout().setStartPoint(revWalk.parseCommit(firstCommitId)) git.checkout().setStartPoint(revWalk.parseCommit(firstCommitId))
.setName("refs/heads/master").setCreateBranch(true).call(); .setName("refs/heads/master").setCreateBranch(true).call();
try { try {
if (secondCheckout) { if (secondCheckout) {
git.checkout().setStartPoint(revWalk.parseCommit(commitId)) git.checkout().setStartPoint(revWalk.parseCommit(commitId))
.setName("refs/heads/master").setCreateBranch(true) .setName("refs/heads/master").setCreateBranch(true)
.call(); .call();
} else { } else {
git.branchCreate().setName("refs/heads/next") git.branchCreate().setName("refs/heads/next")
.setStartPoint(commitId.name()).call(); .setStartPoint(commitId.name()).call();
git.checkout().setName("refs/heads/next") git.checkout().setName("refs/heads/next")
.call(); .call();
}
if (!good)
fail("Checkout of Tree " + Arrays.asList(path) + " should fail");
} catch (InvalidPathException e) {
if (good)
throw e;
assertTrue(e.getMessage().startsWith("Invalid path"));
} }
if (!good)
fail("Checkout of Tree " + Arrays.asList(path) + " should fail");
} catch (InvalidPathException e) {
if (good)
throw e;
assertTrue(e.getMessage().startsWith("Invalid path"));
} }
} }