Remove old LDAP group code.

Change-Id: I38fdd7b0dba73df61f9b7085c202c6f36ecfc04e
This commit is contained in:
Colby Ranger
2012-05-09 15:45:24 -07:00
parent cb8e7b6e29
commit 8363aa5144
11 changed files with 12 additions and 350 deletions

View File

@@ -24,7 +24,6 @@ import com.google.gwtjsonrpc.common.RpcImpl;
import com.google.gwtjsonrpc.common.VoidResult; import com.google.gwtjsonrpc.common.VoidResult;
import com.google.gwtjsonrpc.common.RpcImpl.Version; import com.google.gwtjsonrpc.common.RpcImpl.Version;
import java.util.List;
import java.util.Set; import java.util.Set;
@RpcImpl(version = Version.V2_0) @RpcImpl(version = Version.V2_0)
@@ -59,14 +58,6 @@ public interface GroupAdminService extends RemoteJsonService {
void changeGroupType(AccountGroup.Id groupId, AccountGroup.Type newType, void changeGroupType(AccountGroup.Id groupId, AccountGroup.Type newType,
AsyncCallback<VoidResult> callback); AsyncCallback<VoidResult> callback);
@SignInRequired
void changeExternalGroup(AccountGroup.Id groupId,
AccountGroup.ExternalNameKey bindTo, AsyncCallback<VoidResult> callback);
@SignInRequired
void searchExternalGroups(String searchFilter,
AsyncCallback<List<AccountGroup.ExternalNameKey>> callback);
@SignInRequired @SignInRequired
void addGroupMember(AccountGroup.Id groupId, String nameOrEmail, void addGroupMember(AccountGroup.Id groupId, String nameOrEmail,
AsyncCallback<GroupDetail> callback); AsyncCallback<GroupDetail> callback);

View File

@@ -27,17 +27,10 @@ import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwtexpui.clippy.client.CopyableLabel; import com.google.gwtexpui.clippy.client.CopyableLabel;
@@ -45,8 +38,6 @@ import com.google.gwtexpui.globalkey.client.NpTextArea;
import com.google.gwtexpui.globalkey.client.NpTextBox; import com.google.gwtexpui.globalkey.client.NpTextBox;
import com.google.gwtjsonrpc.common.VoidResult; import com.google.gwtjsonrpc.common.VoidResult;
import java.util.List;
public class AccountGroupInfoScreen extends AccountGroupScreen { public class AccountGroupInfoScreen extends AccountGroupScreen {
private CopyableLabel groupUUIDLabel; private CopyableLabel groupUUIDLabel;
@@ -64,12 +55,6 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
private ListBox typeSelect; private ListBox typeSelect;
private Button saveType; private Button saveType;
private Panel externalPanel;
private Label externalName;
private NpTextBox externalNameFilter;
private Button externalNameSearch;
private Grid externalMatches;
private CheckBox visibleToAllCheckBox; private CheckBox visibleToAllCheckBox;
private Button saveGroupOptions; private Button saveGroupOptions;
@@ -86,8 +71,6 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
initDescription(); initDescription();
initGroupOptions(); initGroupOptions();
initGroupType(); initGroupType();
initExternal();
} }
private void enableForm(final boolean canModify) { private void enableForm(final boolean canModify) {
@@ -95,8 +78,6 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
ownerTxtBox.setEnabled(canModify); ownerTxtBox.setEnabled(canModify);
descTxt.setEnabled(canModify); descTxt.setEnabled(canModify);
typeSelect.setEnabled(canModify); typeSelect.setEnabled(canModify);
externalNameFilter.setEnabled(canModify);
externalNameSearch.setEnabled(canModify);
visibleToAllCheckBox.setEnabled(canModify); visibleToAllCheckBox.setEnabled(canModify);
} }
@@ -243,7 +224,6 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
typeSelect = new ListBox(); typeSelect = new ListBox();
typeSelect.setStyleName(Gerrit.RESOURCES.css().groupTypeSelectListBox()); typeSelect.setStyleName(Gerrit.RESOURCES.css().groupTypeSelectListBox());
typeSelect.addItem(Util.C.groupType_INTERNAL(), AccountGroup.Type.INTERNAL.name()); typeSelect.addItem(Util.C.groupType_INTERNAL(), AccountGroup.Type.INTERNAL.name());
typeSelect.addItem(Util.C.groupType_LDAP(), AccountGroup.Type.LDAP.name());
typeSelect.addChangeHandler(new ChangeHandler() { typeSelect.addChangeHandler(new ChangeHandler() {
@Override @Override
public void onChange(ChangeEvent event) { public void onChange(ChangeEvent event) {
@@ -279,54 +259,12 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
add(fp); add(fp);
} }
private void initExternal() {
externalName = new Label();
externalNameFilter = new NpTextBox();
externalNameFilter.setStyleName(Gerrit.RESOURCES.css()
.groupExternalNameFilterTextBox());
externalNameFilter.setVisibleLength(30);
externalNameFilter.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(final KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
doExternalSearch();
}
}
});
externalNameSearch = new Button(Gerrit.C.searchButton());
externalNameSearch.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doExternalSearch();
}
});
externalMatches = new Grid();
externalMatches.setStyleName(Gerrit.RESOURCES.css().infoTable());
externalMatches.setVisible(false);
final FlowPanel searchLine = new FlowPanel();
searchLine.add(externalNameFilter);
searchLine.add(externalNameSearch);
externalPanel = new VerticalPanel();
externalPanel.add(new SmallHeading(Util.C.headingExternalGroup()));
externalPanel.add(externalName);
externalPanel.add(searchLine);
externalPanel.add(externalMatches);
add(externalPanel);
}
private void setType(final AccountGroup.Type newType) { private void setType(final AccountGroup.Type newType) {
final boolean system = newType == AccountGroup.Type.SYSTEM; final boolean system = newType == AccountGroup.Type.SYSTEM;
typeSystem.setVisible(system); typeSystem.setVisible(system);
typeSelect.setVisible(!system); typeSelect.setVisible(!system);
saveType.setVisible(!system); saveType.setVisible(!system);
externalPanel.setVisible(newType == AccountGroup.Type.LDAP);
externalNameFilter.setText(groupNameTxt.getText());
if (!system) { if (!system) {
for (int i = 0; i < typeSelect.getItemCount(); i++) { for (int i = 0; i < typeSelect.getItemCount(); i++) {
@@ -367,77 +305,6 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
}); });
} }
private void doExternalSearch() {
externalNameFilter.setEnabled(false);
externalNameSearch.setEnabled(false);
Util.GROUP_SVC.searchExternalGroups(externalNameFilter.getText(),
new GerritCallback<List<AccountGroup.ExternalNameKey>>() {
@Override
public void onSuccess(List<AccountGroup.ExternalNameKey> result) {
try {
final CellFormatter fmt = externalMatches.getCellFormatter();
if (result.isEmpty()) {
externalMatches.resize(1, 1);
externalMatches.setText(0, 0, Util.C.errorNoMatchingGroups());
fmt.setStyleName(0, 0, Gerrit.RESOURCES.css().header());
return;
}
externalMatches.resize(1 + result.size(), 2);
externalMatches.setText(0, 0, Util.C.columnGroupName());
externalMatches.setText(0, 1, "");
fmt.setStyleName(0, 0, Gerrit.RESOURCES.css().header());
fmt.setStyleName(0, 1, Gerrit.RESOURCES.css().header());
for (int row = 0; row < result.size(); row++) {
final AccountGroup.ExternalNameKey key = result.get(row);
final Button b = new Button(Util.C.buttonSelectGroup());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setExternalGroup(key);
}
});
externalMatches.setText(1 + row, 0, key.get());
externalMatches.setWidget(1 + row, 1, b);
fmt.setStyleName(1 + row, 1, Gerrit.RESOURCES.css().rightmost());
}
} finally {
externalMatches.setVisible(true);
externalNameFilter.setEnabled(true);
externalNameSearch.setEnabled(true);
}
}
@Override
public void onFailure(Throwable caught) {
externalNameFilter.setEnabled(true);
externalNameSearch.setEnabled(true);
super.onFailure(caught);
}
});
}
private void setExternalGroup(final AccountGroup.ExternalNameKey key) {
externalMatches.setVisible(false);
Util.GROUP_SVC.changeExternalGroup(getGroupId(), key,
new GerritCallback<VoidResult>() {
@Override
public void onSuccess(VoidResult result) {
externalName.setText(key.get());
}
@Override
public void onFailure(Throwable caught) {
externalMatches.setVisible(true);
super.onFailure(caught);
}
});
}
@Override @Override
protected void display(final GroupDetail groupDetail) { protected void display(final GroupDetail groupDetail) {
final AccountGroup group = groupDetail.group; final AccountGroup group = groupDetail.group;
@@ -452,13 +319,6 @@ public class AccountGroupInfoScreen extends AccountGroupScreen {
visibleToAllCheckBox.setValue(group.isVisibleToAll()); visibleToAllCheckBox.setValue(group.isVisibleToAll());
switch (group.getType()) {
case LDAP:
externalName.setText(group.getExternalNameKey() != null ? group
.getExternalNameKey().get() : Util.C.noGroupSelected());
break;
}
setType(group.getType()); setType(group.getType());
enableForm(groupDetail.canModify); enableForm(groupDetail.canModify);

View File

@@ -37,25 +37,21 @@ import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.account.GroupCache; import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.account.GroupControl; import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.account.GroupIncludeCache; import com.google.gerrit.server.account.GroupIncludeCache;
import com.google.gerrit.server.account.Realm;
import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.AsyncCallback;
import com.google.gwtjsonrpc.common.VoidResult; import com.google.gwtjsonrpc.common.VoidResult;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
class GroupAdminServiceImpl extends BaseServiceImplementation implements class GroupAdminServiceImpl extends BaseServiceImplementation implements
GroupAdminService { GroupAdminService {
private final AccountCache accountCache; private final AccountCache accountCache;
private final AccountResolver accountResolver; private final AccountResolver accountResolver;
private final Realm accountRealm;
private final GroupCache groupCache; private final GroupCache groupCache;
private final GroupIncludeCache groupIncludeCache; private final GroupIncludeCache groupIncludeCache;
private final GroupControl.Factory groupControlFactory; private final GroupControl.Factory groupControlFactory;
@@ -70,7 +66,7 @@ class GroupAdminServiceImpl extends BaseServiceImplementation implements
final Provider<IdentifiedUser> currentUser, final Provider<IdentifiedUser> currentUser,
final AccountCache accountCache, final AccountCache accountCache,
final GroupIncludeCache groupIncludeCache, final GroupIncludeCache groupIncludeCache,
final AccountResolver accountResolver, final Realm accountRealm, final AccountResolver accountResolver,
final GroupCache groupCache, final GroupCache groupCache,
final GroupControl.Factory groupControlFactory, final GroupControl.Factory groupControlFactory,
final CreateGroup.Factory createGroupFactory, final CreateGroup.Factory createGroupFactory,
@@ -81,7 +77,6 @@ class GroupAdminServiceImpl extends BaseServiceImplementation implements
this.accountCache = accountCache; this.accountCache = accountCache;
this.groupIncludeCache = groupIncludeCache; this.groupIncludeCache = groupIncludeCache;
this.accountResolver = accountResolver; this.accountResolver = accountResolver;
this.accountRealm = accountRealm;
this.groupCache = groupCache; this.groupCache = groupCache;
this.groupControlFactory = groupControlFactory; this.groupControlFactory = groupControlFactory;
this.createGroupFactory = createGroupFactory; this.createGroupFactory = createGroupFactory;
@@ -178,36 +173,6 @@ class GroupAdminServiceImpl extends BaseServiceImplementation implements
}); });
} }
public void changeExternalGroup(final AccountGroup.Id groupId,
final AccountGroup.ExternalNameKey bindTo,
final AsyncCallback<VoidResult> callback) {
run(callback, new Action<VoidResult>() {
public VoidResult run(final ReviewDb db) throws OrmException, Failure {
final AccountGroup group = db.accountGroups().get(groupId);
assertAmGroupOwner(db, group);
group.setExternalNameKey(bindTo);
db.accountGroups().update(Collections.singleton(group));
groupCache.evict(group);
return VoidResult.INSTANCE;
}
});
}
public void searchExternalGroups(final String searchFilter,
final AsyncCallback<List<AccountGroup.ExternalNameKey>> callback) {
final ArrayList<AccountGroup.ExternalNameKey> matches =
new ArrayList<AccountGroup.ExternalNameKey>(
accountRealm.lookupGroups(searchFilter));
Collections.sort(matches, new Comparator<AccountGroup.ExternalNameKey>() {
@Override
public int compare(AccountGroup.ExternalNameKey a,
AccountGroup.ExternalNameKey b) {
return a.get().compareTo(b.get());
}
});
callback.onSuccess(matches);
}
public void addGroupMember(final AccountGroup.Id groupId, public void addGroupMember(final AccountGroup.Id groupId,
final String nameOrEmail, final AsyncCallback<GroupDetail> callback) { final String nameOrEmail, final AsyncCallback<GroupDetail> callback) {
run(callback, new Action<GroupDetail>() { run(callback, new Action<GroupDetail>() {

View File

@@ -79,32 +79,6 @@ public final class AccountGroup {
} }
} }
/** Distinguished name, within organization directory server. */
public static class ExternalNameKey extends
StringKey<com.google.gwtorm.client.Key<?>> {
private static final long serialVersionUID = 1L;
@Column(id = 1)
protected String name;
protected ExternalNameKey() {
}
public ExternalNameKey(final String n) {
name = n;
}
@Override
public String get() {
return name;
}
@Override
protected void set(String newValue) {
name = newValue;
}
}
/** Synthetic key to link to within the database */ /** Synthetic key to link to within the database */
public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> { public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -157,20 +131,7 @@ public final class AccountGroup {
* who is a member of the owner group. These groups are not treated special * who is a member of the owner group. These groups are not treated special
* in the code. * in the code.
*/ */
INTERNAL, INTERNAL;
/**
* Group defined by external LDAP database.
* <p>
* A group whose membership is determined by the LDAP directory that we
* connect to for user and group information. In UI contexts the membership
* of the group is not displayed, as it may be exceedingly large, or might
* contain users who have never logged into this server before (and thus
* have no matching account record). Adding or removing users from an LDAP
* group requires making edits through the LDAP directory, and cannot be
* done through our UI.
*/
LDAP;
} }
/** Common UUID assigned to the "Project Owners" placeholder group. */ /** Common UUID assigned to the "Project Owners" placeholder group. */
@@ -201,10 +162,6 @@ public final class AccountGroup {
@Column(id = 5, length = 8) @Column(id = 5, length = 8)
protected String groupType; protected String groupType;
/** Distinguished name in the directory server. */
@Column(id = 6, notNull = false)
protected ExternalNameKey externalName;
@Column(id = 7) @Column(id = 7)
protected boolean visibleToAll; protected boolean visibleToAll;
@@ -273,14 +230,6 @@ public final class AccountGroup {
groupType = t.name(); groupType = t.name();
} }
public ExternalNameKey getExternalNameKey() {
return externalName;
}
public void setExternalNameKey(final ExternalNameKey k) {
externalName = k;
}
public void setVisibleToAll(final boolean visibleToAll) { public void setVisibleToAll(final boolean visibleToAll) {
this.visibleToAll = visibleToAll; this.visibleToAll = visibleToAll;
} }

View File

@@ -29,10 +29,6 @@ public interface AccountGroupAccess extends
@Query("WHERE groupUUID = ?") @Query("WHERE groupUUID = ?")
ResultSet<AccountGroup> byUUID(AccountGroup.UUID uuid) throws OrmException; ResultSet<AccountGroup> byUUID(AccountGroup.UUID uuid) throws OrmException;
@Query("WHERE externalName = ?")
ResultSet<AccountGroup> byExternalName(AccountGroup.ExternalNameKey name)
throws OrmException;
@Query @Query
ResultSet<AccountGroup> all() throws OrmException; ResultSet<AccountGroup> all() throws OrmException;
} }

View File

@@ -79,9 +79,4 @@ public class DefaultRealm implements Realm {
} }
return null; return null;
} }
@Override
public Set<AccountGroup.ExternalNameKey> lookupGroups(String name) {
return Collections.emptySet();
}
} }

View File

@@ -16,8 +16,6 @@ package com.google.gerrit.server.account;
import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroup;
import java.util.Collection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** Tracks group objects in memory for efficient access. */ /** Tracks group objects in memory for efficient access. */
@@ -34,8 +32,6 @@ public interface GroupCache {
@Nullable @Nullable
public AccountGroup get(AccountGroup.UUID uuid); public AccountGroup get(AccountGroup.UUID uuid);
public Collection<AccountGroup> get(AccountGroup.ExternalNameKey externalName);
/** @return sorted iteration of groups. */ /** @return sorted iteration of groups. */
public abstract Iterable<AccountGroup> all(); public abstract Iterable<AccountGroup> all();

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.server.account;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupName; import com.google.gerrit.reviewdb.client.AccountGroupName;
import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -34,7 +33,6 @@ import com.google.inject.name.Named;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@@ -48,7 +46,6 @@ public class GroupCacheImpl implements GroupCache {
private static final String BYID_NAME = "groups"; private static final String BYID_NAME = "groups";
private static final String BYNAME_NAME = "groups_byname"; private static final String BYNAME_NAME = "groups_byname";
private static final String BYUUID_NAME = "groups_byuuid"; private static final String BYUUID_NAME = "groups_byuuid";
private static final String BYEXT_NAME = "groups_byext";
public static Module module() { public static Module module() {
return new CacheModule() { return new CacheModule() {
@@ -69,11 +66,6 @@ public class GroupCacheImpl implements GroupCache {
new TypeLiteral<Optional<AccountGroup>>() {}) new TypeLiteral<Optional<AccountGroup>>() {})
.loader(ByUUIDLoader.class); .loader(ByUUIDLoader.class);
cache(BYEXT_NAME,
String.class,
new TypeLiteral<Collection<AccountGroup>>() {})
.loader(ByExternalNameLoader.class);
bind(GroupCacheImpl.class); bind(GroupCacheImpl.class);
bind(GroupCache.class).to(GroupCacheImpl.class); bind(GroupCache.class).to(GroupCacheImpl.class);
} }
@@ -83,7 +75,6 @@ public class GroupCacheImpl implements GroupCache {
private final LoadingCache<AccountGroup.Id, Optional<AccountGroup>> byId; private final LoadingCache<AccountGroup.Id, Optional<AccountGroup>> byId;
private final LoadingCache<String, Optional<AccountGroup>> byName; private final LoadingCache<String, Optional<AccountGroup>> byName;
private final LoadingCache<String, Optional<AccountGroup>> byUUID; private final LoadingCache<String, Optional<AccountGroup>> byUUID;
private final LoadingCache<String, Collection<AccountGroup>> byExternalName;
private final SchemaFactory<ReviewDb> schema; private final SchemaFactory<ReviewDb> schema;
@Inject @Inject
@@ -91,15 +82,14 @@ public class GroupCacheImpl implements GroupCache {
@Named(BYID_NAME) LoadingCache<AccountGroup.Id, Optional<AccountGroup>> byId, @Named(BYID_NAME) LoadingCache<AccountGroup.Id, Optional<AccountGroup>> byId,
@Named(BYNAME_NAME) LoadingCache<String, Optional<AccountGroup>> byName, @Named(BYNAME_NAME) LoadingCache<String, Optional<AccountGroup>> byName,
@Named(BYUUID_NAME) LoadingCache<String, Optional<AccountGroup>> byUUID, @Named(BYUUID_NAME) LoadingCache<String, Optional<AccountGroup>> byUUID,
@Named(BYEXT_NAME) LoadingCache<String, Collection<AccountGroup>> byExternalName,
SchemaFactory<ReviewDb> schema) { SchemaFactory<ReviewDb> schema) {
this.byId = byId; this.byId = byId;
this.byName = byName; this.byName = byName;
this.byUUID = byUUID; this.byUUID = byUUID;
this.byExternalName = byExternalName;
this.schema = schema; this.schema = schema;
} }
@Override
public AccountGroup get(final AccountGroup.Id groupId) { public AccountGroup get(final AccountGroup.Id groupId) {
try { try {
Optional<AccountGroup> g = byId.get(groupId); Optional<AccountGroup> g = byId.get(groupId);
@@ -110,6 +100,7 @@ public class GroupCacheImpl implements GroupCache {
} }
} }
@Override
public void evict(final AccountGroup group) { public void evict(final AccountGroup group) {
if (group.getId() != null) { if (group.getId() != null) {
byId.invalidate(group.getId()); byId.invalidate(group.getId());
@@ -120,11 +111,9 @@ public class GroupCacheImpl implements GroupCache {
if (group.getGroupUUID() != null) { if (group.getGroupUUID() != null) {
byUUID.invalidate(group.getGroupUUID().get()); byUUID.invalidate(group.getGroupUUID().get());
} }
if (group.getExternalNameKey() != null) {
byExternalName.invalidate(group.getExternalNameKey().get());
}
} }
@Override
public void evictAfterRename(final AccountGroup.NameKey oldName, public void evictAfterRename(final AccountGroup.NameKey oldName,
final AccountGroup.NameKey newName) { final AccountGroup.NameKey newName) {
if (oldName != null) { if (oldName != null) {
@@ -135,6 +124,7 @@ public class GroupCacheImpl implements GroupCache {
} }
} }
@Override
public AccountGroup get(AccountGroup.NameKey name) { public AccountGroup get(AccountGroup.NameKey name) {
if (name == null) { if (name == null) {
return null; return null;
@@ -147,6 +137,7 @@ public class GroupCacheImpl implements GroupCache {
} }
} }
@Override
public AccountGroup get(AccountGroup.UUID uuid) { public AccountGroup get(AccountGroup.UUID uuid) {
if (uuid == null) { if (uuid == null) {
return null; return null;
@@ -159,18 +150,6 @@ public class GroupCacheImpl implements GroupCache {
} }
} }
public Collection<AccountGroup> get(AccountGroup.ExternalNameKey name) {
if (name == null) {
return Collections.emptyList();
}
try {
return byExternalName.get(name.get());
} catch (ExecutionException e) {
log.warn("Cannot lookup external group " + name, e);
return Collections.emptyList();
}
}
@Override @Override
public Iterable<AccountGroup> all() { public Iterable<AccountGroup> all() {
try { try {
@@ -272,27 +251,4 @@ public class GroupCacheImpl implements GroupCache {
} }
} }
} }
static class ByExternalNameLoader extends
CacheLoader<String, Collection<AccountGroup>> {
private final SchemaFactory<ReviewDb> schema;
@Inject
ByExternalNameLoader(final SchemaFactory<ReviewDb> sf) {
schema = sf;
}
@Override
public Collection<AccountGroup> load(String name)
throws Exception {
final ReviewDb db = schema.open();
try {
return ImmutableList.copyOf(db.accountGroups()
.byExternalName(new AccountGroup.ExternalNameKey(name))
.toList());
} finally {
db.close();
}
}
}
} }

View File

@@ -45,9 +45,4 @@ public interface Realm {
* user by that email address. * user by that email address.
*/ */
public Account.Id lookup(String accountName); public Account.Id lookup(String accountName);
/**
* Search for matching external groups.
*/
public Set<AccountGroup.ExternalNameKey> lookupGroups(String name);
} }

View File

@@ -17,7 +17,6 @@ package com.google.gerrit.server.auth.ldap;
import com.google.gerrit.common.data.ParameterizedString; import com.google.gerrit.common.data.ParameterizedString;
import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.account.AccountException; import com.google.gerrit.server.account.AccountException;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.util.ssl.BlindSSLSocketFactory; import com.google.gerrit.util.ssl.BlindSSLSocketFactory;
@@ -47,7 +46,8 @@ import javax.naming.directory.InitialDirContext;
import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocketFactory;
@Singleton class Helper { @Singleton class Helper {
private final GroupCache groupCache; static final String LDAP_UUID = "ldap:";
private final Config config; private final Config config;
private final String server; private final String server;
private final String username; private final String username;
@@ -58,8 +58,7 @@ import javax.net.ssl.SSLSocketFactory;
private final String readTimeOutMillis; private final String readTimeOutMillis;
@Inject @Inject
Helper(@GerritServerConfig final Config config, final GroupCache groupCache) { Helper(@GerritServerConfig final Config config) {
this.groupCache = groupCache;
this.config = config; this.config = config;
this.server = LdapRealm.required(config, "server"); this.server = LdapRealm.required(config, "server");
this.username = LdapRealm.optional(config, "username"); this.username = LdapRealm.optional(config, "username");
@@ -195,12 +194,7 @@ import javax.net.ssl.SSLSocketFactory;
final Set<AccountGroup.UUID> actual = new HashSet<AccountGroup.UUID>(); final Set<AccountGroup.UUID> actual = new HashSet<AccountGroup.UUID>();
for (String dn : groupDNs) { for (String dn : groupDNs) {
for (AccountGroup group : groupCache actual.add(new AccountGroup.UUID(LDAP_UUID + dn));
.get(new AccountGroup.ExternalNameKey(dn))) {
if (group.getType() == AccountGroup.Type.LDAP) {
actual.add(group.getGroupUUID());
}
}
} }
if (actual.isEmpty()) { if (actual.isEmpty()) {

View File

@@ -35,7 +35,6 @@ import com.google.gerrit.server.account.GroupMembership;
import com.google.gerrit.server.account.MaterializedGroupMembership; import com.google.gerrit.server.account.MaterializedGroupMembership;
import com.google.gerrit.server.account.Realm; import com.google.gerrit.server.account.Realm;
import com.google.gerrit.server.auth.AuthenticationUnavailableException; import com.google.gerrit.server.auth.AuthenticationUnavailableException;
import com.google.gerrit.server.auth.ldap.Helper.LdapSchema;
import com.google.gerrit.server.config.AuthConfig; import com.google.gerrit.server.config.AuthConfig;
import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.GerritServerConfig;
@@ -67,7 +66,6 @@ class LdapRealm implements Realm {
static final Logger log = LoggerFactory.getLogger(LdapRealm.class); static final Logger log = LoggerFactory.getLogger(LdapRealm.class);
static final String LDAP = "com.sun.jndi.ldap.LdapCtxFactory"; static final String LDAP = "com.sun.jndi.ldap.LdapCtxFactory";
static final String USERNAME = "username"; static final String USERNAME = "username";
private static final String GROUPNAME = "groupname";
private final Helper helper; private final Helper helper;
private final AuthConfig authConfig; private final AuthConfig authConfig;
@@ -191,6 +189,7 @@ class LdapRealm implements Realm {
return r.isEmpty() ? null : r; return r.isEmpty() ? null : r;
} }
@Override
public AuthRequest authenticate(final AuthRequest who) public AuthRequest authenticate(final AuthRequest who)
throws AccountException { throws AccountException {
if (config.getBoolean("ldap", "localUsernameToLowerCase", false)) { if (config.getBoolean("ldap", "localUsernameToLowerCase", false)) {
@@ -308,40 +307,6 @@ class LdapRealm implements Realm {
} }
} }
@Override
public Set<AccountGroup.ExternalNameKey> lookupGroups(String name) {
final Set<AccountGroup.ExternalNameKey> out;
final Map<String, String> params = Collections.<String, String> emptyMap();
out = new HashSet<AccountGroup.ExternalNameKey>();
try {
final DirContext ctx = helper.open();
try {
final LdapSchema schema = helper.getSchema(ctx);
final ParameterizedString filter =
ParameterizedString.asis(schema.groupPattern
.replace(GROUPNAME, name).toString());
for (String groupBase : schema.groupBases) {
final LdapQuery query =
new LdapQuery(groupBase, schema.groupScope, filter, Collections
.<String> emptySet());
for (LdapQuery.Result res : query.query(ctx, params)) {
out.add(new AccountGroup.ExternalNameKey(res.getDN()));
}
}
} finally {
try {
ctx.close();
} catch (NamingException e) {
log.warn("Cannot close LDAP query handle", e);
}
}
} catch (NamingException e) {
log.warn("Cannot query LDAP for groups matching requested name", e);
}
return out;
}
static class UserLoader extends CacheLoader<String, Optional<Account.Id>> { static class UserLoader extends CacheLoader<String, Optional<Account.Id>> {
private final SchemaFactory<ReviewDb> schema; private final SchemaFactory<ReviewDb> schema;