summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2018-10-12 15:07:06 +0100
committerLuca Milanesio <luca.milanesio@gmail.com>2018-10-12 15:19:11 +0100
commitf1cfa9fa77ef135022e00ab523947ad55f0048b1 (patch)
treea4cf92cab80b6c4ebfbdfd0716e2660740d71db5
parent532251a9dc703adf57ca8adb82e8a23f0c2e33db (diff)
parent17e14e8476270f9ee900b94b3619503ad2a82cad (diff)
Merge branch 'stable-2.14' into stable-2.15
* stable-2.14: Propagate access path for SSH commands Revert "Fix access path propagation on git/ssh protocol" Set version to 2.14.16-SNAPSHOT Change-Id: I0e724fb029e41d4cc677fab0e5eaef415e35e20c
-rw-r--r--gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java46
-rw-r--r--gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java48
-rw-r--r--gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java4
-rw-r--r--gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java3
4 files changed, 45 insertions, 56 deletions
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java
index c747c3ea5d..0b48cf555f 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java
@@ -33,6 +33,8 @@ public abstract class AbstractGitCommand extends BaseCommand {
@Argument(index = 0, metaVar = "PROJECT.git", required = true, usage = "project name")
protected ProjectControl projectControl;
+ @Inject private SshScope sshScope;
+
@Inject private GitRepositoryManager repoManager;
@Inject private SshSession session;
@@ -51,25 +53,30 @@ public abstract class AbstractGitCommand extends BaseCommand {
@Override
public void start(Environment env) {
Context ctx = context.subContext(newSession(), context.getCommandLine());
- startThreadWithContext(
- ctx,
- new ProjectCommandRunnable() {
- @Override
- public void executeParseCommand() throws Exception {
- parseCommandLine();
- }
-
- @Override
- public void run() throws Exception {
- AbstractGitCommand.this.service();
- }
-
- @Override
- public Project.NameKey getProjectName() {
- Project project = projectControl.getProjectState().getProject();
- return project.getNameKey();
- }
- });
+ final Context old = sshScope.set(ctx);
+ try {
+ startThread(
+ new ProjectCommandRunnable() {
+ @Override
+ public void executeParseCommand() throws Exception {
+ parseCommandLine();
+ }
+
+ @Override
+ public void run() throws Exception {
+ AbstractGitCommand.this.service();
+ }
+
+ @Override
+ public Project.NameKey getProjectName() {
+ Project project = projectControl.getProjectState().getProject();
+ return project.getNameKey();
+ }
+ },
+ AccessPath.GIT);
+ } finally {
+ sshScope.set(old);
+ }
}
private SshSession newSession() {
@@ -78,7 +85,6 @@ public abstract class AbstractGitCommand extends BaseCommand {
session,
session.getRemoteAddress(),
userFactory.create(session.getRemoteAddress(), user.getAccountId()));
- n.setAccessPath(AccessPath.GIT);
return n;
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
index c881b878db..220b0d3094 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AccessPath;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.DynamicOptions;
import com.google.gerrit.server.IdentifiedUser;
@@ -49,7 +50,6 @@ import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.Charset;
-import java.util.Optional;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicReference;
@@ -261,25 +261,27 @@ public abstract class BaseCommand implements Command {
}
/**
- * Spawn a function into its own thread with the provided context.
+ * Spawn a function into its own thread.
*
* <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
*
* <pre>
- * startThreadWithContext(SshScope.Context context, new CommandRunnable() {
+ * startThread(new CommandRunnable() {
* public void run() throws Exception {
* runImp();
* }
- * });
+ * },
+ * accessPath);
* </pre>
*
* <p>If the function throws an exception, it is translated to a simple message for the client, a
* non-zero exit code, and the stack trace is logged.
*
* @param thunk the runnable to execute on the thread, performing the command's logic.
+ * @param accessPath the path used by the end user for running the SSH command
*/
- protected void startThreadWithContext(SshScope.Context context, CommandRunnable thunk) {
- final TaskThunk tt = new TaskThunk(thunk, Optional.ofNullable(context));
+ protected void startThread(final CommandRunnable thunk, AccessPath accessPath) {
+ final TaskThunk tt = new TaskThunk(thunk, accessPath);
if (isAdminHighPriorityCommand()) {
// Admin commands should not block the main work threads (there
@@ -292,28 +294,6 @@ public abstract class BaseCommand implements Command {
}
}
- /**
- * Spawn a function into its own thread.
- *
- * <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
- *
- * <pre>
- * startThread(new CommandRunnable() {
- * public void run() throws Exception {
- * runImp();
- * }
- * });
- * </pre>
- *
- * <p>If the function throws an exception, it is translated to a simple message for the client, a
- * non-zero exit code, and the stack trace is logged.
- *
- * @param thunk the runnable to execute on the thread, performing the command's logic.
- */
- protected void startThread(final CommandRunnable thunk) {
- startThreadWithContext(null, thunk);
- }
-
private boolean isAdminHighPriorityCommand() {
if (getClass().getAnnotation(AdminHighPriorityCommand.class) != null) {
try {
@@ -436,21 +416,20 @@ public abstract class BaseCommand implements Command {
private final class TaskThunk implements CancelableRunnable, ProjectRunnable {
private final CommandRunnable thunk;
- private final Context taskContext;
private final String taskName;
-
+ private final AccessPath accessPath;
private Project.NameKey projectName;
- private TaskThunk(CommandRunnable thunk, Optional<Context> oneOffContext) {
+ private TaskThunk(final CommandRunnable thunk, AccessPath accessPath) {
this.thunk = thunk;
this.taskName = getTaskName();
- this.taskContext = oneOffContext.orElse(context);
+ this.accessPath = accessPath;
}
@Override
public void cancel() {
synchronized (this) {
- final Context old = sshScope.set(taskContext);
+ final Context old = sshScope.set(context);
try {
onExit(STATUS_CANCEL);
} finally {
@@ -465,7 +444,8 @@ public abstract class BaseCommand implements Command {
final Thread thisThread = Thread.currentThread();
final String thisName = thisThread.getName();
int rc = 0;
- final Context old = sshScope.set(taskContext);
+ context.getSession().setAccessPath(accessPath);
+ final Context old = sshScope.set(context);
try {
context.started = TimeUtil.nowMs();
thisThread.setName("SSH " + taskName);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java
index 3e42ebee09..b4e44d3564 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java
@@ -14,6 +14,7 @@
package com.google.gerrit.sshd;
+import com.google.gerrit.server.AccessPath;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.sshd.server.Environment;
@@ -38,7 +39,8 @@ public abstract class SshCommand extends BaseCommand {
stderr.flush();
}
}
- });
+ },
+ AccessPath.SSH_COMMAND);
}
protected abstract void run() throws UnloggedFailure, Failure, Exception;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java
index 1306c52eab..0d2030567d 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java
@@ -24,6 +24,7 @@ package com.google.gerrit.sshd.commands;
import static java.nio.charset.StandardCharsets.UTF_8;
+import com.google.gerrit.server.AccessPath;
import com.google.gerrit.server.tools.ToolsCatalog;
import com.google.gerrit.server.tools.ToolsCatalog.Entry;
import com.google.gerrit.sshd.BaseCommand;
@@ -82,7 +83,7 @@ final class ScpCommand extends BaseCommand {
@Override
public void start(Environment env) {
- startThread(this::runImp);
+ startThread(this::runImp, AccessPath.SSH_COMMAND);
}
private void runImp() {