From aa8c1ddeface5f39b4eaf06f774e0cd20ee6e004 Mon Sep 17 00:00:00 2001 From: Patrick Hiesel Date: Thu, 10 Aug 2017 16:03:10 +0200 Subject: [PATCH] Factor RefControl#canCreate(Repository, RevCommit) out This commit factors this method out into its own class and delegates all RefPermission checks to the PermissionBackend. Change-Id: I005ac6c5b68ba4b3887cfba09ecf89567d98c45f --- .../server/git/receive/ReceiveCommits.java | 17 +- .../gerrit/server/project/CreateBranch.java | 10 +- .../server/project/CreateRefControl.java | 179 ++++++++++++++++++ .../gerrit/server/project/RefControl.java | 114 ----------- 4 files changed, 198 insertions(+), 122 deletions(-) create mode 100644 gerrit-server/src/main/java/com/google/gerrit/server/project/CreateRefControl.java diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java index 7f909d4a04..73bbf789f7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java @@ -128,7 +128,9 @@ import com.google.gerrit.server.permissions.GlobalPermission; import com.google.gerrit.server.permissions.PermissionBackend; import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.permissions.RefPermission; +import com.google.gerrit.server.project.CreateRefControl; import com.google.gerrit.server.project.NoSuchChangeException; +import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.ProjectState; @@ -320,6 +322,7 @@ class ReceiveCommits { private final String canonicalWebUrl; private final SubmoduleOp.Factory subOpFactory; private final TagCache tagCache; + private final CreateRefControl createRefControl; // Assisted injected fields. private final AllRefsWatcher allRefsWatcher; @@ -402,6 +405,7 @@ class ReceiveCommits { SshInfo sshInfo, SubmoduleOp.Factory subOpFactory, TagCache tagCache, + CreateRefControl createRefControl, @Assisted ProjectControl projectControl, @Assisted ReceivePack rp, @Assisted AllRefsWatcher allRefsWatcher, @@ -440,6 +444,7 @@ class ReceiveCommits { this.sshInfo = sshInfo; this.subOpFactory = subOpFactory; this.tagCache = tagCache; + this.createRefControl = createRefControl; // Assisted injected fields. this.allRefsWatcher = allRefsWatcher; @@ -524,7 +529,7 @@ class ReceiveCommits { try { parseCommands(commands); - } catch (PermissionBackendException err) { + } catch (PermissionBackendException | NoSuchProjectException | IOException err) { for (ReceiveCommand cmd : actualCommands) { if (cmd.getResult() == NOT_ATTEMPTED) { cmd.setResult(REJECTED_OTHER_REASON, "internal server error"); @@ -772,7 +777,7 @@ class ReceiveCommits { } private void parseCommands(Collection commands) - throws PermissionBackendException { + throws PermissionBackendException, NoSuchProjectException, IOException { List optionList = rp.getPushOptions(); if (optionList != null) { for (String option : optionList) { @@ -977,7 +982,8 @@ class ReceiveCommits { } } - private void parseCreate(ReceiveCommand cmd) throws PermissionBackendException { + private void parseCreate(ReceiveCommand cmd) + throws PermissionBackendException, NoSuchProjectException, IOException { RevObject obj; try { obj = rp.getRevWalk().parseAny(cmd.getNewId()); @@ -994,8 +1000,8 @@ class ReceiveCommits { return; } - RefControl ctl = projectControl.controlForRef(cmd.getRefName()); - String rejectReason = ctl.canCreate(rp.getRepository(), obj); + Branch.NameKey branch = new Branch.NameKey(project.getName(), cmd.getRefName()); + String rejectReason = createRefControl.canCreateRef(rp.getRepository(), obj, user, branch); if (rejectReason != null) { reject(cmd, "prohibited by Gerrit: " + rejectReason); return; @@ -1006,6 +1012,7 @@ class ReceiveCommits { return; } + RefControl ctl = projectControl.controlForRef(cmd.getRefName()); validateNewCommits(ctl, cmd); actualCommands.add(cmd); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java index 4e2e327091..77fb86b86b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java @@ -26,6 +26,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.permissions.RefPermission; import com.google.gerrit.server.util.MagicBranch; import com.google.inject.Inject; @@ -55,6 +56,7 @@ public class CreateBranch implements RestModifyView