commit c98f5cd076cc5c89175a7646cf059647540522a7 Author: Patrick Hiesel Date: Thu Oct 8 10:37:54 2020 +0200 Rename SingleGroupUser to GroupBackedUser and provide docs In this change we document existing assumptions in this class. The name is not approriate anymore since we allow for a set of memberships in this class. Hence, we change it. Change-Id: I31db1ef3feac7dad0a538166bb4f8ca209205410 diff --git a/java/com/google/gerrit/server/index/IndexUtils.java b/java/com/google/gerrit/server/index/IndexUtils.java index 9e3d91c..ee8dfc8 100644 --- a/java/com/google/gerrit/server/index/IndexUtils.java +++ b/java/com/google/gerrit/server/index/IndexUtils.java @@ -30,7 +30,7 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.index.account.AccountField; import com.google.gerrit.server.index.group.GroupField; import com.google.gerrit.server.query.change.ChangeData; -import com.google.gerrit.server.query.change.SingleGroupUser; +import com.google.gerrit.server.query.change.GroupBackedUser; import java.io.IOException; import java.util.Set; import org.eclipse.jgit.errors.ConfigInvalidException; @@ -107,7 +107,7 @@ public final class IndexUtils { if (user.isIdentifiedUser()) { return user.getAccountId().toString(); } - if (user instanceof SingleGroupUser) { + if (user instanceof GroupBackedUser) { return "group:" + user.getEffectiveGroups().getKnownGroups().iterator().next().toString(); } return user.toString(); diff --git a/java/com/google/gerrit/server/mail/send/ProjectWatch.java b/java/com/google/gerrit/server/mail/send/ProjectWatch.java index 0514337..173b121 100644 --- a/java/com/google/gerrit/server/mail/send/ProjectWatch.java +++ b/java/com/google/gerrit/server/mail/send/ProjectWatch.java @@ -33,7 +33,7 @@ import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey; import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeQueryBuilder; -import com.google.gerrit.server.query.change.SingleGroupUser; +import com.google.gerrit.server.query.change.GroupBackedUser; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -150,7 +150,7 @@ public class ProjectWatch { throws QueryParseException { logger.atFine().log("Checking watchers for notify config %s from project %s", nc, projectName); for (GroupReference groupRef : nc.getGroups()) { - CurrentUser user = new SingleGroupUser(groupRef.getUUID()); + CurrentUser user = new GroupBackedUser(ImmutableSet.of(groupRef.getUUID())); if (filterMatch(user, nc.getFilter())) { deliverToMembers(matching.list(nc.getHeader()), groupRef.getUUID()); logger.atFine().log("Added watchers for group %s", groupRef); diff --git a/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java b/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java index c6bcd60..a66c43ae 100644 --- a/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java +++ b/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java @@ -88,7 +88,7 @@ public class ChangeIsVisibleToPredicate extends IsVisibleToPredicate ? permissionBackend.absentUser(user.getAccountId()) : permissionBackend.user( Optional.of(user) - .filter(u -> u instanceof SingleGroupUser || u instanceof InternalUser) + .filter(u -> u instanceof GroupBackedUser || u instanceof InternalUser) .orElseGet(anonymousUserProvider::get)); try { withUser.change(cd).check(ChangePermission.READ); diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java index 464ba81..6f4ccb7 100644 --- a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java +++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java @@ -1026,7 +1026,7 @@ public class ChangeQueryBuilder extends QueryBuilderThis user representation is intended to be used for two purposes: + * + *
    + *
  1. Checking permissions for groups: There are occasions where we need to check if a resource - + * such as a change - is accessible by a group. Our entire {@link + * com.google.gerrit.server.permissions.PermissionBackend} works solely with {@link + * CurrentUser}. This class can be used to check permissions on a synthetic user with the + * given group memberships. Any real Gerrit user with the same group memberships would receive + * the same permission check results. + *
  2. Checking permissions for an external user: In installations with external group systems, + * one might want to check what Gerrit permissions a user has, before or even without creating + * a Gerrit account. Such an external user has external group memberships only as well as + * internal groups that contain the user's external groups as subgroups. This class can be + * used to represent such an external user. + *
+ */ +public final class GroupBackedUser extends CurrentUser { + private final GroupMembership groups; + + /** + * Creates a new instance + * + * @param groups this set has to include all parent groups the user is contained in through + * subgroup membership. Given a set of groups that contains the user directly, callers can use + * {@link + * com.google.gerrit.server.account.GroupIncludeCache#parentGroupsOf(AccountGroup.UUID)} to + * resolve parent groups. + */ + public GroupBackedUser(Set groups) { + this.groups = new ListGroupMembership(groups); + } + + @Override + public GroupMembership getEffectiveGroups() { + return groups; + } + + @Override + public String getLoggableName() { + return "GroupBackedUser with memberships: " + groups.getKnownGroups(); + } +} diff --git a/java/com/google/gerrit/server/query/change/SingleGroupUser.java b/java/com/google/gerrit/server/query/change/SingleGroupUser.java deleted file mode 100644 index 7947b6b..0000000 --- a/java/com/google/gerrit/server/query/change/SingleGroupUser.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2009 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.gerrit.server.query.change; - -import com.google.common.collect.ImmutableSet; -import com.google.gerrit.entities.AccountGroup; -import com.google.gerrit.server.CurrentUser; -import com.google.gerrit.server.account.GroupMembership; -import com.google.gerrit.server.account.ListGroupMembership; -import java.util.Set; - -public final class SingleGroupUser extends CurrentUser { - private final GroupMembership groups; - - public SingleGroupUser(AccountGroup.UUID groupId) { - this(ImmutableSet.of(groupId)); - } - - public SingleGroupUser(Set groups) { - this.groups = new ListGroupMembership(groups); - } - - @Override - public GroupMembership getEffectiveGroups() { - return groups; - } -}