diff options
Diffstat (limited to 'gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java')
-rw-r--r-- | gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java index 8852f0ea1c..262e57a78c 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java @@ -14,22 +14,26 @@ package com.google.gerrit.sshd.commands; +import com.google.common.collect.MultimapBuilder; +import com.google.common.collect.SetMultimap; import com.google.gerrit.common.data.Capable; +import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.IdentifiedUser; -import com.google.gerrit.server.git.AsyncReceiveCommits; -import com.google.gerrit.server.git.ReceiveCommits; import com.google.gerrit.server.git.VisibleRefFilter; +import com.google.gerrit.server.git.receive.AsyncReceiveCommits; +import com.google.gerrit.server.notedb.ReviewerStateInternal; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.PermissionBackendException; +import com.google.gerrit.server.permissions.ProjectPermission; import com.google.gerrit.sshd.AbstractGitCommand; import com.google.gerrit.sshd.CommandMetaData; import com.google.gerrit.sshd.SshSession; import com.google.inject.Inject; import java.io.IOException; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import org.eclipse.jgit.errors.TooLargeObjectInPackException; import org.eclipse.jgit.errors.UnpackException; import org.eclipse.jgit.lib.Ref; @@ -50,17 +54,18 @@ final class Receive extends AbstractGitCommand { @Inject private AsyncReceiveCommits.Factory factory; @Inject private IdentifiedUser currentUser; @Inject private SshSession session; + @Inject private PermissionBackend permissionBackend; - private final Set<Account.Id> reviewerId = new HashSet<>(); - private final Set<Account.Id> ccId = new HashSet<>(); + private final SetMultimap<ReviewerStateInternal, Account.Id> reviewers = + MultimapBuilder.hashKeys(2).hashSetValues().build(); @Option( name = "--reviewer", aliases = {"--re"}, metaVar = "EMAIL", usage = "request reviewer for change(s)") - void addReviewer(final Account.Id id) { - reviewerId.add(id); + void addReviewer(Account.Id id) { + reviewers.put(ReviewerStateInternal.REVIEWER, id); } @Option( @@ -68,27 +73,31 @@ final class Receive extends AbstractGitCommand { aliases = {}, metaVar = "EMAIL", usage = "CC user on change(s)") - void addCC(final Account.Id id) { - ccId.add(id); + void addCC(Account.Id id) { + reviewers.put(ReviewerStateInternal.CC, id); } @Override protected void runImpl() throws IOException, Failure { - if (!projectControl.canRunReceivePack()) { + try { + permissionBackend + .user(currentUser) + .project(project.getNameKey()) + .check(ProjectPermission.RUN_RECEIVE_PACK); + } catch (AuthException e) { throw new Failure(1, "fatal: receive-pack not permitted on this server"); + } catch (PermissionBackendException e) { + throw new Failure(1, "fatal: unable to check permissions " + e); } - final ReceiveCommits receive = factory.create(projectControl, repo).getReceiveCommits(); + AsyncReceiveCommits arc = factory.create(projectControl, repo, null, reviewers); - Capable r = receive.canUpload(); + Capable r = arc.canUpload(); if (r != Capable.OK) { throw die(r.getMessage()); } - receive.init(); - receive.addReviewers(reviewerId); - receive.addExtraCC(ccId); - ReceivePack rp = receive.getReceivePack(); + ReceivePack rp = arc.getReceivePack(); try { rp.receive(in, out, err); session.setPeerAgent(rp.getPeerUserAgent()); |