From 4fcac9d2cbdafb51e3ee9ca3b3da64fd86103174 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Tue, 26 Nov 2013 15:58:15 -0500 Subject: [PATCH] Remove artifact setting from manager dialog --- src/test/java/com/gitblit/tests/GitServletTest.java | 324 ++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 232 insertions(+), 92 deletions(-) diff --git a/src/test/java/com/gitblit/tests/GitServletTest.java b/src/test/java/com/gitblit/tests/GitServletTest.java index c1aaf1a..08c4a23 100644 --- a/src/test/java/com/gitblit/tests/GitServletTest.java +++ b/src/test/java/com/gitblit/tests/GitServletTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.gitblit.tests; import static org.junit.Assert.assertEquals; @@ -16,6 +31,8 @@ import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.MergeCommand.FastForwardMode; +import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.ResetCommand.ResetType; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Constants; @@ -38,21 +55,21 @@ import com.gitblit.Constants.AuthorizationControl; import com.gitblit.GitBlit; import com.gitblit.Keys; -import com.gitblit.models.PushLogEntry; +import com.gitblit.models.RefLogEntry; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.JGitUtils; -import com.gitblit.utils.PushLogUtils; +import com.gitblit.utils.RefLogUtils; public class GitServletTest { static File ticgitFolder = new File(GitBlitSuite.REPOSITORIES, "working/ticgit"); - + static File ticgit2Folder = new File(GitBlitSuite.REPOSITORIES, "working/ticgit2"); static File jgitFolder = new File(GitBlitSuite.REPOSITORIES, "working/jgit"); - + static File jgit2Folder = new File(GitBlitSuite.REPOSITORIES, "working/jgit2"); String url = GitBlitSuite.gitServletUrl; @@ -61,9 +78,25 @@ private static final AtomicBoolean started = new AtomicBoolean(false); + private static UserModel getUser() { + UserModel user = new UserModel("james"); + user.displayName = "James Moger"; + user.emailAddress = "james.moger@gmail.com"; + user.password = "james"; + return user; + } + + private static void delete(UserModel user) { + if (GitBlit.self().getUserModel(user.username) != null) { + GitBlit.self().deleteUser(user.username); + } + } + @BeforeClass public static void startGitblit() throws Exception { started.set(GitBlitSuite.startGitblit()); + + delete(getUser()); } @AfterClass @@ -72,8 +105,10 @@ GitBlitSuite.stopGitblit(); deleteWorkingFolders(); } + + delete(getUser()); } - + public static void deleteWorkingFolders() throws Exception { if (ticgitFolder.exists()) { GitBlitSuite.close(ticgitFolder); @@ -99,14 +134,14 @@ if (ticgitFolder.exists()) { FileUtils.delete(ticgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY); } - + CloneCommand clone = Git.cloneRepository(); clone.setURI(MessageFormat.format("{0}/ticgit.git", url)); clone.setDirectory(ticgitFolder); clone.setBare(false); clone.setCloneAllBranches(true); clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password)); - GitBlitSuite.close(clone.call()); + GitBlitSuite.close(clone.call()); assertTrue(true); } @@ -117,7 +152,7 @@ model.accessRestriction = AccessRestrictionType.CLONE; GitBlit.self().updateRepositoryModel(model.name, model, false); - // delete any existing working folder + // delete any existing working folder boolean cloned = false; try { CloneCommand clone = Git.cloneRepository(); @@ -138,7 +173,7 @@ assertFalse("Bogus login cloned a repository?!", cloned); } - + @Test public void testUnauthorizedLoginClone() throws Exception { // restrict repository access @@ -151,8 +186,8 @@ GitBlit.self().updateRepositoryModel(model.name, model, false); FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE); - - // delete any existing working folder + + // delete any existing working folder boolean cloned = false; try { CloneCommand clone = Git.cloneRepository(); @@ -170,11 +205,11 @@ assertFalse("Unauthorized login cloned a repository?!", cloned); FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE); - + // switch to authenticated model.authorizationControl = AuthorizationControl.AUTHENTICATED; GitBlit.self().updateRepositoryModel(model.name, model, false); - + // try clone again cloned = false; CloneCommand clone = Git.cloneRepository(); @@ -187,14 +222,15 @@ cloned = true; assertTrue("Authenticated login could not clone!", cloned); - + FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE); - + // restore anonymous repository access model.accessRestriction = AccessRestrictionType.NONE; model.authorizationControl = AuthorizationControl.NAMED; GitBlit.self().updateRepositoryModel(model.name, model, false); - GitBlit.self().deleteUser(user.username); + + delete(user); } @Test @@ -214,9 +250,9 @@ clone.setBare(false); clone.setCloneAllBranches(true); clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password)); - GitBlitSuite.close(clone.call()); + GitBlitSuite.close(clone.call()); assertTrue(true); - + Git git = Git.open(ticgitFolder); File file = new File(ticgitFolder, "TODO"); OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); @@ -240,7 +276,7 @@ if (jgitFolder.exists()) { FileUtils.delete(jgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY); } - + CloneCommand clone = Git.cloneRepository(); clone.setURI(MessageFormat.format("{0}/test/jgit.git", url)); clone.setDirectory(jgitFolder); @@ -266,14 +302,14 @@ } } } - + @Test public void testPushToFrozenRepo() throws Exception { GitBlitSuite.close(jgitFolder); if (jgitFolder.exists()) { FileUtils.delete(jgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY); } - + CloneCommand clone = Git.cloneRepository(); clone.setURI(MessageFormat.format("{0}/test/jgit.git", url)); clone.setDirectory(jgitFolder); @@ -282,7 +318,7 @@ clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password)); GitBlitSuite.close(clone.call()); assertTrue(true); - + // freeze repo RepositoryModel model = GitBlit.self().getRepositoryModel("test/jgit.git"); model.isFrozen = true; @@ -296,14 +332,14 @@ w.close(); git.add().addFilepattern(file.getName()).call(); git.commit().setMessage("test commit").call(); - + Iterable<PushResult> results = git.push().setPushAll().setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password)).call(); for (PushResult result : results) { for (RemoteRefUpdate update : result.getRemoteUpdates()) { assertEquals(Status.REJECTED_OTHER_REASON, update.getStatus()); } } - + // unfreeze repo model.isFrozen = false; GitBlit.self().updateRepositoryModel(model.name, model, false); @@ -316,7 +352,7 @@ } } } - + @Test public void testPushToNonBareRepository() throws Exception { CloneCommand clone = Git.cloneRepository(); @@ -347,8 +383,7 @@ @Test public void testCommitterVerification() throws Exception { - UserModel user = new UserModel("james"); - user.password = "james"; + UserModel user = getUser(); // account only uses account name to verify testCommitterVerification(user, user.username, null, true); @@ -362,25 +397,23 @@ testCommitterVerification(user, user.displayName, null, true); testCommitterVerification(user, user.displayName, "something", true); testCommitterVerification(user, "joe", null, false); - + // test email address verification user.emailAddress = "something"; testCommitterVerification(user, user.displayName, null, false); testCommitterVerification(user, user.displayName, "somethingelse", false); testCommitterVerification(user, user.displayName, user.emailAddress, true); - + // use same email address but with different committer testCommitterVerification(user, "joe", "somethingelse", false); } - + private void testCommitterVerification(UserModel user, String displayName, String emailAddress, boolean expectedSuccess) throws Exception { - - if (GitBlit.self().getUserModel(user.username) != null) { - GitBlit.self().deleteUser(user.username); - } - + + delete(user); + CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); - + // fork from original to a temporary bare repo File verification = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-committer.git"); if (verification.exists()) { @@ -393,16 +426,16 @@ clone.setCloneAllBranches(true); clone.setCredentialsProvider(cp); GitBlitSuite.close(clone.call()); - + // require push permissions and committer verification RepositoryModel model = GitBlit.self().getRepositoryModel("refchecks/verify-committer.git"); model.authorizationControl = AuthorizationControl.NAMED; model.accessRestriction = AccessRestrictionType.PUSH; model.verifyCommitter = true; - + // grant user push permission user.setRepositoryPermission(model.name, AccessPermission.PUSH); - + GitBlit.self().updateUserModel(user.username, user, true); GitBlit.self().updateRepositoryModel(model.name, model, false); @@ -418,14 +451,14 @@ clone.setCloneAllBranches(true); clone.setCredentialsProvider(cp); GitBlitSuite.close(clone.call()); - + Git git = Git.open(local); - + // force an identity which may or may not match the account's identity git.getRepository().getConfig().setString("user", null, "name", displayName); git.getRepository().getConfig().setString("user", null, "email", emailAddress); git.getRepository().getConfig().save(); - + // commit a file and push it File file = new File(local, "PUSHCHK"); OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); @@ -435,7 +468,7 @@ git.add().addFilepattern(file.getName()).call(); git.commit().setMessage("push test").call(); Iterable<PushResult> results = git.push().setCredentialsProvider(cp).setRemote("origin").call(); - + for (PushResult result : results) { RemoteRefUpdate ref = result.getRemoteUpdate("refs/heads/master"); Status status = ref.getStatus(); @@ -445,7 +478,120 @@ assertTrue("Verification failed! User was able to push commit! " + status.name(), Status.REJECTED_OTHER_REASON.equals(status)); } } - + + GitBlitSuite.close(git); + // close serving repository + GitBlitSuite.close(verification); + } + + @Test + public void testMergeCommitterVerification() throws Exception { + + testMergeCommitterVerification(false); + + testMergeCommitterVerification(true); + } + + private void testMergeCommitterVerification(boolean expectedSuccess) throws Exception { + UserModel user = getUser(); + + delete(user); + + CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); + + // fork from original to a temporary bare repo + File verification = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-committer.git"); + if (verification.exists()) { + FileUtils.delete(verification, FileUtils.RECURSIVE); + } + CloneCommand clone = Git.cloneRepository(); + clone.setURI(MessageFormat.format("{0}/ticgit.git", url)); + clone.setDirectory(verification); + clone.setBare(true); + clone.setCloneAllBranches(true); + clone.setCredentialsProvider(cp); + GitBlitSuite.close(clone.call()); + + // require push permissions and committer verification + RepositoryModel model = GitBlit.self().getRepositoryModel("refchecks/verify-committer.git"); + model.authorizationControl = AuthorizationControl.NAMED; + model.accessRestriction = AccessRestrictionType.PUSH; + model.verifyCommitter = true; + + // grant user push permission + user.setRepositoryPermission(model.name, AccessPermission.PUSH); + + GitBlit.self().updateUserModel(user.username, user, true); + GitBlit.self().updateRepositoryModel(model.name, model, false); + + // clone temp bare repo to working copy + File local = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-wc"); + if (local.exists()) { + FileUtils.delete(local, FileUtils.RECURSIVE); + } + clone = Git.cloneRepository(); + clone.setURI(MessageFormat.format("{0}/{1}", url, model.name)); + clone.setDirectory(local); + clone.setBare(false); + clone.setCloneAllBranches(true); + clone.setCredentialsProvider(cp); + GitBlitSuite.close(clone.call()); + + Git git = Git.open(local); + + // checkout a mergetest branch + git.checkout().setCreateBranch(true).setName("mergetest").call(); + + // change identity + git.getRepository().getConfig().setString("user", null, "name", "mergetest"); + git.getRepository().getConfig().setString("user", null, "email", "mergetest@merge.com"); + git.getRepository().getConfig().save(); + + // commit a file + File file = new File(local, "MERGECHK2"); + OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); + BufferedWriter w = new BufferedWriter(os); + w.write("// " + new Date().toString() + "\n"); + w.close(); + git.add().addFilepattern(file.getName()).call(); + RevCommit mergeTip = git.commit().setMessage(file.getName() + " test").call(); + + // return to master + git.checkout().setName("master").call(); + + // restore identity + if (expectedSuccess) { + git.getRepository().getConfig().setString("user", null, "name", user.username); + git.getRepository().getConfig().setString("user", null, "email", user.emailAddress); + git.getRepository().getConfig().save(); + } + + // commit a file + file = new File(local, "MERGECHK1"); + os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); + w = new BufferedWriter(os); + w.write("// " + new Date().toString() + "\n"); + w.close(); + git.add().addFilepattern(file.getName()).call(); + git.commit().setMessage(file.getName() + " test").call(); + + // merge the tip of the mergetest branch into master with --no-ff + MergeResult mergeResult = git.merge().setFastForward(FastForwardMode.NO_FF).include(mergeTip.getId()).call(); + assertEquals(MergeResult.MergeStatus.MERGED, mergeResult.getMergeStatus()); + + // push the merged master to the origin + Iterable<PushResult> results = git.push().setCredentialsProvider(cp).setRemote("origin").call(); + + for (PushResult result : results) { + RemoteRefUpdate ref = result.getRemoteUpdate("refs/heads/master"); + Status status = ref.getStatus(); + if (expectedSuccess) { + assertTrue("Verification failed! User was NOT able to push commit! " + status.name(), Status.OK.equals(status)); + } else { + assertTrue("Verification failed! User was able to push commit! " + status.name(), Status.REJECTED_OTHER_REASON.equals(status)); + } + } + GitBlitSuite.close(git); // close serving repository GitBlitSuite.close(verification); @@ -470,28 +616,24 @@ public void testBlockBranchDeletion() throws Exception { testRefChange(AccessPermission.CREATE, Status.OK, Status.REJECTED_OTHER_REASON, null); } - + @Test public void testBlockBranchRewind() throws Exception { testRefChange(AccessPermission.DELETE, Status.OK, Status.OK, Status.REJECTED_OTHER_REASON); } @Test - public void testBranchRewind() throws Exception { + public void testBranchRewind() throws Exception { testRefChange(AccessPermission.REWIND, Status.OK, Status.OK, Status.OK); } private void testRefChange(AccessPermission permission, Status expectedCreate, Status expectedDelete, Status expectedRewind) throws Exception { - UserModel user = new UserModel("james"); - user.password = "james"; - - if (GitBlit.self().getUserModel(user.username) != null) { - GitBlit.self().deleteUser(user.username); - } - + UserModel user = getUser(); + delete(user); + CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); - + // fork from original to a temporary bare repo File refChecks = new File(GitBlitSuite.REPOSITORIES, "refchecks/ticgit.git"); if (refChecks.exists()) { @@ -518,7 +660,7 @@ model.accessRestriction = AccessRestrictionType.PUSH; } model.authorizationControl = AuthorizationControl.NAMED; - + // grant user specified user.setRepositoryPermission(model.name, permission); @@ -536,7 +678,7 @@ clone.setBare(false); clone.setCloneAllBranches(true); clone.setCredentialsProvider(cp); - + try { GitBlitSuite.close(clone.call()); } catch (GitAPIException e) { @@ -545,15 +687,15 @@ } else { // close serving repository GitBlitSuite.close(refChecks); - + // user does not have clone permission - assertTrue(e.getMessage(), e.getMessage().contains("not permitted")); + assertTrue(e.getMessage(), e.getMessage().contains("not permitted")); return; } } - + Git git = Git.open(local); - + // commit a file and push it File file = new File(local, "PUSHCHK"); OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); @@ -571,14 +713,14 @@ } else { // close serving repository GitBlitSuite.close(refChecks); - + // user does not have push permission assertTrue(e.getMessage(), e.getMessage().contains("not permitted")); GitBlitSuite.close(git); return; } } - + for (PushResult result : results) { RemoteRefUpdate ref = result.getRemoteUpdate("refs/heads/master"); Status status = ref.getStatus(); @@ -594,8 +736,8 @@ return; } } - - // create a local branch and push the new branch back to the origin + + // create a local branch and push the new branch back to the origin git.branchCreate().setName("protectme").call(); RefSpec refSpec = new RefSpec("refs/heads/protectme:refs/heads/protectme"); results = git.push().setCredentialsProvider(cp).setRefSpecs(refSpec).setRemote("origin").call(); @@ -614,10 +756,10 @@ return; } } - + // delete the branch locally git.branchDelete().setBranchNames("protectme").call(); - + // push a delete ref command refSpec = new RefSpec(":refs/heads/protectme"); results = git.push().setCredentialsProvider(cp).setRefSpecs(refSpec).setRemote("origin").call(); @@ -636,10 +778,10 @@ return; } } - + // rewind master by two commits git.reset().setRef("HEAD~2").setMode(ResetType.HARD).call(); - + // commit a change on this detached HEAD file = new File(local, "REWINDCHK"); os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); @@ -648,11 +790,11 @@ w.close(); git.add().addFilepattern(file.getName()).call(); RevCommit commit = git.commit().setMessage("rewind master and new commit").call(); - + // Reset master to our new commit now we our local branch tip is no longer // upstream of the remote branch tip. It is an alternate tip of the branch. JGitUtils.setBranchRef(git.getRepository(), "refs/heads/master", commit.getName()); - + // Try pushing our new tip to the origin. // This requires the server to "rewind" it's master branch and update it // to point to our alternate tip. This leaves the original master tip @@ -668,43 +810,41 @@ } } GitBlitSuite.close(git); - + // close serving repository GitBlitSuite.close(refChecks); - GitBlit.self().deleteUser(user.username); + delete(user); } - + @Test public void testCreateOnPush() throws Exception { testCreateOnPush(false, false); testCreateOnPush(true, false); testCreateOnPush(false, true); } - + private void testCreateOnPush(boolean canCreate, boolean canAdmin) throws Exception { UserModel user = new UserModel("sampleuser"); user.password = user.username; - - if (GitBlit.self().getUserModel(user.username) != null) { - GitBlit.self().deleteUser(user.username); - } - + + delete(user); + user.canCreate = canCreate; user.canAdmin = canAdmin; - + GitBlit.self().updateUserModel(user.username, user, true); CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); - + // fork from original to a temporary bare repo File tmpFolder = File.createTempFile("gitblit", "").getParentFile(); File createCheck = new File(tmpFolder, "ticgit.git"); if (createCheck.exists()) { FileUtils.delete(createCheck, FileUtils.RECURSIVE); } - + File personalRepo = new File(GitBlitSuite.REPOSITORIES, MessageFormat.format("~{0}/ticgit.git", user.username)); GitBlitSuite.close(personalRepo); if (personalRepo.exists()) { @@ -724,9 +864,9 @@ clone.setCloneAllBranches(true); clone.setCredentialsProvider(cp); Git git = clone.call(); - + GitBlitSuite.close(personalRepo); - + // add a personal repository remote and a project remote git.getRepository().getConfig().setString("remote", "user", "url", MessageFormat.format("{0}/~{1}/ticgit.git", url, user.username)); git.getRepository().getConfig().setString("remote", "project", "url", MessageFormat.format("{0}/project/ticgit.git", url)); @@ -743,18 +883,18 @@ } assertTrue("User canAdmin:" + user.canAdmin + " canCreate:" + user.canCreate, user.canAdmin || user.canCreate); - + // confirm default personal repository permissions RepositoryModel model = GitBlit.self().getRepositoryModel(MessageFormat.format("~{0}/ticgit.git", user.username)); assertEquals("Unexpected owner", user.username, ArrayUtils.toString(model.owners)); assertEquals("Unexpected authorization control", AuthorizationControl.NAMED, model.authorizationControl); assertEquals("Unexpected access restriction", AccessRestrictionType.VIEW, model.accessRestriction); - + } catch (GitAPIException e) { assertTrue(e.getMessage(), e.getMessage().contains("git-receive-pack not found")); assertFalse("User canAdmin:" + user.canAdmin + " canCreate:" + user.canCreate, user.canAdmin || user.canCreate); } - + // push to non-existent project repository try { Iterable<PushResult> results = git.push().setRemote("project").setPushAll().setCredentialsProvider(cp).call(); @@ -765,9 +905,9 @@ Status status = ref.getStatus(); assertTrue("User failed to create repository?! " + status.name(), Status.OK.equals(status)); } - + assertTrue("User canAdmin:" + user.canAdmin, user.canAdmin); - + // confirm default project repository permissions RepositoryModel model = GitBlit.self().getRepositoryModel("project/ticgit.git"); assertEquals("Unexpected owner", user.username, ArrayUtils.toString(model.owners)); @@ -780,15 +920,15 @@ } GitBlitSuite.close(git); - GitBlit.self().deleteUser(user.username); + delete(user); } - + @Test public void testPushLog() throws IOException { String name = "refchecks/ticgit.git"; File refChecks = new File(GitBlitSuite.REPOSITORIES, name); Repository repository = new FileRepositoryBuilder().setGitDir(refChecks).build(); - List<PushLogEntry> pushes = PushLogUtils.getPushLog(name, repository); + List<RefLogEntry> pushes = RefLogUtils.getRefLog(name, repository); GitBlitSuite.close(repository); assertTrue("Repository has an empty push log!", pushes.size() > 0); } -- Gitblit v1.9.1