/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Portions Copyright 2006 Sun Microsystems, Inc. */ package org.opends.server.core; import org.testng.annotations.Test; import org.testng.annotations.BeforeClass; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertFalse; import org.opends.server.protocols.internal.InternalClientConnection; import org.opends.server.protocols.asn1.ASN1OctetString; import org.opends.server.protocols.asn1.ASN1Reader; import org.opends.server.protocols.asn1.ASN1Writer; import org.opends.server.protocols.ldap.*; import org.opends.server.types.*; import org.opends.server.TestCaseUtils; import org.opends.server.controls.ProxiedAuthV1Control; import org.opends.server.controls.ProxiedAuthV2Control; import org.opends.server.controls.LDAPAssertionRequestControl; import org.opends.server.plugins.InvocationCounterPlugin; import org.opends.server.plugins.ShortCircuitPlugin; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.net.Socket; public class TestModifyDNOperation extends OperationTestCase { private Entry entry; @BeforeClass public void setUp() throws Exception { TestCaseUtils.startServer(); TestCaseUtils.clearJEBackend(false, "userRoot", "dc=example,dc=com"); InternalClientConnection connection = InternalClientConnection.getRootConnection(); // Add the example.com entry Entry exampleCom = TestCaseUtils.makeEntry( "dn: dc=example,dc=com", "objectclass: top", "objectclass: domain", "dc: example" ); // Add the people entry Entry people = TestCaseUtils.makeEntry( "dn: ou=People,dc=example,dc=com", "objectclass: top", "objectclass: organizationalUnit", "ou: People" ); // Add a test entry. entry = TestCaseUtils.makeEntry( "dn: uid=user.0,ou=People,dc=example,dc=com", "objectClass: top", "objectClass: person", "objectClass: organizationalPerson", "objectClass: inetOrgPerson", "givenName: Aaccf", "sn: Amar", "cn: Aaccf Amar", "initials: AQA", "employeeNumber: 0", "uid: user.0", "mail: user.0@example.com", "userPassword: password", "telephoneNumber: 380-535-2354", "homePhone: 707-626-3913", "pager: 456-345-7750", "mobile: 366-674-7274", "street: 99262 Eleventh Street", "l: Salem", "st: NM", "postalCode: 36530", "postalAddress: Aaccf Amar$99262 Eleventh Street$Salem, NM 36530", "description: This is the description for Aaccf Amar." ); AddOperation addOperation = connection.processAdd(exampleCom.getDN(), exampleCom.getObjectClasses(), exampleCom.getUserAttributes(), exampleCom.getOperationalAttributes()); assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS); assertNotNull(DirectoryServer.getEntry(exampleCom.getDN())); addOperation = connection.processAdd(people.getDN(), people.getObjectClasses(), people.getUserAttributes(), people.getOperationalAttributes()); assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS); assertNotNull(DirectoryServer.getEntry(people.getDN())); addOperation = connection.processAdd(entry.getDN(), entry.getObjectClasses(), entry.getUserAttributes(), entry.getOperationalAttributes()); assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS); assertNotNull(DirectoryServer.getEntry(entry.getDN())); } /** * Invokes a number of operation methods on the provided modify operation * for which all processing has been completed. * * @param modifyDNOperation The operation to be tested. */ private void examineCompletedOperation(ModifyDNOperation modifyDNOperation) { assertTrue(modifyDNOperation.getProcessingStartTime() > 0); assertTrue(modifyDNOperation.getProcessingStopTime() > 0); assertTrue(modifyDNOperation.getProcessingTime() >= 0); assertNotNull(modifyDNOperation.getResponseLogElements()); assertEquals(InvocationCounterPlugin.getPreParseCount(), 1); assertEquals(InvocationCounterPlugin.getPreOperationCount(), 1); assertEquals(InvocationCounterPlugin.getPostOperationCount(), 1); assertEquals(InvocationCounterPlugin.getPostResponseCount(), 1); } /** * Invokes a number of operation methods on the provided modify operation * for which the pre-operation plugin was not called. * * @param modifyDNOperation The operation to be tested. */ private void examineIncompleteOperation(ModifyDNOperation modifyDNOperation) { assertTrue(modifyDNOperation.getProcessingStartTime() > 0); assertTrue(modifyDNOperation.getProcessingStopTime() > 0); assertTrue(modifyDNOperation.getProcessingTime() >= 0); assertNotNull(modifyDNOperation.getResponseLogElements()); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); assertEquals(InvocationCounterPlugin.getPreParseCount(), 1); assertEquals(InvocationCounterPlugin.getPreOperationCount(), 0); assertEquals(InvocationCounterPlugin.getPostOperationCount(), 1); assertEquals(InvocationCounterPlugin.getPostResponseCount(), 1); } /** * Invokes a number of operation methods on the provided modify operation * for which an error was found during parsing. * * @param modifyDNOperation The operation to be tested. */ private void examineUnparsedOperation(ModifyDNOperation modifyDNOperation) { assertTrue(modifyDNOperation.getProcessingStartTime() > 0); assertTrue(modifyDNOperation.getProcessingStopTime() > 0); assertTrue(modifyDNOperation.getProcessingTime() >= 0); assertNotNull(modifyDNOperation.getResponseLogElements()); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); assertEquals(InvocationCounterPlugin.getPreParseCount(), 1); assertEquals(InvocationCounterPlugin.getPreOperationCount(), 0); assertEquals(InvocationCounterPlugin.getPostOperationCount(), 0); assertEquals(InvocationCounterPlugin.getPostResponseCount(), 1); } /** * {@inheritDoc} */ @Override() public Operation[] createTestOperations() throws Exception { ArrayList noControls = new ArrayList(0); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation[] modifies = new ModifyDNOperation[] { new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("cn=test,ou=test"), new ASN1OctetString("cn=test2"), true, new ASN1OctetString("dc=example,dc=com")), new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("cn=test,ou=test"), RDN.decode("cn=test2"), true, DN.decode("dc=example,dc=com")) }; return modifies; } @Test public void testRawModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.test0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testProcessedModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.test0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testRawDeleteOldRDNModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.test0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.test0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testProcessedDeleteOldRDNModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.test0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testRawNewSuperiorModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.test0"), true, new ASN1OctetString("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.test0,dc=example,dc=com"), new ASN1OctetString("uid=user.0"), true, new ASN1OctetString("ou=People,dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testProcessedNewSuperiorModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), true, DN.decode("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.test0,dc=example,dc=com"), RDN.decode("uid=user.0"), true, DN.decode("ou=People,dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testRawRDNModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("cn=Aaccf Amar Test"), true, DN.decode("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "cn=Aaccf Amar Test,dc=example,dc=com")); assertNotNull(newEntry); assertNull(DirectoryServer.getEntry(DN.decode("uid=user.0,ou=People,dc=example,dc=com"))); assertNull(newEntry.getAttribute("uid")); for(Attribute attribute : newEntry.getAttribute("cn")) { assertTrue(attribute.hasValue(new AttributeValue(attribute.getAttributeType(), "Aaccf Amar Test"))); assertTrue(attribute.hasValue(new AttributeValue(attribute.getAttributeType(), "Aaccf Amar"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("cn=Aaccf Amar Test,dc=example,dc=com"), RDN.decode("uid=user.0"), false, DN.decode("ou=People,dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newOldEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newOldEntry); assertNull(DirectoryServer.getEntry(DN.decode("cn=Aaccf Amar Test,dc=example,dc=com"))); for(Attribute attribute : newOldEntry.getAttribute("cn")) { assertTrue(attribute.hasValue(new AttributeValue(attribute.getAttributeType(), "Aaccf Amar Test"))); assertTrue(attribute.hasValue(new AttributeValue(attribute.getAttributeType(), "Aaccf Amar"))); } for(Attribute attribute : newOldEntry.getAttribute("uid")) { assertTrue(attribute.hasValue(new AttributeValue(attribute.getAttributeType(), "user.0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testInvalidEntryModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.invalid,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), true, DN.decode("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.NO_SUCH_OBJECT); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testInvalidRDNModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("invalid=invalid"), true, DN.decode("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.OBJECTCLASS_VIOLATION); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testInvalidSuperiorModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), true, DN.decode("dc=invalid,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.NO_SUCH_OBJECT); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testRawNoSuchDNModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("invalid DN"), new ASN1OctetString("uid=user.test0"), true, new ASN1OctetString("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.INVALID_DN_SYNTAX); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineUnparsedOperation(modifyDNOperation); } @Test public void testRawNoSuchRDNModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.0,ou=People,dc=example,dc=com"), new ASN1OctetString("invalid RDN"), true, new ASN1OctetString("dc=example,dc=com")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.INVALID_DN_SYNTAX); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineUnparsedOperation(modifyDNOperation); } @Test public void testRawInvalidSuperiorModify() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, new ASN1OctetString("uid=user.0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.test0"), true, new ASN1OctetString("invalid superior")); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.INVALID_DN_SYNTAX); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineUnparsedOperation(modifyDNOperation); } @Test public void testModifySuffix() throws Exception { ArrayList noControls = new ArrayList(0); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), noControls, DN.decode("dc=example,dc=com"), RDN.decode("dc=exampletest"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.UNWILLING_TO_PERFORM); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testRawProxyAuthV1Modify() throws Exception { ProxiedAuthV1Control authV1Control = new ProxiedAuthV1Control(new ASN1OctetString()); List controls = new ArrayList(); controls.add(authV1Control); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, new ASN1OctetString("uid=user.0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, new ASN1OctetString("uid=user.test0,ou=People,dc=example,dc=com"), new ASN1OctetString("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testProcessedProxyAuthV1Modify() throws Exception { ProxiedAuthV1Control authV1Control = new ProxiedAuthV1Control(new ASN1OctetString()); List controls = new ArrayList(); controls.add(authV1Control); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.test0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testProcessedProxyAuthV1DeniedModify() throws Exception { ProxiedAuthV1Control authV1Control = new ProxiedAuthV1Control(new ASN1OctetString("cn=nonexistent,o=test")); List controls = new ArrayList(); controls.add(authV1Control); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.AUTHORIZATION_DENIED); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testProcessedProxyAuthV2Modify() throws Exception { ProxiedAuthV2Control authV2Control = new ProxiedAuthV2Control(new ASN1OctetString("dn:")); List controls = new ArrayList(); controls.add(authV2Control); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); Entry newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.test0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); InvocationCounterPlugin.resetAllCounters(); modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.test0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.0"), true, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.SUCCESS); assertEquals(modifyDNOperation.getErrorMessage().length(), 0); newEntry = DirectoryServer.getEntry(DN.decode( "uid=user.0,ou=People,dc=example,dc=com")); assertNotNull(newEntry); for(AttributeType attribute : newEntry.getDN().getRDN().getAttributeTypes()) { assertTrue(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.0"))); assertFalse(newEntry.hasValue(attribute, null, new AttributeValue(attribute, "user.test0"))); } examineCompletedOperation(modifyDNOperation); } @Test public void testProcessedProxyAuthV2DeniedModify() throws Exception { ProxiedAuthV2Control authV2Control = new ProxiedAuthV2Control( new ASN1OctetString("dn:cn=nonexistent,o=test")); List controls = new ArrayList(); controls.add(authV2Control); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.AUTHORIZATION_DENIED); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test(enabled = false) //FIXME: Issue 741 public void testProcessedProxyAuthV2CriticalityModify() throws Exception { ProxiedAuthV2Control authV2Control = new ProxiedAuthV2Control( new ASN1OctetString("dn:cn=nonexistent,o=test")); List controls = new ArrayList(); authV2Control.setCritical(false); controls.add(authV2Control); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.PROTOCOL_ERROR); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testProcessedUnsupportedControlModify() throws Exception { LDAPFilter ldapFilter = LDAPFilter.decode("(preferredlanguage=ja)"); LDAPAssertionRequestControl assertControl = new LDAPAssertionRequestControl("1.1.1.1.1.1", true, ldapFilter); List controls = new ArrayList(); controls.add(assertControl); InvocationCounterPlugin.resetAllCounters(); InternalClientConnection conn = InternalClientConnection.getRootConnection(); ModifyDNOperation modifyDNOperation = new ModifyDNOperation(conn, conn.nextOperationID(), conn.nextMessageID(), controls, DN.decode("uid=user.0,ou=People,dc=example,dc=com"), RDN.decode("uid=user.test0"), false, null); modifyDNOperation.run(); assertEquals(modifyDNOperation.getResultCode(), ResultCode.UNAVAILABLE_CRITICAL_EXTENSION); assertTrue(modifyDNOperation.getErrorMessage().length() > 0); examineIncompleteOperation(modifyDNOperation); } @Test public void testShortCircuitModify() throws Exception { // Establish a connection to the server. Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort()); InvocationCounterPlugin.resetAllCounters(); ASN1Reader r = new ASN1Reader(s); ASN1Writer w = new ASN1Writer(s); r.setIOTimeout(6000); ModifyDNRequestProtocolOp modifyRequest = new ModifyDNRequestProtocolOp( new ASN1OctetString(entry.getDN().toString()), new ASN1OctetString("uid=user.test0"), false); LDAPMessage message = new LDAPMessage(2, modifyRequest, ShortCircuitPlugin.createShortCircuitLDAPControlList(80, "PreOperation")); w.writeElement(message.encode()); message = LDAPMessage.decode(r.readElement().decodeAsSequence()); ModifyDNResponseProtocolOp modifyResponse = message.getModifyDNResponseProtocolOp(); assertEquals(modifyResponse.getResultCode(), 80); assertEquals(InvocationCounterPlugin.waitForPostResponse(), 1); try { s.close(); } catch (Exception e) {} } @Test(groups = "slow") public void testWriteLockModify() throws Exception { // We need the operation to be run in a separate thread because we are going // to write lock the entry in the test case thread and check that the // modify DN operation does not proceed. // Establish a connection to the server. Socket s = new Socket("127.0.0.1", (int) TestCaseUtils.getServerLdapPort()); try { ASN1Reader r = new ASN1Reader(s); ASN1Writer w = new ASN1Writer(s); r.setIOTimeout(15000); BindRequestProtocolOp bindRequest = new BindRequestProtocolOp( new ASN1OctetString("cn=Directory Manager"), 3, new ASN1OctetString("password")); LDAPMessage message = new LDAPMessage(1, bindRequest); w.writeElement(message.encode()); message = LDAPMessage.decode(r.readElement().decodeAsSequence()); BindResponseProtocolOp bindResponse = message.getBindResponseProtocolOp(); assertEquals(bindResponse.getResultCode(), LDAPResultCode.SUCCESS); Lock writeLock = LockManager.lockWrite(entry.getDN()); assertNotNull(writeLock); try { InvocationCounterPlugin.resetAllCounters(); ModifyDNRequestProtocolOp modifyRequest = new ModifyDNRequestProtocolOp( new ASN1OctetString(entry.getDN().toString()), new ASN1OctetString("uid=user.test0"), false); message = new LDAPMessage(2, modifyRequest); w.writeElement(message.encode()); message = LDAPMessage.decode(r.readElement().decodeAsSequence()); ModifyDNResponseProtocolOp modifyResponse = message.getModifyDNResponseProtocolOp(); assertEquals(modifyResponse.getResultCode(), DirectoryServer.getServerErrorResultCode().getIntValue()); assertEquals(InvocationCounterPlugin.getPreParseCount(), 1); assertEquals(InvocationCounterPlugin.getPreOperationCount(), 0); assertEquals(InvocationCounterPlugin.getPostOperationCount(), 0); // The post response might not have been called yet. assertEquals(InvocationCounterPlugin.waitForPostResponse(), 1); } finally { LockManager.unlock(entry.getDN(), writeLock); } } finally { s.close(); } } }