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();