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
This commit is contained in:
Patrick Hiesel
2020-10-08 10:37:54 +02:00
parent a3196c7a71
commit c98f5cd076
6 changed files with 73 additions and 45 deletions

View File

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

View File

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

View File

@@ -88,7 +88,7 @@ public class ChangeIsVisibleToPredicate extends IsVisibleToPredicate<ChangeData>
? 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);

View File

@@ -1026,7 +1026,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil
for (GroupReference ref : suggestions) {
ids.add(ref.getUUID());
}
return visibleto(new SingleGroupUser(ids));
return visibleto(new GroupBackedUser(ids));
}
throw error("No user or group matches \"" + who + "\".");

View File

@@ -0,0 +1,67 @@
// 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.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;
/**
* Representation of a user that does not have a Gerrit account.
*
* <p>This user representation is intended to be used for two purposes:
*
* <ol>
* <li>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.
* <li>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.
* </ol>
*/
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<AccountGroup.UUID> groups) {
this.groups = new ListGroupMembership(groups);
}
@Override
public GroupMembership getEffectiveGroups() {
return groups;
}
@Override
public String getLoggableName() {
return "GroupBackedUser with memberships: " + groups.getKnownGroups();
}
}

View File

@@ -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<AccountGroup.UUID> groups) {
this.groups = new ListGroupMembership(groups);
}
@Override
public GroupMembership getEffectiveGroups() {
return groups;
}
}