下面列出了怎么用javax.naming.directory.ModificationItem的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void testRemoveAttributeValueInUpdateModeOtherAndSameValueExistsInUpdatedAttrs()
throws NamingException {
tested.setUpdateMode(true);
tested.setAttributeValues("abc", new String[] { "321", "123" });
// Perform test
tested.removeAttributeValue("abc", "123");
assertThat(tested.getAttributes().get("abc")).isNull();
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
Attribute modificationAttribute = modificationItems[0].getAttribute();
assertThat(modificationAttribute.getID()).isEqualTo("abc");
assertThat(modificationAttribute.size()).isEqualTo(1);
}
@Test
public void testRemoveMultiAttribute() throws Exception {
final Attributes fixtureAttrs = new BasicAttributes();
Attribute abc = new BasicAttribute("abc");
abc.add("123");
abc.add("456");
fixtureAttrs.put(abc);
class TestableDirContextAdapter extends DirContextAdapter {
public TestableDirContextAdapter() {
super(fixtureAttrs, null);
setUpdateMode(true);
}
}
tested = new TestableDirContextAdapter();
tested.setUpdateMode(true);
tested.setAttributeValues("abc", new String[] {});
ModificationItem[] mods = tested.getModificationItems();
assertThat(mods.length).isEqualTo(1);
assertThat(mods[0].getModificationOp()).isEqualTo(DirContext.REMOVE_ATTRIBUTE);
Attribute attr = mods[0].getAttribute();
assertThat((String) attr.getID()).isEqualTo("abc");
assertThat(attr.size()).isEqualTo(0);
}
@Test
public void testAddAttributeValueInUpdateModeAttributeWithOtherValueExistsInUpdAttrs()
throws NamingException {
tested.setUpdateMode(true);
tested.setAttributeValue("abc", "321");
// Perform test
tested.addAttributeValue("abc", "123");
Attributes attrs = tested.getAttributes();
assertThat(attrs.get("abc")).isNull();
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
Attribute attribute = modificationItems[0].getAttribute();
assertThat(attribute.getID()).isEqualTo("abc");
assertThat(attribute.get(0)).isEqualTo("321");
assertThat(attribute.get(1)).isEqualTo("123");
}
@Test
public void testChangeMultiAttribute_RemoveTwoValues() throws Exception {
final Attributes fixtureAttrs = new BasicAttributes();
Attribute multi = new BasicAttribute("abc");
multi.add("123");
multi.add("qwe");
multi.add("rty");
fixtureAttrs.put(multi);
class TestableDirContextAdapter extends DirContextAdapter {
public TestableDirContextAdapter() {
super(fixtureAttrs, null);
setUpdateMode(true);
}
}
tested = new TestableDirContextAdapter();
assertThat(tested.isUpdateMode()).isTrue();
tested.setAttributeValues("abc", new String[] { "123" });
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
assertThat(modificationItems[0].getModificationOp()).isEqualTo(DirContext.REMOVE_ATTRIBUTE);
assertThat(modificationItems[0].getAttribute().get(0)).isEqualTo("qwe");
assertThat(modificationItems[0].getAttribute().get(1)).isEqualTo("rty");
}
public boolean changePassword(final String username, final String password) {
if (!fessConfig.isLdapAdminEnabled(username)) {
return false;
}
final Supplier<Hashtable<String, String>> adminEnv = this::createAdminEnv;
final String userDN = fessConfig.getLdapAdminUserSecurityPrincipal(username);
search(fessConfig.getLdapAdminUserBaseDn(), fessConfig.getLdapAdminUserFilter(username), null, adminEnv, result -> {
if (!result.isEmpty()) {
final List<ModificationItem> modifyList = new ArrayList<>();
modifyReplaceEntry(modifyList, "userPassword", password);
modify(userDN, modifyList, adminEnv);
} else {
throw new LdapOperationException("User is not found: " + username);
}
});
return true;
}
@Test
public void testGetCompensatingModificationItem_RemoveFullExistingAttribute()
throws NamingException {
BasicAttribute attribute = new BasicAttribute("someattr");
attribute.add("value1");
attribute.add("value2");
Attributes attributes = new BasicAttributes();
attributes.put(attribute);
ModificationItem originalItem = new ModificationItem(
DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("someattr"));
// Perform test
ModificationItem result = tested.getCompensatingModificationItem(
attributes, originalItem);
// Verify result
assertThat(result.getModificationOp()).isEqualTo(DirContext.ADD_ATTRIBUTE);
Attribute resultAttribute = result.getAttribute();
assertThat(resultAttribute.getID()).isEqualTo("someattr");
Object object = resultAttribute.get(0);
assertThat(object).isEqualTo("value1");
assertThat(resultAttribute.get(1)).isEqualTo("value2");
}
@Test
public void testUpdateWithIdSpecified() throws NamingException {
when(contextSourceMock.getReadOnlyContext()).thenReturn(dirContextMock);
when(contextSourceMock.getReadWriteContext()).thenReturn(dirContextMock);
LdapName expectedName = LdapUtils.newLdapName("ou=someOu");
ModificationItem[] expectedModificationItems = new ModificationItem[0];
DirContextOperations ctxMock = mock(DirContextOperations.class);
when(ctxMock.getDn()).thenReturn(expectedName);
when(ctxMock.isUpdateMode()).thenReturn(true);
when(ctxMock.getModificationItems()).thenReturn(expectedModificationItems);
Object expectedObject = new Object();
when(odmMock.getId(expectedObject)).thenReturn(expectedName);
when(odmMock.getCalculatedId(expectedObject)).thenReturn(null);
when(dirContextMock.lookup(expectedName)).thenReturn(ctxMock);
tested.update(expectedObject);
verify(odmMock, never()).setId(expectedObject, expectedName);
verify(odmMock).mapToLdapDataEntry(expectedObject, ctxMock);
verify(dirContextMock).modifyAttributes(expectedName, expectedModificationItems);
verify(dirContextMock, times(2)).close();
}
@Test
public void testAddAttributeValueInUpdateModeAttributeWithSameValueExistsInUpdAttrs()
throws NamingException {
tested.setUpdateMode(true);
tested.setAttributeValue("abc", "123");
// Perform test
tested.addAttributeValue("abc", "123");
Attributes attrs = tested.getAttributes();
assertThat(attrs.get("abc")).isNull();
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
Attribute attribute = modificationItems[0].getAttribute();
assertThat(attribute.size()).isEqualTo(1);
assertThat(attribute.getID()).isEqualTo("abc");
assertThat(attribute.get()).isEqualTo("123");
}
/**
*
* Convert a list of ModificationItemImpl to a list of
*
* @param modificationImpls
* @param atRegistry
* @return
* @throws LdapException
*/
public static List<Modification> convertToServerModification( List<ModificationItem> modificationItems,
SchemaManager schemaManager ) throws LdapException
{
if ( modificationItems != null )
{
List<Modification> modifications = new ArrayList<Modification>( modificationItems.size() );
for ( ModificationItem modificationItem : modificationItems )
{
AttributeType attributeType = schemaManager.lookupAttributeTypeRegistry( modificationItem
.getAttribute().getID() );
modifications.add( toServerModification( modificationItem, attributeType ) );
}
return modifications;
}
else
{
return null;
}
}
@Test
public void testUpdateWithIdCalculated() throws NamingException {
when(contextSourceMock.getReadOnlyContext()).thenReturn(dirContextMock);
when(contextSourceMock.getReadWriteContext()).thenReturn(dirContextMock);
LdapName expectedName = LdapUtils.newLdapName("ou=someOu");
ModificationItem[] expectedModificationItems = new ModificationItem[0];
DirContextOperations ctxMock = mock(DirContextOperations.class);
when(ctxMock.getDn()).thenReturn(expectedName);
when(ctxMock.isUpdateMode()).thenReturn(true);
when(ctxMock.getModificationItems()).thenReturn(expectedModificationItems);
Object expectedObject = new Object();
when(odmMock.getId(expectedObject)).thenReturn(null);
when(odmMock.getCalculatedId(expectedObject)).thenReturn(expectedName);
when(dirContextMock.lookup(expectedName)).thenReturn(ctxMock);
tested.update(expectedObject);
verify(odmMock).setId(expectedObject, expectedName);
verify(odmMock).mapToLdapDataEntry(expectedObject, ctxMock);
verify(dirContextMock).modifyAttributes(expectedName, expectedModificationItems);
verify(dirContextMock, times(2)).close();
}
@Test
public void testModifyAttributes_NamingException() throws Exception {
expectGetReadWriteContext();
ModificationItem[] mods = new ModificationItem[0];
javax.naming.LimitExceededException ne = new javax.naming.LimitExceededException();
doThrow(ne).when(dirContextMock).modifyAttributes(nameMock, mods);
try {
tested.modifyAttributes(nameMock, mods);
fail("LimitExceededException expected");
}
catch (LimitExceededException expected) {
assertThat(true).isTrue();
}
verify(dirContextMock).close();
}
@Test
public void testRemoveDnAttributeSyntacticallyEqual() throws NamingException {
BasicAttributes attributes = new BasicAttributes();
attributes.put("uniqueMember", "cn=john doe,OU=company");
DirContextAdapter tested = new DirContextAdapter(attributes, LdapUtils.newLdapName("cn=administrators, ou=groups"));
tested.setUpdateMode(true);
tested.removeAttributeValue("uniqueMember", LdapUtils.newLdapName("cn=john doe, ou=company"));
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
ModificationItem modificationItem = modificationItems[0];
assertThat(modificationItem.getModificationOp()).isEqualTo(DirContext.REMOVE_ATTRIBUTE);
assertThat(modificationItem.getAttribute().getID()).isEqualTo("uniqueMember");
}
@Test
public void testChangeMultiAttributeOrderDoesMatter() throws Exception {
final Attributes fixtureAttrs = new BasicAttributes();
Attribute multi = new BasicAttribute("abc");
multi.add("123");
multi.add("qwe");
fixtureAttrs.put(multi);
class TestableDirContextAdapter extends DirContextAdapter {
public TestableDirContextAdapter() {
super(fixtureAttrs, null);
setUpdateMode(true);
}
}
tested = new TestableDirContextAdapter();
assertThat(tested.isUpdateMode()).isTrue();
tested.setAttributeValues("abc", new String[] { "qwe", "123" }, true);
// change
ModificationItem[] mods = tested.getModificationItems();
assertThat(mods.length).isEqualTo(1);
assertThat(mods[0].getModificationOp()).isEqualTo(DirContext.REPLACE_ATTRIBUTE);
Attribute attr = mods[0].getAttribute();
assertThat(attr.get(0)).isEqualTo("qwe");
assertThat(attr.get(1)).isEqualTo("123");
}
@Test
public void testRemoveOneOfSeveralDnAttributeSyntacticallyEqual() throws NamingException {
BasicAttributes attributes = new BasicAttributes();
BasicAttribute attribute = new BasicAttribute("uniqueMember", "cn=john doe,OU=company");
attribute.add("cn=jane doe, ou=company");
attributes.put(attribute);
DirContextAdapter tested = new DirContextAdapter(attributes, LdapUtils.newLdapName("cn=administrators, ou=groups"));
tested.setUpdateMode(true);
tested.removeAttributeValue("uniqueMember", LdapUtils.newLdapName("cn=john doe, ou=company"));
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
ModificationItem modificationItem = modificationItems[0];
assertThat(modificationItem.getModificationOp()).isEqualTo(DirContext.REMOVE_ATTRIBUTE);
assertThat(modificationItem.getAttribute().getID()).isEqualTo("uniqueMember");
assertThat(modificationItem.getAttribute().get()).isEqualTo("cn=john doe,OU=company");
}
public void deactivateUser(final DirContext ctx, final LdapUser user) throws NamingException
{
log.info("Deactivate user: " + buildDn(null, user));
final List<ModificationItem> modificationItems = new ArrayList<ModificationItem>();
modificationItems.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("userPassword", null)));
modificationItems.add(new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("mail", DEACTIVATED_MAIL)));
buildDn(null, user);
modify(ctx, user, modificationItems);
final String ou = user.getOrganizationalUnit();
if (ou.startsWith(DEACTIVATED_SUB_CONTEXT2) == false) {
// Move user to the sub-context "deactivated".
final String newOu = LdapUtils.getOu(DEACTIVATED_SUB_CONTEXT, getOuBase());
move(ctx, user, newOu);
user.setOrganizationalUnit(newOu);
}
}
@Test
public void testGetCompensatingModificationItem_AddNonExistingAttribute()
throws NamingException {
Attributes attributes = new BasicAttributes();
BasicAttribute modificationAttribute = new BasicAttribute("someattr");
modificationAttribute.add("newvalue1");
modificationAttribute.add("newvalue2");
ModificationItem originalItem = new ModificationItem(
DirContext.ADD_ATTRIBUTE, modificationAttribute);
// Perform test
ModificationItem result = tested.getCompensatingModificationItem(
attributes, originalItem);
// Verify result
assertThat(result.getModificationOp()).isEqualTo(DirContext.REMOVE_ATTRIBUTE);
Attribute resultAttribute = result.getAttribute();
assertThat(resultAttribute.getID()).isEqualTo("someattr");
assertThat(resultAttribute.size()).isEqualTo(0);
}
/**
* Test written originally to verify that duplicates are allowed on ordered
* attributes, but had to be changed since Apache DS seems to disallow
* duplicates even for ordered attributes.
*/
@Test
public void testModifyAttributes_MultiValueAddDuplicateToOrdered() {
BasicAttribute attr = new BasicAttribute("description", "Some other description", true); // ordered
attr.add("Another description");
// Commented out duplicate to make test work for Apache DS
// attr.add("Some description");
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr);
tested.modifyAttributes(PERSON4_DN, mods);
DirContextAdapter result = (DirContextAdapter) tested.lookup(PERSON4_DN);
List<String> attributes = Arrays.asList(result.getStringAttributes("description"));
assertThat(attributes).hasSize(3);
assertThat(attributes.contains("Some other description")).isTrue();
assertThat(attributes.contains("Another description")).isTrue();
assertThat(attributes.contains("Some description")).isTrue();
}
@Test
public void testNoChangeMultiAttributeOrderDoesNotMatter() throws Exception {
final Attributes fixtureAttrs = new BasicAttributes();
Attribute multi = new BasicAttribute("abc");
multi.add("123");
multi.add("qwe");
fixtureAttrs.put(multi);
class TestableDirContextAdapter extends DirContextAdapter {
public TestableDirContextAdapter() {
super(fixtureAttrs, null);
setUpdateMode(true);
}
}
tested = new TestableDirContextAdapter();
tested.setAttributeValues("abc", new String[] { "qwe", "123" });
ModificationItem[] mods = tested.getModificationItems();
assertThat(mods.length).isEqualTo(0);
String[] modNames = tested.getNamesOfModifiedAttributes();
assertThat(modNames.length).isEqualTo(0);
}
@Test
public void testChangeAttribute() throws Exception {
final Attributes fixtureAttrs = new BasicAttributes();
fixtureAttrs.put(new BasicAttribute("abc", "123"));
class TestableDirContextAdapter extends DirContextAdapter {
public TestableDirContextAdapter() {
super(fixtureAttrs, null);
setUpdateMode(true);
}
}
tested = new TestableDirContextAdapter();
tested.setAttributeValue("abc", "234"); // change
ModificationItem[] mods = tested.getModificationItems();
assertThat(mods.length).isEqualTo(1);
assertThat(mods[0].getModificationOp()).isEqualTo(DirContext.REPLACE_ATTRIBUTE);
Attribute attr = mods[0].getAttribute();
assertThat((String) attr.getID()).isEqualTo("abc");
assertThat((String) attr.get()).isEqualTo("234");
}
@Test
public void testRemoveAttributeValueInUpdateModeSameValueExistsInOrigAttrs() {
tested.setAttribute(new BasicAttribute("abc", "123"));
tested.setUpdateMode(true);
// Perform test
tested.removeAttributeValue("abc", "123");
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(1);
Attribute modificationAttribute = modificationItems[0].getAttribute();
assertThat(modificationAttribute.getID()).isEqualTo("abc");
assertThat(modificationAttribute.size()).isEqualTo(0);
assertThat(modificationItems[0].getModificationOp()).isEqualTo(DirContext.REMOVE_ATTRIBUTE);
}
@Test
public void testSetDnAttributeValueIdentical() {
BasicAttributes attributes = new BasicAttributes();
attributes.put("uniqueMember", "cn=john doe, ou=company");
DirContextAdapter tested = new DirContextAdapter(attributes, LdapUtils.newLdapName("cn=administrators, ou=groups"));
tested.setUpdateMode(true);
tested.setAttributeValue("uniqueMember", LdapUtils.newLdapName("cn=john doe, ou=company"));
ModificationItem[] modificationItems = tested.getModificationItems();
assertThat(modificationItems.length).isEqualTo(0);
}
protected void modifyGroupAttributes(final Group group, final Supplier<Hashtable<String, String>> adminEnv, final String entryDN,
final List<SearchResult> result) {
final List<ModificationItem> modifyList = new ArrayList<>();
final String attrGidNumber = fessConfig.getLdapAttrGidNumber();
OptionalUtil
.ofNullable(group.getGidNumber())
.filter(s -> StringUtil.isNotBlank(s.toString()))
.ifPresent(s -> modifyReplaceEntry(modifyList, attrGidNumber, s.toString()))
.orElse(() -> getAttributeValueList(result, attrGidNumber).stream().forEach(
v -> modifyDeleteEntry(modifyList, attrGidNumber, v)));
modify(entryDN, modifyList, adminEnv);
}
/**
* Test case corresponding to LDAP-96 in Spring Jira.
* https://jira.springframework.org/browse/LDAP-96
*/
@Test
public void testChangeMultiAttributeOrderDoesMatterLDAP96()
throws Exception {
final Attributes fixtureAttrs = new BasicAttributes();
Attribute multi = new BasicAttribute("title");
multi.add("Juergen");
multi.add("George");
fixtureAttrs.put(multi);
class TestableDirContextAdapter extends DirContextAdapter {
public TestableDirContextAdapter() {
super(fixtureAttrs, null);
setUpdateMode(true);
}
}
tested = new TestableDirContextAdapter();
assertThat(tested.isUpdateMode()).isTrue();
tested.setAttributeValues("title", new String[] { "Jim", "George",
"Juergen" }, true);
// change
ModificationItem[] mods = tested.getModificationItems();
assertThat(mods.length).isEqualTo(1);
assertThat(mods[0].getModificationOp()).isEqualTo(DirContext.REPLACE_ATTRIBUTE);
Attribute attr = mods[0].getAttribute();
assertThat(attr.get(0)).isEqualTo("Jim");
assertThat(attr.get(1)).isEqualTo("George");
assertThat(attr.get(2)).isEqualTo("Juergen");
}
@Test
public void testModifyNull() throws Exception {
tested.setAttributeValue("memberDN", null);
tested.setUpdateMode(true);
assertThat(tested.isUpdateMode()).isTrue();
tested.setAttributeValue("memberDN", new LdapName("ou=test"));
ModificationItem[] mods = tested.getModificationItems();
assertThat(mods.length).isEqualTo(1);
}
@Override
public void updatePassword(LDAPObject user, String password, LDAPOperationDecorator passwordUpdateDecorator) {
String userDN = user.getDn().toString();
if (logger.isDebugEnabled()) {
logger.debugf("Using DN [%s] for updating LDAP password of user", userDN);
}
if (getConfig().isActiveDirectory()) {
updateADPassword(userDN, password, passwordUpdateDecorator);
return;
}
try {
if (config.useExtendedPasswordModifyOp()) {
operationManager.passwordModifyExtended(userDN, password, passwordUpdateDecorator);
} else {
ModificationItem[] mods = new ModificationItem[1];
BasicAttribute mod0 = new BasicAttribute(LDAPConstants.USER_PASSWORD_ATTRIBUTE, password);
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0);
operationManager.modifyAttributes(userDN, mods, passwordUpdateDecorator);
}
} catch (ModelException me) {
throw me;
} catch (Exception e) {
throw new ModelException("Error updating password.", e);
}
}
private boolean toggleUserInGroup(String realm, Group group, User user, int op) {
BasicAttribute member = new BasicAttribute("memberUid", user.getUid());
ModificationItem[] modGroups = new ModificationItem[] {
new ModificationItem(op, member) };
Name groupName = buildGroupDN(realm, group.getGroupName());
try {
ldapTemplate.modifyAttributes(groupName, modGroups);
} catch (NamingException e) {
return false;
}
return true;
}
@Test
public void testGetModificationItems() throws Exception {
ModificationItem[] items = tested.getModificationItems();
assertThat(items.length).isEqualTo(0);
tested.setUpdateMode(true);
assertThat(items.length).isEqualTo(0);
}
@Test
public void testModifyAttributes_Plain() {
ModificationItem item = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("description",
"Some other description"));
tested.modifyAttributes(PERSON4_DN, new ModificationItem[] { item });
verifyBoundCorrectData();
}
/**
* Convert a ModificationItem to an instance of a ServerModification object
*
* @param modificationImpl the modification instance to convert
* @param attributeType the associated attributeType
* @return a instance of a ServerModification object
*/
private static Modification toServerModification( ModificationItem modificationImpl, AttributeType attributeType )
throws LdapException
{
ModificationOperation operation;
switch ( modificationImpl.getModificationOp() )
{
case DirContext.REMOVE_ATTRIBUTE:
operation = ModificationOperation.REMOVE_ATTRIBUTE;
break;
case DirContext.REPLACE_ATTRIBUTE:
operation = ModificationOperation.REPLACE_ATTRIBUTE;
break;
case DirContext.ADD_ATTRIBUTE:
default:
operation = ModificationOperation.ADD_ATTRIBUTE;
break;
}
Modification modification = new DefaultModification(
operation,
ServerEntryUtils.toServerAttribute( modificationImpl.getAttribute(), attributeType ) );
return modification;
}
@Test
public void testRollback() {
ModificationItem[] expectedCompensatingItems = new ModificationItem[0];
ModificationItem[] expectedActualItems = new ModificationItem[0];
Name expectedDn = LdapUtils.newLdapName("cn=john doe");
ModifyAttributesOperationExecutor tested = new ModifyAttributesOperationExecutor(ldapOperationsMock,
expectedDn, expectedActualItems, expectedCompensatingItems);
// Perform test
tested.rollback();
verify(ldapOperationsMock).modifyAttributes(expectedDn, expectedCompensatingItems);
}