Merge "DisablePlugin: Explicitly check for capability in apply()"
This commit is contained in:
@@ -28,6 +28,7 @@ import com.google.gerrit.extensions.api.plugins.PluginApi;
|
|||||||
import com.google.gerrit.extensions.api.plugins.Plugins.ListRequest;
|
import com.google.gerrit.extensions.api.plugins.Plugins.ListRequest;
|
||||||
import com.google.gerrit.extensions.common.InstallPluginInput;
|
import com.google.gerrit.extensions.common.InstallPluginInput;
|
||||||
import com.google.gerrit.extensions.common.PluginInfo;
|
import com.google.gerrit.extensions.common.PluginInfo;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
import com.google.gerrit.extensions.restapi.BadRequestException;
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
||||||
import com.google.gerrit.extensions.restapi.RawInput;
|
import com.google.gerrit.extensions.restapi.RawInput;
|
||||||
@@ -107,6 +108,15 @@ public class PluginIT extends AbstractDaemonTest {
|
|||||||
api = gApi.plugins().name("plugin-a");
|
api = gApi.plugins().name("plugin-a");
|
||||||
assertThat(api.get().disabled).isNull();
|
assertThat(api.get().disabled).isNull();
|
||||||
assertPlugins(list().get(), PLUGINS);
|
assertPlugins(list().get(), PLUGINS);
|
||||||
|
|
||||||
|
// Non-admin cannot disable
|
||||||
|
setApiUser(user);
|
||||||
|
try {
|
||||||
|
gApi.plugins().name("plugin-a").disable();
|
||||||
|
fail("Expected AuthException");
|
||||||
|
} catch (AuthException expected) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -15,29 +15,42 @@
|
|||||||
package com.google.gerrit.server.plugins;
|
package com.google.gerrit.server.plugins;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.gerrit.common.data.GlobalCapability;
|
|
||||||
import com.google.gerrit.extensions.annotations.RequiresCapability;
|
|
||||||
import com.google.gerrit.extensions.common.PluginInfo;
|
import com.google.gerrit.extensions.common.PluginInfo;
|
||||||
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestApiException;
|
||||||
import com.google.gerrit.extensions.restapi.RestModifyView;
|
import com.google.gerrit.extensions.restapi.RestModifyView;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
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.plugins.DisablePlugin.Input;
|
import com.google.gerrit.server.plugins.DisablePlugin.Input;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Provider;
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class DisablePlugin implements RestModifyView<PluginResource, Input> {
|
public class DisablePlugin implements RestModifyView<PluginResource, Input> {
|
||||||
public static class Input {}
|
public static class Input {}
|
||||||
|
|
||||||
private final PluginLoader loader;
|
private final PluginLoader loader;
|
||||||
|
private final Provider<IdentifiedUser> user;
|
||||||
|
private final PermissionBackend permissionBackend;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
DisablePlugin(PluginLoader loader) {
|
DisablePlugin(
|
||||||
|
PluginLoader loader, Provider<IdentifiedUser> user, PermissionBackend permissionBackend) {
|
||||||
this.loader = loader;
|
this.loader = loader;
|
||||||
|
this.user = user;
|
||||||
|
this.permissionBackend = permissionBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PluginInfo apply(PluginResource resource, Input input) throws MethodNotAllowedException {
|
public PluginInfo apply(PluginResource resource, Input input) throws RestApiException {
|
||||||
|
try {
|
||||||
|
permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
|
||||||
|
} catch (PermissionBackendException e) {
|
||||||
|
throw new RestApiException("Could not check permission", e);
|
||||||
|
}
|
||||||
if (!loader.isRemoteAdminEnabled()) {
|
if (!loader.isRemoteAdminEnabled()) {
|
||||||
throw new MethodNotAllowedException("remote plugin administration is disabled");
|
throw new MethodNotAllowedException("remote plugin administration is disabled");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user