Merge branch 'stable-2.14' into stable-2.15 * stable-2.14: ldap: allow to disable the groups relevance filtering Change-Id: I41a026c171e48c4e086dea4044af977db746fc53
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 32b1954..7785935 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt
@@ -3001,6 +3001,19 @@ groupMemberPattern = (&(objectClass=group)(member=${dn})) ---- +[[ldap.guessRelevantGroups]]ldap.guessRelevantGroups:: ++ +Filter the groups found in LDAP by guessing the ones relevant to +Gerrit and removing the others from list completions and ACL evaluations. +The guess is based on two elements: the projects most recently +accessed in the cache and the list of LDAP groups included in their ACLs. ++ +Please note that projects rarely used and thus not cached may be +temporarily inaccessible by users even with LDAP membership and grants +referenced in the ACLs. ++ +By default, true. + [[ldap.server]]ldap.server:: + URL of the organization's LDAP server to query for user information
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java index ca579bf..324e191 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
@@ -33,6 +33,7 @@ import com.google.gerrit.server.account.GroupMembership; import com.google.gerrit.server.account.externalids.ExternalId; import com.google.gerrit.server.auth.ldap.Helper.LdapSchema; +import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; @@ -50,6 +51,7 @@ import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; import javax.security.auth.login.LoginException; +import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,6 +67,7 @@ private final LoadingCache<String, Boolean> existsCache; private final ProjectCache projectCache; private final Provider<CurrentUser> userProvider; + private final Config gerritConfig; @Inject LdapGroupBackend( @@ -72,12 +75,14 @@ @Named(GROUP_CACHE) LoadingCache<String, Set<AccountGroup.UUID>> membershipCache, @Named(GROUP_EXIST_CACHE) LoadingCache<String, Boolean> existsCache, ProjectCache projectCache, - Provider<CurrentUser> userProvider) { + Provider<CurrentUser> userProvider, + @GerritServerConfig Config gerritConfig) { this.helper = helper; this.membershipCache = membershipCache; this.projectCache = projectCache; this.existsCache = existsCache; this.userProvider = userProvider; + this.gerritConfig = gerritConfig; } private boolean isLdapUUID(AccountGroup.UUID uuid) { @@ -178,7 +183,7 @@ if (id == null) { return GroupMembership.EMPTY; } - return new LdapGroupMembership(membershipCache, projectCache, id); + return new LdapGroupMembership(membershipCache, projectCache, id, gerritConfig); } private static String findId(Collection<ExternalId> extIds) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java index 39c8a2f..a12be7c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
@@ -22,20 +22,24 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutionException; +import org.eclipse.jgit.lib.Config; class LdapGroupMembership implements GroupMembership { private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache; private final ProjectCache projectCache; private final String id; + private final boolean guessRelevantGroups; private GroupMembership membership; LdapGroupMembership( LoadingCache<String, Set<AccountGroup.UUID>> membershipCache, ProjectCache projectCache, - String id) { + String id, + Config gerritConfig) { this.membershipCache = membershipCache; this.projectCache = projectCache; this.id = id; + this.guessRelevantGroups = gerritConfig.getBoolean("ldap", "guessRelevantGroups", true); } @Override @@ -56,7 +60,9 @@ @Override public Set<AccountGroup.UUID> getKnownGroups() { Set<AccountGroup.UUID> g = new HashSet<>(get().getKnownGroups()); - g.retainAll(projectCache.guessRelevantGroupUUIDs()); + if (guessRelevantGroups) { + g.retainAll(projectCache.guessRelevantGroupUUIDs()); + } return g; }