Use PermissionBackend for plugins management Rely on the new PermissionBackend interface for detecting whether to enable or not the menus and functionalities of the Plugin Manager. Change-Id: Ie3ce2874ae3e3940c932b39c8c312c5ef1e74dcd
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java b/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java index feea5d4..2746bff 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java +++ b/src/main/java/com/googlesource/gerrit/plugins/manager/FirstWebLoginListener.java
@@ -32,21 +32,24 @@ private final Path pluginData; private final PluginLoader pluginLoader; private final String pluginUrl; + private final PluginManagerConfig config; @Inject public FirstWebLoginListener( PluginLoader pluginLoader, @PluginData Path pluginData, - @PluginCanonicalWebUrl String pluginUrl) { + @PluginCanonicalWebUrl String pluginUrl, + PluginManagerConfig config) { this.pluginData = pluginData; this.pluginLoader = pluginLoader; this.pluginUrl = pluginUrl; + this.config = config; } @Override public void onLogin(IdentifiedUser user, HttpServletRequest request, HttpServletResponse response) throws IOException { - if (pluginLoader.isRemoteAdminEnabled() && user.getCapabilities().canAdministrateServer()) { + if (pluginLoader.isRemoteAdminEnabled() && config.canAdministerPlugins()) { Path firstLoginFile = pluginData.resolve("firstLogin." + user.getAccountId().get()); if (!firstLoginFile.toFile().exists()) { response.sendRedirect(pluginUrl + "static/index.html");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java index 37c9b1f..02e4a58 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java +++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerConfig.java
@@ -15,18 +15,32 @@ package com.googlesource.gerrit.plugins.manager; import com.google.gerrit.extensions.annotations.PluginName; +import com.google.gerrit.extensions.restapi.AuthException; +import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.config.PluginConfig; import com.google.gerrit.server.config.PluginConfigFactory; +import com.google.gerrit.server.permissions.GlobalPermission; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.inject.Inject; +import com.google.inject.Provider; public class PluginManagerConfig { private static final String DEFAULT_GERRIT_CI_URL = "https://gerrit-ci.gerritforge.com"; private final PluginConfig config; + private final Provider<CurrentUser> currentUserProvider; + private final PermissionBackend permissions; @Inject - public PluginManagerConfig(PluginConfigFactory configFactory, @PluginName String pluginName) { + public PluginManagerConfig( + PluginConfigFactory configFactory, + @PluginName String pluginName, + Provider<CurrentUser> currentUserProvider, + PermissionBackend permissions) { this.config = configFactory.getFromGerritConfig(pluginName); + this.currentUserProvider = currentUserProvider; + this.permissions = permissions; } public String getJenkinsUrl() { @@ -36,4 +50,13 @@ public boolean isCachePreloadEnabled() { return config.getBoolean("preload", true); } + + public boolean canAdministerPlugins() { + try { + permissions.user(currentUserProvider).check(GlobalPermission.ADMINISTRATE_SERVER); + return true; + } catch (AuthException | PermissionBackendException e) { + return false; + } + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java index 9cddbd3..c79a818 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java +++ b/src/main/java/com/googlesource/gerrit/plugins/manager/PluginManagerTopMenu.java
@@ -17,10 +17,8 @@ import com.google.gerrit.extensions.annotations.PluginCanonicalWebUrl; import com.google.gerrit.extensions.client.MenuItem; import com.google.gerrit.extensions.webui.TopMenu; -import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.plugins.PluginLoader; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import java.util.Arrays; import java.util.Collections; @@ -29,17 +27,15 @@ @Singleton public class PluginManagerTopMenu implements TopMenu { - private PluginLoader loader; - private List<MenuEntry> menuEntries; - private Provider<CurrentUser> userProvider; + private final PluginLoader loader; + private final PluginManagerConfig config; + private final List<MenuEntry> menuEntries; @Inject public PluginManagerTopMenu( - @PluginCanonicalWebUrl String myUrl, - PluginLoader loader, - Provider<CurrentUser> userProvider) { + @PluginCanonicalWebUrl String myUrl, PluginLoader loader, PluginManagerConfig config) { this.loader = loader; - this.userProvider = userProvider; + this.config = config; this.menuEntries = Arrays.asList( new MenuEntry( @@ -49,8 +45,7 @@ @Override public List<MenuEntry> getEntries() { - if (loader.isRemoteAdminEnabled() - && userProvider.get().getCapabilities().canAdministrateServer()) { + if (loader.isRemoteAdminEnabled() && config.canAdministerPlugins()) { return menuEntries; } return Collections.emptyList();