GetState: Skip including capabilities when using a non default permission backend

If a non default permission backend is used, default capabilities cannot
be retrieved and the request fails.

Release-Notes: skip
Change-Id: I49be38ca6041a396a58546fc72687cebc9a17161
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt
index 4d508e9..5fb1fc4 100644
--- a/Documentation/rest-api-accounts.txt
+++ b/Documentation/rest-api-accounts.txt
@@ -2363,19 +2363,20 @@
 
 [options="header",cols="1,^2,4"]
 |==========================
-|Field Name    |Description
-|`account`     |
+|Field Name    ||Description
+|`account`     ||
 The account details as link:#account-detail-info[AccountDetailInfo] entity.
-|`capabilities`|
+|`capabilities`|optional|
 The global capabilities of the account as a
-link:#capability-info[CapabilityInfo] entity.
-|`groups`      |
+link:#capability-info[CapabilityInfo] entity. Not set if the permission backend
+doesn't use default capabilities.
+|`groups`      ||
 The groups that contain the account as a member as a list of
 link:rest-api-groups.html#group-info[GroupInfo] entries.
-|`external_ids`|
+|`external_ids`||
 The external IDs of the account as a list of
 link:#account-external-id-info[AccountExternalIdInfo] entities.
-|`metadata`    |
+|`metadata`    ||
 Optional account metadata as a list of
 link:account-metadata-info[AccountMetadataInfo] entities. If and which metadata
 is provided depends on the Gerrit setup.
diff --git a/java/com/google/gerrit/server/restapi/account/GetState.java b/java/com/google/gerrit/server/restapi/account/GetState.java
index d8684c1..b18e61c 100644
--- a/java/com/google/gerrit/server/restapi/account/GetState.java
+++ b/java/com/google/gerrit/server/restapi/account/GetState.java
@@ -27,6 +27,7 @@
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.account.AccountResource;
 import com.google.gerrit.server.account.AccountStateProvider;
+import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.plugincontext.PluginSetContext;
 import com.google.inject.Inject;
@@ -45,6 +46,7 @@
  */
 @Singleton
 public class GetState implements RestReadView<AccountResource> {
+  private final PermissionBackend permissionBackend;
   private final Provider<CurrentUser> self;
   private final Provider<GetCapabilities> getCapabilities;
   private final GetDetail getDetail;
@@ -54,12 +56,14 @@
 
   @Inject
   GetState(
+      PermissionBackend permissionBackend,
       Provider<CurrentUser> self,
       Provider<GetCapabilities> getCapabilities,
       GetDetail getDetail,
       GetGroups getGroups,
       GetExternalIds getExternalIds,
       PluginSetContext<AccountStateProvider> accountStateProviders) {
+    this.permissionBackend = permissionBackend;
     this.self = self;
     this.getCapabilities = getCapabilities;
     this.getDetail = getDetail;
@@ -81,7 +85,11 @@
 
     AccountStateInfo accountState = new AccountStateInfo();
     accountState.account = getDetail.apply(rsrc).value();
-    accountState.capabilities = getCapabilities.get().apply(rsrc).value();
+
+    if (permissionBackend.usesDefaultCapabilities()) {
+      accountState.capabilities = getCapabilities.get().apply(rsrc).value();
+    }
+
     accountState.groups = getGroups.apply(rsrc).value();
     accountState.externalIds = getExternalIds.apply(rsrc).value();
     accountState.metadata = getMetadata(rsrc.getUser().getAccountId());