From 7c30dbb5403772b323df3ad907d9ed15d23b5aee Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Thu, 29 Apr 2010 20:35:40 +0000
Subject: [PATCH] Last batch of changes for this week. This adds support for the IETF based Password Policy for LDAP as SubEntry. Also resolves the following issues : - 4544 : initializeBackend() should not set JE env config params directly. - 4478 : ECL in draft compat mode / search lastchangenumber can be very long - 4538 : Virtual attributes not retrieved when entry cache configured - 4547 : Search Filter Matching differ for cn=Directory Manager and plain user. - 4514 : Logs shows unexpected message with replication monitoring data missing (Partial fix) - 4534 : Replication using security does not work after server restart - 4516 : SEVERE_ERROR: servers (...) have the same ServerId In addition, they also improve reliability and performance in various areas including CollectiveAttributes, Virtual Attributes and Subentries management, Schema loading, Replication...
---
opends/resource/bin/stop-ds.bat | 14
opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java | 32
opends/src/server/org/opends/server/tools/ImportLDIF.java | 123
opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests.xml | 2
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectattr.xml | 541
opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch.xml | 139
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_setup.xml | 91
opends/resource/schema/02-config.ldif | 7
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/delete.ldif | 2
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapcompare.xml | 220
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify.ldif | 4
opends/src/server/org/opends/server/authorization/dseecompat/AciHandler.java | 13
opends/resource/config/config.ldif | 10
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify2.ldif | 4
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/modify.ldif | 27
opends/tests/staf-tests/shared/functions/security.xml | 509
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/add.ldif | 40
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldappasswdmodify.xml | 244
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/add.ldif | 40
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldappasswdmodify.xml | 246
opends/src/server/org/opends/server/core/SubentryManager.java | 482
opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java | 11
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/default.ldif | 2810 ++++
opends/src/server/org/opends/server/replication/server/DbHandler.java | 32
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/delete.ldif | 1
opends/src/server/org/opends/server/api/SubentryChangeListener.java | 147
opends/src/server/org/opends/server/tools/makeldif/Branch.java | 4
opends/tests/staf-tests/shared/ant/build.properties | 4
opends/src/messages/messages/extension.properties | 5
opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java | 41
opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java | 6
opends/tests/staf-tests/shared/staf/staf-slave.cfg | 5
opends/src/server/org/opends/server/types/Entry.java | 48
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify.ldif | 4
opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java | 10
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal.xml | 57
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_setup.xml | 188
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify.ldif | 4
opends/src/server/org/opends/server/core/SubentryPasswordPolicy.java | 946 +
opends/tests/staf-tests/functional-tests/testcases/dsml/dsml_setup.xml | 13
opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java | 22
opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java | 214
opends/src/server/org/opends/server/replication/server/DataServerHandler.java | 17
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_equaldn.xml | 518
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapdelete.xml | 257
opends/src/server/org/opends/server/replication/server/ReplicationServer.java | 15
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapmodify.xml | 253
opends/src/server/org/opends/server/backends/jeb/BackendImpl.java | 4
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/modify.ldif | 27
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml | 5483 ++++++++
opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java | 7
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapsearch.xml | 260
opends/src/server/org/opends/server/replication/server/ReplicationDB.java | 393
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clu_secure.xml | 90
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/moddn.ldif | 26
opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java | 187
opends/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java | 12
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_addsubjectdnattribute.ldif | 4
opends/src/server/org/opends/server/core/PasswordPolicyState.java | 62
opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java | 7
opends/src/server/org/opends/server/core/SchemaConfigManager.java | 30
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_fingerprint.xml | 573
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify2.ldif | 4
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl.xml | 60
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ldif | 75
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/delete.ldif | 1
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/add.ldif | 40
opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java | 269
opends/src/admin/defn/org/opends/server/admin/std/PasswordPolicySubentryVirtualAttributeConfiguration.xml | 70
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ldif | 37
opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java | 10
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_cleanup.xml | 139
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify2.ldif | 4
opends/tests/staf-tests/shared/tests/runTests.xml | 2
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_jks.xml | 210
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ref | 49
opends/src/admin/messages/PasswordPolicySubentryVirtualAttributeCfgDefn.properties | 19
opends/src/server/org/opends/server/config/ConfigConstants.java | 2
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectdn.xml | 464
opends/src/messages/messages/core.properties | 2
opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java | 10
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_start.ldif | 15012 ++++++++++++++++++++++++
opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java | 30
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ref | 76
opends/tests/staf-tests/shared/functions/webcontainer.xml | 9
opends/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java | 10
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls.xml | 60
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/modify.ldif | 27
opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml | 1082 +
opends/src/server/org/opends/server/util/ServerConstants.java | 18
opends/tests/staf-tests/shared/ant/tests.xml | 57
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ldif | 4
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_cleanup.xml | 85
opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch_tests.xml | 1191 +
opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_10m.xml | 11
opends/src/server/org/opends/server/core/PasswordPolicy.java | 46
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapdelete.xml | 264
opends/src/server/org/opends/server/replication/server/ServerHandler.java | 5
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapsearch.xml | 172
opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java | 16
opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_allowdelete.ldif | 4
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ldif | 36
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ref | 56
opends/resource/schema/01-pwpolicy.ldif | 2
opends/src/server/org/opends/server/extensions/DefaultEntryCache.java | 14
opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java | 6
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapcompare.xml | 219
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapmodify.xml | 249
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ref | 55
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_cleanup.xml | 90
opends/src/messages/messages/tools.properties | 4
opends/tests/staf-tests/shared/functions/utils.xml | 403
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/moddn.ldif | 27
opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java | 274
opends/src/server/org/opends/server/types/SubEntry.java | 2
opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_setup.xml | 93
opends/src/server/org/opends/server/core/DirectoryServer.java | 54
/dev/null | 463
opends/tests/staf-tests/shared/staf/staf-controller.cfg | 21
opends/tests/staf-tests/functional-tests/testcases/replication/replication.xml | 3
opends/tests/staf-tests/functional-tests/testcases/core/core.xml | 3
opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/moddn.ldif | 26
opends/tests/staf-tests/shared/tests/runTestJob.xml | 8
opends/src/server/org/opends/server/tools/EncodePassword.java | 18
124 files changed, 36,409 insertions(+), 950 deletions(-)
diff --git a/opends/resource/bin/stop-ds.bat b/opends/resource/bin/stop-ds.bat
index 43cd8a2..a51ac12 100644
--- a/opends/resource/bin/stop-ds.bat
+++ b/opends/resource/bin/stop-ds.bat
@@ -23,7 +23,7 @@
rem CDDL HEADER END
rem
rem
-rem Copyright 2006-2009 Sun Microsystems, Inc.
+rem Copyright 2006-2010 Sun Microsystems, Inc.
setlocal
@@ -74,12 +74,12 @@
if %errorlevel% == 103 goto stopAsWindowsService
if %errorlevel% == 104 goto restartAsWindowsService
rem An error or we display usage
-goto end
+goto writeLastLine
:serverAlreadyStopped
echo %SCRIPT%: server already stopped >> %LOG%
if exist "%INSTANCE_ROOT%\logs\server.pid" erase "%INSTANCE_ROOT%\logs\server.pid"
-goto end
+goto writeLastLine
:startUsingSystemCall
echo %SCRIPT%: start using system call >> %LOG%
@@ -90,7 +90,7 @@
set OPENDS_JAVA_HOME=%ORIGINAL_JAVA_HOME%
set OPENDS_JAVA_BIN=%ORIGINAL_JAVA_BIN%
"%INSTALL_ROOT%\bat\start-ds.bat"
-goto end
+goto writeLastLine
:stopUsingSystemCall
echo %SCRIPT%: stop using system call >> %LOG%
@@ -125,6 +125,8 @@
if exist "%INSTANCE_ROOT%\logs\winservice.out" erase "%INSTANCE_ROOT%\logs\winservice.out"
goto end
-:end
-
+:writeLastLine
echo %SCRIPT%: finished >> %LOG%
+goto end
+
+:end
diff --git a/opends/resource/config/config.ldif b/opends/resource/config/config.ldif
index 6dce13a..574a82d 100644
--- a/opends/resource/config/config.ldif
+++ b/opends/resource/config/config.ldif
@@ -2470,6 +2470,16 @@
ds-cfg-attribute-type: collectiveAttributeSubentries
ds-cfg-conflict-behavior: virtual-overrides-real
+dn: cn=Password Policy Subentry,cn=Virtual Attributes,cn=config
+objectClass: top
+objectClass: ds-cfg-virtual-attribute
+objectClass: ds-cfg-password-policy-subentry-virtual-attribute
+cn: Password Policy Subentry
+ds-cfg-java-class: org.opends.server.extensions.PasswordPolicySubentryVirtualAttributeProvider
+ds-cfg-enabled: true
+ds-cfg-attribute-type: pwdPolicySubentry
+ds-cfg-conflict-behavior: virtual-overrides-real
+
dn: cn=Work Queue,cn=config
objectClass: top
objectClass: ds-cfg-work-queue
diff --git a/opends/resource/schema/01-pwpolicy.ldif b/opends/resource/schema/01-pwpolicy.ldif
index 0642cbc..4ab93d7 100644
--- a/opends/resource/schema/01-pwpolicy.ldif
+++ b/opends/resource/schema/01-pwpolicy.ldif
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
#
-# Copyright 2006-2008 Sun Microsystems, Inc.
+# Copyright 2006-2010 Sun Microsystems, Inc.
#
#
# This file contains schema definitions from draft-behera-ldap-password-policy,
diff --git a/opends/resource/schema/02-config.ldif b/opends/resource/schema/02-config.ldif
index a35daf3..b584374 100644
--- a/opends/resource/schema/02-config.ldif
+++ b/opends/resource/schema/02-config.ldif
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
#
-# Copyright 2006-2009 Sun Microsystems, Inc.
+# Copyright 2006-2010 Sun Microsystems, Inc.
#
#
# This file contains the attribute type and objectclass definitions for use
@@ -4156,4 +4156,9 @@
SUP ds-cfg-virtual-attribute
STRUCTURAL
X-ORIGIN 'OpenDS Directory Server' )
+objectClasses: ( 1.3.6.1.4.1.26027.1.2.236
+ NAME 'ds-cfg-password-policy-subentry-virtual-attribute'
+ SUP ds-cfg-virtual-attribute
+ STRUCTURAL
+ X-ORIGIN 'OpenDS Directory Server' )
diff --git a/opends/src/admin/defn/org/opends/server/admin/std/PasswordPolicySubentryVirtualAttributeConfiguration.xml b/opends/src/admin/defn/org/opends/server/admin/std/PasswordPolicySubentryVirtualAttributeConfiguration.xml
new file mode 100644
index 0000000..cbae599
--- /dev/null
+++ b/opends/src/admin/defn/org/opends/server/admin/std/PasswordPolicySubentryVirtualAttributeConfiguration.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ! 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
+ !
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<adm:managed-object name="password-policy-subentry-virtual-attribute"
+ plural-name="password-policy-subentry-virtual-attributes"
+ package="org.opends.server.admin.std" extends="virtual-attribute"
+ xmlns:adm="http://www.opends.org/admin"
+ xmlns:ldap="http://www.opends.org/admin-ldap">
+ <adm:synopsis>
+ The
+ <adm:user-friendly-name />
+ generates a virtual attribute that points to the Password Policy
+ subentry in effect for the entry.
+ </adm:synopsis>
+ <adm:profile name="ldap">
+ <ldap:object-class>
+ <ldap:name>
+ ds-cfg-password-policy-subentry-virtual-attribute
+ </ldap:name>
+ <ldap:superior>ds-cfg-virtual-attribute</ldap:superior>
+ </ldap:object-class>
+ </adm:profile>
+ <adm:property-override name="java-class" advanced="true">
+ <adm:default-behavior>
+ <adm:defined>
+ <adm:value>
+ org.opends.server.extensions.PasswordPolicySubentryVirtualAttributeProvider
+ </adm:value>
+ </adm:defined>
+ </adm:default-behavior>
+ </adm:property-override>
+ <adm:property-override name="conflict-behavior" advanced="true">
+ <adm:default-behavior>
+ <adm:defined>
+ <adm:value>virtual-overrides-real</adm:value>
+ </adm:defined>
+ </adm:default-behavior>
+ </adm:property-override>
+ <adm:property-override name="attribute-type">
+ <adm:default-behavior>
+ <adm:defined>
+ <adm:value>pwdPolicySubentry</adm:value>
+ </adm:defined>
+ </adm:default-behavior>
+ </adm:property-override>
+</adm:managed-object>
diff --git a/opends/src/admin/messages/PasswordPolicySubentryVirtualAttributeCfgDefn.properties b/opends/src/admin/messages/PasswordPolicySubentryVirtualAttributeCfgDefn.properties
new file mode 100644
index 0000000..ecea477
--- /dev/null
+++ b/opends/src/admin/messages/PasswordPolicySubentryVirtualAttributeCfgDefn.properties
@@ -0,0 +1,19 @@
+user-friendly-name=Password Policy Subentry Virtual Attribute
+user-friendly-plural-name=Password Policy Subentry Virtual Attributes
+synopsis=The Password Policy Subentry Virtual Attribute generates a virtual attribute that points to the Password Policy subentry in effect for the entry.
+property.attribute-type.synopsis=Specifies the attribute type for the attribute whose values are to be dynamically assigned by the virtual attribute.
+property.base-dn.synopsis=Specifies the base DNs for the branches containing entries that are eligible to use this virtual attribute.
+property.base-dn.description=If no values are given, then the server generates virtual attributes anywhere in the server.
+property.base-dn.default-behavior.alias.synopsis=The location of the entry in the server is not taken into account when determining whether an entry is eligible to use this virtual attribute.
+property.conflict-behavior.synopsis=Specifies the behavior that the server is to exhibit for entries that already contain one or more real values for the associated attribute.
+property.conflict-behavior.syntax.enumeration.value.merge-real-and-virtual.synopsis=Indicates that the virtual attribute provider is to preserve any real values contained in the entry and merge them with the set of generated virtual values so that both the real and virtual values are used.
+property.conflict-behavior.syntax.enumeration.value.real-overrides-virtual.synopsis=Indicates that any real values contained in the entry are preserved and used, and virtual values are not generated.
+property.conflict-behavior.syntax.enumeration.value.virtual-overrides-real.synopsis=Indicates that the virtual attribute provider suppresses any real values contained in the entry and generates virtual values and uses them.
+property.enabled.synopsis=Indicates whether the Password Policy Subentry Virtual Attribute is enabled for use.
+property.filter.synopsis=Specifies the search filters to be applied against entries to determine if the virtual attribute is to be generated for those entries.
+property.filter.description=If no values are given, then any entry is eligible to have the value generated. If one or more filters are specified, then only entries that match at least one of those filters are allowed to have the virtual attribute.
+property.filter.syntax.string.pattern.synopsis=Any valid search filter string.
+property.group-dn.synopsis=Specifies the DNs of the groups whose members can be eligible to use this virtual attribute.
+property.group-dn.description=If no values are given, then group membership is not taken into account when generating the virtual attribute. If one or more group DNs are specified, then only members of those groups are allowed to have the virtual attribute.
+property.group-dn.default-behavior.alias.synopsis=Group membership is not taken into account when determining whether an entry is eligible to use this virtual attribute.
+property.java-class.synopsis=Specifies the fully-qualified name of the virtual attribute provider class that generates the attribute values.
diff --git a/opends/src/messages/messages/core.properties b/opends/src/messages/messages/core.properties
index 94a42ad..2cdf09d 100644
--- a/opends/src/messages/messages/core.properties
+++ b/opends/src/messages/messages/core.properties
@@ -1829,4 +1829,6 @@
subentry manager is not indexed in backend %s. Backend initialization \
for subentry manager processing might take a very long time to complete
INFO_RESULT_UNDEFINED_725=Undefined
+SEVERE_ERR_PWPOLICY_NO_PWDPOLICY_OC_726=The entry %s does not contain the \
+ pwdPolicy objectclass, which is required for Directory Server password policy
diff --git a/opends/src/messages/messages/extension.properties b/opends/src/messages/messages/extension.properties
index 9f200ea..8d31afb 100644
--- a/opends/src/messages/messages/extension.properties
+++ b/opends/src/messages/messages/extension.properties
@@ -20,7 +20,7 @@
#
# CDDL HEADER END
#
-# Copyright 2006-2008 Sun Microsystems, Inc.
+# Copyright 2006-2010 Sun Microsystems, Inc.
@@ -1425,3 +1425,6 @@
MILD_ERR_COLLECTIVEATTRIBUTESUBENTRIES_VATTR_NOT_SEARCHABLE_576=The %s \
attribute is not searchable and should not be included in otherwise \
unindexed search filters
+MILD_ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE_577=The %s \
+ attribute is not searchable and should not be included in otherwise \
+ unindexed search filters
diff --git a/opends/src/messages/messages/tools.properties b/opends/src/messages/messages/tools.properties
index 73ec8a3..7c894af 100644
--- a/opends/src/messages/messages/tools.properties
+++ b/opends/src/messages/messages/tools.properties
@@ -498,6 +498,10 @@
successfully
SEVERE_ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER_284=An error occurred while \
attempting to initialize the crypto manager: %s
+SEVERE_ERR_CANNOT_INITIALIZE_SUBENTRY_MANAGER_285=An error occurred while \
+ attempting to initialize the subentry manager: %s
+SEVERE_ERR_CANNOT_INITIALIZE_ROOTDN_MANAGER_286=An error occurred while \
+ attempting to initialize the root DN manager: %s
INFO_BACKUPDB_DESCRIPTION_INCREMENTAL_BASE_ID_287=Backup ID of the source \
archive for an incremental backup
SEVERE_ERR_BACKUPDB_INCREMENTAL_BASE_REQUIRES_INCREMENTAL_288=The use of the \
diff --git a/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java b/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
index 1cd30b0..532f7d8 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/installer/InstallerHelper.java
@@ -1205,7 +1205,12 @@
}
}
- private String getJavaArgPropertyForScript(String scriptName)
+ /**
+ * Returns the java argument property for a given script.
+ * @param scriptName the script name.
+ * @return the java argument property for a given script.
+ */
+ private static String getJavaArgPropertyForScript(String scriptName)
{
return scriptName+".java-args";
}
diff --git a/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java b/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java
index 4c73132..8801518 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/installer/ui/InstallReviewPanel.java
@@ -868,13 +868,13 @@
if (!defaultServer)
{
- linesToAdd.add(UserData.SERVER_SCRIPT_NAME+": "+
- serverArguments.getStringArguments());
+ linesToAdd.add(getJavaArgPropertyForScript(UserData.SERVER_SCRIPT_NAME)
+ +": "+serverArguments.getStringArguments());
}
if (!defaultImport)
{
- linesToAdd.add(UserData.IMPORT_SCRIPT_NAME+": "+
- importArguments.getStringArguments());
+ linesToAdd.add(getJavaArgPropertyForScript(UserData.IMPORT_SCRIPT_NAME)+
+ ": "+importArguments.getStringArguments());
}
if (linesToAdd.size() == 1)
@@ -896,11 +896,29 @@
return sb.toString();
}
+ /**
+ * Returns the java argument property for a given script.
+ * @param scriptName the script name.
+ * @return the java argument property for a given script.
+ */
+ private static String getJavaArgPropertyForScript(String scriptName)
+ {
+ return scriptName+".java-args";
+ }
+
private String getJavaPropertiesFilePath(UserData userData)
{
- String configDir = Utils.getPath(Utils
- .getInstancePathFromInstallPath(userData.getServerLocation()),
- Installation.CONFIG_PATH_RELATIVE);
+ String path;
+ if (isWebStart())
+ {
+ path = userData.getServerLocation();
+ }
+ else
+ {
+ path = Utils.getInstallPathFromClasspath();
+ path = Utils.getInstancePathFromInstallPath(path);
+ }
+ String configDir = Utils.getPath(path, Installation.CONFIG_PATH_RELATIVE);
String propertiesFile = Utils.getPath(
configDir, Installation.DEFAULT_JAVA_PROPERTIES_FILE);
return propertiesFile;
diff --git a/opends/src/server/org/opends/server/api/SubentryChangeListener.java b/opends/src/server/org/opends/server/api/SubentryChangeListener.java
new file mode 100644
index 0000000..4db0939
--- /dev/null
+++ b/opends/src/server/org/opends/server/api/SubentryChangeListener.java
@@ -0,0 +1,147 @@
+/*
+ * 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
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ */
+package org.opends.server.api;
+
+
+
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.Entry;
+
+
+
+/**
+ * This interface defines a mechanism that Directory Server components
+ * may use if they need to be notified of changes that are being made
+ * to subentries in the Directory Server.
+ * <BR><BR>
+ * Each change listener will be notified whenever an update is being
+ * made to subentry in the server, so the listener should use a very
+ * efficient mechanism for determining whether or not any action is
+ * required for the associated operation and quickly return for cases
+ * in which the update is not applicable.
+ * <BR><BR>
+ * The interface consists of two separate classes of methods. Check
+ * methods are invoked to verify that a specific operation performed
+ * on subentry is acceptable and if so the server may proceed with
+ * that operation further. Handle methods are invoked to notify that
+ * specific operation has occured on subentry thus serving purely as
+ * notification mechanism. While Check methods can affect the outcome
+ * of given operation Handle methods cannot affect the operation out-
+ * come in any way. Also note that Handle methods are invoked before
+ * any actual operation response to the client is sent.
+ * <BR><BR>
+ * This interface is intended for the server components that either
+ * require to track changes to subentries within the server or need
+ * to evaluate and take actions on specific changes being made to
+ * subentries within the server. Eg server components implementing
+ * their configuration objects as administrative subentries.
+ */
+@org.opends.server.types.PublicAPI(
+ stability=org.opends.server.types.StabilityLevel.VOLATILE,
+ mayInstantiate=false,
+ mayExtend=true,
+ mayInvoke=false)
+public interface SubentryChangeListener
+{
+ /**
+ * Performs any checking that may be required before
+ * subentry add operation.
+ * @param entry subentry being added to the server.
+ * @throws DirectoryException if operation is not
+ * acceptable for this subentry.
+ */
+ public void checkSubentryAddAcceptable(Entry entry)
+ throws DirectoryException;
+
+ /**
+ * Performs any checking that may be required before
+ * subentry delete operation.
+ * @param entry subentry being deleted in the server.
+ * @throws DirectoryException if operation is not
+ * acceptable for this subentry.
+ */
+ public void checkSubentryDeleteAcceptable(Entry entry)
+ throws DirectoryException;
+
+ /**
+ * Performs any checking that may be required before
+ * subentry modify operation.
+ * @param oldEntry subentry being modified in the server.
+ * @param newEntry subentry with modifications applied.
+ * @throws DirectoryException if operation is not
+ * acceptable for this subentry.
+ */
+ public void checkSubentryModifyAcceptable(Entry oldEntry,
+ Entry newEntry) throws DirectoryException;
+
+ /**
+ * Performs any checking that may be required before
+ * subentry modify DN operation.
+ * @param oldEntry subentry being modified in the server.
+ * @param newEntry subentry with modifications applied.
+ * @throws DirectoryException if operation is not
+ * acceptable for this subentry.
+ */
+ public void checkSubentryModifyDNAcceptable(Entry oldEntry,
+ Entry newEntry) throws DirectoryException;
+
+ /**
+ * Performs any processing that may be required after a
+ * subentry add operation.
+ *
+ * @param entry The subentry that was added to the
+ * server.
+ */
+ public void handleSubentryAdd(Entry entry);
+
+ /**
+ * Performs any processing that may be required after a
+ * subentry delete operation.
+ *
+ * @param entry The subentry that was removed from the
+ * server.
+ */
+ public void handleSubentryDelete(Entry entry);
+
+ /**
+ * Performs any processing that may be required after a
+ * subentry modify operation.
+ *
+ * @param oldEntry The subentry before it was updated.
+ * @param newEntry The subentry after it was updated.
+ */
+ public void handleSubentryModify(Entry oldEntry, Entry newEntry);
+
+ /**
+ * Performs any processing that may be required after a
+ * subentry modify DN operation.
+ *
+ * @param oldEntry The subentry before it was updated.
+ * @param newEntry The subentry after it was updated.
+ */
+ public void handleSubentryModifyDN(Entry oldEntry, Entry newEntry);
+}
diff --git a/opends/src/server/org/opends/server/authorization/dseecompat/AciHandler.java b/opends/src/server/org/opends/server/authorization/dseecompat/AciHandler.java
index b3a0e96..f2130db 100644
--- a/opends/src/server/org/opends/server/authorization/dseecompat/AciHandler.java
+++ b/opends/src/server/org/opends/server/authorization/dseecompat/AciHandler.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008-2009 Sun Microsystems, Inc.
+ * Copyright 2008-2010 Sun Microsystems, Inc.
*/
package org.opends.server.authorization.dseecompat;
@@ -1556,17 +1556,8 @@
}
case NOT:
{
- ret = false;
SearchFilter f = filter.getNotComponent();
- if (f.matchesEntry(container.getResourceEntry()))
- {
- ret = true;
- }
- if (ret)
- {
- ret = testFilter(container, f);
- }
- ret = !ret;
+ ret = testFilter(container, f);
break;
}
default:
diff --git a/opends/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java b/opends/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java
index 7fa1a0c..7b2939e 100644
--- a/opends/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/ApproximateIndexer.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
@@ -160,6 +160,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
@@ -196,6 +200,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
diff --git a/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index d3328ca..6ef7ed0 100644
--- a/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2007-2009 Sun Microsystems, Inc.
+ * Copyright 2007-2010 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
import org.opends.messages.Message;
@@ -42,7 +42,6 @@
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.EnvironmentFailureException;
-import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import org.opends.server.backends.jeb.importLDIF.*;
import org.opends.server.admin.std.meta.LocalDBIndexCfgDefn;
@@ -314,7 +313,6 @@
{
EnvironmentConfig envConfig =
ConfigurableEnvironment.parseConfigEntry(cfg);
- envConfig.setLockTimeout(0, TimeUnit.MICROSECONDS);
rootContainer = initializeRootContainer(envConfig);
}
diff --git a/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java b/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java
index 1a0d11a..6944227 100644
--- a/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java
+++ b/opends/src/server/org/opends/server/backends/jeb/ConfigurableEnvironment.java
@@ -43,6 +43,7 @@
import java.util.StringTokenizer;
import java.util.List;
import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -435,6 +436,11 @@
.valueOf(4 * 1024));
}
+ // Disable lock timeouts, meaning that no lock wait
+ // timelimit is enforced and a deadlocked operation
+ // will block indefinitely.
+ envConfig.setLockTimeout(0, TimeUnit.MICROSECONDS);
+
return envConfig;
}
diff --git a/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java b/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
index 38a2abb..74d2bfa 100644
--- a/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
@@ -168,6 +168,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
@@ -203,6 +207,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
diff --git a/opends/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java b/opends/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
index 35ca4e7..701d5bd 100644
--- a/opends/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/JEExtensibleIndexer.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2009 Sun Microsystems, Inc.
+ * Copyright 2009-2010 Sun Microsystems, Inc.
*/
@@ -180,6 +180,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
extensibleIndexer.getKeys(value, keys);
@@ -205,10 +209,14 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
extensibleIndexer.getKeys(value,modifiedKeys,insert);
}
}
}
-}
\ No newline at end of file
+}
diff --git a/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java b/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
index bb75ca9..1619441 100644
--- a/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
@@ -165,6 +165,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
@@ -202,6 +206,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
diff --git a/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java b/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
index b032de3..bcc55e0 100644
--- a/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
+++ b/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.backends.jeb;
@@ -164,6 +164,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
@@ -241,6 +245,10 @@
for (Attribute attr : attrList)
{
+ if (attr.isVirtual())
+ {
+ continue;
+ }
for (AttributeValue value : attr)
{
try
diff --git a/opends/src/server/org/opends/server/config/ConfigConstants.java b/opends/src/server/org/opends/server/config/ConfigConstants.java
index dded712..392e068 100644
--- a/opends/src/server/org/opends/server/config/ConfigConstants.java
+++ b/opends/src/server/org/opends/server/config/ConfigConstants.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009ds Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.config;
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index 3f3659d..c697851 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.core;
@@ -1424,11 +1424,7 @@
// Initialize the subentry manager.
- subentryManager = new SubentryManager();
- // The configuration backend has already been registered at this point
- // so we need to handle it explicitly.
- subentryManager.performBackendInitializationProcessing(configHandler);
-
+ initializeSubentryManager();
// Initialize the group manager.
initializeGroupManager();
@@ -2867,6 +2863,41 @@
/**
+ * Initializes the subentry manager for the Directory Server.
+ * Note that the subentry manager initialization should be
+ * done before any dependent components initialization and
+ * before bringing any backends online. Configuration backend
+ * is a special case and therefore is exception to this rule.
+ *
+ * @throws InitializationException If a problem occurs while
+ * initializing the subentry
+ * manager.
+ */
+ public void initializeSubentryManager()
+ throws InitializationException
+ {
+ try
+ {
+ subentryManager = new SubentryManager();
+ // The configuration backend should already be registered
+ // at this point so we need to handle it explicitly here.
+ subentryManager.performBackendInitializationProcessing(
+ configHandler);
+ }
+ catch (DirectoryException de)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+
+ throw new InitializationException(de.getMessageObject());
+ }
+ }
+
+
+
+ /**
* Initializes the set of password policy components for use by the Directory
* Server.
*
@@ -8291,6 +8322,12 @@
DirectoryServer.deregisterPasswordPolicy(configEntryDN);
}
+ // Finalize password policies and their config manager.
+ if (directoryServer.passwordPolicyConfigManager != null)
+ {
+ directoryServer.passwordPolicyConfigManager.finalizePasswordPolicies();
+ }
+
// Finalize the access control handler
AccessControlHandler accessControlHandler =
AccessControlConfigManager.getInstance().getAccessControlHandler();
@@ -8305,6 +8342,11 @@
directoryServer.groupManager.finalizeGroupManager();
}
+ // Finalize the subentry manager.
+ if (directoryServer.subentryManager != null)
+ {
+ directoryServer.subentryManager.finalizeSubentryManager();
+ }
// Shut down all the other components that may need special handling.
// NYI
diff --git a/opends/src/server/org/opends/server/core/PasswordPolicy.java b/opends/src/server/org/opends/server/core/PasswordPolicy.java
index 9cbd63c..aa4f303 100644
--- a/opends/src/server/org/opends/server/core/PasswordPolicy.java
+++ b/opends/src/server/org/opends/server/core/PasswordPolicy.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.core;
@@ -36,6 +36,7 @@
import java.util.LinkedList;
import java.util.SortedSet;
import java.util.TimeZone;
+import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -154,11 +155,17 @@
if (defaultScheme != null) defaultStorageSchemes.add(defaultScheme);
}
+ // DNs of password storage schemes for this password policy.
+ private SortedSet<DN> storageSchemeDNs = new TreeSet<DN>();
+
// The names of the deprecated password storage schemes for this password
// policy.
private CopyOnWriteArraySet<String> deprecatedStorageSchemes =
new CopyOnWriteArraySet<String>();
+ // DNs of deprecated password storage schemes for this password policy.
+ private SortedSet<DN> deprecatedStorageSchemeDNs = new TreeSet<DN>();
+
// The DN of the password validator for this password policy.
private DN passwordGeneratorDN = null;
@@ -285,7 +292,7 @@
// Get the default storage schemes. They must all reference valid storage
// schemes that support the syntax for the specified password attribute.
- SortedSet<DN> storageSchemeDNs =
+ storageSchemeDNs =
configuration.getDefaultPasswordStorageSchemeDNs();
try
{
@@ -329,7 +336,7 @@
// Get the names of the deprecated storage schemes.
- SortedSet<DN> deprecatedStorageSchemeDNs =
+ deprecatedStorageSchemeDNs =
configuration.getDeprecatedPasswordStorageSchemeDNs();
try
{
@@ -750,6 +757,21 @@
/**
+ * Retrieves the default set of password storage scheme DNs that will
+ * be used for this password policy. The returned set should not be
+ * modified by the caller.
+ *
+ * @return The default set of password storage scheme DNs that will
+ * be used for this password policy.
+ */
+ public SortedSet<DN> getDefaultStorageSchemeDNs()
+ {
+ return storageSchemeDNs;
+ }
+
+
+
+ /**
* Indicates whether the specified storage scheme is a default scheme for this
* password policy.
*
@@ -810,6 +832,24 @@
/**
+ * Retrieves DNs of the password storage schemes that have been
+ * deprecated. If an authenticating user has one or more of
+ * these deprecated storage schemes in use in their entry, then
+ * they will be removed and replaced with the passwords encoded
+ * in the default storage scheme(s). The returned set should
+ * not be altered by the caller.
+ *
+ * @return DNs of the password storage schemes that have been
+ * deprecated.
+ */
+ public SortedSet<DN> getDeprecatedStorageSchemeDNs()
+ {
+ return deprecatedStorageSchemeDNs;
+ }
+
+
+
+ /**
* Indicates whether the specified storage scheme is deprecated.
*
* @param name The name of the password storage scheme for which to make the
diff --git a/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java b/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
index 5eaf4a0..baa7cfc 100644
--- a/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
+++ b/opends/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.core;
import org.opends.messages.Message;
@@ -37,15 +37,20 @@
import org.opends.server.admin.server.ServerManagementContext;
import org.opends.server.admin.std.server.PasswordPolicyCfg;
import org.opends.server.admin.std.server.RootCfg;
+import org.opends.server.api.SubentryChangeListener;
import org.opends.server.config.ConfigException;
+import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import org.opends.server.types.ResultCode;
+import org.opends.server.types.SubEntry;
import static org.opends.messages.ConfigMessages.*;
-
import static org.opends.server.util.StaticUtils.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
@@ -56,9 +61,14 @@
* the server is running.
*/
public class PasswordPolicyConfigManager
- implements ConfigurationAddListener<PasswordPolicyCfg>,
+ implements SubentryChangeListener,
+ ConfigurationAddListener<PasswordPolicyCfg>,
ConfigurationDeleteListener<PasswordPolicyCfg>
{
+ /**
+ * The tracer object for the debug logger.
+ */
+ private static final DebugTracer TRACER = getTracer();
@@ -72,6 +82,39 @@
/**
+ * Creates a password policy configuration object
+ * from password policy subentry.
+ * @param subEntry password policy subentry.
+ * @return password policy configuration.
+ * @throws InitializationException if an error
+ * occurs while parsing subentry into
+ * password policy configuration.
+ */
+ private PasswordPolicyConfig createPasswordPolicyConfig(
+ SubEntry subEntry) throws InitializationException
+ {
+ try
+ {
+ SubentryPasswordPolicy subentryPolicy =
+ new SubentryPasswordPolicy(subEntry);
+ PasswordPolicy passwordPolicy =
+ new PasswordPolicy(subentryPolicy);
+ PasswordPolicyConfig config =
+ new PasswordPolicyConfig(passwordPolicy);
+ return config;
+ }
+ catch (Exception e)
+ {
+ Message message = ERR_CONFIG_PWPOLICY_INVALID_POLICY_CONFIG.
+ get(String.valueOf(subEntry.getDN()),
+ stackTraceToSingleLineString(e));
+ throw new InitializationException(message, e);
+ }
+ }
+
+
+
+ /**
* Initializes all password policies currently defined in the Directory
* Server configuration. This should only be called at Directory Server
* startup.
@@ -163,6 +206,39 @@
String.valueOf(defaultPolicyDN));
throw new ConfigException(message);
}
+
+ // Process and register any password policy subentries.
+ List<SubEntry> pwpSubEntries =
+ DirectoryServer.getSubentryManager().getSubentries();
+ if ((pwpSubEntries != null) && (!pwpSubEntries.isEmpty()))
+ {
+ for (SubEntry subentry : pwpSubEntries)
+ {
+ if (subentry.getEntry().isPasswordPolicySubentry())
+ {
+ PasswordPolicyConfig config =
+ createPasswordPolicyConfig(subentry);
+ DirectoryServer.registerPasswordPolicy(
+ subentry.getDN(), config);
+ }
+ }
+ }
+
+ // Register this as subentry change listener with SubentryManager.
+ DirectoryServer.getSubentryManager().registerChangeListener(this);
+ }
+
+
+
+ /**
+ * Perform any required finalization tasks for all password policies
+ * currently defined. This should only be called at Directory Server
+ * shutdown.
+ */
+ public void finalizePasswordPolicies()
+ {
+ // Deregister this as subentry change listener with SubentryManager.
+ DirectoryServer.getSubentryManager().deregisterChangeListener(this);
}
@@ -323,4 +399,191 @@
return new ConfigChangeResult(ResultCode.SUCCESS, false, messages);
}
+
+
+
+ /**
+ * Attempts to parse an entry as password policy
+ * subentry to create a password policy object.
+ * @param entry subentry to parse.
+ * @throws DirectoryException if a problem occurs
+ * while creating a password policy from
+ * given subentry.
+ */
+ private void checkSubentryAcceptable(Entry entry)
+ throws DirectoryException
+ {
+ SubEntry subentry = new SubEntry(entry);
+ SubentryPasswordPolicy subentryPolicy =
+ new SubentryPasswordPolicy(subentry);
+ try
+ {
+ new PasswordPolicy(subentryPolicy);
+ }
+ catch (ConfigException ex)
+ {
+ throw new DirectoryException(
+ ResultCode.UNWILLING_TO_PERFORM,
+ ex.getMessageObject());
+ }
+ catch (InitializationException ex)
+ {
+ throw new DirectoryException(
+ ResultCode.UNWILLING_TO_PERFORM,
+ ex.getMessageObject());
+ }
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void checkSubentryAddAcceptable(Entry entry)
+ throws DirectoryException
+ {
+ if (entry.isPasswordPolicySubentry())
+ {
+ checkSubentryAcceptable(entry);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void checkSubentryDeleteAcceptable(Entry entry)
+ throws DirectoryException
+ {
+ // FIXME: something like a referential integrity check is needed to
+ // ensure a policy is not removed when referenced by a user entry (
+ // either directly or via a virtual attribute).
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void checkSubentryModifyAcceptable(Entry oldEntry, Entry newEntry)
+ throws DirectoryException
+ {
+ if (newEntry.isPasswordPolicySubentry())
+ {
+ checkSubentryAcceptable(newEntry);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void checkSubentryModifyDNAcceptable(Entry oldEntry, Entry newEntry)
+ throws DirectoryException
+ {
+ // FIXME: something like a referential integrity check is needed to
+ // ensure a policy is not removed when referenced by a user entry (
+ // either directly or via a virtual attribute).
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void handleSubentryAdd(Entry entry)
+ {
+ if (entry.isPasswordPolicySubentry())
+ {
+ try
+ {
+ SubEntry subentry = new SubEntry(entry);
+ PasswordPolicyConfig config =
+ createPasswordPolicyConfig(subentry);
+ DirectoryServer.registerPasswordPolicy(
+ subentry.getDN(), config);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugError("Could not create password policy subentry "
+ + "DN %s: %s",
+ entry.getDN().toString(),
+ stackTraceToSingleLineString(e));
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void handleSubentryDelete(Entry entry)
+ {
+ if (entry.isPasswordPolicySubentry())
+ {
+ DirectoryServer.deregisterPasswordPolicy(entry.getDN());
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void handleSubentryModify(Entry oldEntry, Entry newEntry)
+ {
+ if (oldEntry.isPasswordPolicySubentry())
+ {
+ DirectoryServer.deregisterPasswordPolicy(oldEntry.getDN());
+ }
+
+ if (newEntry.isPasswordPolicySubentry())
+ {
+ try
+ {
+ SubEntry subentry = new SubEntry(newEntry);
+ PasswordPolicyConfig config =
+ createPasswordPolicyConfig(subentry);
+ DirectoryServer.registerPasswordPolicy(
+ subentry.getDN(), config);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugError("Could not create password policy subentry "
+ + "DN %s: %s",
+ newEntry.getDN().toString(),
+ stackTraceToSingleLineString(e));
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void handleSubentryModifyDN(Entry oldEntry, Entry newEntry)
+ {
+ if (oldEntry.isPasswordPolicySubentry())
+ {
+ DirectoryServer.deregisterPasswordPolicy(oldEntry.getDN());
+ }
+
+ if (newEntry.isPasswordPolicySubentry())
+ {
+ try
+ {
+ SubEntry subentry = new SubEntry(newEntry);
+ PasswordPolicyConfig config =
+ createPasswordPolicyConfig(subentry);
+ DirectoryServer.registerPasswordPolicy(
+ subentry.getDN(), config);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugError("Could not create password policy subentry "
+ + "DN %s: %s",
+ newEntry.getDN().toString(),
+ stackTraceToSingleLineString(e));
+ }
+ }
+ }
+ }
}
diff --git a/opends/src/server/org/opends/server/core/PasswordPolicyState.java b/opends/src/server/org/opends/server/core/PasswordPolicyState.java
index b8a9c9c..f66e2ee 100644
--- a/opends/src/server/org/opends/server/core/PasswordPolicyState.java
+++ b/opends/src/server/org/opends/server/core/PasswordPolicyState.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.core;
@@ -210,8 +210,8 @@
this.currentTime = currentTime;
userDNString = userEntry.getDN().toString();
- passwordPolicy = getPasswordPolicyInternal(this.userEntry,
- useDefaultOnError);
+ passwordPolicy = getPasswordPolicy(this.userEntry,
+ useDefaultOnError);
// Get the password changed time for the user.
AttributeType type
@@ -253,8 +253,9 @@
/**
* Retrieves the password policy for the user. If the user entry contains the
* ds-pwp-password-policy-dn attribute (whether real or virtual), that
- * password policy is returned, otherwise the default password policy is
- * returned.
+ * password policy is returned, otherwise applicable to the user entry
+ * subentry password policy is returned, if any, otherwise the default
+ * password policy is returned.
*
* @param userEntry The user entry.
* @param useDefaultOnError Indicates whether the server should fall back to
@@ -266,15 +267,15 @@
* @throws DirectoryException If a problem occurs while attempting to
* determine the password policy for the user.
*/
- private static PasswordPolicy getPasswordPolicyInternal(Entry userEntry,
+ public static PasswordPolicy getPasswordPolicy(Entry userEntry,
boolean useDefaultOnError)
throws DirectoryException
{
String userDNString = userEntry.getDN().toString();
- AttributeType type =
- DirectoryServer.getAttributeType(OP_ATTR_PWPOLICY_POLICY_DN, true);
-
+ AttributeType type = DirectoryServer.getAttributeType(
+ OP_ATTR_PWPOLICY_POLICY_DN, true);
List<Attribute> attrList = userEntry.getAttribute(type);
+
if (attrList != null)
{
for (Attribute a : attrList)
@@ -350,6 +351,49 @@
}
}
+ // No attribute defined password policy: try locating and using the
+ // closest to this entry password policy subentry defined, if any.
+ List<SubEntry> pwpSubEntries =
+ DirectoryServer.getSubentryManager().getSubentries(userEntry);
+ if ((pwpSubEntries != null) && (!pwpSubEntries.isEmpty()))
+ {
+ for (SubEntry subentry : pwpSubEntries)
+ {
+ try
+ {
+ if (subentry.getEntry().isPasswordPolicySubentry())
+ {
+ PasswordPolicy policy = DirectoryServer.getPasswordPolicy(
+ subentry.getDN());
+ if (policy == null)
+ {
+ // This shouldnt happen but if it does debug log
+ // this problem and fall back to default policy.
+ if (debugEnabled())
+ {
+ TRACER.debugError(
+ "Found unknown password policy subentry "
+ + "DN %s for user %s",
+ subentry.getDN().toString(), userDNString);
+ }
+ break;
+ }
+ return policy;
+ }
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugError("Could not parse password policy subentry "
+ + "DN %s for user %s: %s",
+ subentry.getDN().toString(), userDNString,
+ stackTraceToSingleLineString(e));
+ }
+ }
+ }
+ }
+
// There is no policy subentry defined: use the default.
if (debugEnabled())
{
diff --git a/opends/src/server/org/opends/server/core/SchemaConfigManager.java b/opends/src/server/org/opends/server/core/SchemaConfigManager.java
index 186a1bd..82dac13 100644
--- a/opends/src/server/org/opends/server/core/SchemaConfigManager.java
+++ b/opends/src/server/org/opends/server/core/SchemaConfigManager.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.core;
import org.opends.messages.Message;
@@ -30,6 +30,7 @@
import java.io.File;
+import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
@@ -187,6 +188,26 @@
/**
+ * Filter implementation that accepts only ldif files.
+ */
+ private class SchemaFileFilter implements FilenameFilter
+ {
+ /**
+ * {@inheritDoc}
+ */
+ public boolean accept(File directory, String filename)
+ {
+ if (filename.endsWith(".ldif"))
+ {
+ return true;
+ }
+ return false;
+ }
+ }
+
+
+
+ /**
* Initializes all the attribute type, object class, name form, DIT content
* rule, DIT structure rule, and matching rule use definitions by reading the
* server schema files. These files will be located in a single directory and
@@ -253,12 +274,15 @@
schemaInstanceDir = null;
}
- File[] schemaInstallDirFiles = schemaInstallDir.listFiles() ;
+ FilenameFilter filter = new SchemaFileFilter();
+ File[] schemaInstallDirFiles =
+ schemaInstallDir.listFiles(filter);
int fileNumber = schemaInstallDirFiles.length;
File[] schemaInstanceDirFiles = null ;
if (schemaInstanceDir != null)
{
- schemaInstanceDirFiles = schemaInstanceDir.listFiles();
+ schemaInstanceDirFiles =
+ schemaInstanceDir.listFiles(filter);
fileNumber =+ schemaInstanceDirFiles.length ;
}
diff --git a/opends/src/server/org/opends/server/core/SubentryManager.java b/opends/src/server/org/opends/server/core/SubentryManager.java
index 008abcf..348d921 100644
--- a/opends/src/server/org/opends/server/core/SubentryManager.java
+++ b/opends/src/server/org/opends/server/core/SubentryManager.java
@@ -22,18 +22,24 @@
* CDDL HEADER END
*
*
- * Copyright 2009 Sun Microsystems, Inc.
+ * Copyright 2009-2010 Sun Microsystems, Inc.
*/
package org.opends.server.core;
import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.opends.server.api.Backend;
import org.opends.server.api.BackendInitializationListener;
-import org.opends.server.api.ChangeNotificationListener;
+import org.opends.server.api.SubentryChangeListener;
+import org.opends.server.api.plugin.InternalDirectoryServerPlugin;
+import org.opends.server.api.plugin.PluginResult;
+import org.opends.server.api.plugin.PluginResult.PostOperation;
+import org.opends.server.api.plugin.PluginResult.PreOperation;
+import org.opends.server.api.plugin.PluginType;
import org.opends.server.controls.SubentriesControl;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.protocols.internal.InternalClientConnection;
@@ -48,10 +54,14 @@
import org.opends.server.types.SearchScope;
import org.opends.server.types.SearchFilter;
import org.opends.server.types.SubEntry;
-import org.opends.server.types.operation.PostResponseAddOperation;
-import org.opends.server.types.operation.PostResponseDeleteOperation;
-import org.opends.server.types.operation.PostResponseModifyOperation;
-import org.opends.server.types.operation.PostResponseModifyDNOperation;
+import org.opends.server.types.operation.PostOperationAddOperation;
+import org.opends.server.types.operation.PostOperationDeleteOperation;
+import org.opends.server.types.operation.PostOperationModifyDNOperation;
+import org.opends.server.types.operation.PostOperationModifyOperation;
+import org.opends.server.types.operation.PreOperationAddOperation;
+import org.opends.server.types.operation.PreOperationDeleteOperation;
+import org.opends.server.types.operation.PreOperationModifyDNOperation;
+import org.opends.server.types.operation.PreOperationModifyOperation;
import org.opends.server.workflowelement.localbackend.
LocalBackendSearchOperation;
@@ -73,8 +83,8 @@
* memory. If it is determined that this approach is not workable
* in all cases, then we will need an alternate strategy.
*/
-public class SubentryManager
- implements BackendInitializationListener, ChangeNotificationListener
+public class SubentryManager extends InternalDirectoryServerPlugin
+ implements BackendInitializationListener
{
/**
* The tracer object for the debug logger.
@@ -93,22 +103,87 @@
// Lock to protect internal data structures.
private final ReentrantReadWriteLock lock;
+ // The set of change notification listeners.
+ private CopyOnWriteArrayList<SubentryChangeListener>
+ changeListeners;
+
+ // Dummy configuration DN for Subentry Manager.
+ private static final String CONFIG_DN = "cn=Subentry Manager,cn=config";
+
/**
- * Creates a new instance of this group manager.
+ * Creates a new instance of this subentry manager.
+ *
+ * @throws DirectoryException If a problem occurs while
+ * creating an instance of
+ * the subentry manager.
*/
- public SubentryManager()
+ public SubentryManager() throws DirectoryException
{
+ super(DN.decode(CONFIG_DN), EnumSet.of(
+ PluginType.PRE_OPERATION_ADD,
+ PluginType.PRE_OPERATION_DELETE,
+ PluginType.PRE_OPERATION_MODIFY,
+ PluginType.PRE_OPERATION_MODIFY_DN,
+ PluginType.POST_OPERATION_ADD,
+ PluginType.POST_OPERATION_DELETE,
+ PluginType.POST_OPERATION_MODIFY,
+ PluginType.POST_OPERATION_MODIFY_DN),
+ true);
+
lock = new ReentrantReadWriteLock();
dn2SubEntry = new HashMap<DN,List<SubEntry>>();
dn2CollectiveSubEntry = new HashMap<DN,List<SubEntry>>();
- requestAttrs = new LinkedHashSet<String>();
- requestAttrs.add("subtreespecification");
- requestAttrs.add("*");
+ changeListeners =
+ new CopyOnWriteArrayList<SubentryChangeListener>();
+ requestAttrs = new LinkedHashSet<String>();
+ requestAttrs.add("*");
+ requestAttrs.add("+");
+
+ DirectoryServer.registerInternalPlugin(this);
DirectoryServer.registerBackendInitializationListener(this);
- DirectoryServer.registerChangeNotificationListener(this);
+ }
+
+ /**
+ * Perform any required finalization tasks for Subentry Manager.
+ * This should only be called at Directory Server shutdown.
+ */
+ public void finalizeSubentryManager()
+ {
+ // Deregister as internal plugin and
+ // backend initialization listener.
+ DirectoryServer.deregisterInternalPlugin(this);
+ DirectoryServer.deregisterBackendInitializationListener(this);
+ }
+
+ /**
+ * Registers the provided change notification listener with this manager
+ * so that it will be notified of any add, delete, modify, or modify DN
+ * operations that are performed.
+ *
+ * @param changeListener The change notification listener to register
+ * with this manager.
+ */
+ public void registerChangeListener(
+ SubentryChangeListener changeListener)
+ {
+ changeListeners.add(changeListener);
+ }
+
+ /**
+ * Deregisters the provided change notification listener with this manager
+ * so that it will no longer be notified of any add, delete, modify, or
+ * modify DN operations that are performed.
+ *
+ * @param changeListener The change notification listener to deregister
+ * with this manager.
+ */
+ public void deregisterChangeListener(
+ SubentryChangeListener changeListener)
+ {
+ changeListeners.remove(changeListener);
}
/**
@@ -163,45 +238,51 @@
try
{
boolean removed = false;
- Iterator<Map.Entry<DN, List<SubEntry>>> iterator =
+ Iterator<Map.Entry<DN, List<SubEntry>>> setIterator =
dn2SubEntry.entrySet().iterator();
- while (iterator.hasNext())
+ while (setIterator.hasNext())
{
- Map.Entry<DN, List<SubEntry>> mapEntry = iterator.next();
+ Map.Entry<DN, List<SubEntry>> mapEntry = setIterator.next();
List<SubEntry> subList = mapEntry.getValue();
- for (SubEntry subEntry : subList)
+ Iterator<SubEntry> listIterator = subList.iterator();
+ while (listIterator.hasNext())
{
+ SubEntry subEntry = listIterator.next();
if (subEntry.getDN().equals(entry.getDN()))
{
- removed = subList.remove(subEntry);
+ listIterator.remove();
+ removed = true;
break;
}
}
if (subList.isEmpty())
{
- iterator.remove();
+ setIterator.remove();
}
if (removed)
{
return;
}
}
- iterator = dn2CollectiveSubEntry.entrySet().iterator();
- while (iterator.hasNext())
+ setIterator = dn2CollectiveSubEntry.entrySet().iterator();
+ while (setIterator.hasNext())
{
- Map.Entry<DN, List<SubEntry>> mapEntry = iterator.next();
+ Map.Entry<DN, List<SubEntry>> mapEntry = setIterator.next();
List<SubEntry> subList = mapEntry.getValue();
- for (SubEntry subEntry : subList)
+ Iterator<SubEntry> listIterator = subList.iterator();
+ while (listIterator.hasNext())
{
+ SubEntry subEntry = listIterator.next();
if (subEntry.getDN().equals(entry.getDN()))
{
- removed = subList.remove(subEntry);
+ listIterator.remove();
+ removed = true;
break;
}
}
if (subList.isEmpty())
{
- iterator.remove();
+ setIterator.remove();
}
if (removed)
{
@@ -230,8 +311,10 @@
SearchFilter filter = null;
try
{
- filter = SearchFilter.createFilterFromString("(" +
- ATTR_OBJECTCLASS + "=" + OC_SUBENTRY + ")");
+ filter = SearchFilter.createFilterFromString("(|" +
+ "(" + ATTR_OBJECTCLASS + "=" + OC_SUBENTRY + ")" +
+ "(" + ATTR_OBJECTCLASS + "=" + OC_LDAP_SUBENTRY + ")" +
+ ")");
if (backend.getEntryCount() > 0 && ! backend.isIndexed(filter))
{
logError(WARN_SUBENTRY_FILTER_NOT_INDEXED.get(
@@ -292,7 +375,7 @@
for (SearchResultEntry entry : internalSearch.getSearchEntries())
{
- if (entry.isSubentry())
+ if (entry.isSubentry() || entry.isLDAPSubentry())
{
try
{
@@ -314,6 +397,37 @@
}
/**
+ * Return all subentries for this manager.
+ * Note that this getter will skip any collective subentries,
+ * returning only applicable regular subentries.
+ * @return all subentries for this manager.
+ */
+ public List<SubEntry> getSubentries()
+ {
+ if (dn2SubEntry.isEmpty())
+ {
+ return Collections.emptyList();
+ }
+
+ List<SubEntry> subentries = new ArrayList<SubEntry>();
+
+ lock.readLock().lock();
+ try
+ {
+ for (List<SubEntry> subList : dn2SubEntry.values())
+ {
+ subentries.addAll(subList);
+ }
+ }
+ finally
+ {
+ lock.readLock().unlock();
+ }
+
+ return subentries;
+ }
+
+ /**
* Return subentries applicable to specific DN.
* Note that this getter will skip any collective subentries,
* returning only applicable regular subentries.
@@ -506,39 +620,43 @@
lock.writeLock().lock();
try
{
- Iterator<Map.Entry<DN, List<SubEntry>>> iterator =
+ Iterator<Map.Entry<DN, List<SubEntry>>> setIterator =
dn2SubEntry.entrySet().iterator();
- while (iterator.hasNext())
+ while (setIterator.hasNext())
{
- Map.Entry<DN, List<SubEntry>> mapEntry = iterator.next();
+ Map.Entry<DN, List<SubEntry>> mapEntry = setIterator.next();
List<SubEntry> subList = mapEntry.getValue();
- for (SubEntry subEntry : subList)
+ Iterator<SubEntry> listIterator = subList.iterator();
+ while (listIterator.hasNext())
{
+ SubEntry subEntry = listIterator.next();
if (backend.handlesEntry(subEntry.getDN()))
{
- subList.remove(subEntry);
+ listIterator.remove();
}
}
if (subList.isEmpty())
{
- iterator.remove();
+ setIterator.remove();
}
}
- iterator = dn2CollectiveSubEntry.entrySet().iterator();
- while (iterator.hasNext())
+ setIterator = dn2CollectiveSubEntry.entrySet().iterator();
+ while (setIterator.hasNext())
{
- Map.Entry<DN, List<SubEntry>> mapEntry = iterator.next();
+ Map.Entry<DN, List<SubEntry>> mapEntry = setIterator.next();
List<SubEntry> subList = mapEntry.getValue();
- for (SubEntry subEntry : subList)
+ Iterator<SubEntry> listIterator = subList.iterator();
+ while (listIterator.hasNext())
{
+ SubEntry subEntry = listIterator.next();
if (backend.handlesEntry(subEntry.getDN()))
{
- subList.remove(subEntry);
+ listIterator.remove();
}
}
if (subList.isEmpty())
{
- iterator.remove();
+ setIterator.remove();
}
}
}
@@ -549,17 +667,177 @@
}
/**
- * {@inheritDoc} In this case, each entry is checked to see if it is
- * a subentry, and if so it will be registered with this manager.
+ * {@inheritDoc}
*/
- public void handleAddOperation(PostResponseAddOperation addOperation,
- Entry entry)
+ @Override
+ public PreOperation doPreOperation(
+ PreOperationAddOperation addOperation)
{
- if (entry.isSubentry())
+ Entry entry = addOperation.getEntryToAdd();
+
+ if (entry.isSubentry() || entry.isLDAPSubentry())
+ {
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.checkSubentryAddAcceptable(entry);
+ }
+ catch (DirectoryException de)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+
+ return PluginResult.PreOperation.stopProcessing(
+ de.getResultCode(), de.getMessageObject());
+ }
+ }
+ }
+
+ return PluginResult.PreOperation.continueOperationProcessing();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public PreOperation doPreOperation(
+ PreOperationDeleteOperation deleteOperation)
+ {
+ Entry entry = deleteOperation.getEntryToDelete();
+
+ if (entry.isSubentry() || entry.isLDAPSubentry())
+ {
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.checkSubentryDeleteAcceptable(entry);
+ }
+ catch (DirectoryException de)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+
+ return PluginResult.PreOperation.stopProcessing(
+ de.getResultCode(), de.getMessageObject());
+ }
+ }
+ }
+
+ return PluginResult.PreOperation.continueOperationProcessing();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public PreOperation doPreOperation(
+ PreOperationModifyOperation modifyOperation)
+ {
+ Entry oldEntry = modifyOperation.getCurrentEntry();
+ Entry newEntry = modifyOperation.getModifiedEntry();
+
+ if ((newEntry.isSubentry() || newEntry.isLDAPSubentry()) ||
+ (oldEntry.isSubentry() || oldEntry.isLDAPSubentry()))
+ {
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.checkSubentryModifyAcceptable(
+ oldEntry, newEntry);
+ }
+ catch (DirectoryException de)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+
+ return PluginResult.PreOperation.stopProcessing(
+ de.getResultCode(), de.getMessageObject());
+ }
+ }
+ }
+
+ return PluginResult.PreOperation.continueOperationProcessing();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public PreOperation doPreOperation(
+ PreOperationModifyDNOperation modifyDNOperation)
+ {
+ Entry oldEntry = modifyDNOperation.getOriginalEntry();
+ Entry newEntry = modifyDNOperation.getUpdatedEntry();
+
+ if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
+ {
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.checkSubentryModifyAcceptable(
+ oldEntry, newEntry);
+ }
+ catch (DirectoryException de)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+
+ return PluginResult.PreOperation.stopProcessing(
+ de.getResultCode(), de.getMessageObject());
+ }
+ }
+ }
+
+ return PluginResult.PreOperation.continueOperationProcessing();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public PostOperation doPostOperation(
+ PostOperationAddOperation addOperation)
+ {
+ Entry entry = addOperation.getEntryToAdd();
+
+ if (entry.isSubentry() || entry.isLDAPSubentry())
{
try
{
addSubEntry(entry);
+
+ // Notify change listeners.
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.handleSubentryAdd(entry);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, e);
+ }
+ }
+ }
}
catch (Exception e)
{
@@ -571,38 +849,67 @@
// FIXME -- Handle this.
}
}
+
+ return PluginResult.PostOperation.continueOperationProcessing();
}
/**
- * {@inheritDoc} In this case, each entry is checked to see if it is
- * a subentry, and if so it will be deregistered with this manager.
+ * {@inheritDoc}
*/
- public void handleDeleteOperation(PostResponseDeleteOperation deleteOperation,
- Entry entry)
+ @Override
+ public PostOperation doPostOperation(
+ PostOperationDeleteOperation deleteOperation)
{
- if (entry.isSubentry())
+ Entry entry = deleteOperation.getEntryToDelete();
+
+ if (entry.isSubentry() || entry.isLDAPSubentry())
{
removeSubEntry(entry);
+
+ // Notify change listeners.
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.handleSubentryDelete(entry);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, e);
+ }
+ }
+ }
}
+
+ return PluginResult.PostOperation.continueOperationProcessing();
}
/**
- * {@inheritDoc} In this case, if the entry is a registered subentry
- * then it will be recreated from the contents of the provided entry
- * and re-registered with this manager.
+ * {@inheritDoc}
*/
- public void handleModifyOperation(PostResponseModifyOperation modifyOperation,
- Entry oldEntry, Entry newEntry)
+ @Override
+ public PostOperation doPostOperation(
+ PostOperationModifyOperation modifyOperation)
{
- if (oldEntry.isSubentry())
+ Entry oldEntry = modifyOperation.getCurrentEntry();
+ Entry newEntry = modifyOperation.getModifiedEntry();
+
+ boolean notify = false;
+
+ if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
{
removeSubEntry(oldEntry);
+ notify = true;
}
- if (newEntry.isSubentry())
+ if (newEntry.isSubentry() || newEntry.isLDAPSubentry())
{
try
{
addSubEntry(newEntry);
+ notify = true;
}
catch (Exception e)
{
@@ -614,19 +921,42 @@
// FIXME -- Handle this.
}
}
+
+ if (notify)
+ {
+ // Notify change listeners.
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.handleSubentryModify(
+ oldEntry, newEntry);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, e);
+ }
+ }
+ }
+ }
+
+ return PluginResult.PostOperation.continueOperationProcessing();
}
/**
- * {@inheritDoc} In this case, if the subentry is registered then it
- * will be recreated from the contents of the provided entry and re-
- * registered with this manager under the new DN and the old instance
- * will be deregistered.
+ * {@inheritDoc}
*/
- public void handleModifyDNOperation(
- PostResponseModifyDNOperation modifyDNOperation,
- Entry oldEntry, Entry newEntry)
+ @Override
+ public PostOperation doPostOperation(
+ PostOperationModifyDNOperation modifyDNOperation)
{
- if (oldEntry.isSubentry())
+ Entry oldEntry = modifyDNOperation.getOriginalEntry();
+ Entry newEntry = modifyDNOperation.getUpdatedEntry();
+
+ if (oldEntry.isSubentry() || oldEntry.isLDAPSubentry())
{
removeSubEntry(oldEntry);
try
@@ -642,6 +972,26 @@
// FIXME -- Handle this.
}
+
+ // Notify change listeners.
+ for (SubentryChangeListener changeListener :
+ changeListeners)
+ {
+ try
+ {
+ changeListener.handleSubentryModify(
+ oldEntry, newEntry);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, e);
+ }
+ }
+ }
}
+
+ return PluginResult.PostOperation.continueOperationProcessing();
}
}
diff --git a/opends/src/server/org/opends/server/core/SubentryPasswordPolicy.java b/opends/src/server/org/opends/server/core/SubentryPasswordPolicy.java
new file mode 100644
index 0000000..df53bb2
--- /dev/null
+++ b/opends/src/server/org/opends/server/core/SubentryPasswordPolicy.java
@@ -0,0 +1,946 @@
+/*
+ * 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
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ */
+
+package org.opends.server.core;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.opends.messages.Message;
+import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.std.meta.PasswordPolicyCfgDefn.
+ StateUpdateFailurePolicy;
+import org.opends.server.admin.std.server.PasswordPolicyCfg;
+import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.types.Attribute;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.AttributeValue;
+import org.opends.server.types.DN;
+import org.opends.server.types.DebugLogLevel;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.Entry;
+import org.opends.server.types.ObjectClass;
+import org.opends.server.types.ResultCode;
+import org.opends.server.types.SubEntry;
+
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.messages.ConfigMessages.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+
+/**
+ * This class represents subentry password policy based on
+ * Password Policy for LDAP Directories Internet-Draft. In
+ * order to represent subentry password policies as OpenDS
+ * password policies it performs a mapping of Draft defined
+ * attributes to OpenDS implementation specific attributes.
+ * Any missing attributes are inherited from server default
+ * password policy. This class is also reponsible for any
+ * Draft attributes validation ie making sure that provided
+ * values are acceptable and within the predefined range.
+ */
+public class SubentryPasswordPolicy implements PasswordPolicyCfg
+{
+ /**
+ * The tracer object for the debug logger.
+ */
+ private static final DebugTracer TRACER = getTracer();
+
+ // Password Policy Subentry draft attributes.
+ private final String PWD_OC_POLICY = "pwdpolicy";
+ private final String PWD_ATTR_ATTRIBUTE = "pwdattribute";
+ private final String PWD_ATTR_MINAGE = "pwdminage";
+ private final String PWD_ATTR_MAXAGE = "pwdmaxage";
+ private final String PWD_ATTR_INHISTORY = "pwdinhistory";
+ private final String PWD_ATTR_CHECKQUALITY = "pwdcheckquality";
+ private final String PWD_ATTR_MINLENGTH = "pwdminlength";
+ private final String PWD_ATTR_EXPIREWARNING = "pwdexpirewarning";
+ private final String PWD_ATTR_GRACEAUTHNLIMIT = "pwdgraceauthnlimit";
+ private final String PWD_ATTR_LOCKOUT = "pwdlockout";
+ private final String PWD_ATTR_LOCKOUTDURATION = "pwdlockoutduration";
+ private final String PWD_ATTR_MAXFAILURE = "pwdmaxfailure";
+ private final String PWD_ATTR_MUSTCHANGE = "pwdmustchange";
+ private final String PWD_ATTR_ALLOWUSERCHANGE = "pwdallowuserchange";
+ private final String PWD_ATTR_SAFEMODIFY = "pwdsafemodify";
+ private final String PWD_ATTR_FAILURECOUNTINTERVAL =
+ "pwdfailurecountinterval";
+
+ // Password Policy Subentry DN.
+ private final DN passwordPolicySubentryDN;
+ // The value of the "account-status-notification-handler" property.
+ private final SortedSet<String> pAccountStatusNotificationHandler;
+ // The value of the "allow-expired-password-changes" property.
+ private final boolean pAllowExpiredPasswordChanges;
+ // The value of the "allow-multiple-password-values" property.
+ private final boolean pAllowMultiplePasswordValues;
+ // The value of the "allow-pre-encoded-passwords" property.
+ private final boolean pAllowPreEncodedPasswords;
+ // The value of the "allow-user-password-changes" property.
+ private final boolean pAllowUserPasswordChanges;
+ // The value of the "default-password-storage-scheme" property.
+ private final SortedSet<String> pDefaultPasswordStorageScheme;
+ // The value of the "deprecated-password-storage-scheme" property.
+ private final SortedSet<String> pDeprecatedPasswordStorageScheme;
+ // The value of the "expire-passwords-without-warning" property.
+ private final boolean pExpirePasswordsWithoutWarning;
+ // The value of the "force-change-on-add" property.
+ private final boolean pForceChangeOnAdd;
+ // The value of the "force-change-on-reset" property.
+ private final boolean pForceChangeOnReset;
+ // The value of the "grace-login-count" property.
+ private final int pGraceLoginCount;
+ // The value of the "idle-lockout-interval" property.
+ private final long pIdleLockoutInterval;
+ // The value of the "last-login-time-attribute" property.
+ private final AttributeType pLastLoginTimeAttribute;
+ // The value of the "last-login-time-format" property.
+ private final String pLastLoginTimeFormat;
+ // The value of the "lockout-duration" property.
+ private final long pLockoutDuration;
+ // The value of the "lockout-failure-count" property.
+ private final int pLockoutFailureCount;
+ // The value of the "lockout-failure-expiration-interval" property.
+ private final long pLockoutFailureExpirationInterval;
+ // The value of the "max-password-age" property.
+ private final long pMaxPasswordAge;
+ // The value of the "max-password-reset-age" property.
+ private final long pMaxPasswordResetAge;
+ // The value of the "min-password-age" property.
+ private final long pMinPasswordAge;
+ // The value of the "password-attribute" property.
+ private final AttributeType pPasswordAttribute;
+ // The value of the "password-change-requires-current-password" property.
+ private final boolean pPasswordChangeRequiresCurrentPassword;
+ // The value of the "password-expiration-warning-interval" property.
+ private final long pPasswordExpirationWarningInterval;
+ // The value of the "password-generator" property.
+ private final String pPasswordGenerator;
+ // The value of the "password-history-count" property.
+ private final int pPasswordHistoryCount;
+ // The value of the "password-history-duration" property.
+ private final long pPasswordHistoryDuration;
+ // The value of the "password-validator" property.
+ private final SortedSet<String> pPasswordValidator;
+ // The value of the "previous-last-login-time-format" property.
+ private final SortedSet<String> pPreviousLastLoginTimeFormat;
+ // The value of the "require-change-by-time" property.
+ private final String pRequireChangeByTime;
+ // The value of the "require-secure-authentication" property.
+ private final boolean pRequireSecureAuthentication;
+ // The value of the "require-secure-password-changes" property.
+ private final boolean pRequireSecurePasswordChanges;
+ // The value of the "skip-validation-for-administrators" property.
+ private final boolean pSkipValidationForAdministrators;
+ // The value of the "state-update-failure-policy" property.
+ private final StateUpdateFailurePolicy pStateUpdateFailurePolicy;
+
+ /**
+ * Creates subentry password policy object from the subentry,
+ * parsing and evaluating subentry password policy attributes.
+ *
+ * @param subentry password policy subentry.
+ * @throws DirectoryException If a problem occurs while creating
+ * subentry password policy instance
+ * from given subentry.
+ */
+ public SubentryPasswordPolicy(SubEntry subentry)
+ throws DirectoryException
+ {
+ // Determine if this is a password policy subentry.
+ ObjectClass pwdPolicyOC =
+ DirectoryServer.getObjectClass(PWD_OC_POLICY);
+ Entry entry = subentry.getEntry();
+ Map<ObjectClass, String> objectClasses =
+ entry.getObjectClasses();
+ if (pwdPolicyOC == null) {
+ // This should not happen -- The server doesn't
+ // have a pwdPolicy objectclass defined.
+ if (debugEnabled()) {
+ TRACER.debugWarning(
+ "No %s objectclass is defined in the server schema.",
+ PWD_OC_POLICY);
+ }
+ for (String ocName : objectClasses.values()) {
+ if (ocName.equalsIgnoreCase(PWD_OC_POLICY)) {
+ break;
+ }
+ }
+ Message message = ERR_PWPOLICY_NO_PWDPOLICY_OC.get(
+ subentry.getDN().toString());
+ throw new DirectoryException(
+ ResultCode.CONSTRAINT_VIOLATION, message);
+ } else if (!objectClasses.containsKey(pwdPolicyOC)) {
+ Message message = ERR_PWPOLICY_NO_PWDPOLICY_OC.get(
+ subentry.getDN().toString());
+ throw new DirectoryException(
+ ResultCode.CONSTRAINT_VIOLATION, message);
+ }
+
+ // Get default password policy to derive default
+ // policy values from.
+ PasswordPolicy defaultPasswordPolicy =
+ DirectoryServer.getDefaultPasswordPolicy();
+ if (defaultPasswordPolicy == null) {
+ throw new DirectoryException(ResultCode.OPERATIONS_ERROR,
+ ERR_CONFIG_PWPOLICY_NO_DEFAULT_POLICY.get());
+ }
+
+ // Subentry DN for this password policy.
+ this.passwordPolicySubentryDN = subentry.getDN();
+
+ // Get known Password Policy draft attributes from the entry.
+ // If any given attribute is missing or empty set its value
+ // from default Password Policy configuration.
+ AttributeValue value = getAttrValue(entry, PWD_ATTR_ATTRIBUTE);
+ if ((value != null) && (value.toString().length() > 0)) {
+ this.pPasswordAttribute = DirectoryServer.getAttributeType(
+ value.toString().toLowerCase(), false);
+ if (this.pPasswordAttribute == null) {
+ throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM,
+ ERR_PWPOLICY_UNDEFINED_PASSWORD_ATTRIBUTE.get(
+ this.passwordPolicySubentryDN.toNormalizedString(),
+ value.toString()));
+ }
+ } else {
+ // This should not normally happen since pwdAttribute
+ // declared as MUST but handle this anyway in case
+ // the schema is not enforced for some reason.
+ this.pPasswordAttribute =
+ defaultPasswordPolicy.getPasswordAttribute();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_MINAGE);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pMinPasswordAge = Long.parseLong(value.toString());
+ checkIntegerAttr(PWD_ATTR_MINAGE, this.pMinPasswordAge,
+ 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pMinPasswordAge =
+ defaultPasswordPolicy.getMinimumPasswordAge();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_MAXAGE);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pMaxPasswordAge = Long.parseLong(value.toString());
+ checkIntegerAttr(PWD_ATTR_MAXAGE, this.pMaxPasswordAge,
+ 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pMaxPasswordAge =
+ defaultPasswordPolicy.getMaximumPasswordAge();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_INHISTORY);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pPasswordHistoryCount = Integer.parseInt(value.toString());
+ checkIntegerAttr(PWD_ATTR_INHISTORY,
+ this.pPasswordHistoryCount, 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pPasswordHistoryCount =
+ defaultPasswordPolicy.getPasswordHistoryCount();
+ }
+
+ // This one is managed via the password validator
+ // so only check if its value is acceptable.
+ value = getAttrValue(entry, PWD_ATTR_CHECKQUALITY);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ int pwdCheckQuality = Integer.parseInt(value.toString());
+ checkIntegerAttr(PWD_ATTR_CHECKQUALITY, pwdCheckQuality,
+ 0, 2);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ }
+
+ // This one is managed via the password validator
+ // so only check if its value is acceptable.
+ value = getAttrValue(entry, PWD_ATTR_MINLENGTH);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ int pwdMinLength = Integer.parseInt(value.toString());
+ checkIntegerAttr(PWD_ATTR_MINLENGTH, pwdMinLength,
+ 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ }
+
+ // This one depends on lockout failure count value
+ // so only check if its value is acceptable.
+ value = getAttrValue(entry, PWD_ATTR_LOCKOUT);
+ if ((value != null) && (value.toString().length() > 0)) {
+ if (value.toString().equalsIgnoreCase(Boolean.TRUE.toString()) ||
+ value.toString().equalsIgnoreCase(Boolean.FALSE.toString())) {
+ Boolean.parseBoolean(value.toString());
+ } else {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_BOOLEAN_VALUE.get(
+ PWD_ATTR_MUSTCHANGE, value.toString()));
+ }
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_EXPIREWARNING);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pPasswordExpirationWarningInterval =
+ Long.parseLong(value.toString());
+ checkIntegerAttr(PWD_ATTR_EXPIREWARNING,
+ this.pPasswordExpirationWarningInterval,
+ 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pPasswordExpirationWarningInterval =
+ defaultPasswordPolicy.getWarningInterval();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_GRACEAUTHNLIMIT);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pGraceLoginCount = Integer.parseInt(value.toString());
+ checkIntegerAttr(PWD_ATTR_GRACEAUTHNLIMIT,
+ this.pGraceLoginCount, 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pGraceLoginCount =
+ defaultPasswordPolicy.getGraceLoginCount();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_LOCKOUTDURATION);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pLockoutDuration = Long.parseLong(value.toString());
+ checkIntegerAttr(PWD_ATTR_LOCKOUTDURATION,
+ this.pLockoutDuration, 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pLockoutDuration =
+ defaultPasswordPolicy.getLockoutDuration();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_MAXFAILURE);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pLockoutFailureCount = Integer.parseInt(value.toString());
+ checkIntegerAttr(PWD_ATTR_MAXFAILURE,
+ this.pLockoutFailureCount, 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_MINAGE, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pLockoutFailureCount =
+ defaultPasswordPolicy.getLockoutFailureCount();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_MUSTCHANGE);
+ if ((value != null) && (value.toString().length() > 0)) {
+ if (value.toString().equalsIgnoreCase(Boolean.TRUE.toString()) ||
+ value.toString().equalsIgnoreCase(Boolean.FALSE.toString())) {
+ this.pForceChangeOnReset =
+ Boolean.parseBoolean(value.toString());
+ } else {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_BOOLEAN_VALUE.get(
+ PWD_ATTR_MUSTCHANGE, value.toString()));
+ }
+ } else {
+ this.pForceChangeOnReset =
+ defaultPasswordPolicy.forceChangeOnReset();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_ALLOWUSERCHANGE);
+ if ((value != null) && (value.toString().length() > 0)) {
+ if (value.toString().equalsIgnoreCase(Boolean.TRUE.toString()) ||
+ value.toString().equalsIgnoreCase(Boolean.FALSE.toString())) {
+ this.pAllowUserPasswordChanges =
+ Boolean.parseBoolean(value.toString());
+ } else {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_BOOLEAN_VALUE.get(
+ PWD_ATTR_ALLOWUSERCHANGE, value.toString()));
+ }
+ } else {
+ this.pAllowUserPasswordChanges =
+ defaultPasswordPolicy.allowUserPasswordChanges();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_SAFEMODIFY);
+ if ((value != null) && (value.toString().length() > 0)) {
+ if (value.toString().equalsIgnoreCase(Boolean.TRUE.toString()) ||
+ value.toString().equalsIgnoreCase(Boolean.FALSE.toString())) {
+ this.pPasswordChangeRequiresCurrentPassword =
+ Boolean.parseBoolean(value.toString());
+ } else {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_BOOLEAN_VALUE.get(
+ PWD_ATTR_SAFEMODIFY, value.toString()));
+ }
+ } else {
+ this.pPasswordChangeRequiresCurrentPassword =
+ defaultPasswordPolicy.requireCurrentPassword();
+ }
+
+ value = getAttrValue(entry, PWD_ATTR_FAILURECOUNTINTERVAL);
+ if ((value != null) && (value.toString().length() > 0)) {
+ try {
+ this.pLockoutFailureExpirationInterval =
+ Long.parseLong(value.toString());
+ checkIntegerAttr(PWD_ATTR_FAILURECOUNTINTERVAL,
+ this.pLockoutFailureExpirationInterval,
+ 0, Integer.MAX_VALUE);
+ } catch (NumberFormatException ne) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INVALID_INT_VALUE.get(
+ PWD_ATTR_FAILURECOUNTINTERVAL, value.toString(),
+ ne.getLocalizedMessage()));
+ }
+ } else {
+ this.pLockoutFailureExpirationInterval =
+ defaultPasswordPolicy.getLockoutFailureExpirationInterval();
+ }
+
+ // Get the rest Password Policy attributes from default configuration.
+ SortedSet<String> accountStatusNotificationHandlerSet =
+ new TreeSet<String>();
+ Set<DN> accountStatusNotificationHandlerDNSet =
+ defaultPasswordPolicy.getAccountStatusNotificationHandlers(
+ ).keySet();
+ for (DN dn : accountStatusNotificationHandlerDNSet) {
+ accountStatusNotificationHandlerSet.add(dn.toNormalizedString());
+ }
+ this.pAccountStatusNotificationHandler =
+ accountStatusNotificationHandlerSet;
+ this.pAllowExpiredPasswordChanges =
+ defaultPasswordPolicy.allowExpiredPasswordChanges();
+ this.pAllowMultiplePasswordValues =
+ defaultPasswordPolicy.allowMultiplePasswordValues();
+ this.pAllowPreEncodedPasswords =
+ defaultPasswordPolicy.allowPreEncodedPasswords();
+ SortedSet<String> passwordStorageSchemeSet =
+ new TreeSet<String>();
+ for (DN dn : defaultPasswordPolicy.getDefaultStorageSchemeDNs()) {
+ passwordStorageSchemeSet.add(dn.toNormalizedString());
+ }
+ this.pDefaultPasswordStorageScheme =
+ passwordStorageSchemeSet;
+ SortedSet<String> deprecatedPasswordStorageSchemeSet =
+ new TreeSet<String>();
+ for (DN dn : defaultPasswordPolicy.getDeprecatedStorageSchemeDNs()) {
+ deprecatedPasswordStorageSchemeSet.add(dn.toNormalizedString());
+ }
+ this.pDeprecatedPasswordStorageScheme =
+ deprecatedPasswordStorageSchemeSet;
+ this.pExpirePasswordsWithoutWarning =
+ defaultPasswordPolicy.expirePasswordsWithoutWarning();
+ this.pForceChangeOnAdd =
+ defaultPasswordPolicy.forceChangeOnAdd();
+ this.pIdleLockoutInterval =
+ defaultPasswordPolicy.getIdleLockoutInterval();
+ this.pLastLoginTimeAttribute =
+ defaultPasswordPolicy.getLastLoginTimeAttribute();
+ this.pLastLoginTimeFormat =
+ defaultPasswordPolicy.getLastLoginTimeFormat();
+ this.pMaxPasswordResetAge =
+ defaultPasswordPolicy.getMaximumPasswordResetAge();
+ this.pPasswordGenerator =
+ defaultPasswordPolicy.getPasswordGeneratorDN(
+ ).toNormalizedString();
+ this.pPasswordHistoryDuration =
+ defaultPasswordPolicy.getPasswordHistoryDuration();
+ SortedSet<String> passwordValidatorSet =
+ new TreeSet<String>();
+ Set<DN> passwordValidatorDNSet =
+ defaultPasswordPolicy.getPasswordValidators(
+ ).keySet();
+ for (DN dn : passwordValidatorDNSet) {
+ passwordValidatorSet.add(dn.toNormalizedString());
+ }
+ this.pPasswordValidator =
+ passwordValidatorSet;
+ this.pPreviousLastLoginTimeFormat = new TreeSet<String>(
+ defaultPasswordPolicy.getPreviousLastLoginTimeFormats());
+
+ long requireChangeByTime =
+ defaultPasswordPolicy.getRequireChangeByTime();
+ if (requireChangeByTime > 0) {
+ this.pRequireChangeByTime = Long.toString(requireChangeByTime);
+ } else {
+ this.pRequireChangeByTime = null;
+ }
+
+ this.pRequireSecureAuthentication =
+ defaultPasswordPolicy.requireSecureAuthentication();
+ this.pRequireSecurePasswordChanges =
+ defaultPasswordPolicy.requireSecurePasswordChanges();
+ this.pSkipValidationForAdministrators =
+ defaultPasswordPolicy.skipValidationForAdministrators();
+ this.pStateUpdateFailurePolicy =
+ defaultPasswordPolicy.getStateUpdateFailurePolicy();
+ }
+
+ /**
+ * Helper method to validate integer values.
+ * @param attrName integer attribute name.
+ * @param attrValue integer value to validate.
+ * @param lowerBound lowest acceptable value.
+ * @param upperBound highest acceptable value.
+ * @throws DirectoryException if the value is out of bounds.
+ */
+ private void checkIntegerAttr(String attrName, long attrValue,
+ long lowerBound, long upperBound) throws DirectoryException
+ {
+ if (attrValue < lowerBound) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INT_BELOW_LOWER_BOUND.get(attrName,
+ attrValue, lowerBound));
+ }
+ if (attrValue > upperBound) {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_CONFIG_ATTR_INT_ABOVE_UPPER_BOUND.get(attrName,
+ attrValue, upperBound));
+ }
+ }
+
+ /**
+ * Helper method to retieve an attribute value from given entry.
+ * @param entry the entry to retrieve an attribute value from.
+ * @param pwdAttrName attribute name to retrieve the value for.
+ * @return <CODE>AttributeValue</CODE> or <CODE>null</CODE>.
+ */
+ private AttributeValue getAttrValue(Entry entry, String pwdAttrName) {
+ AttributeType pwdAttrType = DirectoryServer.getAttributeType(
+ pwdAttrName, true);
+ List<Attribute> pwdAttrList = entry.getAttribute(pwdAttrType);
+ if ((pwdAttrList != null) && (!pwdAttrList.isEmpty()))
+ {
+ for (Attribute attr : pwdAttrList)
+ {
+ for (AttributeValue value : attr)
+ {
+ return value;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addChangeListener(
+ ConfigurationChangeListener<PasswordPolicyCfg> listener) {
+ // N/A : This is a subentry based configuration object.
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void removeChangeListener(
+ ConfigurationChangeListener<PasswordPolicyCfg> listener) {
+ // N/A : This is a subentry based configuration object.
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<String> getAccountStatusNotificationHandler() {
+ return pAccountStatusNotificationHandler;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<DN> getAccountStatusNotificationHandlerDNs() {
+ SortedSet<String> values = getAccountStatusNotificationHandler();
+ SortedSet<DN> dnValues = new TreeSet<DN>();
+ for (String value : values) {
+ try {
+ dnValues.add(DN.decode(value));
+ } catch (DirectoryException de) {
+ if (debugEnabled()) {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+ }
+ }
+ return dnValues;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isAllowExpiredPasswordChanges() {
+ return pAllowExpiredPasswordChanges;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isAllowMultiplePasswordValues() {
+ return pAllowMultiplePasswordValues;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isAllowPreEncodedPasswords() {
+ return pAllowPreEncodedPasswords;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isAllowUserPasswordChanges() {
+ return pAllowUserPasswordChanges;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<String> getDefaultPasswordStorageScheme() {
+ return pDefaultPasswordStorageScheme;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<DN> getDefaultPasswordStorageSchemeDNs() {
+ SortedSet<String> values = getDefaultPasswordStorageScheme();
+ SortedSet<DN> dnValues = new TreeSet<DN>();
+ for (String value : values) {
+ try {
+ dnValues.add(DN.decode(value));
+ } catch (DirectoryException de) {
+ if (debugEnabled()) {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+ }
+ }
+ return dnValues;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<String> getDeprecatedPasswordStorageScheme() {
+ return pDeprecatedPasswordStorageScheme;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<DN> getDeprecatedPasswordStorageSchemeDNs() {
+ SortedSet<String> values = getDeprecatedPasswordStorageScheme();
+ SortedSet<DN> dnValues = new TreeSet<DN>();
+ for (String value : values) {
+ try {
+ dnValues.add(DN.decode(value));
+ } catch (DirectoryException de) {
+ if (debugEnabled()) {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+ }
+ }
+ return dnValues;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isExpirePasswordsWithoutWarning() {
+ return pExpirePasswordsWithoutWarning;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isForceChangeOnAdd() {
+ return pForceChangeOnAdd;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isForceChangeOnReset() {
+ return pForceChangeOnReset;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getGraceLoginCount() {
+ return pGraceLoginCount;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getIdleLockoutInterval() {
+ return pIdleLockoutInterval;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public AttributeType getLastLoginTimeAttribute() {
+ return pLastLoginTimeAttribute;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getLastLoginTimeFormat() {
+ return pLastLoginTimeFormat;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getLockoutDuration() {
+ return pLockoutDuration;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getLockoutFailureCount() {
+ return pLockoutFailureCount;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getLockoutFailureExpirationInterval() {
+ return pLockoutFailureExpirationInterval;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getMaxPasswordAge() {
+ return pMaxPasswordAge;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getMaxPasswordResetAge() {
+ return pMaxPasswordResetAge;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getMinPasswordAge() {
+ return pMinPasswordAge;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public AttributeType getPasswordAttribute() {
+ return pPasswordAttribute;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isPasswordChangeRequiresCurrentPassword() {
+ return pPasswordChangeRequiresCurrentPassword;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getPasswordExpirationWarningInterval() {
+ return pPasswordExpirationWarningInterval;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getPasswordGenerator() {
+ return pPasswordGenerator;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public DN getPasswordGeneratorDN() {
+ String value = getPasswordGenerator();
+ if (value == null) {
+ return null;
+ }
+ try {
+ return DN.decode(value);
+ } catch (DirectoryException de) {
+ if (debugEnabled()) {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+ return null;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getPasswordHistoryCount() {
+ return pPasswordHistoryCount;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public long getPasswordHistoryDuration() {
+ return pPasswordHistoryDuration;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<String> getPasswordValidator() {
+ return pPasswordValidator;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<DN> getPasswordValidatorDNs() {
+ SortedSet<String> values = getPasswordValidator();
+ SortedSet<DN> dnValues = new TreeSet<DN>();
+ for (String value : values) {
+ try {
+ dnValues.add(DN.decode(value));
+ } catch (DirectoryException de) {
+ if (debugEnabled()) {
+ TRACER.debugCaught(DebugLogLevel.ERROR, de);
+ }
+ }
+ }
+ return dnValues;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public SortedSet<String> getPreviousLastLoginTimeFormat() {
+ return pPreviousLastLoginTimeFormat;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getRequireChangeByTime() {
+ return pRequireChangeByTime;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isRequireSecureAuthentication() {
+ return pRequireSecureAuthentication;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isRequireSecurePasswordChanges() {
+ return pRequireSecurePasswordChanges;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isSkipValidationForAdministrators() {
+ return pSkipValidationForAdministrators;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public StateUpdateFailurePolicy getStateUpdateFailurePolicy() {
+ return pStateUpdateFailurePolicy;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Class<? extends PasswordPolicyCfg> configurationClass() {
+ return PasswordPolicyCfg.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public DN dn() {
+ return passwordPolicySubentryDN;
+ }
+}
diff --git a/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
index c8d9b37..a76b094 100644
--- a/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/CollectiveAttributeSubentriesVirtualAttributeProvider.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2009 Sun Microsystems, Inc.
+ * Copyright 2009-2010 Sun Microsystems, Inc.
*/
package org.opends.server.extensions;
@@ -59,7 +59,8 @@
private static final DebugTracer TRACER = getTracer();
/**
- * Creates a new instance of this HasSubordinates virtual attribute provider.
+ * Creates a new instance of this collectiveAttributeSubentries
+ * virtual attribute provider.
*/
public CollectiveAttributeSubentriesVirtualAttributeProvider()
{
@@ -103,19 +104,24 @@
VirtualAttributeRule rule)
{
Set<AttributeValue> valueSet = new HashSet<AttributeValue>();
- List<SubEntry> subentries =
- DirectoryServer.getSubentryManager().getCollectiveSubentries(entry);
- AttributeType dnAttrType =
- DirectoryServer.getAttributeType("2.5.4.49");
- for (SubEntry subentry : subentries)
+ if (!entry.isSubentry() && !entry.isLDAPSubentry())
{
- if (subentry.isCollective())
+ List<SubEntry> subentries =
+ DirectoryServer.getSubentryManager(
+ ).getCollectiveSubentries(entry);
+
+ AttributeType dnAttrType =
+ DirectoryServer.getAttributeType("2.5.4.49");
+ for (SubEntry subentry : subentries)
{
- DN subentryDN = subentry.getDN();
- AttributeValue value = AttributeValues.create(
- dnAttrType, subentryDN.toString());
- valueSet.add(value);
+ if (subentry.isCollective())
+ {
+ DN subentryDN = subentry.getDN();
+ AttributeValue value = AttributeValues.create(
+ dnAttrType, subentryDN.toString());
+ valueSet.add(value);
+ }
}
}
diff --git a/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java b/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
index fd27cba..b472c1e 100644
--- a/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
+++ b/opends/src/server/org/opends/server/extensions/DefaultEntryCache.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008 Sun Microsystems, Inc.
+ * Copyright 2008-2010 Sun Microsystems, Inc.
*/
package org.opends.server.extensions;
import java.lang.reflect.Method;
@@ -156,7 +156,7 @@
cacheMisses.getAndIncrement();
}
- return entry;
+ return (entry != null ? entry.duplicate(true) : null);
}
@@ -183,7 +183,7 @@
cacheMisses.getAndIncrement();
}
- return entry;
+ return (entry != null ? entry.duplicate(true) : null);
}
@@ -206,7 +206,7 @@
cacheMisses.getAndIncrement();
}
- return entry;
+ return (entry != null ? entry.duplicate(true) : null);
}
@@ -258,7 +258,8 @@
// The first cache in the order which can take this entry
// gets it.
if (entryCache.filtersAllowCaching(entry)) {
- entryCache.putEntry(entry, backend, entryID);
+ entryCache.putEntry(entry.duplicate(false),
+ backend, entryID);
break;
}
}
@@ -275,7 +276,8 @@
// The first cache in the order which can take this entry
// gets it.
if (entryCache.filtersAllowCaching(entry)) {
- return entryCache.putEntryIfAbsent(entry, backend, entryID);
+ return entryCache.putEntryIfAbsent(entry.duplicate(false),
+ backend, entryID);
}
}
diff --git a/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java b/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java
index 27751bf..ee2c100 100644
--- a/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java
+++ b/opends/src/server/org/opends/server/extensions/FileBasedTrustManagerProvider.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2008 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.extensions;
import org.opends.messages.Message;
@@ -456,7 +456,7 @@
String pinFile = configuration.getTrustStorePinFile();
if (pinFile != null)
{
- File f = new File(pinFile);
+ File f = getFileForPath(pinFile);
if (f.exists())
{
String pinStr = null;
@@ -464,7 +464,7 @@
BufferedReader br = null;
try
{
- br = new BufferedReader(new FileReader(pinFile));
+ br = new BufferedReader(new FileReader(f));
pinStr = br.readLine();
}
catch (IOException ioe)
diff --git a/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
new file mode 100644
index 0000000..a36629a
--- /dev/null
+++ b/opends/src/server/org/opends/server/extensions/PasswordPolicySubentryVirtualAttributeProvider.java
@@ -0,0 +1,187 @@
+/*
+ * 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
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ */
+
+package org.opends.server.extensions;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.opends.messages.Message;
+import org.opends.server.admin.std.server.
+ PasswordPolicySubentryVirtualAttributeCfg;
+import org.opends.server.api.VirtualAttributeProvider;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.SearchOperation;
+import org.opends.server.config.ConfigException;
+import org.opends.server.core.PasswordPolicy;
+import org.opends.server.core.PasswordPolicyState;
+import org.opends.server.loggers.ErrorLogger;
+import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.types.*;
+
+import static org.opends.messages.ExtensionMessages.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.StaticUtils.*;
+
+/**
+ * This class implements a virtual attribute provider to serve
+ * the pwdPolicySubentry operational attribute as described in
+ * Password Policy for LDAP Directories Internet-Draft.
+ */
+public class PasswordPolicySubentryVirtualAttributeProvider
+ extends VirtualAttributeProvider<
+ PasswordPolicySubentryVirtualAttributeCfg>
+{
+ /**
+ * The tracer object for the debug logger.
+ */
+ private static final DebugTracer TRACER = getTracer();
+
+ /**
+ * Creates a new instance of this pwdPolicySubentry
+ * virtual attribute provider.
+ */
+ public PasswordPolicySubentryVirtualAttributeProvider()
+ {
+ super();
+
+ // All initialization should be performed in the
+ // initializeVirtualAttributeProvider method.
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public void initializeVirtualAttributeProvider(
+ PasswordPolicySubentryVirtualAttributeCfg configuration)
+ throws ConfigException, InitializationException
+ {
+ // No initialization is required.
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean isMultiValued()
+ {
+ return false;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public Set<AttributeValue> getValues(Entry entry,
+ VirtualAttributeRule rule)
+ {
+ Set<AttributeValue> valueSet = new HashSet<AttributeValue>();
+
+ if (!entry.isSubentry() && !entry.isLDAPSubentry())
+ {
+ PasswordPolicy policy = null;
+
+ try
+ {
+ policy = PasswordPolicyState.getPasswordPolicy(
+ entry, false);
+ }
+ catch (DirectoryException de)
+ {
+ // Something went wrong while trying to
+ // retrieve password policy, log this.
+ ErrorLogger.logError(de.getMessageObject());
+
+ if (debugEnabled())
+ {
+ TRACER.debugError("Failed to retrieve password " +
+ "policy for user %s: %s",
+ entry.getDN().toString(),
+ stackTraceToSingleLineString(de));
+ }
+ }
+
+ if (policy != null)
+ {
+ AttributeType dnAttrType = DirectoryServer.getAttributeType(
+ "1.3.6.1.4.1.42.2.27.8.1.23");
+ DN policyDN = policy.getConfigEntryDN();
+ AttributeValue value = AttributeValues.create(
+ dnAttrType, policyDN.toString());
+ valueSet.add(value);
+ }
+ else
+ {
+ // No default policy, debug log this.
+ if (debugEnabled())
+ {
+ TRACER.debugError(
+ "No applicable password policy for user %s"
+ + entry.getDN().toString());
+ }
+ }
+ }
+
+ return valueSet;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public boolean isSearchable(VirtualAttributeRule rule,
+ SearchOperation searchOperation)
+ {
+ return false;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override()
+ public void processSearch(VirtualAttributeRule rule,
+ SearchOperation searchOperation)
+ {
+ searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM);
+
+ Message message =
+ ERR_PASSWORDPOLICYSUBENTRY_VATTR_NOT_SEARCHABLE.get(
+ rule.getAttributeType().getNameOrOID());
+ searchOperation.appendErrorMessage(message);
+ }
+}
diff --git a/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java b/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java
index d06d9e4..1a0f0be 100644
--- a/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java
+++ b/opends/src/server/org/opends/server/extensions/SubschemaSubentryVirtualAttributeProvider.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.extensions;
@@ -96,9 +96,14 @@
public Set<AttributeValue> getValues(Entry entry,
VirtualAttributeRule rule)
{
+ DN schemaDN = DirectoryServer.getSchemaDN();
+ if (schemaDN == null)
+ {
+ return Collections.emptySet();
+ }
AttributeValue value =
- AttributeValues.create(rule.getAttributeType(), DirectoryServer
- .getSchemaDN().toString());
+ AttributeValues.create(rule.getAttributeType(),
+ schemaDN.toString());
return Collections.singleton(value);
}
diff --git a/opends/src/server/org/opends/server/replication/server/DataServerHandler.java b/opends/src/server/org/opends/server/replication/server/DataServerHandler.java
index 5053f42..272b583 100644
--- a/opends/src/server/org/opends/server/replication/server/DataServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/DataServerHandler.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.replication.server;
@@ -494,18 +494,21 @@
boolean sessionInitiatorSSLEncryption =
processStartFromRemote(inServerStartMsg);
+ /**
+ * Hack to be sure that if a server disconnects and reconnect, we
+ * let the reader thread see the closure and cleanup any reference
+ * to old connection. This must be done before taking the domain lock so
+ * that the reader thread has a chance to stop the handler.
+ */
+ replicationServerDomain.
+ waitDisconnection(inServerStartMsg.getServerId());
+
// lock with no timeout
lockDomain(false);
localGenerationId = replicationServerDomain.getGenerationId();
oldGenerationId = localGenerationId;
- // Hack to be sure that if a server disconnects and reconnect, we
- // let the reader thread see the closure and cleanup any reference
- // to old connection
- replicationServerDomain.
- waitDisconnection(inServerStartMsg.getServerId());
-
// Duplicate server ?
if (!replicationServerDomain.checkForDuplicateDS(this))
{
diff --git a/opends/src/server/org/opends/server/replication/server/DbHandler.java b/opends/src/server/org/opends/server/replication/server/DbHandler.java
index b28b7b8..2ca2e67 100644
--- a/opends/src/server/org/opends/server/replication/server/DbHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/DbHandler.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.replication.server;
import org.opends.messages.MessageBuilder;
@@ -294,7 +294,7 @@
* @param to The upper (newer) change number.
* @return The computed number of changes.
*/
- public int getCount(ChangeNumber from, ChangeNumber to)
+ public int traverseAndCount(ChangeNumber from, ChangeNumber to)
{
int count = 0;
flush();
@@ -312,7 +312,7 @@
ChangeNumber curr = null;
while ((curr = cursor.nextChangeNumber())!=null)
{
- if (curr.newer(to))
+ if (curr.newerOrEquals(to))
break;
count++;
}
@@ -696,4 +696,30 @@
{
return this.msgQueue.size();
}
+
+ /**
+ * Set the counter writing window size (public for unit tests only).
+ * @param size Size in number of record.
+ */
+ public void setCounterWindowSize(int size)
+ {
+ db.setCounterWindowSize(size);
+ }
+
+ /**
+ * Return the number of changes between 2 provided change numbers.
+ * This a alternative to traverseAndCount, expected to be much more efficient
+ * when there is a huge number of changes in the Db.
+ * @param from The lower (older) change number.
+ * @param to The upper (newer) change number.
+ * @return The computed number of changes.
+ */
+ public int getCount(ChangeNumber from, ChangeNumber to)
+ {
+ int c=0;
+ flush();
+ c = db.count(from, to);
+ return c;
+ }
+
}
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationDB.java b/opends/src/server/org/opends/server/replication/server/ReplicationDB.java
index 0e045bc..86e27fb 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationDB.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationDB.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.replication.server;
import org.opends.messages.MessageBuilder;
@@ -37,6 +37,7 @@
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.protocol.UpdateMsg;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.zip.DataFormatException;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.DatabaseEntry;
@@ -67,6 +68,44 @@
// close the db (shutdown or clear).
private ReentrantReadWriteLock dbCloseLock;
+ // Change counter management
+ // The Db itself does not allow to count records between a start and an end
+ // change. And we cannot rely on the replication seqnum that is part of the
+ // changenumber, since there can be holes (when an operation is canceled).
+ // And traversing all the records from the start one to the end one works
+ // fine but can be very long (ECL:lastChangeNumber).
+ //
+ // So we are storing special records in the DB (called counter records),
+ // that contain the number of changes since the previous counter record.
+ // One special record is :
+ // - a special key : changetime , serverid=0 seqnum=0
+ // - a counter value : count of changes since previous counter record.
+ //
+ // A counter record has to follow the order of the db, so it needs to have
+ // a changenumber key that follow the order.
+ // A counter record must have its own chagenumber key since the Db does not
+ // support duplicate key (it is a compatibility breaker character of the DB).
+ //
+ // We define 2 conditions to store a counter record :
+ // 1/- at least 'counterWindowSize' changes have been stored in the Db
+ // since the previous counter record
+ // 2/- the change to be stored has a new timestamp - so that the counter
+ // record is the first record for this timestamp.
+ //
+
+
+ private int counterCurrValue = 1;
+ // Current value of the counter.
+
+ private long counterTsLimit = 0;
+ // When not null,
+ // the next change with a ts different from tsForNewCounterRecord will lead
+ // to store a new counterRecord.
+
+ private int counterWindowSize = 1000;
+ // The counter record will never be written to the db more often than each
+ // counterWindowSize changes.
+
/**
* Creates a new database or open existing database that will be used
* to store and retrieve changes from an LDAP server.
@@ -92,6 +131,64 @@
true).getGenerationId());
dbCloseLock = new ReentrantReadWriteLock(true);
+
+ //
+ Cursor cursor = null;
+ Transaction txn = null;
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry data = new DatabaseEntry();
+ OperationStatus status;
+ int distBackToCounterRecord = 0;
+
+ // Initialize counter
+ this.counterCurrValue = 1;
+ cursor = db.openCursor(txn, null);
+ status = cursor.getLast(key, data, LockMode.DEFAULT);
+ while (status == OperationStatus.SUCCESS)
+ {
+ try
+ {
+ ChangeNumber cn =new ChangeNumber(new String(key.getData(), "UTF-8"));
+ if (!ReplicationDB.isaCounter(cn))
+ {
+ status = cursor.getPrev(key, data, LockMode.DEFAULT);
+ distBackToCounterRecord++;
+ }
+ else
+ {
+ // counter record
+ counterCurrValue = decodeCounterValue(data.getData())+1;
+ counterTsLimit = cn.getTime();
+ break;
+ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ MessageBuilder mb = new MessageBuilder();
+ mb.append(ERR_CHANGELOG_UNSUPPORTED_UTF8_ENCODING.get());
+ mb.append(stackTraceToSingleLineString(e));
+ logError(mb.toMessage());
+ replicationServer.shutdown();
+ if (txn != null)
+ {
+ try
+ {
+ txn.abort();
+ } catch (DatabaseException e1)
+ {
+ // can't do much more. The ReplicationServer is shuting down.
+ }
+ }
+ replicationServer.shutdown();
+ }
+ catch (DataFormatException e)
+ {
+ // Should never happen
+ }
+ }
+ counterCurrValue += distBackToCounterRecord;
+ cursor.close();
+
}
/**
@@ -123,9 +220,31 @@
{
DatabaseEntry key = new ReplicationKey(change.getChangeNumber());
DatabaseEntry data = new ReplicationData(change);
- db.put(txn, key, data);
- }
+ if ((counterCurrValue!=0) &&
+ (counterCurrValue%counterWindowSize == 0))
+ {
+ // enough changes to generate a counter record - wait for the next
+ // change fo time
+ counterTsLimit = change.getChangeNumber().getTime();
+ }
+ if ((counterTsLimit!=0)
+ && (change.getChangeNumber().getTime() != counterTsLimit))
+ {
+ // Write the counter record
+ DatabaseEntry counterKey = new ReplicationKey(
+ new ChangeNumber(
+ change.getChangeNumber().getTime(),
+ 0, 0));
+ DatabaseEntry counterValue =
+ encodeCounterValue(counterCurrValue-1);
+ db.put(txn, counterKey, counterValue);
+ counterTsLimit=0;
+ }
+ db.put(txn, key, data);
+ counterCurrValue++;
+
+ }
txn.commitWriteNoSync();
txn = null;
done = true;
@@ -275,6 +394,7 @@
{
Cursor cursor = null;
String str = null;
+ ChangeNumber cn = null;
try
{
@@ -301,11 +421,25 @@
try
{
str = new String(key.getData(), "UTF-8");
+ cn = new ChangeNumber(str);
+ if (ReplicationDB.isaCounter(cn))
+ {
+ // First record is a counter record .. go next
+ status = cursor.getNext(key, data, LockMode.DEFAULT);
+ if (status != OperationStatus.SUCCESS)
+ {
+ // DB contains only a counter record
+ return null;
+ }
+ else
+ {
+ cn = new ChangeNumber(new String(key.getData(), "UTF-8"));
+ }
+ }
} catch (UnsupportedEncodingException e)
{
// never happens
}
- return new ChangeNumber(str);
}
finally
{
@@ -320,8 +454,9 @@
mb.append(stackTraceToSingleLineString(e));
logError(mb.toMessage());
replicationServer.shutdown();
- return null;
+ cn = null;
}
+ return cn;
}
/**
@@ -331,7 +466,7 @@
public ChangeNumber readLastChange()
{
Cursor cursor = null;
- String str = null;
+ ChangeNumber cn = null;
try
{
@@ -349,13 +484,23 @@
}
try
{
- str = new String(key.getData(), "UTF-8");
+ String str = new String(key.getData(), "UTF-8");
+ cn = new ChangeNumber(str);
+ if (ReplicationDB.isaCounter(cn))
+ {
+ if (cursor.getPrev(key, data, LockMode.DEFAULT) !=
+ OperationStatus.SUCCESS)
+ {
+ /* database only contain a counter record - don't know
+ * how much it can be possible but ... */
+ cn = null;
+ }
+ }
}
catch (UnsupportedEncodingException e)
{
// never happens
}
- return new ChangeNumber(str);
}
finally
{
@@ -369,8 +514,9 @@
mb.append(stackTraceToSingleLineString(e));
logError(mb.toMessage());
replicationServer.shutdown();
- return null;
+ cn = null;
}
+ return cn;
}
/**
@@ -611,7 +757,14 @@
{
return null;
}
- try {
+ try
+ {
+ ChangeNumber cn=new ChangeNumber(new String(key.getData(), "UTF-8"));
+ if(ReplicationDB.isaCounter(cn))
+ {
+ // counter record
+ continue;
+ }
currentChange = ReplicationData.generateChange(data.getData());
} catch (Exception e) {
/*
@@ -681,4 +834,224 @@
dbCloseLock.writeLock().unlock();
}
}
+ /**
+ * Count the number of changes between 2 changes numbers (inclusive).
+ * @param start The lower limit of the count.
+ * @param stop The higher limit of the count.
+ * @return The number of changes between provided start and stop changeNumber.
+ * Returns -1 when an error occurs.
+ */
+ public int count(ChangeNumber start, ChangeNumber stop)
+ {
+ int counterRecord1 = 0;
+ int counterRecord2 = 0;
+ int distToCounterRecord1 = 0;
+ int distBackToCounterRecord2 = 0;
+ int count=0;
+ Cursor cursor = null;
+ Transaction txn = null;
+ OperationStatus status;
+ try
+ {
+ ChangeNumber cn ;
+
+ if ((start==null)&&(stop==null))
+ return (int)db.count();
+
+ // Step 1 : from the start point, traverse db to the next counter record
+ // or to the stop point.
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry data = new DatabaseEntry();
+ cursor = db.openCursor(txn, null);
+ if (start != null)
+ {
+ key = new ReplicationKey(start);
+ status = cursor.getSearchKey(key, data, LockMode.DEFAULT);
+ if (status == OperationStatus.NOTFOUND)
+ status = cursor.getSearchKeyRange(key, data, LockMode.DEFAULT);
+ }
+ else
+ {
+ status = cursor.getNext(key, data, LockMode.DEFAULT);
+ }
+
+ while (status == OperationStatus.SUCCESS)
+ {
+ // test whether the record is a regular change or a counter
+ String csnString = new String(key.getData(), "UTF-8");
+ cn = new ChangeNumber(csnString);
+ if (cn.getServerId() != 0)
+ {
+ // reached a regular change record
+ // test whether we reached the 'stop' target
+ if (!cn.newer(stop))
+ {
+ // let's loop
+ distToCounterRecord1++;
+ status = cursor.getNext(key, data, LockMode.DEFAULT);
+ }
+ else
+ {
+ // reached the end
+ break;
+ }
+ }
+ else
+ {
+ // counter record
+ counterRecord1 = decodeCounterValue(data.getData());
+ break;
+ }
+ }
+ cursor.close();
+
+ // cases
+ //
+ if (counterRecord1==0)
+ return distToCounterRecord1;
+
+ // Step 2 : from the stop point, traverse db to the next counter record
+ // or to the start point.
+ txn = null;
+ data = new DatabaseEntry();
+ key = new ReplicationKey(stop);
+ cursor = db.openCursor(txn, null);
+ status = cursor.getSearchKey(key, data, LockMode.DEFAULT);
+ if (status == OperationStatus.SUCCESS)
+ {
+ cn = new ChangeNumber(new String(key.getData(), "UTF-8"));
+ }
+ else
+ {
+ key = new DatabaseEntry();
+ data = new DatabaseEntry();
+ status = cursor.getLast(key, data, LockMode.DEFAULT);
+ if (status != OperationStatus.SUCCESS)
+ {
+ /* database is empty */
+ return 0;
+ }
+ }
+ while (status == OperationStatus.SUCCESS)
+ {
+ cn = new ChangeNumber(new String(key.getData(), "UTF-8"));
+ if (!ReplicationDB.isaCounter(cn))
+ {
+ // regular change record
+ if (!cn.older(start))
+ {
+ distBackToCounterRecord2++;
+ status = cursor.getPrev(key, data, LockMode.DEFAULT);
+ }
+ else
+ break;
+ }
+ else
+ {
+ // counter record
+ counterRecord2 = decodeCounterValue(data.getData());
+ break;
+ }
+ }
+ cursor.close();
+
+ // Step 3 : Now consolidates the result
+ if (counterRecord1!=0)
+ {
+ if (counterRecord1 == counterRecord2)
+ {
+ // only one cp between from and to - no need to use it
+ count = distToCounterRecord1 + distBackToCounterRecord2;
+ }
+ else
+ {
+ // 2 cp between from and to
+ count = distToCounterRecord1 + (counterRecord2-counterRecord1)
+ + distBackToCounterRecord2;
+ }
+ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ MessageBuilder mb = new MessageBuilder();
+ mb.append(ERR_CHANGELOG_UNSUPPORTED_UTF8_ENCODING.get());
+ mb.append(stackTraceToSingleLineString(e));
+ logError(mb.toMessage());
+ replicationServer.shutdown();
+ }
+ catch (DataFormatException e)
+ {
+ // Should never happen
+ }
+ finally
+ {
+ if (cursor != null)
+ cursor.close();
+ if (txn != null)
+ {
+ try
+ {
+ txn.abort();
+ } catch (DatabaseException e1)
+ {
+ // can't do much more. The ReplicationServer is shuting down.
+ }
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Test if a provided changeNumber represents a counter record.
+ * @param cn The provided changeNumber.
+ * @return True if the provided changenumber is a counter.
+ */
+ static private boolean isaCounter(ChangeNumber cn)
+ {
+ return ((cn.getServerId()== 0) && (cn.getSeqnum()==0));
+ }
+
+ /**
+ * Decode the provided database entry as a the value of a counter.
+ * @param entry The provided entry.
+ * @return The counter value.
+ * @throws DataFormatException
+ */
+ private static int decodeCounterValue(byte[] entry)
+ throws DataFormatException
+ {
+ try
+ {
+ String numAckStr = new String(entry, 0, entry.length, "UTF-8");
+ return Integer.parseInt(numAckStr);
+
+ } catch (UnsupportedEncodingException e)
+ {
+ throw new DataFormatException("UTF-8 is not supported by this jvm.");
+ }
+ }
+
+ /**
+ * Encode the provided counter value in a database entry.
+ * @param entry The provided entry.
+ * @return The databse entry with the counter value encoded inside..
+ * @throws UnsupportedEncodingException
+ */
+ static private DatabaseEntry encodeCounterValue(int value)
+ throws UnsupportedEncodingException
+ {
+ DatabaseEntry entry = new DatabaseEntry();
+ entry.setData(String.valueOf(value).getBytes("UTF-8"));
+ return entry;
+ }
+
+ /**
+ * Set the counter writing window size (public method for unit tests only).
+ * @param size Size in number of record.
+ */
+ public void setCounterWindowSize(int size)
+ {
+ this.counterWindowSize = size;
+ }
+
}
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index 954da42..69efdd8 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -1931,11 +1931,12 @@
/**
* Get first and last DraftCN.
- * @param crossDomainEligibleCN The provided crossDomainEligibleCN used as
- * the upper limit for the lastDraftCN
- * @param excludedServiceIDs The serviceIDs that are excluded from the ECL.
- * @return The first and last draftCN.
- * @throws DirectoryException a.
+ *
+ * @param crossDomainEligibleCN The provided crossDomainEligibleCN used as
+ * the upper limit for the lastDraftCN
+ * @param excludedServiceIDs The serviceIDs that are excluded from the ECL.
+ * @return The first and last draftCN.
+ * @throws DirectoryException When it happens.
*/
public int[] getECLDraftCNLimits(
ChangeNumber crossDomainEligibleCN,
@@ -2007,6 +2008,7 @@
// for this domain, have the state in the replchangelog
// where the last DraftCN update is
+ long ec =0;
ServerState domainServerStateForLastSeqnum;
if ((domainsServerStateForLastSeqnum == null) ||
(domainsServerStateForLastSeqnum.get(rsd.getBaseDn())==null))
@@ -2017,11 +2019,12 @@
{
domainServerStateForLastSeqnum =
domainsServerStateForLastSeqnum.get(rsd.getBaseDn());
+ ec--;
}
// Count the number of (eligible) changes from this place
// to the eligible CN (cross server)
- long ec = rsd.getEligibleCount(
+ ec = rsd.getEligibleCount(
domainServerStateForLastSeqnum, crossDomainEligibleCN);
// the state from which we started is the one BEFORE the lastdraftCN
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
index 67673d1..1cefe98 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -1439,7 +1439,8 @@
if (handler == null)
return 0;
- return handler.getCount(from, to);
+ int count = handler.getCount(from, to);
+ return count;
}
/**
@@ -2674,12 +2675,12 @@
for (ServerHandler rs : replicationServers.values())
{
int serverId = rs.getServerId();
+ // Store the fact that we expect a MonitoringMsg back from this server
+ expectedMonitoringMsg.add(new GlobalServerId(baseDn, serverId));
MonitorRequestMsg msg =
new MonitorRequestMsg(this.replicationServer.getServerId(),
serverId);
rs.send(msg);
- // Store the fact that we expect a MonitoringMsg back from this server
- expectedMonitoringMsg.add(new GlobalServerId(baseDn, serverId));
}
} catch (Exception e)
{
@@ -3379,6 +3380,7 @@
*/
public long getEligibleCount(ServerState startState, ChangeNumber endCN)
{
+ long sidRes = 0;
long res = 0;
// Parses the dbState of the domain , server by server
@@ -3391,7 +3393,13 @@
ChangeNumber startCN = null;
if (startState.getMaxChangeNumber(sid) != null)
startCN = startState.getMaxChangeNumber(sid);
- res += getCount(sid, startCN, endCN);
+ sidRes += getCount(sid, startCN, endCN);
+
+ // The startPoint is excluded when counting the ECL eligible changes
+ if ((startCN!=null)&&(sidRes>0))
+ sidRes--;
+
+ res+=sidRes;
}
return res;
}
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java
index 42b255c..db31ee0 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerHandler.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.replication.server;
@@ -104,13 +104,6 @@
}
oldGenerationId = -100;
-
- // Duplicate server ?
- if (!replicationServerDomain.checkForDuplicateRS(this))
- {
- abortStart(null);
- return false;
- }
}
catch(Exception e)
{
@@ -179,10 +172,8 @@
public void connect(String serviceId, boolean sslEncryption)
throws DirectoryException
{
-
- //
- // the encryption we will request to the peer as we are the session creator
- this.initSslEncryption = sslEncryption;
+ // we are the initiator and decides of the encryption
+ this.sslEncryption = sslEncryption;
setServiceIdAndDomain(serviceId, false);
@@ -194,9 +185,6 @@
//
lockDomain(false); // no timeout
- // we are the initiator and decides of the encryption
- boolean sessionInitiatorSSLEncryption = this.initSslEncryption;
-
// Send start
ReplServerStartMsg outReplServerStartMsg =
sendStartToRemote(ProtocolVersion.getCurrentVersion());
@@ -217,12 +205,19 @@
// Process hello from remote
processStartFromRemote((ReplServerStartMsg)msg);
+ // Duplicate server ?
+ if (!replicationServerDomain.checkForDuplicateRS(this))
+ {
+ abortStart(null);
+ return;
+ }
+
// Log
logStartHandshakeSNDandRCV(outReplServerStartMsg,(ReplServerStartMsg)msg);
// Until here session is encrypted then it depends on the negociation
// The session initiator decides whether to use SSL.
- if (!sessionInitiatorSSLEncryption)
+ if (!this.sslEncryption)
session.stopEncryption();
if (protocolVersion > ProtocolVersion.REPLICATION_PROTOCOL_V1)
@@ -286,13 +281,19 @@
oldGenerationId = -100;
try
{
- // Process start from remote
- boolean sessionInitiatorSSLEncryption =
- processStartFromRemote(inReplServerStartMsg);
+ // The initiator decides if the session is encrypted
+ sslEncryption = processStartFromRemote(inReplServerStartMsg);
// lock with timeout
lockDomain(true);
+ // Duplicate server ?
+ if (!replicationServerDomain.checkForDuplicateRS(this))
+ {
+ abortStart(null);
+ return;
+ }
+
this.localGenerationId = replicationServerDomain.getGenerationId();
ReplServerStartMsg outReplServerStartMsg =
sendStartToRemote(protocolVersion);
@@ -302,7 +303,7 @@
// until here session is encrypted then it depends on the negotiation
// The session initiator decides whether to use SSL.
- if (!sessionInitiatorSSLEncryption)
+ if (!sslEncryption)
session.stopEncryption();
TopologyMsg inTopoMsg = null;
diff --git a/opends/src/server/org/opends/server/replication/server/ServerHandler.java b/opends/src/server/org/opends/server/replication/server/ServerHandler.java
index 3282d50..7b15507 100644
--- a/opends/src/server/org/opends/server/replication/server/ServerHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/ServerHandler.java
@@ -215,11 +215,6 @@
*/
protected byte groupId = (byte) -1;
/**
- * The SSL encryption provided by the creator/starter of this handler.
- */
- protected boolean initSslEncryption;
-
- /**
* The SSL encryption after the negotiation with the peer.
*/
protected boolean sslEncryption;
diff --git a/opends/src/server/org/opends/server/tools/EncodePassword.java b/opends/src/server/org/opends/server/tools/EncodePassword.java
index ff89902..f18b658 100644
--- a/opends/src/server/org/opends/server/tools/EncodePassword.java
+++ b/opends/src/server/org/opends/server/tools/EncodePassword.java
@@ -535,7 +535,7 @@
int size = storageSchemes.size();
ArrayList<String> nameList = new ArrayList<String>(size);
- for (PasswordStorageScheme<?> s : storageSchemes.values())
+ for (PasswordStorageScheme s : storageSchemes.values())
{
nameList.add(s.getAuthPasswordSchemeName());
}
@@ -566,7 +566,7 @@
int size = storageSchemes.size();
ArrayList<String> nameList = new ArrayList<String>(size);
- for (PasswordStorageScheme<?> s : storageSchemes.values())
+ for (PasswordStorageScheme s : storageSchemes.values())
{
nameList.add(s.getStorageSchemeName());
}
@@ -622,7 +622,7 @@
return 1;
}
- PasswordStorageScheme<?> storageScheme =
+ PasswordStorageScheme storageScheme =
DirectoryServer.getAuthPasswordStorageScheme(scheme);
if (storageScheme == null)
{
@@ -672,7 +672,7 @@
}
else
{
- PasswordStorageScheme<?> storageScheme;
+ PasswordStorageScheme storageScheme;
String encodedPWString;
if (UserPasswordSyntax.isEncoded(encodedPW))
@@ -772,7 +772,7 @@
else
{
// Try to get a reference to the requested password storage scheme.
- PasswordStorageScheme<?> storageScheme;
+ PasswordStorageScheme storageScheme;
if (authPasswordSyntax.isPresent())
{
String scheme = schemeName.getValue();
@@ -909,10 +909,12 @@
directoryServer.initializePlugins(pluginTypes);
//Initialize Trust Backend.
initializeServerBackends(directoryServer);
+ // Initialize the subentry manager.
+ directoryServer.initializeSubentryManager();
//Initialize PWD policy components.
directoryServer.initializePasswordPolicyComponents();
//Load the crypto-manager key cache among other things.
- new CryptoManagerSync(false);
+ new CryptoManagerSync();
} catch (InitializationException ie) {
Message message = ERR_ENCPW_CANNOT_INITIALIZE_SERVER_COMPONENTS.get(
getExceptionMessage(ie));
@@ -955,7 +957,7 @@
backendCfg instanceof LDIFBackendCfg) {
if(backendCfg.isEnabled()) {
String className = backendCfg.getJavaClass();
- Class<?> backendClass;
+ Class backendClass;
Backend backend;
try {
backendClass = DirectoryServer.loadClass(className);
@@ -1181,7 +1183,7 @@
try
{
// attempt masking at this rate
- ErasingThread.sleep(1);
+ this.sleep(1);
}
catch (InterruptedException iex)
{
diff --git a/opends/src/server/org/opends/server/tools/ImportLDIF.java b/opends/src/server/org/opends/server/tools/ImportLDIF.java
index 20753de..4773555 100644
--- a/opends/src/server/org/opends/server/tools/ImportLDIF.java
+++ b/opends/src/server/org/opends/server/tools/ImportLDIF.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.tools;
@@ -53,6 +53,7 @@
import org.opends.server.core.CoreConfigManager;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.LockFileManager;
+import org.opends.server.core.PluginConfigManager;
import org.opends.server.extensions.ConfigFileHandler;
import org.opends.server.loggers.ErrorLogger;
import org.opends.server.loggers.TextErrorLogPublisher;
@@ -881,6 +882,66 @@
}
}
+ // Initialize the root DNs.
+ try
+ {
+ directoryServer.initializeRootDNConfigManager();
+ }
+ catch (ConfigException ce)
+ {
+ Message message = ERR_CANNOT_INITIALIZE_ROOTDN_MANAGER.get(
+ ce.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ catch (InitializationException ie)
+ {
+ Message message = ERR_CANNOT_INITIALIZE_ROOTDN_MANAGER.get(
+ ie.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+ // Initialize the plugin manager.
+ try
+ {
+ HashSet<PluginType> pluginTypes = new HashSet<PluginType>(1);
+ directoryServer.initializePlugins(pluginTypes);
+ }
+ catch (ConfigException ce)
+ {
+ Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
+ ce.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ catch (InitializationException ie)
+ {
+ Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
+ ie.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ catch (Exception e)
+ {
+ Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
+ getExceptionMessage(e));
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+
+ // Initialize the subentry manager.
+ try
+ {
+ directoryServer.initializeSubentryManager();
+ }
+ catch (InitializationException ie)
+ {
+ Message message = ERR_CANNOT_INITIALIZE_SUBENTRY_MANAGER.get(
+ ie.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
// Initialize all the password policy information.
try
@@ -908,38 +969,38 @@
err.println(wrapText(message, MAX_LINE_WIDTH));
return 1;
}
-
-
- // Make sure that the Directory Server plugin initialization is performed.
- try
- {
- HashSet<PluginType> pluginTypes = new HashSet<PluginType>(1);
- pluginTypes.add(PluginType.LDIF_IMPORT);
- directoryServer.initializePlugins(pluginTypes);
- }
- catch (ConfigException ce)
- {
- Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
- ce.getMessage());
- err.println(wrapText(message, MAX_LINE_WIDTH));
- return 1;
- }
- catch (InitializationException ie)
- {
- Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
- ie.getMessage());
- err.println(wrapText(message, MAX_LINE_WIDTH));
- return 1;
- }
- catch (Exception e)
- {
- Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
- getExceptionMessage(e));
- err.println(wrapText(message, MAX_LINE_WIDTH));
- return 1;
- }
}
+ // Make sure that the plugin initialization is performed.
+ try
+ {
+ HashSet<PluginType> pluginTypes = new HashSet<PluginType>(1);
+ pluginTypes.add(PluginType.LDIF_IMPORT);
+ PluginConfigManager pluginConfigManager =
+ DirectoryServer.getPluginConfigManager();
+ pluginConfigManager.initializeUserPlugins(pluginTypes);
+ }
+ catch (ConfigException ce)
+ {
+ Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
+ ce.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ catch (InitializationException ie)
+ {
+ Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
+ ie.getMessage());
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
+ catch (Exception e)
+ {
+ Message message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
+ getExceptionMessage(e));
+ err.println(wrapText(message, MAX_LINE_WIDTH));
+ return 1;
+ }
// See if there were any user-defined sets of include/exclude attributes or
// filters. If so, then process them.
diff --git a/opends/src/server/org/opends/server/tools/makeldif/Branch.java b/opends/src/server/org/opends/server/tools/makeldif/Branch.java
index 00b5bf0..1861ae1 100644
--- a/opends/src/server/org/opends/server/tools/makeldif/Branch.java
+++ b/opends/src/server/org/opends/server/tools/makeldif/Branch.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.tools.makeldif;
import org.opends.messages.Message;
@@ -224,7 +224,7 @@
if (subordinateTemplates[i] == null)
{
Message message = ERR_MAKELDIF_UNDEFINED_BRANCH_SUBORDINATE.get(
- subordinateTemplateNames[i], branchDN.toString());
+ branchDN.toString(), subordinateTemplateNames[i]);
throw new MakeLDIFException(message);
}
}
diff --git a/opends/src/server/org/opends/server/types/Entry.java b/opends/src/server/org/opends/server/types/Entry.java
index 98350a6..1a9a451 100644
--- a/opends/src/server/org/opends/server/types/Entry.java
+++ b/opends/src/server/org/opends/server/types/Entry.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.types;
import org.opends.messages.Message;
@@ -3361,7 +3361,8 @@
public boolean isCollectiveAttributeSubentry()
{
ObjectClass collectiveAttributeSubentryOC =
- DirectoryServer.getObjectClass(OC_COLLECTIVE_ATTR_SUBENTRY);
+ DirectoryServer.getObjectClass(
+ OC_COLLECTIVE_ATTR_SUBENTRY_LC);
if (collectiveAttributeSubentryOC == null)
{
// This should not happen -- The server doesn't have
@@ -3393,6 +3394,49 @@
/**
+ * Indicates whether the entry meets the criteria to consider it a
+ * LDAP password policy subentry (i.e., it contains the "pwdPolicy"
+ * objectclass of LDAP Password Policy Internet-Draft).
+ *
+ * @return <CODE>true</CODE> if this entry meets the criteria to
+ * consider it a LDAP Password Policy Internet-Draft
+ * subentry, or <CODE>false</CODE> if not.
+ */
+ public boolean isPasswordPolicySubentry()
+ {
+ ObjectClass passwordPolicySubentryOC =
+ DirectoryServer.getObjectClass(OC_PWD_POLICY_SUBENTRY_LC);
+ if (passwordPolicySubentryOC == null)
+ {
+ // This should not happen -- The server doesn't have
+ // a pwdPolicy objectclass defined.
+ if (debugEnabled())
+ {
+ TRACER.debugWarning(
+ "No %s objectclass is defined in the server schema.",
+ OC_PWD_POLICY_SUBENTRY);
+ }
+
+ for (String ocName : objectClasses.values())
+ {
+ if (ocName.equalsIgnoreCase(OC_PWD_POLICY_SUBENTRY))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+ // Make the determination based on whether this entry
+ // has the pwdPolicy objectclass.
+ return objectClasses.containsKey(passwordPolicySubentryOC);
+ }
+
+
+
+ /**
* Indicates whether this entry falls within the range of the
* provided search base DN and scope.
*
diff --git a/opends/src/server/org/opends/server/types/SubEntry.java b/opends/src/server/org/opends/server/types/SubEntry.java
index 8f17bb4..3001ec6 100644
--- a/opends/src/server/org/opends/server/types/SubEntry.java
+++ b/opends/src/server/org/opends/server/types/SubEntry.java
@@ -164,7 +164,7 @@
// There is none for some reason eg this could be
// old Draft based ldapSubEntry so create a dummy.
this.subTreeSpec = new RFC3672SubtreeSpecification(
- entry.getDN().getParent(), null, -1, -1,
+ DN.NULL_DN, null, -1, -1,
null, null, null);
}
diff --git a/opends/src/server/org/opends/server/util/ServerConstants.java b/opends/src/server/org/opends/server/util/ServerConstants.java
index 235bb32..72e896c 100644
--- a/opends/src/server/org/opends/server/util/ServerConstants.java
+++ b/opends/src/server/org/opends/server/util/ServerConstants.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.util;
@@ -929,6 +929,22 @@
/**
+ * The name of the LDAP Password Policy Internet-Draft
+ * "pwdPolicy" objectclass, formatted in camel case.
+ */
+ public static final String OC_PWD_POLICY_SUBENTRY = "pwdPolicy";
+
+
+
+ /**
+ * The name of the LDAP Password Policy Internet-Draft
+ * "pwdPolicy" objectclass, formatted in all lowercase.
+ */
+ public static final String OC_PWD_POLICY_SUBENTRY_LC = "pwdpolicy";
+
+
+
+ /**
* The name of the custom objectclass that will be included in backend monitor
* entries.
*/
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_addsubjectdnattribute.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_addsubjectdnattribute.ldif
new file mode 100644
index 0000000..cba2886
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_addsubjectdnattribute.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.250,ou=people,dc=com
+changetype: modify
+add: ds-certificate-subject-dn
+ds-certificate-subject-dn: uid=user.250,ou=People,dc=com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_allowdelete.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_allowdelete.ldif
new file mode 100644
index 0000000..b161508
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_allowdelete.ldif
@@ -0,0 +1,4 @@
+dn: ou=people,dc=com
+changetype: modify
+add: aci
+aci: (target="ldap:///uid=user.42*,ou=people,dc=com") (version 3.0; acl "example"; allow (delete) userdn="ldap:///uid=user.350,ou=people,dc=com";)
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify.ldif
new file mode 100644
index 0000000..7d604a6
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.120,ou=people,dc=com
+changetype: modify
+replace: telephoneNumber
+telephoneNumber: +1 420 810 8800
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify2.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify2.ldif
new file mode 100644
index 0000000..357801d
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_sasl_ldapmodify2.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.120,ou=people,dc=com
+changetype: modify
+replace: postalCode
+postalCode: 38000
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify.ldif
new file mode 100644
index 0000000..424dc8a
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.100,ou=people,dc=com
+changetype: modify
+replace: givenName
+givenName: Olga
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify2.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify2.ldif
new file mode 100644
index 0000000..3e1c693
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_ssl_ldapmodify2.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.101,ou=people,dc=com
+changetype: modify
+replace: mail
+mail: user.101@sun.com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_start.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_start.ldif
new file mode 100644
index 0000000..d58e86b
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_start.ldif
@@ -0,0 +1,15012 @@
+dn: dc=com
+objectClass: domain
+objectClass: top
+dc: com
+entryUUID: 17ebdd5e-3e4b-3f6a-ba48-f51221d62e5f
+
+dn: ou=People,dc=com
+objectClass: top
+objectClass: organizationalunit
+ou: People
+entryUUID: cd103a25-4d72-3e75-82bb-7b66040db0b4
+
+dn: uid=user.0,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aaccf Amar$01251 Chestnut Street$Panama City, DE 50369
+initials: ASA
+street: 01251 Chestnut Street
+mobile: +1 010 154 3228
+mail: user.0@maildomain.net
+employeeNumber: 0
+pager: +1 779 041 6341
+sn: Amar
+postalCode: 50369
+userPassword: {SSHA}LFe0N0HaZTIhEe8sG0CL4RMAxGOJl/mWshKg1A==
+description: This is the description for Aaccf Amar.
+l: Panama City
+cn: Aaccf Amar
+st: DE
+telephoneNumber: +1 685 622 6202
+givenName: Aaccf
+uid: user.0
+homePhone: +1 225 216 5900
+entryUUID: ec5517c1-00e2-301b-b74f-9d5b9c9bd165
+
+dn: uid=user.1,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aaren Atp$70110 Fourth Street$New Haven, OH 93694
+initials: ALA
+street: 70110 Fourth Street
+mobile: +1 680 734 6300
+mail: user.1@maildomain.net
+employeeNumber: 1
+pager: +1 850 883 8888
+sn: Atp
+postalCode: 93694
+userPassword: {SSHA}258wX2q+Oy7vOWQilRS/zn55NMC3STTG+2UkWw==
+description: This is the description for Aaren Atp.
+l: New Haven
+cn: Aaren Atp
+st: OH
+telephoneNumber: +1 390 103 6917
+givenName: Aaren
+uid: user.1
+homePhone: +1 280 375 4325
+entryUUID: d9f3f06e-3a8a-32a6-bcd5-d0138a1c23b0
+
+dn: uid=user.2,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aarika Atpco$00900 Maple Street$New Orleans, KS 10857
+initials: AOA
+street: 00900 Maple Street
+mobile: +1 279 618 3901
+mail: user.2@maildomain.net
+employeeNumber: 2
+pager: +1 053 688 9803
+sn: Atpco
+postalCode: 10857
+userPassword: {SSHA}VGUIfM1SZ+/MdApaCyFfsSMKVBHTe4NJJpeOnw==
+description: This is the description for Aarika Atpco.
+l: New Orleans
+cn: Aarika Atpco
+st: KS
+telephoneNumber: +1 757 462 0301
+givenName: Aarika
+uid: user.2
+homePhone: +1 003 428 0962
+entryUUID: 8006c1e5-13eb-37a5-b2cb-addb20ef08c1
+
+dn: uid=user.3,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aaron Atrc$59748 Willow Street$Green Bay, TN 66239
+initials: AKA
+street: 59748 Willow Street
+mobile: +1 890 430 9077
+mail: user.3@maildomain.net
+employeeNumber: 3
+pager: +1 197 025 3730
+sn: Atrc
+postalCode: 66239
+userPassword: {SSHA}DvtCpilhhKj0zG4/4DkiwaY+1jC2EsnhUrT/BQ==
+description: This is the description for Aaron Atrc.
+l: Green Bay
+cn: Aaron Atrc
+st: TN
+telephoneNumber: +1 094 100 7524
+givenName: Aaron
+uid: user.3
+homePhone: +1 332 432 4295
+entryUUID: 8264e7f8-07f4-3887-9b98-33ca1d0ed04a
+
+dn: uid=user.4,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aartjan Aalders$77810 Adams Street$Bryan, NC 72311
+initials: ALA
+street: 77810 Adams Street
+mobile: +1 209 956 9394
+mail: user.4@maildomain.net
+employeeNumber: 4
+pager: +1 951 150 0057
+sn: Aalders
+postalCode: 72311
+userPassword: {SSHA}MDYRJ2FT+AJcl3glCiRq01g4x2DUM18DD6uYmw==
+description: This is the description for Aartjan Aalders.
+l: Bryan
+cn: Aartjan Aalders
+st: NC
+telephoneNumber: +1 548 762 2193
+givenName: Aartjan
+uid: user.4
+homePhone: +1 423 009 6628
+entryUUID: d9cf7208-710e-3d49-8107-ecb6550b5f81
+
+dn: uid=user.5,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abagael Aasen$80905 Meadow Street$Salem, NJ 76132
+initials: AHA
+street: 80905 Meadow Street
+mobile: +1 516 926 3480
+mail: user.5@maildomain.net
+employeeNumber: 5
+pager: +1 928 034 3047
+sn: Aasen
+postalCode: 76132
+userPassword: {SSHA}9ga+hR7xM2NsCpeeTgO29okxgaSJ1G/7pP2I2A==
+description: This is the description for Abagael Aasen.
+l: Salem
+cn: Abagael Aasen
+st: NJ
+telephoneNumber: +1 154 428 0080
+givenName: Abagael
+uid: user.5
+homePhone: +1 563 061 6916
+entryUUID: c5084aa4-d697-3433-bae8-140d3f0a1aae
+
+dn: uid=user.6,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abagail Abadines$61394 Adams Street$Lynchburg, MA 68438
+initials: ASA
+street: 61394 Adams Street
+mobile: +1 496 091 6823
+mail: user.6@maildomain.net
+employeeNumber: 6
+pager: +1 431 570 9544
+sn: Abadines
+postalCode: 68438
+userPassword: {SSHA}KzJlKoe5vv1h4OFtbHmDvlu7nc2G9gNk3tTHuQ==
+description: This is the description for Abagail Abadines.
+l: Lynchburg
+cn: Abagail Abadines
+st: MA
+telephoneNumber: +1 236 110 4271
+givenName: Abagail
+uid: user.6
+homePhone: +1 030 104 9024
+entryUUID: 7af13d9c-6570-3a18-a379-5e9ca987ccd6
+
+dn: uid=user.7,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abahri Abazari$03401 Ninth Street$Hattiesburg, IA 04882
+initials: AOA
+street: 03401 Ninth Street
+mobile: +1 005 264 0002
+mail: user.7@maildomain.net
+employeeNumber: 7
+pager: +1 603 439 2066
+sn: Abazari
+postalCode: 04882
+userPassword: {SSHA}bUkw16lanzdZR1248Um+nkRJSseJYAsXEWCqfg==
+description: This is the description for Abahri Abazari.
+l: Hattiesburg
+cn: Abahri Abazari
+st: IA
+telephoneNumber: +1 000 800 5137
+givenName: Abahri
+uid: user.7
+homePhone: +1 941 161 6010
+entryUUID: 0f9667a9-7b9a-3083-94b2-b66b0e000726
+
+dn: uid=user.8,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abbas Abbatantuono$00468 Second Street$Eau Claire, WY 56890
+initials: ADA
+street: 00468 Second Street
+mobile: +1 407 301 6516
+mail: user.8@maildomain.net
+employeeNumber: 8
+pager: +1 054 898 2244
+sn: Abbatantuono
+postalCode: 56890
+userPassword: {SSHA}n1bbVE+RHirvmzTGDDkSZ346kyPxpwpOKzGtBw==
+description: This is the description for Abbas Abbatantuono.
+l: Eau Claire
+cn: Abbas Abbatantuono
+st: WY
+telephoneNumber: +1 804 094 3356
+givenName: Abbas
+uid: user.8
+homePhone: +1 884 320 6955
+entryUUID: be8a712e-08ff-3d1d-9022-75154c332b18
+
+dn: uid=user.9,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abbe Abbate$05257 Tenth Street$Dallas, CT 36027
+initials: AEA
+street: 05257 Tenth Street
+mobile: +1 865 856 2932
+mail: user.9@maildomain.net
+employeeNumber: 9
+pager: +1 015 006 1231
+sn: Abbate
+postalCode: 36027
+userPassword: {SSHA}CSeKKp2avozYQUDBZHj2qpDj0xoABwlIF/lfbg==
+description: This is the description for Abbe Abbate.
+l: Dallas
+cn: Abbe Abbate
+st: CT
+telephoneNumber: +1 791 584 7150
+givenName: Abbe
+uid: user.9
+homePhone: +1 104 644 6187
+entryUUID: 973ecc30-6e78-300f-bf5b-6845d594165d
+
+dn: uid=user.10,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abbey Abbie$41033 Twelfth Street$Columbia, AZ 09915
+initials: ABA
+street: 41033 Twelfth Street
+mobile: +1 203 148 1201
+mail: user.10@maildomain.net
+employeeNumber: 10
+pager: +1 380 807 6963
+sn: Abbie
+postalCode: 09915
+userPassword: {SSHA}PhSYmuT1TD8zuZrPbBRGiP0CE5W+lIc/tUiNMA==
+description: This is the description for Abbey Abbie.
+l: Columbia
+cn: Abbey Abbie
+st: AZ
+telephoneNumber: +1 883 194 7070
+givenName: Abbey
+uid: user.10
+homePhone: +1 485 901 9963
+entryUUID: 22166369-7ac1-30b7-9bbe-c0bc39b90853
+
+dn: uid=user.11,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abbi Abbott$40763 Willow Street$Fargo, IL 03104
+initials: AZA
+street: 40763 Willow Street
+mobile: +1 601 443 2520
+mail: user.11@maildomain.net
+employeeNumber: 11
+pager: +1 608 633 0695
+sn: Abbott
+postalCode: 03104
+userPassword: {SSHA}RbTnESOu2C8o69wkRBTUxBBbtF7cTgLXN9WOqg==
+description: This is the description for Abbi Abbott.
+l: Fargo
+cn: Abbi Abbott
+st: IL
+telephoneNumber: +1 591 537 3301
+givenName: Abbi
+uid: user.11
+homePhone: +1 545 144 2948
+entryUUID: 8dc10299-9192-3955-916d-97c4fe7222bd
+
+dn: uid=user.12,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abbie Abdalla$75397 Railroad Street$Beaumont, KS 73005
+initials: AGA
+street: 75397 Railroad Street
+mobile: +1 089 640 3058
+mail: user.12@maildomain.net
+employeeNumber: 12
+pager: +1 082 193 4640
+sn: Abdalla
+postalCode: 73005
+userPassword: {SSHA}W5dKYIgLvhk7KvMjeYJNmNabmGMK0wuGp8Jk+g==
+description: This is the description for Abbie Abdalla.
+l: Beaumont
+cn: Abbie Abdalla
+st: KS
+telephoneNumber: +1 062 873 3050
+givenName: Abbie
+uid: user.12
+homePhone: +1 850 447 1020
+entryUUID: 0f96ee91-290f-3351-b22e-0baef39d98aa
+
+dn: uid=user.13,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abby Abdo$91222 Lee Street$Anchorage, HI 60124
+initials: ATA
+street: 91222 Lee Street
+mobile: +1 803 503 2076
+mail: user.13@maildomain.net
+employeeNumber: 13
+pager: +1 598 609 5726
+sn: Abdo
+postalCode: 60124
+userPassword: {SSHA}seLDvLzoGkuBWNWk2Bt/dO/bn4uf9JUD2bVo4g==
+description: This is the description for Abby Abdo.
+l: Anchorage
+cn: Abby Abdo
+st: HI
+telephoneNumber: +1 049 261 0167
+givenName: Abby
+uid: user.13
+homePhone: +1 489 021 0768
+entryUUID: 7e9ec622-151a-3ae3-a06c-067a4cac32df
+
+dn: uid=user.14,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abbye Abdollahi$78929 Hillcrest Street$Elmira, ME 93080
+initials: AFA
+street: 78929 Hillcrest Street
+mobile: +1 401 069 1289
+mail: user.14@maildomain.net
+employeeNumber: 14
+pager: +1 307 591 4870
+sn: Abdollahi
+postalCode: 93080
+userPassword: {SSHA}0VJX7C7nAO3mFPtc+EJfBLlq+yB9XBtmHXcPkQ==
+description: This is the description for Abbye Abdollahi.
+l: Elmira
+cn: Abbye Abdollahi
+st: ME
+telephoneNumber: +1 030 505 6190
+givenName: Abbye
+uid: user.14
+homePhone: +1 119 487 2328
+entryUUID: e45491a3-3bd0-3a1a-bdee-2d1581e6df79
+
+dn: uid=user.15,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abdalla Abdou$33644 Twelfth Street$Hartford, CO 25103
+initials: ATA
+street: 33644 Twelfth Street
+mobile: +1 722 643 9404
+mail: user.15@maildomain.net
+employeeNumber: 15
+pager: +1 428 534 7765
+sn: Abdou
+postalCode: 25103
+userPassword: {SSHA}HIdq5x/9mMjf7h6MhviN5XsdvYqZZF2obNGrjA==
+description: This is the description for Abdalla Abdou.
+l: Hartford
+cn: Abdalla Abdou
+st: CO
+telephoneNumber: +1 709 092 1049
+givenName: Abdalla
+uid: user.15
+homePhone: +1 139 808 1030
+entryUUID: b7e3663d-46e9-3670-941d-1d2458800aef
+
+dn: uid=user.16,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abdallah Abdul-Nour$09722 Cedar Street$Huntington, MD 99731
+initials: AZA
+street: 09722 Cedar Street
+mobile: +1 357 059 1773
+mail: user.16@maildomain.net
+employeeNumber: 16
+pager: +1 037 860 9536
+sn: Abdul-Nour
+postalCode: 99731
+userPassword: {SSHA}wCoB0qgKafrjBTACUS/e5R6mCI2aNSJV5aVvjg==
+description: This is the description for Abdallah Abdul-Nour.
+l: Huntington
+cn: Abdallah Abdul-Nour
+st: MD
+telephoneNumber: +1 843 749 2480
+givenName: Abdallah
+uid: user.16
+homePhone: +1 774 342 0950
+entryUUID: ded94bf2-6c11-3fb2-90dd-09732c4b75a6
+
+dn: uid=user.17,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abdul Abdulla$71641 Davis Street$Great Falls, NC 01060
+initials: AGA
+street: 71641 Davis Street
+mobile: +1 660 001 7327
+mail: user.17@maildomain.net
+employeeNumber: 17
+pager: +1 470 078 0704
+sn: Abdulla
+postalCode: 01060
+userPassword: {SSHA}c2k4UyNd2COG/kv2vcU3LZZx4UNZJINj0fFbIQ==
+description: This is the description for Abdul Abdulla.
+l: Great Falls
+cn: Abdul Abdulla
+st: NC
+telephoneNumber: +1 395 790 2890
+givenName: Abdul
+uid: user.17
+homePhone: +1 300 401 0873
+entryUUID: 57d91d20-cfab-3bb7-b667-fb990b2f0d42
+
+dn: uid=user.18,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abdullah Abdullah$40387 Adams Street$Augusta, IL 42580
+initials: AYA
+street: 40387 Adams Street
+mobile: +1 128 607 9053
+mail: user.18@maildomain.net
+employeeNumber: 18
+pager: +1 816 520 4223
+sn: Abdullah
+postalCode: 42580
+userPassword: {SSHA}yjGbZtF/d0sUZ9g4sSX81vbmjnhXNsSaiVULmA==
+description: This is the description for Abdullah Abdullah.
+l: Augusta
+cn: Abdullah Abdullah
+st: IL
+telephoneNumber: +1 093 828 4687
+givenName: Abdullah
+uid: user.18
+homePhone: +1 042 162 0300
+entryUUID: 3212894c-321d-3874-904b-a163f7e4d8e7
+
+dn: uid=user.19,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abe Abe$61440 Fifteenth Street$Corpus Christi, NJ 83934
+initials: AWA
+street: 61440 Fifteenth Street
+mobile: +1 390 380 2714
+mail: user.19@maildomain.net
+employeeNumber: 19
+pager: +1 355 082 0886
+sn: Abe
+postalCode: 83934
+userPassword: {SSHA}xRFBkym2xRe1jI2lNMvzSptd6Ghg39El+ZSEVg==
+description: This is the description for Abe Abe.
+l: Corpus Christi
+cn: Abe Abe
+st: NJ
+telephoneNumber: +1 379 162 6351
+givenName: Abe
+uid: user.19
+homePhone: +1 153 674 4807
+entryUUID: e49d29b6-0c2b-32b9-9dc3-fdd39a09bd01
+
+dn: uid=user.20,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abel Abedi$22836 Pine Street$Wichita FallsLawton, ID 10086
+initials: AAA
+street: 22836 Pine Street
+mobile: +1 394 710 8259
+mail: user.20@maildomain.net
+employeeNumber: 20
+pager: +1 650 010 5420
+sn: Abedi
+postalCode: 10086
+userPassword: {SSHA}8bKe9kydm9ZOmrBzeUEa0cFOsjHwRwjojR5ybQ==
+description: This is the description for Abel Abedi.
+l: Wichita FallsLawton
+cn: Abel Abedi
+st: ID
+telephoneNumber: +1 980 218 5837
+givenName: Abel
+uid: user.20
+homePhone: +1 004 760 2754
+entryUUID: 2f1a6516-a59d-38ce-9e60-70849fde98f7
+
+dn: uid=user.21,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abigael Abel$96002 Fourth Street$San Diego, VA 46202
+initials: AKA
+street: 96002 Fourth Street
+mobile: +1 418 399 0390
+mail: user.21@maildomain.net
+employeeNumber: 21
+pager: +1 521 868 0860
+sn: Abel
+postalCode: 46202
+userPassword: {SSHA}VHd6pIgAS2uDvkDjwmjt7z2fDmoYC1sjzPNpCw==
+description: This is the description for Abigael Abel.
+l: San Diego
+cn: Abigael Abel
+st: VA
+telephoneNumber: +1 215 348 5000
+givenName: Abigael
+uid: user.21
+homePhone: +1 070 146 8367
+entryUUID: e39c641a-4c6c-3492-8ad2-04b9bec4d99f
+
+dn: uid=user.22,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abigail Abell$32895 Dogwood Street$Jackson, TN 73844
+initials: AHA
+street: 32895 Dogwood Street
+mobile: +1 210 936 5061
+mail: user.22@maildomain.net
+employeeNumber: 22
+pager: +1 694 709 3409
+sn: Abell
+postalCode: 73844
+userPassword: {SSHA}hG6PZOeb5V5Bgw9E5knwduyeWNH3K5mZ9OYdLw==
+description: This is the description for Abigail Abell.
+l: Jackson
+cn: Abigail Abell
+st: TN
+telephoneNumber: +1 987 600 8004
+givenName: Abigail
+uid: user.22
+homePhone: +1 996 150 2030
+entryUUID: d41a7698-2244-3d9a-98f0-ef526ef6ad87
+
+dn: uid=user.23,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abigale Abella$37833 Jefferson Street$Knoxville, IN 05515
+initials: AAA
+street: 37833 Jefferson Street
+mobile: +1 632 802 6480
+mail: user.23@maildomain.net
+employeeNumber: 23
+pager: +1 226 719 4170
+sn: Abella
+postalCode: 05515
+userPassword: {SSHA}umHMl7MX+BKg8ZxnW83BrC/OR8AEVk8/TBOJQw==
+description: This is the description for Abigale Abella.
+l: Knoxville
+cn: Abigale Abella
+st: IN
+telephoneNumber: +1 802 552 5246
+givenName: Abigale
+uid: user.23
+homePhone: +1 408 769 1830
+entryUUID: 5e1f222e-b08d-3e27-971f-3624467d9e34
+
+dn: uid=user.24,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abra Abello$11541 Third Street$Austin, NV 16873
+initials: AJA
+street: 11541 Third Street
+mobile: +1 718 988 9400
+mail: user.24@maildomain.net
+employeeNumber: 24
+pager: +1 779 733 7813
+sn: Abello
+postalCode: 16873
+userPassword: {SSHA}UCykUqq649gewH+RaDdmNC1d9ZuwIGOrCVKlDw==
+description: This is the description for Abra Abello.
+l: Austin
+cn: Abra Abello
+st: NV
+telephoneNumber: +1 258 626 7050
+givenName: Abra
+uid: user.24
+homePhone: +1 051 151 5086
+entryUUID: ce38b504-fdc9-3fd3-aaa6-57bf3f1dee14
+
+dn: uid=user.25,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abraham Abelow$13774 Pine Street$Omaha, NY 07820
+initials: AGA
+street: 13774 Pine Street
+mobile: +1 805 662 8070
+mail: user.25@maildomain.net
+employeeNumber: 25
+pager: +1 302 805 1551
+sn: Abelow
+postalCode: 07820
+userPassword: {SSHA}eC45rgcbkdFa/FLSwKw9ANuSmp83VpLP+kMlhg==
+description: This is the description for Abraham Abelow.
+l: Omaha
+cn: Abraham Abelow
+st: NY
+telephoneNumber: +1 579 228 0730
+givenName: Abraham
+uid: user.25
+homePhone: +1 020 841 5592
+entryUUID: 1ef52e6f-226d-3601-933c-78a1dafc98b9
+
+dn: uid=user.26,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Abu Abernathy$92784 Laurel Street$Pocatello, NM 75030
+initials: AFA
+street: 92784 Laurel Street
+mobile: +1 116 900 8131
+mail: user.26@maildomain.net
+employeeNumber: 26
+pager: +1 164 510 8703
+sn: Abernathy
+postalCode: 75030
+userPassword: {SSHA}snj08ITxU6LPk2bUEyRdaJswSGeb9nawW+g+IQ==
+description: This is the description for Abu Abernathy.
+l: Pocatello
+cn: Abu Abernathy
+st: NM
+telephoneNumber: +1 859 059 1950
+givenName: Abu
+uid: user.26
+homePhone: +1 307 274 9351
+entryUUID: 6988907b-b813-30c9-9bde-3aa74baaeded
+
+dn: uid=user.27,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Access Abernethy$49119 Poplar Street$Chicago, MA 47819
+initials: AYA
+street: 49119 Poplar Street
+mobile: +1 140 768 8624
+mail: user.27@maildomain.net
+employeeNumber: 27
+pager: +1 925 100 8927
+sn: Abernethy
+postalCode: 47819
+userPassword: {SSHA}HXsecQimKWfHYqVdJ7jg5NgzFbsKKzZPeLMjGg==
+description: This is the description for Access Abernethy.
+l: Chicago
+cn: Access Abernethy
+st: MA
+telephoneNumber: +1 119 042 3011
+givenName: Access
+uid: user.27
+homePhone: +1 542 293 9679
+entryUUID: 977907de-ad25-33cc-9349-7f01ec07fa20
+
+dn: uid=user.28,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Accounting Abi-Aad$15000 East Street$Detroit, DE 22169
+initials: AVA
+street: 15000 East Street
+mobile: +1 359 500 0242
+mail: user.28@maildomain.net
+employeeNumber: 28
+pager: +1 200 503 0100
+sn: Abi-Aad
+postalCode: 22169
+userPassword: {SSHA}tR00vd3BOMUSJXOvNizh3rhS2p5Ra5APCDwAZA==
+description: This is the description for Accounting Abi-Aad.
+l: Detroit
+cn: Accounting Abi-Aad
+st: DE
+telephoneNumber: +1 019 588 0007
+givenName: Accounting
+uid: user.28
+homePhone: +1 383 039 2137
+entryUUID: 9e609e9a-d6ca-31ca-b7cd-4d538b3fb3c5
+
+dn: uid=user.29,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Achal Abou-Arrage$01099 Dogwood Street$Bangor, SC 96904
+initials: AYA
+street: 01099 Dogwood Street
+mobile: +1 032 017 2536
+mail: user.29@maildomain.net
+employeeNumber: 29
+pager: +1 996 871 0022
+sn: Abou-Arrage
+postalCode: 96904
+userPassword: {SSHA}85oGzTLTkY4vAP2K3M/JkPK9CSkJBqOQb/Tbvg==
+description: This is the description for Achal Abou-Arrage.
+l: Bangor
+cn: Achal Abou-Arrage
+st: SC
+telephoneNumber: +1 920 185 1193
+givenName: Achal
+uid: user.29
+homePhone: +1 131 097 8028
+entryUUID: 048f5449-4fb3-38fb-8a1f-55fea9006e52
+
+dn: uid=user.30,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Achamma Abou-Ezze$06909 Lake Street$Omaha, DC 94995
+initials: AHA
+street: 06909 Lake Street
+mobile: +1 598 488 0798
+mail: user.30@maildomain.net
+employeeNumber: 30
+pager: +1 610 964 1480
+sn: Abou-Ezze
+postalCode: 94995
+userPassword: {SSHA}1ztwxnhu30eilT6gmZ4c+g17WjGT3SYMPo00/g==
+description: This is the description for Achamma Abou-Ezze.
+l: Omaha
+cn: Achamma Abou-Ezze
+st: DC
+telephoneNumber: +1 929 801 5644
+givenName: Achamma
+uid: user.30
+homePhone: +1 410 952 4410
+entryUUID: 3d8f02d5-c4af-387a-85bf-cc58b54b86e7
+
+dn: uid=user.31,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Action Aboul-Magd$81509 Ash Street$Clarksburg, SC 43450
+initials: AZA
+street: 81509 Ash Street
+mobile: +1 700 873 4522
+mail: user.31@maildomain.net
+employeeNumber: 31
+pager: +1 064 081 4097
+sn: Aboul-Magd
+postalCode: 43450
+userPassword: {SSHA}oeUgMUtJAjDY44N+T7StUmjG+Q4tz/mzsqCOqw==
+description: This is the description for Action Aboul-Magd.
+l: Clarksburg
+cn: Action Aboul-Magd
+st: SC
+telephoneNumber: +1 126 132 9776
+givenName: Action
+uid: user.31
+homePhone: +1 612 377 3126
+entryUUID: 00f275be-2363-3574-b35f-e6ff33963df6
+
+dn: uid=user.32,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ada Aboussouan$80894 Fifteenth Street$Fargo, MS 73482
+initials: ALA
+street: 80894 Fifteenth Street
+mobile: +1 651 257 9087
+mail: user.32@maildomain.net
+employeeNumber: 32
+pager: +1 061 432 4856
+sn: Aboussouan
+postalCode: 73482
+userPassword: {SSHA}A8NjbnRg8lneHOZjs+dE9Jxn2BqfrszS/7Laww==
+description: This is the description for Ada Aboussouan.
+l: Fargo
+cn: Ada Aboussouan
+st: MS
+telephoneNumber: +1 063 032 4909
+givenName: Ada
+uid: user.32
+homePhone: +1 732 844 9695
+entryUUID: b8a69b9a-fe53-3366-8ce8-474fce172cf5
+
+dn: uid=user.33,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adah Abovyan$65902 Eleventh Street$Watertown, CO 76836
+initials: ATA
+street: 65902 Eleventh Street
+mobile: +1 030 582 9957
+mail: user.33@maildomain.net
+employeeNumber: 33
+pager: +1 783 989 5739
+sn: Abovyan
+postalCode: 76836
+userPassword: {SSHA}pUoPW/cAuyiBz2/+BrVDU6S7zGdQWICDo3mhJg==
+description: This is the description for Adah Abovyan.
+l: Watertown
+cn: Adah Abovyan
+st: CO
+telephoneNumber: +1 153 991 0219
+givenName: Adah
+uid: user.33
+homePhone: +1 800 809 1797
+entryUUID: 8923f45d-67a2-3f60-8ba0-4217f77dda57
+
+dn: uid=user.34,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adaline Abraham$19367 Tenth Street$Eugene, TX 54528
+initials: ADA
+street: 19367 Tenth Street
+mobile: +1 756 548 2215
+mail: user.34@maildomain.net
+employeeNumber: 34
+pager: +1 504 951 7524
+sn: Abraham
+postalCode: 54528
+userPassword: {SSHA}/MMfJ9kgoMqkQQXixFK+I9VUXrnF5BJ3I0wSDQ==
+description: This is the description for Adaline Abraham.
+l: Eugene
+cn: Adaline Abraham
+st: TX
+telephoneNumber: +1 349 640 0662
+givenName: Adaline
+uid: user.34
+homePhone: +1 963 689 0054
+entryUUID: 50096005-ac47-3448-87f6-0ec6d0dae519
+
+dn: uid=user.35,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adam Abrahim$36841 Ash Street$Dallas, PA 70049
+initials: AAA
+street: 36841 Ash Street
+mobile: +1 006 054 3020
+mail: user.35@maildomain.net
+employeeNumber: 35
+pager: +1 174 187 1996
+sn: Abrahim
+postalCode: 70049
+userPassword: {SSHA}uCVW1PuPEUgR0EFnbjVXvNUiCaPc09iB1arS7Q==
+description: This is the description for Adam Abrahim.
+l: Dallas
+cn: Adam Abrahim
+st: PA
+telephoneNumber: +1 270 005 2688
+givenName: Adam
+uid: user.35
+homePhone: +1 917 735 0954
+entryUUID: 11382057-7ac5-340f-831e-9ab15abc800e
+
+dn: uid=user.36,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adan Abrams$47006 First Street$Harlingen, PA 62439
+initials: ANA
+street: 47006 First Street
+mobile: +1 413 881 9723
+mail: user.36@maildomain.net
+employeeNumber: 36
+pager: +1 998 071 7229
+sn: Abrams
+postalCode: 62439
+userPassword: {SSHA}7Qfl6xxMfAIdwr/uHVXs04Es3w4642sGo3w8wQ==
+description: This is the description for Adan Abrams.
+l: Harlingen
+cn: Adan Abrams
+st: PA
+telephoneNumber: +1 460 459 0176
+givenName: Adan
+uid: user.36
+homePhone: +1 800 926 0808
+entryUUID: 7b7f50c5-73f5-3960-adb6-e25a3fdc597d
+
+dn: uid=user.37,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adara Absi$77001 Fifteenth Street$Winston, MN 15751
+initials: AXA
+street: 77001 Fifteenth Street
+mobile: +1 297 338 1047
+mail: user.37@maildomain.net
+employeeNumber: 37
+pager: +1 508 713 7035
+sn: Absi
+postalCode: 15751
+userPassword: {SSHA}SXwYIzSnnK3yRzfbwobL8oVUYIHGgq2D8hKL1w==
+description: This is the description for Adara Absi.
+l: Winston
+cn: Adara Absi
+st: MN
+telephoneNumber: +1 293 831 6702
+givenName: Adara
+uid: user.37
+homePhone: +1 395 800 0815
+entryUUID: 6f41c5f2-b5e6-35a1-81bb-da4f7baaed90
+
+dn: uid=user.38,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adda Acelvari$61703 Ash Street$Albuquerque, MI 34240
+initials: ADA
+street: 61703 Ash Street
+mobile: +1 702 323 0280
+mail: user.38@maildomain.net
+employeeNumber: 38
+pager: +1 004 115 0851
+sn: Acelvari
+postalCode: 34240
+userPassword: {SSHA}tiDaJpMBu5LvOCv+DpkqUl17plgsS+EPE7sUXg==
+description: This is the description for Adda Acelvari.
+l: Albuquerque
+cn: Adda Acelvari
+st: MI
+telephoneNumber: +1 108 598 2525
+givenName: Adda
+uid: user.38
+homePhone: +1 103 029 5884
+entryUUID: e08b3623-d369-3b14-819f-b32bdb528320
+
+dn: uid=user.39,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Addi Acharyya$04579 Williams Street$Tupelo, CO 04345
+initials: AFA
+street: 04579 Williams Street
+mobile: +1 970 772 1576
+mail: user.39@maildomain.net
+employeeNumber: 39
+pager: +1 737 162 7720
+sn: Acharyya
+postalCode: 04345
+userPassword: {SSHA}PvFmWXyQ2V/O7IOm9nxquUoPuje6zZTr37aRlQ==
+description: This is the description for Addi Acharyya.
+l: Tupelo
+cn: Addi Acharyya
+st: CO
+telephoneNumber: +1 702 030 5091
+givenName: Addi
+uid: user.39
+homePhone: +1 030 661 2777
+entryUUID: 1d180406-5532-3359-94fd-a4b1abc55dff
+
+dn: uid=user.40,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Addia Achcar$73500 Valley Street$Billings, SC 94632
+initials: AIA
+street: 73500 Valley Street
+mobile: +1 525 070 5712
+mail: user.40@maildomain.net
+employeeNumber: 40
+pager: +1 565 719 8370
+sn: Achcar
+postalCode: 94632
+userPassword: {SSHA}u7oIP1+lfor/Upj8JmWpqJocJ1QWWh4hcHJKUw==
+description: This is the description for Addia Achcar.
+l: Billings
+cn: Addia Achcar
+st: SC
+telephoneNumber: +1 333 600 6107
+givenName: Addia
+uid: user.40
+homePhone: +1 727 691 2423
+entryUUID: 97db482b-8b2e-3611-a088-5446ba787276
+
+dn: uid=user.41,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Addie Achille$00831 Spring Street$Topeka, IA 37063
+initials: AGA
+street: 00831 Spring Street
+mobile: +1 047 009 1452
+mail: user.41@maildomain.net
+employeeNumber: 41
+pager: +1 408 557 8074
+sn: Achille
+postalCode: 37063
+userPassword: {SSHA}gweQOV/rGyMAiqJjuGxHXhdR1aaXPYHKHcPgwA==
+description: This is the description for Addie Achille.
+l: Topeka
+cn: Addie Achille
+st: IA
+telephoneNumber: +1 395 949 3479
+givenName: Addie
+uid: user.41
+homePhone: +1 053 023 4770
+entryUUID: 64733563-a413-3d93-b328-3df044dda5ca
+
+dn: uid=user.42,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Addons Achkar$30019 Fifth Street$Houston, WV 25898
+initials: APA
+street: 30019 Fifth Street
+mobile: +1 601 226 8427
+mail: user.42@maildomain.net
+employeeNumber: 42
+pager: +1 104 900 3588
+sn: Achkar
+postalCode: 25898
+userPassword: {SSHA}3nCXiQDX7X+QobDcnX+Rib6A+5hVWZEvHHxsBA==
+description: This is the description for Addons Achkar.
+l: Houston
+cn: Addons Achkar
+st: WV
+telephoneNumber: +1 199 431 7152
+givenName: Addons
+uid: user.42
+homePhone: +1 185 466 7407
+entryUUID: 2665bf85-8030-327e-8996-e7ce690de112
+
+dn: uid=user.43,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Addy Ackaouy$31570 Wilson Street$Baltimore, MI 59241
+initials: AJA
+street: 31570 Wilson Street
+mobile: +1 577 304 2350
+mail: user.43@maildomain.net
+employeeNumber: 43
+pager: +1 231 700 0900
+sn: Ackaouy
+postalCode: 59241
+userPassword: {SSHA}qhPJQiED2paLS6Sz6WelO6TwTD8eB1Q0cr9+Zw==
+description: This is the description for Addy Ackaouy.
+l: Baltimore
+cn: Addy Ackaouy
+st: MI
+telephoneNumber: +1 503 110 1542
+givenName: Addy
+uid: user.43
+homePhone: +1 073 041 7141
+entryUUID: e13488a3-aad5-338a-89f9-5f5bd1804528
+
+dn: uid=user.44,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adel Acker$30803 Lake Street$Beaumont, IL 97921
+initials: AQA
+street: 30803 Lake Street
+mobile: +1 803 407 2287
+mail: user.44@maildomain.net
+employeeNumber: 44
+pager: +1 051 260 0818
+sn: Acker
+postalCode: 97921
+userPassword: {SSHA}NP34NXto4P6u8XAlRTXyePjlNfP68nv1JbaDIA==
+description: This is the description for Adel Acker.
+l: Beaumont
+cn: Adel Acker
+st: IL
+telephoneNumber: +1 268 690 7313
+givenName: Adel
+uid: user.44
+homePhone: +1 050 335 6004
+entryUUID: 0e0efdce-237d-3ea2-92d2-867ef1912121
+
+dn: uid=user.45,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adela Acklin$92642 Birch Street$Fort Wayne, MD 76568
+initials: AGA
+street: 92642 Birch Street
+mobile: +1 059 350 1350
+mail: user.45@maildomain.net
+employeeNumber: 45
+pager: +1 772 047 2836
+sn: Acklin
+postalCode: 76568
+userPassword: {SSHA}dUdnHx9cDjYWR/NfE0mglttuLQ/lHWDuyNhELg==
+description: This is the description for Adela Acklin.
+l: Fort Wayne
+cn: Adela Acklin
+st: MD
+telephoneNumber: +1 149 600 9692
+givenName: Adela
+uid: user.45
+homePhone: +1 080 003 3154
+entryUUID: 407dd56f-55af-341b-9f9e-e85cb91263b7
+
+dn: uid=user.46,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelaida Ackwood$13344 Railroad Street$Utica, MI 99500
+initials: AMA
+street: 13344 Railroad Street
+mobile: +1 060 869 0079
+mail: user.46@maildomain.net
+employeeNumber: 46
+pager: +1 620 824 7684
+sn: Ackwood
+postalCode: 99500
+userPassword: {SSHA}UacMbz8FwztPoC7BHITtHO+kAOTgf/NPzTnKQA==
+description: This is the description for Adelaida Ackwood.
+l: Utica
+cn: Adelaida Ackwood
+st: MI
+telephoneNumber: +1 117 421 1661
+givenName: Adelaida
+uid: user.46
+homePhone: +1 094 082 1172
+entryUUID: 2299a424-a055-399a-b15d-342044f5c9c0
+
+dn: uid=user.47,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelaide Acree$89415 East Street$Chattanooga, MI 92072
+initials: AKA
+street: 89415 East Street
+mobile: +1 889 998 2702
+mail: user.47@maildomain.net
+employeeNumber: 47
+pager: +1 903 945 2553
+sn: Acree
+postalCode: 92072
+userPassword: {SSHA}7sibyqSetcxayq01lJey/jiJ5NiRAhdYVGWl0w==
+description: This is the description for Adelaide Acree.
+l: Chattanooga
+cn: Adelaide Acree
+st: MI
+telephoneNumber: +1 575 680 7791
+givenName: Adelaide
+uid: user.47
+homePhone: +1 624 755 6925
+entryUUID: a87362b6-6ed8-3f3e-857e-62918a188fcd
+
+dn: uid=user.48,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adele Acres$91853 Meadow Street$Madison, WV 28790
+initials: AJA
+street: 91853 Meadow Street
+mobile: +1 490 930 1907
+mail: user.48@maildomain.net
+employeeNumber: 48
+pager: +1 690 560 9189
+sn: Acres
+postalCode: 28790
+userPassword: {SSHA}G1xj8DByQ4iurUSDDI7ZbW5pOXMBo09RRvbAKg==
+description: This is the description for Adele Acres.
+l: Madison
+cn: Adele Acres
+st: WV
+telephoneNumber: +1 136 021 1599
+givenName: Adele
+uid: user.48
+homePhone: +1 559 074 6504
+entryUUID: d4a420b2-fdf2-34d7-89f8-1b7806dde2eb
+
+dn: uid=user.49,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelheid Acs$02830 Laurel Street$New Haven, AK 23905
+initials: ABA
+street: 02830 Laurel Street
+mobile: +1 290 471 4170
+mail: user.49@maildomain.net
+employeeNumber: 49
+pager: +1 417 307 3862
+sn: Acs
+postalCode: 23905
+userPassword: {SSHA}ZA4fo1vo5JDobOHsBn34QnrFnWRDwPeb+gYU/A==
+description: This is the description for Adelheid Acs.
+l: New Haven
+cn: Adelheid Acs
+st: AK
+telephoneNumber: +1 967 850 8431
+givenName: Adelheid
+uid: user.49
+homePhone: +1 006 255 9283
+entryUUID: eb029ff5-66a3-3084-9c75-776988a4bd57
+
+dn: uid=user.50,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelia Actionteam$93105 Hickory Street$Lake Charles, IN 36604
+initials: AVA
+street: 93105 Hickory Street
+mobile: +1 844 418 8015
+mail: user.50@maildomain.net
+employeeNumber: 50
+pager: +1 238 739 6980
+sn: Actionteam
+postalCode: 36604
+userPassword: {SSHA}OS+hIztJbTz05ggqEmPf57mw9JkFxpZEvLO97Q==
+description: This is the description for Adelia Actionteam.
+l: Lake Charles
+cn: Adelia Actionteam
+st: IN
+telephoneNumber: +1 220 554 2349
+givenName: Adelia
+uid: user.50
+homePhone: +1 786 518 7914
+entryUUID: 8a2c6841-20b6-3661-adc8-a468c0f647ab
+
+dn: uid=user.51,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelice Acton$66073 River Street$Chicago, WV 57781
+initials: APA
+street: 66073 River Street
+mobile: +1 855 007 0001
+mail: user.51@maildomain.net
+employeeNumber: 51
+pager: +1 302 250 2360
+sn: Acton
+postalCode: 57781
+userPassword: {SSHA}nWD/e2Uzpyo7XKvAV8E4vK2ofLVSzWsb7w/jzg==
+description: This is the description for Adelice Acton.
+l: Chicago
+cn: Adelice Acton
+st: WV
+telephoneNumber: +1 893 129 6042
+givenName: Adelice
+uid: user.51
+homePhone: +1 603 321 4690
+entryUUID: e2a3d2a8-ba34-37d4-9815-516a794e8c0f
+
+dn: uid=user.52,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelina Aczel$60674 Third Street$Hartford, AZ 23259
+initials: ANA
+street: 60674 Third Street
+mobile: +1 515 294 4554
+mail: user.52@maildomain.net
+employeeNumber: 52
+pager: +1 710 703 2238
+sn: Aczel
+postalCode: 23259
+userPassword: {SSHA}HU2Vjhpl19N+lY0gF4c+RUxqKaMbS11fmcIn7Q==
+description: This is the description for Adelina Aczel.
+l: Hartford
+cn: Adelina Aczel
+st: AZ
+telephoneNumber: +1 625 874 5230
+givenName: Adelina
+uid: user.52
+homePhone: +1 184 753 7780
+entryUUID: c720caa8-1112-35e4-9476-653e8a598d56
+
+dn: uid=user.53,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelind Adair$72001 Tenth Street$Kansas City, MA 05228
+initials: AKA
+street: 72001 Tenth Street
+mobile: +1 520 534 6283
+mail: user.53@maildomain.net
+employeeNumber: 53
+pager: +1 774 704 7301
+sn: Adair
+postalCode: 05228
+userPassword: {SSHA}mdm0+eGwqc/p7eKFo5DRUALl8rQ7w8Tanw2AEQ==
+description: This is the description for Adelind Adair.
+l: Kansas City
+cn: Adelind Adair
+st: MA
+telephoneNumber: +1 212 430 5338
+givenName: Adelind
+uid: user.53
+homePhone: +1 231 015 1820
+entryUUID: 5e075f7e-74c8-30d2-bcf2-2f468f2c3c55
+
+dn: uid=user.54,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adeline Adam$07242 Pine Street$Redding, MA 01577
+initials: AGA
+street: 07242 Pine Street
+mobile: +1 601 607 9592
+mail: user.54@maildomain.net
+employeeNumber: 54
+pager: +1 531 913 2338
+sn: Adam
+postalCode: 01577
+userPassword: {SSHA}2MorDBBybFDU9Co53cUnnIk5brYMiIWBBNs5zw==
+description: This is the description for Adeline Adam.
+l: Redding
+cn: Adeline Adam
+st: MA
+telephoneNumber: +1 002 077 6017
+givenName: Adeline
+uid: user.54
+homePhone: +1 701 252 0905
+entryUUID: 631ef6ac-807b-368a-bb95-15394168a16b
+
+dn: uid=user.55,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adella Adamczyk$56800 Elm Street$Grand Junction, AR 29646
+initials: AMA
+street: 56800 Elm Street
+mobile: +1 043 081 1770
+mail: user.55@maildomain.net
+employeeNumber: 55
+pager: +1 320 638 7837
+sn: Adamczyk
+postalCode: 29646
+userPassword: {SSHA}UsgnmLLWcXBO4MyjwiQEdBmSemnVIUne0Z0zSQ==
+description: This is the description for Adella Adamczyk.
+l: Grand Junction
+cn: Adella Adamczyk
+st: AR
+telephoneNumber: +1 943 472 0674
+givenName: Adella
+uid: user.55
+homePhone: +1 033 245 6036
+entryUUID: b65fdae3-8e03-36d4-a803-3dac62c905fa
+
+dn: uid=user.56,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adelle Adamkowski$11264 Fifth Street$Medford, OK 21600
+initials: AGA
+street: 11264 Fifth Street
+mobile: +1 443 017 9175
+mail: user.56@maildomain.net
+employeeNumber: 56
+pager: +1 906 278 0050
+sn: Adamkowski
+postalCode: 21600
+userPassword: {SSHA}mYVVY5M8OLEOfwcM18F660es/dSN3puiqfCDEA==
+description: This is the description for Adelle Adamkowski.
+l: Medford
+cn: Adelle Adamkowski
+st: OK
+telephoneNumber: +1 445 869 3611
+givenName: Adelle
+uid: user.56
+homePhone: +1 450 099 7515
+entryUUID: 8bdd9245-4739-3e98-af94-9c3d63ee4b96
+
+dn: uid=user.57,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adena Adamo$83704 Third Street$Steubenville, MS 04382
+initials: AEA
+street: 83704 Third Street
+mobile: +1 387 994 0993
+mail: user.57@maildomain.net
+employeeNumber: 57
+pager: +1 318 333 5832
+sn: Adamo
+postalCode: 04382
+userPassword: {SSHA}9YTMywmEz6DHWV32OdeZXZvmsMjIkW3NCfImhw==
+description: This is the description for Adena Adamo.
+l: Steubenville
+cn: Adena Adamo
+st: MS
+telephoneNumber: +1 866 978 9898
+givenName: Adena
+uid: user.57
+homePhone: +1 155 305 4942
+entryUUID: eef7f90e-7152-37fd-8265-740dfcf663a5
+
+dn: uid=user.58,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adeniyi Adamowicz$08040 North Street$Harrisburg, NE 20377
+initials: AGA
+street: 08040 North Street
+mobile: +1 009 004 1066
+mail: user.58@maildomain.net
+employeeNumber: 58
+pager: +1 051 008 0148
+sn: Adamowicz
+postalCode: 20377
+userPassword: {SSHA}I7MbVni11bM66G0/NJtUnGdasBLUhWt8v/7Pfg==
+description: This is the description for Adeniyi Adamowicz.
+l: Harrisburg
+cn: Adeniyi Adamowicz
+st: NE
+telephoneNumber: +1 201 226 4141
+givenName: Adeniyi
+uid: user.58
+homePhone: +1 322 905 9933
+entryUUID: 5ce89bde-68da-3cde-9a36-9642ebad445b
+
+dn: uid=user.59,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adey Adams$61962 Park Street$Fargo, ID 73911
+initials: AAA
+street: 61962 Park Street
+mobile: +1 568 927 1853
+mail: user.59@maildomain.net
+employeeNumber: 59
+pager: +1 239 803 2972
+sn: Adams
+postalCode: 73911
+userPassword: {SSHA}djrr+t2OsAPXcWHJ9qasnVqNDXQ/WjthLaWzEQ==
+description: This is the description for Adey Adams.
+l: Fargo
+cn: Adey Adams
+st: ID
+telephoneNumber: +1 023 396 3010
+givenName: Adey
+uid: user.59
+homePhone: +1 603 928 7957
+entryUUID: b2e8c04e-1611-3764-8088-23d814da64eb
+
+dn: uid=user.60,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adi Adamski$60367 Spring Street$Cincinnati, KS 33339
+initials: AEA
+street: 60367 Spring Street
+mobile: +1 038 004 1768
+mail: user.60@maildomain.net
+employeeNumber: 60
+pager: +1 396 417 0003
+sn: Adamski
+postalCode: 33339
+userPassword: {SSHA}/2cgmxj76B53BTw4qEhsSniomuJt2R2HRhC5Ng==
+description: This is the description for Adi Adamski.
+l: Cincinnati
+cn: Adi Adamski
+st: KS
+telephoneNumber: +1 479 408 1957
+givenName: Adi
+uid: user.60
+homePhone: +1 112 100 2044
+entryUUID: 3308c28f-e9f8-3303-a44c-b92e0c11021d
+
+dn: uid=user.61,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adiana Adamson$42404 Sixth Street$Lexington, VT 30052
+initials: ADA
+street: 42404 Sixth Street
+mobile: +1 003 537 5645
+mail: user.61@maildomain.net
+employeeNumber: 61
+pager: +1 947 033 6837
+sn: Adamson
+postalCode: 30052
+userPassword: {SSHA}9M23ndbXwpLKHziG9QV+pfi2mufc/bula8coNw==
+description: This is the description for Adiana Adamson.
+l: Lexington
+cn: Adiana Adamson
+st: VT
+telephoneNumber: +1 020 918 2183
+givenName: Adiana
+uid: user.61
+homePhone: +1 416 020 4269
+entryUUID: 1444fd76-0d61-3fe4-8740-63692558a327
+
+dn: uid=user.62,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adie Adamyk$36954 Church Street$Los Angeles, GA 00277
+initials: AFA
+street: 36954 Church Street
+mobile: +1 562 038 1913
+mail: user.62@maildomain.net
+employeeNumber: 62
+pager: +1 556 006 0264
+sn: Adamyk
+postalCode: 00277
+userPassword: {SSHA}cM5xPz7C/dm/gUtUwWZ6o4pWR/RNQf9tkQh0jg==
+description: This is the description for Adie Adamyk.
+l: Los Angeles
+cn: Adie Adamyk
+st: GA
+telephoneNumber: +1 243 879 0600
+givenName: Adie
+uid: user.62
+homePhone: +1 804 541 8051
+entryUUID: a45342d0-1c5e-3082-8300-70d5ce316cfd
+
+dn: uid=user.63,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adina Adcock$46817 Lake Street$Little Rock, ME 37945
+initials: AFA
+street: 46817 Lake Street
+mobile: +1 074 070 0072
+mail: user.63@maildomain.net
+employeeNumber: 63
+pager: +1 239 030 9195
+sn: Adcock
+postalCode: 37945
+userPassword: {SSHA}40pUWfVtoG9borb+0+DG9cXHNaTsMk2nWUR6cw==
+description: This is the description for Adina Adcock.
+l: Little Rock
+cn: Adina Adcock
+st: ME
+telephoneNumber: +1 856 690 3167
+givenName: Adina
+uid: user.63
+homePhone: +1 895 939 0804
+entryUUID: 1fa5d7e1-41d7-3bc5-980b-2e2c0781590d
+
+dn: uid=user.64,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aditya Adcox$42975 Lake Street$Weston, LA 02479
+initials: AFA
+street: 42975 Lake Street
+mobile: +1 891 004 1308
+mail: user.64@maildomain.net
+employeeNumber: 64
+pager: +1 214 127 3115
+sn: Adcox
+postalCode: 02479
+userPassword: {SSHA}cpsbaIJrXPz5LUj8AsPjUWntUFUnByISA/A9Ag==
+description: This is the description for Aditya Adcox.
+l: Weston
+cn: Aditya Adcox
+st: LA
+telephoneNumber: +1 937 401 4689
+givenName: Aditya
+uid: user.64
+homePhone: +1 887 893 0804
+entryUUID: c8772545-9b9b-336f-b992-0a58ab8c24ad
+
+dn: uid=user.65,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Admin Addetia$69723 Woodland Street$Little Rock, KS 00106
+initials: AAA
+street: 69723 Woodland Street
+mobile: +1 803 750 3129
+mail: user.65@maildomain.net
+employeeNumber: 65
+pager: +1 003 708 9520
+sn: Addetia
+postalCode: 00106
+userPassword: {SSHA}ohjBRqmo3vFZziu3x+MhAXWRNk7cqj/zXQf+UQ==
+description: This is the description for Admin Addetia.
+l: Little Rock
+cn: Admin Addetia
+st: KS
+telephoneNumber: +1 825 563 1087
+givenName: Admin
+uid: user.65
+homePhone: +1 702 354 9024
+entryUUID: 3e2d3ca9-4523-39fe-93c5-ac7c2f7e550f
+
+dn: uid=user.66,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adnan Addison$09405 Mill Street$Duluth, WV 30542
+initials: AJA
+street: 09405 Mill Street
+mobile: +1 570 344 4721
+mail: user.66@maildomain.net
+employeeNumber: 66
+pager: +1 277 581 2013
+sn: Addison
+postalCode: 30542
+userPassword: {SSHA}OGjhDQNEgUasW+ULYKmfNAyTtWT+rMjaHcnbIw==
+description: This is the description for Adnan Addison.
+l: Duluth
+cn: Adnan Addison
+st: WV
+telephoneNumber: +1 140 382 2000
+givenName: Adnan
+uid: user.66
+homePhone: +1 880 266 3317
+entryUUID: ed3572fd-09bd-3a46-bfbf-edef07a149d9
+
+dn: uid=user.67,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adora Addona$14902 Church Street$Tucson, TX 94998
+initials: AAA
+street: 14902 Church Street
+mobile: +1 570 020 2683
+mail: user.67@maildomain.net
+employeeNumber: 67
+pager: +1 224 013 9082
+sn: Addona
+postalCode: 94998
+userPassword: {SSHA}VgS80yOEbzgOOHJLI8qnvQ0kXBPqXFZCToKsWA==
+description: This is the description for Adora Addona.
+l: Tucson
+cn: Adora Addona
+st: TX
+telephoneNumber: +1 010 017 4120
+givenName: Adora
+uid: user.67
+homePhone: +1 706 681 2367
+entryUUID: 98fd4933-49e3-3824-9afe-add7a4047fa1
+
+dn: uid=user.68,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adore Adeney$51089 Willow Street$Evansville, DE 80853
+initials: ASA
+street: 51089 Willow Street
+mobile: +1 065 955 8220
+mail: user.68@maildomain.net
+employeeNumber: 68
+pager: +1 401 092 5947
+sn: Adeney
+postalCode: 80853
+userPassword: {SSHA}dMs9nbliGho9E6E7KmDgfB9bRf37mAYwtzHUag==
+description: This is the description for Adore Adeney.
+l: Evansville
+cn: Adore Adeney
+st: DE
+telephoneNumber: +1 774 013 0100
+givenName: Adore
+uid: user.68
+homePhone: +1 649 855 0323
+entryUUID: ac17fc6e-cda9-3c15-bc8b-30550f3b907b
+
+dn: uid=user.69,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adoree Aderhold$01089 Railroad Street$Marquette, OR 47025
+initials: AUA
+street: 01089 Railroad Street
+mobile: +1 040 934 7281
+mail: user.69@maildomain.net
+employeeNumber: 69
+pager: +1 008 720 8214
+sn: Aderhold
+postalCode: 47025
+userPassword: {SSHA}8w1FTOQty+DZluoBdx6HRec+6W8fSOOKW3qQ+Q==
+description: This is the description for Adoree Aderhold.
+l: Marquette
+cn: Adoree Aderhold
+st: OR
+telephoneNumber: +1 067 675 1319
+givenName: Adoree
+uid: user.69
+homePhone: +1 579 011 1009
+entryUUID: 0d8db035-9ef9-306e-99fc-6cdc1767db43
+
+dn: uid=user.70,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adorne Adey$75692 Laurel Street$Dayton, ME 43030
+initials: ABA
+street: 75692 Laurel Street
+mobile: +1 058 049 3529
+mail: user.70@maildomain.net
+employeeNumber: 70
+pager: +1 008 697 2047
+sn: Adey
+postalCode: 43030
+userPassword: {SSHA}+q+GqEmEhFHTPX2mURur3RNMYpt/Kp9TjVTLvg==
+description: This is the description for Adorne Adey.
+l: Dayton
+cn: Adorne Adey
+st: ME
+telephoneNumber: +1 014 550 6719
+givenName: Adorne
+uid: user.70
+homePhone: +1 417 059 4558
+entryUUID: a5d95adc-3d72-3ddb-80e2-b20ab0513612
+
+dn: uid=user.71,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrea Adhem$42730 Lakeview Street$Billings, IL 50263
+initials: APA
+street: 42730 Lakeview Street
+mobile: +1 978 570 0776
+mail: user.71@maildomain.net
+employeeNumber: 71
+pager: +1 082 351 5036
+sn: Adhem
+postalCode: 50263
+userPassword: {SSHA}AhSt/MlS2RftwJGwtqYJOPVM7Wh74JmiKz9sSw==
+description: This is the description for Adrea Adhem.
+l: Billings
+cn: Adrea Adhem
+st: IL
+telephoneNumber: +1 353 475 8993
+givenName: Adrea
+uid: user.71
+homePhone: +1 845 384 4821
+entryUUID: 852c7d17-93c7-314a-96d3-f770c55017bf
+
+dn: uid=user.72,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adri Adimari$05407 East Street$Bowling Green, CO 28074
+initials: AXA
+street: 05407 East Street
+mobile: +1 403 480 1238
+mail: user.72@maildomain.net
+employeeNumber: 72
+pager: +1 447 754 3091
+sn: Adimari
+postalCode: 28074
+userPassword: {SSHA}NRKDnVeJXaTJ7gw76y/BHwFZFOR8jBh8/e7tpA==
+description: This is the description for Adri Adimari.
+l: Bowling Green
+cn: Adri Adimari
+st: CO
+telephoneNumber: +1 269 029 9423
+givenName: Adri
+uid: user.72
+homePhone: +1 379 045 8300
+entryUUID: 99431cfa-a10d-3aa5-a8ba-b010e48b93e4
+
+dn: uid=user.73,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adria Adjangba$14690 Main Street$Saint Paul, CO 12327
+initials: AEA
+street: 14690 Main Street
+mobile: +1 949 332 0979
+mail: user.73@maildomain.net
+employeeNumber: 73
+pager: +1 144 596 4805
+sn: Adjangba
+postalCode: 12327
+userPassword: {SSHA}GmvqUyn1iZy1aaiQPT6Ey9x7eoZym/4ERrBY0g==
+description: This is the description for Adria Adjangba.
+l: Saint Paul
+cn: Adria Adjangba
+st: CO
+telephoneNumber: +1 042 873 0946
+givenName: Adria
+uid: user.73
+homePhone: +1 058 062 5897
+entryUUID: 5aa8fcdb-d457-3826-b8bd-31adf4a31b54
+
+dn: uid=user.74,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adriaens Adkinson$00682 Green Street$Grand Junction, NV 03425
+initials: AJA
+street: 00682 Green Street
+mobile: +1 256 850 0044
+mail: user.74@maildomain.net
+employeeNumber: 74
+pager: +1 921 135 2967
+sn: Adkinson
+postalCode: 03425
+userPassword: {SSHA}ogA+0/8S9ALB1g34s5mnSLGNrOIA2XjPDm/gFA==
+description: This is the description for Adriaens Adkinson.
+l: Grand Junction
+cn: Adriaens Adkinson
+st: NV
+telephoneNumber: +1 459 044 1162
+givenName: Adriaens
+uid: user.74
+homePhone: +1 054 871 9660
+entryUUID: e6906f7f-bf40-3ca5-b1f0-95d614bb157e
+
+dn: uid=user.75,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrian Adler$07464 Eighth Street$Sioux Falls, NH 36761
+initials: AIA
+street: 07464 Eighth Street
+mobile: +1 604 013 0194
+mail: user.75@maildomain.net
+employeeNumber: 75
+pager: +1 074 248 2309
+sn: Adler
+postalCode: 36761
+userPassword: {SSHA}ecNFXXOEfBt3bQWOFR+XqTmKXcmXT951s7SEPg==
+description: This is the description for Adrian Adler.
+l: Sioux Falls
+cn: Adrian Adler
+st: NH
+telephoneNumber: +1 386 111 0509
+givenName: Adrian
+uid: user.75
+homePhone: +1 695 669 5740
+entryUUID: 79c2a2fa-70ed-3f2f-a9e4-16641b74f3cf
+
+dn: uid=user.76,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adriana Admin$41268 Third Street$Charlottesville, OR 93521
+initials: AOA
+street: 41268 Third Street
+mobile: +1 264 220 7641
+mail: user.76@maildomain.net
+employeeNumber: 76
+pager: +1 275 933 3310
+sn: Admin
+postalCode: 93521
+userPassword: {SSHA}PIEnknf1V900Y+2TF28psGFaQmMSYnkjtG1zXQ==
+description: This is the description for Adriana Admin.
+l: Charlottesville
+cn: Adriana Admin
+st: OR
+telephoneNumber: +1 089 330 1053
+givenName: Adriana
+uid: user.76
+homePhone: +1 050 477 3006
+entryUUID: e15340e0-fd8a-38e2-babb-1e2f23774ef3
+
+dn: uid=user.77,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adriane Admin-mtv$63227 Oak Street$Little Rock, CA 53199
+initials: AIA
+street: 63227 Oak Street
+mobile: +1 532 042 9477
+mail: user.77@maildomain.net
+employeeNumber: 77
+pager: +1 984 404 0986
+sn: Admin-mtv
+postalCode: 53199
+userPassword: {SSHA}8WRnKJWttRHgeLgNd/RPgKRA/6yWW6824QiC8A==
+description: This is the description for Adriane Admin-mtv.
+l: Little Rock
+cn: Adriane Admin-mtv
+st: CA
+telephoneNumber: +1 588 001 5109
+givenName: Adriane
+uid: user.77
+homePhone: +1 668 664 5003
+entryUUID: c84a1cb2-c2c6-371f-be6e-fb3e97ffba4a
+
+dn: uid=user.78,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrianna Administration$69277 College Street$Austin, PA 27977
+initials: ADA
+street: 69277 College Street
+mobile: +1 058 646 4778
+mail: user.78@maildomain.net
+employeeNumber: 78
+pager: +1 924 002 9655
+sn: Administration
+postalCode: 27977
+userPassword: {SSHA}g1zMF2Y4oceHx6KmIIlirCkIy3zBM2XZUQmv7Q==
+description: This is the description for Adrianna Administration.
+l: Austin
+cn: Adrianna Administration
+st: PA
+telephoneNumber: +1 993 473 2120
+givenName: Adrianna
+uid: user.78
+homePhone: +1 008 882 4601
+entryUUID: c516657e-e573-3b38-b790-570ea24dcea0
+
+dn: uid=user.79,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrianne Administrator$63327 Eighth Street$Bismarck, DE 24817
+initials: ATA
+street: 63327 Eighth Street
+mobile: +1 938 627 9544
+mail: user.79@maildomain.net
+employeeNumber: 79
+pager: +1 880 570 4341
+sn: Administrator
+postalCode: 24817
+userPassword: {SSHA}YZjNdY5RcGn/o/iNkVFwPhowmqpoyGm9yob2oQ==
+description: This is the description for Adrianne Administrator.
+l: Bismarck
+cn: Adrianne Administrator
+st: DE
+telephoneNumber: +1 614 061 0272
+givenName: Adrianne
+uid: user.79
+homePhone: +1 908 014 7372
+entryUUID: 2e3ccbf6-c520-3a3f-90dd-48e7350bcfd0
+
+dn: uid=user.80,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrie Adolfie$00767 Thirteenth Street$Evansville, AL 10830
+initials: AYA
+street: 00767 Thirteenth Street
+mobile: +1 610 045 9521
+mail: user.80@maildomain.net
+employeeNumber: 80
+pager: +1 870 770 2270
+sn: Adolfie
+postalCode: 10830
+userPassword: {SSHA}S5C5aOH1YK7uvHAE3O1PGNG+xwZ5I5Wxf+Tazw==
+description: This is the description for Adrie Adolfie.
+l: Evansville
+cn: Adrie Adolfie
+st: AL
+telephoneNumber: +1 011 967 6687
+givenName: Adrie
+uid: user.80
+homePhone: +1 539 507 1905
+entryUUID: de3b73a4-029b-3592-a520-997ff5b057e1
+
+dn: uid=user.81,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrien Adolph$46833 Davis Street$Lake Charles, WI 04292
+initials: ANA
+street: 46833 Davis Street
+mobile: +1 939 349 2691
+mail: user.81@maildomain.net
+employeeNumber: 81
+pager: +1 670 114 9686
+sn: Adolph
+postalCode: 04292
+userPassword: {SSHA}nVYbu+VF59wEIwulSFCcNNKc76LB2oIaVUxXhQ==
+description: This is the description for Adrien Adolph.
+l: Lake Charles
+cn: Adrien Adolph
+st: WI
+telephoneNumber: +1 003 562 4573
+givenName: Adrien
+uid: user.81
+homePhone: +1 062 799 3470
+entryUUID: b5aa6a8a-94fb-3f80-9a42-ae736bac1ce3
+
+dn: uid=user.82,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adriena Adornato$70448 Second Street$Flint, MD 43435
+initials: ABA
+street: 70448 Second Street
+mobile: +1 490 043 0499
+mail: user.82@maildomain.net
+employeeNumber: 82
+pager: +1 563 648 2980
+sn: Adornato
+postalCode: 43435
+userPassword: {SSHA}3yyNvj4JCQFxfEtbjKdOZVX/Bx+YAM2ODM1Asg==
+description: This is the description for Adriena Adornato.
+l: Flint
+cn: Adriena Adornato
+st: MD
+telephoneNumber: +1 003 429 7287
+givenName: Adriena
+uid: user.82
+homePhone: +1 399 617 1117
+entryUUID: 420ba577-4876-3a5f-8c8b-ca9788cda5a4
+
+dn: uid=user.83,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Adrienne Adorno$81509 Twelfth Street$Honolulu, MT 00066
+initials: AKA
+street: 81509 Twelfth Street
+mobile: +1 148 905 3686
+mail: user.83@maildomain.net
+employeeNumber: 83
+pager: +1 709 981 2828
+sn: Adorno
+postalCode: 00066
+userPassword: {SSHA}AWihx+fP8wfyeSmoLYn+43xq/MHLx4sF+2PF6Q==
+description: This is the description for Adrienne Adorno.
+l: Honolulu
+cn: Adrienne Adorno
+st: MT
+telephoneNumber: +1 239 048 0807
+givenName: Adrienne
+uid: user.83
+homePhone: +1 540 268 3450
+entryUUID: bc1e30f2-2993-3167-b0eb-a66fd361954a
+
+dn: uid=user.84,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Advance Adriaansen$82289 Lake Street$Riverton, TX 90019
+initials: AZA
+street: 82289 Lake Street
+mobile: +1 010 580 0791
+mail: user.84@maildomain.net
+employeeNumber: 84
+pager: +1 286 020 8267
+sn: Adriaansen
+postalCode: 90019
+userPassword: {SSHA}iM78YUSsy9leh/ZkMwa1xtlZYAJAuuIpRU/ESA==
+description: This is the description for Advance Adriaansen.
+l: Riverton
+cn: Advance Adriaansen
+st: TX
+telephoneNumber: +1 463 242 7344
+givenName: Advance
+uid: user.84
+homePhone: +1 700 140 0070
+entryUUID: 81d7922a-fae9-3f8c-8c26-460dc9a84e64
+
+dn: uid=user.85,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aeriel Aery$98594 Central Street$La Crosse, ME 56884
+initials: ANA
+street: 98594 Central Street
+mobile: +1 549 827 4442
+mail: user.85@maildomain.net
+employeeNumber: 85
+pager: +1 492 096 6385
+sn: Aery
+postalCode: 56884
+userPassword: {SSHA}BF86q9e4/u9WMXQhT8mp/USH5/kZgbpTrdN5Nw==
+description: This is the description for Aeriel Aery.
+l: La Crosse
+cn: Aeriel Aery
+st: ME
+telephoneNumber: +1 992 729 8003
+givenName: Aeriel
+uid: user.85
+homePhone: +1 533 090 6696
+entryUUID: 30b48449-853a-3049-8b4f-71e1391db940
+
+dn: uid=user.86,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aeriela Afkham$14344 Laurel Street$Chicago, FL 95022
+initials: AZA
+street: 14344 Laurel Street
+mobile: +1 986 026 8225
+mail: user.86@maildomain.net
+employeeNumber: 86
+pager: +1 806 990 7009
+sn: Afkham
+postalCode: 95022
+userPassword: {SSHA}7laKtrWW2m7zUFnC+zVt9dFIQQtujlETd7lJ8w==
+description: This is the description for Aeriela Afkham.
+l: Chicago
+cn: Aeriela Afkham
+st: FL
+telephoneNumber: +1 916 000 0070
+givenName: Aeriela
+uid: user.86
+homePhone: +1 190 211 5868
+entryUUID: ade935ac-b426-36f9-867e-78ab228bf71e
+
+dn: uid=user.87,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aeriell Afkham-ebrahimi$15182 Franklin Street$Jacksonville, LA 15264
+initials: ACA
+street: 15182 Franklin Street
+mobile: +1 741 077 8216
+mail: user.87@maildomain.net
+employeeNumber: 87
+pager: +1 134 716 5260
+sn: Afkham-ebrahimi
+postalCode: 15264
+userPassword: {SSHA}LOuKCc7QSm03JYywiZaf3nTrS1rWy54U9TWpVw==
+description: This is the description for Aeriell Afkham-ebrahimi.
+l: Jacksonville
+cn: Aeriell Afkham-ebrahimi
+st: LA
+telephoneNumber: +1 909 360 3004
+givenName: Aeriell
+uid: user.87
+homePhone: +1 542 059 2020
+entryUUID: 441a9c4e-8534-3e24-9a8a-d2c1e028ce54
+
+dn: uid=user.88,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Afif Agarwal$00792 Adams Street$Lincoln, OK 01821
+initials: ADA
+street: 00792 Adams Street
+mobile: +1 143 237 0407
+mail: user.88@maildomain.net
+employeeNumber: 88
+pager: +1 953 718 7054
+sn: Agarwal
+postalCode: 01821
+userPassword: {SSHA}fvZy/+3fEx3uI+NAX9tqIV32C+9LlujPslOL+w==
+description: This is the description for Afif Agarwal.
+l: Lincoln
+cn: Afif Agarwal
+st: OK
+telephoneNumber: +1 846 100 1384
+givenName: Afif
+uid: user.88
+homePhone: +1 256 464 7963
+entryUUID: 7d287594-865a-398f-87bc-d58f62bcd3e4
+
+dn: uid=user.89,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Afke Aggarwal$30359 Cedar Street$Memphis, WV 55103
+initials: AAA
+street: 30359 Cedar Street
+mobile: +1 242 842 4382
+mail: user.89@maildomain.net
+employeeNumber: 89
+pager: +1 938 178 7553
+sn: Aggarwal
+postalCode: 55103
+userPassword: {SSHA}Au9CUIdnzOuCJtV18WcwzOUGGI48F7XWW0GlHg==
+description: This is the description for Afke Aggarwal.
+l: Memphis
+cn: Afke Aggarwal
+st: WV
+telephoneNumber: +1 206 348 5181
+givenName: Afke
+uid: user.89
+homePhone: +1 240 337 8720
+entryUUID: 28e2d059-2c6c-3443-9213-1e2642ade8d6
+
+dn: uid=user.90,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Afton Aghi$60636 Laurel Street$Johnstown, MS 21495
+initials: AVA
+street: 60636 Laurel Street
+mobile: +1 790 496 0526
+mail: user.90@maildomain.net
+employeeNumber: 90
+pager: +1 800 830 7521
+sn: Aghi
+postalCode: 21495
+userPassword: {SSHA}lx4RgYDYbY1b1RVou/FBrkSdT1PCQ+Ww0M+jgQ==
+description: This is the description for Afton Aghi.
+l: Johnstown
+cn: Afton Aghi
+st: MS
+telephoneNumber: +1 176 591 8000
+givenName: Afton
+uid: user.90
+homePhone: +1 515 403 9186
+entryUUID: a57e5cc3-ce10-3280-acba-fbfafd7d3290
+
+dn: uid=user.91,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Afzal Aghili$50511 Lakeview Street$Lexington, WY 81307
+initials: AHA
+street: 50511 Lakeview Street
+mobile: +1 700 050 8754
+mail: user.91@maildomain.net
+employeeNumber: 91
+pager: +1 133 760 8584
+sn: Aghili
+postalCode: 81307
+userPassword: {SSHA}Gd7o1mIA9cSAI7OsMB8AWhyq/ztMxqt6CeKEig==
+description: This is the description for Afzal Aghili.
+l: Lexington
+cn: Afzal Aghili
+st: WY
+telephoneNumber: +1 251 088 7605
+givenName: Afzal
+uid: user.91
+homePhone: +1 989 160 6650
+entryUUID: 7c323c9c-5144-3539-9776-123f4cb32e87
+
+dn: uid=user.92,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ag Agily$11184 Railroad Street$Tyler, VA 38460
+initials: AVA
+street: 11184 Railroad Street
+mobile: +1 980 283 3851
+mail: user.92@maildomain.net
+employeeNumber: 92
+pager: +1 300 924 2603
+sn: Agily
+postalCode: 38460
+userPassword: {SSHA}U4AQOgXBStt1Y7Z2qusO2/fI6ZJSpL9jtTWBrQ==
+description: This is the description for Ag Agily.
+l: Tyler
+cn: Ag Agily
+st: VA
+telephoneNumber: +1 126 259 2004
+givenName: Ag
+uid: user.92
+homePhone: +1 544 850 7388
+entryUUID: a0f14dcc-fec6-3c66-9ff7-81b1dce464ad
+
+dn: uid=user.93,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agace Agnew$15851 Adams Street$New Orleans, NC 40010
+initials: ANA
+street: 15851 Adams Street
+mobile: +1 922 012 9091
+mail: user.93@maildomain.net
+employeeNumber: 93
+pager: +1 655 181 3998
+sn: Agnew
+postalCode: 40010
+userPassword: {SSHA}tmIUP2Q3WToB0+n8hKW1XaDTZt+74EZIsckB8g==
+description: This is the description for Agace Agnew.
+l: New Orleans
+cn: Agace Agnew
+st: NC
+telephoneNumber: +1 906 041 8530
+givenName: Agace
+uid: user.93
+homePhone: +1 048 690 0890
+entryUUID: a2e63d94-2d2c-353e-85fb-3255a4e9df16
+
+dn: uid=user.94,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agata Agnihotri$80774 Mill Street$Fairbanks, MS 58167
+initials: AMA
+street: 80774 Mill Street
+mobile: +1 083 402 0000
+mail: user.94@maildomain.net
+employeeNumber: 94
+pager: +1 806 581 1074
+sn: Agnihotri
+postalCode: 58167
+userPassword: {SSHA}yqBTZXT0ILzaTZJvClte0vl0nwwkffdT18/j1A==
+description: This is the description for Agata Agnihotri.
+l: Fairbanks
+cn: Agata Agnihotri
+st: MS
+telephoneNumber: +1 419 241 8452
+givenName: Agata
+uid: user.94
+homePhone: +1 471 220 7789
+entryUUID: eef57085-bccc-3172-84ca-a13a700965f8
+
+dn: uid=user.95,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agatha Agostino$51028 Elm Street$Lima, RI 18160
+initials: ANA
+street: 51028 Elm Street
+mobile: +1 815 063 4151
+mail: user.95@maildomain.net
+employeeNumber: 95
+pager: +1 118 129 2401
+sn: Agostino
+postalCode: 18160
+userPassword: {SSHA}HwjXOlHkbo+D+Es06CDLVqwDNS8rXxmmrpnEEA==
+description: This is the description for Agatha Agostino.
+l: Lima
+cn: Agatha Agostino
+st: RI
+telephoneNumber: +1 075 569 1558
+givenName: Agatha
+uid: user.95
+homePhone: +1 769 672 1045
+entryUUID: 61513856-715a-30ce-8616-174471edb39d
+
+dn: uid=user.96,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agathe Aguiar$77907 Church Street$Spartanburg, TX 70006
+initials: ATA
+street: 77907 Church Street
+mobile: +1 284 160 3614
+mail: user.96@maildomain.net
+employeeNumber: 96
+pager: +1 979 079 9590
+sn: Aguiar
+postalCode: 70006
+userPassword: {SSHA}1Xc2IhRCr8SF1fjHvnJJPHC7OKlflI5mANzAnQ==
+description: This is the description for Agathe Aguiar.
+l: Spartanburg
+cn: Agathe Aguiar
+st: TX
+telephoneNumber: +1 702 595 0677
+givenName: Agathe
+uid: user.96
+homePhone: +1 016 880 6080
+entryUUID: 126d3718-88f9-3105-9bc7-3f9600d7365a
+
+dn: uid=user.97,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agenia Aguilar$21149 Laurel Street$Milwaukee, KS 30124
+initials: ARA
+street: 21149 Laurel Street
+mobile: +1 411 507 0061
+mail: user.97@maildomain.net
+employeeNumber: 97
+pager: +1 010 800 0778
+sn: Aguilar
+postalCode: 30124
+userPassword: {SSHA}A3wLbOdkbVtM3d1Ttjxi11UDh0+ahgpVaQtHFg==
+description: This is the description for Agenia Aguilar.
+l: Milwaukee
+cn: Agenia Aguilar
+st: KS
+telephoneNumber: +1 086 837 7761
+givenName: Agenia
+uid: user.97
+homePhone: +1 036 069 0668
+entryUUID: 9fd9d623-3d62-36a3-8091-e7e5eb30e823
+
+dn: uid=user.98,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aggi Aguinsky$02515 Fourth Street$Cincinnati, AK 12696
+initials: AAA
+street: 02515 Fourth Street
+mobile: +1 310 576 5795
+mail: user.98@maildomain.net
+employeeNumber: 98
+pager: +1 904 520 9505
+sn: Aguinsky
+postalCode: 12696
+userPassword: {SSHA}72lk9NEOYnxBgfG65+cvYWp2gwe7u810UgQZZA==
+description: This is the description for Aggi Aguinsky.
+l: Cincinnati
+cn: Aggi Aguinsky
+st: AK
+telephoneNumber: +1 611 959 8362
+givenName: Aggi
+uid: user.98
+homePhone: +1 265 952 1194
+entryUUID: e104749c-c94d-377c-a64a-afc47d2b0ca5
+
+dn: uid=user.99,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aggie Aguirre$15172 Jackson Street$Salt Lake City, MI 49843
+initials: AGA
+street: 15172 Jackson Street
+mobile: +1 030 300 0720
+mail: user.99@maildomain.net
+employeeNumber: 99
+pager: +1 514 297 1830
+sn: Aguirre
+postalCode: 49843
+userPassword: {SSHA}Db5wDJektS0YiLGMZ3fSahYeblcfBxGF/roF/Q==
+description: This is the description for Aggie Aguirre.
+l: Salt Lake City
+cn: Aggie Aguirre
+st: MI
+telephoneNumber: +1 730 027 2062
+givenName: Aggie
+uid: user.99
+homePhone: +1 229 128 3072
+entryUUID: f283dee7-3547-39fd-a8d7-89413c77ff08
+
+dn: uid=user.100,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aggy Ahad$26630 Lincoln Street$Seattle, OK 67465
+initials: ARA
+street: 26630 Lincoln Street
+mobile: +1 084 476 3276
+mail: user.100@maildomain.net
+employeeNumber: 100
+pager: +1 729 460 7076
+sn: Ahad
+postalCode: 67465
+userPassword: {SSHA}PUudvJedxOgOFm1EdjF6GftxsGhUcLcvi+TOPA==
+description: This is the description for Aggy Ahad.
+l: Seattle
+cn: Aggy Ahad
+st: OK
+telephoneNumber: +1 360 654 0292
+givenName: Aggy
+uid: user.100
+homePhone: +1 084 482 5229
+entryUUID: f062e6ee-e23a-3ae6-849f-036ca338de9e
+
+dn: uid=user.101,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agna Ahdieh$03014 Adams Street$Raleigh, KY 79612
+initials: ASA
+street: 03014 Adams Street
+mobile: +1 621 664 5642
+mail: user.101@maildomain.net
+employeeNumber: 101
+pager: +1 802 412 0280
+sn: Ahdieh
+postalCode: 79612
+userPassword: {SSHA}T9RHIk4vG18/y2uHbNcu4ibzlqvS0fSYHngx3w==
+description: This is the description for Agna Ahdieh.
+l: Raleigh
+cn: Agna Ahdieh
+st: KY
+telephoneNumber: +1 180 100 5638
+givenName: Agna
+uid: user.101
+homePhone: +1 413 338 6699
+entryUUID: a0623989-0d7a-3b5c-89b2-119a2b0eec7e
+
+dn: uid=user.102,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agnella Ahlberg$21750 Cedar Street$Rockford, NM 82830
+initials: AUA
+street: 21750 Cedar Street
+mobile: +1 707 530 8887
+mail: user.102@maildomain.net
+employeeNumber: 102
+pager: +1 056 766 3050
+sn: Ahlberg
+postalCode: 82830
+userPassword: {SSHA}D3UMGmcIoHyfWESrVkQhbxGk+kHAI2TIih8KRQ==
+description: This is the description for Agnella Ahlberg.
+l: Rockford
+cn: Agnella Ahlberg
+st: NM
+telephoneNumber: +1 159 228 6760
+givenName: Agnella
+uid: user.102
+homePhone: +1 135 283 9857
+entryUUID: a344928c-2660-374e-b9e6-e5cf2f23a6f1
+
+dn: uid=user.103,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agnes Ahlers$91600 Ash Street$Sioux Falls, TX 97490
+initials: AFA
+street: 91600 Ash Street
+mobile: +1 580 205 7349
+mail: user.103@maildomain.net
+employeeNumber: 103
+pager: +1 770 903 6974
+sn: Ahlers
+postalCode: 97490
+userPassword: {SSHA}cByG96ZyFe7XjxTG+LmrueEYiAgM2oNGNkGqRg==
+description: This is the description for Agnes Ahlers.
+l: Sioux Falls
+cn: Agnes Ahlers
+st: TX
+telephoneNumber: +1 460 500 7604
+givenName: Agnes
+uid: user.103
+homePhone: +1 780 824 9200
+entryUUID: af7adce2-e955-398a-a8c0-4f2a6b1b140d
+
+dn: uid=user.104,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agnese Ahluwalia$62049 Spring Street$Gainesville, NE 78154
+initials: ASA
+street: 62049 Spring Street
+mobile: +1 103 336 5234
+mail: user.104@maildomain.net
+employeeNumber: 104
+pager: +1 804 574 4096
+sn: Ahluwalia
+postalCode: 78154
+userPassword: {SSHA}0unhBl9v4X5Gm1RmdaLR3rFmDjZjgrE4Esl3uw==
+description: This is the description for Agnese Ahluwalia.
+l: Gainesville
+cn: Agnese Ahluwalia
+st: NE
+telephoneNumber: +1 741 613 4601
+givenName: Agnese
+uid: user.104
+homePhone: +1 308 077 7369
+entryUUID: 280eb181-e09b-3e1c-b49a-cd9ad54b2fa0
+
+dn: uid=user.105,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agnesse Ahmad$32480 Highland Street$Louisville, NE 60198
+initials: AQA
+street: 32480 Highland Street
+mobile: +1 019 095 7012
+mail: user.105@maildomain.net
+employeeNumber: 105
+pager: +1 232 258 2040
+sn: Ahmad
+postalCode: 60198
+userPassword: {SSHA}1ZPzdSmICCaAo1zjUDLQ441u2u3QNbWu0UwMhg==
+description: This is the description for Agnesse Ahmad.
+l: Louisville
+cn: Agnesse Ahmad
+st: NE
+telephoneNumber: +1 734 700 8786
+givenName: Agnesse
+uid: user.105
+homePhone: +1 061 902 6608
+entryUUID: 6a18a4a1-f1e1-3461-aed7-6a3538ed782b
+
+dn: uid=user.106,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agneta Ahmadi$33308 Hillcrest Street$Sioux City, MS 83780
+initials: AAA
+street: 33308 Hillcrest Street
+mobile: +1 055 661 3058
+mail: user.106@maildomain.net
+employeeNumber: 106
+pager: +1 227 014 8618
+sn: Ahmadi
+postalCode: 83780
+userPassword: {SSHA}xfyhzG2Vxgqe/it60ChFeVBBrYMBS29EzSeB3g==
+description: This is the description for Agneta Ahmadi.
+l: Sioux City
+cn: Agneta Ahmadi
+st: MS
+telephoneNumber: +1 840 685 0012
+givenName: Agneta
+uid: user.106
+homePhone: +1 120 654 5680
+entryUUID: 693f79d4-791d-3b11-a070-29771134c5e4
+
+dn: uid=user.107,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agnola Ahmed$03361 Taylor Street$Parkersburg, HI 05609
+initials: AEA
+street: 03361 Taylor Street
+mobile: +1 734 407 4891
+mail: user.107@maildomain.net
+employeeNumber: 107
+pager: +1 748 565 0560
+sn: Ahmed
+postalCode: 05609
+userPassword: {SSHA}PHrUUTmqYoJDq4N8QGsv+HoJZHSIUfmAOsU5kg==
+description: This is the description for Agnola Ahmed.
+l: Parkersburg
+cn: Agnola Ahmed
+st: HI
+telephoneNumber: +1 759 254 0834
+givenName: Agnola
+uid: user.107
+homePhone: +1 700 592 3764
+entryUUID: e2d2021f-52d5-3f92-aad3-0aac17f02e45
+
+dn: uid=user.108,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Agretha Aidarous$08402 Sunset Street$South Bend, KY 63685
+initials: AVA
+street: 08402 Sunset Street
+mobile: +1 375 427 0490
+mail: user.108@maildomain.net
+employeeNumber: 108
+pager: +1 066 178 4400
+sn: Aidarous
+postalCode: 63685
+userPassword: {SSHA}sQhMNOlBCEEVEyGNB/TQO7pNNp6Ui8kKkhOeNA==
+description: This is the description for Agretha Aidarous.
+l: South Bend
+cn: Agretha Aidarous
+st: KY
+telephoneNumber: +1 049 440 0518
+givenName: Agretha
+uid: user.108
+homePhone: +1 266 032 9108
+entryUUID: 8676e35e-5fc4-3986-92d9-841e7956020e
+
+dn: uid=user.109,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ahmad Aiken$85010 Fourteenth Street$Wilkes Barre, OR 99500
+initials: AJA
+street: 85010 Fourteenth Street
+mobile: +1 255 831 4216
+mail: user.109@maildomain.net
+employeeNumber: 109
+pager: +1 431 506 1974
+sn: Aiken
+postalCode: 99500
+userPassword: {SSHA}f2MRyQkSpA9kGhTLyR6wUcLYesnzKq2lZBpSDQ==
+description: This is the description for Ahmad Aiken.
+l: Wilkes Barre
+cn: Ahmad Aiken
+st: OR
+telephoneNumber: +1 847 499 3670
+givenName: Ahmad
+uid: user.109
+homePhone: +1 170 102 1984
+entryUUID: 96222635-41ab-30da-a6ca-fe41ea220e16
+
+dn: uid=user.110,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ahmed Aimone$11096 Woodland Street$Cincinnati, ID 70099
+initials: AUA
+street: 11096 Woodland Street
+mobile: +1 326 209 2400
+mail: user.110@maildomain.net
+employeeNumber: 110
+pager: +1 088 117 0407
+sn: Aimone
+postalCode: 70099
+userPassword: {SSHA}DvXPG1XMm1ClYRh8vgWt82njcbhfV1kb6nN4ug==
+description: This is the description for Ahmed Aimone.
+l: Cincinnati
+cn: Ahmed Aimone
+st: ID
+telephoneNumber: +1 048 690 7659
+givenName: Ahmed
+uid: user.110
+homePhone: +1 305 050 1100
+entryUUID: a3efe04a-db73-3e60-8e46-7789d3b0eb3a
+
+dn: uid=user.111,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ahmet Ainsworth$06690 Laurel Street$Tyler, IL 31806
+initials: AQA
+street: 06690 Laurel Street
+mobile: +1 382 077 4180
+mail: user.111@maildomain.net
+employeeNumber: 111
+pager: +1 058 483 5178
+sn: Ainsworth
+postalCode: 31806
+userPassword: {SSHA}mvg4dPWnhD9O6ZguKEY+p7z8fDpdx5HgDg6y1w==
+description: This is the description for Ahmet Ainsworth.
+l: Tyler
+cn: Ahmet Ainsworth
+st: IL
+telephoneNumber: +1 896 751 0209
+givenName: Ahmet
+uid: user.111
+homePhone: +1 562 825 1241
+entryUUID: 4657e3bb-4e3e-33a2-94a0-0025819c4499
+
+dn: uid=user.112,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aida Aitken$28315 Madison Street$Dallas, SD 03907
+initials: AIA
+street: 28315 Madison Street
+mobile: +1 178 308 6074
+mail: user.112@maildomain.net
+employeeNumber: 112
+pager: +1 926 186 1231
+sn: Aitken
+postalCode: 03907
+userPassword: {SSHA}ImREPkIc9Hj4e9QRQ5M2elRJMvdCSkKn0KLqOQ==
+description: This is the description for Aida Aitken.
+l: Dallas
+cn: Aida Aitken
+st: SD
+telephoneNumber: +1 661 800 3577
+givenName: Aida
+uid: user.112
+homePhone: +1 464 269 2595
+entryUUID: 67e29b5c-991d-3896-9ee8-2ee9afe06d8d
+
+dn: uid=user.113,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aidan Ajersch$82394 Hillcrest Street$Tallahassee, MT 06060
+initials: AKA
+street: 82394 Hillcrest Street
+mobile: +1 532 624 5087
+mail: user.113@maildomain.net
+employeeNumber: 113
+pager: +1 020 169 2708
+sn: Ajersch
+postalCode: 06060
+userPassword: {SSHA}G7TJqfctOSQX8WVPV17iv3zLbHwRWYhsIt6lhw==
+description: This is the description for Aidan Ajersch.
+l: Tallahassee
+cn: Aidan Ajersch
+st: MT
+telephoneNumber: +1 718 961 8870
+givenName: Aidan
+uid: user.113
+homePhone: +1 308 468 9128
+entryUUID: e8926140-65f8-3fa4-8944-185a72741b08
+
+dn: uid=user.114,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aideen Akai$24950 Lake Street$Abilene, DC 71809
+initials: ACA
+street: 24950 Lake Street
+mobile: +1 345 339 6267
+mail: user.114@maildomain.net
+employeeNumber: 114
+pager: +1 758 117 0722
+sn: Akai
+postalCode: 71809
+userPassword: {SSHA}4m4GCdtZoLuhrVMsDuB75T3bUCNQbVRWuLc6jQ==
+description: This is the description for Aideen Akai.
+l: Abilene
+cn: Aideen Akai
+st: DC
+telephoneNumber: +1 247 514 9077
+givenName: Aideen
+uid: user.114
+homePhone: +1 537 140 2113
+entryUUID: dbcfc880-21e8-32b0-978e-a733b51e0f3a
+
+dn: uid=user.115,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aiden Akbas$98617 College Street$Hartford, IN 12077
+initials: APA
+street: 98617 College Street
+mobile: +1 282 239 8195
+mail: user.115@maildomain.net
+employeeNumber: 115
+pager: +1 735 204 6003
+sn: Akbas
+postalCode: 12077
+userPassword: {SSHA}SFFneyy/0XNlRHLMVGtU/x2dmdQMyOaAXjEpPw==
+description: This is the description for Aiden Akbas.
+l: Hartford
+cn: Aiden Akbas
+st: IN
+telephoneNumber: +1 690 652 1877
+givenName: Aiden
+uid: user.115
+homePhone: +1 047 057 5855
+entryUUID: ddd7fec3-f1b9-3b42-9792-8a63b81b845d
+
+dn: uid=user.116,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aigneis Akens$67700 Adams Street$Baltimore, VA 59045
+initials: AAA
+street: 67700 Adams Street
+mobile: +1 000 582 8988
+mail: user.116@maildomain.net
+employeeNumber: 116
+pager: +1 303 500 3222
+sn: Akens
+postalCode: 59045
+userPassword: {SSHA}N5P72LRn5Onj9jAvA/L3lxrevt6eUI8X0v6Q1w==
+description: This is the description for Aigneis Akens.
+l: Baltimore
+cn: Aigneis Akens
+st: VA
+telephoneNumber: +1 611 063 5842
+givenName: Aigneis
+uid: user.116
+homePhone: +1 782 191 5026
+entryUUID: 99bc09bd-ab79-3a18-9ce2-ac15e4808241
+
+dn: uid=user.117,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aila Akers$67033 Birch Street$Wichita FallsLawton, NC 73330
+initials: AHA
+street: 67033 Birch Street
+mobile: +1 474 018 9671
+mail: user.117@maildomain.net
+employeeNumber: 117
+pager: +1 956 130 0324
+sn: Akers
+postalCode: 73330
+userPassword: {SSHA}6xSEBvG9YHf1kUsq/VV8Rjpefyvzkb+1Naqm/g==
+description: This is the description for Aila Akers.
+l: Wichita FallsLawton
+cn: Aila Akers
+st: NC
+telephoneNumber: +1 909 720 0801
+givenName: Aila
+uid: user.117
+homePhone: +1 569 678 0220
+entryUUID: 55a2c0ed-31bd-3135-8715-35a5607d97a5
+
+dn: uid=user.118,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aile Akhavan$24313 Eleventh Street$Shreveport, NE 23071
+initials: AQA
+street: 24313 Eleventh Street
+mobile: +1 699 015 6299
+mail: user.118@maildomain.net
+employeeNumber: 118
+pager: +1 980 675 5041
+sn: Akhavan
+postalCode: 23071
+userPassword: {SSHA}DYjbbSY+oUJ+7/2hfdYWDM01OQVdbtycjyDIVg==
+description: This is the description for Aile Akhavan.
+l: Shreveport
+cn: Aile Akhavan
+st: NE
+telephoneNumber: +1 586 050 1611
+givenName: Aile
+uid: user.118
+homePhone: +1 078 034 4900
+entryUUID: 6153b43f-0d3e-3b22-9007-f8ff088a3565
+
+dn: uid=user.119,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailee Akhtar$82446 Williams Street$Bryan, ME 58057
+initials: AHA
+street: 82446 Williams Street
+mobile: +1 272 244 0701
+mail: user.119@maildomain.net
+employeeNumber: 119
+pager: +1 863 490 0370
+sn: Akhtar
+postalCode: 58057
+userPassword: {SSHA}ZzMoB7zihaDOKTdnIALh+mi3bqdFNbNC90Njdg==
+description: This is the description for Ailee Akhtar.
+l: Bryan
+cn: Ailee Akhtar
+st: ME
+telephoneNumber: +1 022 870 5284
+givenName: Ailee
+uid: user.119
+homePhone: +1 642 812 0676
+entryUUID: e9192ebd-95a8-3f7c-8aca-32489a02615c
+
+dn: uid=user.120,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aileen Akita$79703 Jackson Street$Saint Louis, IN 74219
+initials: AYA
+street: 79703 Jackson Street
+mobile: +1 939 001 2810
+mail: user.120@maildomain.net
+employeeNumber: 120
+pager: +1 139 083 1287
+sn: Akita
+postalCode: 74219
+userPassword: {SSHA}BoFQwHeZI8J9C65hXG2oKcNKZeorK6QQY72Ztw==
+description: This is the description for Aileen Akita.
+l: Saint Louis
+cn: Aileen Akita
+st: IN
+telephoneNumber: +1 420 810 8882
+givenName: Aileen
+uid: user.120
+homePhone: +1 244 249 3334
+entryUUID: 32506053-0fa5-32bf-ac5e-d015b27f5e4d
+
+dn: uid=user.121,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailene Akkermans$17400 South Street$Harlingen, TN 19702
+initials: AIA
+street: 17400 South Street
+mobile: +1 007 542 6180
+mail: user.121@maildomain.net
+employeeNumber: 121
+pager: +1 420 089 3242
+sn: Akkermans
+postalCode: 19702
+userPassword: {SSHA}QSlc0/muOAYpijWdDueoyvY+YNjUm5B6L95fhA==
+description: This is the description for Ailene Akkermans.
+l: Harlingen
+cn: Ailene Akkermans
+st: TN
+telephoneNumber: +1 000 337 6024
+givenName: Ailene
+uid: user.121
+homePhone: +1 191 240 7075
+entryUUID: 06ff295c-c73b-3044-9d03-c2365faabc13
+
+dn: uid=user.122,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailey Akrawi$00140 River Street$Wilkes Barre, SC 78264
+initials: AGA
+street: 00140 River Street
+mobile: +1 046 352 0456
+mail: user.122@maildomain.net
+employeeNumber: 122
+pager: +1 680 606 8308
+sn: Akrawi
+postalCode: 78264
+userPassword: {SSHA}Gzazj2wMDNGH7BSxIDVTAAj6g5ulB0KKzIESHA==
+description: This is the description for Ailey Akrawi.
+l: Wilkes Barre
+cn: Ailey Akrawi
+st: SC
+telephoneNumber: +1 928 267 7902
+givenName: Ailey
+uid: user.122
+homePhone: +1 265 279 7983
+entryUUID: 885f0c30-eb14-3b95-ad9c-bd6178afa9c0
+
+dn: uid=user.123,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aili Aksel$25785 Main Street$Oklahoma City, KS 60483
+initials: AVA
+street: 25785 Main Street
+mobile: +1 310 070 5510
+mail: user.123@maildomain.net
+employeeNumber: 123
+pager: +1 193 579 5510
+sn: Aksel
+postalCode: 60483
+userPassword: {SSHA}xD+AVP4f8XabIuCuo8SRJMg6HmpxOG3AS5o9tA==
+description: This is the description for Aili Aksel.
+l: Oklahoma City
+cn: Aili Aksel
+st: KS
+telephoneNumber: +1 558 831 4090
+givenName: Aili
+uid: user.123
+homePhone: +1 594 709 6410
+entryUUID: a4e2a6ac-eedf-3c1c-acb4-3f6ad2709ba1
+
+dn: uid=user.124,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailina Akyurekli$35188 Jackson Street$Lafayette, TX 02183
+initials: AUA
+street: 35188 Jackson Street
+mobile: +1 449 157 6478
+mail: user.124@maildomain.net
+employeeNumber: 124
+pager: +1 261 875 6915
+sn: Akyurekli
+postalCode: 02183
+userPassword: {SSHA}Jtk4OhP/S7+cxgUYNH8McfbadOdA15E5k/Zk6Q==
+description: This is the description for Ailina Akyurekli.
+l: Lafayette
+cn: Ailina Akyurekli
+st: TX
+telephoneNumber: +1 219 500 5031
+givenName: Ailina
+uid: user.124
+homePhone: +1 933 916 4827
+entryUUID: 72720470-e341-3366-9098-45967672abfb
+
+dn: uid=user.125,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailis Al$37808 Sixth Street$Lima, OR 03858
+initials: AXA
+street: 37808 Sixth Street
+mobile: +1 460 937 0032
+mail: user.125@maildomain.net
+employeeNumber: 125
+pager: +1 159 714 1979
+sn: Al
+postalCode: 03858
+userPassword: {SSHA}Hko29NZjT8DJGnBlrerS330+Kk7myzSIgu9X0A==
+description: This is the description for Ailis Al.
+l: Lima
+cn: Ailis Al
+st: OR
+telephoneNumber: +1 324 538 5300
+givenName: Ailis
+uid: user.125
+homePhone: +1 440 177 5461
+entryUUID: 95ba1566-e5cf-3050-8278-a16096c23410
+
+dn: uid=user.126,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailsun Al Bud$00739 Johnson Street$Pittsburgh, ME 96874
+initials: AMA
+street: 00739 Johnson Street
+mobile: +1 817 957 9505
+mail: user.126@maildomain.net
+employeeNumber: 126
+pager: +1 254 070 5684
+sn: Al Bud
+postalCode: 96874
+userPassword: {SSHA}aXRtb3cwMOiwryH1RwmLiYAzGyVZEBmrUpHiFQ==
+description: This is the description for Ailsun Al Bud.
+l: Pittsburgh
+cn: Ailsun Al Bud
+st: ME
+telephoneNumber: +1 556 379 0232
+givenName: Ailsun
+uid: user.126
+homePhone: +1 002 801 0951
+entryUUID: 1e6eb682-efa4-3b2a-bbbc-13f66dfa36f3
+
+dn: uid=user.127,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ailyn Al-Basi$60330 Cedar Street$Kirksville, VT 03414
+initials: AHA
+street: 60330 Cedar Street
+mobile: +1 335 929 3518
+mail: user.127@maildomain.net
+employeeNumber: 127
+pager: +1 628 458 7107
+sn: Al-Basi
+postalCode: 03414
+userPassword: {SSHA}5SK8lxBk/bgtZhTmoxRR0zVZN9coBTwA8pgRmQ==
+description: This is the description for Ailyn Al-Basi.
+l: Kirksville
+cn: Ailyn Al-Basi
+st: VT
+telephoneNumber: +1 060 562 2560
+givenName: Ailyn
+uid: user.127
+homePhone: +1 064 055 0960
+entryUUID: 38c36304-ef92-3a34-b0ec-7ff7e44ecd90
+
+dn: uid=user.128,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aime Al-Tarabichi$86068 North Street$Dayton, NY 24091
+initials: ARA
+street: 86068 North Street
+mobile: +1 866 362 8302
+mail: user.128@maildomain.net
+employeeNumber: 128
+pager: +1 303 437 4649
+sn: Al-Tarabichi
+postalCode: 24091
+userPassword: {SSHA}sNsji3rxI0ajiafQILRVTjoaafOJieyyNclW9g==
+description: This is the description for Aime Al-Tarabichi.
+l: Dayton
+cn: Aime Al-Tarabichi
+st: NY
+telephoneNumber: +1 080 073 6819
+givenName: Aime
+uid: user.128
+homePhone: +1 061 427 0766
+entryUUID: 0714e11f-1316-3808-b8ec-ae9a66172c14
+
+dn: uid=user.129,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aimee Aladangady$77541 Railroad Street$Bangor, CO 25010
+initials: AWA
+street: 77541 Railroad Street
+mobile: +1 416 990 3198
+mail: user.129@maildomain.net
+employeeNumber: 129
+pager: +1 084 572 0797
+sn: Aladangady
+postalCode: 25010
+userPassword: {SSHA}igV2oBe+vlgryGmWbzKRj4V3kRvNcGByCMJ/Jw==
+description: This is the description for Aimee Aladangady.
+l: Bangor
+cn: Aimee Aladangady
+st: CO
+telephoneNumber: +1 144 696 7166
+givenName: Aimee
+uid: user.129
+homePhone: +1 302 587 2099
+entryUUID: d73f1873-3365-3e77-b90f-5e9156448ba0
+
+dn: uid=user.130,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aimil Alanis$72001 Green Street$Davenport, CO 01381
+initials: AVA
+street: 72001 Green Street
+mobile: +1 494 023 3901
+mail: user.130@maildomain.net
+employeeNumber: 130
+pager: +1 184 709 2971
+sn: Alanis
+postalCode: 01381
+userPassword: {SSHA}vEAgJiYVqiag6TLXATI29QcQLwE+OKTdBDR4Ww==
+description: This is the description for Aimil Alanis.
+l: Davenport
+cn: Aimil Alanis
+st: CO
+telephoneNumber: +1 582 991 6580
+givenName: Aimil
+uid: user.130
+homePhone: +1 247 730 6738
+entryUUID: 08e9bf16-8442-3cc9-aa0a-813a729fa7ff
+
+dn: uid=user.131,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aindrea Alanoly$20572 North Street$Cheyenne, DC 93070
+initials: AOA
+street: 20572 North Street
+mobile: +1 006 073 9692
+mail: user.131@maildomain.net
+employeeNumber: 131
+pager: +1 903 798 6203
+sn: Alanoly
+postalCode: 93070
+userPassword: {SSHA}/x68G/fsnHEQ/kJzT9O9kSnXw627a/OkJBVxHQ==
+description: This is the description for Aindrea Alanoly.
+l: Cheyenne
+cn: Aindrea Alanoly
+st: DC
+telephoneNumber: +1 096 007 4535
+givenName: Aindrea
+uid: user.131
+homePhone: +1 769 640 0050
+entryUUID: fbed19bd-319a-35ec-95ed-068ac9a5b00b
+
+dn: uid=user.132,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ainslee Alary$01165 Mill Street$Chattanooga, NH 78249
+initials: AQA
+street: 01165 Mill Street
+mobile: +1 443 324 8459
+mail: user.132@maildomain.net
+employeeNumber: 132
+pager: +1 144 666 0393
+sn: Alary
+postalCode: 78249
+userPassword: {SSHA}9+9FzCcOlEeBubXGto9OE6il6HeHxLPxYO/fWA==
+description: This is the description for Ainslee Alary.
+l: Chattanooga
+cn: Ainslee Alary
+st: NH
+telephoneNumber: +1 364 107 4245
+givenName: Ainslee
+uid: user.132
+homePhone: +1 903 485 4613
+entryUUID: f6d266cc-1878-3bd4-8cee-ffb3651619fc
+
+dn: uid=user.133,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ainsley Alavi$36321 Laurel Street$Superior, NV 66210
+initials: ACA
+street: 36321 Laurel Street
+mobile: +1 203 605 5057
+mail: user.133@maildomain.net
+employeeNumber: 133
+pager: +1 401 474 2540
+sn: Alavi
+postalCode: 66210
+userPassword: {SSHA}GuuCbeakqp8952j3BFn5580Kf3EhDVXde5CENA==
+description: This is the description for Ainsley Alavi.
+l: Superior
+cn: Ainsley Alavi
+st: NV
+telephoneNumber: +1 003 797 0058
+givenName: Ainsley
+uid: user.133
+homePhone: +1 465 496 1456
+entryUUID: b424a8d8-c465-3b82-9c28-808f90b05fa7
+
+dn: uid=user.134,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ainslie Albea$02228 Taylor Street$Boise, MI 07707
+initials: AQA
+street: 02228 Taylor Street
+mobile: +1 337 680 4800
+mail: user.134@maildomain.net
+employeeNumber: 134
+pager: +1 089 951 0116
+sn: Albea
+postalCode: 07707
+userPassword: {SSHA}wE2ItQnt3LL43JXucDOZA9JRxIEuBphZTNo3/w==
+description: This is the description for Ainslie Albea.
+l: Boise
+cn: Ainslie Albea
+st: MI
+telephoneNumber: +1 294 759 0669
+givenName: Ainslie
+uid: user.134
+homePhone: +1 161 903 5083
+entryUUID: ca98de8f-4e0c-3160-bfff-2c2275ee538c
+
+dn: uid=user.135,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Air Albers$19040 Spruce Street$Medford, CT 20063
+initials: AMA
+street: 19040 Spruce Street
+mobile: +1 202 319 0267
+mail: user.135@maildomain.net
+employeeNumber: 135
+pager: +1 603 796 9597
+sn: Albers
+postalCode: 20063
+userPassword: {SSHA}FfYd0ncy1HzFClC3rv6DFI/8+g+rO/8qP0Xeyg==
+description: This is the description for Air Albers.
+l: Medford
+cn: Air Albers
+st: CT
+telephoneNumber: +1 151 060 0363
+givenName: Air
+uid: user.135
+homePhone: +1 675 016 2156
+entryUUID: 755cd3d8-37da-3aff-b39e-cbe50fc35826
+
+dn: uid=user.136,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ajay Alberse$65852 Chestnut Street$Jackson, MN 97333
+initials: AOA
+street: 65852 Chestnut Street
+mobile: +1 177 061 6952
+mail: user.136@maildomain.net
+employeeNumber: 136
+pager: +1 552 763 0550
+sn: Alberse
+postalCode: 97333
+userPassword: {SSHA}IJVR8nENVH2+b2R0kjfaPmQ3sekLv7bd72JUHw==
+description: This is the description for Ajay Alberse.
+l: Jackson
+cn: Ajay Alberse
+st: MN
+telephoneNumber: +1 072 538 0332
+givenName: Ajay
+uid: user.136
+homePhone: +1 130 643 6568
+entryUUID: c23675d8-8873-3465-94a6-69384a802695
+
+dn: uid=user.137,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ajit Albert$21816 Adams Street$New Orleans, TX 07830
+initials: AWA
+street: 21816 Adams Street
+mobile: +1 105 182 0594
+mail: user.137@maildomain.net
+employeeNumber: 137
+pager: +1 110 239 2620
+sn: Albert
+postalCode: 07830
+userPassword: {SSHA}xbBqTO7/bynWXJ7xj8EWPGUoprDxYRBR/mRG5A==
+description: This is the description for Ajit Albert.
+l: New Orleans
+cn: Ajit Albert
+st: TX
+telephoneNumber: +1 265 008 0439
+givenName: Ajit
+uid: user.137
+homePhone: +1 140 046 6288
+entryUUID: e58fe9db-cdba-31f2-a325-5632536d0989
+
+dn: uid=user.138,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ajmal Alberts$22207 Lake Street$Tuscaloosa, HI 96966
+initials: ATA
+street: 22207 Lake Street
+mobile: +1 709 590 1800
+mail: user.138@maildomain.net
+employeeNumber: 138
+pager: +1 615 160 5001
+sn: Alberts
+postalCode: 96966
+userPassword: {SSHA}p9bGoiOQir/CCzny1ILlK5tN/NuXJs8Ul+z2Sw==
+description: This is the description for Ajmal Alberts.
+l: Tuscaloosa
+cn: Ajmal Alberts
+st: HI
+telephoneNumber: +1 063 614 9057
+givenName: Ajmal
+uid: user.138
+homePhone: +1 100 804 3200
+entryUUID: b0e1e0fd-98af-3613-8e94-9896daac0d0f
+
+dn: uid=user.139,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ajoy Alberty$84736 Cedar Street$Presque Isle, MI 28969
+initials: ABA
+street: 84736 Cedar Street
+mobile: +1 986 448 9401
+mail: user.139@maildomain.net
+employeeNumber: 139
+pager: +1 077 890 6823
+sn: Alberty
+postalCode: 28969
+userPassword: {SSHA}6FrTuczEWdgHmEtE8Lj+szkD3JkvdmixR0FhjA==
+description: This is the description for Ajoy Alberty.
+l: Presque Isle
+cn: Ajoy Alberty
+st: MI
+telephoneNumber: +1 090 833 4068
+givenName: Ajoy
+uid: user.139
+homePhone: +1 597 005 9170
+entryUUID: 803b8821-2bfd-3640-8cc9-4f2a66a13055
+
+dn: uid=user.140,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akemi Albery$40335 Fourth Street$Riverton, OR 83096
+initials: AHA
+street: 40335 Fourth Street
+mobile: +1 390 052 2799
+mail: user.140@maildomain.net
+employeeNumber: 140
+pager: +1 408 180 8944
+sn: Albery
+postalCode: 83096
+userPassword: {SSHA}2EX56++dTGQqPj+XAJCouvpv/Fq/Gq9oARJCgA==
+description: This is the description for Akemi Albery.
+l: Riverton
+cn: Akemi Albery
+st: OR
+telephoneNumber: +1 027 072 8030
+givenName: Akemi
+uid: user.140
+homePhone: +1 779 828 3220
+entryUUID: 3b4f2f90-67d7-3c0b-93c4-db3536ff335d
+
+dn: uid=user.141,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akihiko Albrecht$99123 East Street$Amarillo, UT 75869
+initials: AFA
+street: 99123 East Street
+mobile: +1 468 285 2080
+mail: user.141@maildomain.net
+employeeNumber: 141
+pager: +1 920 966 0073
+sn: Albrecht
+postalCode: 75869
+userPassword: {SSHA}ot6JD9e9YlYmWdsMMvGKt6l2gfM7SWKukiF1UA==
+description: This is the description for Akihiko Albrecht.
+l: Amarillo
+cn: Akihiko Albrecht
+st: UT
+telephoneNumber: +1 081 911 9369
+givenName: Akihiko
+uid: user.141
+homePhone: +1 075 689 5175
+entryUUID: 309713ed-d0c5-38f4-a392-969c29d45544
+
+dn: uid=user.142,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akin Albright$50406 Jackson Street$Lubbock, AL 68300
+initials: AQA
+street: 50406 Jackson Street
+mobile: +1 614 013 7862
+mail: user.142@maildomain.net
+employeeNumber: 142
+pager: +1 159 404 8204
+sn: Albright
+postalCode: 68300
+userPassword: {SSHA}H1x9z6z9BAFEGdWudT1KQIvRoqT6CcqT10e5UQ==
+description: This is the description for Akin Albright.
+l: Lubbock
+cn: Akin Albright
+st: AL
+telephoneNumber: +1 007 803 4693
+givenName: Akin
+uid: user.142
+homePhone: +1 369 187 9224
+entryUUID: edf7a62f-100a-36ad-9178-e9afcf4c8a5d
+
+dn: uid=user.143,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akio Albritton$64224 Adams Street$Hattiesburg, AK 94943
+initials: AJA
+street: 64224 Adams Street
+mobile: +1 856 304 6317
+mail: user.143@maildomain.net
+employeeNumber: 143
+pager: +1 021 910 8417
+sn: Albritton
+postalCode: 94943
+userPassword: {SSHA}dlQH5tNiKy4EGcV6yMKmZ25mpKizUF7qYRMdfw==
+description: This is the description for Akio Albritton.
+l: Hattiesburg
+cn: Akio Albritton
+st: AK
+telephoneNumber: +1 595 438 2886
+givenName: Akio
+uid: user.143
+homePhone: +1 809 622 0828
+entryUUID: 8e6eb651-d072-35dc-be08-c18deec4dae1
+
+dn: uid=user.144,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akira Albtentac$29878 Locust Street$Medford, DC 35094
+initials: AJA
+street: 29878 Locust Street
+mobile: +1 695 774 4736
+mail: user.144@maildomain.net
+employeeNumber: 144
+pager: +1 099 128 3880
+sn: Albtentac
+postalCode: 35094
+userPassword: {SSHA}AbbgML8BnF4Ax83TupFg0Frm5n6d6ouAeaM5ag==
+description: This is the description for Akira Albtentac.
+l: Medford
+cn: Akira Albtentac
+st: DC
+telephoneNumber: +1 019 294 0859
+givenName: Akira
+uid: user.144
+homePhone: +1 528 195 0000
+entryUUID: d244d0f9-0546-35f8-b092-84ada196ba8e
+
+dn: uid=user.145,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akram Alburger$56007 Cedar Street$Durham, UT 10522
+initials: ADA
+street: 56007 Cedar Street
+mobile: +1 506 761 3756
+mail: user.145@maildomain.net
+employeeNumber: 145
+pager: +1 688 946 7309
+sn: Alburger
+postalCode: 10522
+userPassword: {SSHA}1/L5iWYDiYT+JLRs/4FGJC8vstJ1YPPtohiWQA==
+description: This is the description for Akram Alburger.
+l: Durham
+cn: Akram Alburger
+st: UT
+telephoneNumber: +1 362 016 4488
+givenName: Akram
+uid: user.145
+homePhone: +1 815 897 3006
+entryUUID: 9fb1526d-88c6-36c6-b1f3-2508debf5d71
+
+dn: uid=user.146,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Akshay Alcock$56439 Church Street$Monterey Bay Area, AR 38059
+initials: AKA
+street: 56439 Church Street
+mobile: +1 215 429 9509
+mail: user.146@maildomain.net
+employeeNumber: 146
+pager: +1 631 370 9989
+sn: Alcock
+postalCode: 38059
+userPassword: {SSHA}slSWnIFY++nO81Tqsr8ipUWGWENt0xN2AMrxOA==
+description: This is the description for Akshay Alcock.
+l: Monterey Bay Area
+cn: Akshay Alcock
+st: AR
+telephoneNumber: +1 877 278 7785
+givenName: Akshay
+uid: user.146
+homePhone: +1 150 704 6431
+entryUUID: 86ec2d1a-fecb-3d9e-8301-fda3217ab24e
+
+dn: uid=user.147,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Al Alcott$15906 Williams Street$Medford, NM 13163
+initials: ADA
+street: 15906 Williams Street
+mobile: +1 400 342 4530
+mail: user.147@maildomain.net
+employeeNumber: 147
+pager: +1 080 824 4968
+sn: Alcott
+postalCode: 13163
+userPassword: {SSHA}F02a7DrvSN1jnhyK/xPntAbSM0RUB+0RV1hGTQ==
+description: This is the description for Al Alcott.
+l: Medford
+cn: Al Alcott
+st: NM
+telephoneNumber: +1 355 134 7450
+givenName: Al
+uid: user.147
+homePhone: +1 997 052 7109
+entryUUID: ddae5069-a320-3ee9-b465-8abd11389624
+
+dn: uid=user.148,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aladin Alderdice$23402 Thirteenth Street$Scranton, AZ 00631
+initials: AQA
+street: 23402 Thirteenth Street
+mobile: +1 317 809 0410
+mail: user.148@maildomain.net
+employeeNumber: 148
+pager: +1 005 456 3813
+sn: Alderdice
+postalCode: 00631
+userPassword: {SSHA}mzpcVLwrA+uXNYeXlUHyj19Pq7x1CadUf0s7pQ==
+description: This is the description for Aladin Alderdice.
+l: Scranton
+cn: Aladin Alderdice
+st: AZ
+telephoneNumber: +1 569 058 9267
+givenName: Aladin
+uid: user.148
+homePhone: +1 008 555 6201
+entryUUID: fbdbb411-e4aa-3fc2-b022-d6e9f12e8db5
+
+dn: uid=user.149,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alain Aldhizer$92971 Spring Street$Denver, OR 08221
+initials: ABA
+street: 92971 Spring Street
+mobile: +1 013 767 3580
+mail: user.149@maildomain.net
+employeeNumber: 149
+pager: +1 952 061 2155
+sn: Aldhizer
+postalCode: 08221
+userPassword: {SSHA}Wqgll4SUli9bU/bRQd8oXGYRKAUHg4YIeDX0zw==
+description: This is the description for Alain Aldhizer.
+l: Denver
+cn: Alain Aldhizer
+st: OR
+telephoneNumber: +1 614 761 0509
+givenName: Alain
+uid: user.149
+homePhone: +1 371 571 2111
+entryUUID: b8983f19-844c-3960-ae1a-36cfbfde8be1
+
+dn: uid=user.150,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alaine Aldridge$90984 Center Street$Knoxville, KS 47917
+initials: ABA
+street: 90984 Center Street
+mobile: +1 037 483 0187
+mail: user.150@maildomain.net
+employeeNumber: 150
+pager: +1 905 314 0915
+sn: Aldridge
+postalCode: 47917
+userPassword: {SSHA}td3F4ld9odKPXbByRicTgruRXBEal+Y3i+6X4w==
+description: This is the description for Alaine Aldridge.
+l: Knoxville
+cn: Alaine Aldridge
+st: KS
+telephoneNumber: +1 779 391 8931
+givenName: Alaine
+uid: user.150
+homePhone: +1 006 054 0425
+entryUUID: f6f1fc66-4f04-3c01-be19-4a507063668c
+
+dn: uid=user.151,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alameda Alegre$03115 Second Street$Wheeling, SD 56720
+initials: AUA
+street: 03115 Second Street
+mobile: +1 940 812 5534
+mail: user.151@maildomain.net
+employeeNumber: 151
+pager: +1 267 206 6502
+sn: Alegre
+postalCode: 56720
+userPassword: {SSHA}S5pBUDpRE0QIjJtMdbsAaia/qBlkf8w0F3AdyA==
+description: This is the description for Alameda Alegre.
+l: Wheeling
+cn: Alameda Alegre
+st: SD
+telephoneNumber: +1 730 069 5777
+givenName: Alameda
+uid: user.151
+homePhone: +1 921 879 5016
+entryUUID: d70461fe-163f-3dae-8640-79377eeb68c7
+
+dn: uid=user.152,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alan Aleksic$58060 Johnson Street$Tuscaloosa, MN 86682
+initials: AWA
+street: 58060 Johnson Street
+mobile: +1 851 007 0501
+mail: user.152@maildomain.net
+employeeNumber: 152
+pager: +1 320 016 2864
+sn: Aleksic
+postalCode: 86682
+userPassword: {SSHA}dLZFBn8RsRSRXDbfZ8pfpqGi1SNswN5i/a858A==
+description: This is the description for Alan Aleksic.
+l: Tuscaloosa
+cn: Alan Aleksic
+st: MN
+telephoneNumber: +1 193 112 3700
+givenName: Alan
+uid: user.152
+homePhone: +1 693 468 5584
+entryUUID: 43f5330e-4b46-32fe-ac63-b7249c2d1d7f
+
+dn: uid=user.153,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alana Aleong$80679 Eighth Street$Steubenville, AK 31255
+initials: AWA
+street: 80679 Eighth Street
+mobile: +1 722 614 8828
+mail: user.153@maildomain.net
+employeeNumber: 153
+pager: +1 025 927 7764
+sn: Aleong
+postalCode: 31255
+userPassword: {SSHA}cXic0mZYUL+eH29g4zx4gy/eynLOFP/GxbQ8VQ==
+description: This is the description for Alana Aleong.
+l: Steubenville
+cn: Alana Aleong
+st: AK
+telephoneNumber: +1 509 194 4130
+givenName: Alana
+uid: user.153
+homePhone: +1 759 295 4666
+entryUUID: 0202caa4-9f81-3b82-b026-48b6c56f0f70
+
+dn: uid=user.154,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alanah Alexan$80610 Broadway Street$Baton Rouge, FL 96770
+initials: ALA
+street: 80610 Broadway Street
+mobile: +1 270 369 2740
+mail: user.154@maildomain.net
+employeeNumber: 154
+pager: +1 020 646 6141
+sn: Alexan
+postalCode: 96770
+userPassword: {SSHA}BYRD1ftYDejAN47z/0nxVQxdAlK+6Kiz9XqkOw==
+description: This is the description for Alanah Alexan.
+l: Baton Rouge
+cn: Alanah Alexan
+st: FL
+telephoneNumber: +1 075 836 9908
+givenName: Alanah
+uid: user.154
+homePhone: +1 570 495 7073
+entryUUID: 8b45af2b-83d4-349c-a63f-2ff80b3da6a1
+
+dn: uid=user.155,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alane Alexander$02411 Thirteenth Street$Little Rock, MO 90996
+initials: ADA
+street: 02411 Thirteenth Street
+mobile: +1 630 110 9369
+mail: user.155@maildomain.net
+employeeNumber: 155
+pager: +1 087 776 4013
+sn: Alexander
+postalCode: 90996
+userPassword: {SSHA}IrMZR0pPkk2b3UjzFDbpkpiJEg3suXCkND7Opw==
+description: This is the description for Alane Alexander.
+l: Little Rock
+cn: Alane Alexander
+st: MO
+telephoneNumber: +1 455 145 7045
+givenName: Alane
+uid: user.155
+homePhone: +1 059 169 2509
+entryUUID: 7b524771-6347-3eae-a91f-804d6bfbd820
+
+dn: uid=user.156,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alanna Alexson$79066 Third Street$Anniston, SD 83399
+initials: ASA
+street: 79066 Third Street
+mobile: +1 453 207 6009
+mail: user.156@maildomain.net
+employeeNumber: 156
+pager: +1 356 607 2014
+sn: Alexson
+postalCode: 83399
+userPassword: {SSHA}qgr/cp5G+1MBqz4LHoc/biik3oJ4vc2mIt1koQ==
+description: This is the description for Alanna Alexson.
+l: Anniston
+cn: Alanna Alexson
+st: SD
+telephoneNumber: +1 798 100 8038
+givenName: Alanna
+uid: user.156
+homePhone: +1 198 876 3346
+entryUUID: e37761b1-b037-3620-a821-876668ee0b3b
+
+dn: uid=user.157,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alasdair Alfaro$06000 Willow Street$Fort Myers, ME 43965
+initials: AHA
+street: 06000 Willow Street
+mobile: +1 580 745 7099
+mail: user.157@maildomain.net
+employeeNumber: 157
+pager: +1 650 528 0125
+sn: Alfaro
+postalCode: 43965
+userPassword: {SSHA}WYSdJKAqam3ftUIuhL7CIoUyMIObHPa/HW3Kvg==
+description: This is the description for Alasdair Alfaro.
+l: Fort Myers
+cn: Alasdair Alfaro
+st: ME
+telephoneNumber: +1 560 473 1894
+givenName: Alasdair
+uid: user.157
+homePhone: +1 914 624 4214
+entryUUID: a94596ac-d155-37ce-be6a-f3522e5ae977
+
+dn: uid=user.158,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alastair Alford$41340 Tenth Street$Austin, NM 47820
+initials: ASA
+street: 41340 Tenth Street
+mobile: +1 207 053 0856
+mail: user.158@maildomain.net
+employeeNumber: 158
+pager: +1 760 369 4823
+sn: Alford
+postalCode: 47820
+userPassword: {SSHA}3G7t1L/tZArkujsFxOrh5J4mUTQruh7nQTvHLg==
+description: This is the description for Alastair Alford.
+l: Austin
+cn: Alastair Alford
+st: NM
+telephoneNumber: +1 055 780 0641
+givenName: Alastair
+uid: user.158
+homePhone: +1 097 789 4587
+entryUUID: 9454af7e-2d0f-375e-a906-0b97b63e1f7f
+
+dn: uid=user.159,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alayne Alfred$60006 Jefferson Street$Twin Falls, ID 08562
+initials: AGA
+street: 60006 Jefferson Street
+mobile: +1 087 462 4204
+mail: user.159@maildomain.net
+employeeNumber: 159
+pager: +1 960 526 4680
+sn: Alfred
+postalCode: 08562
+userPassword: {SSHA}w5BuIG2skIn2BB3IGUxibIjr3+IlFsYwY3pXkg==
+description: This is the description for Alayne Alfred.
+l: Twin Falls
+cn: Alayne Alfred
+st: ID
+telephoneNumber: +1 995 614 4118
+givenName: Alayne
+uid: user.159
+homePhone: +1 760 843 8330
+entryUUID: deb831a5-5a40-3f88-b2ab-72ea1dfac217
+
+dn: uid=user.160,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alb Algie$24723 Highland Street$Sioux Falls, KS 07001
+initials: AXA
+street: 24723 Highland Street
+mobile: +1 652 783 8749
+mail: user.160@maildomain.net
+employeeNumber: 160
+pager: +1 150 824 6974
+sn: Algie
+postalCode: 07001
+userPassword: {SSHA}3AM0Y1puyoRm7pYhmQ4F2PALHHLlWZuS40kvtA==
+description: This is the description for Alb Algie.
+l: Sioux Falls
+cn: Alb Algie
+st: KS
+telephoneNumber: +1 935 781 1142
+givenName: Alb
+uid: user.160
+homePhone: +1 611 100 7887
+entryUUID: 3462e422-b7a9-3a32-aa18-926aff67b983
+
+dn: uid=user.161,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Albert Algood$98355 Pine Street$Louisville, ND 93450
+initials: AXA
+street: 98355 Pine Street
+mobile: +1 415 684 4122
+mail: user.161@maildomain.net
+employeeNumber: 161
+pager: +1 357 080 0802
+sn: Algood
+postalCode: 93450
+userPassword: {SSHA}MTRe3uLdSIo1TvEvqYwC1cR2uZCyLuj3eKfhNA==
+description: This is the description for Albert Algood.
+l: Louisville
+cn: Albert Algood
+st: ND
+telephoneNumber: +1 496 913 4004
+givenName: Albert
+uid: user.161
+homePhone: +1 084 327 8085
+entryUUID: 3a9dffc3-080a-317e-879a-ed72454cd887
+
+dn: uid=user.162,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alberta Alguire$04993 Franklin Street$Baltimore, PA 36259
+initials: AEA
+street: 04993 Franklin Street
+mobile: +1 945 273 8672
+mail: user.162@maildomain.net
+employeeNumber: 162
+pager: +1 061 790 1296
+sn: Alguire
+postalCode: 36259
+userPassword: {SSHA}h46fOy6erGJhqg3zFXMJMimsQzzGiWdhcs5nvw==
+description: This is the description for Alberta Alguire.
+l: Baltimore
+cn: Alberta Alguire
+st: PA
+telephoneNumber: +1 554 726 6165
+givenName: Alberta
+uid: user.162
+homePhone: +1 089 695 0644
+entryUUID: 01b65b2a-44cd-3b8e-99a3-897014f5f18c
+
+dn: uid=user.163,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Albertina Ali$70371 Church Street$Phoenix, CT 52053
+initials: ATA
+street: 70371 Church Street
+mobile: +1 808 462 7505
+mail: user.163@maildomain.net
+employeeNumber: 163
+pager: +1 592 737 7220
+sn: Ali
+postalCode: 52053
+userPassword: {SSHA}IE2EfU1Xtw4ln33tmQFt06mjqjf+Y0OjAJHbzA==
+description: This is the description for Albertina Ali.
+l: Phoenix
+cn: Albertina Ali
+st: CT
+telephoneNumber: +1 310 906 4201
+givenName: Albertina
+uid: user.163
+homePhone: +1 715 726 0733
+entryUUID: 3c04653f-415c-3469-91d9-9268f8b84631
+
+dn: uid=user.164,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Albertine Alidina$02032 Tenth Street$Amarillo, AR 79158
+initials: ANA
+street: 02032 Tenth Street
+mobile: +1 531 620 8451
+mail: user.164@maildomain.net
+employeeNumber: 164
+pager: +1 547 877 8604
+sn: Alidina
+postalCode: 79158
+userPassword: {SSHA}BfLpDM0bxulb/uGZc0c3uDKyp6bTMB4udew+3A==
+description: This is the description for Albertine Alidina.
+l: Amarillo
+cn: Albertine Alidina
+st: AR
+telephoneNumber: +1 705 875 1000
+givenName: Albertine
+uid: user.164
+homePhone: +1 646 007 0985
+entryUUID: 8b76b052-6d7d-3ad5-af12-c4a1e38a4ca8
+
+dn: uid=user.165,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Albina Alie$52723 Dogwood Street$Bend, CO 67843
+initials: AVA
+street: 52723 Dogwood Street
+mobile: +1 902 095 2667
+mail: user.165@maildomain.net
+employeeNumber: 165
+pager: +1 002 240 9134
+sn: Alie
+postalCode: 67843
+userPassword: {SSHA}4tv/2E2XgeIkazdjZnVzzS1FOqlMJ0Zws4de+Q==
+description: This is the description for Albina Alie.
+l: Bend
+cn: Albina Alie
+st: CO
+telephoneNumber: +1 099 202 5796
+givenName: Albina
+uid: user.165
+homePhone: +1 056 446 1930
+entryUUID: 264f6ff7-f683-39f2-8052-b6128a64c8f5
+
+dn: uid=user.166,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Albrecht Alikhan$33333 Park Street$Green Bay, NE 65987
+initials: AHA
+street: 33333 Park Street
+mobile: +1 166 150 8957
+mail: user.166@maildomain.net
+employeeNumber: 166
+pager: +1 197 404 2473
+sn: Alikhan
+postalCode: 65987
+userPassword: {SSHA}AM3cNUlj601gCX0BUkuRrPxFyvsJ4SOIEoNDww==
+description: This is the description for Albrecht Alikhan.
+l: Green Bay
+cn: Albrecht Alikhan
+st: NE
+telephoneNumber: +1 742 920 9009
+givenName: Albrecht
+uid: user.166
+homePhone: +1 007 806 1380
+entryUUID: 7c5f9da8-1b50-36ad-8249-270e8c32452e
+
+dn: uid=user.167,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aldo Alink$36401 Wilson Street$Saint Paul, IL 19531
+initials: AGA
+street: 36401 Wilson Street
+mobile: +1 950 120 5798
+mail: user.167@maildomain.net
+employeeNumber: 167
+pager: +1 029 256 5180
+sn: Alink
+postalCode: 19531
+userPassword: {SSHA}1T3nLfMRuckDZ+l9OT4yUs43MniaxjsChxP9RA==
+description: This is the description for Aldo Alink.
+l: Saint Paul
+cn: Aldo Alink
+st: IL
+telephoneNumber: +1 630 256 0670
+givenName: Aldo
+uid: user.167
+homePhone: +1 529 085 1538
+entryUUID: d6263d58-5611-3602-ad2d-fb3f2dd3f624
+
+dn: uid=user.168,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alec Alkire$68110 Tenth Street$New Orleans, MI 41489
+initials: ADA
+street: 68110 Tenth Street
+mobile: +1 277 209 4175
+mail: user.168@maildomain.net
+employeeNumber: 168
+pager: +1 531 073 5739
+sn: Alkire
+postalCode: 41489
+userPassword: {SSHA}UlmTvI503up35iK/H5OkKY/1ot21BUvW1F68KA==
+description: This is the description for Alec Alkire.
+l: New Orleans
+cn: Alec Alkire
+st: MI
+telephoneNumber: +1 980 550 3439
+givenName: Alec
+uid: user.168
+homePhone: +1 816 928 0349
+entryUUID: dc7d2e92-711a-352c-811a-51932d7e41d0
+
+dn: uid=user.169,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alecia Allahdin$09569 Cherry Street$Tampa Bay, DC 90902
+initials: AUA
+street: 09569 Cherry Street
+mobile: +1 211 087 2372
+mail: user.169@maildomain.net
+employeeNumber: 169
+pager: +1 015 082 4676
+sn: Allahdin
+postalCode: 90902
+userPassword: {SSHA}BEY5kk675fdl52RzPzu2oC2J4jQVtfJwDQWYKg==
+description: This is the description for Alecia Allahdin.
+l: Tampa Bay
+cn: Alecia Allahdin
+st: DC
+telephoneNumber: +1 800 381 1505
+givenName: Alecia
+uid: user.169
+homePhone: +1 454 951 5627
+entryUUID: 0b79945a-67f0-39a6-b4bf-3c59e9b11115
+
+dn: uid=user.170,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aleda Allahyari$87520 Spruce Street$Charleston, UT 69501
+initials: AHA
+street: 87520 Spruce Street
+mobile: +1 304 746 6975
+mail: user.170@maildomain.net
+employeeNumber: 170
+pager: +1 995 989 6908
+sn: Allahyari
+postalCode: 69501
+userPassword: {SSHA}u1BKnvOHVA5AIsPdKJRR/jssbOoCI1yTr0M64A==
+description: This is the description for Aleda Allahyari.
+l: Charleston
+cn: Aleda Allahyari
+st: UT
+telephoneNumber: +1 259 894 2875
+givenName: Aleda
+uid: user.170
+homePhone: +1 467 509 1469
+entryUUID: e7719e9a-026a-36b9-bfe3-ae916d903fc2
+
+dn: uid=user.171,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aleece Allam$37115 Lee Street$Flint, NE 25550
+initials: AMA
+street: 37115 Lee Street
+mobile: +1 161 527 1973
+mail: user.171@maildomain.net
+employeeNumber: 171
+pager: +1 483 360 5616
+sn: Allam
+postalCode: 25550
+userPassword: {SSHA}NH0Y+Qzf616ubeRwuk9/Wj74mlTPZppWGrko8g==
+description: This is the description for Aleece Allam.
+l: Flint
+cn: Aleece Allam
+st: NE
+telephoneNumber: +1 021 349 9307
+givenName: Aleece
+uid: user.171
+homePhone: +1 524 115 2245
+entryUUID: 4db9e165-139c-343d-9e87-d161a57c7227
+
+dn: uid=user.172,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aleen Allaman$10409 Miller Street$Orlando, NE 03226
+initials: AFA
+street: 10409 Miller Street
+mobile: +1 792 075 2293
+mail: user.172@maildomain.net
+employeeNumber: 172
+pager: +1 392 469 9056
+sn: Allaman
+postalCode: 03226
+userPassword: {SSHA}i2+FkgeJzJ1cMxCekRjrMR38umLT+imcQBOy/w==
+description: This is the description for Aleen Allaman.
+l: Orlando
+cn: Aleen Allaman
+st: NE
+telephoneNumber: +1 759 269 0181
+givenName: Aleen
+uid: user.172
+homePhone: +1 277 838 8016
+entryUUID: 33130dff-7929-30a8-9b28-6b21dc44b7b2
+
+dn: uid=user.173,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alejandra Allan$11184 Highland Street$Saint Paul, NM 90567
+initials: AHA
+street: 11184 Highland Street
+mobile: +1 361 261 0035
+mail: user.173@maildomain.net
+employeeNumber: 173
+pager: +1 008 229 9642
+sn: Allan
+postalCode: 90567
+userPassword: {SSHA}ph8Ryf/NZT+DH7CluIhatjOGfyeus/Z+qnJ5RQ==
+description: This is the description for Alejandra Allan.
+l: Saint Paul
+cn: Alejandra Allan
+st: NM
+telephoneNumber: +1 016 235 9005
+givenName: Alejandra
+uid: user.173
+homePhone: +1 757 609 9550
+entryUUID: 82c33b21-de06-310d-9421-dca76f4e653f
+
+dn: uid=user.174,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alejandrina Allard$78029 Eleventh Street$Steubenville, WY 03736
+initials: AFA
+street: 78029 Eleventh Street
+mobile: +1 150 288 5817
+mail: user.174@maildomain.net
+employeeNumber: 174
+pager: +1 108 116 3900
+sn: Allard
+postalCode: 03736
+userPassword: {SSHA}HZPdtd82Hxxl0F+uDzwZM+1KmfTSqgK5WJMcGA==
+description: This is the description for Alejandrina Allard.
+l: Steubenville
+cn: Alejandrina Allard
+st: WY
+telephoneNumber: +1 612 538 0004
+givenName: Alejandrina
+uid: user.174
+homePhone: +1 299 978 2708
+entryUUID: d73b0236-0156-3ae1-944b-3285417be4b2
+
+dn: uid=user.175,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alena Allaway$44603 Oak Street$Alpena, OR 01916
+initials: AJA
+street: 44603 Oak Street
+mobile: +1 809 450 3887
+mail: user.175@maildomain.net
+employeeNumber: 175
+pager: +1 624 151 9660
+sn: Allaway
+postalCode: 01916
+userPassword: {SSHA}RtwgI+hP4BWZIK482SXZCsBfbKmn9XEJAu/u6A==
+description: This is the description for Alena Allaway.
+l: Alpena
+cn: Alena Allaway
+st: OR
+telephoneNumber: +1 532 021 0005
+givenName: Alena
+uid: user.175
+homePhone: +1 270 094 3450
+entryUUID: 3cea3203-35bb-3484-82db-fbf276990e6f
+
+dn: uid=user.176,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alene Allaye-Chan$93965 Hickory Street$Santa Barbara, FL 08054
+initials: AMA
+street: 93965 Hickory Street
+mobile: +1 298 877 0000
+mail: user.176@maildomain.net
+employeeNumber: 176
+pager: +1 893 827 6831
+sn: Allaye-Chan
+postalCode: 08054
+userPassword: {SSHA}gyRNrRt/mYTaLJq4e1rZXH9/J67JF8wvu5htvQ==
+description: This is the description for Alene Allaye-Chan.
+l: Santa Barbara
+cn: Alene Allaye-Chan
+st: FL
+telephoneNumber: +1 066 032 4911
+givenName: Alene
+uid: user.176
+homePhone: +1 447 021 9599
+entryUUID: 1159921d-439d-30a8-b848-f0e4515673f3
+
+dn: uid=user.177,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alese Allen$08827 Willow Street$Wilkes Barre, CT 54604
+initials: ALA
+street: 08827 Willow Street
+mobile: +1 081 138 4657
+mail: user.177@maildomain.net
+employeeNumber: 177
+pager: +1 717 606 7984
+sn: Allen
+postalCode: 54604
+userPassword: {SSHA}tNV3Pikri2W03ezq3dj/36rb3YgsVnbCFJgUAQ==
+description: This is the description for Alese Allen.
+l: Wilkes Barre
+cn: Alese Allen
+st: CT
+telephoneNumber: +1 667 586 1148
+givenName: Alese
+uid: user.177
+homePhone: +1 040 507 4007
+entryUUID: 83507f5b-44e4-3803-a60f-25f821de3b5d
+
+dn: uid=user.178,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alessandra Alles$63002 Taylor Street$Portland, NY 11295
+initials: ALA
+street: 63002 Taylor Street
+mobile: +1 367 623 0709
+mail: user.178@maildomain.net
+employeeNumber: 178
+pager: +1 077 836 7923
+sn: Alles
+postalCode: 11295
+userPassword: {SSHA}EuY9pcQNaXT7B2aemUbhKJKUj98wOiuCJJqMvA==
+description: This is the description for Alessandra Alles.
+l: Portland
+cn: Alessandra Alles
+st: NY
+telephoneNumber: +1 254 473 9027
+givenName: Alessandra
+uid: user.178
+homePhone: +1 360 086 3018
+entryUUID: 7722234a-c973-36e9-b1b9-8feabeaa1753
+
+dn: uid=user.179,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aleta Alleva$72091 Hillcrest Street$Memphis, MI 13921
+initials: AGA
+street: 72091 Hillcrest Street
+mobile: +1 807 207 3702
+mail: user.179@maildomain.net
+employeeNumber: 179
+pager: +1 340 464 1398
+sn: Alleva
+postalCode: 13921
+userPassword: {SSHA}IeF4GhEzbMq2WQSN0Wp2tJG1tvni/glyJvnO3A==
+description: This is the description for Aleta Alleva.
+l: Memphis
+cn: Aleta Alleva
+st: MI
+telephoneNumber: +1 030 217 9147
+givenName: Aleta
+uid: user.179
+homePhone: +1 220 081 2938
+entryUUID: 32242049-ff56-328f-9123-0a094fd1e453
+
+dn: uid=user.180,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alethea Alleyne$77724 Spruce Street$Saint Paul, MN 25941
+initials: AFA
+street: 77724 Spruce Street
+mobile: +1 302 000 8396
+mail: user.180@maildomain.net
+employeeNumber: 180
+pager: +1 180 912 4406
+sn: Alleyne
+postalCode: 25941
+userPassword: {SSHA}G9CqN0yxGQKk34QU2W5vGWJM1YEGIPuYjO8UEA==
+description: This is the description for Alethea Alleyne.
+l: Saint Paul
+cn: Alethea Alleyne
+st: MN
+telephoneNumber: +1 346 177 1940
+givenName: Alethea
+uid: user.180
+homePhone: +1 809 394 2967
+entryUUID: de83e15e-75db-3af2-a7bf-ee6be6e61c11
+
+dn: uid=user.181,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alev Allgood$95249 Fourteenth Street$Binghamton, ME 78666
+initials: ARA
+street: 95249 Fourteenth Street
+mobile: +1 400 861 1899
+mail: user.181@maildomain.net
+employeeNumber: 181
+pager: +1 940 202 9800
+sn: Allgood
+postalCode: 78666
+userPassword: {SSHA}1CHgqqQszQ8IX9MZWK+FZwaavwiXITEVtFkuZA==
+description: This is the description for Alev Allgood.
+l: Binghamton
+cn: Alev Allgood
+st: ME
+telephoneNumber: +1 880 469 9301
+givenName: Alev
+uid: user.181
+homePhone: +1 524 357 3881
+entryUUID: d7d63d6f-98ce-3176-a8e7-2bfe2d42c696
+
+dn: uid=user.182,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alex Allison$56888 Birch Street$Palm Springs, MS 20053
+initials: AKA
+street: 56888 Birch Street
+mobile: +1 927 863 0700
+mail: user.182@maildomain.net
+employeeNumber: 182
+pager: +1 672 928 5922
+sn: Allison
+postalCode: 20053
+userPassword: {SSHA}Wpl3dTfyFzAz1KXRWYySq1rvcSXkt1Gtq0FE9A==
+description: This is the description for Alex Allison.
+l: Palm Springs
+cn: Alex Allison
+st: MS
+telephoneNumber: +1 638 657 3556
+givenName: Alex
+uid: user.182
+homePhone: +1 339 520 8024
+entryUUID: f31d42a7-127c-36c8-ac45-5385f754e75d
+
+dn: uid=user.183,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexa Allman$99993 Spruce Street$Bakersfield, MS 54627
+initials: AZA
+street: 99993 Spruce Street
+mobile: +1 184 851 5944
+mail: user.183@maildomain.net
+employeeNumber: 183
+pager: +1 260 755 1326
+sn: Allman
+postalCode: 54627
+userPassword: {SSHA}t8OS38EuS6Dw+AFsGzRdsCr8FcpzC1TYlaIVNw==
+description: This is the description for Alexa Allman.
+l: Bakersfield
+cn: Alexa Allman
+st: MS
+telephoneNumber: +1 411 037 6252
+givenName: Alexa
+uid: user.183
+homePhone: +1 025 090 0078
+entryUUID: 3c1a8ae7-ea7d-3eec-b0e4-f631f8947b9f
+
+dn: uid=user.184,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexander Allwork$04021 Highland Street$Little Rock, FL 47144
+initials: AGA
+street: 04021 Highland Street
+mobile: +1 013 011 0680
+mail: user.184@maildomain.net
+employeeNumber: 184
+pager: +1 495 374 0502
+sn: Allwork
+postalCode: 47144
+userPassword: {SSHA}u8t+nFjjvsaLqYU+fp++D7GcLaNOuZ28vu3hOw==
+description: This is the description for Alexander Allwork.
+l: Little Rock
+cn: Alexander Allwork
+st: FL
+telephoneNumber: +1 508 028 4327
+givenName: Alexander
+uid: user.184
+homePhone: +1 069 667 0295
+entryUUID: a940648d-1fa0-39ea-9bca-9671b2c5a290
+
+dn: uid=user.185,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexandra Almeddahim$45309 Locust Street$Marquette, NH 08380
+initials: ASA
+street: 45309 Locust Street
+mobile: +1 500 032 9808
+mail: user.185@maildomain.net
+employeeNumber: 185
+pager: +1 455 693 1726
+sn: Almeddahim
+postalCode: 08380
+userPassword: {SSHA}SaLdbmQkO31eqgVbaSjFkZIeqhVstxYSXfGHww==
+description: This is the description for Alexandra Almeddahim.
+l: Marquette
+cn: Alexandra Almeddahim
+st: NH
+telephoneNumber: +1 800 576 9535
+givenName: Alexandra
+uid: user.185
+homePhone: +1 008 007 1481
+entryUUID: d5589516-fa81-3082-89d9-2f2cd708ef84
+
+dn: uid=user.186,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexandrina Almon$37653 Walnut Street$Rochester, CA 41833
+initials: AJA
+street: 37653 Walnut Street
+mobile: +1 022 187 6164
+mail: user.186@maildomain.net
+employeeNumber: 186
+pager: +1 827 443 0698
+sn: Almon
+postalCode: 41833
+userPassword: {SSHA}np3kZrfBeposkeR8qXcSdfuIFSBMPkpSi2FSEw==
+description: This is the description for Alexandrina Almon.
+l: Rochester
+cn: Alexandrina Almon
+st: CA
+telephoneNumber: +1 088 052 5049
+givenName: Alexandrina
+uid: user.186
+homePhone: +1 793 624 6713
+entryUUID: b3804b36-1468-3955-a344-7842a9142f44
+
+dn: uid=user.187,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexandru Alms$77776 Green Street$Oklahoma City, KY 09400
+initials: ARA
+street: 77776 Green Street
+mobile: +1 679 460 6808
+mail: user.187@maildomain.net
+employeeNumber: 187
+pager: +1 255 831 9454
+sn: Alms
+postalCode: 09400
+userPassword: {SSHA}iJS2M1k7q+9TTEbSYU6sbfNWoK3/k/ICA36xWw==
+description: This is the description for Alexandru Alms.
+l: Oklahoma City
+cn: Alexandru Alms
+st: KY
+telephoneNumber: +1 288 115 8723
+givenName: Alexandru
+uid: user.187
+homePhone: +1 985 063 2400
+entryUUID: f5060aea-8bb8-3a1d-a243-29f02ceb1c1a
+
+dn: uid=user.188,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexi Aloi$54066 Dogwood Street$Tallahassee, FL 65000
+initials: AAA
+street: 54066 Dogwood Street
+mobile: +1 012 060 6984
+mail: user.188@maildomain.net
+employeeNumber: 188
+pager: +1 694 016 1648
+sn: Aloi
+postalCode: 65000
+userPassword: {SSHA}dsQ/pL33U7l4+tC+rsIXafUmq0E54gnTorO10A==
+description: This is the description for Alexi Aloi.
+l: Tallahassee
+cn: Alexi Aloi
+st: FL
+telephoneNumber: +1 365 807 8567
+givenName: Alexi
+uid: user.188
+homePhone: +1 217 392 5226
+entryUUID: dc430154-7018-30fa-93a8-cee4fd9dc947
+
+dn: uid=user.189,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexia Alomari$59693 First Street$Dayton, PA 08587
+initials: AFA
+street: 59693 First Street
+mobile: +1 703 027 0501
+mail: user.189@maildomain.net
+employeeNumber: 189
+pager: +1 897 273 0385
+sn: Alomari
+postalCode: 08587
+userPassword: {SSHA}R5iq+ndGxDM39/Qs57hRDq52tLMccLpFwrbmrQ==
+description: This is the description for Alexia Alomari.
+l: Dayton
+cn: Alexia Alomari
+st: PA
+telephoneNumber: +1 874 041 5006
+givenName: Alexia
+uid: user.189
+homePhone: +1 000 827 9313
+entryUUID: 44702ea3-9aa3-34d5-9941-7fcea641776d
+
+dn: uid=user.190,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexina Alperovich$30635 Jackson Street$Huntington, PA 40958
+initials: ASA
+street: 30635 Jackson Street
+mobile: +1 346 196 7840
+mail: user.190@maildomain.net
+employeeNumber: 190
+pager: +1 999 092 8998
+sn: Alperovich
+postalCode: 40958
+userPassword: {SSHA}cg2Fc255LQQHWlo7bf0VNTJaK6naebQ15Psg6A==
+description: This is the description for Alexina Alperovich.
+l: Huntington
+cn: Alexina Alperovich
+st: PA
+telephoneNumber: +1 500 086 7475
+givenName: Alexina
+uid: user.190
+homePhone: +1 100 550 5107
+entryUUID: f3386366-0d30-39dd-b54e-54c7860f4ff1
+
+dn: uid=user.191,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexine Alred$11970 Miller Street$Los Angeles, DC 61262
+initials: AIA
+street: 11970 Miller Street
+mobile: +1 884 624 6470
+mail: user.191@maildomain.net
+employeeNumber: 191
+pager: +1 794 905 2409
+sn: Alred
+postalCode: 61262
+userPassword: {SSHA}YXUGu5UABR32s/ASz8CulurRozBhwztjQ7YeLw==
+description: This is the description for Alexine Alred.
+l: Los Angeles
+cn: Alexine Alred
+st: DC
+telephoneNumber: +1 891 790 0176
+givenName: Alexine
+uid: user.191
+homePhone: +1 003 669 8280
+entryUUID: 0aec6e90-0ed5-38af-8edd-95985e4fc93b
+
+dn: uid=user.192,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alexis Alsaleh$98821 Adams Street$Charlottesville, NH 04885
+initials: AEA
+street: 98821 Adams Street
+mobile: +1 527 480 5000
+mail: user.192@maildomain.net
+employeeNumber: 192
+pager: +1 833 807 5625
+sn: Alsaleh
+postalCode: 04885
+userPassword: {SSHA}+0iakrqHDvTP67PEttB7iIoKLjSxuL+ASDD2/Q==
+description: This is the description for Alexis Alsaleh.
+l: Charlottesville
+cn: Alexis Alsaleh
+st: NH
+telephoneNumber: +1 974 230 9980
+givenName: Alexis
+uid: user.192
+homePhone: +1 470 905 2851
+entryUUID: cbb2b044-9278-3834-b04a-3ef74713b049
+
+dn: uid=user.193,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alf Alshabout$69045 Forest Street$Fort Worth, ME 98356
+initials: AWA
+street: 69045 Forest Street
+mobile: +1 769 728 3244
+mail: user.193@maildomain.net
+employeeNumber: 193
+pager: +1 138 612 5965
+sn: Alshabout
+postalCode: 98356
+userPassword: {SSHA}3JDh3pGWSs+tVapgBF2Q/U2hDq+Lxa8O+3ccqQ==
+description: This is the description for Alf Alshabout.
+l: Fort Worth
+cn: Alf Alshabout
+st: ME
+telephoneNumber: +1 188 885 0302
+givenName: Alf
+uid: user.193
+homePhone: +1 663 130 2940
+entryUUID: 3a4b7b64-8e14-3b5c-8006-4d785f44b2a2
+
+dn: uid=user.194,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfi Alsop$00244 Birch Street$Springfield, AK 38092
+initials: ABA
+street: 00244 Birch Street
+mobile: +1 033 409 8510
+mail: user.194@maildomain.net
+employeeNumber: 194
+pager: +1 066 036 3685
+sn: Alsop
+postalCode: 38092
+userPassword: {SSHA}IitTPIuQZEg2k+QPRFjIWzKbM6STVwxb3IlWxw==
+description: This is the description for Alfi Alsop.
+l: Springfield
+cn: Alfi Alsop
+st: AK
+telephoneNumber: +1 847 900 1384
+givenName: Alfi
+uid: user.194
+homePhone: +1 190 484 8106
+entryUUID: 29a35e7a-e9bf-3999-ac74-fd5d4c1b1cc1
+
+dn: uid=user.195,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfie Alspaugh$68134 Pine Street$Johnstown, ME 00690
+initials: ARA
+street: 68134 Pine Street
+mobile: +1 207 922 2585
+mail: user.195@maildomain.net
+employeeNumber: 195
+pager: +1 011 481 7140
+sn: Alspaugh
+postalCode: 00690
+userPassword: {SSHA}DDJI8c3rwin/hShZE8ZzMjIi4/UpCeIU0m7Mcg==
+description: This is the description for Alfie Alspaugh.
+l: Johnstown
+cn: Alfie Alspaugh
+st: ME
+telephoneNumber: +1 941 259 0074
+givenName: Alfie
+uid: user.195
+homePhone: +1 209 000 4448
+entryUUID: 34200277-fb50-331d-8423-d92abcc814cc
+
+dn: uid=user.196,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfons Alston$56498 Highland Street$Chico, NJ 32283
+initials: AVA
+street: 56498 Highland Street
+mobile: +1 010 285 2381
+mail: user.196@maildomain.net
+employeeNumber: 196
+pager: +1 495 310 1007
+sn: Alston
+postalCode: 32283
+userPassword: {SSHA}QKVedtc1Dv4/zA125Q/qXkm7MEl4kEY4CrbnnQ==
+description: This is the description for Alfons Alston.
+l: Chico
+cn: Alfons Alston
+st: NJ
+telephoneNumber: +1 481 760 7603
+givenName: Alfons
+uid: user.196
+homePhone: +1 141 267 1879
+entryUUID: ec4f4f6a-c5a6-3c11-93fe-9ebd59dbdfc3
+
+dn: uid=user.197,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfonso Alswiti$08447 Green Street$Clarksburg, CT 46770
+initials: ATA
+street: 08447 Green Street
+mobile: +1 069 793 4316
+mail: user.197@maildomain.net
+employeeNumber: 197
+pager: +1 094 505 9621
+sn: Alswiti
+postalCode: 46770
+userPassword: {SSHA}3M1+s1CG+2zpnfOkg0RYtdMHnrWRjRnUBWKSCQ==
+description: This is the description for Alfonso Alswiti.
+l: Clarksburg
+cn: Alfonso Alswiti
+st: CT
+telephoneNumber: +1 641 717 0702
+givenName: Alfonso
+uid: user.197
+homePhone: +1 510 059 2490
+entryUUID: 1a97c207-2a32-3934-8c37-bede07a32c50
+
+dn: uid=user.198,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfonzo Altadonna$10139 Seventh Street$Missoula, ID 31800
+initials: AWA
+street: 10139 Seventh Street
+mobile: +1 062 606 8809
+mail: user.198@maildomain.net
+employeeNumber: 198
+pager: +1 408 023 4561
+sn: Altadonna
+postalCode: 31800
+userPassword: {SSHA}mkwLwow0rIgDICXi3g+RMdi0BPmRA7LtHVjkkA==
+description: This is the description for Alfonzo Altadonna.
+l: Missoula
+cn: Alfonzo Altadonna
+st: ID
+telephoneNumber: +1 263 001 1992
+givenName: Alfonzo
+uid: user.198
+homePhone: +1 909 612 2403
+entryUUID: 05a7d155-aaea-3174-918c-1f87be4c167a
+
+dn: uid=user.199,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfred Altay$78109 Lee Street$Medford, ME 13256
+initials: AMA
+street: 78109 Lee Street
+mobile: +1 009 471 1808
+mail: user.199@maildomain.net
+employeeNumber: 199
+pager: +1 281 584 0717
+sn: Altay
+postalCode: 13256
+userPassword: {SSHA}CGwEdBufGhfU1ipAtrpT3Ge5wQUYfCwyTLSdFw==
+description: This is the description for Alfred Altay.
+l: Medford
+cn: Alfred Altay
+st: ME
+telephoneNumber: +1 995 589 3020
+givenName: Alfred
+uid: user.199
+homePhone: +1 301 491 8162
+entryUUID: c287fddd-a92c-3f3a-9a53-2b24d04cc400
+
+dn: uid=user.200,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfreda Alteen$05706 Fifth Street$Roanoke, DE 23669
+initials: ATA
+street: 05706 Fifth Street
+mobile: +1 202 364 6002
+mail: user.200@maildomain.net
+employeeNumber: 200
+pager: +1 946 780 0371
+sn: Alteen
+postalCode: 23669
+userPassword: {SSHA}sR4OvfzQ0tiZUkDXkkltuJbdtoegWSbpAp/0RQ==
+description: This is the description for Alfreda Alteen.
+l: Roanoke
+cn: Alfreda Alteen
+st: DE
+telephoneNumber: +1 320 903 0458
+givenName: Alfreda
+uid: user.200
+homePhone: +1 665 103 0397
+entryUUID: 280dd683-f45e-33c5-82a3-9872f1935353
+
+dn: uid=user.201,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfredo Altekar$04319 Taylor Street$Duluth, AK 10845
+initials: AMA
+street: 04319 Taylor Street
+mobile: +1 104 398 1365
+mail: user.201@maildomain.net
+employeeNumber: 201
+pager: +1 358 213 9024
+sn: Altekar
+postalCode: 10845
+userPassword: {SSHA}H1/m9uvRjVFpkghCiPwfKLODICd8BPb3PnkYHA==
+description: This is the description for Alfredo Altekar.
+l: Duluth
+cn: Alfredo Altekar
+st: AK
+telephoneNumber: +1 602 642 9661
+givenName: Alfredo
+uid: user.201
+homePhone: +1 239 232 5699
+entryUUID: 4e3469cb-2f43-3a90-a21c-1c5b4f206a1f
+
+dn: uid=user.202,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alfy Altherr$87768 Highland Street$Los Angeles, MO 16507
+initials: ALA
+street: 87768 Highland Street
+mobile: +1 062 220 7676
+mail: user.202@maildomain.net
+employeeNumber: 202
+pager: +1 850 912 3062
+sn: Altherr
+postalCode: 16507
+userPassword: {SSHA}vtDHH3X1xWDsMC5vJmh+Qo9dk2GDN4OKUvPTIA==
+description: This is the description for Alfy Altherr.
+l: Los Angeles
+cn: Alfy Altherr
+st: MO
+telephoneNumber: +1 491 174 8593
+givenName: Alfy
+uid: user.202
+homePhone: +1 932 399 9068
+entryUUID: 5205d315-4be4-34d3-8009-beca70deee27
+
+dn: uid=user.203,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ali Alting-Mees$02619 Dogwood Street$New Haven, LA 84740
+initials: AJA
+street: 02619 Dogwood Street
+mobile: +1 301 912 5307
+mail: user.203@maildomain.net
+employeeNumber: 203
+pager: +1 278 798 1218
+sn: Alting-Mees
+postalCode: 84740
+userPassword: {SSHA}GRVWABySFebnMWjnTZuAc/U5MbGlDOlw9PxnOA==
+description: This is the description for Ali Alting-Mees.
+l: New Haven
+cn: Ali Alting-Mees
+st: LA
+telephoneNumber: +1 007 210 9129
+givenName: Ali
+uid: user.203
+homePhone: +1 303 582 8290
+entryUUID: 9ed0388b-b1a8-36aa-aa2e-01f682f2b7ed
+
+dn: uid=user.204,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alia Altman$18947 Valley Street$Bloomington, AR 00409
+initials: AGA
+street: 18947 Valley Street
+mobile: +1 003 365 5043
+mail: user.204@maildomain.net
+employeeNumber: 204
+pager: +1 422 504 3547
+sn: Altman
+postalCode: 00409
+userPassword: {SSHA}v1raNQ2kEq1T5wafsXH3r9uj2HwQVzfFjwGVJQ==
+description: This is the description for Alia Altman.
+l: Bloomington
+cn: Alia Altman
+st: AR
+telephoneNumber: +1 562 510 1579
+givenName: Alia
+uid: user.204
+homePhone: +1 009 021 6073
+entryUUID: 3c64f5c0-4976-3c40-8cd1-9ec4d5d1cf15
+
+dn: uid=user.205,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alica Altmann$71900 Cherry Street$Pensacola, CO 08592
+initials: ADA
+street: 71900 Cherry Street
+mobile: +1 963 036 3076
+mail: user.205@maildomain.net
+employeeNumber: 205
+pager: +1 011 840 0121
+sn: Altmann
+postalCode: 08592
+userPassword: {SSHA}ptzQ0LeSRjeagmALxSmb7RbxMAeNp/FR7aH7Tw==
+description: This is the description for Alica Altmann.
+l: Pensacola
+cn: Alica Altmann
+st: CO
+telephoneNumber: +1 364 203 8862
+givenName: Alica
+uid: user.205
+homePhone: +1 334 947 0003
+entryUUID: 82960390-62c7-36a0-8e90-f187e9f1d0df
+
+dn: uid=user.206,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alice Alvarez$76758 Fifth Street$Montgomery, VT 20570
+initials: APA
+street: 76758 Fifth Street
+mobile: +1 409 702 6521
+mail: user.206@maildomain.net
+employeeNumber: 206
+pager: +1 640 631 8711
+sn: Alvarez
+postalCode: 20570
+userPassword: {SSHA}t6HCpwXy6hLBrN2levv4aQCWHk0o2d/MraSlng==
+description: This is the description for Alice Alvarez.
+l: Montgomery
+cn: Alice Alvarez
+st: VT
+telephoneNumber: +1 683 988 9279
+givenName: Alice
+uid: user.206
+homePhone: +1 537 688 1363
+entryUUID: ff82cc33-defe-3816-bdde-cc38f1a02fb9
+
+dn: uid=user.207,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alicea Alvaro$40540 Williams Street$Elmira, MS 65490
+initials: AOA
+street: 40540 Williams Street
+mobile: +1 509 096 1857
+mail: user.207@maildomain.net
+employeeNumber: 207
+pager: +1 773 906 8345
+sn: Alvaro
+postalCode: 65490
+userPassword: {SSHA}s9sO3H8eXE3wWXn+rsDM0Amf3wN7h4KXMTmRCA==
+description: This is the description for Alicea Alvaro.
+l: Elmira
+cn: Alicea Alvaro
+st: MS
+telephoneNumber: +1 778 089 0208
+givenName: Alicea
+uid: user.207
+homePhone: +1 569 668 5098
+entryUUID: ee5d6302-6766-3a0c-9df1-6289e8bff569
+
+dn: uid=user.208,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alicia Alvi$46033 East Street$Waterloo, CT 00104
+initials: ALA
+street: 46033 East Street
+mobile: +1 012 913 3070
+mail: user.208@maildomain.net
+employeeNumber: 208
+pager: +1 620 312 7185
+sn: Alvi
+postalCode: 00104
+userPassword: {SSHA}HaB0Go3O/xA8JGzaMDeYspe245sGJcIS1HTIQQ==
+description: This is the description for Alicia Alvi.
+l: Waterloo
+cn: Alicia Alvi
+st: CT
+telephoneNumber: +1 755 256 5232
+givenName: Alicia
+uid: user.208
+homePhone: +1 145 427 4883
+entryUUID: 13bae6e3-015a-3c50-b2fd-2381a0fdadb8
+
+dn: uid=user.209,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alida Aly$82779 Poplar Street$Toledo, AK 07970
+initials: AAA
+street: 82779 Poplar Street
+mobile: +1 842 903 4173
+mail: user.209@maildomain.net
+employeeNumber: 209
+pager: +1 065 165 2285
+sn: Aly
+postalCode: 07970
+userPassword: {SSHA}Ah+Lzs/RNXnj6ExFOziBYGndi7h238oOuDikDQ==
+description: This is the description for Alida Aly.
+l: Toledo
+cn: Alida Aly
+st: AK
+telephoneNumber: +1 320 063 8570
+givenName: Alida
+uid: user.209
+homePhone: +1 012 932 8641
+entryUUID: 39f2ab9b-a7cd-3eca-9566-f737a6858807
+
+dn: uid=user.210,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alidia Alzofon$58300 Woodland Street$Eugene, OK 50805
+initials: AXA
+street: 58300 Woodland Street
+mobile: +1 791 479 0520
+mail: user.210@maildomain.net
+employeeNumber: 210
+pager: +1 342 384 7306
+sn: Alzofon
+postalCode: 50805
+userPassword: {SSHA}At+P1jI6oFnveUmvkTH4dopMKOHY6DPDZP5R5g==
+description: This is the description for Alidia Alzofon.
+l: Eugene
+cn: Alidia Alzofon
+st: OK
+telephoneNumber: +1 804 645 3700
+givenName: Alidia
+uid: user.210
+homePhone: +1 490 986 7856
+entryUUID: edbfa948-5961-353f-834c-3ed5f9bbee4c
+
+dn: uid=user.211,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alie Amalu$65305 Oak Street$Hampton Roads, SC 99575
+initials: ATA
+street: 65305 Oak Street
+mobile: +1 454 421 2123
+mail: user.211@maildomain.net
+employeeNumber: 211
+pager: +1 039 806 9330
+sn: Amalu
+postalCode: 99575
+userPassword: {SSHA}2T5BTBimsP2aZDFJduQTaI2PNeH5Z+QcC3QvpQ==
+description: This is the description for Alie Amalu.
+l: Hampton Roads
+cn: Alie Amalu
+st: SC
+telephoneNumber: +1 728 071 5198
+givenName: Alie
+uid: user.211
+homePhone: +1 935 296 3403
+entryUUID: eed5a19c-8efd-3dc3-a72f-0b38037c50e2
+
+dn: uid=user.212,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alika Amarsi$06980 Ninth Street$Salt Lake City, WY 33901
+initials: ACA
+street: 06980 Ninth Street
+mobile: +1 586 767 0597
+mail: user.212@maildomain.net
+employeeNumber: 212
+pager: +1 275 005 4324
+sn: Amarsi
+postalCode: 33901
+userPassword: {SSHA}iIa+7FtTaD2b+iP5c1zZjhrMnYmQDyqXOeVTpw==
+description: This is the description for Alika Amarsi.
+l: Salt Lake City
+cn: Alika Amarsi
+st: WY
+telephoneNumber: +1 464 195 9123
+givenName: Alika
+uid: user.212
+homePhone: +1 812 290 7530
+entryUUID: 667d6b63-8546-3c0a-be7c-bdeb42719249
+
+dn: uid=user.213,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alikee Amato$37628 Hickory Street$Bakersfield, OR 78872
+initials: AFA
+street: 37628 Hickory Street
+mobile: +1 073 707 3399
+mail: user.213@maildomain.net
+employeeNumber: 213
+pager: +1 292 251 0857
+sn: Amato
+postalCode: 78872
+userPassword: {SSHA}jxqd6k/Sig7GgYPZaYPaabrdexbiepCHKzs/bA==
+description: This is the description for Alikee Amato.
+l: Bakersfield
+cn: Alikee Amato
+st: OR
+telephoneNumber: +1 819 273 8106
+givenName: Alikee
+uid: user.213
+homePhone: +1 840 572 5509
+entryUUID: 748c354d-e5c5-3aac-9c15-5bedbbeb72ae
+
+dn: uid=user.214,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alina Amavisca$08212 Lake Street$North Platte, ND 79800
+initials: AWA
+street: 08212 Lake Street
+mobile: +1 264 900 8496
+mail: user.214@maildomain.net
+employeeNumber: 214
+pager: +1 620 976 0057
+sn: Amavisca
+postalCode: 79800
+userPassword: {SSHA}HCrW7a2zBc+YJjZiHSjWAcBtSoL7v2CYL3hA1g==
+description: This is the description for Alina Amavisca.
+l: North Platte
+cn: Alina Amavisca
+st: ND
+telephoneNumber: +1 700 036 0647
+givenName: Alina
+uid: user.214
+homePhone: +1 985 002 7264
+entryUUID: 3a02caad-e262-3edf-a144-a104f118c7be
+
+dn: uid=user.215,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aline Ambach$20666 Seventh Street$Lincoln, NH 08135
+initials: AQA
+street: 20666 Seventh Street
+mobile: +1 009 653 9301
+mail: user.215@maildomain.net
+employeeNumber: 215
+pager: +1 673 250 9267
+sn: Ambach
+postalCode: 08135
+userPassword: {SSHA}gO5lNUFMBVFJh4hMEJnIHDFL1k+wehYxsgNMYQ==
+description: This is the description for Aline Ambach.
+l: Lincoln
+cn: Aline Ambach
+st: NH
+telephoneNumber: +1 007 457 7603
+givenName: Aline
+uid: user.215
+homePhone: +1 013 737 0496
+entryUUID: b37bd173-8a48-3830-b3ac-5ed89a94c36f
+
+dn: uid=user.216,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alis Ambler$66805 Washington Street$Klamath Falls, NY 40401
+initials: APA
+street: 66805 Washington Street
+mobile: +1 892 270 5087
+mail: user.216@maildomain.net
+employeeNumber: 216
+pager: +1 504 874 1909
+sn: Ambler
+postalCode: 40401
+userPassword: {SSHA}a7jSh/Qyc0V6su7vk2njF1QIg4QRuRsj6Hg1gg==
+description: This is the description for Alis Ambler.
+l: Klamath Falls
+cn: Alis Ambler
+st: NY
+telephoneNumber: +1 018 186 3060
+givenName: Alis
+uid: user.216
+homePhone: +1 493 058 8200
+entryUUID: 23ad042c-dc29-3cc2-bf40-25e96b061109
+
+dn: uid=user.217,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alisa Ambroise$90190 Sixth Street$Odessa, AK 04996
+initials: AHA
+street: 90190 Sixth Street
+mobile: +1 139 600 5187
+mail: user.217@maildomain.net
+employeeNumber: 217
+pager: +1 716 928 5753
+sn: Ambroise
+postalCode: 04996
+userPassword: {SSHA}ojJ9S4rispztdbkC1lvHWeVJoFDt+EQDOAA0Bw==
+description: This is the description for Alisa Ambroise.
+l: Odessa
+cn: Alisa Ambroise
+st: AK
+telephoneNumber: +1 551 136 8798
+givenName: Alisa
+uid: user.217
+homePhone: +1 185 776 8163
+entryUUID: 425bcf72-d7c9-32c5-9fb1-53ec244f28a1
+
+dn: uid=user.218,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alisha Ameen$92433 Mill Street$Peoria, CA 02007
+initials: AUA
+street: 92433 Mill Street
+mobile: +1 088 009 5401
+mail: user.218@maildomain.net
+employeeNumber: 218
+pager: +1 872 883 4425
+sn: Ameen
+postalCode: 02007
+userPassword: {SSHA}q2OnTTYp/9oL64aA6e7BwrTdOj+Pn59QzBvFpQ==
+description: This is the description for Alisha Ameen.
+l: Peoria
+cn: Alisha Ameen
+st: CA
+telephoneNumber: +1 340 213 0009
+givenName: Alisha
+uid: user.218
+homePhone: +1 386 033 9927
+entryUUID: e0723d50-b64d-3695-8459-aeca8ac165f4
+
+dn: uid=user.219,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alison Amelkar$70690 Valley Street$San Diego, IA 15605
+initials: AXA
+street: 70690 Valley Street
+mobile: +1 027 016 8609
+mail: user.219@maildomain.net
+employeeNumber: 219
+pager: +1 127 003 1436
+sn: Amelkar
+postalCode: 15605
+userPassword: {SSHA}sOpIjtHgKixAydP1LX6tsB5gm4vpT7p/+Eks2A==
+description: This is the description for Alison Amelkar.
+l: San Diego
+cn: Alison Amelkar
+st: IA
+telephoneNumber: +1 670 770 0537
+givenName: Alison
+uid: user.219
+homePhone: +1 338 861 1827
+entryUUID: dfd808a0-0c2f-3074-af74-ba884d695fc3
+
+dn: uid=user.220,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alissa America$07901 West Street$Tallahassee, VA 36056
+initials: AFA
+street: 07901 West Street
+mobile: +1 010 287 6244
+mail: user.220@maildomain.net
+employeeNumber: 220
+pager: +1 530 000 1061
+sn: America
+postalCode: 36056
+userPassword: {SSHA}z7MBp0Nt5sPO1j2fBKGUH2pentnDEHouUYQApQ==
+description: This is the description for Alissa America.
+l: Tallahassee
+cn: Alissa America
+st: VA
+telephoneNumber: +1 032 360 1009
+givenName: Alissa
+uid: user.220
+homePhone: +1 141 065 6028
+entryUUID: 36135a0a-9f23-3c0c-917f-2232c270134e
+
+dn: uid=user.221,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alisun Amick$70638 Locust Street$Pueblo, AZ 35896
+initials: AFA
+street: 70638 Locust Street
+mobile: +1 186 765 5006
+mail: user.221@maildomain.net
+employeeNumber: 221
+pager: +1 064 130 1091
+sn: Amick
+postalCode: 35896
+userPassword: {SSHA}BcD/9Lf3sQ0s+a0x6rIZd6ZKOxGoo7BcsoBoyg==
+description: This is the description for Alisun Amick.
+l: Pueblo
+cn: Alisun Amick
+st: AZ
+telephoneNumber: +1 858 469 9332
+givenName: Alisun
+uid: user.221
+homePhone: +1 830 103 4006
+entryUUID: 1f022ef6-4486-337d-a05b-dff44cb333dd
+
+dn: uid=user.222,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alix Amin$09877 Tenth Street$Chicago, TN 93310
+initials: AGA
+street: 09877 Tenth Street
+mobile: +1 976 777 7080
+mail: user.222@maildomain.net
+employeeNumber: 222
+pager: +1 793 202 6933
+sn: Amin
+postalCode: 93310
+userPassword: {SSHA}w0wXnBOEzCsWBzYfo3iY2vg+5HSmjrfxfEH3hw==
+description: This is the description for Alix Amin.
+l: Chicago
+cn: Alix Amin
+st: TN
+telephoneNumber: +1 081 889 2971
+givenName: Alix
+uid: user.222
+homePhone: +1 832 070 8432
+entryUUID: a57ba9e7-104c-311d-afca-a994dd7314c0
+
+dn: uid=user.223,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aliza Amini$51096 Spring Street$Seattle, SC 41800
+initials: ALA
+street: 51096 Spring Street
+mobile: +1 733 392 8111
+mail: user.223@maildomain.net
+employeeNumber: 223
+pager: +1 803 408 4492
+sn: Amini
+postalCode: 41800
+userPassword: {SSHA}Knnpi5/9i/o6venKSqyxlIdP+lwdftQ40gTCyg==
+description: This is the description for Aliza Amini.
+l: Seattle
+cn: Aliza Amini
+st: SC
+telephoneNumber: +1 305 049 1583
+givenName: Aliza
+uid: user.223
+homePhone: +1 903 122 0579
+entryUUID: 95caf63b-c8a4-3219-9292-36fb70d3cba5
+
+dn: uid=user.224,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alka Aminzadeh$26626 Fifth Street$Topeka, IA 85598
+initials: ASA
+street: 26626 Fifth Street
+mobile: +1 924 335 9629
+mail: user.224@maildomain.net
+employeeNumber: 224
+pager: +1 239 303 9040
+sn: Aminzadeh
+postalCode: 85598
+userPassword: {SSHA}bcISlFsh27HjUfAiQBo4SNhPd8ovmYM/po4T7w==
+description: This is the description for Alka Aminzadeh.
+l: Topeka
+cn: Alka Aminzadeh
+st: IA
+telephoneNumber: +1 863 922 7806
+givenName: Alka
+uid: user.224
+homePhone: +1 638 252 2073
+entryUUID: 102c46ea-861d-3357-90f2-487d8f600caa
+
+dn: uid=user.225,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alkarim Amiot$03428 Railroad Street$Clarksburg, IL 80488
+initials: AIA
+street: 03428 Railroad Street
+mobile: +1 012 705 1678
+mail: user.225@maildomain.net
+employeeNumber: 225
+pager: +1 942 640 1176
+sn: Amiot
+postalCode: 80488
+userPassword: {SSHA}FIWHw0GAVnZhHHiE15MbaxZTQ6qXemw10C+Wqg==
+description: This is the description for Alkarim Amiot.
+l: Clarksburg
+cn: Alkarim Amiot
+st: IL
+telephoneNumber: +1 289 914 7199
+givenName: Alkarim
+uid: user.225
+homePhone: +1 613 150 0083
+entryUUID: 2bcb6026-c525-392b-9b99-d3c7fad807b4
+
+dn: uid=user.226,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alla Amir$81505 Dogwood Street$Charlotte, AK 65582
+initials: AHA
+street: 81505 Dogwood Street
+mobile: +1 110 933 9905
+mail: user.226@maildomain.net
+employeeNumber: 226
+pager: +1 888 091 0093
+sn: Amir
+postalCode: 65582
+userPassword: {SSHA}wHSRes2uyxG5iJK1Xl6axJua80XliKDPg1zzxg==
+description: This is the description for Alla Amir.
+l: Charlotte
+cn: Alla Amir
+st: AK
+telephoneNumber: +1 099 369 2703
+givenName: Alla
+uid: user.226
+homePhone: +1 227 993 8375
+entryUUID: 7a5757c5-71c8-3acd-a590-73c739944c61
+
+dn: uid=user.227,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allan Amlani$24497 Twelfth Street$Davenport, PA 34550
+initials: AEA
+street: 24497 Twelfth Street
+mobile: +1 759 671 6037
+mail: user.227@maildomain.net
+employeeNumber: 227
+pager: +1 988 122 7879
+sn: Amlani
+postalCode: 34550
+userPassword: {SSHA}f9Pb4axNWv/AnyrYeUHrd+e4Qt16tItP2i6ljw==
+description: This is the description for Allan Amlani.
+l: Davenport
+cn: Allan Amlani
+st: PA
+telephoneNumber: +1 348 254 0091
+givenName: Allan
+uid: user.227
+homePhone: +1 070 501 2225
+entryUUID: 2a1d8456-366e-3714-9c62-09920688797c
+
+dn: uid=user.228,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alleen Amorim$06769 Spruce Street$Fresno, AR 96178
+initials: ACA
+street: 06769 Spruce Street
+mobile: +1 160 840 4474
+mail: user.228@maildomain.net
+employeeNumber: 228
+pager: +1 005 308 8381
+sn: Amorim
+postalCode: 96178
+userPassword: {SSHA}vEievReF6l6/evJ67FrCQC9Eo+22/ukNYGbaLA==
+description: This is the description for Alleen Amorim.
+l: Fresno
+cn: Alleen Amorim
+st: AR
+telephoneNumber: +1 052 784 7850
+givenName: Alleen
+uid: user.228
+homePhone: +1 669 026 1614
+entryUUID: 03ccbdd9-b8d6-34e1-9d39-05dfefa9df11
+
+dn: uid=user.229,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allegra Amos$09090 Center Street$Abilene, WY 33257
+initials: AUA
+street: 09090 Center Street
+mobile: +1 742 406 2234
+mail: user.229@maildomain.net
+employeeNumber: 229
+pager: +1 007 483 0920
+sn: Amos
+postalCode: 33257
+userPassword: {SSHA}+jclapxk8ptqkSMZ8eEUkG3p9wMy7W+2sWMx5Q==
+description: This is the description for Allegra Amos.
+l: Abilene
+cn: Allegra Amos
+st: WY
+telephoneNumber: +1 219 971 6420
+givenName: Allegra
+uid: user.229
+homePhone: +1 326 986 4038
+entryUUID: 7b708ebc-dedf-3a14-ae30-85955697ba0e
+
+dn: uid=user.230,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allen Amott$28964 Maple Street$Twin Falls, OK 13411
+initials: ARA
+street: 28964 Maple Street
+mobile: +1 232 034 0310
+mail: user.230@maildomain.net
+employeeNumber: 230
+pager: +1 430 418 5302
+sn: Amott
+postalCode: 13411
+userPassword: {SSHA}ylNhBpJr4TZ42u+9ny7xbsGLrM0H/e3/q9fZMw==
+description: This is the description for Allen Amott.
+l: Twin Falls
+cn: Allen Amott
+st: OK
+telephoneNumber: +1 603 970 5371
+givenName: Allen
+uid: user.230
+homePhone: +1 461 138 8221
+entryUUID: eec50512-1846-3c6a-9738-41e5c74760a5
+
+dn: uid=user.231,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allene Amouzgar$22950 Mill Street$Port Arthur, CO 07219
+initials: AOA
+street: 22950 Mill Street
+mobile: +1 786 164 2096
+mail: user.231@maildomain.net
+employeeNumber: 231
+pager: +1 743 538 8305
+sn: Amouzgar
+postalCode: 07219
+userPassword: {SSHA}bCWl0jixD+uFnXa8nUsSqr3KbBFlncdp0G85pw==
+description: This is the description for Allene Amouzgar.
+l: Port Arthur
+cn: Allene Amouzgar
+st: CO
+telephoneNumber: +1 661 405 1074
+givenName: Allene
+uid: user.231
+homePhone: +1 024 432 0073
+entryUUID: efa90d18-55a4-34b7-a967-df12b342a960
+
+dn: uid=user.232,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alli Amstutz$40389 Tenth Street$Harlingen, WY 69448
+initials: ATA
+street: 40389 Tenth Street
+mobile: +1 314 175 8165
+mail: user.232@maildomain.net
+employeeNumber: 232
+pager: +1 363 876 7730
+sn: Amstutz
+postalCode: 69448
+userPassword: {SSHA}NFL73pjU4+GUR1gAu2PHCsTrDTkM/tXvuEWOgQ==
+description: This is the description for Alli Amstutz.
+l: Harlingen
+cn: Alli Amstutz
+st: WY
+telephoneNumber: +1 594 122 3608
+givenName: Alli
+uid: user.232
+homePhone: +1 540 955 1601
+entryUUID: ae6edf25-5547-3263-9c73-e352a04f4cf6
+
+dn: uid=user.233,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allianora Amu$17478 Lakeview Street$Klamath Falls, TN 61183
+initials: ANA
+street: 17478 Lakeview Street
+mobile: +1 830 104 8015
+mail: user.233@maildomain.net
+employeeNumber: 233
+pager: +1 401 890 1924
+sn: Amu
+postalCode: 61183
+userPassword: {SSHA}tb5ldy2N7bN3vFI+g86ivpAu95tnZavd0k2lkQ==
+description: This is the description for Allianora Amu.
+l: Klamath Falls
+cn: Allianora Amu
+st: TN
+telephoneNumber: +1 800 996 5163
+givenName: Allianora
+uid: user.233
+homePhone: +1 220 392 1108
+entryUUID: bb3da06b-7e4b-3830-850d-abb8f7a56106
+
+dn: uid=user.234,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allie Amundsen$46219 Williams Street$Seattle, NC 45015
+initials: AZA
+street: 46219 Williams Street
+mobile: +1 995 837 0041
+mail: user.234@maildomain.net
+employeeNumber: 234
+pager: +1 017 500 1066
+sn: Amundsen
+postalCode: 45015
+userPassword: {SSHA}6rR2DNgnP+pdjrkqgEdFeowmmmdYm5onwgEdQA==
+description: This is the description for Allie Amundsen.
+l: Seattle
+cn: Allie Amundsen
+st: NC
+telephoneNumber: +1 471 030 2602
+givenName: Allie
+uid: user.234
+homePhone: +1 114 692 3630
+entryUUID: 4e87e78f-03aa-34cf-969a-66c8eba9e86a
+
+dn: uid=user.235,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allina Ananmalay$50702 Cedar Street$Springfield, CT 02832
+initials: AKA
+street: 50702 Cedar Street
+mobile: +1 609 418 5834
+mail: user.235@maildomain.net
+employeeNumber: 235
+pager: +1 590 594 2863
+sn: Ananmalay
+postalCode: 02832
+userPassword: {SSHA}WgPf4x6w911tbF09C0250X5wNjrykNmuFB3h1w==
+description: This is the description for Allina Ananmalay.
+l: Springfield
+cn: Allina Ananmalay
+st: CT
+telephoneNumber: +1 137 171 0485
+givenName: Allina
+uid: user.235
+homePhone: +1 663 526 0864
+entryUUID: da5daa94-01b7-3a5a-bc97-b9bc4d774d63
+
+dn: uid=user.236,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allis Ananth$85872 Lakeview Street$Chico, NY 92039
+initials: ARA
+street: 85872 Lakeview Street
+mobile: +1 023 829 9350
+mail: user.236@maildomain.net
+employeeNumber: 236
+pager: +1 405 368 9291
+sn: Ananth
+postalCode: 92039
+userPassword: {SSHA}5oPMDBF4HfPVVGe6/V8FRaZ82ae3mhEkLwcmJg==
+description: This is the description for Allis Ananth.
+l: Chico
+cn: Allis Ananth
+st: NY
+telephoneNumber: +1 000 050 6622
+givenName: Allis
+uid: user.236
+homePhone: +1 303 504 4825
+entryUUID: 4ec7fb1c-5688-3f34-a45d-5059dc7d746d
+
+dn: uid=user.237,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allisan Anastasiadis$29177 Forest Street$Bluefield, FL 50916
+initials: AHA
+street: 29177 Forest Street
+mobile: +1 758 100 5938
+mail: user.237@maildomain.net
+employeeNumber: 237
+pager: +1 851 970 4232
+sn: Anastasiadis
+postalCode: 50916
+userPassword: {SSHA}Yii24wgQs8Bta+TZqGqEyCXF0TEWonn/mYPmAw==
+description: This is the description for Allisan Anastasiadis.
+l: Bluefield
+cn: Allisan Anastasiadis
+st: FL
+telephoneNumber: +1 035 347 2897
+givenName: Allisan
+uid: user.237
+homePhone: +1 986 102 0563
+entryUUID: ce08741c-6ca3-387b-b3e3-033a3d984139
+
+dn: uid=user.238,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allison Anastasio$73608 Oak Street$Eugene, AZ 60200
+initials: ASA
+street: 73608 Oak Street
+mobile: +1 871 808 2039
+mail: user.238@maildomain.net
+employeeNumber: 238
+pager: +1 747 615 0600
+sn: Anastasio
+postalCode: 60200
+userPassword: {SSHA}dHs+MjJ90xpMOvivcPskeXdkmd07dA/wFwrwVA==
+description: This is the description for Allison Anastasio.
+l: Eugene
+cn: Allison Anastasio
+st: AZ
+telephoneNumber: +1 030 458 5732
+givenName: Allison
+uid: user.238
+homePhone: +1 909 453 1109
+entryUUID: f9c51bce-d43c-3b75-b103-ae3fb5cba82b
+
+dn: uid=user.239,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allissa Anaya$68443 Laurel Street$Amarillo, ME 33451
+initials: AUA
+street: 68443 Laurel Street
+mobile: +1 098 405 1203
+mail: user.239@maildomain.net
+employeeNumber: 239
+pager: +1 860 809 5306
+sn: Anaya
+postalCode: 33451
+userPassword: {SSHA}ezLY1RfcUaTizzAsnyoIPpJTJ5luF5l+LspfEA==
+description: This is the description for Allissa Anaya.
+l: Amarillo
+cn: Allissa Anaya
+st: ME
+telephoneNumber: +1 578 926 0308
+givenName: Allissa
+uid: user.239
+homePhone: +1 072 039 1033
+entryUUID: 79287410-baca-399b-a63b-1fd20f19a6c1
+
+dn: uid=user.240,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allister Ancel$05045 Pine Street$Hattiesburg, MN 59008
+initials: AKA
+street: 05045 Pine Street
+mobile: +1 008 917 5834
+mail: user.240@maildomain.net
+employeeNumber: 240
+pager: +1 093 512 9208
+sn: Ancel
+postalCode: 59008
+userPassword: {SSHA}GOmo5pd5f7FFZip2L1BCqMl/9EGUpdL5BmpoTQ==
+description: This is the description for Allister Ancel.
+l: Hattiesburg
+cn: Allister Ancel
+st: MN
+telephoneNumber: +1 393 686 5404
+givenName: Allister
+uid: user.240
+homePhone: +1 543 049 3000
+entryUUID: 2ec645eb-82a8-392b-8ddd-c9d7fa07433b
+
+dn: uid=user.241,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allix Anchia$26560 Cedar Street$Eau Claire, AK 20601
+initials: AJA
+street: 26560 Cedar Street
+mobile: +1 088 084 8793
+mail: user.241@maildomain.net
+employeeNumber: 241
+pager: +1 857 976 0926
+sn: Anchia
+postalCode: 20601
+userPassword: {SSHA}38XYLtwNNbur9bZmFfEeZ9KBz6yU4fFxzhaevg==
+description: This is the description for Allix Anchia.
+l: Eau Claire
+cn: Allix Anchia
+st: AK
+telephoneNumber: +1 735 298 4553
+givenName: Allix
+uid: user.241
+homePhone: +1 064 310 4675
+entryUUID: 0de28486-fca7-3ec6-bd88-75ea87731efc
+
+dn: uid=user.242,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allsun Anconetani$16995 Meadow Street$Jackson, ME 24591
+initials: AKA
+street: 16995 Meadow Street
+mobile: +1 581 085 2662
+mail: user.242@maildomain.net
+employeeNumber: 242
+pager: +1 694 708 3409
+sn: Anconetani
+postalCode: 24591
+userPassword: {SSHA}cZS2bHH3yMfSGJUd5i3+TtM2w4ilZoBxAQ3pBQ==
+description: This is the description for Allsun Anconetani.
+l: Jackson
+cn: Allsun Anconetani
+st: ME
+telephoneNumber: +1 568 889 4816
+givenName: Allsun
+uid: user.242
+homePhone: +1 582 219 0239
+entryUUID: 76162c4d-dee8-3360-9974-5cd341658f10
+
+dn: uid=user.243,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allx Anctil$37898 Ash Street$Cedar Rapids, IA 21766
+initials: ARA
+street: 37898 Ash Street
+mobile: +1 758 456 3199
+mail: user.243@maildomain.net
+employeeNumber: 243
+pager: +1 963 970 2096
+sn: Anctil
+postalCode: 21766
+userPassword: {SSHA}g6ev4S7Hkua9J1GmJOFh1QHG+qzWO54dR2nOMA==
+description: This is the description for Allx Anctil.
+l: Cedar Rapids
+cn: Allx Anctil
+st: IA
+telephoneNumber: +1 527 528 2090
+givenName: Allx
+uid: user.243
+homePhone: +1 647 000 0601
+entryUUID: fa566eff-a58b-3e5d-a3c2-3bbce8dc7d39
+
+dn: uid=user.244,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ally Ander$80894 Dogwood Street$Baton Rouge, ND 78664
+initials: ANA
+street: 80894 Dogwood Street
+mobile: +1 328 950 0061
+mail: user.244@maildomain.net
+employeeNumber: 244
+pager: +1 367 590 0762
+sn: Ander
+postalCode: 78664
+userPassword: {SSHA}WCzvEge/1VbJu7Fk+HOyIpd1n11Tk9+rx2ZSSQ==
+description: This is the description for Ally Ander.
+l: Baton Rouge
+cn: Ally Ander
+st: ND
+telephoneNumber: +1 096 179 4315
+givenName: Ally
+uid: user.244
+homePhone: +1 809 147 4587
+entryUUID: 3fa1a59d-aa20-3612-84ab-60534c6118cc
+
+dn: uid=user.245,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allyce Andersen$50372 Cherry Street$Alpena, DE 56830
+initials: ANA
+street: 50372 Cherry Street
+mobile: +1 199 064 4016
+mail: user.245@maildomain.net
+employeeNumber: 245
+pager: +1 012 870 5670
+sn: Andersen
+postalCode: 56830
+userPassword: {SSHA}x8UG1WQs6t8iTJlAa24+Yag8j/Ep3GRPHD5veQ==
+description: This is the description for Allyce Andersen.
+l: Alpena
+cn: Allyce Andersen
+st: DE
+telephoneNumber: +1 080 087 8043
+givenName: Allyce
+uid: user.245
+homePhone: +1 462 202 0820
+entryUUID: fa48834f-fd8f-3cf2-9859-aee6630f25a9
+
+dn: uid=user.246,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allyn Anderson$70250 Twelfth Street$Philadelphia, IA 50916
+initials: ADA
+street: 70250 Twelfth Street
+mobile: +1 738 905 3027
+mail: user.246@maildomain.net
+employeeNumber: 246
+pager: +1 074 001 8640
+sn: Anderson
+postalCode: 50916
+userPassword: {SSHA}YOBdYqPpZq4WsrF0uXzawR4hdNCf3vfJWDAojA==
+description: This is the description for Allyn Anderson.
+l: Philadelphia
+cn: Allyn Anderson
+st: IA
+telephoneNumber: +1 782 609 0062
+givenName: Allyn
+uid: user.246
+homePhone: +1 660 727 3486
+entryUUID: ae832198-b982-39cb-8647-0043221d9421
+
+dn: uid=user.247,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allys Anderton$19118 Ridge Street$Fort Myers, MT 17899
+initials: ADA
+street: 19118 Ridge Street
+mobile: +1 507 560 7641
+mail: user.247@maildomain.net
+employeeNumber: 247
+pager: +1 472 184 4306
+sn: Anderton
+postalCode: 17899
+userPassword: {SSHA}3PDCgIMZJDcIpWTAbXthqdG/P7tdroOOrfvCxA==
+description: This is the description for Allys Anderton.
+l: Fort Myers
+cn: Allys Anderton
+st: MT
+telephoneNumber: +1 375 089 1065
+givenName: Allys
+uid: user.247
+homePhone: +1 833 055 6661
+entryUUID: e6a2a583-ef41-3db4-8293-23669fbaf6cf
+
+dn: uid=user.248,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Allyson Andrade$41389 Green Street$Pittsburgh, NV 64400
+initials: AVA
+street: 41389 Green Street
+mobile: +1 830 770 0014
+mail: user.248@maildomain.net
+employeeNumber: 248
+pager: +1 107 090 6426
+sn: Andrade
+postalCode: 64400
+userPassword: {SSHA}ROz3dP0zysmeCn13aLUzujl48dT2oggCupNDog==
+description: This is the description for Allyson Andrade.
+l: Pittsburgh
+cn: Allyson Andrade
+st: NV
+telephoneNumber: +1 719 308 9291
+givenName: Allyson
+uid: user.248
+homePhone: +1 020 899 0186
+entryUUID: 47920cc1-6739-3e64-9690-20b9875715e7
+
+dn: uid=user.249,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alma Andrassy$66412 Maple Street$Sacramento, FL 06450
+initials: ADA
+street: 66412 Maple Street
+mobile: +1 061 955 4978
+mail: user.249@maildomain.net
+employeeNumber: 249
+pager: +1 823 080 1602
+sn: Andrassy
+postalCode: 06450
+userPassword: {SSHA}hX05xfBl0y1SbLsKLpS8cZeWE5+Sjo7clY0ZDg==
+description: This is the description for Alma Andrassy.
+l: Sacramento
+cn: Alma Andrassy
+st: FL
+telephoneNumber: +1 006 608 0596
+givenName: Alma
+uid: user.249
+homePhone: +1 276 246 8950
+entryUUID: 19c85a30-d5cf-3582-9222-9517b65a82a6
+
+dn: uid=user.250,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Almeda Andre$69400 Hickory Street$Superior, MO 54422
+initials: ASA
+street: 69400 Hickory Street
+mobile: +1 308 610 2637
+mail: user.250@maildomain.net
+employeeNumber: 250
+pager: +1 415 343 1249
+sn: Andre
+postalCode: 54422
+userPassword: {SSHA}RhSlaUD39QGEUUrN0MM3P8ek74TH46vp+s+Vjw==
+description: This is the description for Almeda Andre.
+l: Superior
+cn: Almeda Andre
+st: MO
+telephoneNumber: +1 344 076 0398
+givenName: Almeda
+uid: user.250
+homePhone: +1 626 102 2698
+entryUUID: c9dfa459-514f-3f56-9a2e-c464debfe805
+
+dn: uid=user.251,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Almeria Andreasen$47153 Williams Street$Hampton Roads, ND 00446
+initials: APA
+street: 47153 Williams Street
+mobile: +1 876 314 9761
+mail: user.251@maildomain.net
+employeeNumber: 251
+pager: +1 967 095 9469
+sn: Andreasen
+postalCode: 00446
+userPassword: {SSHA}HBuPAAYM3+gyLbRay8yjXahl40DqtlojU9KNqw==
+description: This is the description for Almeria Andreasen.
+l: Hampton Roads
+cn: Almeria Andreasen
+st: ND
+telephoneNumber: +1 598 847 7030
+givenName: Almeria
+uid: user.251
+homePhone: +1 965 504 6384
+entryUUID: 45b84f8a-e0bc-38e3-887c-ec1a2547977b
+
+dn: uid=user.252,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Almerinda Andreessen$85055 Ridge Street$Wichita, OR 20888
+initials: AYA
+street: 85055 Ridge Street
+mobile: +1 827 240 6925
+mail: user.252@maildomain.net
+employeeNumber: 252
+pager: +1 782 543 1365
+sn: Andreessen
+postalCode: 20888
+userPassword: {SSHA}RU42GXTaZWuZ3J8G41fCKNMvvY5WVC9xcZmirA==
+description: This is the description for Almerinda Andreessen.
+l: Wichita
+cn: Almerinda Andreessen
+st: OR
+telephoneNumber: +1 484 740 5053
+givenName: Almerinda
+uid: user.252
+homePhone: +1 937 396 3086
+entryUUID: 0552a206-ddb3-3fcd-a619-4646d0431641
+
+dn: uid=user.253,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Almeta Andreatos$20830 Locust Street$Augusta, OK 39965
+initials: AXA
+street: 20830 Locust Street
+mobile: +1 243 097 0906
+mail: user.253@maildomain.net
+employeeNumber: 253
+pager: +1 838 534 2833
+sn: Andreatos
+postalCode: 39965
+userPassword: {SSHA}48gFFE+GxatfAXAHUqeIClJV5HF/1EZmK7959Q==
+description: This is the description for Almeta Andreatos.
+l: Augusta
+cn: Almeta Andreatos
+st: OK
+telephoneNumber: +1 195 489 3460
+givenName: Almeta
+uid: user.253
+homePhone: +1 077 519 8020
+entryUUID: d1291466-7437-3313-9dc2-f4395a8c0f76
+
+dn: uid=user.254,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Almira Andress$20340 Thirteenth Street$Pensacola, CT 41064
+initials: ABA
+street: 20340 Thirteenth Street
+mobile: +1 287 884 6718
+mail: user.254@maildomain.net
+employeeNumber: 254
+pager: +1 592 557 8781
+sn: Andress
+postalCode: 41064
+userPassword: {SSHA}58AJDmOyV/u0iPPjeCn/GgYtL7TPd3ZWSLoJpA==
+description: This is the description for Almira Andress.
+l: Pensacola
+cn: Almira Andress
+st: CT
+telephoneNumber: +1 628 786 9204
+givenName: Almira
+uid: user.254
+homePhone: +1 016 506 0815
+entryUUID: d2301015-c302-328c-ad2a-d4f162a0a96d
+
+dn: uid=user.255,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Almire Andrew$95717 Third Street$Utica, CT 39981
+initials: AVA
+street: 95717 Third Street
+mobile: +1 139 531 0320
+mail: user.255@maildomain.net
+employeeNumber: 255
+pager: +1 643 778 8032
+sn: Andrew
+postalCode: 39981
+userPassword: {SSHA}fZigRHhCD+oxCh8f5XTH3nSx8q6X97rNTl6upQ==
+description: This is the description for Almire Andrew.
+l: Utica
+cn: Almire Andrew
+st: CT
+telephoneNumber: +1 847 594 4877
+givenName: Almire
+uid: user.255
+homePhone: +1 275 855 5064
+entryUUID: ad11b7be-864a-360d-9bc3-c647cde69b90
+
+dn: uid=user.256,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alnoor Andrews$53693 Cedar Street$Harrisonburg, MD 29032
+initials: ATA
+street: 53693 Cedar Street
+mobile: +1 351 104 8200
+mail: user.256@maildomain.net
+employeeNumber: 256
+pager: +1 159 600 5776
+sn: Andrews
+postalCode: 29032
+userPassword: {SSHA}6pqlc8qgBEAOkBQWdR8+2dLMr32eLlZ/PbfrTQ==
+description: This is the description for Alnoor Andrews.
+l: Harrisonburg
+cn: Alnoor Andrews
+st: MD
+telephoneNumber: +1 015 179 8471
+givenName: Alnoor
+uid: user.256
+homePhone: +1 110 710 8838
+entryUUID: d679e1a4-060e-3545-b98a-ec3e6459ca25
+
+dn: uid=user.257,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aloise Andric$98129 Broadway Street$Atlanta, NC 80103
+initials: AJA
+street: 98129 Broadway Street
+mobile: +1 610 421 8007
+mail: user.257@maildomain.net
+employeeNumber: 257
+pager: +1 879 011 7542
+sn: Andric
+postalCode: 80103
+userPassword: {SSHA}4rEvYsbsyggpi0zrxfmeVR/7/vQW07pZOAurWw==
+description: This is the description for Aloise Andric.
+l: Atlanta
+cn: Aloise Andric
+st: NC
+telephoneNumber: +1 620 280 8746
+givenName: Aloise
+uid: user.257
+homePhone: +1 657 709 4720
+entryUUID: 4697580a-d228-317a-9020-2a33280223f2
+
+dn: uid=user.258,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aloisia Andros$69307 Lee Street$Birmingham, GA 59488
+initials: AUA
+street: 69307 Lee Street
+mobile: +1 025 098 5735
+mail: user.258@maildomain.net
+employeeNumber: 258
+pager: +1 402 740 7107
+sn: Andros
+postalCode: 59488
+userPassword: {SSHA}iCtRwb5pchH6Oqapt20Uq5X00479RItJpnxtCA==
+description: This is the description for Aloisia Andros.
+l: Birmingham
+cn: Aloisia Andros
+st: GA
+telephoneNumber: +1 149 558 7013
+givenName: Aloisia
+uid: user.258
+homePhone: +1 108 762 0006
+entryUUID: f2db97a6-51e3-3a64-9c9a-0233923961d3
+
+dn: uid=user.259,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alok Andrukat$21907 Valley Street$Beaumont, IL 45385
+initials: AEA
+street: 21907 Valley Street
+mobile: +1 848 770 4010
+mail: user.259@maildomain.net
+employeeNumber: 259
+pager: +1 007 110 2961
+sn: Andrukat
+postalCode: 45385
+userPassword: {SSHA}+z9wqgfBB5FmWT2tfeeGOLGlAFIz/xfXWZHhwA==
+description: This is the description for Alok Andrukat.
+l: Beaumont
+cn: Alok Andrukat
+st: IL
+telephoneNumber: +1 389 082 7107
+givenName: Alok
+uid: user.259
+homePhone: +1 000 840 4261
+entryUUID: 2420dfd1-21e5-3cd7-9996-52d11efc96ca
+
+dn: uid=user.260,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alora Andrusiak$45263 Fifth Street$Cincinnati, PA 98436
+initials: AUA
+street: 45263 Fifth Street
+mobile: +1 195 979 0444
+mail: user.260@maildomain.net
+employeeNumber: 260
+pager: +1 034 406 8705
+sn: Andrusiak
+postalCode: 98436
+userPassword: {SSHA}5mA5fZYKZc6CfIt9XiNOBqtvWvLO1nKmtldbDg==
+description: This is the description for Alora Andrusiak.
+l: Cincinnati
+cn: Alora Andrusiak
+st: PA
+telephoneNumber: +1 650 012 3477
+givenName: Alora
+uid: user.260
+homePhone: +1 988 201 3491
+entryUUID: af680868-92a8-3c6b-b2ab-4cdb42cfa8ec
+
+dn: uid=user.261,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aloysia Andruzzi$98220 Jackson Street$Salem, NC 93393
+initials: AUA
+street: 98220 Jackson Street
+mobile: +1 977 959 8126
+mail: user.261@maildomain.net
+employeeNumber: 261
+pager: +1 571 164 0836
+sn: Andruzzi
+postalCode: 93393
+userPassword: {SSHA}Nt8epgqI++TepnKRtzzozDtUu41uM3nx9xDLuA==
+description: This is the description for Aloysia Andruzzi.
+l: Salem
+cn: Aloysia Andruzzi
+st: NC
+telephoneNumber: +1 210 932 0031
+givenName: Aloysia
+uid: user.261
+homePhone: +1 033 596 0045
+entryUUID: 59142194-dfd5-38cd-83f3-b66eea7679d5
+
+dn: uid=user.262,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alp Ange$88962 Wilson Street$Scranton, AL 93493
+initials: AYA
+street: 88962 Wilson Street
+mobile: +1 452 091 7259
+mail: user.262@maildomain.net
+employeeNumber: 262
+pager: +1 149 437 2535
+sn: Ange
+postalCode: 93493
+userPassword: {SSHA}oZ89QR60oXMuoUUPxjP/Avf2k3+qnMQT/r8rJg==
+description: This is the description for Alp Ange.
+l: Scranton
+cn: Alp Ange
+st: AL
+telephoneNumber: +1 289 127 0260
+givenName: Alp
+uid: user.262
+homePhone: +1 549 256 2158
+entryUUID: 5d2be0cb-b2c1-3fbb-971e-e261c397320f
+
+dn: uid=user.263,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alparslan Angeli$23012 Taylor Street$Redding, OK 33209
+initials: AUA
+street: 23012 Taylor Street
+mobile: +1 503 417 7215
+mail: user.263@maildomain.net
+employeeNumber: 263
+pager: +1 589 140 8786
+sn: Angeli
+postalCode: 33209
+userPassword: {SSHA}eB+XNoYqbnesFX/zuM+UQ72ZzPjBq0Z2Us5rpg==
+description: This is the description for Alparslan Angeli.
+l: Redding
+cn: Alparslan Angeli
+st: OK
+telephoneNumber: +1 894 105 0731
+givenName: Alparslan
+uid: user.263
+homePhone: +1 279 970 7029
+entryUUID: a43d5dbe-8529-3279-ae00-fac564cc18c6
+
+dn: uid=user.264,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alphen Angell$30700 Chestnut Street$Medford, OK 39407
+initials: ARA
+street: 30700 Chestnut Street
+mobile: +1 503 602 0860
+mail: user.264@maildomain.net
+employeeNumber: 264
+pager: +1 095 262 3122
+sn: Angell
+postalCode: 39407
+userPassword: {SSHA}x4aewvsGKKGEPiiXUOxvkM7kEys5dvzNNrWmSA==
+description: This is the description for Alphen Angell.
+l: Medford
+cn: Alphen Angell
+st: OK
+telephoneNumber: +1 012 400 7508
+givenName: Alphen
+uid: user.264
+homePhone: +1 874 205 1702
+entryUUID: 09884e37-1b48-3efc-b448-0c2c5be325d8
+
+dn: uid=user.265,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alphonso Angerer$04616 Twelfth Street$La Crosse, DE 84243
+initials: AXA
+street: 04616 Twelfth Street
+mobile: +1 566 178 0419
+mail: user.265@maildomain.net
+employeeNumber: 265
+pager: +1 560 494 7010
+sn: Angerer
+postalCode: 84243
+userPassword: {SSHA}kMH+WedAGvAauqpWzgNFFD8KIwoVLdsQCE8iSg==
+description: This is the description for Alphonso Angerer.
+l: La Crosse
+cn: Alphonso Angerer
+st: DE
+telephoneNumber: +1 633 713 5006
+givenName: Alphonso
+uid: user.265
+homePhone: +1 311 757 6313
+entryUUID: 8032a115-4c25-3845-b20f-81931f413ebb
+
+dn: uid=user.266,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alpine Angermeyr$30327 Twelfth Street$Las Vegas, MT 34090
+initials: ADA
+street: 30327 Twelfth Street
+mobile: +1 185 253 9127
+mail: user.266@maildomain.net
+employeeNumber: 266
+pager: +1 593 107 4385
+sn: Angermeyr
+postalCode: 34090
+userPassword: {SSHA}4V8Muvu204EN2U9o9vNKbobHobvDxSEmPbV+Bw==
+description: This is the description for Alpine Angermeyr.
+l: Las Vegas
+cn: Alpine Angermeyr
+st: MT
+telephoneNumber: +1 205 094 5052
+givenName: Alpine
+uid: user.266
+homePhone: +1 428 533 9207
+entryUUID: fc2d0514-d3ab-33b4-b209-f4d7d66efd69
+
+dn: uid=user.267,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alstine Anglin$80717 Eleventh Street$Rhinelander, NJ 02058
+initials: ATA
+street: 80717 Eleventh Street
+mobile: +1 015 127 9829
+mail: user.267@maildomain.net
+employeeNumber: 267
+pager: +1 466 748 4640
+sn: Anglin
+postalCode: 02058
+userPassword: {SSHA}EJFDR0hSXQ08DLs4PerPWCg1oxP3XFyqu2mA4Q==
+description: This is the description for Alstine Anglin.
+l: Rhinelander
+cn: Alstine Anglin
+st: NJ
+telephoneNumber: +1 423 408 0670
+givenName: Alstine
+uid: user.267
+homePhone: +1 079 231 2900
+entryUUID: c954c37c-b924-33f3-86cb-947e396e4eea
+
+dn: uid=user.268,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alta Angobaldo$95184 Maple Street$Macon, ME 06576
+initials: AFA
+street: 95184 Maple Street
+mobile: +1 321 680 9450
+mail: user.268@maildomain.net
+employeeNumber: 268
+pager: +1 400 209 3284
+sn: Angobaldo
+postalCode: 06576
+userPassword: {SSHA}BnQUjaZAah7P6Tb1/9+vE8NETJ8HcXC4Xo50RQ==
+description: This is the description for Alta Angobaldo.
+l: Macon
+cn: Alta Angobaldo
+st: ME
+telephoneNumber: +1 904 594 7018
+givenName: Alta
+uid: user.268
+homePhone: +1 664 359 8515
+entryUUID: 2b860495-d368-3dec-945a-32af669da607
+
+dn: uid=user.269,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Altay Angus$03119 Center Street$Kirksville, AR 86304
+initials: AEA
+street: 03119 Center Street
+mobile: +1 775 125 5800
+mail: user.269@maildomain.net
+employeeNumber: 269
+pager: +1 665 387 0189
+sn: Angus
+postalCode: 86304
+userPassword: {SSHA}7bWBwbMrjdGji6ms6ViB/DVWACeLYJTO8CuzvQ==
+description: This is the description for Altay Angus.
+l: Kirksville
+cn: Altay Angus
+st: AR
+telephoneNumber: +1 072 185 9505
+givenName: Altay
+uid: user.269
+homePhone: +1 190 972 1405
+entryUUID: 381882c7-f593-3871-9373-3e3166a4e924
+
+dn: uid=user.270,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Althea Angustia$78678 Eighth Street$Alexandria, AL 01210
+initials: AGA
+street: 78678 Eighth Street
+mobile: +1 305 013 7716
+mail: user.270@maildomain.net
+employeeNumber: 270
+pager: +1 581 086 0801
+sn: Angustia
+postalCode: 01210
+userPassword: {SSHA}7M208IPONykyhzV952wUlL5IQHVLm1B11ZFvew==
+description: This is the description for Althea Angustia.
+l: Alexandria
+cn: Althea Angustia
+st: AL
+telephoneNumber: +1 702 878 6099
+givenName: Althea
+uid: user.270
+homePhone: +1 337 588 2512
+entryUUID: ca1a933b-5548-3bd5-9158-c967439331b6
+
+dn: uid=user.271,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alvaro Angvall$94439 Forest Street$Youngstown, TX 02385
+initials: AKA
+street: 94439 Forest Street
+mobile: +1 251 067 8492
+mail: user.271@maildomain.net
+employeeNumber: 271
+pager: +1 137 100 6710
+sn: Angvall
+postalCode: 02385
+userPassword: {SSHA}VugowJusgvVEjXbLcZSttQDC8S7A9lHeOrroTQ==
+description: This is the description for Alvaro Angvall.
+l: Youngstown
+cn: Alvaro Angvall
+st: TX
+telephoneNumber: +1 910 836 8351
+givenName: Alvaro
+uid: user.271
+homePhone: +1 769 096 7107
+entryUUID: fa514684-53f7-327b-95b2-49822a363472
+
+dn: uid=user.272,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alvera Anhorn$94937 Lee Street$Providence, MA 01846
+initials: AZA
+street: 94937 Lee Street
+mobile: +1 960 939 6790
+mail: user.272@maildomain.net
+employeeNumber: 272
+pager: +1 531 149 3089
+sn: Anhorn
+postalCode: 01846
+userPassword: {SSHA}sh1foCm+8kRXQGoX77spYk3Jxlm0bEdvkeqHVA==
+description: This is the description for Alvera Anhorn.
+l: Providence
+cn: Alvera Anhorn
+st: MA
+telephoneNumber: +1 409 216 7731
+givenName: Alvera
+uid: user.272
+homePhone: +1 765 384 4550
+entryUUID: 158cd40a-35ba-3768-84c6-398bb9601fd7
+
+dn: uid=user.273,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alverta Anker$01528 Madison Street$San Antonio, RI 99437
+initials: AFA
+street: 01528 Madison Street
+mobile: +1 945 498 0492
+mail: user.273@maildomain.net
+employeeNumber: 273
+pager: +1 078 603 0453
+sn: Anker
+postalCode: 99437
+userPassword: {SSHA}PjwK7qmfuBk+N5O+JWlqU6YQdxLFgXO+l45x4A==
+description: This is the description for Alverta Anker.
+l: San Antonio
+cn: Alverta Anker
+st: RI
+telephoneNumber: +1 225 533 2002
+givenName: Alverta
+uid: user.273
+homePhone: +1 859 059 0990
+entryUUID: 41d30455-c0b5-3959-addb-e9660d3fc385
+
+dn: uid=user.274,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alvin Annab$78920 West Street$Klamath Falls, AL 83286
+initials: ABA
+street: 78920 West Street
+mobile: +1 280 370 4379
+mail: user.274@maildomain.net
+employeeNumber: 274
+pager: +1 180 448 0253
+sn: Annab
+postalCode: 83286
+userPassword: {SSHA}qhDd9O+UJG0yiGjJxLe2HEC4ZJrXelwwOhyZ5g==
+description: This is the description for Alvin Annab.
+l: Klamath Falls
+cn: Alvin Annab
+st: AL
+telephoneNumber: +1 343 022 3504
+givenName: Alvin
+uid: user.274
+homePhone: +1 685 391 0087
+entryUUID: 97ba6af5-11c3-315a-84da-6bf9e509bd95
+
+dn: uid=user.275,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alvina Annabelle$39080 Maple Street$Terre Haute, MA 80155
+initials: AZA
+street: 39080 Maple Street
+mobile: +1 987 866 0308
+mail: user.275@maildomain.net
+employeeNumber: 275
+pager: +1 200 073 9280
+sn: Annabelle
+postalCode: 80155
+userPassword: {SSHA}wzB9rlSovpiy9veoEGCsSeb1KRW7sxQcGblMAQ==
+description: This is the description for Alvina Annabelle.
+l: Terre Haute
+cn: Alvina Annabelle
+st: MA
+telephoneNumber: +1 020 132 4905
+givenName: Alvina
+uid: user.275
+homePhone: +1 807 065 1691
+entryUUID: 22f02e8f-ac7f-365a-b3a6-12c638daa5af
+
+dn: uid=user.276,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alvinia Annable$61974 Railroad Street$Paducah, NJ 17517
+initials: AEA
+street: 61974 Railroad Street
+mobile: +1 706 083 6089
+mail: user.276@maildomain.net
+employeeNumber: 276
+pager: +1 756 869 4044
+sn: Annable
+postalCode: 17517
+userPassword: {SSHA}TByyCzAId9YY1ciMfWXkR2UdbaKPphTNdO7OgQ==
+description: This is the description for Alvinia Annable.
+l: Paducah
+cn: Alvinia Annable
+st: NJ
+telephoneNumber: +1 105 152 7890
+givenName: Alvinia
+uid: user.276
+homePhone: +1 429 231 0435
+entryUUID: 8b4fa2b8-f496-322d-a91b-10b00b93e400
+
+dn: uid=user.277,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alvira Annas$55994 Eighth Street$Youngstown, MO 49350
+initials: AYA
+street: 55994 Eighth Street
+mobile: +1 799 585 6231
+mail: user.277@maildomain.net
+employeeNumber: 277
+pager: +1 037 307 8775
+sn: Annas
+postalCode: 49350
+userPassword: {SSHA}0ZdTyjjUTMttagU2gTua7JmCIFyr0p1ByAalJQ==
+description: This is the description for Alvira Annas.
+l: Youngstown
+cn: Alvira Annas
+st: MO
+telephoneNumber: +1 571 506 0031
+givenName: Alvira
+uid: user.277
+homePhone: +1 328 013 9126
+entryUUID: 2c7ce64f-0bfa-32d9-aabd-ac08e82fd873
+
+dn: uid=user.278,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alwyn Annibale$23831 Forest Street$Pueblo, SD 23555
+initials: AVA
+street: 23831 Forest Street
+mobile: +1 985 679 8872
+mail: user.278@maildomain.net
+employeeNumber: 278
+pager: +1 335 929 0964
+sn: Annibale
+postalCode: 23555
+userPassword: {SSHA}G328NPMp5B4kaZvo9uNPqaSDoCYQg9zrZUj/zw==
+description: This is the description for Alwyn Annibale.
+l: Pueblo
+cn: Alwyn Annibale
+st: SD
+telephoneNumber: +1 317 857 1318
+givenName: Alwyn
+uid: user.278
+homePhone: +1 299 236 9930
+entryUUID: 646ba9ae-f9a1-378d-99df-4d0c2d6d9d4c
+
+dn: uid=user.279,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aly Annunziata$07185 Main Street$Lafayette, NJ 48390
+initials: AGA
+street: 07185 Main Street
+mobile: +1 096 200 5005
+mail: user.279@maildomain.net
+employeeNumber: 279
+pager: +1 221 519 6851
+sn: Annunziata
+postalCode: 48390
+userPassword: {SSHA}crXFlCtJfqRld/fz1p8v22xtE7C5x+4AxjK/Kw==
+description: This is the description for Aly Annunziata.
+l: Lafayette
+cn: Aly Annunziata
+st: NJ
+telephoneNumber: +1 874 039 3499
+givenName: Aly
+uid: user.279
+homePhone: +1 837 506 0916
+entryUUID: 12056589-b1a5-3420-8c32-118b0a0a7546
+
+dn: uid=user.280,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alyce Anolik$78359 Jefferson Street$West Palm Beach, VT 50705
+initials: AUA
+street: 78359 Jefferson Street
+mobile: +1 382 783 7477
+mail: user.280@maildomain.net
+employeeNumber: 280
+pager: +1 396 169 9420
+sn: Anolik
+postalCode: 50705
+userPassword: {SSHA}jpVwla2W8lBuZvU2qM49baHCTFU8msnCdcDHWA==
+description: This is the description for Alyce Anolik.
+l: West Palm Beach
+cn: Alyce Anolik
+st: VT
+telephoneNumber: +1 381 920 3311
+givenName: Alyce
+uid: user.280
+homePhone: +1 267 494 4002
+entryUUID: c3447f12-2665-3e4b-8d85-3165edaccad0
+
+dn: uid=user.281,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alyda Ansley$48528 Railroad Street$Binghamton, ID 51493
+initials: AYA
+street: 48528 Railroad Street
+mobile: +1 605 572 8829
+mail: user.281@maildomain.net
+employeeNumber: 281
+pager: +1 538 434 5225
+sn: Ansley
+postalCode: 51493
+userPassword: {SSHA}ADY8eSsoJn9xNWl8RcdsMrKB7IOZbc8DtIU3bA==
+description: This is the description for Alyda Ansley.
+l: Binghamton
+cn: Alyda Ansley
+st: ID
+telephoneNumber: +1 784 154 6570
+givenName: Alyda
+uid: user.281
+homePhone: +1 916 202 3156
+entryUUID: 5b9430ef-0b02-3f65-b85c-1a13f72b31af
+
+dn: uid=user.282,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alys Ansorger$42853 Woodland Street$Santa Fe, MT 80108
+initials: AJA
+street: 42853 Woodland Street
+mobile: +1 514 039 8468
+mail: user.282@maildomain.net
+employeeNumber: 282
+pager: +1 376 600 6093
+sn: Ansorger
+postalCode: 80108
+userPassword: {SSHA}2qrVGlSQqvnX4CuA/a6CgiHeQ2g1Ijt0VOSNEQ==
+description: This is the description for Alys Ansorger.
+l: Santa Fe
+cn: Alys Ansorger
+st: MT
+telephoneNumber: +1 067 196 6856
+givenName: Alys
+uid: user.282
+homePhone: +1 920 491 9308
+entryUUID: 4f582f0d-43de-3613-baba-bb9da561505c
+
+dn: uid=user.283,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alysa Anstead$94083 Walnut Street$Eugene, MT 75650
+initials: ARA
+street: 94083 Walnut Street
+mobile: +1 633 392 6429
+mail: user.283@maildomain.net
+employeeNumber: 283
+pager: +1 442 320 4467
+sn: Anstead
+postalCode: 75650
+userPassword: {SSHA}J3ahkotAU7X3iBIvg/V6Pj8g7gRC0nE4VIdvng==
+description: This is the description for Alysa Anstead.
+l: Eugene
+cn: Alysa Anstead
+st: MT
+telephoneNumber: +1 782 892 5272
+givenName: Alysa
+uid: user.283
+homePhone: +1 410 188 4802
+entryUUID: a438782a-e868-3191-afa3-0c661bd7114a
+
+dn: uid=user.284,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alyse Anstett$12679 Forest Street$Fort Wayne, SC 50000
+initials: APA
+street: 12679 Forest Street
+mobile: +1 328 592 3449
+mail: user.284@maildomain.net
+employeeNumber: 284
+pager: +1 281 347 9836
+sn: Anstett
+postalCode: 50000
+userPassword: {SSHA}rECxO+ZuYu4q+r+SdtUHjNL+V6Yz+FfaQH3tRA==
+description: This is the description for Alyse Anstett.
+l: Fort Wayne
+cn: Alyse Anstett
+st: SC
+telephoneNumber: +1 028 700 0940
+givenName: Alyse
+uid: user.284
+homePhone: +1 194 861 4420
+entryUUID: 399ae7ff-9f89-3b08-9f6d-73c07fe3492e
+
+dn: uid=user.285,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alysia Anthonissen$04367 Sixth Street$Boston, OR 31455
+initials: AFA
+street: 04367 Sixth Street
+mobile: +1 001 196 8972
+mail: user.285@maildomain.net
+employeeNumber: 285
+pager: +1 050 810 7022
+sn: Anthonissen
+postalCode: 31455
+userPassword: {SSHA}YJN9Wsb9cWoI8lrz0njMO4eOMlDiX2pTb6byfA==
+description: This is the description for Alysia Anthonissen.
+l: Boston
+cn: Alysia Anthonissen
+st: OR
+telephoneNumber: +1 057 120 0170
+givenName: Alysia
+uid: user.285
+homePhone: +1 582 798 2200
+entryUUID: 9207a561-1aa2-3571-befe-449a1379717e
+
+dn: uid=user.286,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alyson Anthony$91579 Cherry Street$Dayton, NH 43210
+initials: ANA
+street: 91579 Cherry Street
+mobile: +1 181 465 8096
+mail: user.286@maildomain.net
+employeeNumber: 286
+pager: +1 845 003 8026
+sn: Anthony
+postalCode: 43210
+userPassword: {SSHA}qZN+yf6U2L7ca0t9Qgrc+KBOwrmW9PByiFQQNA==
+description: This is the description for Alyson Anthony.
+l: Dayton
+cn: Alyson Anthony
+st: NH
+telephoneNumber: +1 713 642 2506
+givenName: Alyson
+uid: user.286
+homePhone: +1 004 909 5158
+entryUUID: b1032299-55c1-3e93-b977-6e1f99a4e78d
+
+dn: uid=user.287,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alyss Antinucci$58104 Spring Street$Little Rock, DC 41559
+initials: AUA
+street: 58104 Spring Street
+mobile: +1 013 697 4962
+mail: user.287@maildomain.net
+employeeNumber: 287
+pager: +1 866 509 0603
+sn: Antinucci
+postalCode: 41559
+userPassword: {SSHA}k40iHunF05V5XDV/7PD9MsrqN5wRIU3++fqi4Q==
+description: This is the description for Alyss Antinucci.
+l: Little Rock
+cn: Alyss Antinucci
+st: DC
+telephoneNumber: +1 957 150 8064
+givenName: Alyss
+uid: user.287
+homePhone: +1 174 081 7168
+entryUUID: fe678994-18d0-3574-a388-35589ffc832a
+
+dn: uid=user.288,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Alyssa Antkowiak$48079 Eighth Street$Klamath Falls, ID 29231
+initials: AQA
+street: 48079 Eighth Street
+mobile: +1 971 263 8330
+mail: user.288@maildomain.net
+employeeNumber: 288
+pager: +1 947 515 6308
+sn: Antkowiak
+postalCode: 29231
+userPassword: {SSHA}9rAJPiUgcp/Jb4fVeLuCpI4CpEk+7CvGSzwfgg==
+description: This is the description for Alyssa Antkowiak.
+l: Klamath Falls
+cn: Alyssa Antkowiak
+st: ID
+telephoneNumber: +1 110 001 0450
+givenName: Alyssa
+uid: user.288
+homePhone: +1 735 978 0050
+entryUUID: 7f66a804-2006-3a36-acd9-0ea5691485cf
+
+dn: uid=user.289,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amabel Antle$73285 Fourteenth Street$Roanoke, OR 86015
+initials: AZA
+street: 73285 Fourteenth Street
+mobile: +1 003 308 7309
+mail: user.289@maildomain.net
+employeeNumber: 289
+pager: +1 869 481 3055
+sn: Antle
+postalCode: 86015
+userPassword: {SSHA}caiOC7qA1SWfKvKmLYPgjvy/mlBIlF4xcobtWg==
+description: This is the description for Amabel Antle.
+l: Roanoke
+cn: Amabel Antle
+st: OR
+telephoneNumber: +1 397 180 7818
+givenName: Amabel
+uid: user.289
+homePhone: +1 190 079 2489
+entryUUID: 668338db-f093-3ce9-8892-1258d614f20b
+
+dn: uid=user.290,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amabelle Antoft$45083 South Street$Roanoke, NY 59973
+initials: AMA
+street: 45083 South Street
+mobile: +1 591 086 0706
+mail: user.290@maildomain.net
+employeeNumber: 290
+pager: +1 602 363 2046
+sn: Antoft
+postalCode: 59973
+userPassword: {SSHA}fspjWkjz+p2r4C2dK2rW+AdNWRMa88zzhWC05g==
+description: This is the description for Amabelle Antoft.
+l: Roanoke
+cn: Amabelle Antoft
+st: NY
+telephoneNumber: +1 331 181 4377
+givenName: Amabelle
+uid: user.290
+homePhone: +1 409 895 5849
+entryUUID: db6a870b-4a9e-3f1f-9c34-00834cf76a00
+
+dn: uid=user.291,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amalea Antonarelli$71709 Lee Street$Redding, AZ 17610
+initials: ALA
+street: 71709 Lee Street
+mobile: +1 616 081 0907
+mail: user.291@maildomain.net
+employeeNumber: 291
+pager: +1 562 015 2126
+sn: Antonarelli
+postalCode: 17610
+userPassword: {SSHA}yV1IXWnt3Uffa51Wh9lhpvGxd/uUwrkKjpZXBQ==
+description: This is the description for Amalea Antonarelli.
+l: Redding
+cn: Amalea Antonarelli
+st: AZ
+telephoneNumber: +1 789 497 8008
+givenName: Amalea
+uid: user.291
+homePhone: +1 552 769 0458
+entryUUID: dddecacd-1c60-3519-857b-9ab9685db855
+
+dn: uid=user.292,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amalee Antonelli$07840 Broadway Street$Parkersburg, WY 04566
+initials: AZA
+street: 07840 Broadway Street
+mobile: +1 240 460 2672
+mail: user.292@maildomain.net
+employeeNumber: 292
+pager: +1 362 903 7908
+sn: Antonelli
+postalCode: 04566
+userPassword: {SSHA}ugleHILpv8V+wKIVWoDm3IbZQn3/sziCSyQzPA==
+description: This is the description for Amalee Antonelli.
+l: Parkersburg
+cn: Amalee Antonelli
+st: WY
+telephoneNumber: +1 213 201 5241
+givenName: Amalee
+uid: user.292
+homePhone: +1 324 856 2115
+entryUUID: 3208b126-9062-3a4c-b7d3-872fee98b4dc
+
+dn: uid=user.293,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amaleta Anwar$88435 Jefferson Street$Saginaw, CO 00000
+initials: AOA
+street: 88435 Jefferson Street
+mobile: +1 701 949 7259
+mail: user.293@maildomain.net
+employeeNumber: 293
+pager: +1 840 770 0038
+sn: Anwar
+postalCode: 00000
+userPassword: {SSHA}GryGFTPGhXsKk3YzJvUUrDyl0RyGjTTNFy6tpQ==
+description: This is the description for Amaleta Anwar.
+l: Saginaw
+cn: Amaleta Anwar
+st: CO
+telephoneNumber: +1 030 585 3783
+givenName: Amaleta
+uid: user.293
+homePhone: +1 908 901 9562
+entryUUID: c1462480-f37c-3d10-ae86-9ed71292b055
+
+dn: uid=user.294,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amalia Anzarouth$50068 Madison Street$Cincinnati, WV 70300
+initials: AFA
+street: 50068 Madison Street
+mobile: +1 474 429 3405
+mail: user.294@maildomain.net
+employeeNumber: 294
+pager: +1 577 566 4559
+sn: Anzarouth
+postalCode: 70300
+userPassword: {SSHA}eAxVisuq8nKuS4Q/i8lb2bq84IC68aOgVQ9qsg==
+description: This is the description for Amalia Anzarouth.
+l: Cincinnati
+cn: Amalia Anzarouth
+st: WV
+telephoneNumber: +1 137 630 0406
+givenName: Amalia
+uid: user.294
+homePhone: +1 151 822 7446
+entryUUID: 57c2370b-8d29-3a1e-9652-81b3331e5a0c
+
+dn: uid=user.295,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amalie Anzures$91017 Williams Street$Rapid City, NJ 00288
+initials: AZA
+street: 91017 Williams Street
+mobile: +1 402 691 2206
+mail: user.295@maildomain.net
+employeeNumber: 295
+pager: +1 346 210 1959
+sn: Anzures
+postalCode: 00288
+userPassword: {SSHA}FcjCbgIiHNqpldmzctGXH3NS3i5taGZYEpgyog==
+description: This is the description for Amalie Anzures.
+l: Rapid City
+cn: Amalie Anzures
+st: NJ
+telephoneNumber: +1 035 680 8594
+givenName: Amalie
+uid: user.295
+homePhone: +1 224 572 2771
+entryUUID: ff772757-3a9b-3479-bb1c-ceb136ebc463
+
+dn: uid=user.296,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amalita Aoki$50066 Madison Street$Greenville, MA 91014
+initials: AHA
+street: 50066 Madison Street
+mobile: +1 544 030 1012
+mail: user.296@maildomain.net
+employeeNumber: 296
+pager: +1 581 746 5396
+sn: Aoki
+postalCode: 91014
+userPassword: {SSHA}xhyWGCW7TdMzXv+lyiv0fCt8KiNnhZGovY8ncQ==
+description: This is the description for Amalita Aoki.
+l: Greenville
+cn: Amalita Aoki
+st: MA
+telephoneNumber: +1 032 528 8690
+givenName: Amalita
+uid: user.296
+homePhone: +1 625 085 2007
+entryUUID: 38eabf27-a4e6-3160-87e1-e18952ac1894
+
+dn: uid=user.297,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amalle Aparicio$00181 Davis Street$Saginaw, ME 37310
+initials: ASA
+street: 00181 Davis Street
+mobile: +1 008 048 1921
+mail: user.297@maildomain.net
+employeeNumber: 297
+pager: +1 986 409 5273
+sn: Aparicio
+postalCode: 37310
+userPassword: {SSHA}ChWO3No+Cs3k9cU/4ZMR6gPRnejH8MSgIIm5+g==
+description: This is the description for Amalle Aparicio.
+l: Saginaw
+cn: Amalle Aparicio
+st: ME
+telephoneNumber: +1 809 896 0021
+givenName: Amalle
+uid: user.297
+homePhone: +1 658 875 1648
+entryUUID: d4300184-f219-3bbf-ba0d-9ac1e2673810
+
+dn: uid=user.298,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amand Apostolopoulos$20787 Fifteenth Street$Hartford, CT 51756
+initials: AYA
+street: 20787 Fifteenth Street
+mobile: +1 540 208 7222
+mail: user.298@maildomain.net
+employeeNumber: 298
+pager: +1 568 519 8547
+sn: Apostolopoulos
+postalCode: 51756
+userPassword: {SSHA}YXYBAdP2RJSlmBtyvgD4KFYCjbkEbgE7BpSyAQ==
+description: This is the description for Amand Apostolopoulos.
+l: Hartford
+cn: Amand Apostolopoulos
+st: CT
+telephoneNumber: +1 112 715 5997
+givenName: Amand
+uid: user.298
+homePhone: +1 810 455 7383
+entryUUID: ab773eaa-05c6-3a0a-9844-23a18b9c0537
+
+dn: uid=user.299,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amanda Appell$59000 Ridge Street$Chattanooga, AR 06500
+initials: ARA
+street: 59000 Ridge Street
+mobile: +1 410 570 3311
+mail: user.299@maildomain.net
+employeeNumber: 299
+pager: +1 994 725 3151
+sn: Appell
+postalCode: 06500
+userPassword: {SSHA}Bgs1718AaTRST5S6aaAjU0TNtQvzGQ1mJ3Oc0g==
+description: This is the description for Amanda Appell.
+l: Chattanooga
+cn: Amanda Appell
+st: AR
+telephoneNumber: +1 725 536 2923
+givenName: Amanda
+uid: user.299
+homePhone: +1 870 867 2566
+entryUUID: ca83ac5f-087a-3b74-b21c-cc9fec515750
+
+dn: uid=user.300,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amandi Appenzeller$00006 Adams Street$Las Vegas, MI 01700
+initials: ADA
+street: 00006 Adams Street
+mobile: +1 816 894 6053
+mail: user.300@maildomain.net
+employeeNumber: 300
+pager: +1 008 650 3400
+sn: Appenzeller
+postalCode: 01700
+userPassword: {SSHA}0RJSjN4jT2uDYJ0hxbrPkcuUPDNAxcggX0GkZQ==
+description: This is the description for Amandi Appenzeller.
+l: Las Vegas
+cn: Amandi Appenzeller
+st: MI
+telephoneNumber: +1 378 670 8124
+givenName: Amandi
+uid: user.300
+homePhone: +1 271 404 2038
+entryUUID: 3085d242-c685-3181-b2de-13479e8be666
+
+dn: uid=user.301,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amandie Applebaum$50303 Sunset Street$Tucson, VA 63035
+initials: AIA
+street: 50303 Sunset Street
+mobile: +1 716 209 3310
+mail: user.301@maildomain.net
+employeeNumber: 301
+pager: +1 280 633 3927
+sn: Applebaum
+postalCode: 63035
+userPassword: {SSHA}OzC+/kTxBo0Ck2kGZDuy8Zk3yGQr4GaGMe+oeg==
+description: This is the description for Amandie Applebaum.
+l: Tucson
+cn: Amandie Applebaum
+st: VA
+telephoneNumber: +1 132 793 1657
+givenName: Amandie
+uid: user.301
+homePhone: +1 140 535 0188
+entryUUID: 814a46e3-b489-381f-91e2-c5c1c4846a4f
+
+dn: uid=user.302,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amandip Applegarth$45656 North Street$Lynchburg, TN 05212
+initials: AGA
+street: 45656 North Street
+mobile: +1 453 967 9306
+mail: user.302@maildomain.net
+employeeNumber: 302
+pager: +1 723 625 8426
+sn: Applegarth
+postalCode: 05212
+userPassword: {SSHA}stidmdKNQqA3HfltSf/7XNUzJbeZrbN0J0qwVQ==
+description: This is the description for Amandip Applegarth.
+l: Lynchburg
+cn: Amandip Applegarth
+st: TN
+telephoneNumber: +1 763 079 7852
+givenName: Amandip
+uid: user.302
+homePhone: +1 495 083 2001
+entryUUID: 8f683638-4bcb-3428-961d-e822434eae56
+
+dn: uid=user.303,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amando Appleyard$05789 Ash Street$Wilkes Barre, ND 01947
+initials: ANA
+street: 05789 Ash Street
+mobile: +1 088 700 1725
+mail: user.303@maildomain.net
+employeeNumber: 303
+pager: +1 439 500 0057
+sn: Appleyard
+postalCode: 01947
+userPassword: {SSHA}4Kw6KJJnQ3muvSzNRecAkwQNMj+ythzxk2EsRg==
+description: This is the description for Amando Appleyard.
+l: Wilkes Barre
+cn: Amando Appleyard
+st: ND
+telephoneNumber: +1 528 458 9051
+givenName: Amando
+uid: user.303
+homePhone: +1 956 949 1890
+entryUUID: ac75ea18-7927-3271-b134-9fbde78e8e2d
+
+dn: uid=user.304,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amandy Applications$66566 Jackson Street$Amarillo, ID 80620
+initials: AWA
+street: 66566 Jackson Street
+mobile: +1 857 608 1382
+mail: user.304@maildomain.net
+employeeNumber: 304
+pager: +1 745 730 7476
+sn: Applications
+postalCode: 80620
+userPassword: {SSHA}dIOiB04lOlC9hPdpK+CO9ZG3rDyljY8+s6i9/w==
+description: This is the description for Amandy Applications.
+l: Amarillo
+cn: Amandy Applications
+st: ID
+telephoneNumber: +1 218 317 4870
+givenName: Amandy
+uid: user.304
+homePhone: +1 013 753 3906
+entryUUID: ae33a2d0-8316-372d-8680-7449d7f9382a
+
+dn: uid=user.305,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amant Appugliese$30018 Elm Street$Eureka, MI 09954
+initials: APA
+street: 30018 Elm Street
+mobile: +1 807 561 4405
+mail: user.305@maildomain.net
+employeeNumber: 305
+pager: +1 257 110 6039
+sn: Appugliese
+postalCode: 09954
+userPassword: {SSHA}gIs+t1UYDThDbPNTujYjZio9gJZJJZ/zUTzkUw==
+description: This is the description for Amant Appugliese.
+l: Eureka
+cn: Amant Appugliese
+st: MI
+telephoneNumber: +1 011 809 0826
+givenName: Amant
+uid: user.305
+homePhone: +1 746 001 9209
+entryUUID: 327bfbbf-9f87-397e-bbb8-e77b3c60c225
+
+dn: uid=user.306,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amara Apter$68700 Sunset Street$Des Moines, TX 83060
+initials: ABA
+street: 68700 Sunset Street
+mobile: +1 358 315 9507
+mail: user.306@maildomain.net
+employeeNumber: 306
+pager: +1 013 049 4000
+sn: Apter
+postalCode: 83060
+userPassword: {SSHA}9mBz5i9+/859zF6Ji4ycma/2jTmvLE3JT8KJCQ==
+description: This is the description for Amara Apter.
+l: Des Moines
+cn: Amara Apter
+st: TX
+telephoneNumber: +1 740 336 1400
+givenName: Amara
+uid: user.306
+homePhone: +1 064 647 8082
+entryUUID: d949805e-b144-3317-9464-b9fa9a4c0ecc
+
+dn: uid=user.307,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amargo Arabadjis$96280 Park Street$Sacramento, PA 09253
+initials: AZA
+street: 96280 Park Street
+mobile: +1 182 887 4217
+mail: user.307@maildomain.net
+employeeNumber: 307
+pager: +1 100 550 0068
+sn: Arabadjis
+postalCode: 09253
+userPassword: {SSHA}m9jO16/WcKwmfzadZEncXboiFoDmSCCqwYPF8w==
+description: This is the description for Amargo Arabadjis.
+l: Sacramento
+cn: Amargo Arabadjis
+st: PA
+telephoneNumber: +1 595 490 8689
+givenName: Amargo
+uid: user.307
+homePhone: +1 108 001 3809
+entryUUID: 340e075c-7eb0-368c-855c-7c55df4114d8
+
+dn: uid=user.308,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amarjit Arai$05646 Center Street$Bend, SD 55983
+initials: ASA
+street: 05646 Center Street
+mobile: +1 368 941 9717
+mail: user.308@maildomain.net
+employeeNumber: 308
+pager: +1 802 412 5850
+sn: Arai
+postalCode: 55983
+userPassword: {SSHA}eZSgNQTWPzhPMke19G6FECYyiTiFhE+5gzYsKA==
+description: This is the description for Amarjit Arai.
+l: Bend
+cn: Amarjit Arai
+st: SD
+telephoneNumber: +1 717 185 0287
+givenName: Amarjit
+uid: user.308
+homePhone: +1 108 207 0403
+entryUUID: 6dbfb2ed-3210-3011-80c5-d7fa4a137c03
+
+dn: uid=user.309,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amata Aramideh$42582 Lee Street$Flint, MI 36837
+initials: ACA
+street: 42582 Lee Street
+mobile: +1 629 412 8925
+mail: user.309@maildomain.net
+employeeNumber: 309
+pager: +1 500 300 9325
+sn: Aramideh
+postalCode: 36837
+userPassword: {SSHA}WYdXZSiB1dyg8U75V8CU1j51EgqoK5r5bXmlew==
+description: This is the description for Amata Aramideh.
+l: Flint
+cn: Amata Aramideh
+st: MI
+telephoneNumber: +1 797 305 8686
+givenName: Amata
+uid: user.309
+homePhone: +1 372 319 6260
+entryUUID: 65910ad9-19a0-3ba7-b07a-b0da0c677e60
+
+dn: uid=user.310,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amato Aravamudhan$42630 Center Street$Wichita Falls, WY 67258
+initials: AAA
+street: 42630 Center Street
+mobile: +1 198 045 4092
+mail: user.310@maildomain.net
+employeeNumber: 310
+pager: +1 521 360 2079
+sn: Aravamudhan
+postalCode: 67258
+userPassword: {SSHA}pZvhTcqUjn6oqmxj4ZjwRarD2wyPXPVjlt5xVQ==
+description: This is the description for Amato Aravamudhan.
+l: Wichita Falls
+cn: Amato Aravamudhan
+st: WY
+telephoneNumber: +1 895 518 3166
+givenName: Amato
+uid: user.310
+homePhone: +1 554 136 2768
+entryUUID: e1e9f032-add3-3f36-8825-8e3613a1f77b
+
+dn: uid=user.311,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amber Arbuckle$64814 Spruce Street$Glendive, WI 01634
+initials: AYA
+street: 64814 Spruce Street
+mobile: +1 628 470 3602
+mail: user.311@maildomain.net
+employeeNumber: 311
+pager: +1 853 901 4302
+sn: Arbuckle
+postalCode: 01634
+userPassword: {SSHA}ADgmCxgj2Y9e9TFW254ulyHm+Z4EKM4OPpEHWQ==
+description: This is the description for Amber Arbuckle.
+l: Glendive
+cn: Amber Arbuckle
+st: WI
+telephoneNumber: +1 202 128 7389
+givenName: Amber
+uid: user.311
+homePhone: +1 570 857 0086
+entryUUID: 871b5989-f382-3e13-bda5-b7ab833699e0
+
+dn: uid=user.312,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amberly Archambault$77091 Lincoln Street$Gainesville, KS 00811
+initials: AKA
+street: 77091 Lincoln Street
+mobile: +1 088 182 6348
+mail: user.312@maildomain.net
+employeeNumber: 312
+pager: +1 843 470 7103
+sn: Archambault
+postalCode: 00811
+userPassword: {SSHA}/9O5G6dRhONhuZW9PGroDubdmZ4jArmjV8FpZg==
+description: This is the description for Amberly Archambault.
+l: Gainesville
+cn: Amberly Archambault
+st: KS
+telephoneNumber: +1 405 007 7943
+givenName: Amberly
+uid: user.312
+homePhone: +1 372 092 8210
+entryUUID: 1149fb84-d257-36e7-acec-c6dea12d7c01
+
+dn: uid=user.313,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ambur Archer$97173 Ash Street$Mason City, GA 09187
+initials: AAA
+street: 97173 Ash Street
+mobile: +1 982 902 1457
+mail: user.313@maildomain.net
+employeeNumber: 313
+pager: +1 202 335 0528
+sn: Archer
+postalCode: 09187
+userPassword: {SSHA}Awe/C1urH1kIWCzR6X/++FMg7exEy/rL1RTziw==
+description: This is the description for Ambur Archer.
+l: Mason City
+cn: Ambur Archer
+st: GA
+telephoneNumber: +1 185 694 0973
+givenName: Ambur
+uid: user.313
+homePhone: +1 806 508 9940
+entryUUID: 13291e7a-5733-35d4-94b2-628017b2300a
+
+dn: uid=user.314,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ame Archibald$45001 Spruce Street$Las Vegas, CT 56047
+initials: AEA
+street: 45001 Spruce Street
+mobile: +1 113 552 8224
+mail: user.314@maildomain.net
+employeeNumber: 314
+pager: +1 054 198 9768
+sn: Archibald
+postalCode: 56047
+userPassword: {SSHA}HKs+ZXr6TOmaELX/Tj/14iDltGAYsiJuGv/mWg==
+description: This is the description for Ame Archibald.
+l: Las Vegas
+cn: Ame Archibald
+st: CT
+telephoneNumber: +1 700 175 5621
+givenName: Ame
+uid: user.314
+homePhone: +1 372 567 3009
+entryUUID: 38165043-0a62-36ea-91c2-59d756c5fd4c
+
+dn: uid=user.315,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amelia Arcouet$20246 Spruce Street$Tulsa, MT 27098
+initials: ADA
+street: 20246 Spruce Street
+mobile: +1 470 284 1506
+mail: user.315@maildomain.net
+employeeNumber: 315
+pager: +1 075 257 9307
+sn: Arcouet
+postalCode: 27098
+userPassword: {SSHA}jQO3He0bjNOCP1lb5O2VKbWLp/0y6+hoPBn1pw==
+description: This is the description for Amelia Arcouet.
+l: Tulsa
+cn: Amelia Arcouet
+st: MT
+telephoneNumber: +1 542 082 7603
+givenName: Amelia
+uid: user.315
+homePhone: +1 716 850 3667
+entryUUID: 1a8c3a27-4897-35c8-ae78-130095fb40de
+
+dn: uid=user.316,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amelie Ard$10990 North Street$Bend, NE 63056
+initials: AVA
+street: 10990 North Street
+mobile: +1 626 298 9269
+mail: user.316@maildomain.net
+employeeNumber: 316
+pager: +1 664 710 8576
+sn: Ard
+postalCode: 63056
+userPassword: {SSHA}7K2+r6KdzfjLt7s+zMy5lCiRRGuYh3+vAfpmSA==
+description: This is the description for Amelie Ard.
+l: Bend
+cn: Amelie Ard
+st: NE
+telephoneNumber: +1 080 962 2034
+givenName: Amelie
+uid: user.316
+homePhone: +1 148 283 1717
+entryUUID: d9f37e1b-e77a-3701-8a9d-cd66a0210c50
+
+dn: uid=user.317,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amelina Ardiel$35810 Ninth Street$La Crosse, NM 65795
+initials: AIA
+street: 35810 Ninth Street
+mobile: +1 459 497 5843
+mail: user.317@maildomain.net
+employeeNumber: 317
+pager: +1 844 295 9046
+sn: Ardiel
+postalCode: 65795
+userPassword: {SSHA}JB1Rm6HjB4/x8D4SsPDSTXyyHgUQ48dVvaqZEw==
+description: This is the description for Amelina Ardiel.
+l: La Crosse
+cn: Amelina Ardiel
+st: NM
+telephoneNumber: +1 693 755 6507
+givenName: Amelina
+uid: user.317
+homePhone: +1 270 788 9524
+entryUUID: 1bdfd921-81b0-3c58-a9d4-23382ebe2d5c
+
+dn: uid=user.318,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ameline Ardizone$27836 Davis Street$Lansing, OK 36475
+initials: AOA
+street: 27836 Davis Street
+mobile: +1 797 350 0045
+mail: user.318@maildomain.net
+employeeNumber: 318
+pager: +1 009 840 7084
+sn: Ardizone
+postalCode: 36475
+userPassword: {SSHA}iO0js8nEo7ZIs0NKdwvMH3jqXkQ6BBhdfD774w==
+description: This is the description for Ameline Ardizone.
+l: Lansing
+cn: Ameline Ardizone
+st: OK
+telephoneNumber: +1 890 373 7045
+givenName: Ameline
+uid: user.318
+homePhone: +1 749 277 5808
+entryUUID: 86c4c3ab-4fa4-39bd-9d04-fad398f434bc
+
+dn: uid=user.319,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amelita Ardoin$53596 Railroad Street$Atlanta, ID 22293
+initials: ADA
+street: 53596 Railroad Street
+mobile: +1 901 775 6062
+mail: user.319@maildomain.net
+employeeNumber: 319
+pager: +1 068 266 0026
+sn: Ardoin
+postalCode: 22293
+userPassword: {SSHA}ussdtx+RyF0c64o9Ker21xLqV6nKK1zsElPxvQ==
+description: This is the description for Amelita Ardoin.
+l: Atlanta
+cn: Amelita Ardoin
+st: ID
+telephoneNumber: +1 355 500 6722
+givenName: Amelita
+uid: user.319
+homePhone: +1 653 105 5911
+entryUUID: ebaaffb1-c0bc-35f3-be8d-3aefdaefb9a1
+
+dn: uid=user.320,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: America Arellano$30901 Chestnut Street$Roanoke, OK 01921
+initials: AHA
+street: 30901 Chestnut Street
+mobile: +1 666 412 1521
+mail: user.320@maildomain.net
+employeeNumber: 320
+pager: +1 459 869 6780
+sn: Arellano
+postalCode: 01921
+userPassword: {SSHA}cQ2wYlD/2F0MIqb/uA7pSj4npi5Qhb6WEvDKyg==
+description: This is the description for America Arellano.
+l: Roanoke
+cn: America Arellano
+st: OK
+telephoneNumber: +1 089 320 6004
+givenName: America
+uid: user.320
+homePhone: +1 529 790 9104
+entryUUID: 5e61684a-c467-3d20-afe5-7c415e774412
+
+dn: uid=user.321,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ami Arend$02092 Central Street$Pueblo, MS 03999
+initials: APA
+street: 02092 Central Street
+mobile: +1 038 050 2629
+mail: user.321@maildomain.net
+employeeNumber: 321
+pager: +1 018 760 0473
+sn: Arend
+postalCode: 03999
+userPassword: {SSHA}r6eXiluVWvtpgdG8/ngmLwp23s1uw4LTvl1mgw==
+description: This is the description for Ami Arend.
+l: Pueblo
+cn: Ami Arend
+st: MS
+telephoneNumber: +1 607 728 3889
+givenName: Ami
+uid: user.321
+homePhone: +1 246 082 8917
+entryUUID: 02cc338c-c4e9-3022-9fc9-e48b7f84cf54
+
+dn: uid=user.322,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amie Ares$85819 Wilson Street$Bowling Green, AL 50179
+initials: ADA
+street: 85819 Wilson Street
+mobile: +1 930 082 4540
+mail: user.322@maildomain.net
+employeeNumber: 322
+pager: +1 807 771 6910
+sn: Ares
+postalCode: 50179
+userPassword: {SSHA}RY0gTlG6IcyZ7QWDJgjb16s7zpZ8Oj/1YL63Jw==
+description: This is the description for Amie Ares.
+l: Bowling Green
+cn: Amie Ares
+st: AL
+telephoneNumber: +1 060 126 5614
+givenName: Amie
+uid: user.322
+homePhone: +1 928 698 5760
+entryUUID: 8cc27160-e45a-370b-b022-9cdf66b34e8e
+
+dn: uid=user.323,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amii Areu$56655 Second Street$Ardmore, MS 06609
+initials: AGA
+street: 56655 Second Street
+mobile: +1 773 597 6735
+mail: user.323@maildomain.net
+employeeNumber: 323
+pager: +1 296 609 4809
+sn: Areu
+postalCode: 06609
+userPassword: {SSHA}Jy1OlwxHQP3WloYYtn1GBQEEfgbbFz8SuX53QQ==
+description: This is the description for Amii Areu.
+l: Ardmore
+cn: Amii Areu
+st: MS
+telephoneNumber: +1 100 460 9937
+givenName: Amii
+uid: user.323
+homePhone: +1 914 492 8394
+entryUUID: 15962943-f76a-3ddc-a6aa-42daa5123fce
+
+dn: uid=user.324,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amil Argento$06287 Locust Street$Orlando, MO 26450
+initials: APA
+street: 06287 Locust Street
+mobile: +1 178 382 3738
+mail: user.324@maildomain.net
+employeeNumber: 324
+pager: +1 008 100 0441
+sn: Argento
+postalCode: 26450
+userPassword: {SSHA}2U5evixpdsmaQjmF6rCD06RDa1CJccB5Yqbu4g==
+description: This is the description for Amil Argento.
+l: Orlando
+cn: Amil Argento
+st: MO
+telephoneNumber: +1 122 670 8348
+givenName: Amil
+uid: user.324
+homePhone: +1 503 906 8456
+entryUUID: 35874f61-7a1d-38df-88db-1192ca50109b
+
+dn: uid=user.325,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amina Arias$58812 Eighth Street$Laredo, WY 50056
+initials: ABA
+street: 58812 Eighth Street
+mobile: +1 397 512 0096
+mail: user.325@maildomain.net
+employeeNumber: 325
+pager: +1 171 492 1687
+sn: Arias
+postalCode: 50056
+userPassword: {SSHA}yGjkNeYcMtzOoDTWU2ZPymbUEaq4aLCAUr8jSg==
+description: This is the description for Amina Arias.
+l: Laredo
+cn: Amina Arias
+st: WY
+telephoneNumber: +1 800 122 2669
+givenName: Amina
+uid: user.325
+homePhone: +1 364 721 0072
+entryUUID: 5ba7b605-fc1a-3158-b17e-5019cedd7c7a
+
+dn: uid=user.326,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amir Aribindi$56704 Laurel Street$Little Rock, AK 70177
+initials: AEA
+street: 56704 Laurel Street
+mobile: +1 105 582 7446
+mail: user.326@maildomain.net
+employeeNumber: 326
+pager: +1 660 493 9974
+sn: Aribindi
+postalCode: 70177
+userPassword: {SSHA}ravtwHBaEPY29V6QD5Wo9hX102F3S7vD8QPtVQ==
+description: This is the description for Amir Aribindi.
+l: Little Rock
+cn: Amir Aribindi
+st: AK
+telephoneNumber: +1 315 702 8238
+givenName: Amir
+uid: user.326
+homePhone: +1 263 607 8257
+entryUUID: f10acb22-a879-38a3-85aa-5592a1f748fb
+
+dn: uid=user.327,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amit Arkesteijn$07932 Wilson Street$Huntington, NE 67000
+initials: AFA
+street: 07932 Wilson Street
+mobile: +1 206 716 0584
+mail: user.327@maildomain.net
+employeeNumber: 327
+pager: +1 390 760 9530
+sn: Arkesteijn
+postalCode: 67000
+userPassword: {SSHA}eDYWOBhCFtPgsxsXtIkwrNdQ66yo1KaZUdUtzg==
+description: This is the description for Amit Arkesteijn.
+l: Huntington
+cn: Amit Arkesteijn
+st: NE
+telephoneNumber: +1 206 000 5796
+givenName: Amit
+uid: user.327
+homePhone: +1 689 002 2468
+entryUUID: bd9494ef-596e-368d-8a80-9ebc1fdf8873
+
+dn: uid=user.328,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amitie Arko$87807 Valley Street$Des Moines, KY 01860
+initials: AVA
+street: 87807 Valley Street
+mobile: +1 795 277 2496
+mail: user.328@maildomain.net
+employeeNumber: 328
+pager: +1 490 852 1970
+sn: Arko
+postalCode: 01860
+userPassword: {SSHA}zsim1jLL0TmGLpr0kDzeZslATsnXLiJdjLcGgA==
+description: This is the description for Amitie Arko.
+l: Des Moines
+cn: Amitie Arko
+st: KY
+telephoneNumber: +1 405 502 3524
+givenName: Amitie
+uid: user.328
+homePhone: +1 423 543 0460
+entryUUID: dc198867-175a-3276-8527-b61c64edb2fe
+
+dn: uid=user.329,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amity Armbruster$16203 Eighth Street$Binghamton, MI 08853
+initials: ANA
+street: 16203 Eighth Street
+mobile: +1 275 842 6030
+mail: user.329@maildomain.net
+employeeNumber: 329
+pager: +1 792 026 0782
+sn: Armbruster
+postalCode: 08853
+userPassword: {SSHA}S3z0P0o3f6E7FiAzRw9kH6siVgK7hV8mW0gbnw==
+description: This is the description for Amity Armbruster.
+l: Binghamton
+cn: Amity Armbruster
+st: MI
+telephoneNumber: +1 290 240 0415
+givenName: Amity
+uid: user.329
+homePhone: +1 723 902 5175
+entryUUID: 8841ed58-f1d8-3bc3-95fe-7df7efd2d539
+
+dn: uid=user.330,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amjad Armenakis$05773 Valley Street$Shreveport, FL 90747
+initials: AWA
+street: 05773 Valley Street
+mobile: +1 556 880 9672
+mail: user.330@maildomain.net
+employeeNumber: 330
+pager: +1 732 799 1288
+sn: Armenakis
+postalCode: 90747
+userPassword: {SSHA}wCtoYtlGOhmpnARKxOLsEq1LkttZi8u/WmQC5Q==
+description: This is the description for Amjad Armenakis.
+l: Shreveport
+cn: Amjad Armenakis
+st: FL
+telephoneNumber: +1 004 402 4034
+givenName: Amjad
+uid: user.330
+homePhone: +1 851 825 7842
+entryUUID: 163f647b-bb95-328e-9704-9cc3bc5a4a91
+
+dn: uid=user.331,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ammamaria Armenta$05908 Eighth Street$Bluefield, SD 42146
+initials: AOA
+street: 05908 Eighth Street
+mobile: +1 730 250 6432
+mail: user.331@maildomain.net
+employeeNumber: 331
+pager: +1 891 860 0577
+sn: Armenta
+postalCode: 42146
+userPassword: {SSHA}XPCrcRzD+j3DA4HXofG9GldVWJonsXIKmgk2qQ==
+description: This is the description for Ammamaria Armenta.
+l: Bluefield
+cn: Ammamaria Armenta
+st: SD
+telephoneNumber: +1 000 000 7703
+givenName: Ammamaria
+uid: user.331
+homePhone: +1 835 343 4721
+entryUUID: db21f574-dddd-331c-9c7a-674f58bc4051
+
+dn: uid=user.332,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ammar Armentrout$20154 Center Street$Richmond, WV 46208
+initials: ATA
+street: 20154 Center Street
+mobile: +1 486 507 5953
+mail: user.332@maildomain.net
+employeeNumber: 332
+pager: +1 931 282 9175
+sn: Armentrout
+postalCode: 46208
+userPassword: {SSHA}/CXqpeYUztN0psCdiuRFjQX/0i+jwoy5bwot1Q==
+description: This is the description for Ammar Armentrout.
+l: Richmond
+cn: Ammar Armentrout
+st: WV
+telephoneNumber: +1 993 566 8487
+givenName: Ammar
+uid: user.332
+homePhone: +1 325 135 1921
+entryUUID: 80342cbd-85bc-3927-a7dc-370f7df96330
+
+dn: uid=user.333,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amnish Armes$05007 Green Street$Fort Smith, AZ 53539
+initials: AFA
+street: 05007 Green Street
+mobile: +1 500 065 5707
+mail: user.333@maildomain.net
+employeeNumber: 333
+pager: +1 741 364 7710
+sn: Armes
+postalCode: 53539
+userPassword: {SSHA}WFlBYJoLVYYZa2VOyZG/dTczxh43XnW/nGEd8Q==
+description: This is the description for Amnish Armes.
+l: Fort Smith
+cn: Amnish Armes
+st: AZ
+telephoneNumber: +1 503 156 3972
+givenName: Amnish
+uid: user.333
+homePhone: +1 579 362 7028
+entryUUID: 14888bb8-91c1-3186-866a-e9a3a2aec616
+
+dn: uid=user.334,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amnon Armitage$43000 Hillcrest Street$Bend, IN 00710
+initials: ALA
+street: 43000 Hillcrest Street
+mobile: +1 169 405 0731
+mail: user.334@maildomain.net
+employeeNumber: 334
+pager: +1 754 778 0434
+sn: Armitage
+postalCode: 00710
+userPassword: {SSHA}Qvmdg4fpWTb8o5gVSnNFA20lggJjStqeToGWnA==
+description: This is the description for Amnon Armitage.
+l: Bend
+cn: Amnon Armitage
+st: IN
+telephoneNumber: +1 480 037 7450
+givenName: Amnon
+uid: user.334
+homePhone: +1 035 930 0302
+entryUUID: 608f414c-7a7d-3376-957d-1e68891e5d29
+
+dn: uid=user.335,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amos Armolavicius$20544 West Street$Lansing, CO 11601
+initials: AZA
+street: 20544 West Street
+mobile: +1 893 078 6145
+mail: user.335@maildomain.net
+employeeNumber: 335
+pager: +1 003 238 6098
+sn: Armolavicius
+postalCode: 11601
+userPassword: {SSHA}X7A7GkL57zufkoqHUctt6l5Q6rGCKHwxe1jdEQ==
+description: This is the description for Amos Armolavicius.
+l: Lansing
+cn: Amos Armolavicius
+st: CO
+telephoneNumber: +1 722 634 5132
+givenName: Amos
+uid: user.335
+homePhone: +1 765 021 5005
+entryUUID: e38f61eb-7c60-39fb-b145-e028d06726ad
+
+dn: uid=user.336,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amour Armour$89602 Eleventh Street$Knoxville, CO 60305
+initials: AQA
+street: 89602 Eleventh Street
+mobile: +1 919 901 0004
+mail: user.336@maildomain.net
+employeeNumber: 336
+pager: +1 420 158 0731
+sn: Armour
+postalCode: 60305
+userPassword: {SSHA}Gi0vDKqubsnbf55meXHV4cXsBFynW387rpY8gg==
+description: This is the description for Amour Armour.
+l: Knoxville
+cn: Amour Armour
+st: CO
+telephoneNumber: +1 440 821 9259
+givenName: Amour
+uid: user.336
+homePhone: +1 992 518 0457
+entryUUID: e3ea729e-469e-3ab2-a7e9-a9c65700e332
+
+dn: uid=user.337,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amparo Armstead$76609 Spruce Street$Rockford, MI 17030
+initials: AVA
+street: 76609 Spruce Street
+mobile: +1 855 040 1063
+mail: user.337@maildomain.net
+employeeNumber: 337
+pager: +1 585 476 0509
+sn: Armstead
+postalCode: 17030
+userPassword: {SSHA}cYRtZiGJyJ10rlC/JcXEgTC7bHZgcct2PvxR7g==
+description: This is the description for Amparo Armstead.
+l: Rockford
+cn: Amparo Armstead
+st: MI
+telephoneNumber: +1 939 829 1881
+givenName: Amparo
+uid: user.337
+homePhone: +1 527 498 1229
+entryUUID: 2bcb1c2e-f07c-3b27-9436-9032d1cabe1a
+
+dn: uid=user.338,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amrik Armstrong$24281 Johnson Street$Salisbury, MA 79104
+initials: ATA
+street: 24281 Johnson Street
+mobile: +1 975 666 3563
+mail: user.338@maildomain.net
+employeeNumber: 338
+pager: +1 100 206 6018
+sn: Armstrong
+postalCode: 79104
+userPassword: {SSHA}fRTUKKyHIK2meBfOglXGN+gFr7Zrw1AngNUCIA==
+description: This is the description for Amrik Armstrong.
+l: Salisbury
+cn: Amrik Armstrong
+st: MA
+telephoneNumber: +1 149 496 9934
+givenName: Amrik
+uid: user.338
+homePhone: +1 119 320 4406
+entryUUID: b034e1ce-358d-352d-957e-a1788874b17a
+
+dn: uid=user.339,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amrish Arnauld$72072 Broadway Street$Burlington, MN 07285
+initials: ALA
+street: 72072 Broadway Street
+mobile: +1 402 700 6985
+mail: user.339@maildomain.net
+employeeNumber: 339
+pager: +1 902 070 8464
+sn: Arnauld
+postalCode: 07285
+userPassword: {SSHA}wxU2hz929iMEw7YKRRx+4FCdA0GatNTQfykO5Q==
+description: This is the description for Amrish Arnauld.
+l: Burlington
+cn: Amrish Arnauld
+st: MN
+telephoneNumber: +1 829 300 2525
+givenName: Amrish
+uid: user.339
+homePhone: +1 410 800 8748
+entryUUID: 3e578c62-1afe-3882-be33-f0f5a7566b6d
+
+dn: uid=user.340,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amy Arnold$69401 Locust Street$Corpus Christi, MT 36500
+initials: AMA
+street: 69401 Locust Street
+mobile: +1 704 244 3683
+mail: user.340@maildomain.net
+employeeNumber: 340
+pager: +1 983 178 4114
+sn: Arnold
+postalCode: 36500
+userPassword: {SSHA}w7N8Z5lZP49YZ2hNIrTBTBKGhDdzqONmMTmxPQ==
+description: This is the description for Amy Arnold.
+l: Corpus Christi
+cn: Amy Arnold
+st: MT
+telephoneNumber: +1 211 260 1491
+givenName: Amy
+uid: user.340
+homePhone: +1 236 090 5224
+entryUUID: af911396-682f-3f1e-9a46-84039a9071cb
+
+dn: uid=user.341,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Amye Arnon$03260 Park Street$Tucson, IL 13456
+initials: ABA
+street: 03260 Park Street
+mobile: +1 769 189 0680
+mail: user.341@maildomain.net
+employeeNumber: 341
+pager: +1 975 104 2202
+sn: Arnon
+postalCode: 13456
+userPassword: {SSHA}WdpeeQ0sDPrzFHuwCbAisJWUwgFg9Gf6TbpTnw==
+description: This is the description for Amye Arnon.
+l: Tucson
+cn: Amye Arnon
+st: IL
+telephoneNumber: +1 813 375 3919
+givenName: Amye
+uid: user.341
+homePhone: +1 279 220 8159
+entryUUID: 0f77bce5-197a-31e5-94b2-1f09165b9a49
+
+dn: uid=user.342,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: An Arnone$99474 Ash Street$Bloomington, MT 30592
+initials: ARA
+street: 99474 Ash Street
+mobile: +1 435 758 3875
+mail: user.342@maildomain.net
+employeeNumber: 342
+pager: +1 010 365 0100
+sn: Arnone
+postalCode: 30592
+userPassword: {SSHA}+KBYgePBqoEQyYiULnnuV9v8DmNbWop3LFEUTA==
+description: This is the description for An Arnone.
+l: Bloomington
+cn: An Arnone
+st: MT
+telephoneNumber: +1 997 237 5900
+givenName: An
+uid: user.342
+homePhone: +1 900 152 5308
+entryUUID: c4c4f5c0-1af9-3194-b38e-a2b7b4a521cd
+
+dn: uid=user.343,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ana Arnott$10300 River Street$Zanesville, AZ 00496
+initials: ATA
+street: 10300 River Street
+mobile: +1 730 547 2370
+mail: user.343@maildomain.net
+employeeNumber: 343
+pager: +1 127 962 6147
+sn: Arnott
+postalCode: 00496
+userPassword: {SSHA}tVBlnr79Px/lMgROFqjmsv6DdA9/cPupUz8l9A==
+description: This is the description for Ana Arnott.
+l: Zanesville
+cn: Ana Arnott
+st: AZ
+telephoneNumber: +1 183 008 5760
+givenName: Ana
+uid: user.343
+homePhone: +1 870 206 8747
+entryUUID: 5f3f1c75-0d80-3880-b288-acf933a7f523
+
+dn: uid=user.344,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anabal Aronovich$00641 Spring Street$Bismarck, NE 71005
+initials: ADA
+street: 00641 Spring Street
+mobile: +1 028 459 2231
+mail: user.344@maildomain.net
+employeeNumber: 344
+pager: +1 097 500 0450
+sn: Aronovich
+postalCode: 71005
+userPassword: {SSHA}s2T6uCEpY9ZJThMlaz8U22qlVqfsfWbPopj99Q==
+description: This is the description for Anabal Aronovich.
+l: Bismarck
+cn: Anabal Aronovich
+st: NE
+telephoneNumber: +1 509 505 9833
+givenName: Anabal
+uid: user.344
+homePhone: +1 108 907 4004
+entryUUID: 69a76a48-8ed3-3a80-b24e-b6c8b548af21
+
+dn: uid=user.345,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anabel Aronson$77260 Davis Street$Lima, VT 17588
+initials: AHA
+street: 77260 Davis Street
+mobile: +1 926 400 0370
+mail: user.345@maildomain.net
+employeeNumber: 345
+pager: +1 430 281 9275
+sn: Aronson
+postalCode: 17588
+userPassword: {SSHA}HmX9W+ZcwPvrRjF/dI7zepDahPTSHFt+OadXHg==
+description: This is the description for Anabel Aronson.
+l: Lima
+cn: Anabel Aronson
+st: VT
+telephoneNumber: +1 603 994 6760
+givenName: Anabel
+uid: user.345
+homePhone: +1 120 040 3092
+entryUUID: 942a8dc1-6b88-3a87-b8d3-355066c4d44b
+
+dn: uid=user.346,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anabella Aronstam$94992 Jefferson Street$Duluth, KS 51242
+initials: ANA
+street: 94992 Jefferson Street
+mobile: +1 510 867 0210
+mail: user.346@maildomain.net
+employeeNumber: 346
+pager: +1 605 804 0367
+sn: Aronstam
+postalCode: 51242
+userPassword: {SSHA}X7ENzFV26VQIGx80KbgfqkbwbeGwKoHHjQaLEw==
+description: This is the description for Anabella Aronstam.
+l: Duluth
+cn: Anabella Aronstam
+st: KS
+telephoneNumber: +1 790 403 7099
+givenName: Anabella
+uid: user.346
+homePhone: +1 669 139 9243
+entryUUID: 282d5579-75d1-3ae3-a750-a391431f364c
+
+dn: uid=user.347,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anabelle Arora$32694 Central Street$Lima, GA 28008
+initials: AIA
+street: 32694 Central Street
+mobile: +1 801 276 4827
+mail: user.347@maildomain.net
+employeeNumber: 347
+pager: +1 814 704 7502
+sn: Arora
+postalCode: 28008
+userPassword: {SSHA}Bc3EhERRFY/CP7/vIwKgC2Xbm3L5ijQbSngMIg==
+description: This is the description for Anabelle Arora.
+l: Lima
+cn: Anabelle Arora
+st: GA
+telephoneNumber: +1 706 790 3921
+givenName: Anabelle
+uid: user.347
+homePhone: +1 664 930 3086
+entryUUID: 3ee4668c-4238-3faa-a817-ca1237078de7
+
+dn: uid=user.348,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anader Arpin$16178 Ridge Street$Butte, OR 44000
+initials: AQA
+street: 16178 Ridge Street
+mobile: +1 937 712 9806
+mail: user.348@maildomain.net
+employeeNumber: 348
+pager: +1 743 011 5022
+sn: Arpin
+postalCode: 44000
+userPassword: {SSHA}1ShffLf5X5SRkRT+xvZ10qH2i8jHzc778RkJ/Q==
+description: This is the description for Anader Arpin.
+l: Butte
+cn: Anader Arpin
+st: OR
+telephoneNumber: +1 780 719 6012
+givenName: Anader
+uid: user.348
+homePhone: +1 032 190 0692
+entryUUID: 9927e100-9722-35e3-9598-26e48d046b0e
+
+dn: uid=user.349,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Analiese Arro$38722 North Street$Mankato, MN 10709
+initials: AWA
+street: 38722 North Street
+mobile: +1 028 033 4650
+mail: user.349@maildomain.net
+employeeNumber: 349
+pager: +1 338 806 5867
+sn: Arro
+postalCode: 10709
+userPassword: {SSHA}mXBWdaYjuggCv6b1gMJmi0AnILBJOwvRVoBjCQ==
+description: This is the description for Analiese Arro.
+l: Mankato
+cn: Analiese Arro
+st: MN
+telephoneNumber: +1 351 075 3048
+givenName: Analiese
+uid: user.349
+homePhone: +1 409 060 3026
+entryUUID: a9322027-a3d2-345c-b845-1391c47330e4
+
+dn: uid=user.350,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Analise Arsena$39513 Tenth Street$Reno, MI 81783
+initials: ACA
+street: 39513 Tenth Street
+mobile: +1 634 808 0985
+mail: user.350@maildomain.net
+employeeNumber: 350
+pager: +1 695 160 9876
+sn: Arsena
+postalCode: 81783
+userPassword: {SSHA}k7dPEkFxZZnqVWBGxtrE8VkOkGr85Q2lZOYypg==
+description: This is the description for Analise Arsena.
+l: Reno
+cn: Analise Arsena
+st: MI
+telephoneNumber: +1 709 720 1689
+givenName: Analise
+uid: user.350
+homePhone: +1 047 537 7910
+entryUUID: 7a9c89e8-94db-3fc5-9e6a-b4e89e58a2a1
+
+dn: uid=user.351,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anallese Arsenault$60204 Center Street$Jonesboro, WA 30066
+initials: AGA
+street: 60204 Center Street
+mobile: +1 802 130 1300
+mail: user.351@maildomain.net
+employeeNumber: 351
+pager: +1 049 598 3229
+sn: Arsenault
+postalCode: 30066
+userPassword: {SSHA}kqC9OwvFmQKaPGWagsYoHAO/AKUDiWzE2R69Ew==
+description: This is the description for Anallese Arsenault.
+l: Jonesboro
+cn: Anallese Arsenault
+st: WA
+telephoneNumber: +1 809 042 2238
+givenName: Anallese
+uid: user.351
+homePhone: +1 925 221 7007
+entryUUID: 93a82fc2-47cc-390c-96e6-7839d16775fc
+
+dn: uid=user.352,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anallise Arseneau$39343 Third Street$Rhinelander, TN 00226
+initials: AMA
+street: 39343 Third Street
+mobile: +1 590 908 2009
+mail: user.352@maildomain.net
+employeeNumber: 352
+pager: +1 391 272 5909
+sn: Arseneau
+postalCode: 00226
+userPassword: {SSHA}lVjTVFIhlzJcKObdBT3Pb5ckaOUS7czX0eTHtA==
+description: This is the description for Anallise Arseneau.
+l: Rhinelander
+cn: Anallise Arseneau
+st: TN
+telephoneNumber: +1 041 340 7066
+givenName: Anallise
+uid: user.352
+homePhone: +1 240 102 8050
+entryUUID: 3b176b2d-054e-3c6f-9f48-35b634c348eb
+
+dn: uid=user.353,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anand Arthur$03936 Mill Street$Anniston, KS 51529
+initials: AWA
+street: 03936 Mill Street
+mobile: +1 902 013 0356
+mail: user.353@maildomain.net
+employeeNumber: 353
+pager: +1 344 681 3563
+sn: Arthur
+postalCode: 51529
+userPassword: {SSHA}VV9dmAh4zDvUbeGn47UiAf6UCUjHpfmRXI3U7A==
+description: This is the description for Anand Arthur.
+l: Anniston
+cn: Anand Arthur
+st: KS
+telephoneNumber: +1 786 789 6692
+givenName: Anand
+uid: user.353
+homePhone: +1 576 330 0402
+entryUUID: fc07d8c2-4961-3895-abb1-031f4b5758c0
+
+dn: uid=user.354,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anantha Artola$24096 East Street$Rhinelander, FL 76098
+initials: ALA
+street: 24096 East Street
+mobile: +1 978 609 0402
+mail: user.354@maildomain.net
+employeeNumber: 354
+pager: +1 600 268 7980
+sn: Artola
+postalCode: 76098
+userPassword: {SSHA}zyOeTNwLo1a0tWtNleC1lvi14VNkAtULeIynlg==
+description: This is the description for Anantha Artola.
+l: Rhinelander
+cn: Anantha Artola
+st: FL
+telephoneNumber: +1 815 380 6767
+givenName: Anantha
+uid: user.354
+homePhone: +1 765 088 1563
+entryUUID: 15ae9064-d68d-3891-ab86-963898fb1ce9
+
+dn: uid=user.355,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anastasia Artspssa$75648 Pine Street$Phoenix, MO 88340
+initials: AFA
+street: 75648 Pine Street
+mobile: +1 206 626 3416
+mail: user.355@maildomain.net
+employeeNumber: 355
+pager: +1 792 978 2187
+sn: Artspssa
+postalCode: 88340
+userPassword: {SSHA}ARWDWUJxk1TXtoPvDwiCFDXPmktKWFELG8qLAw==
+description: This is the description for Anastasia Artspssa.
+l: Phoenix
+cn: Anastasia Artspssa
+st: MO
+telephoneNumber: +1 652 787 8870
+givenName: Anastasia
+uid: user.355
+homePhone: +1 231 220 8266
+entryUUID: 077e39b7-4f8e-3427-84ba-191230231eb9
+
+dn: uid=user.356,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anastasie Artuso$72321 Dogwood Street$Nashville, OK 80972
+initials: AFA
+street: 72321 Dogwood Street
+mobile: +1 123 507 0720
+mail: user.356@maildomain.net
+employeeNumber: 356
+pager: +1 455 604 0089
+sn: Artuso
+postalCode: 80972
+userPassword: {SSHA}EEJX18ISulF/N59d5oUBtbct0zasKvzMOPgeYA==
+description: This is the description for Anastasie Artuso.
+l: Nashville
+cn: Anastasie Artuso
+st: OK
+telephoneNumber: +1 785 459 1011
+givenName: Anastasie
+uid: user.356
+homePhone: +1 003 051 7670
+entryUUID: 614ce010-756b-3ac7-87b9-2d5de7b4f6e2
+
+dn: uid=user.357,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anastassia Artzer$25270 Sunset Street$Phoenix, KY 23485
+initials: ATA
+street: 25270 Sunset Street
+mobile: +1 001 225 2737
+mail: user.357@maildomain.net
+employeeNumber: 357
+pager: +1 588 220 6024
+sn: Artzer
+postalCode: 23485
+userPassword: {SSHA}sBMt7BaCRYllC9p4p+EbI96efN9Gckrz5wi5iQ==
+description: This is the description for Anastassia Artzer.
+l: Phoenix
+cn: Anastassia Artzer
+st: KY
+telephoneNumber: +1 235 040 7275
+givenName: Anastassia
+uid: user.357
+homePhone: +1 232 369 0014
+entryUUID: a4ecfb19-a731-352d-b920-529dcee812f1
+
+dn: uid=user.358,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anatola Arunachalam$37052 Johnson Street$Corpus Christi, UT 39007
+initials: AWA
+street: 37052 Johnson Street
+mobile: +1 489 547 9251
+mail: user.358@maildomain.net
+employeeNumber: 358
+pager: +1 605 582 6718
+sn: Arunachalam
+postalCode: 39007
+userPassword: {SSHA}IGA2MCQEADbzGY0icElDb3kAJtciOTsDEBwVYw==
+description: This is the description for Anatola Arunachalam.
+l: Corpus Christi
+cn: Anatola Arunachalam
+st: UT
+telephoneNumber: +1 299 000 4838
+givenName: Anatola
+uid: user.358
+homePhone: +1 250 745 3504
+entryUUID: e748f1c7-52de-3715-8a36-7bfd7917c04b
+
+dn: uid=user.359,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anatoli Arvin$40306 Sixth Street$Portland, MO 20640
+initials: AKA
+street: 40306 Sixth Street
+mobile: +1 079 012 0439
+mail: user.359@maildomain.net
+employeeNumber: 359
+pager: +1 947 656 6937
+sn: Arvin
+postalCode: 20640
+userPassword: {SSHA}LJCqVQaD8sn4rOdEvK7B7J/+klmyMYvhTc7fEA==
+description: This is the description for Anatoli Arvin.
+l: Portland
+cn: Anatoli Arvin
+st: MO
+telephoneNumber: +1 498 048 9836
+givenName: Anatoli
+uid: user.359
+homePhone: +1 378 126 0890
+entryUUID: 5c8e54f0-2357-3a6e-a330-4ffbbe3da695
+
+dn: uid=user.360,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anatoly Arwakhi$10563 River Street$Wichita, NE 84083
+initials: ADA
+street: 10563 River Street
+mobile: +1 933 416 8830
+mail: user.360@maildomain.net
+employeeNumber: 360
+pager: +1 635 920 0500
+sn: Arwakhi
+postalCode: 84083
+userPassword: {SSHA}pGssSxrzV1wxhd9AVkkBtkV3zaDItRA5406GLw==
+description: This is the description for Anatoly Arwakhi.
+l: Wichita
+cn: Anatoly Arwakhi
+st: NE
+telephoneNumber: +1 540 205 0193
+givenName: Anatoly
+uid: user.360
+homePhone: +1 229 461 6877
+entryUUID: 9bf05156-d09d-39ff-98dd-d562fd16961a
+
+dn: uid=user.361,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anda Aryavong$06138 Spruce Street$Harlingen, MI 04517
+initials: AUA
+street: 06138 Spruce Street
+mobile: +1 462 709 0001
+mail: user.361@maildomain.net
+employeeNumber: 361
+pager: +1 100 064 2733
+sn: Aryavong
+postalCode: 04517
+userPassword: {SSHA}NudE9bClLvCI62srPWsCtfR2MNUzAZlt+Bi+CQ==
+description: This is the description for Anda Aryavong.
+l: Harlingen
+cn: Anda Aryavong
+st: MI
+telephoneNumber: +1 587 144 7866
+givenName: Anda
+uid: user.361
+homePhone: +1 719 062 3502
+entryUUID: 55ba5b34-48bf-3450-ad85-3acd0455fab4
+
+dn: uid=user.362,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andaree Asawa$22551 Davis Street$El Paso, OR 40682
+initials: AFA
+street: 22551 Davis Street
+mobile: +1 586 762 8819
+mail: user.362@maildomain.net
+employeeNumber: 362
+pager: +1 614 615 2398
+sn: Asawa
+postalCode: 40682
+userPassword: {SSHA}dcQlqUyl4A5W35+1vV+//4UY8awEVfudeyyIPQ==
+description: This is the description for Andaree Asawa.
+l: El Paso
+cn: Andaree Asawa
+st: OR
+telephoneNumber: +1 022 860 3457
+givenName: Andaree
+uid: user.362
+homePhone: +1 170 005 0153
+entryUUID: fe820a0c-eb5b-3ee0-a31f-d681b55dfdbd
+
+dn: uid=user.363,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andee Asbill$09807 Tenth Street$Salem, ME 31021
+initials: AOA
+street: 09807 Tenth Street
+mobile: +1 603 172 9064
+mail: user.363@maildomain.net
+employeeNumber: 363
+pager: +1 020 505 1111
+sn: Asbill
+postalCode: 31021
+userPassword: {SSHA}Br5WMrivjlc4pmHseovXZFBTUojRSz/jUz04OA==
+description: This is the description for Andee Asbill.
+l: Salem
+cn: Andee Asbill
+st: ME
+telephoneNumber: +1 831 082 7531
+givenName: Andee
+uid: user.363
+homePhone: +1 076 373 6971
+entryUUID: be4f24a2-3c36-3a2d-8283-2492ecf8c88a
+
+dn: uid=user.365,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anderea Asdel$69518 Valley Street$Knoxville, MN 16696
+initials: ARA
+street: 69518 Valley Street
+mobile: +1 591 508 0541
+mail: user.365@maildomain.net
+employeeNumber: 365
+pager: +1 250 548 4614
+sn: Asdel
+postalCode: 16696
+userPassword: {SSHA}8cLaampANLWbPXGZgXIQXyk3ORPtV+N0cle06A==
+description: This is the description for Anderea Asdel.
+l: Knoxville
+cn: Anderea Asdel
+st: MN
+telephoneNumber: +1 267 658 6736
+givenName: Anderea
+uid: user.365
+homePhone: +1 719 068 8588
+entryUUID: 06c98d54-bf16-3053-b68b-75f331acd6b2
+
+dn: uid=user.366,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anders Asfazadour$87891 Church Street$Anchorage, KY 05332
+initials: AMA
+street: 87891 Church Street
+mobile: +1 806 279 7969
+mail: user.366@maildomain.net
+employeeNumber: 366
+pager: +1 245 089 6480
+sn: Asfazadour
+postalCode: 05332
+userPassword: {SSHA}QovtHs267VWkZtrU/GJxg/5MpSzrUDdQiMWeMA==
+description: This is the description for Anders Asfazadour.
+l: Anchorage
+cn: Anders Asfazadour
+st: KY
+telephoneNumber: +1 120 508 6692
+givenName: Anders
+uid: user.366
+homePhone: +1 062 020 5077
+entryUUID: 49f24cc2-d17d-317f-927a-52d846773db5
+
+dn: uid=user.367,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anderson Asghar$00660 River Street$Portland, MT 26105
+initials: AAA
+street: 00660 River Street
+mobile: +1 078 002 2589
+mail: user.367@maildomain.net
+employeeNumber: 367
+pager: +1 697 895 7945
+sn: Asghar
+postalCode: 26105
+userPassword: {SSHA}tHvfrP1npEAmfbBqpm99XNUz6TZyXUa/Mneg+Q==
+description: This is the description for Anderson Asghar.
+l: Portland
+cn: Anderson Asghar
+st: MT
+telephoneNumber: +1 048 741 0949
+givenName: Anderson
+uid: user.367
+homePhone: +1 097 626 0563
+entryUUID: 93778737-59fc-3c14-9e8b-d9c018451af3
+
+dn: uid=user.368,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andi Asgharzadeh$56636 Sunset Street$Sioux City, AK 40603
+initials: ALA
+street: 56636 Sunset Street
+mobile: +1 195 384 9023
+mail: user.368@maildomain.net
+employeeNumber: 368
+pager: +1 000 645 8499
+sn: Asgharzadeh
+postalCode: 40603
+userPassword: {SSHA}PyS3RtVm8ebD+r1CJ14MrMubSW/6aZBJweYTMA==
+description: This is the description for Andi Asgharzadeh.
+l: Sioux City
+cn: Andi Asgharzadeh
+st: AK
+telephoneNumber: +1 287 517 0224
+givenName: Andi
+uid: user.368
+homePhone: +1 050 450 0270
+entryUUID: b14e7451-c79d-3966-bb19-b36bbc1144e9
+
+dn: uid=user.369,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andie Ashar$45203 Birch Street$Sioux City, NE 12515
+initials: AGA
+street: 45203 Birch Street
+mobile: +1 037 992 9986
+mail: user.369@maildomain.net
+employeeNumber: 369
+pager: +1 423 502 9424
+sn: Ashar
+postalCode: 12515
+userPassword: {SSHA}I7eloaXm+hQThmXboBJTrxHmPfFLS5aMnursmQ==
+description: This is the description for Andie Ashar.
+l: Sioux City
+cn: Andie Ashar
+st: NE
+telephoneNumber: +1 117 923 0097
+givenName: Andie
+uid: user.369
+homePhone: +1 125 339 1107
+entryUUID: 8d7c9001-f680-3c15-a509-37526eff5deb
+
+dn: uid=user.370,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andra Ashbee$44791 Ash Street$Altoona, IA 03117
+initials: ANA
+street: 44791 Ash Street
+mobile: +1 012 307 8793
+mail: user.370@maildomain.net
+employeeNumber: 370
+pager: +1 664 070 1325
+sn: Ashbee
+postalCode: 03117
+userPassword: {SSHA}FFzr5EZJ+rcukbE9+vLUTe8EeZRNxh6SDmysxQ==
+description: This is the description for Andra Ashbee.
+l: Altoona
+cn: Andra Ashbee
+st: IA
+telephoneNumber: +1 485 368 0723
+givenName: Andra
+uid: user.370
+homePhone: +1 420 527 7480
+entryUUID: fb086546-6dc0-3d01-8907-d191cbf2d96a
+
+dn: uid=user.371,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andras Ashberry$10860 Twelfth Street$Monroe, KS 14821
+initials: ALA
+street: 10860 Twelfth Street
+mobile: +1 339 110 6208
+mail: user.371@maildomain.net
+employeeNumber: 371
+pager: +1 496 001 5920
+sn: Ashberry
+postalCode: 14821
+userPassword: {SSHA}3YFkSaSUWqWZQpuqAN0al/IV7d8U8MDdlEr2lQ==
+description: This is the description for Andras Ashberry.
+l: Monroe
+cn: Andras Ashberry
+st: KS
+telephoneNumber: +1 970 247 6942
+givenName: Andras
+uid: user.371
+homePhone: +1 470 744 4079
+entryUUID: 018e659c-600b-3fdd-9607-f680865458c6
+
+dn: uid=user.372,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andre Ashby$01461 Elm Street$Peoria, NM 65218
+initials: AIA
+street: 01461 Elm Street
+mobile: +1 594 961 0706
+mail: user.372@maildomain.net
+employeeNumber: 372
+pager: +1 387 694 5069
+sn: Ashby
+postalCode: 65218
+userPassword: {SSHA}UmIoxgbsp2+MDNKtQegd8etuOIabzTGzvzDJCw==
+description: This is the description for Andre Ashby.
+l: Peoria
+cn: Andre Ashby
+st: NM
+telephoneNumber: +1 041 657 7800
+givenName: Andre
+uid: user.372
+homePhone: +1 000 804 1407
+entryUUID: 4f90dab6-cdd4-3eeb-8fb6-df8f5e078fa2
+
+dn: uid=user.364,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andeee Ascott$67811 Cherry Street$Twin Falls, AL 06536
+initials: AXA
+street: 67811 Cherry Street
+mobile: +1 295 170 3792
+mail: user.364@maildomain.net
+employeeNumber: 364
+pager: +1 170 331 9326
+sn: Ascott
+postalCode: 06536
+userPassword: {SSHA}+vgdqwotHdTYD9sNkUnZlaErmnRu1Gv8zxMbXQ==
+description: This is the description for Andeee Ascott.
+l: Twin Falls
+cn: Andeee Ascott
+st: AL
+telephoneNumber: +1 912 125 9401
+givenName: Andeee
+uid: user.364
+homePhone: +1 701 207 0370
+entryUUID: 0a5f6c33-19d7-31dc-88b4-2f9d0a80bc5f
+
+dn: uid=user.373,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andrea Ashdown$29690 Central Street$Watertown, NH 06474
+initials: AZA
+street: 29690 Central Street
+mobile: +1 509 014 8392
+mail: user.373@maildomain.net
+employeeNumber: 373
+pager: +1 806 223 0429
+sn: Ashdown
+postalCode: 06474
+userPassword: {SSHA}Ra0lfrYgz92mOvtm59QJ9fnvmCQTegQQpy3xtQ==
+description: This is the description for Andrea Ashdown.
+l: Watertown
+cn: Andrea Ashdown
+st: NH
+telephoneNumber: +1 230 009 0099
+givenName: Andrea
+uid: user.373
+homePhone: +1 977 042 8160
+entryUUID: 565a0bc2-d138-3800-b8ac-830483cc5678
+
+dn: uid=user.374,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andreana Ashford$09092 Washington Street$Peoria, WI 70633
+initials: AEA
+street: 09092 Washington Street
+mobile: +1 130 799 0919
+mail: user.374@maildomain.net
+employeeNumber: 374
+pager: +1 730 908 5556
+sn: Ashford
+postalCode: 70633
+userPassword: {SSHA}tr08tHsdyrCdA8FaMbTRJkY7Zlq0q4SuZj6jIQ==
+description: This is the description for Andreana Ashford.
+l: Peoria
+cn: Andreana Ashford
+st: WI
+telephoneNumber: +1 486 315 6757
+givenName: Andreana
+uid: user.374
+homePhone: +1 925 605 5436
+entryUUID: 29156fa2-4ec8-383a-ae8f-3137e7d62e06
+
+dn: uid=user.375,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andreas Ashley$37016 Tenth Street$Harrisburg, IA 84878
+initials: ADA
+street: 37016 Tenth Street
+mobile: +1 932 158 0480
+mail: user.375@maildomain.net
+employeeNumber: 375
+pager: +1 392 609 2129
+sn: Ashley
+postalCode: 84878
+userPassword: {SSHA}FFqjVxpYj+ZuuJE15r7kCvhwUV5pgvNkR6WjtQ==
+description: This is the description for Andreas Ashley.
+l: Harrisburg
+cn: Andreas Ashley
+st: IA
+telephoneNumber: +1 736 628 0339
+givenName: Andreas
+uid: user.375
+homePhone: +1 181 364 5361
+entryUUID: 8e6f700d-d56f-31df-b66b-fc61ed0c2473
+
+dn: uid=user.376,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andree Ashmore$54053 East Street$Tuscaloosa, PA 91077
+initials: ASA
+street: 54053 East Street
+mobile: +1 236 315 2272
+mail: user.376@maildomain.net
+employeeNumber: 376
+pager: +1 751 215 0932
+sn: Ashmore
+postalCode: 91077
+userPassword: {SSHA}TjAZJ4aPQR9+bd1niHjdv1Tws43V8NazlYjDQg==
+description: This is the description for Andree Ashmore.
+l: Tuscaloosa
+cn: Andree Ashmore
+st: PA
+telephoneNumber: +1 330 518 2240
+givenName: Andree
+uid: user.376
+homePhone: +1 875 006 2821
+entryUUID: 91f33537-6a0a-3312-8e06-5b9d59dc9479
+
+dn: uid=user.377,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andrei Ashraf$00069 Ridge Street$Huntington, AK 19635
+initials: AOA
+street: 00069 Ridge Street
+mobile: +1 288 607 6316
+mail: user.377@maildomain.net
+employeeNumber: 377
+pager: +1 046 201 0089
+sn: Ashraf
+postalCode: 19635
+userPassword: {SSHA}pqBLWR9tNJ8jbsBcH8mYhVpyT1KEF9KjH+lWyw==
+description: This is the description for Andrei Ashraf.
+l: Huntington
+cn: Andrei Ashraf
+st: AK
+telephoneNumber: +1 751 690 8670
+givenName: Andrei
+uid: user.377
+homePhone: +1 133 020 3566
+entryUUID: b3690330-5291-383c-bc5d-9e0859051b77
+
+dn: uid=user.378,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andrejs Ashton$31001 Hillcrest Street$El Paso, MS 88947
+initials: AOA
+street: 31001 Hillcrest Street
+mobile: +1 739 263 7772
+mail: user.378@maildomain.net
+employeeNumber: 378
+pager: +1 087 054 1174
+sn: Ashton
+postalCode: 88947
+userPassword: {SSHA}RaRUlf03MtHlareK0KlOOhaTx1Y9Y/5t7CBUJg==
+description: This is the description for Andrejs Ashton.
+l: El Paso
+cn: Andrejs Ashton
+st: MS
+telephoneNumber: +1 795 115 5130
+givenName: Andrejs
+uid: user.378
+homePhone: +1 195 445 0637
+entryUUID: 45716bf4-4450-38d6-9d7a-cf407ac80644
+
+dn: uid=user.379,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andres Ashurkoff$42528 Poplar Street$North Platte, AR 79856
+initials: AXA
+street: 42528 Poplar Street
+mobile: +1 330 722 5572
+mail: user.379@maildomain.net
+employeeNumber: 379
+pager: +1 790 604 8759
+sn: Ashurkoff
+postalCode: 79856
+userPassword: {SSHA}XhC0jIeCExvfSMGxPZbpthXiC8rXepQPvtStPQ==
+description: This is the description for Andres Ashurkoff.
+l: North Platte
+cn: Andres Ashurkoff
+st: AR
+telephoneNumber: +1 957 151 0100
+givenName: Andres
+uid: user.379
+homePhone: +1 431 081 0450
+entryUUID: 122e7681-04c1-338c-82be-760099b544a8
+
+dn: uid=user.380,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andrew Ashwood-Smith$07029 Ridge Street$Johnstown, WA 75001
+initials: ALA
+street: 07029 Ridge Street
+mobile: +1 995 494 8359
+mail: user.380@maildomain.net
+employeeNumber: 380
+pager: +1 319 753 3040
+sn: Ashwood-Smith
+postalCode: 75001
+userPassword: {SSHA}BCGNHIwppkGstpWSzugecXFPVR8A1kuPUieCQg==
+description: This is the description for Andrew Ashwood-Smith.
+l: Johnstown
+cn: Andrew Ashwood-Smith
+st: WA
+telephoneNumber: +1 895 963 9109
+givenName: Andrew
+uid: user.380
+homePhone: +1 472 666 2910
+entryUUID: 124064ea-4141-37dd-bf16-56a0bb220dfc
+
+dn: uid=user.381,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andria Ashworth$01655 Eighth Street$Charlotte, AR 00077
+initials: APA
+street: 01655 Eighth Street
+mobile: +1 605 084 9199
+mail: user.381@maildomain.net
+employeeNumber: 381
+pager: +1 015 509 3814
+sn: Ashworth
+postalCode: 00077
+userPassword: {SSHA}TwZPvyw/CwkQ+lDrJjd1MlvT9+LNhR+MeRuzww==
+description: This is the description for Andria Ashworth.
+l: Charlotte
+cn: Andria Ashworth
+st: AR
+telephoneNumber: +1 325 406 1342
+givenName: Andria
+uid: user.381
+homePhone: +1 517 498 4310
+entryUUID: ba87ec43-692c-32e5-9ea7-6ed338c08a0a
+
+dn: uid=user.382,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andriana Asing$78313 Fourth Street$Redding, NY 44055
+initials: ARA
+street: 78313 Fourth Street
+mobile: +1 699 006 9072
+mail: user.382@maildomain.net
+employeeNumber: 382
+pager: +1 724 334 4454
+sn: Asing
+postalCode: 44055
+userPassword: {SSHA}qUaaJEFE1OFMNQKny4fx+0Fkd5YaGWYIgfrXhQ==
+description: This is the description for Andriana Asing.
+l: Redding
+cn: Andriana Asing
+st: NY
+telephoneNumber: +1 730 604 8858
+givenName: Andriana
+uid: user.382
+homePhone: +1 698 343 6105
+entryUUID: dfebfc2a-6816-39fe-acf3-48ce98466777
+
+dn: uid=user.383,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andriette Asistores$01591 Hill Street$New York, NJ 73806
+initials: AXA
+street: 01591 Hill Street
+mobile: +1 108 005 3470
+mail: user.383@maildomain.net
+employeeNumber: 383
+pager: +1 638 039 6098
+sn: Asistores
+postalCode: 73806
+userPassword: {SSHA}HNDitR06dlmneHwi4Uj83jVXELX66fXCjlY8Eg==
+description: This is the description for Andriette Asistores.
+l: New York
+cn: Andriette Asistores
+st: NJ
+telephoneNumber: +1 892 020 0543
+givenName: Andriette
+uid: user.383
+homePhone: +1 160 040 1319
+entryUUID: 69346a41-9297-3efc-acb4-2174273d3f95
+
+dn: uid=user.384,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andromache Askins$16419 Lee Street$Monterey Bay Area, OH 07024
+initials: APA
+street: 16419 Lee Street
+mobile: +1 210 000 8000
+mail: user.384@maildomain.net
+employeeNumber: 384
+pager: +1 714 176 0810
+sn: Askins
+postalCode: 07024
+userPassword: {SSHA}iCcCfwcs3jic+muJYmsCwrck/9zGVlt7yGzr0A==
+description: This is the description for Andromache Askins.
+l: Monterey Bay Area
+cn: Andromache Askins
+st: OH
+telephoneNumber: +1 437 041 2565
+givenName: Andromache
+uid: user.384
+homePhone: +1 987 725 9081
+entryUUID: 5547218a-5d3e-39bb-be9d-454d5708b4ef
+
+dn: uid=user.385,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andrzej Asprer$74066 Johnson Street$Memphis, ME 41050
+initials: AQA
+street: 74066 Johnson Street
+mobile: +1 322 569 4490
+mail: user.385@maildomain.net
+employeeNumber: 385
+pager: +1 650 028 5684
+sn: Asprer
+postalCode: 41050
+userPassword: {SSHA}Zf5zG/jFOy/hjuvTpXKsphxF5xCTwHwSjFHtKw==
+description: This is the description for Andrzej Asprer.
+l: Memphis
+cn: Andrzej Asprer
+st: ME
+telephoneNumber: +1 903 890 6880
+givenName: Andrzej
+uid: user.385
+homePhone: +1 870 637 9311
+entryUUID: 118fe0ce-8e8d-3196-86d3-1c8620648363
+
+dn: uid=user.386,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Andy Asquin$70090 Adams Street$Columbia, MS 54377
+initials: APA
+street: 70090 Adams Street
+mobile: +1 010 202 5070
+mail: user.386@maildomain.net
+employeeNumber: 386
+pager: +1 904 878 3305
+sn: Asquin
+postalCode: 54377
+userPassword: {SSHA}yzP43Ss4e0105NqxLio4N/ak0bgQctpnDAE03g==
+description: This is the description for Andy Asquin.
+l: Columbia
+cn: Andy Asquin
+st: MS
+telephoneNumber: +1 899 023 3890
+givenName: Andy
+uid: user.386
+homePhone: +1 004 457 6425
+entryUUID: 89b67c90-c5c6-3038-9d59-a9287e8fd8e3
+
+dn: uid=user.387,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anestassia Assaad$20717 Forest Street$Cincinnati, WY 64463
+initials: AWA
+street: 20717 Forest Street
+mobile: +1 480 970 8741
+mail: user.387@maildomain.net
+employeeNumber: 387
+pager: +1 015 284 0202
+sn: Assaad
+postalCode: 64463
+userPassword: {SSHA}E1kplM3i2aMh862EhS8/WVAvLp4gHbV28jj5hw==
+description: This is the description for Anestassia Assaad.
+l: Cincinnati
+cn: Anestassia Assaad
+st: WY
+telephoneNumber: +1 463 132 0763
+givenName: Anestassia
+uid: user.387
+homePhone: +1 698 130 7700
+entryUUID: e3f42b80-f9b3-36a1-a115-f0bccf442d2c
+
+dn: uid=user.388,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anet Asselin$85228 Eighth Street$Tallahassee, HI 93749
+initials: ABA
+street: 85228 Eighth Street
+mobile: +1 990 011 0655
+mail: user.388@maildomain.net
+employeeNumber: 388
+pager: +1 087 890 1757
+sn: Asselin
+postalCode: 93749
+userPassword: {SSHA}/Pxzygyrcvjx3xo1EoIMEmgHPtqpOotyD3SZgA==
+description: This is the description for Anet Asselin.
+l: Tallahassee
+cn: Anet Asselin
+st: HI
+telephoneNumber: +1 822 980 5705
+givenName: Anet
+uid: user.388
+homePhone: +1 587 490 4627
+entryUUID: e05b4251-ba76-38e2-bf63-2c9da3bdf406
+
+dn: uid=user.389,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anett Assenza$32553 Central Street$Twin Falls, MD 00402
+initials: AIA
+street: 32553 Central Street
+mobile: +1 039 033 0740
+mail: user.389@maildomain.net
+employeeNumber: 389
+pager: +1 140 581 3674
+sn: Assenza
+postalCode: 00402
+userPassword: {SSHA}u4Ux1nbZJm7ArZXBG7NTxn+/iWVvl++9Fo91lQ==
+description: This is the description for Anett Assenza.
+l: Twin Falls
+cn: Anett Assenza
+st: MD
+telephoneNumber: +1 709 980 7422
+givenName: Anett
+uid: user.389
+homePhone: +1 100 341 5300
+entryUUID: 78959b9e-bf7c-3de6-8180-ed0a8e54a73e
+
+dn: uid=user.390,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anetta Assistance$23303 Poplar Street$La Crosse, NH 64080
+initials: AVA
+street: 23303 Poplar Street
+mobile: +1 476 308 8072
+mail: user.390@maildomain.net
+employeeNumber: 390
+pager: +1 163 744 6800
+sn: Assistance
+postalCode: 64080
+userPassword: {SSHA}yJzQ1NX46Sj09/QqfRu8Tt3k4+v6iZVR9BWL4w==
+description: This is the description for Anetta Assistance.
+l: La Crosse
+cn: Anetta Assistance
+st: NH
+telephoneNumber: +1 400 151 7053
+givenName: Anetta
+uid: user.390
+homePhone: +1 294 021 3882
+entryUUID: 200f4de4-ceeb-324a-9dd9-95c286c547d0
+
+dn: uid=user.391,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anette Associates$26894 Johnson Street$Milwaukee, NC 09343
+initials: ADA
+street: 26894 Johnson Street
+mobile: +1 655 005 7584
+mail: user.391@maildomain.net
+employeeNumber: 391
+pager: +1 059 710 5449
+sn: Associates
+postalCode: 09343
+userPassword: {SSHA}KrsdN61MLFLxtOChRsqO5ZaX0VrLANrKSAvtTw==
+description: This is the description for Anette Associates.
+l: Milwaukee
+cn: Anette Associates
+st: NC
+telephoneNumber: +1 623 750 2644
+givenName: Anette
+uid: user.391
+homePhone: +1 131 079 6092
+entryUUID: be04e9bf-97ed-3baa-8c70-ac735f47ab14
+
+dn: uid=user.392,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ange Astalos$58416 Eleventh Street$Kansas City, AR 11007
+initials: AGA
+street: 58416 Eleventh Street
+mobile: +1 976 610 1117
+mail: user.392@maildomain.net
+employeeNumber: 392
+pager: +1 087 083 5016
+sn: Astalos
+postalCode: 11007
+userPassword: {SSHA}gk0WTooFRGiBuicQhbVCEr/cLF57ndTwArh0NQ==
+description: This is the description for Ange Astalos.
+l: Kansas City
+cn: Ange Astalos
+st: AR
+telephoneNumber: +1 006 086 3400
+givenName: Ange
+uid: user.392
+homePhone: +1 515 045 0045
+entryUUID: d32dcea0-e8fd-3ab5-a656-12a0feef35f4
+
+dn: uid=user.393,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angel Astle$07676 North Street$Wichita FallsLawton, IL 08505
+initials: AJA
+street: 07676 North Street
+mobile: +1 254 285 3257
+mail: user.393@maildomain.net
+employeeNumber: 393
+pager: +1 434 302 7158
+sn: Astle
+postalCode: 08505
+userPassword: {SSHA}J6u5vt5zFQ6i3yg9iXr2+l8N7nFuuJZeN8cetA==
+description: This is the description for Angel Astle.
+l: Wichita FallsLawton
+cn: Angel Astle
+st: IL
+telephoneNumber: +1 873 478 0253
+givenName: Angel
+uid: user.393
+homePhone: +1 082 045 3847
+entryUUID: 3c34baff-dde3-32ad-845a-9122ac9ac8a9
+
+dn: uid=user.394,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angela Astley$11080 Washington Street$Paducah, CA 51020
+initials: AVA
+street: 11080 Washington Street
+mobile: +1 891 625 3275
+mail: user.394@maildomain.net
+employeeNumber: 394
+pager: +1 982 520 1246
+sn: Astley
+postalCode: 51020
+userPassword: {SSHA}irG3Ovn1aW3kOJfFuktizDTcyPZEQjV6pzJuVw==
+description: This is the description for Angela Astley.
+l: Paducah
+cn: Angela Astley
+st: CA
+telephoneNumber: +1 009 999 0130
+givenName: Angela
+uid: user.394
+homePhone: +1 160 608 0235
+entryUUID: 68f191b0-b855-32b3-9739-b55f544b2c6f
+
+dn: uid=user.395,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angele Aston$61324 Broadway Street$Wilmington, ND 42363
+initials: AVA
+street: 61324 Broadway Street
+mobile: +1 069 571 7279
+mail: user.395@maildomain.net
+employeeNumber: 395
+pager: +1 799 030 2432
+sn: Aston
+postalCode: 42363
+userPassword: {SSHA}qxtNah+yXR+HKEWaghgEtVBTkfczU5Cckl64uw==
+description: This is the description for Angele Aston.
+l: Wilmington
+cn: Angele Aston
+st: ND
+telephoneNumber: +1 779 236 8274
+givenName: Angele
+uid: user.395
+homePhone: +1 862 032 8059
+entryUUID: e94972a9-d9e3-38e4-88fb-882502d5cfa9
+
+dn: uid=user.396,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angeles Astor$07958 West Street$San Diego, WV 37197
+initials: AMA
+street: 07958 West Street
+mobile: +1 001 703 0217
+mail: user.396@maildomain.net
+employeeNumber: 396
+pager: +1 244 742 2804
+sn: Astor
+postalCode: 37197
+userPassword: {SSHA}cbC7/MwfQeE9LNrxj38dCsqkXZfjpZIfwMdOjw==
+description: This is the description for Angeles Astor.
+l: San Diego
+cn: Angeles Astor
+st: WV
+telephoneNumber: +1 738 174 0916
+givenName: Angeles
+uid: user.396
+homePhone: +1 545 057 6840
+entryUUID: fb8c63d1-45f4-3540-a1b1-0f14a02502c9
+
+dn: uid=user.397,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelia Astorino$43594 Hill Street$Bowling Green, PA 10146
+initials: ACA
+street: 43594 Hill Street
+mobile: +1 702 905 8766
+mail: user.397@maildomain.net
+employeeNumber: 397
+pager: +1 190 740 9572
+sn: Astorino
+postalCode: 10146
+userPassword: {SSHA}RQxQJONqJiTM1RwZRSHlsza8ysmPirPV8uSf0g==
+description: This is the description for Angelia Astorino.
+l: Bowling Green
+cn: Angelia Astorino
+st: PA
+telephoneNumber: +1 297 213 0194
+givenName: Angelia
+uid: user.397
+homePhone: +1 346 488 7815
+entryUUID: af12ff55-c91d-3df5-b5d7-237592a9e178
+
+dn: uid=user.398,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelica Atalla$66973 Thirteenth Street$Erie, TN 69015
+initials: ADA
+street: 66973 Thirteenth Street
+mobile: +1 892 759 1506
+mail: user.398@maildomain.net
+employeeNumber: 398
+pager: +1 510 557 2836
+sn: Atalla
+postalCode: 69015
+userPassword: {SSHA}lt9wYe+hC1KnFWxJa04HSKSIveRw4E7kF+UdDA==
+description: This is the description for Angelica Atalla.
+l: Erie
+cn: Angelica Atalla
+st: TN
+telephoneNumber: +1 010 796 0760
+givenName: Angelica
+uid: user.398
+homePhone: +1 595 507 0307
+entryUUID: b315625b-721c-34d3-bba4-fa8249fb5fda
+
+dn: uid=user.399,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelie Atcheson$76886 Church Street$Omaha, MI 35158
+initials: AWA
+street: 76886 Church Street
+mobile: +1 262 012 9064
+mail: user.399@maildomain.net
+employeeNumber: 399
+pager: +1 011 659 6270
+sn: Atcheson
+postalCode: 35158
+userPassword: {SSHA}c45ApiOedu8y/j2E2Ay5PNh/oOjCpuQE9tVMUg==
+description: This is the description for Angelie Atcheson.
+l: Omaha
+cn: Angelie Atcheson
+st: MI
+telephoneNumber: +1 859 898 6036
+givenName: Angelie
+uid: user.399
+homePhone: +1 027 003 7530
+entryUUID: 39ac9257-e835-3634-a309-9bb8157498e0
+
+dn: uid=user.400,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angeliek Atchison$09796 South Street$North Platte, AZ 01601
+initials: AQA
+street: 09796 South Street
+mobile: +1 893 293 4426
+mail: user.400@maildomain.net
+employeeNumber: 400
+pager: +1 865 660 3076
+sn: Atchison
+postalCode: 01601
+userPassword: {SSHA}4UWeqeLGtZpBp3R0UAZAU3q+HfTfiyGjLQtvVA==
+description: This is the description for Angeliek Atchison.
+l: North Platte
+cn: Angeliek Atchison
+st: AZ
+telephoneNumber: +1 776 898 7723
+givenName: Angeliek
+uid: user.400
+homePhone: +1 469 515 2773
+entryUUID: 9fab28e1-e2cc-3219-bd22-4ca80c2a4e48
+
+dn: uid=user.401,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelika Athanassiadis$47087 North Street$Las Vegas, IA 64101
+initials: APA
+street: 47087 North Street
+mobile: +1 100 754 1654
+mail: user.401@maildomain.net
+employeeNumber: 401
+pager: +1 030 235 2476
+sn: Athanassiadis
+postalCode: 64101
+userPassword: {SSHA}8L5IAgoAzbSZSMJgExbx5Vp9fONJ2CQSr2P9tQ==
+description: This is the description for Angelika Athanassiadis.
+l: Las Vegas
+cn: Angelika Athanassiadis
+st: IA
+telephoneNumber: +1 809 500 7799
+givenName: Angelika
+uid: user.401
+homePhone: +1 402 039 2616
+entryUUID: d8bc2184-8045-3b6d-ac5e-3091c00c2462
+
+dn: uid=user.402,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelina Athwal$57453 College Street$Augusta, OK 99589
+initials: AKA
+street: 57453 College Street
+mobile: +1 504 400 7091
+mail: user.402@maildomain.net
+employeeNumber: 402
+pager: +1 126 360 0421
+sn: Athwal
+postalCode: 99589
+userPassword: {SSHA}CHAMWN+4Mijv7m4N66GMRWT9/m2V/GcpONzOeg==
+description: This is the description for Angelina Athwal.
+l: Augusta
+cn: Angelina Athwal
+st: OK
+telephoneNumber: +1 897 493 8543
+givenName: Angelina
+uid: user.402
+homePhone: +1 798 105 8896
+entryUUID: 4c94c2ac-a640-371f-95d5-0fa72b2710dc
+
+dn: uid=user.403,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angeline Atkins$74909 South Street$Hampton Roads, MT 13045
+initials: ABA
+street: 74909 South Street
+mobile: +1 042 060 2879
+mail: user.403@maildomain.net
+employeeNumber: 403
+pager: +1 026 339 6290
+sn: Atkins
+postalCode: 13045
+userPassword: {SSHA}Jjf8SZ5gqse036hdXmMTrHGtFAaWNC9wP8eHzw==
+description: This is the description for Angeline Atkins.
+l: Hampton Roads
+cn: Angeline Atkins
+st: MT
+telephoneNumber: +1 064 121 7396
+givenName: Angeline
+uid: user.403
+homePhone: +1 654 544 9511
+entryUUID: 4de32f25-f5f6-34af-a403-b69909ef0b5d
+
+dn: uid=user.404,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelique Atkinson$57759 Main Street$Anchorage, CO 39978
+initials: AUA
+street: 57759 Main Street
+mobile: +1 636 760 0665
+mail: user.404@maildomain.net
+employeeNumber: 404
+pager: +1 526 605 7832
+sn: Atkinson
+postalCode: 39978
+userPassword: {SSHA}/ZEeB1hDNG+L3wttyGcaAIf/Sqc97+dRbpdDgg==
+description: This is the description for Angelique Atkinson.
+l: Anchorage
+cn: Angelique Atkinson
+st: CO
+telephoneNumber: +1 792 710 7874
+givenName: Angelique
+uid: user.404
+homePhone: +1 678 128 5580
+entryUUID: 0c4bf9ba-6760-3066-9f09-e3ff847f93c5
+
+dn: uid=user.405,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelita Atl$76866 Madison Street$Marquette, IN 97456
+initials: ASA
+street: 76866 Madison Street
+mobile: +1 430 140 1986
+mail: user.405@maildomain.net
+employeeNumber: 405
+pager: +1 136 144 1008
+sn: Atl
+postalCode: 97456
+userPassword: {SSHA}zcb9qxB51kt3HeMIG8FcOJ+RBawCSpzwvHddDg==
+description: This is the description for Angelita Atl.
+l: Marquette
+cn: Angelita Atl
+st: IN
+telephoneNumber: +1 764 801 1060
+givenName: Angelita
+uid: user.405
+homePhone: +1 228 115 2096
+entryUUID: 967ec081-e408-399c-8d6e-7976e488448b
+
+dn: uid=user.406,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelle Atlantic$79305 Oak Street$Fort Smith, OH 91940
+initials: AJA
+street: 79305 Oak Street
+mobile: +1 901 174 4866
+mail: user.406@maildomain.net
+employeeNumber: 406
+pager: +1 006 017 5511
+sn: Atlantic
+postalCode: 91940
+userPassword: {SSHA}mBIPeq7mM7kBtXbHugidJwHS8fLbv652hIRDhA==
+description: This is the description for Angelle Atlantic.
+l: Fort Smith
+cn: Angelle Atlantic
+st: OH
+telephoneNumber: +1 463 296 3857
+givenName: Angelle
+uid: user.406
+homePhone: +1 338 207 7966
+entryUUID: 71d890a5-fc71-3549-97e7-6c0f2d10163a
+
+dn: uid=user.407,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angelo Atoui$00005 Locust Street$Biloxi, TX 07349
+initials: AFA
+street: 00005 Locust Street
+mobile: +1 303 778 2715
+mail: user.407@maildomain.net
+employeeNumber: 407
+pager: +1 585 948 3500
+sn: Atoui
+postalCode: 07349
+userPassword: {SSHA}AqS1c5rLnwmUe/pVvv+hHIuvVRUCfxboWWtQ0w==
+description: This is the description for Angelo Atoui.
+l: Biloxi
+cn: Angelo Atoui
+st: TX
+telephoneNumber: +1 707 729 8079
+givenName: Angelo
+uid: user.407
+homePhone: +1 232 331 7293
+entryUUID: 4318ebd3-025d-3a65-9373-967c11f3b0d9
+
+dn: uid=user.408,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angie Atprs$16053 Thirteenth Street$Hartford, CT 24998
+initials: ANA
+street: 16053 Thirteenth Street
+mobile: +1 224 116 0998
+mail: user.408@maildomain.net
+employeeNumber: 408
+pager: +1 164 286 4924
+sn: Atprs
+postalCode: 24998
+userPassword: {SSHA}d9T0hdpt5MmhaQToSkG5bwpP0eQgfsSZcROofg==
+description: This is the description for Angie Atprs.
+l: Hartford
+cn: Angie Atprs
+st: CT
+telephoneNumber: +1 295 940 2750
+givenName: Angie
+uid: user.408
+homePhone: +1 604 109 3407
+entryUUID: a6e6f13a-9505-3c1c-bf76-cc7004c63f98
+
+dn: uid=user.409,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angil Attanasio$16031 Cherry Street$Biloxi, WY 10182
+initials: ADA
+street: 16031 Cherry Street
+mobile: +1 840 951 0039
+mail: user.409@maildomain.net
+employeeNumber: 409
+pager: +1 650 622 7719
+sn: Attanasio
+postalCode: 10182
+userPassword: {SSHA}UsPhAPT/0pfYJSnYvi6ewRTsDVCYsBiOx8YIIg==
+description: This is the description for Angil Attanasio.
+l: Biloxi
+cn: Angil Attanasio
+st: WY
+telephoneNumber: +1 091 438 1890
+givenName: Angil
+uid: user.409
+homePhone: +1 472 824 8704
+entryUUID: 2c125bd0-3aed-38f5-98bc-869e20c791ee
+
+dn: uid=user.410,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angus Attarchi$55488 Spruce Street$Reno, PA 45103
+initials: AGA
+street: 55488 Spruce Street
+mobile: +1 029 047 0821
+mail: user.410@maildomain.net
+employeeNumber: 410
+pager: +1 045 834 8100
+sn: Attarchi
+postalCode: 45103
+userPassword: {SSHA}gqMbku2ynxnV0WcSe275prZQtnUAcwsYd7RMyw==
+description: This is the description for Angus Attarchi.
+l: Reno
+cn: Angus Attarchi
+st: PA
+telephoneNumber: +1 399 367 9609
+givenName: Angus
+uid: user.410
+homePhone: +1 997 492 6754
+entryUUID: 57f0ab88-64ef-3cf6-9338-3fd90977ee93
+
+dn: uid=user.411,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Angy Attard$29945 North Street$Bloomington, WV 94017
+initials: AIA
+street: 29945 North Street
+mobile: +1 047 242 0048
+mail: user.411@maildomain.net
+employeeNumber: 411
+pager: +1 837 650 2500
+sn: Attard
+postalCode: 94017
+userPassword: {SSHA}gS0fjiFs3iTWtLt4EGABKAs0IfMNxFM92J4btw==
+description: This is the description for Angy Attard.
+l: Bloomington
+cn: Angy Attard
+st: WV
+telephoneNumber: +1 673 146 2000
+givenName: Angy
+uid: user.411
+homePhone: +1 863 739 1102
+entryUUID: bcfa9de0-2a99-3215-96ac-a0aed27ac478
+
+dn: uid=user.412,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anhtuan Attaway$22080 Hill Street$Bakersfield, ME 73430
+initials: AUA
+street: 22080 Hill Street
+mobile: +1 288 181 8800
+mail: user.412@maildomain.net
+employeeNumber: 412
+pager: +1 306 351 0544
+sn: Attaway
+postalCode: 73430
+userPassword: {SSHA}CU9WsytwyiGVf5VpQegcpNz+jIiB6xk+Y6x0AA==
+description: This is the description for Anhtuan Attaway.
+l: Bakersfield
+cn: Anhtuan Attaway
+st: ME
+telephoneNumber: +1 539 780 2958
+givenName: Anhtuan
+uid: user.412
+homePhone: +1 642 006 0247
+entryUUID: 38c471fd-d150-3c33-88e2-1f884f76fb65
+
+dn: uid=user.413,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ania Attenborough$26600 Twelfth Street$Las Vegas, WV 38002
+initials: AIA
+street: 26600 Twelfth Street
+mobile: +1 100 760 3935
+mail: user.413@maildomain.net
+employeeNumber: 413
+pager: +1 918 141 3270
+sn: Attenborough
+postalCode: 38002
+userPassword: {SSHA}BEU8arml5MnIvUhgk5ktEIVJ27rcH28iZrCZdQ==
+description: This is the description for Ania Attenborough.
+l: Las Vegas
+cn: Ania Attenborough
+st: WV
+telephoneNumber: +1 470 664 0850
+givenName: Ania
+uid: user.413
+homePhone: +1 032 521 7743
+entryUUID: 92d405fd-ef14-3f48-bad6-b7ce7659840c
+
+dn: uid=user.414,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anibal Atteridge$69204 Maple Street$Richmond, ND 07031
+initials: AWA
+street: 69204 Maple Street
+mobile: +1 354 903 7125
+mail: user.414@maildomain.net
+employeeNumber: 414
+pager: +1 803 725 2508
+sn: Atteridge
+postalCode: 07031
+userPassword: {SSHA}P/YN6BISFAx5yN02tJuhhARGUiTWXGVlEmkDuQ==
+description: This is the description for Anibal Atteridge.
+l: Richmond
+cn: Anibal Atteridge
+st: ND
+telephoneNumber: +1 538 763 1811
+givenName: Anibal
+uid: user.414
+homePhone: +1 646 154 4334
+entryUUID: b8cd7ae2-75b1-36e5-9ea1-35eeabbcc120
+
+dn: uid=user.415,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anica Attfield$82183 Ninth Street$Redding, AR 57766
+initials: ARA
+street: 82183 Ninth Street
+mobile: +1 946 604 0051
+mail: user.415@maildomain.net
+employeeNumber: 415
+pager: +1 689 801 1409
+sn: Attfield
+postalCode: 57766
+userPassword: {SSHA}bqs+mgQRmbWmzFeqEANd9yngqLvxP6N5cjL3Og==
+description: This is the description for Anica Attfield.
+l: Redding
+cn: Anica Attfield
+st: AR
+telephoneNumber: +1 005 370 0244
+givenName: Anica
+uid: user.415
+homePhone: +1 190 451 5765
+entryUUID: 2349f94b-d90b-3edd-9f04-55479e8b7e7d
+
+dn: uid=user.416,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aniko Atwater$01278 Tenth Street$Sioux Falls, OR 80359
+initials: ACA
+street: 01278 Tenth Street
+mobile: +1 666 104 0172
+mail: user.416@maildomain.net
+employeeNumber: 416
+pager: +1 894 073 2994
+sn: Atwater
+postalCode: 80359
+userPassword: {SSHA}X8p3M/9DkiTSVorH9U3QGzcPQXesNfNlNxpHqg==
+description: This is the description for Aniko Atwater.
+l: Sioux Falls
+cn: Aniko Atwater
+st: OR
+telephoneNumber: +1 006 603 9520
+givenName: Aniko
+uid: user.416
+homePhone: +1 488 422 0506
+entryUUID: c33f21af-00ff-3b49-aeac-4105c6ec5270
+
+dn: uid=user.417,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anil Atwell-Byrne$07594 Woodland Street$Little Rock, MT 16864
+initials: ANA
+street: 07594 Woodland Street
+mobile: +1 360 880 1026
+mail: user.417@maildomain.net
+employeeNumber: 417
+pager: +1 520 576 7900
+sn: Atwell-Byrne
+postalCode: 16864
+userPassword: {SSHA}OsKg20GYwKA/0CoemYOoqueP1sMT2eynjyac0g==
+description: This is the description for Anil Atwell-Byrne.
+l: Little Rock
+cn: Anil Atwell-Byrne
+st: MT
+telephoneNumber: +1 489 385 3839
+givenName: Anil
+uid: user.417
+homePhone: +1 389 306 1582
+entryUUID: a62adbbc-b4dd-3cc0-b86c-6f0dec50e015
+
+dn: uid=user.418,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anissa Au$26560 Forest Street$Harrisburg, WI 20663
+initials: AZA
+street: 26560 Forest Street
+mobile: +1 340 026 8131
+mail: user.418@maildomain.net
+employeeNumber: 418
+pager: +1 739 007 0432
+sn: Au
+postalCode: 20663
+userPassword: {SSHA}qhJZGpdqUo0PBMcUAdRbFaUznenC8DTHXJLNog==
+description: This is the description for Anissa Au.
+l: Harrisburg
+cn: Anissa Au
+st: WI
+telephoneNumber: +1 000 456 2019
+givenName: Anissa
+uid: user.418
+homePhone: +1 009 621 3545
+entryUUID: f3b860c0-5d1a-3172-8a46-e5d4dae23fe6
+
+dn: uid=user.419,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anita Au-Yang$16334 Hillcrest Street$Clarksburg, NC 34728
+initials: AWA
+street: 16334 Hillcrest Street
+mobile: +1 017 812 7380
+mail: user.419@maildomain.net
+employeeNumber: 419
+pager: +1 159 300 3603
+sn: Au-Yang
+postalCode: 34728
+userPassword: {SSHA}kkPGxCjtBRwIsOurceC43HL0C1+dP4rlgMt+/Q==
+description: This is the description for Anita Au-Yang.
+l: Clarksburg
+cn: Anita Au-Yang
+st: NC
+telephoneNumber: +1 698 047 7770
+givenName: Anita
+uid: user.419
+homePhone: +1 699 539 6751
+entryUUID: 874ab442-93cf-3c68-9f3f-5f1d95c72b45
+
+dn: uid=user.420,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anitra Au-Yeung$02850 Main Street$Pittsburgh, NE 00396
+initials: ALA
+street: 02850 Main Street
+mobile: +1 084 714 2902
+mail: user.420@maildomain.net
+employeeNumber: 420
+pager: +1 712 030 2731
+sn: Au-Yeung
+postalCode: 00396
+userPassword: {SSHA}6avDTeeqJe3smfKvfRS6jx38MYe/PPqmJrS3/g==
+description: This is the description for Anitra Au-Yeung.
+l: Pittsburgh
+cn: Anitra Au-Yeung
+st: NE
+telephoneNumber: +1 098 050 9882
+givenName: Anitra
+uid: user.420
+homePhone: +1 539 195 0320
+entryUUID: b89c9945-0415-3d23-acda-5373a4d3bde4
+
+dn: uid=user.421,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anja AuYeung$76110 Miller Street$Cedar Rapids, ND 42813
+initials: AXA
+street: 76110 Miller Street
+mobile: +1 543 793 0280
+mail: user.421@maildomain.net
+employeeNumber: 421
+pager: +1 063 373 1605
+sn: AuYeung
+postalCode: 42813
+userPassword: {SSHA}rdqReh9BBqUKiWlxUni8X2TuC290BVxsIBYgNA==
+description: This is the description for Anja AuYeung.
+l: Cedar Rapids
+cn: Anja AuYeung
+st: ND
+telephoneNumber: +1 876 813 3821
+givenName: Anja
+uid: user.421
+homePhone: +1 825 829 2303
+entryUUID: 1340cff6-95a1-32e3-a678-a44b6a6c071f
+
+dn: uid=user.422,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anjanette Aubin$64496 Fifth Street$Wichita Falls, KS 15088
+initials: AXA
+street: 64496 Fifth Street
+mobile: +1 801 686 7005
+mail: user.422@maildomain.net
+employeeNumber: 422
+pager: +1 950 722 0062
+sn: Aubin
+postalCode: 15088
+userPassword: {SSHA}FF/lUCYfEp9r26EEKzxJ5p9zhqY/Tb1Q3O9/ug==
+description: This is the description for Anjanette Aubin.
+l: Wichita Falls
+cn: Anjanette Aubin
+st: KS
+telephoneNumber: +1 213 004 6282
+givenName: Anjanette
+uid: user.422
+homePhone: +1 161 987 0914
+entryUUID: 737f07c7-676c-3027-932b-64675889b2d8
+
+dn: uid=user.423,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anje Aubrey$05762 Pine Street$Missoula, SD 51571
+initials: AVA
+street: 05762 Pine Street
+mobile: +1 306 503 9106
+mail: user.423@maildomain.net
+employeeNumber: 423
+pager: +1 279 019 3087
+sn: Aubrey
+postalCode: 51571
+userPassword: {SSHA}5+1sFKhNkKrJvJwXSPbl/0qvFVo0A934glRc/A==
+description: This is the description for Anje Aubrey.
+l: Missoula
+cn: Anje Aubrey
+st: SD
+telephoneNumber: +1 197 576 3730
+givenName: Anje
+uid: user.423
+homePhone: +1 681 935 0160
+entryUUID: a2a6dc22-b929-3548-b547-1a0f60c4b651
+
+dn: uid=user.424,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anjela Aubuchon$41324 Twelfth Street$Fort Smith, KY 58120
+initials: AKA
+street: 41324 Twelfth Street
+mobile: +1 907 059 9559
+mail: user.424@maildomain.net
+employeeNumber: 424
+pager: +1 004 230 8600
+sn: Aubuchon
+postalCode: 58120
+userPassword: {SSHA}lhS9YIdobr8Pg7yWp8cbV4HSwZkuqTrXKZVsSQ==
+description: This is the description for Anjela Aubuchon.
+l: Fort Smith
+cn: Anjela Aubuchon
+st: KY
+telephoneNumber: +1 901 146 3404
+givenName: Anjela
+uid: user.424
+homePhone: +1 860 104 6750
+entryUUID: d9ec776b-7249-3cd5-b77a-27e5a008e2c1
+
+dn: uid=user.425,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anker Aucoin$49808 Spring Street$Tallahassee, NE 38011
+initials: AYA
+street: 49808 Spring Street
+mobile: +1 389 701 5429
+mail: user.425@maildomain.net
+employeeNumber: 425
+pager: +1 052 902 5508
+sn: Aucoin
+postalCode: 38011
+userPassword: {SSHA}Nf1MonvXstKnZ/X4G87uynJSI7+sQPUmWF8Azw==
+description: This is the description for Anker Aucoin.
+l: Tallahassee
+cn: Anker Aucoin
+st: NE
+telephoneNumber: +1 870 088 8729
+givenName: Anker
+uid: user.425
+homePhone: +1 002 728 8245
+entryUUID: b3fd67d0-1ee7-3257-819d-a8072d618ecf
+
+dn: uid=user.426,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anki Aud$01747 Spring Street$Lake Charles, FL 53923
+initials: AEA
+street: 01747 Spring Street
+mobile: +1 715 535 7886
+mail: user.426@maildomain.net
+employeeNumber: 426
+pager: +1 010 608 6170
+sn: Aud
+postalCode: 53923
+userPassword: {SSHA}kT2oqBTokn/hYu9KhqivdepyOPBZCocfIf0uaQ==
+description: This is the description for Anki Aud.
+l: Lake Charles
+cn: Anki Aud
+st: FL
+telephoneNumber: +1 055 788 3193
+givenName: Anki
+uid: user.426
+homePhone: +1 116 061 1087
+entryUUID: a7743926-4a88-3c6b-84da-223bc734d7f0
+
+dn: uid=user.427,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ankie Audet$87540 Washington Street$Alpena, CO 80521
+initials: ALA
+street: 87540 Washington Street
+mobile: +1 402 589 4362
+mail: user.427@maildomain.net
+employeeNumber: 427
+pager: +1 422 605 5960
+sn: Audet
+postalCode: 80521
+userPassword: {SSHA}K4NYqErDT6m/ramoLgUZsn1fJYSMcC7AmP01rQ==
+description: This is the description for Ankie Audet.
+l: Alpena
+cn: Ankie Audet
+st: CO
+telephoneNumber: +1 633 803 0208
+givenName: Ankie
+uid: user.427
+homePhone: +1 003 199 4771
+entryUUID: c0e9cd8d-8df5-3370-821a-2435dafe62c6
+
+dn: uid=user.428,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anky Audette$07204 Elm Street$Harrisonburg, MI 05847
+initials: AAA
+street: 07204 Elm Street
+mobile: +1 232 790 3885
+mail: user.428@maildomain.net
+employeeNumber: 428
+pager: +1 625 070 5636
+sn: Audette
+postalCode: 05847
+userPassword: {SSHA}V5COzbT6H3T+9CM3D07ynDwpa5tCIuv0gdC8VA==
+description: This is the description for Anky Audette.
+l: Harrisonburg
+cn: Anky Audette
+st: MI
+telephoneNumber: +1 707 878 3104
+givenName: Anky
+uid: user.428
+homePhone: +1 188 707 6756
+entryUUID: 6f7a2652-ac24-32e0-b8cc-817b5d03b841
+
+dn: uid=user.429,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ann Auerbach$44010 Eleventh Street$Elmira, OK 70660
+initials: ARA
+street: 44010 Eleventh Street
+mobile: +1 078 751 9670
+mail: user.429@maildomain.net
+employeeNumber: 429
+pager: +1 606 032 3094
+sn: Auerbach
+postalCode: 70660
+userPassword: {SSHA}jzuB672t0BUdOyJQiOAODLdkzL5c8wdWXF7goQ==
+description: This is the description for Ann Auerbach.
+l: Elmira
+cn: Ann Auerbach
+st: OK
+telephoneNumber: +1 585 504 8747
+givenName: Ann
+uid: user.429
+homePhone: +1 808 500 0130
+entryUUID: a2eb60d3-83aa-3de6-85cb-fcf7e3f27ff7
+
+dn: uid=user.430,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ann-Hoon Augeri$63049 Willow Street$Durham, AZ 42963
+initials: AJA
+street: 63049 Willow Street
+mobile: +1 201 505 3905
+mail: user.430@maildomain.net
+employeeNumber: 430
+pager: +1 834 977 0361
+sn: Augeri
+postalCode: 42963
+userPassword: {SSHA}EWHxHaKLRAyI8ncCmHruDPYviJUzWPZIOu6AdQ==
+description: This is the description for Ann-Hoon Augeri.
+l: Durham
+cn: Ann-Hoon Augeri
+st: AZ
+telephoneNumber: +1 957 690 3965
+givenName: Ann-Hoon
+uid: user.430
+homePhone: +1 235 656 3430
+entryUUID: c69b38ac-c9bc-36f9-aed2-a83022275a02
+
+dn: uid=user.431,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ann-Lorrain Augustus$07225 College Street$Green Bay, KY 70326
+initials: ASA
+street: 07225 College Street
+mobile: +1 668 943 2677
+mail: user.431@maildomain.net
+employeeNumber: 431
+pager: +1 736 802 7370
+sn: Augustus
+postalCode: 70326
+userPassword: {SSHA}aIwdIVpgVx+LJ/D5D3grgwQcTPqwlZOcCc0rmQ==
+description: This is the description for Ann-Lorrain Augustus.
+l: Green Bay
+cn: Ann-Lorrain Augustus
+st: KY
+telephoneNumber: +1 839 246 1441
+givenName: Ann-Lorrain
+uid: user.431
+homePhone: +1 380 146 4410
+entryUUID: a4566958-93dd-35cb-812d-0dc8198c90ce
+
+dn: uid=user.432,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ann-Marie Auker$04626 Poplar Street$Columbus, MN 94167
+initials: AVA
+street: 04626 Poplar Street
+mobile: +1 046 617 6435
+mail: user.432@maildomain.net
+employeeNumber: 432
+pager: +1 190 757 9427
+sn: Auker
+postalCode: 94167
+userPassword: {SSHA}P2iX9UEKgs6k02utfvNHcq95xoyV1LZgMLbVRw==
+description: This is the description for Ann-Marie Auker.
+l: Columbus
+cn: Ann-Marie Auker
+st: MN
+telephoneNumber: +1 982 995 3212
+givenName: Ann-Marie
+uid: user.432
+homePhone: +1 980 368 7184
+entryUUID: fd334c63-e4af-372b-a9d1-b781024fb83f
+
+dn: uid=user.433,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anna Aula$02472 Locust Street$Providence, UT 23810
+initials: ADA
+street: 02472 Locust Street
+mobile: +1 946 863 4820
+mail: user.433@maildomain.net
+employeeNumber: 433
+pager: +1 037 788 1013
+sn: Aula
+postalCode: 23810
+userPassword: {SSHA}iSy7Bo59TS2ACBGmitwgCxZdATuafWN2swMitw==
+description: This is the description for Anna Aula.
+l: Providence
+cn: Anna Aula
+st: UT
+telephoneNumber: +1 030 106 1864
+givenName: Anna
+uid: user.433
+homePhone: +1 040 602 0899
+entryUUID: 3a25ac1a-718c-3ba2-a0c9-cd1bfd7ea0ea
+
+dn: uid=user.434,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anna-Marie Aulakh$01557 Birch Street$Butte, GA 08388
+initials: ASA
+street: 01557 Birch Street
+mobile: +1 812 059 8979
+mail: user.434@maildomain.net
+employeeNumber: 434
+pager: +1 808 564 1739
+sn: Aulakh
+postalCode: 08388
+userPassword: {SSHA}do238TDOvEsiqZQPRs4stMNY96iBbRagPryS3g==
+description: This is the description for Anna-Marie Aulakh.
+l: Butte
+cn: Anna-Marie Aulakh
+st: GA
+telephoneNumber: +1 022 572 1784
+givenName: Anna-Marie
+uid: user.434
+homePhone: +1 014 671 8636
+entryUUID: dd5b722e-b218-331a-ad09-6d37fbb95d0f
+
+dn: uid=user.435,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anna-diana Auld$33860 Hillcrest Street$Santa Barbara, IN 75898
+initials: AUA
+street: 33860 Hillcrest Street
+mobile: +1 683 490 5028
+mail: user.435@maildomain.net
+employeeNumber: 435
+pager: +1 349 420 9510
+sn: Auld
+postalCode: 75898
+userPassword: {SSHA}vNOLmHNapVU/EXqHOkMht95UNDNf+2TGwL9Gxw==
+description: This is the description for Anna-diana Auld.
+l: Santa Barbara
+cn: Anna-diana Auld
+st: IN
+telephoneNumber: +1 779 547 8227
+givenName: Anna-diana
+uid: user.435
+homePhone: +1 166 710 4013
+entryUUID: 51dc1d8b-7a97-392a-95f8-ed7093c53fb0
+
+dn: uid=user.436,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anna-diane Ault$25641 Eighth Street$Presque Isle, AK 04361
+initials: AIA
+street: 25641 Eighth Street
+mobile: +1 033 621 7360
+mail: user.436@maildomain.net
+employeeNumber: 436
+pager: +1 023 007 0873
+sn: Ault
+postalCode: 04361
+userPassword: {SSHA}L0dLmxy3d0R2X5zbfUf4bBbBVKKXSEH8fSeU1Q==
+description: This is the description for Anna-diane Ault.
+l: Presque Isle
+cn: Anna-diane Ault
+st: AK
+telephoneNumber: +1 070 642 8193
+givenName: Anna-diane
+uid: user.436
+homePhone: +1 000 070 5900
+entryUUID: dc24e73e-fb6d-3d8c-9b0d-6e1e2ac67e17
+
+dn: uid=user.437,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anna-maria Aumoine$50736 West Street$Cadillac, NJ 56496
+initials: ADA
+street: 50736 West Street
+mobile: +1 946 018 2169
+mail: user.437@maildomain.net
+employeeNumber: 437
+pager: +1 368 955 1318
+sn: Aumoine
+postalCode: 56496
+userPassword: {SSHA}qt2e1WlRnzao6sPWJwd2/pCKgnlsMcsdynxWiQ==
+description: This is the description for Anna-maria Aumoine.
+l: Cadillac
+cn: Anna-maria Aumoine
+st: NJ
+telephoneNumber: +1 456 802 4208
+givenName: Anna-maria
+uid: user.437
+homePhone: +1 925 459 5225
+entryUUID: 792079b5-1276-3db1-88b2-38a7500f3b40
+
+dn: uid=user.438,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annabal Aurelius$02826 Miller Street$Tuscaloosa, MT 14804
+initials: ABA
+street: 02826 Miller Street
+mobile: +1 154 082 6115
+mail: user.438@maildomain.net
+employeeNumber: 438
+pager: +1 743 875 1028
+sn: Aurelius
+postalCode: 14804
+userPassword: {SSHA}xSZVl7S7+Nc+MyQzPmmhvOCeGIIORvQGxkHCpA==
+description: This is the description for Annabal Aurelius.
+l: Tuscaloosa
+cn: Annabal Aurelius
+st: MT
+telephoneNumber: +1 482 852 5600
+givenName: Annabal
+uid: user.438
+homePhone: +1 264 805 3786
+entryUUID: c1c69bec-32fe-3c25-bf2f-55821a28d802
+
+dn: uid=user.439,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annabel Auriol$21453 Oak Street$Waterloo, NV 76190
+initials: AXA
+street: 21453 Oak Street
+mobile: +1 893 046 0747
+mail: user.439@maildomain.net
+employeeNumber: 439
+pager: +1 670 216 7615
+sn: Auriol
+postalCode: 76190
+userPassword: {SSHA}9iIfpTxwMtbSbGzOY1NaJE9xA6aKx+emynl7rA==
+description: This is the description for Annabel Auriol.
+l: Waterloo
+cn: Annabel Auriol
+st: NV
+telephoneNumber: +1 880 580 8915
+givenName: Annabel
+uid: user.439
+homePhone: +1 490 851 0358
+entryUUID: 8b993ce5-cabe-3a16-8a7f-b7d75a1e0802
+
+dn: uid=user.440,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annabela Ausley$28512 Eighth Street$Idaho Falls, WA 86150
+initials: AQA
+street: 28512 Eighth Street
+mobile: +1 946 050 1884
+mail: user.440@maildomain.net
+employeeNumber: 440
+pager: +1 013 170 5761
+sn: Ausley
+postalCode: 86150
+userPassword: {SSHA}JtzZLtLFNXgYtdpKWIvD0+P/4DIMid57dPuD+A==
+description: This is the description for Annabela Ausley.
+l: Idaho Falls
+cn: Annabela Ausley
+st: WA
+telephoneNumber: +1 505 174 2148
+givenName: Annabela
+uid: user.440
+homePhone: +1 700 992 3390
+entryUUID: 43cd746e-8149-3d59-b232-88dc7415a8be
+
+dn: uid=user.441,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annabell Austin$80408 Sunset Street$Shreveport, IL 96255
+initials: AJA
+street: 80408 Sunset Street
+mobile: +1 370 890 5261
+mail: user.441@maildomain.net
+employeeNumber: 441
+pager: +1 753 206 6090
+sn: Austin
+postalCode: 96255
+userPassword: {SSHA}1eQi6HOx+Um/kTNoUu26D0vj7jFQHf8gcmzryA==
+description: This is the description for Annabell Austin.
+l: Shreveport
+cn: Annabell Austin
+st: IL
+telephoneNumber: +1 717 171 5913
+givenName: Annabell
+uid: user.441
+homePhone: +1 080 659 0939
+entryUUID: 7a175f59-57db-3569-b1d9-175361a59d8c
+
+dn: uid=user.442,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annabella Australia$43481 College Street$Winston, AR 01965
+initials: AFA
+street: 43481 College Street
+mobile: +1 890 615 9300
+mail: user.442@maildomain.net
+employeeNumber: 442
+pager: +1 123 692 0720
+sn: Australia
+postalCode: 01965
+userPassword: {SSHA}hAZluGz8B/5XD3fFCMAHSnWqiFI4sSJQbmfv0Q==
+description: This is the description for Annabella Australia.
+l: Winston
+cn: Annabella Australia
+st: AR
+telephoneNumber: +1 591 329 3534
+givenName: Annabella
+uid: user.442
+homePhone: +1 318 500 0115
+entryUUID: 85672dd9-9fde-3752-b697-47a03a6002de
+
+dn: uid=user.443,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annabelle Auth$87308 Chestnut Street$San Diego, AK 37759
+initials: AEA
+street: 87308 Chestnut Street
+mobile: +1 508 563 1268
+mail: user.443@maildomain.net
+employeeNumber: 443
+pager: +1 068 418 1429
+sn: Auth
+postalCode: 37759
+userPassword: {SSHA}1ZhCgruX2/Drwwh0HD08M/CQY/7Zrwjw2YYiyg==
+description: This is the description for Annabelle Auth.
+l: San Diego
+cn: Annabelle Auth
+st: AK
+telephoneNumber: +1 886 048 3604
+givenName: Annabelle
+uid: user.443
+homePhone: +1 481 502 8448
+entryUUID: 57af6b76-8d73-3f77-a3a6-907ad0cdcb12
+
+dn: uid=user.444,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annadiana Auton$95055 Seventh Street$Durham, IL 41577
+initials: APA
+street: 95055 Seventh Street
+mobile: +1 739 500 0798
+mail: user.444@maildomain.net
+employeeNumber: 444
+pager: +1 174 088 0645
+sn: Auton
+postalCode: 41577
+userPassword: {SSHA}0wLasgpdmkow8Pl13VFR3J3hYLWMmblfZHO31A==
+description: This is the description for Annadiana Auton.
+l: Durham
+cn: Annadiana Auton
+st: IL
+telephoneNumber: +1 602 671 5476
+givenName: Annadiana
+uid: user.444
+homePhone: +1 508 920 5390
+entryUUID: 95b81503-c90e-32bc-ac7f-9b5da3a0d782
+
+dn: uid=user.445,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annadiane Autoquote$23489 Church Street$Saint Louis, CA 27123
+initials: ARA
+street: 23489 Church Street
+mobile: +1 163 263 1384
+mail: user.445@maildomain.net
+employeeNumber: 445
+pager: +1 020 056 3976
+sn: Autoquote
+postalCode: 27123
+userPassword: {SSHA}I1l4/Q3afgSGFDhvdX8D0UUqy0u3piO1XbMWGA==
+description: This is the description for Annadiane Autoquote.
+l: Saint Louis
+cn: Annadiane Autoquote
+st: CA
+telephoneNumber: +1 038 057 3020
+givenName: Annadiane
+uid: user.445
+homePhone: +1 320 206 4881
+entryUUID: c7593218-988b-3dfb-a821-5317b9be9917
+
+dn: uid=user.446,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annalee Avard$27828 North Street$Parkersburg, ME 73269
+initials: ARA
+street: 27828 North Street
+mobile: +1 537 231 1364
+mail: user.446@maildomain.net
+employeeNumber: 446
+pager: +1 177 350 7603
+sn: Avard
+postalCode: 73269
+userPassword: {SSHA}5J7raY4fE4uI4VpYlCpcyFfwT3RvsEHuV2AG8w==
+description: This is the description for Annalee Avard.
+l: Parkersburg
+cn: Annalee Avard
+st: ME
+telephoneNumber: +1 460 578 0900
+givenName: Annalee
+uid: user.446
+homePhone: +1 427 050 3948
+entryUUID: 5b57512a-aa5d-377e-80a5-feea060bef7d
+
+dn: uid=user.447,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annaliese Avellaneda$26106 Elm Street$Denver, WI 04662
+initials: AUA
+street: 26106 Elm Street
+mobile: +1 593 842 0862
+mail: user.447@maildomain.net
+employeeNumber: 447
+pager: +1 003 569 1486
+sn: Avellaneda
+postalCode: 04662
+userPassword: {SSHA}sNMjJzW3eI0b0y+TAS06a1chMb0nvJJUxCoIng==
+description: This is the description for Annaliese Avellaneda.
+l: Denver
+cn: Annaliese Avellaneda
+st: WI
+telephoneNumber: +1 426 009 7750
+givenName: Annaliese
+uid: user.447
+homePhone: +1 232 602 3007
+entryUUID: f47ed73e-1675-336e-9a92-fa680519e829
+
+dn: uid=user.448,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annalise Averett$39260 Williams Street$Philadelphia, VT 70108
+initials: ACA
+street: 39260 Williams Street
+mobile: +1 250 058 2157
+mail: user.448@maildomain.net
+employeeNumber: 448
+pager: +1 192 183 1983
+sn: Averett
+postalCode: 70108
+userPassword: {SSHA}tagGFNDXO66z05em+7CGt0t5OyMCPeOVX79o/A==
+description: This is the description for Annalise Averett.
+l: Philadelphia
+cn: Annalise Averett
+st: VT
+telephoneNumber: +1 149 890 9853
+givenName: Annalise
+uid: user.448
+homePhone: +1 389 901 5295
+entryUUID: a33a3f4f-030e-32a6-a635-12474e55f48d
+
+dn: uid=user.449,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annamaria Averette$01609 Lee Street$College Station, DC 00090
+initials: AXA
+street: 01609 Lee Street
+mobile: +1 430 400 5276
+mail: user.449@maildomain.net
+employeeNumber: 449
+pager: +1 031 413 2339
+sn: Averette
+postalCode: 00090
+userPassword: {SSHA}IeZwabASmpGReH3EMPZK+2uEHs6F9JHrpMhCMA==
+description: This is the description for Annamaria Averette.
+l: College Station
+cn: Annamaria Averette
+st: DC
+telephoneNumber: +1 440 800 6700
+givenName: Annamaria
+uid: user.449
+homePhone: +1 857 993 0403
+entryUUID: 2df2ece9-71a5-3c09-a041-38009238605b
+
+dn: uid=user.450,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annamarie Averill$85003 Taylor Street$Durham, MN 01751
+initials: ABA
+street: 85003 Taylor Street
+mobile: +1 182 536 4980
+mail: user.450@maildomain.net
+employeeNumber: 450
+pager: +1 808 605 9701
+sn: Averill
+postalCode: 01751
+userPassword: {SSHA}/svL2lsOw9uXQezrDQpSN5XBCfO6JaPQqPbk3A==
+description: This is the description for Annamarie Averill.
+l: Durham
+cn: Annamarie Averill
+st: MN
+telephoneNumber: +1 968 065 7038
+givenName: Annamarie
+uid: user.450
+homePhone: +1 578 901 0944
+entryUUID: d35b3c5d-497d-3807-95b4-008b2da10154
+
+dn: uid=user.451,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annarbor Aversa$34422 Lake Street$San Antonio, KY 20811
+initials: AXA
+street: 34422 Lake Street
+mobile: +1 203 151 8423
+mail: user.451@maildomain.net
+employeeNumber: 451
+pager: +1 236 150 7710
+sn: Aversa
+postalCode: 20811
+userPassword: {SSHA}Vq060waCOVqIYX3PEz8PN+NdNIQC2YvmBcJ1CQ==
+description: This is the description for Annarbor Aversa.
+l: San Antonio
+cn: Annarbor Aversa
+st: KY
+telephoneNumber: +1 008 983 4034
+givenName: Annarbor
+uid: user.451
+homePhone: +1 006 323 7260
+entryUUID: c87a4838-c13d-35d5-ba85-aa193d5620d0
+
+dn: uid=user.452,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anne Avery$89033 Lincoln Street$Bismarck, ID 24377
+initials: AYA
+street: 89033 Lincoln Street
+mobile: +1 950 887 9025
+mail: user.452@maildomain.net
+employeeNumber: 452
+pager: +1 004 398 0273
+sn: Avery
+postalCode: 24377
+userPassword: {SSHA}SJsF/oIjMrvgEYbEULcfm3cCZ/wuDAO8vZKXQA==
+description: This is the description for Anne Avery.
+l: Bismarck
+cn: Anne Avery
+st: ID
+telephoneNumber: +1 317 447 6086
+givenName: Anne
+uid: user.452
+homePhone: +1 581 319 8625
+entryUUID: 0b6e2a63-75bb-395b-b73c-6931fb320be5
+
+dn: uid=user.453,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anne Marie Avirett$45027 Lincoln Street$Alexandria, WV 86077
+initials: AUA
+street: 45027 Lincoln Street
+mobile: +1 473 815 1057
+mail: user.453@maildomain.net
+employeeNumber: 453
+pager: +1 756 364 0049
+sn: Avirett
+postalCode: 86077
+userPassword: {SSHA}HVDKddWZmqEQMnxOahX7SuVPhmiTKVv+RKJ9Sg==
+description: This is the description for Anne Marie Avirett.
+l: Alexandria
+cn: Anne Marie Avirett
+st: WV
+telephoneNumber: +1 292 607 3208
+givenName: Anne Marie
+uid: user.453
+homePhone: +1 378 145 9512
+entryUUID: dbed90c6-61f7-3726-8efa-2dc860bea064
+
+dn: uid=user.454,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anne-Lise Awadalla$51160 Highland Street$Chattanooga, WI 57308
+initials: AZA
+street: 51160 Highland Street
+mobile: +1 690 979 7605
+mail: user.454@maildomain.net
+employeeNumber: 454
+pager: +1 530 973 0294
+sn: Awadalla
+postalCode: 57308
+userPassword: {SSHA}eBh97yWz9mHyQ0B8pBAtgTo2tZ4x0mbVCOjsBg==
+description: This is the description for Anne-Lise Awadalla.
+l: Chattanooga
+cn: Anne-Lise Awadalla
+st: WI
+telephoneNumber: +1 597 983 9176
+givenName: Anne-Lise
+uid: user.454
+homePhone: +1 002 001 0070
+entryUUID: 9df78743-bc7a-396e-ad85-acb4344fc747
+
+dn: uid=user.455,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anne-Marie Awadia$17037 Laurel Street$Missoula, LA 08017
+initials: AOA
+street: 17037 Laurel Street
+mobile: +1 661 173 8149
+mail: user.455@maildomain.net
+employeeNumber: 455
+pager: +1 078 603 6498
+sn: Awadia
+postalCode: 08017
+userPassword: {SSHA}1P5J3fGXJNdNdtLcTi7/7VxtOEYsOqFsObLW3g==
+description: This is the description for Anne-Marie Awadia.
+l: Missoula
+cn: Anne-Marie Awadia
+st: LA
+telephoneNumber: +1 220 488 4755
+givenName: Anne-Marie
+uid: user.455
+homePhone: +1 983 814 3700
+entryUUID: 07212734-7769-3257-8d7a-5b625bbbae01
+
+dn: uid=user.456,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anne-corinne Awan$50778 Dogwood Street$Bakersfield, NV 53101
+initials: AAA
+street: 50778 Dogwood Street
+mobile: +1 170 889 4369
+mail: user.456@maildomain.net
+employeeNumber: 456
+pager: +1 406 067 9094
+sn: Awan
+postalCode: 53101
+userPassword: {SSHA}9mOcMt+C+wI+28qgDH58oFWb/pwj3KRUmcgUaw==
+description: This is the description for Anne-corinne Awan.
+l: Bakersfield
+cn: Anne-corinne Awan
+st: NV
+telephoneNumber: +1 785 290 7000
+givenName: Anne-corinne
+uid: user.456
+homePhone: +1 212 621 1629
+entryUUID: e692911b-4e32-3800-b5f3-11508973464d
+
+dn: uid=user.457,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annecorinne Awano$92580 Jefferson Street$San Angelo, WA 91416
+initials: ATA
+street: 92580 Jefferson Street
+mobile: +1 430 204 5716
+mail: user.457@maildomain.net
+employeeNumber: 457
+pager: +1 679 233 0157
+sn: Awano
+postalCode: 91416
+userPassword: {SSHA}xSl+SIkf0TLzedBcVB7uIZdLQ9AubwijnC2skg==
+description: This is the description for Annecorinne Awano.
+l: San Angelo
+cn: Annecorinne Awano
+st: WA
+telephoneNumber: +1 324 940 0322
+givenName: Annecorinne
+uid: user.457
+homePhone: +1 898 713 0414
+entryUUID: 79ebc940-002c-331e-8969-d06c6905466d
+
+dn: uid=user.458,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anneke Axberg$97503 Dogwood Street$Tampa Bay, MN 95400
+initials: APA
+street: 97503 Dogwood Street
+mobile: +1 408 759 9700
+mail: user.458@maildomain.net
+employeeNumber: 458
+pager: +1 823 483 4158
+sn: Axberg
+postalCode: 95400
+userPassword: {SSHA}lc6y+tQA8rALoQ+aiUmqYNZlcPOEpKcqJlLV/Q==
+description: This is the description for Anneke Axberg.
+l: Tampa Bay
+cn: Anneke Axberg
+st: MN
+telephoneNumber: +1 329 062 3640
+givenName: Anneke
+uid: user.458
+homePhone: +1 015 963 5007
+entryUUID: b6bee4c2-dc6a-3431-b822-cc0b8724a73d
+
+dn: uid=user.459,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anneliese Ayandeh$98770 Madison Street$El Paso, MD 04307
+initials: ARA
+street: 98770 Madison Street
+mobile: +1 728 176 1233
+mail: user.459@maildomain.net
+employeeNumber: 459
+pager: +1 175 531 8010
+sn: Ayandeh
+postalCode: 04307
+userPassword: {SSHA}wAC9I4z/UVMxtlazsXTvWmAfFlMdjc1ypOra1w==
+description: This is the description for Anneliese Ayandeh.
+l: El Paso
+cn: Anneliese Ayandeh
+st: MD
+telephoneNumber: +1 970 535 6304
+givenName: Anneliese
+uid: user.459
+homePhone: +1 350 094 1835
+entryUUID: abe8538e-8b8f-3ed0-994f-99b8aad59a81
+
+dn: uid=user.460,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annelise Ayaz$60283 Center Street$Kirksville, DE 93003
+initials: ATA
+street: 60283 Center Street
+mobile: +1 021 948 3369
+mail: user.460@maildomain.net
+employeeNumber: 460
+pager: +1 031 061 8117
+sn: Ayaz
+postalCode: 93003
+userPassword: {SSHA}uZ7z5mnbHnzNmdNly5kbJMj7FszJdFwJUhiuuw==
+description: This is the description for Annelise Ayaz.
+l: Kirksville
+cn: Annelise Ayaz
+st: DE
+telephoneNumber: +1 883 103 9604
+givenName: Annelise
+uid: user.460
+homePhone: +1 864 891 7150
+entryUUID: 61e3bb39-fc91-3dbd-8cbd-0c5c812f2b86
+
+dn: uid=user.461,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annemarie Aydin$07118 Miller Street$Jackson, DC 54130
+initials: AYA
+street: 07118 Miller Street
+mobile: +1 881 926 6666
+mail: user.461@maildomain.net
+employeeNumber: 461
+pager: +1 970 500 9220
+sn: Aydin
+postalCode: 54130
+userPassword: {SSHA}8S7XZfnTq4u6rSgDZYU07MPtNy6Vz2EA8FeE4w==
+description: This is the description for Annemarie Aydin.
+l: Jackson
+cn: Annemarie Aydin
+st: DC
+telephoneNumber: +1 946 379 8208
+givenName: Annemarie
+uid: user.461
+homePhone: +1 656 310 5709
+entryUUID: f03757cb-a15c-3234-b774-5471099e7267
+
+dn: uid=user.462,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annemarijke Ayers$47008 Adams Street$Weston, CO 09230
+initials: ACA
+street: 47008 Adams Street
+mobile: +1 686 005 5285
+mail: user.462@maildomain.net
+employeeNumber: 462
+pager: +1 750 010 5020
+sn: Ayers
+postalCode: 09230
+userPassword: {SSHA}cwLCIiB2pFvk20Gp6Q7wFsZAWqtyV5TRMi+NcQ==
+description: This is the description for Annemarijke Ayers.
+l: Weston
+cn: Annemarijke Ayers
+st: CO
+telephoneNumber: +1 584 262 7413
+givenName: Annemarijke
+uid: user.462
+homePhone: +1 298 695 9554
+entryUUID: 4a8ba72e-dee4-3f5e-9353-e1a21cacef28
+
+dn: uid=user.463,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annemie Ayles$92160 Center Street$Syracuse, MI 44898
+initials: ADA
+street: 92160 Center Street
+mobile: +1 337 295 4909
+mail: user.463@maildomain.net
+employeeNumber: 463
+pager: +1 009 625 7483
+sn: Ayles
+postalCode: 44898
+userPassword: {SSHA}PUHZH0wNJXDbPZQwfmwnh1DCIbN++6J1qvQ40A==
+description: This is the description for Annemie Ayles.
+l: Syracuse
+cn: Annemie Ayles
+st: MI
+telephoneNumber: +1 038 872 0984
+givenName: Annemie
+uid: user.463
+homePhone: +1 340 294 8573
+entryUUID: 602594e0-a768-324d-996d-05cebbb7c536
+
+dn: uid=user.464,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annet Aylwin$25106 Church Street$Harlingen, NC 93887
+initials: AYA
+street: 25106 Church Street
+mobile: +1 125 771 4931
+mail: user.464@maildomain.net
+employeeNumber: 464
+pager: +1 563 201 3805
+sn: Aylwin
+postalCode: 93887
+userPassword: {SSHA}rHgTmCG5rqbk1+GaWca0pkfpPjtclzlADNprxg==
+description: This is the description for Annet Aylwin.
+l: Harlingen
+cn: Annet Aylwin
+st: NC
+telephoneNumber: +1 796 399 8328
+givenName: Annet
+uid: user.464
+homePhone: +1 503 474 0225
+entryUUID: 099efe7f-9a2c-3175-8630-6f5712c99946
+
+dn: uid=user.465,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annetta Ayotte$65629 Mill Street$South Bend, TN 00006
+initials: APA
+street: 65629 Mill Street
+mobile: +1 351 010 6040
+mail: user.465@maildomain.net
+employeeNumber: 465
+pager: +1 725 004 1297
+sn: Ayotte
+postalCode: 00006
+userPassword: {SSHA}K8dsvftZrsrVSGL1ngCXoVeaID9+4EXz6aaPBw==
+description: This is the description for Annetta Ayotte.
+l: South Bend
+cn: Annetta Ayotte
+st: TN
+telephoneNumber: +1 191 863 4818
+givenName: Annetta
+uid: user.465
+homePhone: +1 000 247 0910
+entryUUID: 20049d2b-01e3-3361-9614-369d1aa9cb62
+
+dn: uid=user.466,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annette Ayoubzadeh$66838 Lakeview Street$Roanoke, UT 13010
+initials: AQA
+street: 66838 Lakeview Street
+mobile: +1 113 208 5190
+mail: user.466@maildomain.net
+employeeNumber: 466
+pager: +1 580 222 2971
+sn: Ayoubzadeh
+postalCode: 13010
+userPassword: {SSHA}K/bEt1hbs0HoniRXZmQOzuRJBbNTYI03YeJAKQ==
+description: This is the description for Annette Ayoubzadeh.
+l: Roanoke
+cn: Annette Ayoubzadeh
+st: UT
+telephoneNumber: +1 913 270 1141
+givenName: Annette
+uid: user.466
+homePhone: +1 004 450 3926
+entryUUID: ae42b2e5-03a1-33da-8d3e-d4f7090b6ba6
+
+dn: uid=user.467,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anni Ayoup$45957 Locust Street$Mankato, NE 18260
+initials: AIA
+street: 45957 Locust Street
+mobile: +1 328 801 6330
+mail: user.467@maildomain.net
+employeeNumber: 467
+pager: +1 659 360 4632
+sn: Ayoup
+postalCode: 18260
+userPassword: {SSHA}iu3eFmZR2SkP7AIQDTkpX85umEev/eJKV5Rxww==
+description: This is the description for Anni Ayoup.
+l: Mankato
+cn: Anni Ayoup
+st: NE
+telephoneNumber: +1 000 273 0635
+givenName: Anni
+uid: user.467
+homePhone: +1 453 358 9421
+entryUUID: 0950b32f-5de5-3f3f-8d87-c79bb850f6e0
+
+dn: uid=user.468,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annice Ayrault$89764 Johnson Street$Pensacola, MS 39810
+initials: ADA
+street: 89764 Johnson Street
+mobile: +1 701 477 4040
+mail: user.468@maildomain.net
+employeeNumber: 468
+pager: +1 620 361 8924
+sn: Ayrault
+postalCode: 39810
+userPassword: {SSHA}rFztsB85wnzorooN3K+r4K6pV+vrVEbgLdsSXQ==
+description: This is the description for Annice Ayrault.
+l: Pensacola
+cn: Annice Ayrault
+st: MS
+telephoneNumber: +1 725 220 4710
+givenName: Annice
+uid: user.468
+homePhone: +1 154 372 4229
+entryUUID: 810dab75-c3e5-3351-a51f-c05832972542
+
+dn: uid=user.469,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annick Ayre$00862 Center Street$Jonesboro, ID 73165
+initials: AIA
+street: 00862 Center Street
+mobile: +1 448 270 6351
+mail: user.469@maildomain.net
+employeeNumber: 469
+pager: +1 011 029 0895
+sn: Ayre
+postalCode: 73165
+userPassword: {SSHA}x95I7shMw1zGPltrOL/opfnF2qmRPdwFE2G4QQ==
+description: This is the description for Annick Ayre.
+l: Jonesboro
+cn: Annick Ayre
+st: ID
+telephoneNumber: +1 084 061 5928
+givenName: Annick
+uid: user.469
+homePhone: +1 365 453 1609
+entryUUID: 62c9bc84-2ded-3ca5-b7c7-5c6c9e0f9a1f
+
+dn: uid=user.470,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annie Ayres$92504 Cherry Street$Jackson, VA 00413
+initials: AYA
+street: 92504 Cherry Street
+mobile: +1 504 391 7616
+mail: user.470@maildomain.net
+employeeNumber: 470
+pager: +1 794 839 4146
+sn: Ayres
+postalCode: 00413
+userPassword: {SSHA}G/mg1EZ3Fkxta2p7dsnZr0H2jqGPLaKCbNTUuA==
+description: This is the description for Annie Ayres.
+l: Jackson
+cn: Annie Ayres
+st: VA
+telephoneNumber: +1 239 202 4822
+givenName: Annie
+uid: user.470
+homePhone: +1 473 030 7190
+entryUUID: a749fc99-2c95-3b33-a042-a219ec645392
+
+dn: uid=user.471,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annis Ayscue$16174 Broadway Street$Dallas, TN 37599
+initials: ARA
+street: 16174 Broadway Street
+mobile: +1 879 157 4573
+mail: user.471@maildomain.net
+employeeNumber: 471
+pager: +1 289 978 6727
+sn: Ayscue
+postalCode: 37599
+userPassword: {SSHA}AJSJ1SLPsUdNhmNQOkWHEGLSrTpC/U3V2Pg2tg==
+description: This is the description for Annis Ayscue.
+l: Dallas
+cn: Annis Ayscue
+st: TN
+telephoneNumber: +1 700 052 9804
+givenName: Annis
+uid: user.471
+homePhone: +1 102 214 0508
+entryUUID: b699a4f4-7b26-33a1-83ef-f2f86377828d
+
+dn: uid=user.472,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annissa Ayukawa$20721 Poplar Street$Las Vegas, IN 47300
+initials: AGA
+street: 20721 Poplar Street
+mobile: +1 491 401 4732
+mail: user.472@maildomain.net
+employeeNumber: 472
+pager: +1 573 592 5773
+sn: Ayukawa
+postalCode: 47300
+userPassword: {SSHA}LuySjD0XrG/qTC19uCIMHDAgubjatAke4EJcgg==
+description: This is the description for Annissa Ayukawa.
+l: Las Vegas
+cn: Annissa Ayukawa
+st: IN
+telephoneNumber: +1 263 820 7166
+givenName: Annissa
+uid: user.472
+homePhone: +1 909 916 6974
+entryUUID: 92f33674-a692-3794-9c2e-a17c269418f5
+
+dn: uid=user.473,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annmaria Ayyuce$90083 Highland Street$Baton Rouge, SD 78073
+initials: ASA
+street: 90083 Highland Street
+mobile: +1 984 904 4032
+mail: user.473@maildomain.net
+employeeNumber: 473
+pager: +1 117 036 1229
+sn: Ayyuce
+postalCode: 78073
+userPassword: {SSHA}XleGnUyIVY4mK76mRTq7RN/ZGtDs0qzbXkYj7g==
+description: This is the description for Annmaria Ayyuce.
+l: Baton Rouge
+cn: Annmaria Ayyuce
+st: SD
+telephoneNumber: +1 249 285 4660
+givenName: Annmaria
+uid: user.473
+homePhone: +1 226 832 6703
+entryUUID: afcac1af-ff7d-3d7b-8e87-0ea0c29e9d8f
+
+dn: uid=user.474,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annmarie Azad$62701 Lincoln Street$Flint, WI 60009
+initials: AJA
+street: 62701 Lincoln Street
+mobile: +1 136 240 2919
+mail: user.474@maildomain.net
+employeeNumber: 474
+pager: +1 451 541 2409
+sn: Azad
+postalCode: 60009
+userPassword: {SSHA}A69FvPg5wrvhqxZoj+35Z6KxwiYltQfAESBnKw==
+description: This is the description for Annmarie Azad.
+l: Flint
+cn: Annmarie Azad
+st: WI
+telephoneNumber: +1 080 267 5042
+givenName: Annmarie
+uid: user.474
+homePhone: +1 562 277 9579
+entryUUID: dcb55227-10b1-32c1-8117-b7fc3bbed6cd
+
+dn: uid=user.475,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annnora Azar$43020 Hillcrest Street$El Paso, WA 99171
+initials: ANA
+street: 43020 Hillcrest Street
+mobile: +1 431 725 5173
+mail: user.475@maildomain.net
+employeeNumber: 475
+pager: +1 502 609 9004
+sn: Azar
+postalCode: 99171
+userPassword: {SSHA}xAMabXugIYdmLkFBK7rV7nR2+aV9x9QkAH1ZZg==
+description: This is the description for Annnora Azar.
+l: El Paso
+cn: Annnora Azar
+st: WA
+telephoneNumber: +1 675 225 0395
+givenName: Annnora
+uid: user.475
+homePhone: +1 041 404 4168
+entryUUID: 9b73cb6c-8414-3207-8aef-41a2f7c6edaa
+
+dn: uid=user.476,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Annora Azari$88660 Fifteenth Street$Wichita Falls, ND 17077
+initials: AQA
+street: 88660 Fifteenth Street
+mobile: +1 264 080 9428
+mail: user.476@maildomain.net
+employeeNumber: 476
+pager: +1 697 562 9569
+sn: Azari
+postalCode: 17077
+userPassword: {SSHA}jn8KLS6H+2l1TlfcVK012LakjLNgq0iOlYaVAQ==
+description: This is the description for Annora Azari.
+l: Wichita Falls
+cn: Annora Azari
+st: ND
+telephoneNumber: +1 080 010 8234
+givenName: Annora
+uid: user.476
+homePhone: +1 726 936 7008
+entryUUID: 2740fb80-e10b-3690-b772-d8eb3878c177
+
+dn: uid=user.477,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anny Azarshahi$50161 South Street$Wheeling, CA 25401
+initials: AQA
+street: 50161 South Street
+mobile: +1 095 656 6510
+mail: user.477@maildomain.net
+employeeNumber: 477
+pager: +1 001 438 9405
+sn: Azarshahi
+postalCode: 25401
+userPassword: {SSHA}/hohjtXL94i8cl+JBdIXUcIkeaid92XcnthXog==
+description: This is the description for Anny Azarshahi.
+l: Wheeling
+cn: Anny Azarshahi
+st: CA
+telephoneNumber: +1 210 004 3017
+givenName: Anny
+uid: user.477
+homePhone: +1 793 868 2037
+entryUUID: da543309-1878-362c-94a1-d064685c42fe
+
+dn: uid=user.478,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ans Azer$09491 Woodland Street$Peoria, DC 14682
+initials: ASA
+street: 09491 Woodland Street
+mobile: +1 477 274 5613
+mail: user.478@maildomain.net
+employeeNumber: 478
+pager: +1 487 152 1082
+sn: Azer
+postalCode: 14682
+userPassword: {SSHA}BcejzFETrgb7jB2E6/Qi5YakdtwlU2KckU6q9g==
+description: This is the description for Ans Azer.
+l: Peoria
+cn: Ans Azer
+st: DC
+telephoneNumber: +1 065 665 5154
+givenName: Ans
+uid: user.478
+homePhone: +1 161 713 5360
+entryUUID: 3f011bd7-82aa-3987-a5b9-92dedbabed97
+
+dn: uid=user.479,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anselma Azevedo$15293 Second Street$New Haven, CA 43601
+initials: AUA
+street: 15293 Second Street
+mobile: +1 330 626 9730
+mail: user.479@maildomain.net
+employeeNumber: 479
+pager: +1 027 444 6510
+sn: Azevedo
+postalCode: 43601
+userPassword: {SSHA}mjYQpi15MzWe+cpncRixEUdJbRLcz5VfxPdbVg==
+description: This is the description for Anselma Azevedo.
+l: New Haven
+cn: Anselma Azevedo
+st: CA
+telephoneNumber: +1 785 302 1882
+givenName: Anselma
+uid: user.479
+homePhone: +1 804 971 6512
+entryUUID: 68def211-7297-39c7-97e7-732c172c976b
+
+dn: uid=user.480,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ansley Aziz$83288 Locust Street$Baton Rouge, PA 70759
+initials: AHA
+street: 83288 Locust Street
+mobile: +1 610 515 5118
+mail: user.480@maildomain.net
+employeeNumber: 480
+pager: +1 050 780 3534
+sn: Aziz
+postalCode: 70759
+userPassword: {SSHA}hZGzETkGZrvMWtSBIzd03TeIWtIKYH+Kf26aKQ==
+description: This is the description for Ansley Aziz.
+l: Baton Rouge
+cn: Ansley Aziz
+st: PA
+telephoneNumber: +1 239 140 8234
+givenName: Ansley
+uid: user.480
+homePhone: +1 497 301 7405
+entryUUID: f183ac76-1530-3136-99f2-921574778b9c
+
+dn: uid=user.481,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anstice Azizuddin$21949 Pine Street$Bakersfield, CT 81193
+initials: ARA
+street: 21949 Pine Street
+mobile: +1 455 359 1200
+mail: user.481@maildomain.net
+employeeNumber: 481
+pager: +1 074 943 8361
+sn: Azizuddin
+postalCode: 81193
+userPassword: {SSHA}QlXNMT1fFDNclXV9KFlv9TuCPqMrWFuWCzT5UQ==
+description: This is the description for Anstice Azizuddin.
+l: Bakersfield
+cn: Anstice Azizuddin
+st: CT
+telephoneNumber: +1 014 712 9520
+givenName: Anstice
+uid: user.481
+homePhone: +1 244 525 9814
+entryUUID: c248bbb1-76b6-38f0-8ba1-d72d00483d76
+
+dn: uid=user.482,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anthe Azmak$47580 Jackson Street$San Antonio, CA 90501
+initials: AOA
+street: 47580 Jackson Street
+mobile: +1 615 004 0344
+mail: user.482@maildomain.net
+employeeNumber: 482
+pager: +1 776 549 0370
+sn: Azmak
+postalCode: 90501
+userPassword: {SSHA}qs8+ZscwSDv4peitfk6bFEeeIfc2+PyuMSQrcw==
+description: This is the description for Anthe Azmak.
+l: San Antonio
+cn: Anthe Azmak
+st: CA
+telephoneNumber: +1 585 005 0234
+givenName: Anthe
+uid: user.482
+homePhone: +1 345 089 6789
+entryUUID: 1886254a-7cfb-3633-b4bc-aaf3f004614c
+
+dn: uid=user.483,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anthea Azzuolo$09524 Twelfth Street$Kirksville, NM 10626
+initials: AVA
+street: 09524 Twelfth Street
+mobile: +1 224 173 8111
+mail: user.483@maildomain.net
+employeeNumber: 483
+pager: +1 214 850 9040
+sn: Azzuolo
+postalCode: 10626
+userPassword: {SSHA}ALgqwZ200Tp9uT7QheKZzxwthEKOQlAzv5wRjA==
+description: This is the description for Anthea Azzuolo.
+l: Kirksville
+cn: Anthea Azzuolo
+st: NM
+telephoneNumber: +1 067 963 9611
+givenName: Anthea
+uid: user.483
+homePhone: +1 642 418 9317
+entryUUID: 92b842d3-2b98-31af-a7b7-835ed8b22250
+
+dn: uid=user.484,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anthia Baab$03657 Woodland Street$Lansing, MA 84026
+initials: AKB
+street: 03657 Woodland Street
+mobile: +1 109 020 0710
+mail: user.484@maildomain.net
+employeeNumber: 484
+pager: +1 663 394 5031
+sn: Baab
+postalCode: 84026
+userPassword: {SSHA}HNjxogUuchQlYLkJLnToOC0y0KE2xMwnFCpbVg==
+description: This is the description for Anthia Baab.
+l: Lansing
+cn: Anthia Baab
+st: MA
+telephoneNumber: +1 907 605 5708
+givenName: Anthia
+uid: user.484
+homePhone: +1 052 403 0143
+entryUUID: bbba88cb-f959-350b-8626-3220a865ae28
+
+dn: uid=user.485,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anthiathia Baader$81772 Maple Street$Milwaukee, CA 06718
+initials: ALB
+street: 81772 Maple Street
+mobile: +1 391 954 7085
+mail: user.485@maildomain.net
+employeeNumber: 485
+pager: +1 645 912 2660
+sn: Baader
+postalCode: 06718
+userPassword: {SSHA}lzy+XqjbqNRcIML26WOdJBL6FxsOsQepwneRow==
+description: This is the description for Anthiathia Baader.
+l: Milwaukee
+cn: Anthiathia Baader
+st: CA
+telephoneNumber: +1 660 013 0180
+givenName: Anthiathia
+uid: user.485
+homePhone: +1 082 070 6012
+entryUUID: 0dd47bb1-b802-3c8e-a1bb-15d7788a5def
+
+dn: uid=user.486,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anthony Babalola$09536 Walnut Street$Twin Falls, WV 69043
+initials: AZB
+street: 09536 Walnut Street
+mobile: +1 671 007 5070
+mail: user.486@maildomain.net
+employeeNumber: 486
+pager: +1 495 354 4108
+sn: Babalola
+postalCode: 69043
+userPassword: {SSHA}fjgwb34pHun2onmxB8x/V5QMh34RqEequXzTxQ==
+description: This is the description for Anthony Babalola.
+l: Twin Falls
+cn: Anthony Babalola
+st: WV
+telephoneNumber: +1 068 280 5012
+givenName: Anthony
+uid: user.486
+homePhone: +1 057 256 8778
+entryUUID: 68d78b89-0483-3668-b3a4-735ca8fdf844
+
+dn: uid=user.487,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antoine Babasaki$25853 Hill Street$Richmond, IN 75008
+initials: AYB
+street: 25853 Hill Street
+mobile: +1 443 484 4632
+mail: user.487@maildomain.net
+employeeNumber: 487
+pager: +1 610 099 1595
+sn: Babasaki
+postalCode: 75008
+userPassword: {SSHA}LpY/5lEAB0QSj8T+Tp5obtqDbyjz5jYar2znIw==
+description: This is the description for Antoine Babasaki.
+l: Richmond
+cn: Antoine Babasaki
+st: IN
+telephoneNumber: +1 380 715 0511
+givenName: Antoine
+uid: user.487
+homePhone: +1 888 811 9883
+entryUUID: 28b2a7fd-81ce-3e03-baca-3269bfeb2ccf
+
+dn: uid=user.488,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antoinette Babb$21132 Spring Street$Fort Wayne, KS 14063
+initials: AUB
+street: 21132 Spring Street
+mobile: +1 610 068 2064
+mail: user.488@maildomain.net
+employeeNumber: 488
+pager: +1 970 134 0301
+sn: Babb
+postalCode: 14063
+userPassword: {SSHA}P4HcV3dor3JCVNQUTQLu4Z8VTi+ZeUqekXRgaA==
+description: This is the description for Antoinette Babb.
+l: Fort Wayne
+cn: Antoinette Babb
+st: KS
+telephoneNumber: +1 004 292 1011
+givenName: Antoinette
+uid: user.488
+homePhone: +1 576 050 3199
+entryUUID: 156d3ef0-ffd5-359f-bbee-f119c1824264
+
+dn: uid=user.489,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anton Babcock$14317 Sunset Street$Pensacola, OR 02764
+initials: ABB
+street: 14317 Sunset Street
+mobile: +1 982 410 2920
+mail: user.489@maildomain.net
+employeeNumber: 489
+pager: +1 997 140 0079
+sn: Babcock
+postalCode: 02764
+userPassword: {SSHA}RZBICYAKY3VpWM2pcC6EZUre8tcyWRsHQb4xzw==
+description: This is the description for Anton Babcock.
+l: Pensacola
+cn: Anton Babcock
+st: OR
+telephoneNumber: +1 694 038 0963
+givenName: Anton
+uid: user.489
+homePhone: +1 132 260 7998
+entryUUID: f51084af-c93b-3271-aaaf-1bf6bca8604f
+
+dn: uid=user.490,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anton-Phuoc Baber$96245 Taylor Street$Bluefield, SD 67258
+initials: AMB
+street: 96245 Taylor Street
+mobile: +1 007 394 0007
+mail: user.490@maildomain.net
+employeeNumber: 490
+pager: +1 500 780 1123
+sn: Baber
+postalCode: 67258
+userPassword: {SSHA}V4iZTRbVxNsQhINK+39orHSXOF4DSDf1+Dc8nw==
+description: This is the description for Anton-Phuoc Baber.
+l: Bluefield
+cn: Anton-Phuoc Baber
+st: SD
+telephoneNumber: +1 338 660 1632
+givenName: Anton-Phuoc
+uid: user.490
+homePhone: +1 305 190 0993
+entryUUID: a1fc5e2b-b38e-38c1-ad62-cf51dd2f3bd7
+
+dn: uid=user.491,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonella Babin$56590 Franklin Street$Ottumwa, MS 82436
+initials: AXB
+street: 56590 Franklin Street
+mobile: +1 916 409 7295
+mail: user.491@maildomain.net
+employeeNumber: 491
+pager: +1 576 424 0426
+sn: Babin
+postalCode: 82436
+userPassword: {SSHA}ijjDXalMmB/IYcZBYutNCi+K4ock0kxx9jW7rA==
+description: This is the description for Antonella Babin.
+l: Ottumwa
+cn: Antonella Babin
+st: MS
+telephoneNumber: +1 214 183 0604
+givenName: Antonella
+uid: user.491
+homePhone: +1 085 762 0093
+entryUUID: cc81595c-06b0-3e7b-bb2d-276fb7393407
+
+dn: uid=user.492,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonetta Babineau$44615 Broadway Street$Grand Rapids, MO 83239
+initials: AZB
+street: 44615 Broadway Street
+mobile: +1 906 774 3992
+mail: user.492@maildomain.net
+employeeNumber: 492
+pager: +1 032 098 0216
+sn: Babineau
+postalCode: 83239
+userPassword: {SSHA}aZZ4B1mJ31cBlD8AdIX3N3pyoMu6CAsEdMn/BQ==
+description: This is the description for Antonetta Babineau.
+l: Grand Rapids
+cn: Antonetta Babineau
+st: MO
+telephoneNumber: +1 657 514 4069
+givenName: Antonetta
+uid: user.492
+homePhone: +1 114 622 0020
+entryUUID: 17351c07-ad2e-3528-92b7-e005a4f71dca
+
+dn: uid=user.493,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antoni Babione$92710 Lakeview Street$Clarksburg, ME 99758
+initials: ALB
+street: 92710 Lakeview Street
+mobile: +1 073 700 6626
+mail: user.493@maildomain.net
+employeeNumber: 493
+pager: +1 994 006 4734
+sn: Babione
+postalCode: 99758
+userPassword: {SSHA}1Q+a4ONTZvyQsAcBE6xlZ5HT2Gt5nOEG76XoFg==
+description: This is the description for Antoni Babione.
+l: Clarksburg
+cn: Antoni Babione
+st: ME
+telephoneNumber: +1 732 756 9614
+givenName: Antoni
+uid: user.493
+homePhone: +1 082 137 5559
+entryUUID: 6734fad9-4944-3aeb-b065-39d4644918a9
+
+dn: uid=user.494,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonia Babyak$58373 North Street$Hartford, MI 74400
+initials: ALB
+street: 58373 North Street
+mobile: +1 099 030 8205
+mail: user.494@maildomain.net
+employeeNumber: 494
+pager: +1 071 300 2550
+sn: Babyak
+postalCode: 74400
+userPassword: {SSHA}gZXBWuD7OkQYFjJELAo3dl6GL1hvvWBKPTagdQ==
+description: This is the description for Antonia Babyak.
+l: Hartford
+cn: Antonia Babyak
+st: MI
+telephoneNumber: +1 125 620 2686
+givenName: Antonia
+uid: user.494
+homePhone: +1 709 732 0205
+entryUUID: c9c01012-7c9c-30bf-b459-55e8566a2331
+
+dn: uid=user.495,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonie Baccari$43384 Pine Street$Pittsburgh, SC 73916
+initials: AFB
+street: 43384 Pine Street
+mobile: +1 779 059 4226
+mail: user.495@maildomain.net
+employeeNumber: 495
+pager: +1 839 929 4935
+sn: Baccari
+postalCode: 73916
+userPassword: {SSHA}RaD4AhoTepsKQtD3MLPPm1eeA4dr6bU5GiViGg==
+description: This is the description for Antonie Baccari.
+l: Pittsburgh
+cn: Antonie Baccari
+st: SC
+telephoneNumber: +1 073 177 4879
+givenName: Antonie
+uid: user.495
+homePhone: +1 333 838 6898
+entryUUID: 2b49fcba-81e2-3510-b5b5-31abfecf67c7
+
+dn: uid=user.496,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonietta Bacchiochi$63720 Maple Street$Wilkes Barre, NM 39063
+initials: AFB
+street: 63720 Maple Street
+mobile: +1 190 350 5106
+mail: user.496@maildomain.net
+employeeNumber: 496
+pager: +1 275 280 0001
+sn: Bacchiochi
+postalCode: 39063
+userPassword: {SSHA}gTZXYJjK+pqP7sLGPGY5FFaa8ot0ZzisAKkxhg==
+description: This is the description for Antonietta Bacchiochi.
+l: Wilkes Barre
+cn: Antonietta Bacchiochi
+st: NM
+telephoneNumber: +1 056 873 7113
+givenName: Antonietta
+uid: user.496
+homePhone: +1 514 032 6035
+entryUUID: 94e1926d-24aa-3f5f-9079-46b93018672c
+
+dn: uid=user.497,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonina Bacciaglia$47142 Green Street$Port Arthur, CT 21279
+initials: AAB
+street: 47142 Green Street
+mobile: +1 210 441 8891
+mail: user.497@maildomain.net
+employeeNumber: 497
+pager: +1 754 004 8193
+sn: Bacciaglia
+postalCode: 21279
+userPassword: {SSHA}vOYR27Fkj9HC1WD5ykYBPTOrvM015gYHkmlRJw==
+description: This is the description for Antonina Bacciaglia.
+l: Port Arthur
+cn: Antonina Bacciaglia
+st: CT
+telephoneNumber: +1 532 839 1037
+givenName: Antonina
+uid: user.497
+homePhone: +1 340 680 8285
+entryUUID: 56d2badd-e2a9-39e5-a6ab-c31ec7380aa6
+
+dn: uid=user.498,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Antonio Bach$38359 Madison Street$Wilkes Barre, IA 58991
+initials: ASB
+street: 38359 Madison Street
+mobile: +1 808 448 2903
+mail: user.498@maildomain.net
+employeeNumber: 498
+pager: +1 863 168 0988
+sn: Bach
+postalCode: 58991
+userPassword: {SSHA}y74jQwNJqHNQQRVpsv3bWmM3YgxKXOn632SC5g==
+description: This is the description for Antonio Bach.
+l: Wilkes Barre
+cn: Antonio Bach
+st: IA
+telephoneNumber: +1 807 906 2910
+givenName: Antonio
+uid: user.498
+homePhone: +1 110 129 2867
+entryUUID: 7d6ba210-5ab9-3e34-9b9b-0d382b17579b
+
+dn: uid=user.499,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anup Bachecongi$17304 Lakeview Street$Baton Rouge, RI 80880
+initials: ADB
+street: 17304 Lakeview Street
+mobile: +1 889 930 4009
+mail: user.499@maildomain.net
+employeeNumber: 499
+pager: +1 806 524 3093
+sn: Bachecongi
+postalCode: 80880
+userPassword: {SSHA}d7Qq10Fac24naTaQWQaYBDxoYPXGNKVhReVA/w==
+description: This is the description for Anup Bachecongi.
+l: Baton Rouge
+cn: Anup Bachecongi
+st: RI
+telephoneNumber: +1 971 291 2848
+givenName: Anup
+uid: user.499
+homePhone: +1 443 480 8420
+entryUUID: 0c922499-5fc6-3375-afae-78b7fbf58b9d
+
+dn: uid=user.500,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anurag Bachelu$20917 Williams Street$Abilene, MA 47946
+initials: AEB
+street: 20917 Williams Street
+mobile: +1 567 478 3670
+mail: user.500@maildomain.net
+employeeNumber: 500
+pager: +1 608 828 0224
+sn: Bachelu
+postalCode: 47946
+userPassword: {SSHA}L+AchplEgeXQ+wAVkfkKVYTNoQZ4zwxQvOw7sQ==
+description: This is the description for Anurag Bachelu.
+l: Abilene
+cn: Anurag Bachelu
+st: MA
+telephoneNumber: +1 966 401 0779
+givenName: Anurag
+uid: user.500
+homePhone: +1 467 830 4802
+entryUUID: 0e484756-f4a0-315b-b23b-92dc9ec0bde3
+
+dn: uid=user.501,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anver Bachewich$09540 Seventh Street$Helena, NY 28659
+initials: AJB
+street: 09540 Seventh Street
+mobile: +1 430 305 5572
+mail: user.501@maildomain.net
+employeeNumber: 501
+pager: +1 807 214 7077
+sn: Bachewich
+postalCode: 28659
+userPassword: {SSHA}fC3ZiPCUzr3ndFt5oQthBOx9OVeyuwll1oi9dA==
+description: This is the description for Anver Bachewich.
+l: Helena
+cn: Anver Bachewich
+st: NY
+telephoneNumber: +1 537 019 7241
+givenName: Anver
+uid: user.501
+homePhone: +1 977 115 0136
+entryUUID: 3f4073c5-d6c8-334b-885a-899854229168
+
+dn: uid=user.502,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anwar Bachmann$80574 First Street$Evansville, KY 77030
+initials: AYB
+street: 80574 First Street
+mobile: +1 117 048 5854
+mail: user.502@maildomain.net
+employeeNumber: 502
+pager: +1 651 633 8843
+sn: Bachmann
+postalCode: 77030
+userPassword: {SSHA}59aYUnQRMD3qzRNxk71RErejJ7aepaZct9pYvQ==
+description: This is the description for Anwar Bachmann.
+l: Evansville
+cn: Anwar Bachmann
+st: KY
+telephoneNumber: +1 156 428 7714
+givenName: Anwar
+uid: user.502
+homePhone: +1 766 819 1976
+entryUUID: 581a9604-9f91-3a53-8cdf-f155b2971717
+
+dn: uid=user.503,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Anya Bachner$95920 Sunset Street$Urbana, MN 58550
+initials: AJB
+street: 95920 Sunset Street
+mobile: +1 510 598 2580
+mail: user.503@maildomain.net
+employeeNumber: 503
+pager: +1 945 424 3669
+sn: Bachner
+postalCode: 58550
+userPassword: {SSHA}MdPHmQF1S1vrhV1zyFZow4u3/lhoAdOcxVCXpw==
+description: This is the description for Anya Bachner.
+l: Urbana
+cn: Anya Bachner
+st: MN
+telephoneNumber: +1 011 957 8170
+givenName: Anya
+uid: user.503
+homePhone: +1 406 704 5397
+entryUUID: 5c3a0d59-b22e-36dd-9bc3-b6057e1f3f89
+
+dn: uid=user.504,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aparna Bachynski$44831 Central Street$Knoxville, OH 92510
+initials: ARB
+street: 44831 Central Street
+mobile: +1 309 316 9422
+mail: user.504@maildomain.net
+employeeNumber: 504
+pager: +1 760 649 0477
+sn: Bachynski
+postalCode: 92510
+userPassword: {SSHA}mObndq7vN+9X4I5a2bUkCsIpTajJ5J9k9CuiFw==
+description: This is the description for Aparna Bachynski.
+l: Knoxville
+cn: Aparna Bachynski
+st: OH
+telephoneNumber: +1 806 399 2408
+givenName: Aparna
+uid: user.504
+homePhone: +1 370 046 1538
+entryUUID: 88e5ec4c-7432-3a6c-901d-7fa67cd5a8c4
+
+dn: uid=user.505,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Api-Ecm Backshall$77009 South Street$Biloxi, HI 89215
+initials: AZB
+street: 77009 South Street
+mobile: +1 901 583 8269
+mail: user.505@maildomain.net
+employeeNumber: 505
+pager: +1 349 632 0996
+sn: Backshall
+postalCode: 89215
+userPassword: {SSHA}QzRYf8aanUiooa29LaApiuh+9fuqhuAhzQC79w==
+description: This is the description for Api-Ecm Backshall.
+l: Biloxi
+cn: Api-Ecm Backshall
+st: HI
+telephoneNumber: +1 908 234 0129
+givenName: Api-Ecm
+uid: user.505
+homePhone: +1 470 017 2026
+entryUUID: a6e20682-de8b-3dcd-8053-d957ec19784e
+
+dn: uid=user.506,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Apollo Baddeley$25458 East Street$Grand Rapids, PA 27990
+initials: AIB
+street: 25458 East Street
+mobile: +1 091 805 3824
+mail: user.506@maildomain.net
+employeeNumber: 506
+pager: +1 445 742 7266
+sn: Baddeley
+postalCode: 27990
+userPassword: {SSHA}ZtijNxWeMtDsQaBonm8PDGtev54HVge8oQTPtA==
+description: This is the description for Apollo Baddeley.
+l: Grand Rapids
+cn: Apollo Baddeley
+st: PA
+telephoneNumber: +1 380 221 4071
+givenName: Apollo
+uid: user.506
+homePhone: +1 880 149 4793
+entryUUID: ce7b2cf2-1118-34ef-b1ef-996b7372ce7d
+
+dn: uid=user.507,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Appolonia Badelt$60008 Eleventh Street$Springfield, TX 05681
+initials: APB
+street: 60008 Eleventh Street
+mobile: +1 409 859 1050
+mail: user.507@maildomain.net
+employeeNumber: 507
+pager: +1 807 166 1006
+sn: Badelt
+postalCode: 05681
+userPassword: {SSHA}+Plu52Qj1KJXawDlEOf9ND2Mbl051KQnjbFhow==
+description: This is the description for Appolonia Badelt.
+l: Springfield
+cn: Appolonia Badelt
+st: TX
+telephoneNumber: +1 003 632 2036
+givenName: Appolonia
+uid: user.507
+homePhone: +1 581 741 0071
+entryUUID: 3656c4d9-1a25-34cd-b82f-f9a81b1abf73
+
+dn: uid=user.508,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: April Badenoch$05475 Willow Street$Boise, OK 22670
+initials: AJB
+street: 05475 Willow Street
+mobile: +1 630 586 8884
+mail: user.508@maildomain.net
+employeeNumber: 508
+pager: +1 120 099 0390
+sn: Badenoch
+postalCode: 22670
+userPassword: {SSHA}+ccistWJxUKm92Tdk4az+MkUwTQ+LMKlNzAOnA==
+description: This is the description for April Badenoch.
+l: Boise
+cn: April Badenoch
+st: OK
+telephoneNumber: +1 706 548 0992
+givenName: April
+uid: user.508
+homePhone: +1 416 001 5840
+entryUUID: 840eab2b-171c-361d-93ce-f7af677b5ca5
+
+dn: uid=user.509,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aprilette Badger$95384 Madison Street$Tupelo, MI 35909
+initials: ADB
+street: 95384 Madison Street
+mobile: +1 791 675 6981
+mail: user.509@maildomain.net
+employeeNumber: 509
+pager: +1 506 110 7710
+sn: Badger
+postalCode: 35909
+userPassword: {SSHA}kPeQCcjGHafI3Fxmx+3yqDKrQVPPL57YahT5gQ==
+description: This is the description for Aprilette Badger.
+l: Tupelo
+cn: Aprilette Badger
+st: MI
+telephoneNumber: +1 038 518 6247
+givenName: Aprilette
+uid: user.509
+homePhone: +1 211 556 9150
+entryUUID: 83e88739-09ad-33d2-ad49-c1453365ec5d
+
+dn: uid=user.510,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Apryle Badjari$53754 Taylor Street$Redding, TN 35800
+initials: AQB
+street: 53754 Taylor Street
+mobile: +1 478 000 1660
+mail: user.510@maildomain.net
+employeeNumber: 510
+pager: +1 035 212 7098
+sn: Badjari
+postalCode: 35800
+userPassword: {SSHA}Cu7UC8hqIEy1dwFPincUF0jlN9s5xJ/j/+FwaA==
+description: This is the description for Apryle Badjari.
+l: Redding
+cn: Apryle Badjari
+st: TN
+telephoneNumber: +1 635 300 3770
+givenName: Apryle
+uid: user.510
+homePhone: +1 044 634 7219
+entryUUID: 823d8e74-c157-3d0d-a1e4-94c61d87fa2e
+
+dn: uid=user.511,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Apurve Badmington$22208 Second Street$San Antonio, MS 22885
+initials: AJB
+street: 22208 Second Street
+mobile: +1 148 969 2091
+mail: user.511@maildomain.net
+employeeNumber: 511
+pager: +1 908 696 1347
+sn: Badmington
+postalCode: 22885
+userPassword: {SSHA}NnyIDAK0AQJ0Pw4N9piXqJatYCRRLHFLs5HxRQ==
+description: This is the description for Apurve Badmington.
+l: San Antonio
+cn: Apurve Badmington
+st: MS
+telephoneNumber: +1 069 411 2818
+givenName: Apurve
+uid: user.511
+homePhone: +1 901 647 1106
+entryUUID: ab20ec19-d648-3871-9f93-078733d43c7f
+
+dn: uid=user.512,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ara Badowski$93068 Fourth Street$Mobile, ME 15006
+initials: ADB
+street: 93068 Fourth Street
+mobile: +1 022 235 6970
+mail: user.512@maildomain.net
+employeeNumber: 512
+pager: +1 028 720 7374
+sn: Badowski
+postalCode: 15006
+userPassword: {SSHA}Aq7qlZMcKr83ett2t1OwHv5+rTUD0mDr13ki8Q==
+description: This is the description for Ara Badowski.
+l: Mobile
+cn: Ara Badowski
+st: ME
+telephoneNumber: +1 752 683 4600
+givenName: Ara
+uid: user.512
+homePhone: +1 000 903 5358
+entryUUID: 96b7d8da-0d29-31d8-99f6-fe951a3608e5
+
+dn: uid=user.513,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arabel Badza$48100 Locust Street$Shreveport, IN 81739
+initials: ACB
+street: 48100 Locust Street
+mobile: +1 625 612 2073
+mail: user.513@maildomain.net
+employeeNumber: 513
+pager: +1 051 396 0616
+sn: Badza
+postalCode: 81739
+userPassword: {SSHA}GvjAtc+91cmpDTPNEaoO+0Tv5oREiR+aBaXNQg==
+description: This is the description for Arabel Badza.
+l: Shreveport
+cn: Arabel Badza
+st: IN
+telephoneNumber: +1 877 795 2050
+givenName: Arabel
+uid: user.513
+homePhone: +1 023 869 6572
+entryUUID: d5b4b73e-12c9-3fc4-8222-37829d98f116
+
+dn: uid=user.514,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arabela Bae$82965 Church Street$Harlingen, NE 40647
+initials: AWB
+street: 82965 Church Street
+mobile: +1 270 921 5838
+mail: user.514@maildomain.net
+employeeNumber: 514
+pager: +1 206 772 1370
+sn: Bae
+postalCode: 40647
+userPassword: {SSHA}YL4sDNpzp5dCXOM3m6epy+e6O0t4j3PsNVHRFA==
+description: This is the description for Arabela Bae.
+l: Harlingen
+cn: Arabela Bae
+st: NE
+telephoneNumber: +1 407 325 4122
+givenName: Arabela
+uid: user.514
+homePhone: +1 899 079 9001
+entryUUID: 438cd797-b90e-39f3-9a48-74da1773e68d
+
+dn: uid=user.515,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arabele Baenziger$19005 Lincoln Street$San Antonio, OR 88907
+initials: AMB
+street: 19005 Lincoln Street
+mobile: +1 505 096 4199
+mail: user.515@maildomain.net
+employeeNumber: 515
+pager: +1 597 308 1036
+sn: Baenziger
+postalCode: 88907
+userPassword: {SSHA}JDtxWd4yffKRwjdGACSzleIuViqBFYkd8BugpA==
+description: This is the description for Arabele Baenziger.
+l: San Antonio
+cn: Arabele Baenziger
+st: OR
+telephoneNumber: +1 027 595 8490
+givenName: Arabele
+uid: user.515
+homePhone: +1 261 260 7177
+entryUUID: efa52b17-3411-3a9b-a4da-bf618db7c9d8
+
+dn: uid=user.516,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arabella Baer$90757 Ridge Street$Saint Louis, NC 80377
+initials: ABB
+street: 90757 Ridge Street
+mobile: +1 792 099 5212
+mail: user.516@maildomain.net
+employeeNumber: 516
+pager: +1 242 012 4193
+sn: Baer
+postalCode: 80377
+userPassword: {SSHA}1RUd5JPTTMwX0tSkX5+zsKQQOAsYwCvUbNRoOA==
+description: This is the description for Arabella Baer.
+l: Saint Louis
+cn: Arabella Baer
+st: NC
+telephoneNumber: +1 309 342 0395
+givenName: Arabella
+uid: user.516
+homePhone: +1 780 026 5850
+entryUUID: 59f4c86e-1293-303f-a005-6cd610f7f6cd
+
+dn: uid=user.517,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arabelle Baerg$49951 North Street$Eau Claire, TN 25300
+initials: ATB
+street: 49951 North Street
+mobile: +1 674 077 3009
+mail: user.517@maildomain.net
+employeeNumber: 517
+pager: +1 302 382 2153
+sn: Baerg
+postalCode: 25300
+userPassword: {SSHA}5DSy8/xSohwIAAGe6t3g9a6dUKUkiQvY2hrd+A==
+description: This is the description for Arabelle Baerg.
+l: Eau Claire
+cn: Arabelle Baerg
+st: TN
+telephoneNumber: +1 000 881 9715
+givenName: Arabelle
+uid: user.517
+homePhone: +1 766 914 5842
+entryUUID: a0c27d08-174e-3480-b9b6-f01c40aaec1e
+
+dn: uid=user.518,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arch Bagetakos$69091 Cedar Street$Providence, AZ 00226
+initials: APB
+street: 69091 Cedar Street
+mobile: +1 022 825 2896
+mail: user.518@maildomain.net
+employeeNumber: 518
+pager: +1 734 000 3040
+sn: Bagetakos
+postalCode: 00226
+userPassword: {SSHA}OCv4fT70VCNv28rRLpRulfRAXoQenlaTLmx9tA==
+description: This is the description for Arch Bagetakos.
+l: Providence
+cn: Arch Bagetakos
+st: AZ
+telephoneNumber: +1 139 700 0000
+givenName: Arch
+uid: user.518
+homePhone: +1 918 398 6718
+entryUUID: d7003901-56d7-3446-b89e-6474b0f48115
+
+dn: uid=user.519,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Archie Bagg$36110 Oak Street$Lubbock, MO 31301
+initials: AVB
+street: 36110 Oak Street
+mobile: +1 614 050 3035
+mail: user.519@maildomain.net
+employeeNumber: 519
+pager: +1 371 840 0709
+sn: Bagg
+postalCode: 31301
+userPassword: {SSHA}T+LXXzQdmwMiVrRjSdIvmLshAJXKivG9Iww8qA==
+description: This is the description for Archie Bagg.
+l: Lubbock
+cn: Archie Bagg
+st: MO
+telephoneNumber: +1 562 814 4004
+givenName: Archie
+uid: user.519
+homePhone: +1 880 353 9176
+entryUUID: daf6ea1b-9653-373d-b97d-5b8b650a1e14
+
+dn: uid=user.520,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arda Baggerman-Webster$86206 Washington Street$Klamath Falls, KY 67540
+initials: AXB
+street: 86206 Washington Street
+mobile: +1 895 961 0320
+mail: user.520@maildomain.net
+employeeNumber: 520
+pager: +1 803 624 3418
+sn: Baggerman-Webster
+postalCode: 67540
+userPassword: {SSHA}VWIK+Py8zJQcbOQMw83Coytj1SLQBHitUfvOow==
+description: This is the description for Arda Baggerman-Webster.
+l: Klamath Falls
+cn: Arda Baggerman-Webster
+st: KY
+telephoneNumber: +1 227 188 7004
+givenName: Arda
+uid: user.520
+homePhone: +1 037 003 0459
+entryUUID: 0981d32b-cca4-3eab-b40c-fdcda6b4250f
+
+dn: uid=user.521,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardath Baghdadi$63690 Pine Street$Cheyenne, NE 31154
+initials: AGB
+street: 63690 Pine Street
+mobile: +1 559 926 1710
+mail: user.521@maildomain.net
+employeeNumber: 521
+pager: +1 793 402 3966
+sn: Baghdadi
+postalCode: 31154
+userPassword: {SSHA}Lg/hRu3ESeaxttcrmC9FqxdNAp36U7DIid2mvA==
+description: This is the description for Ardath Baghdadi.
+l: Cheyenne
+cn: Ardath Baghdadi
+st: NE
+telephoneNumber: +1 523 300 0030
+givenName: Ardath
+uid: user.521
+homePhone: +1 799 613 8620
+entryUUID: e819b156-94e0-3540-8005-ae4a9d60f011
+
+dn: uid=user.522,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardavan Bagi$93647 First Street$Yuma, IL 14858
+initials: AVB
+street: 93647 First Street
+mobile: +1 091 844 1667
+mail: user.522@maildomain.net
+employeeNumber: 522
+pager: +1 065 326 8036
+sn: Bagi
+postalCode: 14858
+userPassword: {SSHA}EsIBzBtr0gQMf26rSCtlYiEaz68YbP/A1vROwA==
+description: This is the description for Ardavan Bagi.
+l: Yuma
+cn: Ardavan Bagi
+st: IL
+telephoneNumber: +1 319 071 5158
+givenName: Ardavan
+uid: user.522
+homePhone: +1 881 597 5130
+entryUUID: 2d8f1c06-ae40-355a-ae6c-fd57b2fa8e01
+
+dn: uid=user.523,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardeen Bagnato$92471 Oak Street$Springfield, MN 37717
+initials: AQB
+street: 92471 Oak Street
+mobile: +1 209 183 3605
+mail: user.523@maildomain.net
+employeeNumber: 523
+pager: +1 287 569 8276
+sn: Bagnato
+postalCode: 37717
+userPassword: {SSHA}hJUU9E2cOWKlLgvQsWbMn5+oaTfjqPZNzi8V1w==
+description: This is the description for Ardeen Bagnato.
+l: Springfield
+cn: Ardeen Bagnato
+st: MN
+telephoneNumber: +1 786 416 7387
+givenName: Ardeen
+uid: user.523
+homePhone: +1 524 596 0600
+entryUUID: af089a24-6f8b-3fdc-8bdb-b186d8fdc1bc
+
+dn: uid=user.524,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardelia Bagshaw$81067 Willow Street$Biloxi, DC 81177
+initials: AOB
+street: 81067 Willow Street
+mobile: +1 518 482 7220
+mail: user.524@maildomain.net
+employeeNumber: 524
+pager: +1 640 009 2670
+sn: Bagshaw
+postalCode: 81177
+userPassword: {SSHA}isdUSWC0LMvOKXLdODEB+43jPVtUiZhFJk5j9w==
+description: This is the description for Ardelia Bagshaw.
+l: Biloxi
+cn: Ardelia Bagshaw
+st: DC
+telephoneNumber: +1 682 980 9614
+givenName: Ardelia
+uid: user.524
+homePhone: +1 373 009 1142
+entryUUID: f4bbe3de-703e-37a0-9ae3-77a224aa33f2
+
+dn: uid=user.525,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardelis Bagwell$77090 East Street$Jackson, MS 95590
+initials: ABB
+street: 77090 East Street
+mobile: +1 533 376 7450
+mail: user.525@maildomain.net
+employeeNumber: 525
+pager: +1 289 921 6195
+sn: Bagwell
+postalCode: 95590
+userPassword: {SSHA}3Rm9KkpKoA2U+tFg6k+2jrg1l79HF4eUmFz4RQ==
+description: This is the description for Ardelis Bagwell.
+l: Jackson
+cn: Ardelis Bagwell
+st: MS
+telephoneNumber: +1 752 402 1097
+givenName: Ardelis
+uid: user.525
+homePhone: +1 332 554 6684
+entryUUID: 23e1db5a-024f-3ab1-b02b-85d97be133a5
+
+dn: uid=user.526,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardella Bahgat$51103 Franklin Street$Wichita, IA 96630
+initials: AGB
+street: 51103 Franklin Street
+mobile: +1 630 676 8711
+mail: user.526@maildomain.net
+employeeNumber: 526
+pager: +1 105 760 6467
+sn: Bahgat
+postalCode: 96630
+userPassword: {SSHA}IZhoL1HaNa1v62QD2swMLlcz6OlqqaRLndHvWQ==
+description: This is the description for Ardella Bahgat.
+l: Wichita
+cn: Ardella Bahgat
+st: IA
+telephoneNumber: +1 027 082 8772
+givenName: Ardella
+uid: user.526
+homePhone: +1 148 564 1256
+entryUUID: fd5bb7db-3337-3bdb-ad83-fb5ee57dd2f5
+
+dn: uid=user.527,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardelle Bahia$01575 Jackson Street$Helena, OK 51990
+initials: AUB
+street: 01575 Jackson Street
+mobile: +1 083 998 0084
+mail: user.527@maildomain.net
+employeeNumber: 527
+pager: +1 257 155 0295
+sn: Bahia
+postalCode: 51990
+userPassword: {SSHA}uH+Oc9lOMUCByQI4nr2hVc0cfrK3sALyl3bHlw==
+description: This is the description for Ardelle Bahia.
+l: Helena
+cn: Ardelle Bahia
+st: OK
+telephoneNumber: +1 700 235 8012
+givenName: Ardelle
+uid: user.527
+homePhone: +1 003 522 6034
+entryUUID: 0dc28f41-d63a-30ab-8895-25513af1e279
+
+dn: uid=user.528,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arden Bahl$47486 Spring Street$Tucson, NE 40626
+initials: AEB
+street: 47486 Spring Street
+mobile: +1 335 907 1909
+mail: user.528@maildomain.net
+employeeNumber: 528
+pager: +1 806 201 4003
+sn: Bahl
+postalCode: 40626
+userPassword: {SSHA}LwMRwDSRkbcp0eU8kyifzafTnHYeGCcDTJVDDQ==
+description: This is the description for Arden Bahl.
+l: Tucson
+cn: Arden Bahl
+st: NE
+telephoneNumber: +1 901 938 5391
+givenName: Arden
+uid: user.528
+homePhone: +1 450 129 1697
+entryUUID: 3a9a58be-6ca7-3a3d-8d4a-488915e4e9d2
+
+dn: uid=user.529,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardene Bahoric$54672 Fourteenth Street$Lynchburg, DC 75363
+initials: AYB
+street: 54672 Fourteenth Street
+mobile: +1 840 070 7415
+mail: user.529@maildomain.net
+employeeNumber: 529
+pager: +1 670 162 0072
+sn: Bahoric
+postalCode: 75363
+userPassword: {SSHA}/qmz3uLOBivJUoi5JooPykIkK0gAtGgt7KeIDA==
+description: This is the description for Ardene Bahoric.
+l: Lynchburg
+cn: Ardene Bahoric
+st: DC
+telephoneNumber: +1 002 197 0694
+givenName: Ardene
+uid: user.529
+homePhone: +1 379 348 8897
+entryUUID: 5a64a3f6-0460-36cf-a011-a0b622f3c4fd
+
+dn: uid=user.530,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardenia Bailetti$54890 Meadow Street$Urbana, CO 78522
+initials: AJB
+street: 54890 Meadow Street
+mobile: +1 000 549 0985
+mail: user.530@maildomain.net
+employeeNumber: 530
+pager: +1 740 306 9723
+sn: Bailetti
+postalCode: 78522
+userPassword: {SSHA}YDmflzl1BEkRXod0LPPe9sxDgYenKEA6+pmg7w==
+description: This is the description for Ardenia Bailetti.
+l: Urbana
+cn: Ardenia Bailetti
+st: CO
+telephoneNumber: +1 341 960 4228
+givenName: Ardenia
+uid: user.530
+homePhone: +1 460 019 9453
+entryUUID: 7274f014-959f-3598-951e-d9319acaaf6a
+
+dn: uid=user.531,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardie Bailey$08011 Highland Street$Raleigh, UT 44319
+initials: AGB
+street: 08011 Highland Street
+mobile: +1 880 787 4159
+mail: user.531@maildomain.net
+employeeNumber: 531
+pager: +1 902 067 9139
+sn: Bailey
+postalCode: 44319
+userPassword: {SSHA}naA78hntx0J5IreRaF69rAewobXl2WJ1yZInzw==
+description: This is the description for Ardie Bailey.
+l: Raleigh
+cn: Ardie Bailey
+st: UT
+telephoneNumber: +1 242 209 8716
+givenName: Ardie
+uid: user.531
+homePhone: +1 923 694 5735
+entryUUID: 75654f92-cc61-3b7f-8ac6-ac4f703088e7
+
+dn: uid=user.532,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardine Bailie$98433 Johnson Street$Tuscaloosa, TN 10600
+initials: AVB
+street: 98433 Johnson Street
+mobile: +1 141 573 8154
+mail: user.532@maildomain.net
+employeeNumber: 532
+pager: +1 602 289 4230
+sn: Bailie
+postalCode: 10600
+userPassword: {SSHA}a1zMHIuFOKDsUULnBzLXAMAym2p+s/ewbNbvCQ==
+description: This is the description for Ardine Bailie.
+l: Tuscaloosa
+cn: Ardine Bailie
+st: TN
+telephoneNumber: +1 423 207 8398
+givenName: Ardine
+uid: user.532
+homePhone: +1 354 348 9801
+entryUUID: b65f0ff4-6966-3c52-8679-ff0ecb5e10a1
+
+dn: uid=user.533,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardis Baillargeon$68643 Eleventh Street$Pocatello, AL 02306
+initials: AXB
+street: 68643 Eleventh Street
+mobile: +1 252 800 5760
+mail: user.533@maildomain.net
+employeeNumber: 533
+pager: +1 651 238 5770
+sn: Baillargeon
+postalCode: 02306
+userPassword: {SSHA}+Ja/Aq8qd/AsyHPuvZEE7hk+zzcNOb3mVJg+qg==
+description: This is the description for Ardis Baillargeon.
+l: Pocatello
+cn: Ardis Baillargeon
+st: AL
+telephoneNumber: +1 838 775 9924
+givenName: Ardis
+uid: user.533
+homePhone: +1 502 919 3337
+entryUUID: 64615c60-7dd3-3070-9af5-231c744543a3
+
+dn: uid=user.534,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardisj Bailloux$84181 Spring Street$Tucson, TN 72130
+initials: APB
+street: 84181 Spring Street
+mobile: +1 236 430 4163
+mail: user.534@maildomain.net
+employeeNumber: 534
+pager: +1 345 664 1154
+sn: Bailloux
+postalCode: 72130
+userPassword: {SSHA}TpEeHY186+BT+wGiS1Iq1fiPVqN5HdH65jKUeA==
+description: This is the description for Ardisj Bailloux.
+l: Tucson
+cn: Ardisj Bailloux
+st: TN
+telephoneNumber: +1 170 242 9956
+givenName: Ardisj
+uid: user.534
+homePhone: +1 712 087 9037
+entryUUID: 88d275f9-224f-33ce-85bd-47984eb393b1
+
+dn: uid=user.535,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardith Bain$09290 Lincoln Street$Mason City, PA 04010
+initials: AZB
+street: 09290 Lincoln Street
+mobile: +1 406 546 4286
+mail: user.535@maildomain.net
+employeeNumber: 535
+pager: +1 430 663 0150
+sn: Bain
+postalCode: 04010
+userPassword: {SSHA}nMwHXVX7h7WdoUP2RcNd4n8nIcE/9eOR0Cnz5Q==
+description: This is the description for Ardith Bain.
+l: Mason City
+cn: Ardith Bain
+st: PA
+telephoneNumber: +1 409 620 0471
+givenName: Ardith
+uid: user.535
+homePhone: +1 190 726 7903
+entryUUID: 52e290e3-bb8c-37e9-a6ca-346d951f812c
+
+dn: uid=user.536,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardra Bainer$30027 Locust Street$Glendive, MA 92386
+initials: ANB
+street: 30027 Locust Street
+mobile: +1 674 066 8361
+mail: user.536@maildomain.net
+employeeNumber: 536
+pager: +1 856 763 9700
+sn: Bainer
+postalCode: 92386
+userPassword: {SSHA}rfEqiY1w4pgNumtTQZi+C1uocCgYPLDr8Thzww==
+description: This is the description for Ardra Bainer.
+l: Glendive
+cn: Ardra Bainer
+st: MA
+telephoneNumber: +1 964 480 1436
+givenName: Ardra
+uid: user.536
+homePhone: +1 283 853 3908
+entryUUID: c8b55750-2196-35ee-84b0-f2dafd7478a7
+
+dn: uid=user.537,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardyce Baines$30514 Lakeview Street$Flint, NE 28089
+initials: AZB
+street: 30514 Lakeview Street
+mobile: +1 977 574 0603
+mail: user.537@maildomain.net
+employeeNumber: 537
+pager: +1 174 700 0573
+sn: Baines
+postalCode: 28089
+userPassword: {SSHA}EhT5Oe0YtIviItLclCAKdSjt5ZrMLTDF/ofjcw==
+description: This is the description for Ardyce Baines.
+l: Flint
+cn: Ardyce Baines
+st: NE
+telephoneNumber: +1 945 939 7500
+givenName: Ardyce
+uid: user.537
+homePhone: +1 763 243 6899
+entryUUID: 1e3735d0-5096-3660-a33d-7eb13c331082
+
+dn: uid=user.538,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardys Bains$46463 West Street$Great Falls, NH 71818
+initials: AMB
+street: 46463 West Street
+mobile: +1 568 873 9797
+mail: user.538@maildomain.net
+employeeNumber: 538
+pager: +1 406 762 8079
+sn: Bains
+postalCode: 71818
+userPassword: {SSHA}enfsXM+sK5429gVRPZMwKE/VGvMfqzcOXXtyQQ==
+description: This is the description for Ardys Bains.
+l: Great Falls
+cn: Ardys Bains
+st: NH
+telephoneNumber: +1 085 648 6673
+givenName: Ardys
+uid: user.538
+homePhone: +1 066 710 2389
+entryUUID: 09df1471-5f0d-3c6f-92da-16ea80fe7e6b
+
+dn: uid=user.539,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ardyth Bainton$31984 Elm Street$Abilene, NV 13858
+initials: ACB
+street: 31984 Elm Street
+mobile: +1 252 091 4978
+mail: user.539@maildomain.net
+employeeNumber: 539
+pager: +1 683 064 8765
+sn: Bainton
+postalCode: 13858
+userPassword: {SSHA}6I95P6mvf7ssZ+Pr+XFbFetu23tL33BwwJQmdQ==
+description: This is the description for Ardyth Bainton.
+l: Abilene
+cn: Ardyth Bainton
+st: NV
+telephoneNumber: +1 943 730 1716
+givenName: Ardyth
+uid: user.539
+homePhone: +1 497 815 7371
+entryUUID: f25cfd5d-c562-333d-b0f7-4c19145e5543
+
+dn: uid=user.540,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aretha Baird$82615 Third Street$Albuquerque, TN 47907
+initials: ANB
+street: 82615 Third Street
+mobile: +1 868 631 7927
+mail: user.540@maildomain.net
+employeeNumber: 540
+pager: +1 955 700 4994
+sn: Baird
+postalCode: 47907
+userPassword: {SSHA}waRE+BfEaMXU4J3cz6wOHdSC+BRkZz4DifoU+g==
+description: This is the description for Aretha Baird.
+l: Albuquerque
+cn: Aretha Baird
+st: TN
+telephoneNumber: +1 507 096 0351
+givenName: Aretha
+uid: user.540
+homePhone: +1 092 323 0255
+entryUUID: e63ee3d9-cabc-3195-8139-ce99c2435ec2
+
+dn: uid=user.541,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ari Bajada$02826 Eleventh Street$Harrisonburg, ID 97153
+initials: ATB
+street: 02826 Eleventh Street
+mobile: +1 374 246 4971
+mail: user.541@maildomain.net
+employeeNumber: 541
+pager: +1 004 501 0204
+sn: Bajada
+postalCode: 97153
+userPassword: {SSHA}7iEmbYsBkxZ36yn1IrCR8kQl0rKLrLMDAJtEUw==
+description: This is the description for Ari Bajada.
+l: Harrisonburg
+cn: Ari Bajada
+st: ID
+telephoneNumber: +1 788 580 6307
+givenName: Ari
+uid: user.541
+homePhone: +1 753 056 6674
+entryUUID: ef23613d-012d-305c-a1e7-875b749232ac
+
+dn: uid=user.542,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ariadne Bajpeyi$85670 Williams Street$Sioux City, WA 40073
+initials: AVB
+street: 85670 Williams Street
+mobile: +1 454 467 7356
+mail: user.542@maildomain.net
+employeeNumber: 542
+pager: +1 294 703 3747
+sn: Bajpeyi
+postalCode: 40073
+userPassword: {SSHA}0dtPm8tNh48DpFhgk7s0dAGESKnqwoOl4QjU4A==
+description: This is the description for Ariadne Bajpeyi.
+l: Sioux City
+cn: Ariadne Bajpeyi
+st: WA
+telephoneNumber: +1 429 202 0305
+givenName: Ariadne
+uid: user.542
+homePhone: +1 007 436 0345
+entryUUID: 67875b3d-dc81-330c-9ca1-8010f7def25d
+
+dn: uid=user.543,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ariana Bakay$34035 North Street$Orlando, CO 31761
+initials: AHB
+street: 34035 North Street
+mobile: +1 075 045 4581
+mail: user.543@maildomain.net
+employeeNumber: 543
+pager: +1 726 095 3706
+sn: Bakay
+postalCode: 31761
+userPassword: {SSHA}ad+8ZTrB6KYpgP361rMqJuv76SrFwhyzzzAaEg==
+description: This is the description for Ariana Bakay.
+l: Orlando
+cn: Ariana Bakay
+st: CO
+telephoneNumber: +1 208 980 7194
+givenName: Ariana
+uid: user.543
+homePhone: +1 575 370 1641
+entryUUID: 87e0845d-5f51-3863-b435-2c8b1cdbbe54
+
+dn: uid=user.544,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aridatha Baker$36439 Twelfth Street$West Palm Beach, GA 04081
+initials: AZB
+street: 36439 Twelfth Street
+mobile: +1 468 124 8765
+mail: user.544@maildomain.net
+employeeNumber: 544
+pager: +1 350 002 3184
+sn: Baker
+postalCode: 04081
+userPassword: {SSHA}6gucCq8N6MT8OzL9Hhr/uFrIfhYtBqZvp3ODZQ==
+description: This is the description for Aridatha Baker.
+l: West Palm Beach
+cn: Aridatha Baker
+st: GA
+telephoneNumber: +1 642 087 0292
+givenName: Aridatha
+uid: user.544
+homePhone: +1 605 202 4798
+entryUUID: ac88eb4c-e94d-3058-b514-2c4881a32fd6
+
+dn: uid=user.545,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ariel Baker-Gregory$41203 Lincoln Street$Bangor, WY 81754
+initials: AGB
+street: 41203 Lincoln Street
+mobile: +1 584 806 1376
+mail: user.545@maildomain.net
+employeeNumber: 545
+pager: +1 890 558 8509
+sn: Baker-Gregory
+postalCode: 81754
+userPassword: {SSHA}Owa8btCSLR5rAVnCZkPuGDvfN0wRTdx60JcEjA==
+description: This is the description for Ariel Baker-Gregory.
+l: Bangor
+cn: Ariel Baker-Gregory
+st: WY
+telephoneNumber: +1 920 793 4204
+givenName: Ariel
+uid: user.545
+homePhone: +1 644 721 6826
+entryUUID: 2daed42a-703b-39ee-a206-99641717fb2b
+
+dn: uid=user.546,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ariela Bakhach$80831 Twelfth Street$Sioux Falls, KY 63905
+initials: AVB
+street: 80831 Twelfth Street
+mobile: +1 330 203 6054
+mail: user.546@maildomain.net
+employeeNumber: 546
+pager: +1 706 798 0089
+sn: Bakhach
+postalCode: 63905
+userPassword: {SSHA}VD30MDLT4O+PD7sSLKA3iDtvw3q/UtGN9vPIUw==
+description: This is the description for Ariela Bakhach.
+l: Sioux Falls
+cn: Ariela Bakhach
+st: KY
+telephoneNumber: +1 491 015 3241
+givenName: Ariela
+uid: user.546
+homePhone: +1 164 890 9081
+entryUUID: 425f198f-bd23-3ea9-ba9e-155bf3aec89d
+
+dn: uid=user.547,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ariella Bakkum$40430 Elm Street$Biloxi, CT 82027
+initials: ASB
+street: 40430 Elm Street
+mobile: +1 086 302 9803
+mail: user.547@maildomain.net
+employeeNumber: 547
+pager: +1 306 840 5872
+sn: Bakkum
+postalCode: 82027
+userPassword: {SSHA}ezFaoapb8pLEwd4DDymWL7hqTUIbK0M81z/J9Q==
+description: This is the description for Ariella Bakkum.
+l: Biloxi
+cn: Ariella Bakkum
+st: CT
+telephoneNumber: +1 860 514 9643
+givenName: Ariella
+uid: user.547
+homePhone: +1 143 957 0370
+entryUUID: eab6cfc0-e86f-39aa-8fde-ad0b475d7963
+
+dn: uid=user.548,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arielle Balaban$08056 Central Street$Phoenix, DC 50008
+initials: ALB
+street: 08056 Central Street
+mobile: +1 140 106 6307
+mail: user.548@maildomain.net
+employeeNumber: 548
+pager: +1 118 110 3367
+sn: Balaban
+postalCode: 50008
+userPassword: {SSHA}sro8kWPYTD3mWsXwnkW+yeH6cLkTm+GtBCyrRQ==
+description: This is the description for Arielle Balaban.
+l: Phoenix
+cn: Arielle Balaban
+st: DC
+telephoneNumber: +1 118 771 0094
+givenName: Arielle
+uid: user.548
+homePhone: +1 343 006 0030
+entryUUID: d3186345-6794-3b12-9c16-0cc4ca747b4a
+
+dn: uid=user.549,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arif Balabanian$08050 Sunset Street$Charlotte, TX 85160
+initials: AIB
+street: 08050 Sunset Street
+mobile: +1 853 615 2278
+mail: user.549@maildomain.net
+employeeNumber: 549
+pager: +1 218 795 4904
+sn: Balabanian
+postalCode: 85160
+userPassword: {SSHA}bHdiag3WjoPu3u2dOl5zRiG7fZYW399uzE+gOg==
+description: This is the description for Arif Balabanian.
+l: Charlotte
+cn: Arif Balabanian
+st: TX
+telephoneNumber: +1 217 571 0441
+givenName: Arif
+uid: user.549
+homePhone: +1 729 994 1892
+entryUUID: 8021cd68-af1d-349c-a319-236d3155a97e
+
+dn: uid=user.550,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arina Balakrishnan$51058 Lee Street$Wheeling, DE 75341
+initials: AFB
+street: 51058 Lee Street
+mobile: +1 091 601 5008
+mail: user.550@maildomain.net
+employeeNumber: 550
+pager: +1 308 917 8730
+sn: Balakrishnan
+postalCode: 75341
+userPassword: {SSHA}5Z5vYSMPuoNQzRRztdlg6eY+PcGYwwuRp7S8cg==
+description: This is the description for Arina Balakrishnan.
+l: Wheeling
+cn: Arina Balakrishnan
+st: DE
+telephoneNumber: +1 390 687 9513
+givenName: Arina
+uid: user.550
+homePhone: +1 311 069 8026
+entryUUID: bc86ebdf-5a73-30dd-8971-b1c18b695ed0
+
+dn: uid=user.551,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aris Balanger$81032 Pine Street$Johnstown, NE 59978
+initials: AWB
+street: 81032 Pine Street
+mobile: +1 531 500 5642
+mail: user.551@maildomain.net
+employeeNumber: 551
+pager: +1 005 782 3604
+sn: Balanger
+postalCode: 59978
+userPassword: {SSHA}glD/FrV6rlzICYoJE9LQQSILWKHv5qfx1VjkhA==
+description: This is the description for Aris Balanger.
+l: Johnstown
+cn: Aris Balanger
+st: NE
+telephoneNumber: +1 405 324 0189
+givenName: Aris
+uid: user.551
+homePhone: +1 781 528 0379
+entryUUID: 470be575-5239-3e58-be27-8105232a9650
+
+dn: uid=user.552,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aristides Balascak$40759 Franklin Street$Boise, OK 10040
+initials: AGB
+street: 40759 Franklin Street
+mobile: +1 794 239 2097
+mail: user.552@maildomain.net
+employeeNumber: 552
+pager: +1 070 742 6401
+sn: Balascak
+postalCode: 10040
+userPassword: {SSHA}etKtVvqxA/bL5ck9/ah3LUjMqCwJQc92Gv+rGg==
+description: This is the description for Aristides Balascak.
+l: Boise
+cn: Aristides Balascak
+st: OK
+telephoneNumber: +1 306 210 2030
+givenName: Aristides
+uid: user.552
+homePhone: +1 691 272 8479
+entryUUID: 3e7814a3-307a-37e0-a71b-5a58c390ccea
+
+dn: uid=user.553,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arjun Balcom$08623 Lakeview Street$Tyler, OH 99877
+initials: AKB
+street: 08623 Lakeview Street
+mobile: +1 521 436 5850
+mail: user.553@maildomain.net
+employeeNumber: 553
+pager: +1 538 240 4322
+sn: Balcom
+postalCode: 99877
+userPassword: {SSHA}y1YP2IT0xqtRUCgre7F7X2yOU6LG9MDHtJdnCw==
+description: This is the description for Arjun Balcom.
+l: Tyler
+cn: Arjun Balcom
+st: OH
+telephoneNumber: +1 280 171 5779
+givenName: Arjun
+uid: user.553
+homePhone: +1 375 230 2312
+entryUUID: 1413ec4a-5cee-3fe2-8744-c6f1db092aa8
+
+dn: uid=user.554,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlan Balderston$88254 Sycamore Street$Biloxi, DE 67205
+initials: ABB
+street: 88254 Sycamore Street
+mobile: +1 334 576 0903
+mail: user.554@maildomain.net
+employeeNumber: 554
+pager: +1 824 267 2756
+sn: Balderston
+postalCode: 67205
+userPassword: {SSHA}0TMbsb676uXEzTEDT+ohGzUMk2UDyDIjAA9J5w==
+description: This is the description for Arlan Balderston.
+l: Biloxi
+cn: Arlan Balderston
+st: DE
+telephoneNumber: +1 879 899 8053
+givenName: Arlan
+uid: user.554
+homePhone: +1 610 300 8066
+entryUUID: 61b2a6c1-a528-302b-9b65-f198fb71e7a2
+
+dn: uid=user.555,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlana Baldock$44886 Mill Street$Columbia, WA 10769
+initials: AUB
+street: 44886 Mill Street
+mobile: +1 082 059 6649
+mail: user.555@maildomain.net
+employeeNumber: 555
+pager: +1 000 398 3431
+sn: Baldock
+postalCode: 10769
+userPassword: {SSHA}uSKgl9rUj459r6BJaHtIT5VzXiOZusDtbWiREA==
+description: This is the description for Arlana Baldock.
+l: Columbia
+cn: Arlana Baldock
+st: WA
+telephoneNumber: +1 450 354 9104
+givenName: Arlana
+uid: user.555
+homePhone: +1 698 771 2784
+entryUUID: 8986b4f3-a304-36ca-8417-cd9851e3fed5
+
+dn: uid=user.556,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlee Baldridge$08848 Woodland Street$El Paso, WI 91209
+initials: ADB
+street: 08848 Woodland Street
+mobile: +1 356 812 9986
+mail: user.556@maildomain.net
+employeeNumber: 556
+pager: +1 287 525 0431
+sn: Baldridge
+postalCode: 91209
+userPassword: {SSHA}fYbrdK5awPYoQrIq0fxIi8Rp8qXX4WPHqFCeYw==
+description: This is the description for Arlee Baldridge.
+l: El Paso
+cn: Arlee Baldridge
+st: WI
+telephoneNumber: +1 600 154 7433
+givenName: Arlee
+uid: user.556
+homePhone: +1 282 444 7147
+entryUUID: 8dcfb38c-56f2-3cf8-a699-399131ac5e66
+
+dn: uid=user.557,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arleen Baldwin$86014 Williams Street$Baltimore, NJ 08184
+initials: ASB
+street: 86014 Williams Street
+mobile: +1 479 952 4520
+mail: user.557@maildomain.net
+employeeNumber: 557
+pager: +1 401 136 3064
+sn: Baldwin
+postalCode: 08184
+userPassword: {SSHA}K+BHFW40YwgO27rNs7vBvqXl5BlCPXHeK9Bs3Q==
+description: This is the description for Arleen Baldwin.
+l: Baltimore
+cn: Arleen Baldwin
+st: NJ
+telephoneNumber: +1 313 538 0033
+givenName: Arleen
+uid: user.557
+homePhone: +1 908 078 2558
+entryUUID: 893e21b0-fc28-3b8d-a79b-16e3b588fdde
+
+dn: uid=user.558,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlen Bales$39707 Green Street$San Diego, AK 63630
+initials: AEB
+street: 39707 Green Street
+mobile: +1 803 431 6249
+mail: user.558@maildomain.net
+employeeNumber: 558
+pager: +1 813 367 6630
+sn: Bales
+postalCode: 63630
+userPassword: {SSHA}8hzykf9lhAlbRWKcrV6Wjr1bwwyhevrMkQ/Kiw==
+description: This is the description for Arlen Bales.
+l: San Diego
+cn: Arlen Bales
+st: AK
+telephoneNumber: +1 768 369 4503
+givenName: Arlen
+uid: user.558
+homePhone: +1 214 602 0567
+entryUUID: 9c92c771-8f62-3464-ac20-c76c8f953358
+
+dn: uid=user.559,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlena Balgalvis$39348 Sunset Street$Lincoln, RI 34321
+initials: AVB
+street: 39348 Sunset Street
+mobile: +1 284 023 4794
+mail: user.559@maildomain.net
+employeeNumber: 559
+pager: +1 230 597 0102
+sn: Balgalvis
+postalCode: 34321
+userPassword: {SSHA}6j9dotS0EueBjEzx1gWjgF2BtAWj4pLsY0H7gQ==
+description: This is the description for Arlena Balgalvis.
+l: Lincoln
+cn: Arlena Balgalvis
+st: RI
+telephoneNumber: +1 068 108 9183
+givenName: Arlena
+uid: user.559
+homePhone: +1 337 807 1829
+entryUUID: 15bb4818-531e-33d6-9ed7-1f109586e839
+
+dn: uid=user.560,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlene Balkenhol$45962 Fifth Street$Kirksville, NM 11970
+initials: AEB
+street: 45962 Fifth Street
+mobile: +1 113 440 8022
+mail: user.560@maildomain.net
+employeeNumber: 560
+pager: +1 067 428 0471
+sn: Balkenhol
+postalCode: 11970
+userPassword: {SSHA}AYGZENt/UYg94Sg49pcSvpAHLiKZvJ4eMVEayA==
+description: This is the description for Arlene Balkenhol.
+l: Kirksville
+cn: Arlene Balkenhol
+st: NM
+telephoneNumber: +1 447 969 1633
+givenName: Arlene
+uid: user.560
+homePhone: +1 028 282 5429
+entryUUID: 2eeced07-0579-3c08-bf82-57c167e7e65c
+
+dn: uid=user.561,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arleta Balkissoon$45204 Wilson Street$Louisville, NV 71104
+initials: AXB
+street: 45204 Wilson Street
+mobile: +1 861 045 4808
+mail: user.561@maildomain.net
+employeeNumber: 561
+pager: +1 069 930 5066
+sn: Balkissoon
+postalCode: 71104
+userPassword: {SSHA}K5mR9OecCeD0/Vw1HYGp5Yl9b60er/TYOf6sww==
+description: This is the description for Arleta Balkissoon.
+l: Louisville
+cn: Arleta Balkissoon
+st: NV
+telephoneNumber: +1 123 394 0072
+givenName: Arleta
+uid: user.561
+homePhone: +1 015 101 9082
+entryUUID: 83db6bae-be77-3032-bcfd-f46a1a532aba
+
+dn: uid=user.562,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlette Ballantine$24752 Spruce Street$Santa Barbara, NE 63031
+initials: AYB
+street: 24752 Spruce Street
+mobile: +1 094 761 8221
+mail: user.562@maildomain.net
+employeeNumber: 562
+pager: +1 935 337 7129
+sn: Ballantine
+postalCode: 63031
+userPassword: {SSHA}RflVRlpgLi6srBS3sbI4/2f4MBWozOBF8hfFpQ==
+description: This is the description for Arlette Ballantine.
+l: Santa Barbara
+cn: Arlette Ballantine
+st: NE
+telephoneNumber: +1 017 108 1354
+givenName: Arlette
+uid: user.562
+homePhone: +1 503 319 0350
+entryUUID: c5b5800b-bf76-3cdf-80fd-285272692a48
+
+dn: uid=user.563,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arleyne Ballard$77240 Elm Street$Rapid City, LA 74541
+initials: AMB
+street: 77240 Elm Street
+mobile: +1 098 878 8520
+mail: user.563@maildomain.net
+employeeNumber: 563
+pager: +1 074 327 2209
+sn: Ballard
+postalCode: 74541
+userPassword: {SSHA}TVh3pc7lAWtDLfU1sgtgltILArFLZs5EI70SBQ==
+description: This is the description for Arleyne Ballard.
+l: Rapid City
+cn: Arleyne Ballard
+st: LA
+telephoneNumber: +1 907 096 0730
+givenName: Arleyne
+uid: user.563
+homePhone: +1 556 123 9986
+entryUUID: 3efac6f2-3797-3f92-b2af-a2f027a5df75
+
+dn: uid=user.564,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlie Ballarte$14550 North Street$Riverton, LA 74835
+initials: AWB
+street: 14550 North Street
+mobile: +1 700 905 7013
+mail: user.564@maildomain.net
+employeeNumber: 564
+pager: +1 824 231 2555
+sn: Ballarte
+postalCode: 74835
+userPassword: {SSHA}YzZ/R924RUVhe8QGlVZXjWig3Cc+PPeqfFKz3A==
+description: This is the description for Arlie Ballarte.
+l: Riverton
+cn: Arlie Ballarte
+st: LA
+telephoneNumber: +1 125 274 9516
+givenName: Arlie
+uid: user.564
+homePhone: +1 580 950 2830
+entryUUID: dc573fdb-38db-34ef-b66c-9adba792e860
+
+dn: uid=user.565,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arliene Ballinger$29301 Chestnut Street$Cleveland, GA 96190
+initials: AMB
+street: 29301 Chestnut Street
+mobile: +1 261 688 2873
+mail: user.565@maildomain.net
+employeeNumber: 565
+pager: +1 999 966 0261
+sn: Ballinger
+postalCode: 96190
+userPassword: {SSHA}T6eMPJXwm14YDVPwtieSJ4Xq1Uzkgs8Gy3PyHA==
+description: This is the description for Arliene Ballinger.
+l: Cleveland
+cn: Arliene Ballinger
+st: GA
+telephoneNumber: +1 354 174 8693
+givenName: Arliene
+uid: user.565
+homePhone: +1 379 015 5454
+entryUUID: 8ad8d088-63b5-32be-8174-468c0a6dad5e
+
+dn: uid=user.566,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlina Ballios$40645 Sixth Street$Lynchburg, MS 80597
+initials: ARB
+street: 40645 Sixth Street
+mobile: +1 082 968 7203
+mail: user.566@maildomain.net
+employeeNumber: 566
+pager: +1 710 791 1190
+sn: Ballios
+postalCode: 80597
+userPassword: {SSHA}p7a+1G2/r86XYFQ1fL+xRcL+g6JiRBKZOft0vA==
+description: This is the description for Arlina Ballios.
+l: Lynchburg
+cn: Arlina Ballios
+st: MS
+telephoneNumber: +1 090 195 2907
+givenName: Arlina
+uid: user.566
+homePhone: +1 204 581 2161
+entryUUID: 5c1b2596-5c91-37a0-98fa-e71ed82423ad
+
+dn: uid=user.567,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlinda Ballou$78693 Railroad Street$Jonesboro, AK 14098
+initials: AGB
+street: 78693 Railroad Street
+mobile: +1 417 301 5236
+mail: user.567@maildomain.net
+employeeNumber: 567
+pager: +1 921 395 7091
+sn: Ballou
+postalCode: 14098
+userPassword: {SSHA}jTfVtbVe3FKFN5NdjkDsEZxm4cIEOhFpOmwjMQ==
+description: This is the description for Arlinda Ballou.
+l: Jonesboro
+cn: Arlinda Ballou
+st: AK
+telephoneNumber: +1 830 792 1413
+givenName: Arlinda
+uid: user.567
+homePhone: +1 874 917 1090
+entryUUID: 6e8475f4-1087-3d50-ad05-bfc85344cb28
+
+dn: uid=user.568,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arline Ballyk$42908 Dogwood Street$Milwaukee, GA 01934
+initials: AQB
+street: 42908 Dogwood Street
+mobile: +1 003 244 7051
+mail: user.568@maildomain.net
+employeeNumber: 568
+pager: +1 450 910 4589
+sn: Ballyk
+postalCode: 01934
+userPassword: {SSHA}7bwtf3moHZfcEpAp+hloKaYegzoKHj/eFSzZxg==
+description: This is the description for Arline Ballyk.
+l: Milwaukee
+cn: Arline Ballyk
+st: GA
+telephoneNumber: +1 130 658 3148
+givenName: Arline
+uid: user.568
+homePhone: +1 032 119 5205
+entryUUID: 2d05da1b-ec71-3906-9813-2da9075961fa
+
+dn: uid=user.569,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arluene Balmer$07791 Sunset Street$Durham, AR 89516
+initials: AZB
+street: 07791 Sunset Street
+mobile: +1 237 286 4848
+mail: user.569@maildomain.net
+employeeNumber: 569
+pager: +1 700 318 9772
+sn: Balmer
+postalCode: 89516
+userPassword: {SSHA}Z2ZfZF7Fo0h5jG30k+N2Ay818m6Q/UjOMgg0SQ==
+description: This is the description for Arluene Balmer.
+l: Durham
+cn: Arluene Balmer
+st: AR
+telephoneNumber: +1 482 611 0265
+givenName: Arluene
+uid: user.569
+homePhone: +1 649 675 6054
+entryUUID: 8503242b-090e-30d9-afa4-14687cb73265
+
+dn: uid=user.570,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arly Balog$61009 Thirteenth Street$Helena, UT 47742
+initials: AWB
+street: 61009 Thirteenth Street
+mobile: +1 141 893 2206
+mail: user.570@maildomain.net
+employeeNumber: 570
+pager: +1 009 538 0028
+sn: Balog
+postalCode: 47742
+userPassword: {SSHA}jadMcQ9/YXQZJuUPzHe5uwHnq9asC7gBhSoN5Q==
+description: This is the description for Arly Balog.
+l: Helena
+cn: Arly Balog
+st: UT
+telephoneNumber: +1 772 730 3018
+givenName: Arly
+uid: user.570
+homePhone: +1 458 867 1081
+entryUUID: d54f9d09-b06d-3edc-9a94-9c9f4a2caad1
+
+dn: uid=user.571,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlyn Balogh$15143 Main Street$Spokane, OR 05311
+initials: AJB
+street: 15143 Main Street
+mobile: +1 230 517 2592
+mail: user.571@maildomain.net
+employeeNumber: 571
+pager: +1 900 624 7493
+sn: Balogh
+postalCode: 05311
+userPassword: {SSHA}onQNpJhqJ2LqzMCA/Oi8UbOTHrT1MXzA2tYdoA==
+description: This is the description for Arlyn Balogh.
+l: Spokane
+cn: Arlyn Balogh
+st: OR
+telephoneNumber: +1 906 630 9098
+givenName: Arlyn
+uid: user.571
+homePhone: +1 167 747 5510
+entryUUID: 8c568daf-781b-3ba7-90d3-ed09f788787a
+
+dn: uid=user.572,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arlyne Balsas$03011 Lake Street$Traverse City, MO 62754
+initials: AWB
+street: 03011 Lake Street
+mobile: +1 892 576 0775
+mail: user.572@maildomain.net
+employeeNumber: 572
+pager: +1 767 750 0207
+sn: Balsas
+postalCode: 62754
+userPassword: {SSHA}u+1ZL35NNQyvhiWBBUI/hod8gvYU6DIEy6/RYA==
+description: This is the description for Arlyne Balsas.
+l: Traverse City
+cn: Arlyne Balsas
+st: MO
+telephoneNumber: +1 327 708 0922
+givenName: Arlyne
+uid: user.572
+homePhone: +1 036 316 8968
+entryUUID: b326ddda-58ff-325c-bd03-c0046f6a01ef
+
+dn: uid=user.573,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Armand Balser$20500 Central Street$Weston, NC 50070
+initials: AOB
+street: 20500 Central Street
+mobile: +1 755 079 0508
+mail: user.573@maildomain.net
+employeeNumber: 573
+pager: +1 951 610 8913
+sn: Balser
+postalCode: 50070
+userPassword: {SSHA}+2mLT08O7AdMSfrUMk/krAEevUwTC02CoOBy2Q==
+description: This is the description for Armand Balser.
+l: Weston
+cn: Armand Balser
+st: NC
+telephoneNumber: +1 459 543 2808
+givenName: Armand
+uid: user.573
+homePhone: +1 931 094 5229
+entryUUID: 999d8857-98f4-3cb6-9276-7d283063ae76
+
+dn: uid=user.574,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Armando Balter$23570 Wilson Street$Yuma, PA 46963
+initials: AVB
+street: 23570 Wilson Street
+mobile: +1 873 207 5008
+mail: user.574@maildomain.net
+employeeNumber: 574
+pager: +1 349 823 0768
+sn: Balter
+postalCode: 46963
+userPassword: {SSHA}AM8HIuLemaoPihNlYXwq8RHqMk54Tolkd/GFPg==
+description: This is the description for Armando Balter.
+l: Yuma
+cn: Armando Balter
+st: PA
+telephoneNumber: +1 939 588 5039
+givenName: Armando
+uid: user.574
+homePhone: +1 913 030 4748
+entryUUID: 2a02276d-1e04-33c7-a5e6-d36cb0f16ce6
+
+dn: uid=user.575,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Armelle Baltodano$50910 Spring Street$Salisbury, NC 96765
+initials: ANB
+street: 50910 Spring Street
+mobile: +1 330 747 7100
+mail: user.575@maildomain.net
+employeeNumber: 575
+pager: +1 468 850 8241
+sn: Baltodano
+postalCode: 96765
+userPassword: {SSHA}mw5A5FOLIzV4fyRCUZH7HCbd4vB4xAOhWk25Xw==
+description: This is the description for Armelle Baltodano.
+l: Salisbury
+cn: Armelle Baltodano
+st: NC
+telephoneNumber: +1 797 753 8914
+givenName: Armelle
+uid: user.575
+homePhone: +1 702 240 8636
+entryUUID: c360f2d6-8df2-3191-a1dc-6e2d38b8e20b
+
+dn: uid=user.576,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Armin Balutis$03892 Miller Street$Mobile, NH 88629
+initials: ARB
+street: 03892 Miller Street
+mobile: +1 749 956 0668
+mail: user.576@maildomain.net
+employeeNumber: 576
+pager: +1 972 642 8353
+sn: Balutis
+postalCode: 88629
+userPassword: {SSHA}hbQ2CXyLEegacEaT7FidoJ50d/fJrzIFMC68Ig==
+description: This is the description for Armin Balutis.
+l: Mobile
+cn: Armin Balutis
+st: NH
+telephoneNumber: +1 096 934 6743
+givenName: Armin
+uid: user.576
+homePhone: +1 965 758 3190
+entryUUID: f24f477d-02b2-3982-9187-ea39d8cae3aa
+
+dn: uid=user.577,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Armine Bambach$65938 Elm Street$Tuscaloosa, DC 56424
+initials: ATB
+street: 65938 Elm Street
+mobile: +1 065 349 2627
+mail: user.577@maildomain.net
+employeeNumber: 577
+pager: +1 517 029 6809
+sn: Bambach
+postalCode: 56424
+userPassword: {SSHA}3wGU34lW1PD2Wb92CEXAb34oTRXRqPbnrshY9Q==
+description: This is the description for Armine Bambach.
+l: Tuscaloosa
+cn: Armine Bambach
+st: DC
+telephoneNumber: +1 025 897 4998
+givenName: Armine
+uid: user.577
+homePhone: +1 631 170 9479
+entryUUID: 25a138da-5e13-3f5e-a465-c815a4a5d3ca
+
+dn: uid=user.578,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arn Bame$70489 Woodland Street$Ottumwa, WI 99893
+initials: ANB
+street: 70489 Woodland Street
+mobile: +1 550 001 7103
+mail: user.578@maildomain.net
+employeeNumber: 578
+pager: +1 593 572 6001
+sn: Bame
+postalCode: 99893
+userPassword: {SSHA}lrdIW0e3RJn6rpWuvFzuMRLz6UFL6blttMID/w==
+description: This is the description for Arn Bame.
+l: Ottumwa
+cn: Arn Bame
+st: WI
+telephoneNumber: +1 241 291 0215
+givenName: Arn
+uid: user.578
+homePhone: +1 093 353 7595
+entryUUID: 645de298-4652-3a69-9467-81c598948e74
+
+dn: uid=user.579,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arne Bamfo$07086 Ridge Street$Greenville, AK 12304
+initials: AWB
+street: 07086 Ridge Street
+mobile: +1 291 196 5191
+mail: user.579@maildomain.net
+employeeNumber: 579
+pager: +1 387 452 9003
+sn: Bamfo
+postalCode: 12304
+userPassword: {SSHA}BvnfmDaQ6yJMGIEn6JcoyIPxQ3mcnCZZtEjPKQ==
+description: This is the description for Arne Bamfo.
+l: Greenville
+cn: Arne Bamfo
+st: AK
+telephoneNumber: +1 599 630 7263
+givenName: Arne
+uid: user.579
+homePhone: +1 867 668 7337
+entryUUID: 8eb36c59-9b33-3346-8ae0-d7ea82860876
+
+dn: uid=user.580,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arnett Banaei$92372 Broadway Street$Jonesboro, AZ 67770
+initials: AKB
+street: 92372 Broadway Street
+mobile: +1 783 770 1070
+mail: user.580@maildomain.net
+employeeNumber: 580
+pager: +1 700 059 0093
+sn: Banaei
+postalCode: 67770
+userPassword: {SSHA}MYqfDhh72bLJUbd3y4f+c8R/w0xnMN1zHAvRAQ==
+description: This is the description for Arnett Banaei.
+l: Jonesboro
+cn: Arnett Banaei
+st: AZ
+telephoneNumber: +1 702 008 9870
+givenName: Arnett
+uid: user.580
+homePhone: +1 043 304 4652
+entryUUID: 37753295-a3e5-390b-8d71-f5a756303e72
+
+dn: uid=user.581,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arnie Bandel$03990 Maple Street$Jackson, RI 01612
+initials: AMB
+street: 03990 Maple Street
+mobile: +1 126 007 4467
+mail: user.581@maildomain.net
+employeeNumber: 581
+pager: +1 955 545 0000
+sn: Bandel
+postalCode: 01612
+userPassword: {SSHA}4A+3zg97BrNoNsLIlF06IGW4fJ4iIA1K2RoZGA==
+description: This is the description for Arnie Bandel.
+l: Jackson
+cn: Arnie Bandel
+st: RI
+telephoneNumber: +1 038 101 0644
+givenName: Arnie
+uid: user.581
+homePhone: +1 227 638 0113
+entryUUID: 0620e5b9-2d9c-3335-a5f2-984a4e19782a
+
+dn: uid=user.582,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arnis Banens$69690 Fourth Street$Alpena, NM 17061
+initials: ALB
+street: 69690 Fourth Street
+mobile: +1 697 431 2650
+mail: user.582@maildomain.net
+employeeNumber: 582
+pager: +1 078 226 7614
+sn: Banens
+postalCode: 17061
+userPassword: {SSHA}gZ4IchnUzAg/YMMV42i17Fk5Zqe/Z6BjZJQr5Q==
+description: This is the description for Arnis Banens.
+l: Alpena
+cn: Arnis Banens
+st: NM
+telephoneNumber: +1 605 740 6927
+givenName: Arnis
+uid: user.582
+homePhone: +1 664 601 7858
+entryUUID: 627d5428-4a42-3b96-aeab-96c13b35942e
+
+dn: uid=user.583,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arno Banerd$07614 Maple Street$Lansing, NY 72008
+initials: AKB
+street: 07614 Maple Street
+mobile: +1 175 100 2195
+mail: user.583@maildomain.net
+employeeNumber: 583
+pager: +1 746 958 0012
+sn: Banerd
+postalCode: 72008
+userPassword: {SSHA}ojpPYLqRPBRCfjGeb6yQppZgdPyk/POBBluS2w==
+description: This is the description for Arno Banerd.
+l: Lansing
+cn: Arno Banerd
+st: NY
+telephoneNumber: +1 090 520 3259
+givenName: Arno
+uid: user.583
+homePhone: +1 372 249 4777
+entryUUID: 5b95df1f-b072-3080-9667-b951408e1dd2
+
+dn: uid=user.584,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arnold Banerjee$64020 Lake Street$Orlando, MO 71003
+initials: AUB
+street: 64020 Lake Street
+mobile: +1 553 735 6030
+mail: user.584@maildomain.net
+employeeNumber: 584
+pager: +1 990 001 1531
+sn: Banerjee
+postalCode: 71003
+userPassword: {SSHA}XaXlLFgnhHZ0SwVTH0pnbF33Qs+DMYdhK2JPqw==
+description: This is the description for Arnold Banerjee.
+l: Orlando
+cn: Arnold Banerjee
+st: MO
+telephoneNumber: +1 669 175 0060
+givenName: Arnold
+uid: user.584
+homePhone: +1 077 204 0689
+entryUUID: c29aa1e0-39bd-3a73-8b0d-8fbe221238d4
+
+dn: uid=user.585,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arsavir Banez$30879 Broadway Street$Harlingen, WA 08952
+initials: AQB
+street: 30879 Broadway Street
+mobile: +1 789 881 5023
+mail: user.585@maildomain.net
+employeeNumber: 585
+pager: +1 325 840 9219
+sn: Banez
+postalCode: 08952
+userPassword: {SSHA}OxdU8bS9hLiMjeMe5NLSoVZTigPUEP63ADlWNA==
+description: This is the description for Arsavir Banez.
+l: Harlingen
+cn: Arsavir Banez
+st: WA
+telephoneNumber: +1 282 990 8173
+givenName: Arsavir
+uid: user.585
+homePhone: +1 965 873 0049
+entryUUID: 623e642f-3bb5-3cac-9790-23c838a07da9
+
+dn: uid=user.586,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arshad Banfalvi$29009 Madison Street$Monroe, NJ 04535
+initials: AMB
+street: 29009 Madison Street
+mobile: +1 823 365 4815
+mail: user.586@maildomain.net
+employeeNumber: 586
+pager: +1 645 519 6174
+sn: Banfalvi
+postalCode: 04535
+userPassword: {SSHA}ZCOIjwYrpicEMqaY9o1TWHywcS0CU62vtkz2Fw==
+description: This is the description for Arshad Banfalvi.
+l: Monroe
+cn: Arshad Banfalvi
+st: NJ
+telephoneNumber: +1 802 408 8615
+givenName: Arshad
+uid: user.586
+homePhone: +1 061 563 0473
+entryUUID: 92c7f543-6f64-3ced-87d6-3c148d8c8777
+
+dn: uid=user.587,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Art Bangert$32870 Madison Street$Denver, NM 70808
+initials: AOB
+street: 32870 Madison Street
+mobile: +1 700 794 3908
+mail: user.587@maildomain.net
+employeeNumber: 587
+pager: +1 012 404 4255
+sn: Bangert
+postalCode: 70808
+userPassword: {SSHA}tAF6YNIlBAgJdssjfbpSJwjhfHaG8ItFEbCCNQ==
+description: This is the description for Art Bangert.
+l: Denver
+cn: Art Bangert
+st: NM
+telephoneNumber: +1 036 488 2928
+givenName: Art
+uid: user.587
+homePhone: +1 286 474 9137
+entryUUID: 07341915-61f0-34d9-b2a9-803a8fc86d00
+
+dn: uid=user.588,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arthur Bangia$81239 Valley Street$Bismarck, GA 07602
+initials: ADB
+street: 81239 Valley Street
+mobile: +1 911 211 5388
+mail: user.588@maildomain.net
+employeeNumber: 588
+pager: +1 113 055 1851
+sn: Bangia
+postalCode: 07602
+userPassword: {SSHA}amR4yMJqvNA7ZqSbA3BSaIxeWP6DPck6OrvK/A==
+description: This is the description for Arthur Bangia.
+l: Bismarck
+cn: Arthur Bangia
+st: GA
+telephoneNumber: +1 060 280 5527
+givenName: Arthur
+uid: user.588
+homePhone: +1 053 910 2137
+entryUUID: d92f4338-1bef-3240-bf32-23280e020696
+
+dn: uid=user.589,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arts Banigan$51711 Valley Street$Terre Haute, OR 01365
+initials: AOB
+street: 51711 Valley Street
+mobile: +1 990 746 9140
+mail: user.589@maildomain.net
+employeeNumber: 589
+pager: +1 860 100 0245
+sn: Banigan
+postalCode: 01365
+userPassword: {SSHA}XecZVq2I1a/a/cyftZvu4tvsoUKnSx516JQNxQ==
+description: This is the description for Arts Banigan.
+l: Terre Haute
+cn: Arts Banigan
+st: OR
+telephoneNumber: +1 294 231 1631
+givenName: Arts
+uid: user.589
+homePhone: +1 992 460 1393
+entryUUID: e7a49eb3-7fea-34cb-8558-c1fb17ad068e
+
+dn: uid=user.590,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arturo Banik$98635 Laurel Street$Fort Myers, SD 01407
+initials: AUB
+street: 98635 Laurel Street
+mobile: +1 316 094 5819
+mail: user.590@maildomain.net
+employeeNumber: 590
+pager: +1 685 088 9006
+sn: Banik
+postalCode: 01407
+userPassword: {SSHA}dmnLeKCyai+Jg++jbGjEcBwhWwhW0I34Wj7Vfw==
+description: This is the description for Arturo Banik.
+l: Fort Myers
+cn: Arturo Banik
+st: SD
+telephoneNumber: +1 243 531 1698
+givenName: Arturo
+uid: user.590
+homePhone: +1 085 860 3859
+entryUUID: 2a2a74ee-a8af-38ad-a4de-c575feddf6cd
+
+dn: uid=user.591,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arun Bankhead$25172 Birch Street$Pittsburgh, MA 82309
+initials: AAB
+street: 25172 Birch Street
+mobile: +1 035 951 1400
+mail: user.591@maildomain.net
+employeeNumber: 591
+pager: +1 314 076 6501
+sn: Bankhead
+postalCode: 82309
+userPassword: {SSHA}R/ThSW5oeNhq7Lfu3NrIPj+hIgVtUIPhvR1CiA==
+description: This is the description for Arun Bankhead.
+l: Pittsburgh
+cn: Arun Bankhead
+st: MA
+telephoneNumber: +1 661 086 4784
+givenName: Arun
+uid: user.591
+homePhone: +1 064 990 3196
+entryUUID: f361a152-fd26-3beb-80bc-0c80ae1baae1
+
+dn: uid=user.592,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aruna Banks$47517 Thirteenth Street$Macon, TN 45028
+initials: ALB
+street: 47517 Thirteenth Street
+mobile: +1 210 800 0081
+mail: user.592@maildomain.net
+employeeNumber: 592
+pager: +1 955 547 5001
+sn: Banks
+postalCode: 45028
+userPassword: {SSHA}PMiqBqd/OHQYns506kSjrDWZgGolqJ0a7s7KXw==
+description: This is the description for Aruna Banks.
+l: Macon
+cn: Aruna Banks
+st: TN
+telephoneNumber: +1 205 469 0690
+givenName: Aruna
+uid: user.592
+homePhone: +1 714 965 1008
+entryUUID: 08860dae-f261-3242-a8d7-c4d5a5e1649f
+
+dn: uid=user.593,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arvin Bannai$40759 Adams Street$Cheyenne, VA 43164
+initials: AWB
+street: 40759 Adams Street
+mobile: +1 366 442 8059
+mail: user.593@maildomain.net
+employeeNumber: 593
+pager: +1 104 690 8149
+sn: Bannai
+postalCode: 43164
+userPassword: {SSHA}rQXv/lRyN/gbvbowSmnUVe4S4cDQfDusuEjMTw==
+description: This is the description for Arvin Bannai.
+l: Cheyenne
+cn: Arvin Bannai
+st: VA
+telephoneNumber: +1 370 660 8570
+givenName: Arvin
+uid: user.593
+homePhone: +1 624 578 8850
+entryUUID: b0117ce5-07a9-3fc2-b26b-7dcad189fc1d
+
+dn: uid=user.594,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arvind Bannan$97345 Park Street$Raleigh, TN 70489
+initials: AEB
+street: 97345 Park Street
+mobile: +1 906 294 0161
+mail: user.594@maildomain.net
+employeeNumber: 594
+pager: +1 872 968 3009
+sn: Bannan
+postalCode: 70489
+userPassword: {SSHA}DZZKEMmPSvA660xM8iSxUEsdWVyPj5NpBbU5bA==
+description: This is the description for Arvind Bannan.
+l: Raleigh
+cn: Arvind Bannan
+st: TN
+telephoneNumber: +1 243 279 6943
+givenName: Arvind
+uid: user.594
+homePhone: +1 650 837 0605
+entryUUID: b35703f9-8365-3075-af0a-7806a7d65a42
+
+dn: uid=user.595,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Aryn Bannard$38406 Adams Street$Lima, VT 15514
+initials: AVB
+street: 38406 Adams Street
+mobile: +1 491 033 1673
+mail: user.595@maildomain.net
+employeeNumber: 595
+pager: +1 968 840 4434
+sn: Bannard
+postalCode: 15514
+userPassword: {SSHA}vjNdaM2snK+50j2tFdBYmHwNkJ04k9Vvk8SplA==
+description: This is the description for Aryn Bannard.
+l: Lima
+cn: Aryn Bannard
+st: VT
+telephoneNumber: +1 429 515 3054
+givenName: Aryn
+uid: user.595
+homePhone: +1 076 500 4012
+entryUUID: 65e8bdfa-ce6d-3abf-a54f-d0cb8340a792
+
+dn: uid=user.596,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Arzu Bannister$15109 River Street$Saint Louis, FL 65027
+initials: AOB
+street: 15109 River Street
+mobile: +1 304 373 4405
+mail: user.596@maildomain.net
+employeeNumber: 596
+pager: +1 188 500 2351
+sn: Bannister
+postalCode: 65027
+userPassword: {SSHA}f/6bzBkJj/7oQ57lJXI/O4P4wUj35MiXLVvvug==
+description: This is the description for Arzu Bannister.
+l: Saint Louis
+cn: Arzu Bannister
+st: FL
+telephoneNumber: +1 392 820 6456
+givenName: Arzu
+uid: user.596
+homePhone: +1 098 207 8058
+entryUUID: 93363f20-9e06-3ef3-9a79-8b77938c1943
+
+dn: uid=user.597,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Asan Bansal$65601 Ash Street$Weston, NM 98429
+initials: AOB
+street: 65601 Ash Street
+mobile: +1 604 016 6693
+mail: user.597@maildomain.net
+employeeNumber: 597
+pager: +1 872 207 0947
+sn: Bansal
+postalCode: 98429
+userPassword: {SSHA}f+NNYeAKBSg2EFqqxiYhvUTRXxF3psgyfT+uYg==
+description: This is the description for Asan Bansal.
+l: Weston
+cn: Asan Bansal
+st: NM
+telephoneNumber: +1 050 210 8421
+givenName: Asan
+uid: user.597
+homePhone: +1 084 002 0092
+entryUUID: be6ef509-7c8f-362b-8256-40735aa3b86d
+
+dn: uid=user.598,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Asghar Banu$70241 Woodland Street$Clarksburg, ID 95423
+initials: AOB
+street: 70241 Woodland Street
+mobile: +1 800 436 9467
+mail: user.598@maildomain.net
+employeeNumber: 598
+pager: +1 580 228 1201
+sn: Banu
+postalCode: 95423
+userPassword: {SSHA}tdpCEZVfFCytAFabW/hNKbshQIaYCbxs8ZHR6A==
+description: This is the description for Asghar Banu.
+l: Clarksburg
+cn: Asghar Banu
+st: ID
+telephoneNumber: +1 299 043 9658
+givenName: Asghar
+uid: user.598
+homePhone: +1 072 505 2003
+entryUUID: b04ea127-bb93-3f52-82c2-fb6b78602abd
+
+dn: uid=user.599,ou=People,dc=com
+objectClass: inetorgperson
+objectClass: person
+objectClass: top
+objectClass: organizationalperson
+postalAddress: Ash Banville$07116 Laurel Street$La Crosse, NE 76518
+initials: AYB
+street: 07116 Laurel Street
+mobile: +1 131 335 9847
+mail: user.599@maildomain.net
+employeeNumber: 599
+pager: +1 052 692 6447
+sn: Banville
+postalCode: 76518
+userPassword: {SSHA}IpeMzmv7ttqCelVWLpGgH9Bn+0b4cE7sQUDDjw==
+description: This is the description for Ash Banville.
+l: La Crosse
+cn: Ash Banville
+st: NE
+telephoneNumber: +1 605 006 5786
+givenName: Ash
+uid: user.599
+homePhone: +1 568 288 9776
+entryUUID: 87916454-7de4-34d0-bcf9-a70376f9234b
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify.ldif
new file mode 100644
index 0000000..97ce1fe
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.110,ou=people,dc=com
+changetype: modify
+replace: sn
+sn: John
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify2.ldif b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify2.ldif
new file mode 100644
index 0000000..798cc56
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/clu_secure/clus_startls_ldapmodify2.ldif
@@ -0,0 +1,4 @@
+dn: uid=user.111,ou=people,dc=com
+changetype: modify
+replace: telephoneNumber
+telephoneNumber: +3312345678
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ldif
new file mode 100644
index 0000000..461b946
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ldif
@@ -0,0 +1,75 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=Bil Bo,ou=People,dc=example,dc=com
+changetype: add
+cn: Bil Bo
+sn: Bo
+givenName: Bil
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bbo
+mail: bbo@example.com
+roomnumber: 5484
+
+
+
+dn: uid=Blam Blo,ou=People,dc=example,dc=com
+changetype: add
+cn: Blam Bo
+sn: Blo
+givenName: Blam
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: blbo
+mail: blbo@example.com
+roomnumber: 5484
+
+
+dn: uid=Blum Blue,ou=People,dc=example,dc=com
+changetype: add
+cn: Blum Blue
+sn: Blue
+givenName: Blum
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: blubu
+mail: blubu@example.com
+roomnumber: 5484
+
+
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ref b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ref
new file mode 100644
index 0000000..177a232
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/add.ref
@@ -0,0 +1,49 @@
+dn: uid=Bil Bo,ou=People,dc=example,dc=com
+ou: Accounting
+ou: People
+sn: Bo
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomnumber: 5484
+l: Santa Clara
+cn: Bil Bo
+uid: bbo
+uid: Bil Bo
+givenName: Bil
+mail: bbo@example.com
+
+
+dn: uid=Blam Blo,ou=People,dc=example,dc=com
+ou: Accounting
+ou: People
+sn: Blo
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomnumber: 5484
+l: Santa Clara
+cn: Blam Bo
+uid: blbo
+uid: Blam Blo
+givenName: Blam
+mail: blbo@example.com
+
+
+dn: uid=Blum Blue,ou=People,dc=example,dc=com
+ou: Accounting
+ou: People
+sn: Blue
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomnumber: 5484
+l: Santa Clara
+cn: Blum Blue
+uid: blubu
+uid: Blum Blue
+givenName: Blum
+mail: blubu@example.com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/delete.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/delete.ldif
new file mode 100644
index 0000000..98d6338
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/delete.ldif
@@ -0,0 +1 @@
+uid=Blum Blue,ou=People,dc=example,dc=com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/moddn.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/moddn.ldif
new file mode 100644
index 0000000..32c24b5
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/moddn.ldif
@@ -0,0 +1,27 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=Bil Bo, ou=People, dc=example,dc=com
+changetype: moddn
+newrdn: uid=BillyBo
+deleteoldrdn: 1
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/modify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/modify.ldif
new file mode 100644
index 0000000..38e1b4d
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/add/modify.ldif
@@ -0,0 +1,27 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=Blam Blo, ou=People, dc=example,dc=com
+changetype: modify
+replace: roomnumber
+roomnumber: 123456
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/default.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/default.ldif
new file mode 100644
index 0000000..59e13cb
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/default.ldif
@@ -0,0 +1,2810 @@
+# 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
+#
+# Copyright 2006-2010 Sun Microsystems, Inc.
+#
+#
+# dc=com sample LDIF file
+#
+# Notes:
+# 161 total entries.
+# 2 (objectclass=domain) entries (dc=example,dc=com).
+# 4 (objectclass=organizationalunit) entries.
+# 5 (objectclass=groupofuniquenames) entries.
+# 150 (objectclass=person) entries (all under ou=people,dc=example,dc=com).
+#
+dn: dc=com
+objectclass: top
+objectclass: domain
+dc: com
+
+dn: dc=example,dc=com
+objectclass: top
+objectclass: domain
+dc: example
+
+dn: ou=Groups, dc=example,dc=com
+objectclass: top
+objectclass: organizationalunit
+ou: Groups
+
+dn: cn=Directory Administrators, ou=Groups, dc=example,dc=com
+cn: Directory Administrators
+objectclass: top
+objectclass: groupofuniquenames
+ou: Groups
+uniquemember: uid=kvaughan, ou=People, dc=example,dc=com
+uniquemember: uid=rdaugherty, ou=People, dc=example,dc=com
+uniquemember: uid=hmiller, ou=People, dc=example,dc=com
+
+dn: ou=People, dc=example,dc=com
+objectclass: top
+objectclass: organizationalunit
+ou: People
+
+dn: ou=Special Users,dc=example,dc=com
+objectclass: top
+objectclass: organizationalUnit
+ou: Special Users
+description: Special Administrative Accounts
+
+dn: uid=scarter, ou=People, dc=example,dc=com
+cn: Sam Carter
+sn: Carter
+givenname: Sam
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: scarter
+mail: scarter@example.com
+telephonenumber: +1 408 555 4798
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 4612
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tmorris, ou=People, dc=example,dc=com
+cn: Ted Morris
+sn: Morris
+givenname: Ted
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: tmorris
+mail: tmorris@example.com
+telephonenumber: +1 408 555 9187
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 4117
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kvaughan, ou=People, dc=example,dc=com
+cn: Kirsten Vaughan
+sn: Vaughan
+givenname: Kirsten
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: kvaughan
+mail: kvaughan@example.com
+telephonenumber: +1 408 555 5625
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 2871
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=abergin, ou=People, dc=example,dc=com
+cn: Andy Bergin
+sn: Bergin
+givenname: Andy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Cupertino
+uid: abergin
+mail: abergin@example.com
+telephonenumber: +1 408 555 8585
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 3472
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dmiller, ou=People, dc=example,dc=com
+cn: David Miller
+sn: Miller
+givenname: David
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: dmiller
+mail: dmiller@example.com
+telephonenumber: +1 408 555 9423
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 4135
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=gfarmer, ou=People, dc=example,dc=com
+cn: Gern Farmer
+sn: Farmer
+givenname: Gern
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: gfarmer
+mail: gfarmer@example.com
+telephonenumber: +1 408 555 6201
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 1269
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kwinters, ou=People, dc=example,dc=com
+cn: Kelly Winters
+sn: Winters
+givenname: Kelly
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: kwinters
+mail: kwinters@example.com
+telephonenumber: +1 408 555 9069
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 4178
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=trigden, ou=People, dc=example,dc=com
+cn: Torrey Rigden
+sn: Rigden
+givenname: Torrey
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: trigden
+mail: trigden@example.com
+telephonenumber: +1 408 555 9280
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 3584
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=cschmith, ou=People, dc=example,dc=com
+cn: Chris Schmith
+sn: Schmith
+givenname: Chris
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: cschmith
+mail: cschmith@example.com
+telephonenumber: +1 408 555 8011
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 0416
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jwallace, ou=People, dc=example,dc=com
+cn: Judy Wallace
+sn: Wallace
+givenname: Judy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: jwallace
+mail: jwallace@example.com
+telephonenumber: +1 408 555 0319
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 1033
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jwalker, ou=People, dc=example,dc=com
+cn: John Walker
+sn: Walker
+givenname: John
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Cupertino
+uid: jwalker
+mail: jwalker@example.com
+telephonenumber: +1 408 555 1476
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 3915
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tclow, ou=People, dc=example,dc=com
+cn: Torrey Clow
+sn: Clow
+givenname: Torrey
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: tclow
+mail: tclow@example.com
+telephonenumber: +1 408 555 8825
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 4376
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rdaugherty, ou=People, dc=example,dc=com
+cn: Robert Daugherty
+sn: Daugherty
+givenname: Robert
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: rdaugherty
+mail: rdaugherty@example.com
+telephonenumber: +1 408 555 1296
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 0194
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jreuter, ou=People, dc=example,dc=com
+cn: Jayne Reuter
+sn: Reuter
+givenname: Jayne
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Cupertino
+uid: jreuter
+mail: jreuter@example.com
+telephonenumber: +1 408 555 1122
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 2942
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tmason, ou=People, dc=example,dc=com
+cn: Torrey Mason
+sn: Mason
+givenname: Torrey
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: tmason
+mail: tmason@example.com
+telephonenumber: +1 408 555 1596
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 1124
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bhall, ou=People, dc=example,dc=com
+cn: Benjamin Hall
+sn: Hall
+givenname: Benjamin
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: bhall
+mail: bhall@example.com
+telephonenumber: +1 408 555 6067
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 2511
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=btalbot, ou=People, dc=example,dc=com
+cn: Brad Talbot
+sn: Talbot
+givenname: Brad
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: btalbot
+mail: btalbot@example.com
+telephonenumber: +1 408 555 4992
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 3532
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mward, ou=People, dc=example,dc=com
+cn: Marcus Ward
+sn: Ward
+givenname: Marcus
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: mward
+mail: mward@example.com
+telephonenumber: +1 408 555 5688
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 1707
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bjablons, ou=People, dc=example,dc=com
+cn: Barbara Jablonski
+sn: Jablonski
+givenname: Barbara
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: bjablons
+mail: bjablons@example.com
+telephonenumber: +1 408 555 8815
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 0906
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jmcFarla, ou=People, dc=example,dc=com
+cn: Judy McFarland
+sn: McFarland
+givenname: Judy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: jmcFarla
+mail: jmcFarla@example.com
+telephonenumber: +1 408 555 2567
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 2359
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=llabonte, ou=People, dc=example,dc=com
+cn: Lee Labonte
+sn: Labonte
+givenname: Lee
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: llabonte
+mail: llabonte@example.com
+telephonenumber: +1 408 555 0957
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 2854
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jcampaig, ou=People, dc=example,dc=com
+cn: Jody Campaigne
+sn: Campaigne
+givenname: Jody
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: jcampaig
+mail: jcampaig@example.com
+telephonenumber: +1 408 555 1660
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 4385
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bhal2, ou=People, dc=example,dc=com
+cn: Barbara Hall
+sn: Hall
+givenname: Barbara
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: bhal2
+mail: bhal2@example.com
+telephonenumber: +1 408 555 4491
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 2758
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=alutz, ou=People, dc=example,dc=com
+cn: Alexander Lutz
+sn: Lutz
+givenname: Alexander
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: alutz
+mail: alutz@example.com
+telephonenumber: +1 408 555 6505
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 1327
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=btalbo2, ou=People, dc=example,dc=com
+cn: Bjorn Talbot
+sn: Talbot
+givenname: Bjorn
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: btalbo2
+mail: btalbo2@example.com
+telephonenumber: +1 408 555 4234
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 1205
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=achassin, ou=People, dc=example,dc=com
+cn: Ashley Chassin
+sn: Chassin
+givenname: Ashley
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: achassin
+mail: achassin@example.com
+telephonenumber: +1 408 555 9972
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 0466
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=hmiller, ou=People, dc=example,dc=com
+cn: Harry Miller
+sn: Miller
+givenname: Harry
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: hmiller
+mail: hmiller@example.com
+telephonenumber: +1 408 555 9804
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 4304
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jcampai2, ou=People, dc=example,dc=com
+cn: Jeffrey Campaigne
+sn: Campaigne
+givenname: Jeffrey
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: jcampai2
+mail: jcampai2@example.com
+telephonenumber: +1 408 555 7393
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 1377
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=lulrich, ou=People, dc=example,dc=com
+cn: Lee Ulrich
+sn: Ulrich
+givenname: Lee
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: lulrich
+mail: lulrich@example.com
+telephonenumber: +1 408 555 8652
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 0985
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mlangdon, ou=People, dc=example,dc=com
+cn: Marcus Langdon
+sn: Langdon
+givenname: Marcus
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: mlangdon
+mail: mlangdon@example.com
+telephonenumber: +1 408 555 6249
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 4471
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=striplet, ou=People, dc=example,dc=com
+cn: Stephen Triplett
+sn: Triplett
+givenname: Stephen
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: striplet
+mail: striplet@example.com
+telephonenumber: +1 408 555 4519
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 3083
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=gtriplet, ou=People, dc=example,dc=com
+cn: Gern Triplett
+sn: Triplett
+givenname: Gern
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: gtriplet
+mail: gtriplet@example.com
+telephonenumber: +1 408 555 2582
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 4023
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jfalena, ou=People, dc=example,dc=com
+cn: John Falena
+sn: Falena
+givenname: John
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: jfalena
+mail: jfalena@example.com
+telephonenumber: +1 408 555 8133
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 1917
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=speterso, ou=People, dc=example,dc=com
+cn: Sue Peterson
+sn: Peterson
+givenname: Sue
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: speterso
+mail: speterso@example.com
+telephonenumber: +1 408 555 3613
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 3073
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ejohnson, ou=People, dc=example,dc=com
+cn: Emanuel Johnson
+sn: Johnson
+givenname: Emanuel
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: ejohnson
+mail: ejohnson@example.com
+telephonenumber: +1 408 555 3287
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 3737
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=prigden, ou=People, dc=example,dc=com
+cn: Peter Rigden
+sn: Rigden
+givenname: Peter
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: prigden
+mail: prigden@example.com
+telephonenumber: +1 408 555 5099
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 1271
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bwalker, ou=People, dc=example,dc=com
+cn: Brad Walker
+sn: Walker
+givenname: Brad
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bwalker
+mail: bwalker@example.com
+telephonenumber: +1 408 555 5476
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 3529
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kjensen, ou=People, dc=example,dc=com
+cn: Kurt Jensen
+sn: Jensen
+givenname: Kurt
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: kjensen
+mail: kjensen@example.com
+telephonenumber: +1 408 555 6127
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 1944
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mlott, ou=People, dc=example,dc=com
+cn: Mike Lott
+sn: Lott
+givenname: Mike
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: mlott
+mail: mlott@example.com
+telephonenumber: +1 408 555 2234
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 0498
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=cwallace, ou=People, dc=example,dc=com
+cn: Cecil Wallace
+sn: Wallace
+givenname: Cecil
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: cwallace
+mail: cwallace@example.com
+telephonenumber: +1 408 555 6438
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 0349
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tpierce, ou=People, dc=example,dc=com
+cn: Tobias Pierce
+sn: Pierce
+givenname: Tobias
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: tpierce
+mail: tpierce@example.com
+telephonenumber: +1 408 555 1531
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 1383
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rbannist, ou=People, dc=example,dc=com
+cn: Richard Bannister
+sn: Bannister
+givenname: Richard
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: rbannist
+mail: rbannist@example.com
+telephonenumber: +1 408 555 1833
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 0983
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bplante, ou=People, dc=example,dc=com
+cn: Brian Plante
+sn: Plante
+givenname: Brian
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: bplante
+mail: bplante@example.com
+telephonenumber: +1 408 555 3550
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 4654
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rmills, ou=People, dc=example,dc=com
+cn: Randy Mills
+sn: Mills
+givenname: Randy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: rmills
+mail: rmills@example.com
+telephonenumber: +1 408 555 2072
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 3823
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bschneid, ou=People, dc=example,dc=com
+cn: Benjamin Schneider
+sn: Schneider
+givenname: Benjamin
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: bschneid
+mail: bschneid@example.com
+telephonenumber: +1 408 555 1012
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 4471
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=skellehe, ou=People, dc=example,dc=com
+cn: Sue Kelleher
+sn: Kelleher
+givenname: Sue
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: skellehe
+mail: skellehe@example.com
+telephonenumber: +1 408 555 3480
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 1608
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=brentz, ou=People, dc=example,dc=com
+cn: Bertram Rentz
+sn: Rentz
+givenname: Bertram
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: brentz
+mail: brentz@example.com
+telephonenumber: +1 408 555 5526
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 0617
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dsmith, ou=People, dc=example,dc=com
+cn: Daniel Smith
+sn: Smith
+givenname: Daniel
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: dsmith
+mail: dsmith@example.com
+telephonenumber: +1 408 555 9519
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 0368
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=scarte2, ou=People, dc=example,dc=com
+cn: Stephen Carter
+sn: Carter
+givenname: Stephen
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: scarte2
+mail: scarte2@example.com
+telephonenumber: +1 408 555 6022
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 2013
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dthorud, ou=People, dc=example,dc=com
+cn: David Thorud
+sn: Thorud
+givenname: David
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: dthorud
+mail: dthorud@example.com
+telephonenumber: +1 408 555 6185
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 1128
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ekohler, ou=People, dc=example,dc=com
+cn: Elba Kohler
+sn: Kohler
+givenname: Elba
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: ekohler
+mail: ekohler@example.com
+telephonenumber: +1 408 555 1926
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 2721
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=lcampbel, ou=People, dc=example,dc=com
+cn: Laurel Campbell
+sn: Campbell
+givenname: Laurel
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: lcampbel
+mail: lcampbel@example.com
+telephonenumber: +1 408 555 2537
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 2073
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tlabonte, ou=People, dc=example,dc=com
+cn: Tim Labonte
+sn: Labonte
+givenname: Tim
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: tlabonte
+mail: tlabonte@example.com
+telephonenumber: +1 408 555 0058
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 1426
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=slee, ou=People, dc=example,dc=com
+cn: Scott Lee
+sn: Lee
+givenname: Scott
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: slee
+mail: slee@example.com
+telephonenumber: +1 408 555 2335
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 1806
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bfree, ou=People, dc=example,dc=com
+cn: Bjorn Free
+sn: Free
+givenname: Bjorn
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: bfree
+mail: bfree@example.com
+telephonenumber: +1 408 555 8588
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 3307
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tschneid, ou=People, dc=example,dc=com
+cn: Torrey Schneider
+sn: Schneider
+givenname: Torrey
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: tschneid
+mail: tschneid@example.com
+telephonenumber: +1 408 555 7086
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 2292
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=prose, ou=People, dc=example,dc=com
+cn: Paula Rose
+sn: Rose
+givenname: Paula
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: prose
+mail: prose@example.com
+telephonenumber: +1 408 555 9998
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 0542
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jhunter, ou=People, dc=example,dc=com
+cn: Janet Hunter
+sn: Hunter
+givenname: Janet
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: jhunter
+mail: jhunter@example.com
+telephonenumber: +1 408 555 7665
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 4856
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ashelton, ou=People, dc=example,dc=com
+cn: Alexander Shelton
+sn: Shelton
+givenname: Alexander
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: ashelton
+mail: ashelton@example.com
+telephonenumber: +1 408 555 1081
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 1987
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mmcinnis, ou=People, dc=example,dc=com
+cn: Marcus Mcinnis
+sn: Mcinnis
+givenname: Marcus
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: mmcinnis
+mail: mmcinnis@example.com
+telephonenumber: +1 408 555 9655
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 4818
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=falbers, ou=People, dc=example,dc=com
+cn: Frank Albers
+sn: Albers
+givenname: Frank
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: falbers
+mail: falbers@example.com
+telephonenumber: +1 408 555 3094
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 1439
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mschneid, ou=People, dc=example,dc=com
+cn: Martin Schneider
+sn: Schneider
+givenname: Martin
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: mschneid
+mail: mschneid@example.com
+telephonenumber: +1 408 555 5017
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 3153
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=pcruse, ou=People, dc=example,dc=com
+cn: Patricia Cruse
+sn: Cruse
+givenname: Patricia
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: pcruse
+mail: pcruse@example.com
+telephonenumber: +1 408 555 8641
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 3967
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tkelly, ou=People, dc=example,dc=com
+cn: Timothy Kelly
+sn: Kelly
+givenname: Timothy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+l: Santa Clara
+uid: tkelly
+mail: tkelly@example.com
+telephonenumber: +1 408 555 4295
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 3107
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ahel, ou=People, dc=example,dc=com
+cn: Andrew Hel
+sn: Hel
+givenname: Andrew
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: ahel
+mail: ahel@example.com
+telephonenumber: +1 408 555 2666
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 0572
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jburrell, ou=People, dc=example,dc=com
+cn: James Burrell
+sn: Burrell
+givenname: James
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: jburrell
+mail: jburrell@example.com
+telephonenumber: +1 408 555 0751
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 4926
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=smason, ou=People, dc=example,dc=com
+cn: Sue Mason
+sn: Mason
+givenname: Sue
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: smason
+mail: smason@example.com
+telephonenumber: +1 408 555 9780
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 4971
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ptyler, ou=People, dc=example,dc=com
+cn: Pete Tyler
+sn: Tyler
+givenname: Pete
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: ptyler
+mail: ptyler@example.com
+telephonenumber: +1 408 555 3335
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 0327
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=calexand, ou=People, dc=example,dc=com
+cn: Chris Alexander
+sn: Alexander
+givenname: Chris
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Sunnyvale
+uid: calexand
+mail: calexand@example.com
+telephonenumber: +1 408 555 9438
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 2884
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jcruse, ou=People, dc=example,dc=com
+cn: Jim Cruse
+sn: Cruse
+givenname: Jim
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: jcruse
+mail: jcruse@example.com
+telephonenumber: +1 408 555 9482
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 0083
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kcarter, ou=People, dc=example,dc=com
+cn: Karen Carter
+sn: Carter
+givenname: Karen
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: kcarter
+mail: kcarter@example.com
+telephonenumber: +1 408 555 4675
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 2320
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rfish, ou=People, dc=example,dc=com
+cn: Randy Fish
+sn: Fish
+givenname: Randy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: rfish
+mail: rfish@example.com
+telephonenumber: +1 408 555 9865
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 2317
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=phunt, ou=People, dc=example,dc=com
+cn: Philip Hunt
+sn: Hunt
+givenname: Philip
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: phunt
+mail: phunt@example.com
+telephonenumber: +1 408 555 1242
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 1183
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rschneid, ou=People, dc=example,dc=com
+cn: Rachel Schneider
+sn: Schneider
+givenname: Rachel
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: rschneid
+mail: rschneid@example.com
+telephonenumber: +1 408 555 9908
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 4183
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bjensen, ou=People, dc=example,dc=com
+cn: Barbara Jensen
+cn: Babs Jensen
+sn: Jensen
+givenname: Barbara
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: bjensen
+mail: bjensen@example.com
+telephonenumber: +1 408 555 1862
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 0209
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jlange, ou=People, dc=example,dc=com
+cn: Jim Lange
+sn: Lange
+givenname: Jim
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: jlange
+mail: jlange@example.com
+telephonenumber: +1 408 555 0488
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 3798
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rulrich, ou=People, dc=example,dc=com
+cn: Randy Ulrich
+sn: Ulrich
+givenname: Randy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: rulrich
+mail: rulrich@example.com
+telephonenumber: +1 408 555 5311
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 1282
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rfrancis, ou=People, dc=example,dc=com
+cn: Richard Francis
+sn: Francis
+givenname: Richard
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: rfrancis
+mail: rfrancis@example.com
+telephonenumber: +1 408 555 8157
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 3482
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mwhite, ou=People, dc=example,dc=com
+cn: Morgan White
+sn: White
+givenname: Morgan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: mwhite
+mail: mwhite@example.com
+telephonenumber: +1 408 555 9620
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 3088
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=gjensen, ou=People, dc=example,dc=com
+cn: Gern Jensen
+sn: Jensen
+givenname: Gern
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: gjensen
+mail: gjensen@example.com
+telephonenumber: +1 408 555 3299
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 4609
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=awhite, ou=People, dc=example,dc=com
+cn: Alan White
+sn: White
+givenname: Alan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: awhite
+mail: awhite@example.com
+telephonenumber: +1 408 555 3232
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 0142
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bmaddox, ou=People, dc=example,dc=com
+cn: Barbara Maddox
+sn: Maddox
+givenname: Barbara
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bmaddox
+mail: bmaddox@example.com
+telephonenumber: +1 408 555 7783
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 2207
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mtalbot, ou=People, dc=example,dc=com
+cn: Martin Talbot
+sn: Talbot
+givenname: Martin
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: mtalbot
+mail: mtalbot@example.com
+telephonenumber: +1 408 555 9228
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 1415
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jbrown, ou=People, dc=example,dc=com
+cn: Judy Brown
+sn: Brown
+givenname: Judy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: jbrown
+mail: jbrown@example.com
+telephonenumber: +1 408 555 6885
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 4224
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jjensen, ou=People, dc=example,dc=com
+cn: Jody Jensen
+sn: Jensen
+givenname: Jody
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: jjensen
+mail: jjensen@example.com
+telephonenumber: +1 408 555 7587
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 4882
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mcarter, ou=People, dc=example,dc=com
+cn: Mike Carter
+sn: Carter
+givenname: Mike
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: mcarter
+mail: mcarter@example.com
+telephonenumber: +1 408 555 1846
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 3819
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dakers, ou=People, dc=example,dc=com
+cn: David Akers
+sn: Akers
+givenname: David
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: dakers
+mail: dakers@example.com
+telephonenumber: +1 408 555 4812
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 4944
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=sfarmer, ou=People, dc=example,dc=com
+cn: Scott Farmer
+sn: Farmer
+givenname: Scott
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: sfarmer
+mail: sfarmer@example.com
+telephonenumber: +1 408 555 4228
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 0019
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dward, ou=People, dc=example,dc=com
+cn: Daniel Ward
+sn: Ward
+givenname: Daniel
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: dward
+mail: dward@example.com
+telephonenumber: +1 408 555 5322
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 3927
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tward, ou=People, dc=example,dc=com
+cn: Tobias Ward
+sn: Ward
+givenname: Tobias
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: tward
+mail: tward@example.com
+telephonenumber: +1 408 555 7202
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 2238
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=pshelton, ou=People, dc=example,dc=com
+cn: Patricia Shelton
+sn: Shelton
+givenname: Patricia
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Cupertino
+uid: pshelton
+mail: pshelton@example.com
+telephonenumber: +1 408 555 6442
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 2918
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jrentz, ou=People, dc=example,dc=com
+cn: Jody Rentz
+sn: Rentz
+givenname: Jody
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: jrentz
+mail: jrentz@example.com
+telephonenumber: +1 408 555 5829
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 3025
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=plorig, ou=People, dc=example,dc=com
+cn: Peter Lorig
+sn: Lorig
+givenname: Peter
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: plorig
+mail: plorig@example.com
+telephonenumber: +1 408 555 0624
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 1276
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ajensen, ou=People, dc=example,dc=com
+cn: Allison Jensen
+sn: Jensen
+givenname: Allison
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: ajensen
+mail: ajensen@example.com
+telephonenumber: +1 408 555 7892
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 0784
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kschmith, ou=People, dc=example,dc=com
+cn: Kelly Schmith
+sn: Schmith
+givenname: Kelly
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: kschmith
+mail: kschmith@example.com
+telephonenumber: +1 408 555 9749
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 2221
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=pworrell, ou=People, dc=example,dc=com
+cn: Pete Worrell
+sn: Worrell
+givenname: Pete
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: pworrell
+mail: pworrell@example.com
+telephonenumber: +1 408 555 1637
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 2449
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mreuter, ou=People, dc=example,dc=com
+cn: Matthew Reuter
+sn: Reuter
+givenname: Matthew
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: mreuter
+mail: mreuter@example.com
+telephonenumber: +1 408 555 6879
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 1356
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=gtyler, ou=People, dc=example,dc=com
+cn: Gern Tyler
+sn: Tyler
+givenname: Gern
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: gtyler
+mail: gtyler@example.com
+telephonenumber: +1 408 555 1020
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 0312
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tschmith, ou=People, dc=example,dc=com
+cn: Tobias Schmith
+sn: Schmith
+givenname: Tobias
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: tschmith
+mail: tschmith@example.com
+telephonenumber: +1 408 555 9626
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 4607
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bjense2, ou=People, dc=example,dc=com
+cn: Bjorn Jensen
+sn: Jensen
+givenname: Bjorn
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bjense2
+mail: bjense2@example.com
+telephonenumber: +1 408 555 5655
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 4294
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dswain, ou=People, dc=example,dc=com
+cn: Dietrich Swain
+sn: Swain
+givenname: Dietrich
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Sunnyvale
+uid: dswain
+mail: dswain@example.com
+telephonenumber: +1 408 555 9222
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 4396
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ahall, ou=People, dc=example,dc=com
+cn: Andy Hall
+sn: Hall
+givenname: Andy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: ahall
+mail: ahall@example.com
+telephonenumber: +1 408 555 6169
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 3050
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jmuffly, ou=People, dc=example,dc=com
+cn: Jeff Muffly
+sn: Muffly
+givenname: Jeff
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: jmuffly
+mail: jmuffly@example.com
+telephonenumber: +1 408 555 5287
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 0997
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tjensen, ou=People, dc=example,dc=com
+cn: Ted Jensen
+sn: Jensen
+givenname: Ted
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: tjensen
+mail: tjensen@example.com
+telephonenumber: +1 408 555 8622
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 4717
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ahunter, ou=People, dc=example,dc=com
+cn: Allison Hunter
+sn: Hunter
+givenname: Allison
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Sunnyvale
+uid: ahunter
+mail: ahunter@example.com
+telephonenumber: +1 408 555 7713
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 1213
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jgoldste, ou=People, dc=example,dc=com
+cn: Jon Goldstein
+sn: Goldstein
+givenname: Jon
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: jgoldste
+mail: jgoldste@example.com
+telephonenumber: +1 408 555 5769
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 1454
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=aworrell, ou=People, dc=example,dc=com
+cn: Alan Worrell
+sn: Worrell
+givenname: Alan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: aworrell
+mail: aworrell@example.com
+telephonenumber: +1 408 555 1591
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 3966
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=wlutz, ou=People, dc=example,dc=com
+cn: Wendy Lutz
+sn: Lutz
+givenname: Wendy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: wlutz
+mail: wlutz@example.com
+telephonenumber: +1 408 555 3358
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 4912
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jlutz, ou=People, dc=example,dc=com
+cn: Janet Lutz
+sn: Lutz
+givenname: Janet
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: jlutz
+mail: jlutz@example.com
+telephonenumber: +1 408 555 4902
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 2544
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dlangdon, ou=People, dc=example,dc=com
+cn: Dan Langdon
+sn: Langdon
+givenname: Dan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: dlangdon
+mail: dlangdon@example.com
+telephonenumber: +1 408 555 7044
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 3263
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=aknutson, ou=People, dc=example,dc=com
+cn: Ashley Knutson
+sn: Knutson
+givenname: Ashley
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: aknutson
+mail: aknutson@example.com
+telephonenumber: +1 408 555 2169
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 4736
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kmcinnis, ou=People, dc=example,dc=com
+cn: Kelly Mcinnis
+sn: Mcinnis
+givenname: Kelly
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: kmcinnis
+mail: kmcinnis@example.com
+telephonenumber: +1 408 555 8596
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 4312
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tcouzens, ou=People, dc=example,dc=com
+cn: Trent Couzens
+sn: Couzens
+givenname: Trent
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Sunnyvale
+uid: tcouzens
+mail: tcouzens@example.com
+telephonenumber: +1 408 555 8401
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 3994
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=lstockto, ou=People, dc=example,dc=com
+cn: Lee Stockton
+sn: Stockton
+givenname: Lee
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: lstockto
+mail: lstockto@example.com
+telephonenumber: +1 408 555 0518
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 0169
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jbourke, ou=People, dc=example,dc=com
+cn: Jon Bourke
+sn: Bourke
+givenname: Jon
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Cupertino
+uid: jbourke
+mail: jbourke@example.com
+telephonenumber: +1 408 555 8541
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 0034
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dlanoway, ou=People, dc=example,dc=com
+cn: Dan Lanoway
+sn: Lanoway
+givenname: Dan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: dlanoway
+mail: dlanoway@example.com
+telephonenumber: +1 408 555 2017
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 3540
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=kcope, ou=People, dc=example,dc=com
+cn: Karl Cope
+sn: Cope
+givenname: Karl
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: kcope
+mail: kcope@example.com
+telephonenumber: +1 408 555 2709
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 3040
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=abarnes, ou=People, dc=example,dc=com
+cn: Anne-Louise Barnes
+sn: Barnes
+givenname: Anne-Louise
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: abarnes
+mail: abarnes@example.com
+telephonenumber: +1 408 555 9445
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 2290
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rjensen, ou=People, dc=example,dc=com
+cn: Richard Jensen
+sn: Jensen
+givenname: Richard
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: rjensen
+mail: rjensen@example.com
+telephonenumber: +1 408 555 5957
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 2631
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=phun2, ou=People, dc=example,dc=com
+cn: Pete Hunt
+sn: Hunt
+givenname: Pete
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: phun2
+mail: phun2@example.com
+telephonenumber: +1 408 555 0342
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 0087
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mvaughan, ou=People, dc=example,dc=com
+cn: Matthew Vaughan
+sn: Vaughan
+givenname: Matthew
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: mvaughan
+mail: mvaughan@example.com
+telephonenumber: +1 408 555 4692
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 4508
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jlut2, ou=People, dc=example,dc=com
+cn: James Lutz
+sn: Lutz
+givenname: James
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: jlut2
+mail: jlut2@example.com
+telephonenumber: +1 408 555 9689
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 3541
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mjablons, ou=People, dc=example,dc=com
+cn: Morgan Jablonski
+sn: Jablonski
+givenname: Morgan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: mjablons
+mail: mjablons@example.com
+telephonenumber: +1 408 555 0813
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 3160
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=pchassin, ou=People, dc=example,dc=com
+cn: Peter Chassin
+sn: Chassin
+givenname: Peter
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: pchassin
+mail: pchassin@example.com
+telephonenumber: +1 408 555 2816
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 4524
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=dcope, ou=People, dc=example,dc=com
+cn: Dan Cope
+sn: Cope
+givenname: Dan
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Sunnyvale
+uid: dcope
+mail: dcope@example.com
+telephonenumber: +1 408 555 9813
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 1737
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jrent2, ou=People, dc=example,dc=com
+cn: Judy Rentz
+sn: Rentz
+givenname: Judy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Santa Clara
+uid: jrent2
+mail: jrent2@example.com
+telephonenumber: +1 408 555 2523
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 4405
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tcruse, ou=People, dc=example,dc=com
+cn: Tobias Cruse
+sn: Cruse
+givenname: Tobias
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: tcruse
+mail: tcruse@example.com
+telephonenumber: +1 408 555 5980
+facsimiletelephonenumber: +1 408 555 4774
+roomnumber: 4191
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=eward, ou=People, dc=example,dc=com
+cn: Eric Ward
+sn: Ward
+givenname: Eric
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: eward
+mail: eward@example.com
+telephonenumber: +1 408 555 2320
+facsimiletelephonenumber: +1 408 555 7472
+roomnumber: 4874
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ttully, ou=People, dc=example,dc=com
+cn: Torrey Tully
+sn: Tully
+givenname: Torrey
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: ttully
+mail: ttully@example.com
+telephonenumber: +1 408 555 2274
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 3924
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=charvey, ou=People, dc=example,dc=com
+cn: Cecil Harvey
+sn: Harvey
+givenname: Cecil
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: charvey
+mail: charvey@example.com
+telephonenumber: +1 408 555 1815
+facsimiletelephonenumber: +1 408 555 3825
+roomnumber: 4583
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rfisher, ou=People, dc=example,dc=com
+cn: Randy Fisher
+sn: Fisher
+givenname: Randy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: rfisher
+mail: rfisher@example.com
+telephonenumber: +1 408 555 1506
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 1579
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=alangdon, ou=People, dc=example,dc=com
+cn: Andrew Langdon
+sn: Langdon
+givenname: Andrew
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: alangdon
+mail: alangdon@example.com
+telephonenumber: +1 408 555 8289
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 2254
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=drose, ou=People, dc=example,dc=com
+cn: David Rose
+sn: Rose
+givenname: David
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: drose
+mail: drose@example.com
+telephonenumber: +1 408 555 3963
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 4012
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=polfield, ou=People, dc=example,dc=com
+cn: Peter Olfield
+sn: Olfield
+givenname: Peter
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: polfield
+mail: polfield@example.com
+telephonenumber: +1 408 555 8231
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 1376
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=awalker, ou=People, dc=example,dc=com
+cn: Andy Walker
+sn: Walker
+givenname: Andy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Cupertino
+uid: awalker
+mail: awalker@example.com
+telephonenumber: +1 408 555 9199
+facsimiletelephonenumber: +1 408 555 3372
+roomnumber: 0061
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=lrentz, ou=People, dc=example,dc=com
+cn: Lex Rentz
+sn: Rentz
+givenname: Lex
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: lrentz
+mail: lrentz@example.com
+telephonenumber: +1 408 555 2019
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 2203
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jvaughan, ou=People, dc=example,dc=com
+cn: Jeff Vaughan
+sn: Vaughan
+givenname: Jeff
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: jvaughan
+mail: jvaughan@example.com
+telephonenumber: +1 408 555 4543
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 1734
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bfrancis, ou=People, dc=example,dc=com
+cn: Barbara Francis
+sn: Francis
+givenname: Barbara
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Santa Clara
+uid: bfrancis
+mail: bfrancis@example.com
+telephonenumber: +1 408 555 9111
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 3743
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ewalker, ou=People, dc=example,dc=com
+cn: Eric Walker
+sn: Walker
+givenname: Eric
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Payroll
+ou: People
+l: Cupertino
+uid: ewalker
+mail: ewalker@example.com
+telephonenumber: +1 408 555 6387
+facsimiletelephonenumber: +1 408 555 8721
+roomnumber: 2295
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=tjames, ou=People, dc=example,dc=com
+cn: Tobias James
+sn: James
+givenname: Tobias
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: tjames
+mail: tjames@example.com
+telephonenumber: +1 408 555 2458
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 0730
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=brigden, ou=People, dc=example,dc=com
+cn: Bjorn Rigden
+sn: Rigden
+givenname: Bjorn
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Sunnyvale
+uid: brigden
+mail: brigden@example.com
+telephonenumber: +1 408 555 5263
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 1643
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ecruse, ou=People, dc=example,dc=com
+cn: Eric Cruse
+sn: Cruse
+givenname: Eric
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: ecruse
+mail: ecruse@example.com
+telephonenumber: +1 408 555 0648
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 4233
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rjense2, ou=People, dc=example,dc=com
+cn: Randy Jensen
+sn: Jensen
+givenname: Randy
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Sunnyvale
+uid: rjense2
+mail: rjense2@example.com
+telephonenumber: +1 408 555 9045
+facsimiletelephonenumber: +1 408 555 1992
+roomnumber: 1984
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=rhunt, ou=People, dc=example,dc=com
+cn: Richard Hunt
+sn: Hunt
+givenname: Richard
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: rhunt
+mail: rhunt@example.com
+telephonenumber: +1 408 555 0139
+facsimiletelephonenumber: +1 408 555 8473
+roomnumber: 0718
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=bparker, ou=People, dc=example,dc=com
+cn: Barry Parker
+sn: Parker
+givenname: Barry
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Sunnyvale
+uid: bparker
+mail: bparker@example.com
+telephonenumber: +1 408 555 4647
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 1148
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=ealexand, ou=People, dc=example,dc=com
+cn: Erin Alexander
+sn: Alexander
+givenname: Erin
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: ealexand
+mail: ealexand@example.com
+telephonenumber: +1 408 555 5563
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 2434
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=mtyler, ou=People, dc=example,dc=com
+cn: Matthew Tyler
+sn: Tyler
+givenname: Matthew
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Human Resources
+ou: People
+l: Cupertino
+uid: mtyler
+mail: mtyler@example.com
+telephonenumber: +1 408 555 7907
+facsimiletelephonenumber: +1 408 555 4661
+roomnumber: 2701
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=elott, ou=People, dc=example,dc=com
+cn: Emanuel Lott
+sn: Lott
+givenname: Emanuel
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Testing
+ou: People
+l: Santa Clara
+uid: elott
+mail: elott@example.com
+telephonenumber: +1 408 555 0932
+facsimiletelephonenumber: +1 408 555 9751
+roomnumber: 3906
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=cnewport, ou=People, dc=example,dc=com
+cn: Christoph Newport
+sn: Newport
+givenname: Christoph
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Sunnyvale
+uid: cnewport
+mail: cnewport@example.com
+telephonenumber: +1 408 555 0066
+facsimiletelephonenumber: +1 408 555 9332
+roomnumber: 0056
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: uid=jvedder, ou=People, dc=example,dc=com
+cn: Jeff Vedder
+sn: Vedder
+givenname: Jeff
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+ou: Product Development
+ou: People
+l: Santa Clara
+uid: jvedder
+mail: jvedder@example.com
+telephonenumber: +1 408 555 4668
+facsimiletelephonenumber: +1 408 555 0111
+roomnumber: 3445
+userpassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+
+dn: cn=Accounting Managers,ou=groups,dc=example,dc=com
+objectclass: top
+objectclass: groupOfUniqueNames
+cn: Accounting Managers
+ou: groups
+uniquemember: uid=scarter, ou=People, dc=example,dc=com
+uniquemember: uid=tmorris, ou=People, dc=example,dc=com
+description: People who can manage accounting entries
+
+dn: cn=HR Managers,ou=groups,dc=example,dc=com
+objectclass: top
+objectclass: groupOfUniqueNames
+cn: HR Managers
+ou: groups
+uniquemember: uid=kvaughan, ou=People, dc=example,dc=com
+uniquemember: uid=cschmith, ou=People, dc=example,dc=com
+description: People who can manage HR entries
+
+dn: cn=QA Managers,ou=groups,dc=example,dc=com
+objectclass: top
+objectclass: groupOfUniqueNames
+cn: QA Managers
+ou: groups
+uniquemember: uid=abergin, ou=People, dc=example,dc=com
+uniquemember: uid=jwalker, ou=People, dc=example,dc=com
+description: People who can manage QA entries
+
+dn: cn=PD Managers,ou=groups,dc=example,dc=com
+objectclass: top
+objectclass: groupOfUniqueNames
+cn: PD Managers
+ou: groups
+uniquemember: uid=kwinters, ou=People, dc=example,dc=com
+uniquemember: uid=trigden, ou=People, dc=example,dc=com
+description: People who can manage engineer entries
+
+dn: ou=Company Servers,dc=example,dc=com
+objectclass: top
+objectclass: organizationalUnit
+ou: Company Servers
+description: Standard branch for Company Server registration
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/add.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/add.ldif
new file mode 100644
index 0000000..d8bf40e
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/add.ldif
@@ -0,0 +1,40 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=Bada Boum,ou=People,dc=example,dc=com
+changetype: add
+cn: Bada Boum
+sn: Boum
+givenName: Bada
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bboum
+mail: bboum@example.com
+roomnumber: 5484
+userpassword: donuts
+
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ldif
new file mode 100644
index 0000000..3289a9c
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ldif
@@ -0,0 +1,4 @@
+uid=tmorris,ou=People,dc=example,dc=com
+uid=abergin,ou=People,dc=example,dc=com
+uid=jwalker,ou=People,dc=example,dc=com
+uid=tclow,ou=People,dc=example,dc=com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ref b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ref
new file mode 100644
index 0000000..ca38d68
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/delete.ref
@@ -0,0 +1,76 @@
+
+
+dn: uid=tmorris,ou=People,dc=example,dc=com
+ou: Accounting
+ou: People
+sn: Morris
+facsimileTelephoneNumber: +1 408 555 8473
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 4117
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Santa Clara
+cn: Ted Morris
+telephoneNumber: +1 408 555 9187
+givenName: Ted
+uid: tmorris
+mail: tmorris@example.com
+
+
+dn: uid=abergin,ou=People,dc=example,dc=com
+ou: Product Testing
+ou: People
+sn: Bergin
+facsimileTelephoneNumber: +1 408 555 7472
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 3472
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Cupertino
+cn: Andy Bergin
+telephoneNumber: +1 408 555 8585
+givenName: Andy
+uid: abergin
+mail: abergin@example.com
+
+
+dn: uid=jwalker,ou=People,dc=example,dc=com
+ou: Product Testing
+ou: People
+sn: Walker
+facsimileTelephoneNumber: +1 408 555 1992
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 3915
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Cupertino
+cn: John Walker
+telephoneNumber: +1 408 555 1476
+givenName: John
+uid: jwalker
+mail: jwalker@example.com
+
+
+dn: uid=tclow,ou=People,dc=example,dc=com
+ou: Human Resources
+ou: People
+sn: Clow
+facsimileTelephoneNumber: +1 408 555 1992
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 4376
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Santa Clara
+cn: Torrey Clow
+telephoneNumber: +1 408 555 8825
+givenName: Torrey
+uid: tclow
+mail: tclow@example.com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/moddn.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/moddn.ldif
new file mode 100644
index 0000000..9896208
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/moddn.ldif
@@ -0,0 +1,26 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=elott, ou=People, dc=example,dc=com
+changetype: moddn
+newrdn: uid=elotte
+deleteoldrdn: 1
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/modify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/modify.ldif
new file mode 100644
index 0000000..12dd3e4
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/delete/modify.ldif
@@ -0,0 +1,27 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=rschneid, ou=People, dc=example,dc=com
+changetype: modify
+replace: roomnumber
+roomnumber: 70000
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/add.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/add.ldif
new file mode 100644
index 0000000..6b877d0
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/add.ldif
@@ -0,0 +1,40 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=Bobo Baba,ou=People,dc=example,dc=com
+changetype: add
+cn: Bobo Baba
+sn: Baba
+givenName: Bobo
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bbaba
+mail: bbaba@example.com
+roomnumber: 5484
+userpassword: donuts
+
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/delete.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/delete.ldif
new file mode 100644
index 0000000..52c89de
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/delete.ldif
@@ -0,0 +1 @@
+uid=Bobo Baba,ou=People,dc=example,dc=com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ldif
new file mode 100644
index 0000000..2660ec6
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ldif
@@ -0,0 +1,36 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=mreuter, ou=People, dc=example,dc=com
+changetype: moddn
+newrdn: uid=reuters
+deleteoldrdn: 1
+
+dn: uid=jgoldste, ou=People, dc=example,dc=com
+changetype: moddn
+newrdn: uid=jgoldistec
+deleteoldrdn: 1
+
+dn: uid=dlanoway, ou=People, dc=example,dc=com
+changetype: moddn
+newrdn: uid=noway
+deleteoldrdn: 1
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ref b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ref
new file mode 100644
index 0000000..022f77d
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/moddn.ref
@@ -0,0 +1,55 @@
+dn: uid=reuters,ou=People,dc=example,dc=com
+ou: Human Resources
+ou: People
+sn: Reuter
+facsimileTelephoneNumber: +1 408 555 3825
+objectClass: person
+objectClass: inetOrgPerson
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 1356
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Sunnyvale
+cn: Matthew Reuter
+telephoneNumber: +1 408 555 6879
+givenName: Matthew
+uid: reuters
+mail: mreuter@example.com
+
+
+dn: uid=jgoldistec,ou=People,dc=example,dc=com
+ou: Human Resources
+ou: People
+sn: Goldstein
+facsimileTelephoneNumber: +1 408 555 7472
+objectClass: person
+objectClass: inetOrgPerson
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 1454
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Santa Clara
+cn: Jon Goldstein
+telephoneNumber: +1 408 555 5769
+givenName: Jon
+uid: jgoldistec
+mail: jgoldste@example.com
+
+
+dn: uid=noway,ou=People,dc=example,dc=com
+ou: Accounting
+ou: People
+sn: Lanoway
+facsimileTelephoneNumber: +1 408 555 8473
+objectClass: person
+objectClass: inetOrgPerson
+objectClass: top
+objectClass: organizationalPerson
+roomNumber: 3540
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Santa Clara
+cn: Dan Lanoway
+telephoneNumber: +1 408 555 2017
+givenName: Dan
+uid: noway
+mail: dlanoway@example.com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/modify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/modify.ldif
new file mode 100644
index 0000000..0271c31
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/moddn/modify.ldif
@@ -0,0 +1,27 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=lrentz, ou=People, dc=example,dc=com
+changetype: modify
+replace: roomnumber
+roomnumber: 151515
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/add.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/add.ldif
new file mode 100644
index 0000000..c6c283b
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/add.ldif
@@ -0,0 +1,40 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=Bidi Bim,ou=People,dc=example,dc=com
+changetype: add
+cn: Bidi Bim
+sn: Bim
+givenName: Bidi
+objectClass: top
+objectClass: person
+objectClass: organizationalPerson
+objectClass: inetOrgPerson
+ou: Accounting
+ou: People
+l: Santa Clara
+uid: bbim
+mail: bbim@example.com
+roomnumber: 5484
+userpassword: donuts
+
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/delete.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/delete.ldif
new file mode 100644
index 0000000..66241bc
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/delete.ldif
@@ -0,0 +1,2 @@
+uid=Bidi Bim,ou=People,dc=example,dc=com
+uid=elo,ou=People,dc=example,dc=com
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/moddn.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/moddn.ldif
new file mode 100644
index 0000000..cd645d2
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/moddn.ldif
@@ -0,0 +1,26 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=elotte, ou=People, dc=example,dc=com
+changetype: moddn
+newrdn: uid=elo
+deleteoldrdn: 1
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ldif b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ldif
new file mode 100644
index 0000000..4d4330d
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ldif
@@ -0,0 +1,37 @@
+# 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
+#
+# Copyright 2007-2010 Sun Microsystems, Inc.
+#
+
+dn: uid=bjensen, ou=People, dc=example,dc=com
+changetype: modify
+replace: roomnumber
+roomnumber: 787878
+
+dn: uid=mwhite, ou=People, dc=example,dc=com
+changetype: modify
+replace: roomnumber
+roomnumber: 898989
+
+dn: uid=mtalbot, ou=People, dc=example,dc=com
+changetype: modify
+replace: roomnumber
+roomnumber: 101010
+
diff --git a/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ref b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ref
new file mode 100644
index 0000000..13ea6d8
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/shared/data/core/psearch/modify/modify.ref
@@ -0,0 +1,56 @@
+dn: uid=bjensen,ou=People,dc=example,dc=com
+ou: Product Development
+ou: People
+sn: Jensen
+facsimileTelephoneNumber: +1 408 555 1992
+objectClass: person
+objectClass: inetOrgPerson
+objectClass: top
+objectClass: organizationalPerson
+roomnumber: 787878
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Cupertino
+cn: Barbara Jensen
+cn: Babs Jensen
+telephoneNumber: +1 408 555 1862
+uid: bjensen
+givenName: Barbara
+mail: bjensen@example.com
+
+
+dn: uid=mwhite,ou=People,dc=example,dc=com
+ou: Accounting
+ou: People
+sn: White
+facsimileTelephoneNumber: +1 408 555 4661
+objectClass: person
+objectClass: inetOrgPerson
+objectClass: top
+objectClass: organizationalPerson
+roomnumber: 898989
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Cupertino
+cn: Morgan White
+telephoneNumber: +1 408 555 9620
+uid: mwhite
+givenName: Morgan
+mail: mwhite@example.com
+
+
+dn: uid=mtalbot,ou=People,dc=example,dc=com
+ou: Product Development
+ou: People
+sn: Talbot
+facsimileTelephoneNumber: +1 408 555 8473
+objectClass: person
+objectClass: inetOrgPerson
+objectClass: top
+objectClass: organizationalPerson
+roomnumber: 101010
+userPassword: {SSHA}E67PSVsljn4LWHey7aeAAVy08uzS29pyzqZpsA==
+l: Cupertino
+cn: Martin Talbot
+telephoneNumber: +1 408 555 9228
+uid: mtalbot
+givenName: Martin
+mail: mtalbot@example.com
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clu_secure.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clu_secure.xml
new file mode 100644
index 0000000..2af35ad
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clu_secure.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="main_clu_secure"/>
+
+ <function name="main_clu_secure">
+
+ <function-list-args>
+ <function-required-arg name="STAXParentID"/>
+ </function-list-args>
+
+ <sequence>
+
+ <block name="'clu_secure'">
+
+ <sequence>
+
+ <!--- Load the job environment for the test group execution -->
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/environment.xml' % TESTS_FUNCTIONS_DIR" />
+ <call function="'loadJobEnvironment'">
+ { 'parent' : STAXParentID }
+ </call>
+
+ <!--- Test Group information
+ #@TestGroupName Clu secure tests
+ #@TestGroupPurpose Test the tools commands in secure mode.
+ -->
+ <script>
+ CurrentTestPath['group'] = 'clu_secure'
+ </script>
+
+ <call function="'testGroup_Preamble'"/>
+
+ <script>
+ testList = []
+ testList.append(['.','clus_setup'])
+ testList.append(['.','clus_jks'])
+ testList.append(['clus_ssl','clus_ssl'])
+ testList.append(['clus_starttls','clus_starttls'])
+ testList.append(['clus_saslexternal','clus_saslexternal'])
+ testList.append(['.','clus_cleanup'])
+ </script>
+
+ <iterate var="_test" in="testList">
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/clu_secure/%s/%s.xml' %
+ (TESTS_DIR,_test[0],_test[1])"/>
+ <call function="'%s' % _test[1]" />
+ </sequence>
+ </iterate>
+
+ <call function="'testGroup_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_cleanup.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_cleanup.xml
new file mode 100644
index 0000000..d891166
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_cleanup.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_cleanup"/>
+
+ <function name="clus_cleanup">
+
+ <sequence>
+
+ <block name="'clus_cleanup'">
+
+ <sequence>
+
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker cleanup
+ #@TestName cleanup: stop DS
+ #@TestIssue none
+ #@TestPurpose Stop DS.
+ #@TestPreamble none
+ #@TestStep Stop DS.
+ #@TestPostamble none
+ #@TestResult Success if StopDsWithScript returns 0.
+ -->
+ <testcase name="getTestCaseName('Stop DS')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Stop DS running on port %s' \
+ % (DIRECTORY_INSTANCE_PORT)
+ </message>
+
+ <call function="'StopDsWithScript'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'dsHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsAdminPort' : DIRECTORY_INSTANCE_ADMIN_PORT ,
+ 'dsBindDN' : DIRECTORY_INSTANCE_DN ,
+ 'dsBindPwd' : DIRECTORY_INSTANCE_PSWD
+ }
+ </call>
+
+ <call function="'checktestRC'">
+ {
+ 'returncode' : RC ,
+ 'result' : STAXResult
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker cleanup
+ #@TestName cleanup: remove DS topology
+ #@TestIssue none
+ #@TestPurpose Remove the topology created for
+ the test suite.
+ #@TestPreamble none
+ #@TestStep Remove the topology created for
+ the test suite.
+ #@TestPostamble none
+ #@TestResult Success if removeTopology returns 0.
+ -->
+ <testcase name="getTestCaseName('Remove DS topology')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Remove DS topology created for the test suite'
+ </message>
+
+ <call function="'removeTopology'"/>
+
+ <call function="'checktestRC'">
+ {
+ 'returncode' : RC ,
+ 'result' : STAXResult
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_jks.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_jks.xml
new file mode 100644
index 0000000..2f3093f
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_jks.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_jks" />
+
+ <function name="clus_jks">
+
+ <sequence>
+
+ <block name="'clus_jks'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName JKS certificates
+ #@TestSuitePurpose Create server certificates
+ #@TestSuiteGroup clus_secure
+ #@TestScript clus_jks.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker Certificates
+ #@TestName Create : server Certificates
+ #@TestIssue none
+ #@TestPurpose Create certificates needed to setup authentication
+ #@TestPreamble none
+ #@TestStep Generate and self-sign the two server certificates
+ #@TestPostamble none
+ #@TestResult Success if test pass
+ -->
+ <testcase name="getTestCaseName('Create server certificates')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Generate the two server Certificates -->
+ <message>
+ 'Security : Server certicates :Step 1. Generating 1st server certicate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'server-cert1' ,
+ 'dname' : "cn=server-dname1,O=Sun Microsystems,C=US",
+ 'keystore' : 'serverkeystore',
+ 'storepass' : 'keystorepass',
+ 'keypass' : 'keystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Server certicates :Step 1bis. Generating 2nd server certicate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'server-cert2' ,
+ 'dname' : "cn=server-dname2,O=Sun Microsystems,C=US",
+ 'keystore' : 'serverkeystore',
+ 'storepass' : 'keystorepass',
+ 'keypass' : 'keystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <!--- Self-Sign the two Server Certificates -->
+ <message>
+ 'Security: Server certificates :Step 2. Self-Signing 1st server certicate'
+ </message>
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'server-cert1' ,
+ 'storepass' : 'keystorepass',
+ 'keypass' : 'keystorepass',
+ 'keystore' : 'serverkeystore',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Server certificates : Step 2bis. Self-signing 2nd server certicate'
+ </message>
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'server-cert2' ,
+ 'storepass' : 'keystorepass',
+ 'keypass' : 'keystorepass',
+ 'keystore' : 'serverkeystore',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <!--- Export then import server certificates into the client truststore -->
+ <message>
+ 'Security: Server certificates : Step 3. Export 1st server certificate'
+ </message>
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'server-cert1' ,
+ 'keystore' : 'serverkeystore',
+ 'storepass' : 'keystorepass',
+ 'outputfile' : 'server-cert1.txt',
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <message>
+ 'Security: Server Certificates : Step 3bis. Export 2nd server certificate'
+ </message>
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'server-cert2' ,
+ 'keystore' : 'serverkeystore',
+ 'storepass' : 'keystorepass',
+ 'outputfile' : 'server-cert2.txt',
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <message>
+ 'Security: Client certificates : Create a client folder'
+ </message>
+ <script>
+ InstanceInstallDir= '%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)
+ </script>
+ <call function="'createFolder'">
+ {
+ 'location' : DIRECTORY_INSTANCE_HOST,
+ 'foldername' : '%s/client_cert' %InstanceInstallDir
+ }
+ </call>
+
+ <message>
+ 'Security: Client certificates : Import 1st server certificate to client truststore'
+ </message>
+ <call function="'ImportCertificate'">
+ {
+ 'certAlias' : 'server-cert1',
+ 'inputfile' : 'server-cert1.txt',
+ 'keystore' : '%s/client_cert/clientruststore' %(InstanceInstallDir),
+ 'storepass' : 'clientruststorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Client certificates : Import 2nd server certificate to client truststore'
+ </message>
+ <call function="'ImportCertificate'">
+ {
+ 'certAlias' : 'server-cert2',
+ 'inputfile' : 'server-cert2.txt',
+ 'keystore' : '%s/client_cert/clientruststore' %(InstanceInstallDir),
+ 'storepass' : 'clientruststorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal.xml
new file mode 100644
index 0000000..13b46e4
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_saslexternal"/>
+
+ <function name="clus_saslexternal">
+
+ <sequence>
+
+ <script>
+ testList = []
+ testList.append(['clus_saslexternal','clus_saslexternal_equaldn'])
+ testList.append(['clus_saslexternal','clus_saslexternal_subjectdn'])
+ testList.append(['clus_saslexternal','clus_saslexternal_subjectattr'])
+ testList.append(['clus_saslexternal','clus_saslexternal_fingerprint'])
+ </script>
+
+ <iterate var="_test" in="testList">
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/clu_secure/%s/%s.xml' %
+ (TESTS_DIR,_test[0],_test[1])"/>
+ <call function="'%s' % _test[1]" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ </function>
+
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_equaldn.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_equaldn.xml
new file mode 100644
index 0000000..ad8b33a
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_equaldn.xml
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_saslexternal_equaldn"/>
+
+ <function name="clus_saslexternal_equaldn" scope="local">
+
+ <sequence>
+
+ <block name="'clus_saslexternal_equaldn'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SASL external equal DN check behaviors
+ #@TestSuitePurpose Test the results of ldap commands in the case
+ of sasl external.
+ #@TestSuiteGroup LDAP tools check behavior tests
+ #@TestScript clus_saslexternal_equaldn.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SASL external equal DN check behaviors
+ #@TestName Create certificates
+ #@TestIssue none
+ #@TestPurpose Create client certificates needed to
+ authentication
+ #@TestPreamble none
+ #@TestStep Generate certificates
+ #@TestStep Self_sign certificates
+ #@TestPostamble none
+ -->
+ <testcase name="getTestCaseName('Create a user certificate')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Create three client certificates-->
+ <message>
+ 'Security : Server certicates :Step 1. Generating userbad client \
+ certificate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'client-bad-cert' ,
+ 'dname' : "uid=userbad,ou=People,dc=com",
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security : Server certicates :Step 1. Generating user.100 client\
+ certificate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'client-100-cert' ,
+ 'dname' : "uid=user.100,ou=People,dc=com",
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security : Server certicates :Step 1. Generating user.200 client\
+ certificate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'client-200-cert' ,
+ 'dname' : "uid=user.200,ou=People,dc=com",
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Server Certificates :Step 2 Self-Signing userbad \
+ client Certicate'
+ </message>
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'client-bad-cert' ,
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'keystore' : '%s/client_cert/clientkeystore' %(InstanceInstallDir),
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Server Certificates :Step 2 Self-Signing user.100 \
+ client Certicate'
+ </message>
+
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'client-100-cert' ,
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Server Certificates :Step 2 Self-Signing user.200 \
+ client Certicate'
+ </message>
+
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'client-200-cert' ,
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'Security: Server Certificates : Export all certificates to RFC'
+ </message>
+
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'client-bad-cert' ,
+ 'keystore' : '%s/client_cert/clientkeystore'\
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'outputfile' : '%s/client_cert/client-bad-cert.txt'\
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'client-100-cert' ,
+ 'keystore' : '%s/client_cert/clientkeystore'\
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'outputfile' : '%s/client_cert/client-100-cert.txt' \
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'client-200-cert' ,
+ 'keystore' : '%s/client_cert/clientkeystore'\
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'outputfile' : '%s/client_cert/client-200-cert.txt' \
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SASL external equal DN check behaviors
+ #@TestName Subject equals DN : servertrust
+ all certificates
+ #@TestPurpose Test subject equal DN certificate mapper with
+ blind trust
+ #@TestPreamble none
+ #@TestStep Enable subject equal DN certificate mapper
+ #@TestStep Do a ldapsearch with client-bad-cert
+ #@TestStep Do an ldapseach with client-100-cert
+ #@TestPostamble none
+ #@TestResult Success if trying to connect with
+ client-bad-cert return 'no user entry' and using
+ client-100-cert return 'authorization ID
+ dn:uid=user.100,ou=People,dc=com
+ -->
+ <testcase name="getTestCaseName('Subject equals DN : server trust all client certificates')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Enable subject equal DN certificate mapper blind trust -->
+ <message>
+ 'Security: SASL External Check behaviors: Enable SASL External \
+ subject equal DN with TrustStore'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'createKeyMgr' : True,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'certMapper' : 'Subject Equals DN',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+ <message>
+ 'Security: SASL External Check behaviors: ldapsearch client\
+ certificate DN not map an entry DN'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore'\
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-bad-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <message>
+ 'Security: SASL External Check behaviors: ldapsearch client \
+ certificate map an user entry'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-100-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <call function="'addCertificate'">
+ {
+ 'userdn' : 'uid=user.100,ou=People,dc=com',
+ 'user_cert_file_rfc': '%s/client_cert/client-100-cert.txt' \
+ %(InstanceInstallDir),
+ 'ldif_path' : '%s/client_cert/client-100-cert.ldif' \
+ %(InstanceInstallDir)
+ }
+ </call>
+
+ <call function="'addCertificate'">
+ {
+ 'userdn' : 'uid=user.200,ou=People,dc=com',
+ 'user_cert_file_rfc': '%s/client_cert/client-200-cert.txt' \
+ %(InstanceInstallDir),
+ 'ldif_path' : '%s/client_cert/client-200-cert.ldif' \
+ %(InstanceInstallDir)
+ }
+ </call>
+
+ <!--- Check Subject equal DN behavior -->
+ <message>
+ 'Security: SASL External Check behaviors: ldapsearch client \
+ certificate dn map an entry dn'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsCertNickname' : 'client-100-cert',
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'authorization ID dn:uid=user.100\
+ ,ou=People,dc=com'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SASL external equal DN check behaviors
+ #@TestName Subject equal DN : server use TrustStore
+ #@TestIssue none
+ #@TestPurpose Test subject equal DN certificate mapper with
+ TrustStore
+ #@TestPreamble none
+ #@TestStep Export then import client client-200-cert into
+ server TrustStore
+ #@TestStep Enable subject equal DN certificate mapper
+ #@TestStep Do a ldapsearch with client-100-cert
+ #@TestStep Do an ldapseach with client-200-cert
+ #@TestPostamble none
+ #@TestResult Success if trying to connect with
+ client-100-cert return 'no user entry' and using
+ client200-cert return 'authorization ID
+ dn:uid=user.200,ou=People,dc=com
+ -->
+ <testcase name="getTestCaseName('Subject equals DN : with TrustStore')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SASL External Check behaviors : export user.200 \
+ certificate'
+ </message>
+
+
+ <message>
+ 'Security: Import the user.200 certificate to server TrustStore'
+ </message>
+ <call function="'ImportCertificate'">
+ {
+ 'certAlias' : 'client-200-cert',
+ 'inputfile' : '%s/client_cert/client-200-cert.txt' \
+ %(InstanceInstallDir),
+ 'keystore' : '%s/config/servertruststore' %(InstanceInstallDir),
+ 'storepass' : 'truststorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+
+ <!--- Enable subject equal DN certificate mapper with TrustStore-->
+ <message>
+ 'Security: SASL External Check behaviors: Enable SASL External \
+ subject equal DN with TrustStore'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : '%s/config/serverkeystore' \
+ %(InstanceInstallDir),
+ 'keystorePin' : 'keystorepass',
+ 'trustMgr' : 'JKS',
+ 'truststoreFile' : '%s/config/servertruststore' \
+ %(InstanceInstallDir),
+ 'truststorePin' : 'truststorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Subject Equals DN',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+ <message>
+ 'Security: SASL External Check behaviors: ldapsearch client \
+ certificate not present in the server TrustStore'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-100-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Cannot send the SASL EXTERNAL bind request'
+ }
+ </call>
+
+ <message>
+ 'Security: SASL External Check behaviors: ldapsearch client \
+ certificate present in the server TrustStore'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-200-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'authorization ID dn:uid=user.200,\
+ ou=People,dc=com'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+</stax>
+
+
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_fingerprint.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_fingerprint.xml
new file mode 100644
index 0000000..e1122b4
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_fingerprint.xml
@@ -0,0 +1,573 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_saslexternal_fingerprint"/>
+
+ <function name="clus_saslexternal_fingerprint" scope="local">
+
+ <sequence>
+
+ <block name="'clus_saslexternal_fingerprint'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SASL external fingerprint mapper
+ check behaviors
+ #@TestSuitePurpose Test the results of ldap commands in the case
+ of fingerprint mapper
+ #@TestSuiteGroup ldapdmodify check behavior tests
+ #@TestScript clus_saslexternal_fingerprint.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SASL external fingerprint blind trust
+ check behaviors
+ #@TestName Fingerprint to user attribute :
+ server trust all client certificates
+ #@TestPurpose Test fingerprint certificate mapper
+ with blind trust
+ #@TestPreamble none
+ #@TestStep Create a client-350-cert with dname
+ "uid=user.350,ou=People,dc=com"
+ #@TestStep Configure fingerprint certificate mapper
+ with blind trust
+ #@TestStep Make a ldapsearch using client-350-cert :
+ should fail
+ #@TestStep Add client-350-cert fingerprint to
+ user.350 attribute
+ #@TestStep Make a ldapsearch using client-350-cert :
+ should success
+ return "Anatoly"
+ #@TestStep Allow user.350 to delete user.42*
+ #@TestStep Make a ldapdelete using client-350-cert :
+ should success
+ #@TestStep Make a ldapseach using client-350-cert :
+ should success
+ return "total number of matching entries: 0"
+ #@TestPostamble none
+ #@TestResult Success if ldapseach after delete return
+ "Total number of matching entries: 0"
+ -->
+ <testcase name="getTestCaseName('Fingerprint to user attribute : server trust all client certificates ')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!-- Create user.350 Certificate -->
+ <message>
+ 'SASL External : Client certicate :Step 1. Generating user.350 \
+ client certificate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'client-350-cert' ,
+ 'dname' : "uid=user.350,ou=People,dc=com",
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: Client certicate :Step 2. Self-Signing user.350 \
+ client Certicate'
+ </message>
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'client-350-cert' ,
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: export : export user.350 certificate'
+ </message>
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'client-350-cert' ,
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'outputfile' : '%s/client_cert/client-350-cert.txt'\
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <call function="'addCertificate'">
+ {
+ 'userdn' : 'uid=user.350,ou=People,dc=com',
+ 'user_cert_file_rfc': '%s/client_cert/client-350-cert.txt' \
+ %(InstanceInstallDir),
+ 'ldif_path' : '%s/client_cert/client-350-cert.ldif' \
+ %(InstanceInstallDir)
+ }
+ </call>
+
+ <!--- Enable Subject DN to user attribute with blind trust-->
+ <message>
+ 'SASL External: configure : Enable subject DN to user attribute \
+ with blind trust'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Fingerprint Mapper',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+
+ <message>
+ 'SASL External: Test fingerpint mapper : try to connect with \
+ user.120 certificate'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword': 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.585' ,
+ 'dsAttributes' : 'givenName',
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Invalid Credentials'
+ }
+ </call>
+
+ <!-- get the fingerprint for user.350 -->
+ <call function="'getFingerprint'">
+ {
+ 'certAlias' : 'client-350-cert',
+ 'storepass' : 'clientkeystorepass',
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir)
+ }
+ </call>
+
+ <script>
+ STAXCode = RC
+ certificateResult = STAXResult[0][1]
+ </script>
+ <script>
+ string_len=len(certificateResult)
+ index_MD5=certificateResult.find("MD5:")
+ index_SHA1=certificateResult.find("SHA1:")
+ index_Signature=certificateResult.find\
+ ("Signature algorithm name:")
+ MD5_fingerprint_user350=certificateResult\
+ [index_MD5+5:index_SHA1].strip()
+ if index_Signature == -1:
+ SHA1_fingerprint_user350=certificateResult\
+ [index_SHA1+5:string_len].strip()
+ else:
+ SHA1_fingerprint_user350=certificateResult\
+ [index_SHA1+5:index_Signature].strip()
+ </script>
+
+ <message>
+ 'SASL External: configure : add ds-certificate-fingerprint \
+ attribute in user.350 entry'
+ </message>
+
+ <call function="'modifyAnAttribute'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'DNToModify' : 'uid=user.350,ou=people,dc=com',
+ 'attributeName' : 'ds-certificate-fingerprint',
+ 'newAttributeValue': MD5_fingerprint_user350,
+ 'changetype' : 'add',
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!---Test Subject DN to user attribute ldapdelete behaviors -->
+ <message>
+ 'SASL External: Test fingerpint mapper : try to connect with \
+ user.350 certificate'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.420' ,
+ 'dsAttributes' : 'givenName',
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Anitra'
+ }
+ </call>
+
+ <message>
+ 'SASL External: aci : allow permission delete for user.350'
+ </message>
+ <script>
+ aci_allowdelete = 'clu_secure/clus_sasl_allowdelete.ldif'
+ </script>
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsFilename' : '%s/%s' % (remote.data,aci_allowdelete),
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapdelete : delete user.420'
+ </message>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsDn' : ['uid=user.420,ou=people,dc=com'],
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsCountEntries' : 'True' ,
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.420' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 0'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SASL external fingerprint TrustStore
+ check behaviors
+ #@TestName Fingerprint to user attribute :
+ server use TrustStore
+ #@TestPurpose Test fingerprint certificate mapper
+ withTrustStore
+ #@TestPreamble none
+ #@TestStep Configure fingerprint certificate mapper
+ with TrustStore
+ #@TestStep Make a ldapdelete using client-350-cert :
+ should fail
+ #@TestStep Add client-350-cert certificate
+ into server TrustStore
+ #@TestStep Make a ldapsearch using client-350-cert :
+ should success
+ return "Total number of matching entries: 1"
+ #@TestStep Make a ldapdelete using client-350-cert :
+ should success
+ #@TestStep Make a ldapseach using client-350-cert :
+ should success
+ return "total number of matching entries: 0"
+ #@TestPostamble none
+ #@TestResult Success if ldapseach after delete return
+ "Total number of matching entries: 0"
+ -->
+
+ <testcase name="getTestCaseName('Fingerprint mapper: with trust file manager')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Test SASL External Subject DN to user attribute with truststore -->
+
+ <message>
+ 'SASL External: configure : Enable subject SN to user attribute \
+ with TrustStore file'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'trustMgr' : 'JKS',
+ 'truststoreFile' : 'config/servertruststore',
+ 'truststorePin' : 'truststorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Fingerprint mapper',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapdelete : delete allow but certificate not in \
+ TrustStore'
+ </message>
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsDn' : ['uid=user.421,ou=people,dc=com'],
+ 'expectedRC' : 81
+ }
+ </call>
+
+ <!--- Add the user.350 certificate to the server truststore -->
+
+ <message>
+ 'SASL External: import : import user.350 certificate to server \
+ truststore'
+ </message>
+ <call function="'ImportCertificate'">
+ {
+ 'certAlias' : 'client-350-cert',
+ 'inputfile' : '%s/client_cert/client-350-cert.txt' \
+ %(InstanceInstallDir),
+ 'keystore' : '%s/config/servertruststore' %(InstanceInstallDir),
+ 'storepass' : 'truststorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: restart LDAPS connection handler to re-read trustore'
+ </message>
+ <call function="'dsconfig'">
+ { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : '--set enabled:false' ,
+ 'expectedRC' : 0
+ }
+ </call>
+ <call function="'dsconfig'">
+ { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : '--set enabled:true' ,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsCountEntries' : 'True' ,
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.421' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 1'
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapdelete : delete user.421'
+ </message>
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsDn' : ['uid=user.421,ou=people,dc=com'],
+ 'expectedRC' : 0
+ }
+ </call>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-350-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsCountEntries' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.421' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 0'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectattr.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectattr.xml
new file mode 100644
index 0000000..fd98efc
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectattr.xml
@@ -0,0 +1,541 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_saslexternal_subjectattr"/>
+
+ <function name="clus_saslexternal_subjectattr" scope="local">
+
+ <sequence>
+
+ <block name="'clus_saslexternal_subjectattr'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SASL external subject attribute
+ to user attribute check behavior tests
+ #@TestSuitePurpose Test the results of ldap commands in the case
+ of subject attribute to user attribute
+ #@TestSuiteGroup ldapdmodify check behavior tests
+ #@TestScript clus_saslexternal_subjectattr.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+
+ <!--- Test Case information
+ #@TestMarker SASL external subject attribute
+ to user attribute blind trust check behaviors
+ #@TestName Subject attribute to user attribute :
+ server trust all certificates
+ #@TestPurpose Test attribute to user attribute certificate
+ mapper with blind trust
+ #@TestPreamble none
+ #@TestStep Create a client-120-cert with dname
+ "CN=Aileen Akita,OU=people,L=Saint Louis,C=com"
+ #@TestStep Configure subject attribute to user attribute
+ certificate mapper with blind trust
+ #@TestStep Try a ldapmodify using client-250-cert :
+ should fail
+ #@TestStep Make a ldapsearch using client-120-cert :
+ should success
+ return "user.120@maildomain.net"
+ #@TestStep Make a ldapmodify using client-120-cert :
+ should success
+ #@TestStep Make a ldapsearch using client-120-cert :
+ should success
+ return "user.120@sundomain.net"
+ #@TestPostamble none
+ #@TestResult Success if the "mail" value is user.120@sun.com
+ -->
+
+ <testcase name="getTestCaseName
+ ('Subject attribute to user attribute : server trust all client certificates')">
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Generate user.120 certificate-->
+
+ <message>
+ 'SASL External : Client certicate :Step 1. Generating user.120 \
+ client certificate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'client-120-cert' ,
+ 'dname' : "CN=Aileen Akita,OU=people,L=Saint Louis,C=com",
+ 'keystore':'%s/client_cert/clientkeystore' %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: Client certicate :Step 2. Self-Signing user.120 \
+ client Certicate'
+ </message>
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'client-120-cert' ,
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'keystore':'%s/client_cert/clientkeystore'%(InstanceInstallDir),
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: export : export user.120 certificate'
+ </message>
+
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'client-120-cert' ,
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'outputfile' : '%s/client_cert/client-120-cert.txt'\
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <message>
+ 'SASL External: add : add certificate to user attribute'
+ </message>
+
+ <call function="'addCertificate'">
+ {
+ 'userdn' : 'uid=user.120,ou=People,dc=com',
+ 'user_cert_file_rfc': '%s/client_cert/client-120-cert.txt' \
+ %(InstanceInstallDir),
+ 'ldif_path' : '%s/client_cert/client-120-cert.ldif' \
+ %(InstanceInstallDir)
+ }
+ </call>
+
+
+ <!--- Test SASL External Subject attribute to user attribute
+ with blind trust -->
+
+ <message>
+ 'SASL External: configure : Enable subject attribute to user \
+ attribute with blind trust'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Subject Attribute to User Attribute',
+ 'optionMapper' : '--set subject-attribute-mapping:cn:cn ',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+ <call function="'dsconfig'">
+ {
+ 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-certificate-mapper-prop',
+ 'objectType' : 'mapper-name' ,
+ 'objectName' : 'Subject Attribute to User Attribute',
+ 'optionsString':'--add subject-attribute-mapping:l:l --no-prompt',
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapmodify : subject attributes not map any \
+ user attributes'
+ </message>
+ <script>
+ telnumbermodify = 'clu_secure/clus_sasl_ldapmodify.ldif'
+ </script>
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsReportAuthzID' : ' ',
+ 'dsCertNickname' : 'client-250-cert',
+ 'dsFilename' : '%s/%s' % (remote.data,telnumbermodify),
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <!---Subject attribute to user attribute ldapmodify
+ check behaviors-->
+
+ <message>
+ 'SASL External: ldapmodify : subject attributes map an \
+ user attributes'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.120' ,
+ 'dsAttributes' : 'telephoneNumber',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'telephoneNumber: \+1 420 810 8882'
+ }
+ </call>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsReportAuthzID' : ' ',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsFilename' : '%s/%s' % (remote.data,telnumbermodify),
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Bound with authorization ID \
+ dn:uid=user.120,ou=People,dc=com'
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.120' ,
+ 'dsAttributes' : 'telephoneNumber',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'telephoneNumber: \+1 420 810 8800'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SASL external subject attribute to user
+ attribute with trust store check behaviors
+ #@TestName Subject attribute to user attribute :
+ server trust store
+ #@TestPurpose Test subject attribute to user attribute
+ certificate mapper with trust store
+ #@TestPreamble none
+ #@TestStep Configure subject attribute to user attribute
+ certificate mapper with trust store
+ #@TestStep Try a ldapmodify using client-120-cert :
+ should fail
+ #@TestStep Export-Import client-120-cert into server trust
+ store
+ #@TestStep Make a ldapsearch using client-120-cert :
+ should success
+ return "74219"
+ #@TestStep Make a ldapmodify using client-120-cert :
+ should success
+ #@TestStep Make a ldapsearch using client-120-cert :
+ should success
+ return "38000"
+ #@TestPostamble none
+ #@TestResult Success if the "postalCode" value is 38000
+ -->
+
+ <testcase name="getTestCaseName('Subject attribute to user attribute : with trust file manager')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Test SASL External Subject attribute to user attribute with
+ truststore -->
+
+ <message>
+ 'SASL External: configure : Enable subject attribute to user \
+ attribute with trust store file'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'truststoreFile' : 'config/servertruststore',
+ 'keystorePin' : 'keystorepass',
+ 'trustMgr' : 'JKS',
+ 'truststorePin' : 'truststorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Subject Attribute to User Attribute',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+
+ <message>
+ 'SASL External: ldapmodify test: client certificate not present \
+ in the server trust store'
+ </message>
+ <script>
+ postalcodemodify='clu_secure/clus_sasl_ldapmodify2.ldif'
+ </script>
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsFilename' : '%s/%s' % (remote.data,postalcodemodify),
+ 'expectedRC' : 81
+ }
+ </call>
+
+ <!--- Add the user.120 certificate to the server truststore -->
+
+ <message>
+ 'SASL External: import : import user.120 certificate to server \
+ truststore'
+ </message>
+ <call function="'ImportCertificate'">
+ {
+ 'certAlias' : 'client-120-cert',
+ 'inputfile' : '%s/client_cert/client-120-cert.txt' \
+ %(InstanceInstallDir),
+ 'keystore' : '%s/config/servertruststore' %(InstanceInstallDir),
+ 'storepass' : 'truststorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: restart LDAPS connection handler to re-read trustore'
+ </message>
+ <call function="'dsconfig'">
+ { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : '--set enabled:false' ,
+ 'expectedRC' : 0
+ }
+ </call>
+ <call function="'dsconfig'">
+ { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : '--set enabled:true' ,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!---ldapmodify check behaviors with truststore-->
+
+ <message>
+ 'SASL External: ldapmodify test: client certificate present in \
+ the server trust store'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.120' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : '74219'
+ }
+ </call>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsFilename' : '%s/%s' % (remote.data,postalcodemodify),
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Bound with authorization ID \
+ dn:uid=user.120,ou=People,dc=com'
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-120-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.120' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : '38000'
+ }
+ </call>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectdn.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectdn.xml
new file mode 100644
index 0000000..5ead0e3
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_saslexternal/clus_saslexternal_subjectdn.xml
@@ -0,0 +1,464 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_saslexternal_subjectdn"/>
+
+ <function name="clus_saslexternal_subjectdn" scope="local">
+
+ <sequence>
+
+ <block name="'clus_saslexternal_subjectdn'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SASL external subject DN to user attribute \
+ check behaviors
+ #@TestSuitePurpose Test the results of ldap commands in the case
+ of sasl external.
+ #@TestSuiteGroup ldapcompare check behavior tests
+ #@TestScript clus_saslexternal_subjectdn.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SASL external subject DN to user attribute
+ check behaviors
+ #@TestName Subject subject DN : server trust all
+ certificates
+ #@TestPurpose Test subject subject DN certificate mapper with
+ blind trust
+ #@TestPreamble none
+ #@TestStep Enable subject DN to user attribute
+ certificate mapper
+ #@TestStep Do a ldapsearch with client-200-cert
+ #@TestStep Create client-250_cert with
+ ds-certificate-subject-dn:uid=user.250,
+ ou=People,dc=com
+ #@TestStep Compare using client-250-cert
+ #@TestPostamble none
+ #@TestResult Success if ldapcompare with client-200-cert
+ return 'Invalid credentials' and using
+ client-250-cert return 'authorization ID
+ dn:uid=user.250,ou=People,dc=com'
+ -->
+ <testcase name="getTestCaseName('Subject DN to user attribute : server trust all client certificates ')">
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Enable Subject DN to user attribute with blind trust-->
+ <message>
+ 'SASL External: configure : Enable subject DN to user attribute \
+ with blind trust'
+ </message>
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Subject DN to User Attribute',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+ <message>
+ 'SASL External: Test subject DN : try to connect with user.200 \
+ certificate'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-200-cert',
+ 'dsReportAuthzID' : ' ',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.585' ,
+ 'dsAttributes' : 'givenName',
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <!---Test Subject DN to user attribute ldapcompare-->
+ <message>
+ 'SASL External : Client certicate :Step 1. Generating user.250 \
+ client certificate'
+ </message>
+ <call function="'genCertificate'">
+ {
+ 'certAlias' : 'client-250-cert' ,
+ 'dname' : "uid=user.250,ou=People,dc=com",
+ 'keystore':'%s/client_cert/clientkeystore' %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: Client certicate :Step 2. Self-Signing user.250 \
+ client Certicate'
+ </message>
+ <call function="'SelfSignCertificate'">
+ {
+ 'certAlias' : 'client-250-cert' ,
+ 'storepass' : 'clientkeystorepass',
+ 'keypass' : 'clientkeystorepass',
+ 'keystore':'%s/client_cert/clientkeystore' %(InstanceInstallDir),
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: export : export user.250 certificate'
+ </message>
+ <call function="'ExportCertificate'">
+ {
+ 'certAlias' : 'client-250-cert' ,
+ 'keystore' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'storepass' : 'clientkeystorepass',
+ 'outputfile' : '%s/client_cert/client-250-cert.txt' \
+ %(InstanceInstallDir),
+ 'storetype' : 'JKS',
+ 'format' : 'rfc'
+ }
+ </call>
+
+ <call function="'addCertificate'">
+ {
+ 'userdn' : 'uid=user.250,ou=People,dc=com',
+ 'user_cert_file_rfc': '%s/client_cert/client-250-cert.txt' \
+ %(InstanceInstallDir),
+ 'ldif_path' : '%s/client_cert/client-250-cert.ldif' \
+ %(InstanceInstallDir)
+ }
+ </call>
+
+ <message>
+ 'SASL External: configure : add ds-certificate-subject-dn \
+ attribute in user.250 entry'
+ </message>
+ <script>
+ addsubjectdnattribute = \
+ 'clu_secure/clus_sasl_addsubjectdnattribute.ldif'
+ </script>
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsFilename' : '%s/%s' % (remote.data,addsubjectdnattribute),
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapcompare : compare different values'
+ </message>
+
+ <script>
+ dncompare = 'uid=user.320,ou=people,dc=com'
+ </script>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-250-cert',
+ 'dsDn' : ['street: 0901 Chestnut Street' ,'%s' \
+ %dncompare],
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned false'
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapcompare :compare value is true'
+ </message>
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-250-cert',
+ 'dsDn' : ['street: 30901 Chestnut Street' ,'%s' \
+ %dncompare] ,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned true'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SASL external subject DN to user attribute
+ check behaviors
+ #@TestName Subject subject DN : server TrustStore
+ #@TestPurpose Test subject subject DN certificate mapper with
+ TrustStore
+ #@TestPreamble none
+ #@TestStep Enable subject DN to user attribute certificate
+ mapper with TrustStore
+ #@TestStep Do a ldapsearch with client-250-cert
+ #@TestStep Export and import client-250_cert into server
+ TrustStore
+ #@TestStep Compare using client-250-cert
+ #@TestPostamble none
+ #@TestResult Success if ldapcompare with client-250-cert
+ fail before import-export and return
+ 'authorization ID
+ dn:uid=user.250,ou=People,dc=com after
+ -->
+ <testcase name="getTestCaseName('Subject DN to user attribute : with trust file manager')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <!--- Test SASL External Subject DN to user attribute with truststore -->
+ <message>
+ 'SASL External: configure : Enable subject SN to user attribute \
+ with TrustStore file'
+ </message>
+
+ <call function="'configureSASL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'KeyMgr' : 'JKSPROVIDER',
+ 'optionSaSL' : '--set certificate-validation-policy:always',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'trustMgr' : 'JKS',
+ 'truststoreFile' : 'config/servertruststore',
+ 'truststorePin' : 'truststorepass',
+ 'handlerName' : 'EXTERNAL',
+ 'certMapper' : 'Subject DN to User Attribute',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapcompare :compare value true but certificate \
+ not in truststore'
+ </message>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-250-cert',
+ 'dsDn' : ['street: 59000 Ridge Street' ,'%s' \
+ %dncompare] ,
+ 'expectedRC' : 81
+ }
+ </call>
+
+ <!--- Add the user.250 certificate to the server truststore -->
+ <message>
+ 'SASL External: import : import user.250 certificate to server \
+ truststore'
+ </message>
+
+ <call function="'ImportCertificate'">
+ {
+ 'certAlias' : 'client-250-cert',
+ 'inputfile' : '%s/client_cert/client-250-cert.txt'\
+ %(InstanceInstallDir),
+ 'keystore' : '%s/config/servertruststore' %(InstanceInstallDir),
+ 'storepass' : 'truststorepass',
+ 'storetype' : 'JKS'
+ }
+ </call>
+
+ <message>
+ 'SASL External: restart LDAPS connection handler to re-read trustore'
+ </message>
+ <call function="'dsconfig'">
+ { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : '--set enabled:false' ,
+ 'expectedRC' : 0
+ }
+ </call>
+ <call function="'dsconfig'">
+ { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : '--set enabled:true' ,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-250-cert',
+ 'dsDn' : ['street: 3001 Chestnut Street' ,'%s' \
+ %dncompare],
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned false'
+ }
+ </call>
+
+ <message>
+ 'SASL External: ldapcompare :compare true certificate not in \
+ truststore'
+ </message>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsUseSASLExternal': ' ',
+ 'dsKeyStorePath' : '%s/client_cert/clientkeystore' \
+ %(InstanceInstallDir),
+ 'dsKeyStorePassword' : 'clientkeystorepass',
+ 'dsCertNickname' : 'client-250-cert',
+ 'dsDn' : ['street: 30901 Chestnut Street' ,'%s' \
+ %dncompare] ,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned true'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_setup.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_setup.xml
new file mode 100644
index 0000000..2d6220c
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_setup.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_setup" />
+
+ <function name="clus_setup">
+
+ <sequence>
+
+ <block name="'clus_setup'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName setup
+ #@TestSuitePurpose Setup for the clus_secure test suite
+ #@TestSuiteGroup setup
+ #@TestScript clus_setup.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker setup
+ #@TestName setup: create DS topology
+ #@TestIssue none
+ #@TestPurpose Create the topology necessary to the
+ test suite.
+ #@TestPreamble none
+ #@TestStep Create DS topology as described in config.py.
+ #@TestPostamble none
+ #@TestResult Success if createTopology returns 0.
+ -->
+ <testcase name="getTestCaseName('Create DS topology')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Create DS topology as described in config.py'
+ </message>
+
+ <call function="'createTopology'">
+ { 'initialiseInstance' : False }
+ </call>
+
+ <call function="'checktestRC'">
+ {
+ 'returncode' : RC ,
+ 'result' : STAXResult
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker setup
+ #@TestName setup: adding initial entries
+ #@TestIssue none
+ #@TestPurpose Load the data needed by the test suite.
+ #@TestPreamble none
+ #@TestStep Load the data needed by the test suite.
+ #@TestPostamble none
+ #@TestResult Success if importLdif returns 0.
+ -->
+ <testcase name="getTestCaseName('Load data')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Add initial entries'
+ </message>
+
+ <call function="'importLdif'">
+ {
+ 'ldifFile' : '%s/clu_secure/clus_start.ldif'
+ % remote.data
+ }
+ </call>
+
+ <call function="'checktestRC'">
+ {
+ 'returncode' : RC ,
+ 'result' : STAXResult
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker setup
+ #@TestName setup: start DS
+ #@TestIssue none
+ #@TestPurpose Start DS.
+ #@TestPreamble none
+ #@TestStep Start DS.
+ #@TestPostamble none
+ #@TestResult Success if StartDsWithScript returns 0.
+ -->
+ <testcase name="getTestCaseName('Start DS')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Start DS to run on port %s' % (DIRECTORY_INSTANCE_PORT)
+ </message>
+
+ <!--- Start DS -->
+ <call function="'StartDsWithScript'">
+ { 'location' : STAF_REMOTE_HOSTNAME }
+ </call>
+
+ <call function="'checktestRC'">
+ {
+ 'returncode' : RC ,
+ 'result' : STAXResult
+ }
+ </call>
+
+ <!--- Check that DS started -->
+ <call function="'isAlive'">
+ {
+ 'noOfLoops' : 5 ,
+ 'noOfMilliSeconds' : 2000
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl.xml
new file mode 100644
index 0000000..e295011
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_ssl" />
+
+ <function name="clus_ssl">
+
+ <sequence>
+
+ <script>
+ testList = []
+ testList.append(['clus_ssl','clus_ssl_setup'])
+ testList.append(['clus_ssl','clus_ssl_ldapsearch'])
+ testList.append(['clus_ssl','clus_ssl_ldapmodify'])
+ testList.append(['clus_ssl','clus_ssl_ldappasswdmodify'])
+ testList.append(['clus_ssl','clus_ssl_ldapcompare'])
+ testList.append(['clus_ssl','clus_ssl_ldapdelete'])
+ testList.append(['clus_ssl','clus_ssl_cleanup'])
+ </script>
+
+ <iterate var="_test" in="testList">
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/clu_secure/%s/%s.xml' %
+ (TESTS_DIR,_test[0],_test[1])"/>
+ <call function="'%s' % _test[1]" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ </function>
+
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_cleanup.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_cleanup.xml
new file mode 100644
index 0000000..bc1d11e
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_cleanup.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+
+<stax>
+
+ <defaultcall function="clus_ssl_cleanup"/>
+
+ <function name="clus_ssl_cleanup" scope="local">
+
+ <sequence>
+ <block name="'clus_ssl_cleanup'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName clean up ssl
+ #@TestSuitePurpose unconfigure ssl
+ #@TestSuiteGroup clean up ssl
+ #@TestScript clus_ssl_cleanup.xml
+ -->
+
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+
+ <call function="'testSuite_Preamble'"/>
+
+ <testcase name="getTestCaseName('Disable SSL blind trust')">
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Security: SSL Check behaviors: Disable SSL blind trust'
+ </message>
+ <call function="'unconfigureSSL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'customKeyMgr' : 'JKSPROVIDER',
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+ </block>
+
+ </sequence>
+
+ </function>
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapcompare.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapcompare.xml
new file mode 100644
index 0000000..02aaf65
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapcompare.xml
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_ssl_ldapcompare"/>
+
+ <function name="clus_ssl_ldapcompare" scope="local">
+
+ <sequence>
+
+ <block name="'clus_ssl_ldapcompare'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SSL ldapcompare check behaviors
+ #@TestSuitePurpose Test the results of SSL ldapcompare command
+ #@TestSuiteGroup ldapcompare check behaviors
+ #@TestScript clus_ssl_ldapcompare.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapcompare check behaviors
+ #@TestName Client use blind trust : ldapcompare successful
+ #@TestPurpose Verify that the operation is successful and
+ that the comparison is successful when client
+ trust all server certificates.
+ #@TestPreamble none
+ #@TestStep Do an ldapcompare with correct options
+ #@TestPostamble none
+ #@TestResult Success if ldapcompare return true
+ -->
+ <testcase name="getTestCaseName ('Client use blind trust : ldapcompare successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapcompare, client trustall \
+ server cert'
+ </message>
+
+ <script>
+ dncompare = 'uid=user.300,ou=people,dc=com'
+ </script>
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsDn' : ['postalCode:21700' ,'%s' %dncompare],
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned false'
+ }
+ </call>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsDn' : ['postalCode:01700' ,'%s' %dncompare],
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned true'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapcompare check behaviors
+ #@TestName Client use TrustStore file : ldapcompare
+ successful
+ #@TestPurpose Verify that the operation is successful and
+ that the comparison is successful when client
+ uses TrustStore file.
+ #@TestPreamble none
+ #@TestStep Do an ldapcompare with correct options.
+ #@TestPostamble none
+ #@TestResult Success if ldapcompare return true
+ -->
+ <testcase name="getTestCaseName
+ ('Client use TrustStore file : ldapcompare successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapcompare, \
+ client TrustStore file'
+ </message>
+
+ <script>
+ dncompare2 = 'uid=user.301,ou=people,dc=com'
+ </script>
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsDn' : ['street: 50303 Sunset' ,'%s' %dncompare2],
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned false'
+ }
+ </call>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsDn' : ['street: 50303 Sunset Street' ,'%s' \
+ %dncompare2] ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned true'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapdelete.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapdelete.xml
new file mode 100644
index 0000000..1f4643d
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapdelete.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_ssl_ldapdelete"/>
+
+ <function name="clus_ssl_ldapdelete" scope="local">
+
+ <sequence>
+
+ <block name="'clus_ssl_ldapdelete'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SSL ldapdelete check behaviors
+ #@TestSuitePurpose Test the result of SSL ldapdelete command
+ #@TestSuiteGroup ldapdelete check behavior tests
+ #@TestScript clus_ssl_ldapdelete.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapdelete check behaviors
+ #@TestName ldapdelete: delete an entry
+ #@TestIssue none
+ #@TestPurpose Test ldapdelete with correct options
+ when client trust all server certificates .
+ #@TestPreamble none
+ #@TestStep Check using ldapsearch that "uid=user.400"
+ entry is present.
+ #@TestStep Delete this entry using ldapdelete.
+ #@TestStep Check using ldapsearch that this entry is no
+ more present.
+ #@TestPostamble none
+ #@TestResult Success if the "uid=user.400" entry is deleted.
+ -->
+ <testcase name="getTestCaseName ('SSL server blind trust : ldapdelete successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapdelete, client trustall server cert'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.400' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 1'
+ }
+ </call>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsDn' : ['uid=user.400,ou=people,dc=com']
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.400' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 0'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapdelete check behaviors
+ #@TestName Client use TrustStore file : ldapdelete successful
+ #@TestIssue none
+ #@TestPurpose Test ldapdelete with correct options
+ when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Check using ldapsearch that "uid=user.401"
+ entry is present.
+ #@TestStep Delete this entry using ldapdelete.
+ #@TestStep Check using ldapsearch that this entry is no
+ more present.
+ #@TestPostamble none
+ #@TestResult Success if the "uid=user.401" entry is deleted.
+ -->
+ <testcase name="getTestCaseName ('Client use TrustStore file : ldapdelete successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapdelete, client TrustStore file'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.401' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 1'
+ }
+ </call>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsDn' : ['uid=user.401,ou=people,dc=com']
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.401' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 0'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapmodify.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapmodify.xml
new file mode 100644
index 0000000..f74f15e
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapmodify.xml
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_ssl_ldapmodify"/>
+
+ <function name="clus_ssl_ldapmodify" scope="local">
+
+ <sequence>
+
+ <block name="'clus_ssl_ldapmodify'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SSL ldapmodify check behaviors
+ #@TestSuitePurpose Test the results of the SSL ldapmodify command
+ #@TestSuiteGroup ldapmodify check bahaviors
+ #@TestScript clus_ssl_ldapmodify.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapmodify check behaviors
+ #@TestName Client blind trust : ldapmodify
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ that the attribute value has been modified
+ when client trust all server certificates.
+ #@TestPreamble none
+ #@TestStep Check that the "givenName" value for "uid=user.100"
+ is Aggy.
+ #@TestStep Modify the "giveName" value using SSL ldapmodify.
+ #@TestStep Check that the "givenName" value for
+ "uid=user.100" is Olga.
+ #@TestPostamble none
+ #@TestResult Success if the "givenName" value is Olga.
+ -->
+ <testcase name="getTestCaseName('Client blind trust : ldapmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapmodify, client trustall server cert'
+ </message>
+
+ <script>
+ modifygivenname = 'clu_secure/clus_ssl_ldapmodify.ldif'
+ modifymail = 'clu_secure/clus_ssl_ldapmodify2.ldif'
+ </script>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilter' : 'uid=user.100' ,
+ 'dsAttributes' : 'givenName'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'givenName: Aggy'
+ }
+ </call>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilename' : '%s/%s' % (remote.data,modifygivenname)
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilter' : 'uid=user.100' ,
+ 'dsAttributes' : 'givenName'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'givenName: Olga'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapmodify check behaviors
+ #@TestName Client use TrustStore file : ldapmodify
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ that the attribute value has been modified
+ when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Check that the "mail" value for "uid=user.450"
+ is user.101@maildomain.net.
+ #@TestStep Modify the "mail" value using ssl ldapmodify.
+ #@TestStep Check that the "mail" value for
+ "uid=user.101" is user.101@sun.com.
+ #@TestPostamble none
+ #@TestResult Success if the "mail" value is user.101@sun.com.
+ -->
+ <testcase name="getTestCaseName('Client use TrustStore file : ldapmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapmodify, client TrustStore file'
+ </message>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilter' : 'uid=user.101' ,
+ 'dsAttributes' : 'mail'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'mail: user.101@maildomain.net'
+ }
+ </call>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsFilename' : '%s/%s' % (remote.data,modifymail)
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsFilter' : 'uid=user.101' ,
+ 'dsAttributes' : 'mail'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'mail: user.101@sun.com'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldappasswdmodify.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldappasswdmodify.xml
new file mode 100644
index 0000000..8fc645c
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldappasswdmodify.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_ssl_ldappasswdmodify"/>
+
+ <function name="clus_ssl_ldappasswdmodify" scope="local">
+
+ <sequence>
+
+ <block name="'clus_ssl_ldappasswdmodify'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SSL ldappasswordmodify check behaviors
+ #@TestSuitePurpose Test the results of ssl ldappasswordmodify
+ command.
+ #@TestSuiteGroup ldappasswordmodify check behavior tests
+ #@TestScript clus_ssl_ldapassmodify.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldappasswordmodify check behavior tests
+ #@TestName Client blind trust : ldappasswordmodify
+ #@TestIssue none
+ #@TestPurpose Verify that a user can change his own
+ password when client trust all server
+ certificates
+ #@TestPreamble none
+ #@TestStep Check that user.200 can do an SSL ldapsearch.
+ #@TestStep Do an ldappasswordmodify to change user
+ password
+ #@TestStep Check that user.200 can't do an ldapsearch
+ with his old password
+ #@TestStep Check that user.200 can do an ldapsearch with
+ his new password
+ #@TestPostamble none
+ #@TestResult Success if user200password works.
+ -->
+ <testcase name="getTestCaseName('Client blind trust : ldappasswordmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsInstanceDn' : 'uid=user.200,ou=people,dc=com',
+ 'dsInstancePswd' : 'password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'ldapPasswordModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsAuthzID' : 'uid=user.200,ou=people,dc=com' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsCurrentPassword' : 'password' ,
+ 'dsNewPassword' : 'user200password'
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : 'uid=user.200,ou=people,dc=com' ,
+ 'dsInstancePswd' : 'password' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*' ,
+ 'expectedRC' : 49
+ }
+ </call>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsInstanceDn' : 'uid=user.200,ou=people,dc=com',
+ 'dsInstancePswd' : 'user200password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldappasswordmodify check behaviors
+ #@TestName Client blind trust : ldappasswordmodify
+ #@TestIssue none
+ #@TestPurpose Verify that a user can change his own
+ password when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Check that user.201 can do an ssl ldapsearch.
+ #@TestStep Do an ldappasswordmodify to change user
+ password.
+ #@TestStep Check that user.201 can't do an ldapsearch with
+ his old password.
+ #@TestStep Check that user.201 can do an ldapsearch with
+ his new password.
+ #@TestPostamble none
+ #@TestResult Success if user201password works.
+ -->
+ <testcase name="getTestCaseName('Client trust file : ldappasswordmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsInstanceDn' : 'uid=user.201,ou=people,dc=com',
+ 'dsInstancePswd' : 'password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'ldapPasswordModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsAuthzID' : 'uid=user.201,ou=people,dc=com' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsCurrentPassword' : 'password' ,
+ 'dsNewPassword' : 'user201password'
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsInstanceDn' : 'uid=user.201,ou=people,dc=com' ,
+ 'dsInstancePswd' : 'password' ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*' ,
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsInstanceDn' : 'uid=user.201,ou=people,dc=com',
+ 'dsInstancePswd' : 'user201password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapsearch.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapsearch.xml
new file mode 100644
index 0000000..ea3ebbc
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_ldapsearch.xml
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+ <defaultcall function="clus_ssl_ldapsearch"/>
+
+ <function name="clus_ssl_ldapsearch" scope="local">
+
+ <sequence>
+
+ <block name="'clus_ssl_ldapsearch'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName SSL ldapsearch check behaviors
+ #@TestSuitePurpose Test the results of ssl ldapsearch command
+ #@TestSuiteGroup SSL behaviors
+ #@TestScript clus_ssl_ldapsearch.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapsearch check behaviors
+ #@TestName Client blind trust : ldapsearch
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ the number of returned entries is correct,
+ when client trust all server cerificates.
+ #@TestPreamble none
+ #@TestStep Do a SSL ldapsearch with postal code filter.
+ #@TestPostamble none
+ #@TestResult Success if user is found and postal code
+ is 36500.
+ -->
+ <testcase name="getTestCaseName('Client blind trust : ldapsearch')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapsearch client trustall \
+ server cert'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'postalCode: 36500'
+ }
+ </call>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapsearch, client trustall \
+ server cert,missing Trustall option'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 'noCheck',
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'server is using the following certificate'
+ }
+ </call>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapsearch, client trustall \
+ server cert,wrong port'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.340' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 'noCheck',
+ 'knownIssue' : '6934118'
+ }
+ </call>
+
+ <if expr="RC == 0">
+ <sequence>
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Unrecognized SSL message'
+ }
+ </call>
+ </sequence>
+ </if>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker SSL ldapsearch check behaviors
+ #@TestName Client use a TrustStore file : ldapsearch
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ the number of returned entries is correct,
+ when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Do a ssl ldapsearch with postal code filter.
+ #@TestPostamble none
+ #@TestResult Success if user is found and postal code
+ is 86150.
+ -->
+ <testcase name="getTestCaseName ('Client use TrustStore file : ldapsearch')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapsearch, client truststore'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.440' ,
+ 'dsAttributes' : 'postalCode'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'postalCode: 86150'
+ }
+ </call>
+
+ <message>
+ 'Security: SSL Check behaviors: ldapsearch, client truststore, \
+ wrong TrustStore file path'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_SSL_PORT ,
+ 'dsUseSSL' : ' ' ,
+ 'dsTrustStorePath' : '%s/config/serverkeystore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.440' ,
+ 'dsAttributes' : 'postalCode',
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Cannot load the key store'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_setup.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_setup.xml
new file mode 100644
index 0000000..6c8c590
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_ssl/clus_ssl_setup.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+
+<stax>
+
+ <defaultcall function="clus_ssl_setup"/>
+
+ <function name="clus_ssl_setup" scope="local">
+
+ <sequence>
+
+ <block name="'clus_ssl_setup'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName Setup SSL
+ #@TestSuitePurpose Configure ssl to test ldap tools
+ #@TestSuiteGroup SSL setup
+ #@TestScript clus_ssl_setup.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clus_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <testcase name="getTestCaseName('Enable SSL with blind trust manager')">
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL setup : Enable SSL with blind trust manager'
+ </message>
+ <call function="'configureSSL'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'customKeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'certAlias' : 'server-cert1'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls.xml
new file mode 100644
index 0000000..aa04fb3
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls"/>
+
+ <function name="clus_starttls">
+
+ <sequence>
+
+ <script>
+ testList = []
+ testList.append(['clus_starttls','clus_starttls_setup'])
+ testList.append(['clus_starttls','clus_starttls_ldapsearch'])
+ testList.append(['clus_starttls','clus_starttls_ldapmodify'])
+ testList.append(['clus_starttls','clus_starttls_ldappasswdmodify'])
+ testList.append(['clus_starttls','clus_starttls_ldapcompare'])
+ testList.append(['clus_starttls','clus_starttls_ldapdelete'])
+ testList.append(['clus_starttls','clus_starttls_cleanup'])
+ </script>
+
+ <iterate var="_test" in="testList">
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/clu_secure/%s/%s.xml' %
+ (TESTS_DIR,_test[0],_test[1])"/>
+ <call function="'%s' % _test[1]" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ </function>
+
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_cleanup.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_cleanup.xml
new file mode 100644
index 0000000..bd9fb59
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_cleanup.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_cleanup"/>
+
+ <function name="clus_starttls_cleanup" scope="local">
+
+ <sequence>
+
+ <block name="'clus_starttls_cleanup'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName clean up StartTLS
+ #@TestSuitePurpose unconfigure StartTLS
+ #@TestSuiteGroup clean up StartTLS
+ #@TestScript clus_startTLS_cleanup.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <testcase name="getTestCaseName('Disable startTLS with blind trust manager')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: startTLS Check behaviors: Disable startTLS with blind \
+ trust manager'
+ </message>
+
+ <call function="'unconfigureTLS'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'customKeyMgr' : 'JKSPROVIDER',
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapcompare.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapcompare.xml
new file mode 100644
index 0000000..2053d56
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapcompare.xml
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_ldapcompare"/>
+
+ <function name="clus_starttls_ldapcompare" scope="local">
+
+ <sequence>
+
+ <block name="'clus_starttls_ldapcompare'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName StartTLS ldapcompare check behaviors
+ #@TestSuitePurpose Test the results of StartTLS ldapcompare command.
+ #@TestSuiteGroup ldapcompare check behavior tests
+ #@TestScript clus_startTLS_ldapcompare.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapcompare check behavior tests
+ #@TestName Client use blind trust : ldapcompare successful
+ #@TestPurpose Verify that the operation is successful and
+ that the comparison is successful when client
+ trust all server certificates.
+ #@TestPreamble none
+ #@TestStep Do an ldapcompare with correct options.
+ #@TestPostamble none
+ #@TestResult Success if ldapcompare return true
+ -->
+ <testcase name="getTestCaseName ('Client use blind trust : ldapcompare successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: StartTLS Check behaviors : ldapcompare, client trustall\
+ server cert'
+ </message>
+
+ <script>
+ dncompare = 'uid=user.310,ou=people,dc=com'
+ </script>
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsDn' : ['postalCode:6728' ,'%s' %dncompare],
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned false'
+ }
+ </call>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsDn' : ['postalCode:67258' ,'%s' %dncompare],
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned true'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapcompare check behaviors
+ #@TestName Client use TrustStore file :
+ ldapcompare successful
+ #@TestPurpose Verify that the operation is successful and
+ that the comparison is successful when client
+ uses TrustStore file.
+ #@TestPreamble none
+ #@TestStep Do an ldapcompare with correct options.
+ #@TestPostamble none
+ #@TestResult Success if ldapcompare return true
+ -->
+ <testcase name="getTestCaseName ('Client use TrustStore file : ldapcompare successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security:startTLS Check behaviors: ldapcompare, client trust \
+ store file'
+ </message>
+
+ <script>
+ dncompare2 = 'uid=user.311,ou=people,dc=com'
+ </script>
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsDn' : ['description: This is for Amber Arbuckle.',\
+ '%s' %dncompare2] ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned false'
+ }
+ </call>
+
+ <call function="'ldapCompareWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath': '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsDn' : ['description: This is the description for \
+ Amber Arbuckle.' ,'%s' %dncompare2] ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Compare operation returned true'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapdelete.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapdelete.xml
new file mode 100644
index 0000000..d72d99c
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapdelete.xml
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_ldapdelete"/>
+
+ <function name="clus_starttls_ldapdelete" scope="local">
+
+ <sequence>
+
+ <block name="'clus_starttls_ldapdelete'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName StartTLS ldapdelete check behavior tests
+ #@TestSuitePurpose Test the results of the StartTLS ldapdelete command.
+ #@TestSuiteGroup ldapdelete check behavior tests
+ #@TestScript clus_startTLS_ldapdelete.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapdelete check behavior tests
+ #@TestName ldapdelete: delete an entry
+ #@TestIssue none
+ #@TestPurpose Test ldapdelete with correct options
+ when client trust all server certificates .
+ #@TestPreamble none
+ #@TestStep Check using ldapsearch that "uid=user.410"
+ entry is present.
+ #@TestStep Delete this entry using ldapdelete.
+ #@TestStep Check using ldapsearch that this entry is no
+ more present.
+ #@TestPostamble none
+ #@TestResult Success if the "uid=user.410" entry is deleted.
+ -->
+ <testcase name="getTestCaseName
+ ('StartTLS server blind trust : ldapdelete successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: StartTLS Check behaviors: ldapdelete, client trustall \
+ server cert'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.410' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 1'
+ }
+ </call>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsDn' : ['uid=user.410,ou=people,dc=com']
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.410' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 0'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapdelete check behavior tests
+ #@TestName Client use TrustStore file : ldapdelete
+ successful
+ #@TestIssue none
+ #@TestPurpose Test ldapdelete with correct options
+ when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Check using ldapsearch that "uid=user.411"
+ entry is present.
+ #@TestStep Delete this entry using ldapdelete.
+ #@TestStep Check using ldapsearch that this entry is no
+ more present.
+ #@TestPostamble none
+ #@TestResult Success if the "uid=user.411" entry is deleted.
+ -->
+ <testcase name="getTestCaseName ('Client use TrustStore file : ldapdelete successful')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: StartTLS Check behaviors: ldapdelete, client trust \
+ store file'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.411' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 1'
+ }
+ </call>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsDn' : ['uid=user.411,ou=people,dc=com']
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsCountEntries' : 'True' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.411' ,
+ 'expectedRC' : 'noCheck'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'Total number of matching entries: 0'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapmodify.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapmodify.xml
new file mode 100644
index 0000000..cf7ada6
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapmodify.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_ldapmodify"/>
+
+ <function name="clus_starttls_ldapmodify" scope="local">
+
+ <sequence>
+
+ <block name="'clus_starttls_ldapmodify'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName StartTLS ldapmodify check behaviors
+ #@TestSuitePurpose Test the results of the startTLS ldapmodify
+ command
+ #@TestSuiteGroup ldapmodify check bahavior tests
+ #@TestScript clus_startTLS_ldapmodify.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapmodify check behaviors
+ #@TestName Client blind trust : ldapmodify
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ that the attribute value has been modified
+ when client trust all server certificates.
+ #@TestPreamble none
+ #@TestStep Check that the "sn" value for "uid=user.110"
+ is Aimone.
+ #@TestStep Modify the "sn" value using startTLS ldapmodify
+ #@TestStep Check that the "sn" value for
+ "uid=user.110" is John.
+ #@TestPostamble none
+ #@TestResult Success if the "sn" value is John
+ -->
+ <testcase name="getTestCaseName('Client blind trust : ldapmodify')">
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: startTLS Check behaviors: ldapmodify, client trustall \
+ server cert'
+ </message>
+
+ <script>
+ modifysn = 'clu_secure/clus_startls_ldapmodify.ldif'
+ modifyphone = 'clu_secure/clus_startls_ldapmodify2.ldif'
+ </script>
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilter' : 'uid=user.110' ,
+ 'dsAttributes' : 'sn'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'sn: Aimone'
+ }
+ </call>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilename' : '%s/%s' % (remote.data,modifysn)
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilter' : 'uid=user.110' ,
+ 'dsAttributes' : 'sn'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'sn: John'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapmodify check behaviors
+ #@TestName Client use TrustStore file : ldapmodify
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ that the attribute value has been modified
+ when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Check that the "telephoneNumber" value for
+ "uid=user.111" is +1 896 751 0209
+ #@TestStep Modify the "mail" value using startTLS ldapmodify.
+ #@TestStep Check that the "telephoneNumber" value for
+ "uid=user.111" is +3312345678
+ #@TestPostamble none
+ #@TestResult Success if the "telephoneNumber" value is
+ +3312345678.
+ -->
+ <testcase name="getTestCaseName('Client use TrustStore file : ldapmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: startTLS Check behaviors: ldapmodify, client \
+ TrustStore file'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsFilter' : 'uid=user.111' ,
+ 'dsAttributes' : 'telephoneNumber'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'telephoneNumber: \+1 896 751 0209'
+ }
+ </call>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsFilename' : '%s/%s' % (remote.data,modifyphone)
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsFilter' : 'uid=user.111' ,
+ 'dsAttributes' : 'telephoneNumber'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'telephoneNumber: \+3312345678'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldappasswdmodify.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldappasswdmodify.xml
new file mode 100644
index 0000000..85e584b
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldappasswdmodify.xml
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_ldappasswdmodify"/>
+
+ <function name="clus_starttls_ldappasswdmodify" scope="local">
+
+ <sequence>
+
+ <block name="'clus_starttls_ldappasswdmodify'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName StartTLS ldappasswordmodify check behaviors
+ #@TestSuitePurpose Test the results of StartTLS ldappasswordmodify
+ command.
+ #@TestSuiteGroup ldappasswordmodify check behavior tests
+ #@TestScript clus_startTLS_ldapassmodify.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldappasswordmodify check behaviors
+ #@TestName Client blind trust : ldappasswordmodify
+ #@TestIssue none
+ #@TestPurpose Verify that a user can change his own
+ password when client trust all server
+ certificates.
+ #@TestPreamble none
+ #@TestStep Check that user.210 can do an startTLS
+ ldapsearch.
+ #@TestStep Do an ldappasswordmodify to change user
+ password.
+ #@TestStep Check that user.210 can't do an ldapsearch
+ with his old password.
+ #@TestStep Check that user.210 can do an ldapsearch with
+ his new password.
+ #@TestPostamble none
+ #@TestResult Success if user210password works.
+ -->
+ <testcase name="getTestCaseName('Client blind trust : ldappasswordmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsInstanceDn' : 'uid=user.210,ou=people,dc=com',
+ 'dsInstancePswd' : 'password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'ldapPasswordModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsAuthzID' : 'uid=user.210,ou=people,dc=com' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsCurrentPassword' : 'password' ,
+ 'dsNewPassword' : 'user210password'
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : 'uid=user.210,ou=people,dc=com' ,
+ 'dsInstancePswd' : 'password' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*' ,
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsInstanceDn' : 'uid=user.210,ou=people,dc=com',
+ 'dsInstancePswd' : 'user210password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldappasswordmodify check behaviors
+ #@TestName Client blind trust : ldappasswordmodify
+ #@TestIssue none
+ #@TestPurpose Verify that a user can change his own
+ password when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Check that user.211 can do
+ an StartTLS ldapsearch.
+ #@TestStep Do an ldappasswordmodify to change user
+ password.
+ #@TestStep Check that user.211 can't do an ldapsearch with
+ his old password.
+ #@TestStep Check that user.211 can do an ldapsearch with
+ his new password.
+ #@TestPostamble none
+ #@TestResult Success if user211password works.
+ -->
+ <testcase name="getTestCaseName('Client use TrustStore file : ldappasswordmodify')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsInstanceDn' : 'uid=user.211,ou=people,dc=com',
+ 'dsInstancePswd' : 'password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'ldapPasswordModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsAuthzID' : 'uid=user.211,ou=people,dc=com' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore'
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsCurrentPassword' : 'password' ,
+ 'dsNewPassword' : 'user211password'
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : 'uid=user.211,ou=people,dc=com' ,
+ 'dsInstancePswd' : 'password' ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ % InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*' ,
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsInstanceDn' : 'uid=user.211,ou=people,dc=com',
+ 'dsInstancePswd' : 'user211password' ,
+ 'dsTypesOnly' : 'True' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.*'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapsearch.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapsearch.xml
new file mode 100644
index 0000000..107074c
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_ldapsearch.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_ldapsearch"/>
+
+ <function name="clus_starttls_ldapsearch" scope="local">
+
+ <sequence>
+ <block name="'clus_starttls_ldapsearch'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName StartTLS ldapsearch check behaviors
+ #@TestSuitePurpose Test the results of ssl ldapsearch command
+ #@TestSuiteGroup StartTLS behaviors
+ #@TestScript clus_startTLS_ldapsearch.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapsearch check behaviors
+ #@TestName Client blind trust : ldapsearch
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ the number of returned entries is correct,
+ when client trust all server cerificates.
+ #@TestPreamble none
+ #@TestStep Do a startTLS ldapsearch with phone number filter.
+ #@TestPostamble none
+ #@TestResult Success if user is found and pager
+ is +1 608 828 0224.
+ -->
+ <testcase name="getTestCaseName('Client blind trust : ldapsearch')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: startTLS Check behaviors: ldapsearch, client trustall \
+ server cert'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustAll' : ' ' ,
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.500' ,
+ 'dsAttributes' : 'pager'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'pager: \+1 608 828 0224'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <!--- Test Case information
+ #@TestMarker StartTLS ldapsearch check behaviors
+ #@TestName Client use a TrustStore file : ldapsearch
+ #@TestIssue none
+ #@TestPurpose Verify that the operation is successful and
+ the number of returned entries is correct,
+ when client uses a TrustStore file.
+ #@TestPreamble none
+ #@TestStep Do a StartTLS ldapsearch with street filter.
+ #@TestPostamble none
+ #@TestResult Success if user is found and street
+ is 77009 South Street.
+ -->
+ <testcase name="getTestCaseName
+ ('Client use TrustStore file : ldapsearch')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: startTLS Check behaviors: ldapsearch, client truststore'
+ </message>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsUseStartTLS' : ' ' ,
+ 'dsTrustStorePath' : '%s/client_cert/clientruststore' \
+ %InstanceInstallDir,
+ 'dsTrustStorePassword': 'clientruststorepass',
+ 'dsBaseDN' : 'dc=com' ,
+ 'dsFilter' : 'uid=user.505' ,
+ 'dsAttributes' : 'street'
+ }
+ </call>
+
+ <script>
+ returnString = STAXResult[0][1]
+ </script>
+ <call function="'checktestString'">
+ {
+ 'returnString' : returnString ,
+ 'expectedString' : 'street: 77009 South Street'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
+
+
diff --git a/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_setup.xml b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_setup.xml
new file mode 100644
index 0000000..8a6c059
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/clu_secure/clus_starttls/clus_starttls_setup.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="clus_starttls_setup"/>
+
+ <function name="clus_starttls_setup" scope="local">
+
+ <sequence>
+
+ <block name="'clus_starttls_setup'">
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName Setup startTLS
+ #@TestSuitePurpose Configure startTLS to test ldap tools
+ #@TestSuiteGroup startTLS setup
+ #@TestScript clus_starttls_setup.xml
+ -->
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group'] = 'clu_secure'
+ CurrentTestPath['suite'] = STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <testcase name="getTestCaseName('Enable startTLS with blind trust manager')">
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Security: SSL Check behaviors: Enable startTLS with blind \
+ trust manager'
+ </message>
+
+ <call function="'configureTLS'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'customKeyMgr' : 'JKSPROVIDER',
+ 'keystoreFile' : 'config/serverkeystore',
+ 'keystorePin' : 'keystorepass',
+ 'certAlias' : 'server-cert2'
+ }
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+
+ </sequence>
+
+ </testcase>
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests.xml b/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests.xml
index 944ca8d..3602e11 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests.xml
@@ -3648,7 +3648,7 @@
'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
'dsBaseDN' : targetDN3 ,
- 'dsFilter' : 'description\=Worldwide*' ,
+ 'dsFilter' : 'description=Worldwide*' ,
}
</call>
<script>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests_bk.xml b/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests_bk.xml
deleted file mode 100644
index 69aaf6b..0000000
--- a/opends/tests/staf-tests/functional-tests/testcases/core/collectiveattr/core_collectiveattr_tests_bk.xml
+++ /dev/null
@@ -1,463 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
-<!--
- ! 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
- !
- ! Copyright 2010 Sun Microsystems, Inc.
- ! -->
-<stax>
-
- <!-- Definition of Test Cases -->
-
- <!--- Test Case : Core : Collective Attributes : core_collectiveattr_001 -->
- <!--- Test Case information
- #@TestMarker Schema
- #@TestName Core : Collective Attributes
- #@TestID core_collectiveattr_001
- #@TestPurpose Create and add a collective attribute
- #@TestPreamble
- #@TestSteps add collective attribute with attributename;collective
- #@TestSteps (with secretary) verify in the entries that
- #@TestSteps attribute has been added
- #@TestPostamble
- #@TestResult Test is successful if the result code is 0
- -->
- <function name="core_collectiveattr_001" scope="local">
- <testcase name="getTestCaseName('Create and add a Collective Attribute')">
- <sequence>
- <try>
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
-
- <script>
- coreattrLdif='%s/core/ldifs/collectiveattr-1.ldif' % remote.data
- baseDN='ou=People,o=collectiveattr tests,dc=example,dc=com'
- targetDN='uid=kwinters,ou=North,ou=America,%s' % baseDN
- </script>
-
- <call function="'runFunction'">
- { 'functionName' : 'ldapModifyWithScript' ,
- 'functionMessage' : 'Add ldif with secretary;collective',
- 'functionException' : 'LDAP.AddException' ,
- 'functionArguments' : { 'location' : server.location ,
- 'dsInstanceHost': server.host ,
- 'dsInstancePort': server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd': server.password ,
- 'dsAdd' : 'TRUE' ,
- 'dsFilename' : coreattrLdif }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <!-- Search for the secretary attributes-->
- <call function="'runFunction'">
- { 'functionName' : 'ldapSearchWithScript' ,
- 'functionMessage' : 'Search for the secretary entry.' ,
- 'functionException' : 'LDAP.SearchException' ,
- 'functionArguments' : { 'dsInstanceHost' : server.host ,
- 'dsInstancePort' : server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsBaseDN' : targetDN ,
- 'dsFilter' : 'objectclass=*' ,
- 'dsAttributes' : 'secretary' }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <!-- Check that secretary is returned in search result -->
- <call function="'runFunction'">
- { 'functionName' : 'checktestString' ,
- 'functionMessage' : 'Check secretary attribute is returned.' ,
- 'functionException' : 'Utils.CheckStringException' ,
- 'functionArguments' : { 'expectedString' : 'secretary' ,
- 'returnString' : _functionResult }
- }
- </call>
-
- </sequence>
- <catch exception="'STAXException.LDAP.AddException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: LdapAdd failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.LDAP.SearchException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: LDAPSearch failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.Utils.CheckStringException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: UtilsCheck failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <finally>
- <call function="'testCase_Postamble'"/>
- </finally>
- </try>
- </sequence>
- </testcase>
- </function>
-
- <!--- Test Case : Core : Collective Attributes : Import Collective Attributes from File -->
- <!--- Test Case information
- #@TestMarker Schema
- #@TestName Core : Collective Attributes
- #@TestID Import Collective Attributes from File
- #@TestPurpose Test import of ldif containing collective transfer option
- #@TestPreamble
- #@TestSteps Import ldif containing collective attributes
- #@TestPostamble
- #@TestResult Test is successful if the result code is 0
- -->
- <function name="core_binaryattr_002" scope="local">
- <testcase name="getTestCaseName('Import Collective Attributes from File.')">
- <sequence>
- <try>
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
-
- <script>
- binaryattrLdif='%s/binaryattr.ldif' % remote.temp
- templateName='binaryattr.template'
- </script>
-
- <!-- On line import of ldif file containing collective attribute -->
- <call function="'runFunction'">
- { 'functionName' : 'ImportLdifWithScript' ,
- 'functionMessage' : 'Import ldif file with collective entries' ,
- 'functionException' : 'Admin.ImportException' ,
- 'functionArguments' : { 'location' : server.location ,
- 'dsInstanceHost' : server.host ,
- 'dsInstanceAdminPort' : server.adminport ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsBackEnd' : server.backend ,
- 'dsLdifFile' : binaryattrLdif ,
- 'dsRejectFile' : '%s/rejects.txt' % remote.temp }
- }
- </call>
-
- <!-- Check that the import task is complete-->
- <call function="'runFunction'">
- { 'functionName' : 'manage-tasks' ,
- 'functionMessage' : 'Manage the online import task' ,
- 'functionException' : 'Admin.ManageTaskException' ,
- 'functionArguments' : { 'location' : server.location ,
- 'dsInstanceHost' : server.host ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsQuiet' : ' ' }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <call function="'runFunction'">
- { 'functionName' : 'searchStringForSubstring' ,
- 'functionMessage' : 'Check import is completed successfully.' ,
- 'functionException' : 'Utils.CheckStringException' ,
- 'functionArguments' : { 'returnString' : _functionResult ,
- 'testString' : 'Completed successfully' ,
- 'expectedResult' : '1' }
- }
- </call>
-
- <!-- Count the number of entries in backend -->
- <call function="'runFunction'">
- { 'functionName' : 'ldapSearchWithScript' ,
- 'functionMessage' : 'Count number of imported entries.' ,
- 'functionException' : 'LDAP.SearchException' ,
- 'functionArguments' : { 'dsInstanceHost' : server.host ,
- 'dsInstancePort' : server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsBaseDN' : __baseDN ,
- 'dsFilter' : 'objectclass=*' ,
- 'dsAttributes' : 'dn' ,
- 'dsCountEntries' : 'True' ,
- 'expectedRC' : 0 }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <call function="'runFunction'">
- { 'functionName' : 'searchStringForSubstring' ,
- 'functionMessage' : 'Check import is completed successfully.' ,
- 'functionException' : 'Utils.CheckStringException' ,
- 'functionArguments' : { 'returnString' : _functionResult ,
- 'testString' : 'Total number of matching entries: 304' ,
- 'expectedResult' : '1' }
- }
- </call>
-
- <!-- Search for the usercertificate attributes-->
- <call function="'runFunction'">
- { 'functionName' : 'ldapSearchWithScript' ,
- 'functionMessage' : 'Search for the usercertificate entry.' ,
- 'functionException' : 'LDAP.SearchException' ,
- 'functionArguments' : { 'dsInstanceHost' : server.host ,
- 'dsInstancePort' : server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsBaseDN' : __baseDN ,
- 'dsFilter' : 'objectclass=*' ,
- 'dsAttributes' : 'usercertificate' }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <!-- Check that usercertificate;collective is returned in search result -->
- <call function="'runFunction'">
- { 'functionName' : 'checktestString' ,
- 'functionMessage' : 'Check usercertificate attribute is returned.' ,
- 'functionException' : 'Utils.CheckStringException' ,
- 'functionArguments' : { 'expectedString' : 'usercertificate;collective' ,
- 'returnString' : _functionResult }
- }
- </call>
- </sequence>
- <catch exception="'STAXException.Admin.ImportException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: Import failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.Admin.ManageTaskException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: ManageTask failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.LDAP.SearchException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: LDAPSearch failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.Utils.CheckStringException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: UtilsCheck failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <finally>
- <call function="'testCase_Postamble'"/>
- </finally>
- </try>
- </sequence>
- </testcase>
- </function>
-
- <function name="core_binaryattr_003" scope="local">
- <testcase name="getTestCaseName('Add userCertificate no collective option.')">
- <sequence>
- <try>
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
-
- <script>
- ldifFile='%s/userCertificate.ldif' % remote.temp
- templateName='userCertificate.template'
- targetDN='ou=core binaryattr 003,ou=people,%s' % __baseDN
- </script>
-
- <!-- MakeLDIF template -->
- <message>'Generating template (%s).' % templateName</message>
- <script>
- ldifEntry=[]
- ldifEntry.append('branch: %s' % targetDN)
- ldifEntry.append('subordinateTemplate: certificatePerson:5')
- ldifEntry.append('')
- ldifEntry.append('template: person')
- ldifEntry.append('rdnAttr: uid')
- ldifEntry.append('objectClass: top')
- ldifEntry.append('objectClass: person')
- ldifEntry.append('objectClass: organizationalPerson')
- ldifEntry.append('objectClass: inetOrgPerson')
- ldifEntry.append('givenName: <first>')
- ldifEntry.append('sn: <last>')
- ldifEntry.append('cn: {givenName} {sn}')
- ldifEntry.append('employeeNumber: <sequential:0>')
- ldifEntry.append('uid: stronguser.{employeeNumber}')
- ldifEntry.append('')
- ldifEntry.append('template: certificatePerson')
- ldifEntry.append('rdnAttr: uid')
- ldifEntry.append('extends: person')
- ldifEntry.append('objectclass: strongauthenticationUser')
- ldifEntry.append('userCertificate: <random:base64:1000>')
- ldifEntry.append('')
- </script>
-
- <!-- Write template to file -->
- <script>
- ftemplate=open('%s/%s' % (local.temp,templateName),'w')
- for line in ldifEntry:
- ftemplate.write('%s\n' % line)
- ftemplate.close()
- </script>
-
- <!-- Copy template to SUT -->
- <call function="'copyFile'">
- {
- 'srcfile' : '%s/%s' % (local.temp,templateName),
- 'destfile' : '%s/%s' % (remote.temp,templateName),
- 'remotehost' : server.location
- }
- </call>
-
- <!-- Generate an ldif file containing collective attributes -->
- <call function="'runFunction'">
- { 'functionName' : 'MakeLdifWithScript' ,
- 'functionMessage' : 'Generate LDIF file.' ,
- 'functionException' : 'Tools.MakeLdifException' ,
- 'functionArguments' : { 'location' : server.location ,
- 'templateFile' : '%s/%s' %
- (remote.temp,templateName) ,
- 'ldifFile' : ldifFile }
- }
- </call>
-
- <call function="'runFunction'">
- { 'functionName' : 'ldapModifyWithScript' ,
- 'functionMessage' : 'Add ldif with userCertificate;binary entry' ,
- 'functionException' : 'LDAP.AddException' ,
- 'functionArguments' : { 'location' : server.location ,
- 'dsInstanceHost': server.host ,
- 'dsInstancePort': server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd': server.password ,
- 'dsAdd' : 'TRUE' ,
- 'dsFilename' : ldifFile }
- }
- </call>
-
- <!-- Search for the usercertificate attributes-->
- <call function="'runFunction'">
- { 'functionName' : 'ldapSearchWithScript' ,
- 'functionMessage' : 'Search for the userCertificate entry.' ,
- 'functionException' : 'LDAP.SearchException' ,
- 'functionArguments' : { 'dsInstanceHost' : server.host ,
- 'dsInstancePort' : server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsBaseDN' : targetDN ,
- 'dsFilter' : 'objectclass=*' ,
- 'dsAttributes' : 'usercertificate' }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <!-- Check that usercertificate;collective is returned in search result -->
- <call function="'runFunction'">
- { 'functionName' : 'checktestString' ,
- 'functionMessage' : 'Check userCertificate attribute is returned.' ,
- 'functionException' : 'Utils.CheckStringException' ,
- 'functionArguments' : { 'expectedString' : 'usercertificate;binary' ,
- 'returnString' : _functionResult }
- }
- </call>
-
- <!-- Search for the usercertificate attributes-->
- <call function="'runFunction'">
- { 'functionName' : 'ldapSearchWithScript' ,
- 'functionMessage' : 'Search for the userCertificate entry.' ,
- 'functionException' : 'LDAP.SearchException' ,
- 'functionArguments' : { 'dsInstanceHost' : server.host ,
- 'dsInstancePort' : server.port ,
- 'dsInstanceDn' : server.dn ,
- 'dsInstancePswd' : server.password ,
- 'dsBaseDN' : targetDN ,
- 'dsFilter' : 'objectclass=*' ,
- 'dsAttributes' : 'usercertificate;binary' }
- }
- </call>
-
- <script>
- _functionResult=parse_stax_result(STAXResult)
- </script>
-
- <!-- Check that usercertificate;binary is returned in search result -->
- <call function="'runFunction'">
- { 'functionName' : 'checktestString' ,
- 'functionMessage' : 'Check userCertificate attribute is returned.' ,
- 'functionException' : 'Utils.CheckStringException' ,
- 'functionArguments' : { 'expectedString' : 'usercertificate;binary' ,
- 'returnString' : _functionResult }
- }
- </call>
-
- </sequence>
- <catch exception="'STAXException.Tools.MakeLdifException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: MakeLdif failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.LDAP.AddException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: LdapAdd failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.LDAP.SearchException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: LDAPSearch failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <catch exception="'STAXException.Utils.CheckStringException'" typevar="eType" var="eInfo">
- <message log="1" level="'fatal'">
- '%s: UtilsCheck failed. eInfo(%s)' % (eType,eInfo)
- </message>
- </catch>
- <finally>
- <call function="'testCase_Postamble'"/>
- </finally>
- </try>
- </sequence>
- </testcase>
- </function>
-
-
-</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/core/core.xml b/opends/tests/staf-tests/functional-tests/testcases/core/core.xml
index 98627b9..d65a431 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/core/core.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/core/core.xml
@@ -23,7 +23,7 @@
!
! CDDL HEADER END
!
- ! Copyright 2006-2009 Sun Microsystems, Inc.
+ ! Copyright 2006-2010 Sun Microsystems, Inc.
! -->
<stax>
<defaultcall function="main_core" />
@@ -60,6 +60,7 @@
suiteList.append('controls/core_ctrls_matched_values')
suiteList.append('binaryattr/core_binaryattr')
suiteList.append('collectiveattr/core_collectiveattr')
+ suiteList.append('psearch/core_psearch')
</script>
<!-- Run the test suites -->
diff --git a/opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch.xml b/opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch.xml
new file mode 100644
index 0000000..f673681
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+ <defaultcall function="core_psearch"/>
+ <function name="core_psearch" scope="local">
+ <sequence>
+ <block name="'core_psearch'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group']='core'
+ CurrentTestPath['suite']='psearch'
+
+ __group=CurrentTestPath['group']
+ __groupdir='%s/testcases/%s' % (TESTS_DIR,__group)
+ </script>
+
+ <!--- Test Suite information
+ #@TestSuiteName PSearch delete Tests
+ #@TestSuitePurpose Verify that the basic persistent search for delete operations is working in the Directory Server.
+ #@TestSuiteID PSearch delete operations
+ #@TestSuiteGroup PSearch delete
+ #@TestGroup PSearch
+ #@TestScript psearch.xml
+ #@TestHTMLLink http://opends.dev.java.net/
+ -->
+
+ <call function="'testSuite_Preamble'"/>
+
+ <try>
+ <sequence>
+
+ <call function="'common_setup'">
+ {
+ 'quickStart' : False ,
+ 'startServer' : False,
+ 'loadData' : False ,
+ 'stopServer' : False
+ }
+ </call>
+
+ <script>
+ psearchList=[]
+ psearchList.append('psearch/core_psearch_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="__psearch" in="psearchList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (__groupdir,__psearch)"/>
+ </iterate>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ testsList=[]
+ testsList.append('core_psearch_import-ldif_1')
+ testsList.append('core_psearch_delete_1')
+ testsList.append('core_psearch_delete_2')
+ testsList.append('core_psearch_modify_1')
+ testsList.append('core_psearch_modify_2')
+ testsList.append('core_psearch_moddn_1')
+ testsList.append('core_psearch_moddn_2')
+ testsList.append('core_psearch_add_1')
+ testsList.append('core_psearch_add_2')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
+ </sequence>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Global Schema Cleanup.'</message>
+ <try>
+ <call function="'common_cleanup'" />
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
+ </block>
+ </sequence>
+ </function>
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch_tests.xml b/opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch_tests.xml
new file mode 100644
index 0000000..e831bc1
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/core/psearch/core_psearch_tests.xml
@@ -0,0 +1,1191 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Import LDIF file
+ #@TestID Import LDIF file
+ #@TestPurpose Import LDIF file using the default backend and start the server
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_import-ldif_1" scope="local">
+
+ <testcase name="getTestCaseName('Import LDIF file')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <call function="'ImportLdifWithScript'">
+ {
+ 'dsLdifFile' : '%s/core/psearch/default.ldif' % remote.data,
+ 'dsBackEnd' : DIRECTORY_INSTANCE_BE
+ }
+ </call>
+
+ <call function="'checkImport'">
+ { 'expectedEntries' : ['uid=scarter,ou=People,dc=example,dc=com',
+ 'uid=dmiller, ou=People, dc=example,dc=com',
+ 'uid=rhunt, ou=People, dc=example,dc=com'] }
+ </call>
+
+ <call function="'StartDsWithScript'"/>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Delete entries
+ #@TestID Delete entries
+ #@TestPurpose Verify PSearch with "delete" option, detect delete operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "delete" option, in parallel delete some entries
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_delete_1" scope="local">
+
+ <testcase name="getTestCaseName('Delete entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_delete: starting the psearch client with "delete" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "delete",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/delete/delete.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_delete: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_delete: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_delete: delete entries tmorris,abergin,jwalker,tclow'
+ </message>
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/delete/delete.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ <message>
+ 'psearch_delete: Check all delete operations have been successfully detected'
+ </message>
+ <call function="'LdifDiffWithScript'">
+ {
+ 'sourceLdif' : '%s/core/psearch/delete/delete.out' % remote.data,
+ 'targetLdif' : '%s/core/psearch/delete/delete.ref' % remote.data,
+ 'outputLdif' : '%s/delete.out' % remote.temp
+ }
+ </call>
+ <if expr="STAXResult != 0">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+ </parallel>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Add-Modify-Moddn entries
+ #@TestID Add-Modify-Moddn entries
+ #@TestPurpose Verify PSearch with "delete" option, no detect other operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "delete" option, in parallel make the following operations modify add moddn
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_delete_2" scope="local">
+
+ <testcase name="getTestCaseName('Add-Modify-Moddn entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_delete_blank: starting the psearch client with "delete" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "delete",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/delete/delete_blank.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_delete_blank: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_delete_blank: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_delete_blank: add entry uid=Bada Boum,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/delete/add.ldif' % remote.data
+ }
+ </call>
+
+ <message>
+ 'psearch_delete_blank: moddn entry uid=elott, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/delete/moddn.ldif' % remote.data
+ }
+ </call>
+
+
+ <message>
+ 'psearch_delete_blank: modify entry uid=rschneid, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/delete/modify.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ </sequence>
+
+
+ </parallel>
+
+ <message>
+ 'psearch_delete: Check "modify,add,moddn" operations have not been detected'
+ </message>
+
+ <call function="'GetEntry'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'entry' : '%s/core/psearch/delete/delete_blank.out' % remote.data,
+ 'attribute' : 'TYPE'
+ }
+ </call>
+
+ <if expr="RC != 48">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Modify entries
+ #@TestID Modify entries
+ #@TestPurpose Verify PSearch with "modify" option, detect modify operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "modify" option, in parallel modify some entries
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_modify_1" scope="local">
+
+ <testcase name="getTestCaseName('Modify entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_modify: starting the psearch client with "modify" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "modify",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/modify/modify.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_modify: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_modify: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_modify: modify entries uid=bjensen, ou=People, dc=example,dc=com\
+ uid=mwhite, ou=People, dc=example,dc=com\
+ uid=mtalbot, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/modify/modify.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ <message>
+ 'psearch_modify: Check all modify operations have been successfully detected'
+ </message>
+ <call function="'LdifDiffWithScript'">
+ {
+ 'sourceLdif' : '%s/core/psearch/modify/modify.out' % remote.data,
+ 'targetLdif' : '%s/core/psearch/modify/modify.ref' % remote.data,
+ 'outputLdif' : '%s/modify.out' % remote.temp
+ }
+ </call>
+ <if expr="STAXResult != 0">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+ </parallel>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Add-Delete-Moddn entries
+ #@TestID Add-Delete-Moddn entries
+ #@TestPurpose Verify PSearch with "modify" option, no detect other operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "modify" option, in parallel make the following operations add delete moddn
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_modify_2" scope="local">
+
+ <testcase name="getTestCaseName('Add-Delete-Moddn entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_modify_blank: starting the psearch client with "modify" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "modify",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/modify/modify_blank.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_modify_blank: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_modify_blank: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_modify_blank: add entry uid=Bidi Bim,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/modify/add.ldif' % remote.data
+ }
+ </call>
+
+ <message>
+ 'psearch_modify_blank: moddn entry uid=elotte, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/modify/moddn.ldif' % remote.data
+ }
+ </call>
+
+
+ <message>
+ 'psearch_modify_blank: delete entry Bidi Bim,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/modify/delete.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ </sequence>
+
+
+ </parallel>
+
+ <message>
+ 'psearch_modify: Check "delete,add,moddn" operations have not been detected'
+ </message>
+
+ <call function="'GetEntry'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'entry' : '%s/core/psearch/modify/modify_blank.out' % remote.data,
+ 'attribute' : 'TYPE'
+ }
+ </call>
+
+ <if expr="RC != 48">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Moddn entries
+ #@TestID Moddn entries
+ #@TestPurpose Verify PSearch with "moddn" option, detect moddn operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "moddn" option, in parallel moddn some entries
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_moddn_1" scope="local">
+
+ <testcase name="getTestCaseName('Moddn entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_moddn: starting the psearch client with "moddn" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "moddn",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/moddn/moddn.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_moddn: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_moddn: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_moddn: moddn entries uid=mreuter, ou=People, dc=example,dc=com \
+ uid=jgoldste, ou=People, dc=example,dc=com \
+ uid=dlanoway, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/moddn/moddn.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ <message>
+ 'psearch_moddn: Check all moddn operations have been successfully detected'
+ </message>
+ <call function="'LdifDiffWithScript'">
+ {
+ 'sourceLdif' : '%s/core/psearch/moddn/moddn.out' % remote.data,
+ 'targetLdif' : '%s/core/psearch/moddn/moddn.ref' % remote.data,
+ 'outputLdif' : '%s/moddn.out' % remote.temp
+ }
+ </call>
+ <if expr="STAXResult != 0">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+ </parallel>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Add-Delete-Modify entries
+ #@TestID Add-Delete-Modify entries
+ #@TestPurpose Verify PSearch with "moddn" option, no detect other operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "moddn" option, in parallel make the following operations add delete modify
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_moddn_2" scope="local">
+
+ <testcase name="getTestCaseName('Add-Delete-Modify entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_moddn_blank: starting the psearch client with "moddn" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "moddn",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/moddn/moddn_blank.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_moddn_blank: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_modify_blank: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_moddn_blank: add entry uid=Bobo Baba,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/moddn/add.ldif' % remote.data
+ }
+ </call>
+
+ <message>
+ 'psearch_moddn_blank: modify entry lrentz, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/moddn/modify.ldif' % remote.data
+ }
+ </call>
+
+
+ <message>
+ 'psearch_moddn_blank: delete entry uid=Bobo Baba,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/moddn/delete.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ </sequence>
+
+
+ </parallel>
+
+ <message>
+ 'psearch_moddn: Check "delete,add,modify" operations have not been detected'
+ </message>
+
+ <call function="'GetEntry'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'entry' : '%s/core/psearch/moddn/moddn_blank.out' % remote.data,
+ 'attribute' : 'TYPE'
+ }
+ </call>
+
+ <if expr="RC != 48">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Add entries
+ #@TestID Add entries
+ #@TestPurpose Verify PSearch with "add" option, detect add operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "add" option, in parallel add some entries
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_add_1" scope="local">
+
+ <testcase name="getTestCaseName('Add entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_add: starting the psearch client with "add" options'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "add",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/add/add.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_add: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_add: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_add: add entries uid=Bil Bo,ou=People,dc=example,dc=com \
+ Blam Blo,ou=People,dc=example,dc=com \
+ Blum Blue,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/add/add.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ <message>
+ 'psearch_add: Check all add operations have been successfully detected'
+ </message>
+ <call function="'LdifDiffWithScript'">
+ {
+ 'sourceLdif' : '%s/core/psearch/add/add.out' % remote.data,
+ 'targetLdif' : '%s/core/psearch/add/add.ref' % remote.data,
+ 'outputLdif' : '%s/add.out' % remote.temp
+ }
+ </call>
+ <if expr="STAXResult != 0">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+ </parallel>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Core PSearch Tests
+ #@TestName Core: PSearch: Moddn-Delete-Modify entries
+ #@TestID Moddn-Delete-Modify entries
+ #@TestPurpose Verify PSearch with "add" option, no detect other operations
+ #@TestPreamble
+ #@TestSteps Start PSearch with "add" option, in parallel make the following operations moddn delete modify
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+
+ <function name="core_psearch_add_2" scope="local">
+
+ <testcase name="getTestCaseName('Moddn-Delete-Modify entries')">
+
+ <try>
+
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <parallel>
+ <sequence>
+
+ <message>
+ 'psearch_add_blank: starting the psearch client with "add" option'
+ </message>
+
+ <call function="'psearch'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'dsBaseDn' : "dc=example,dc=com",
+ 'operation' : "add",
+ 'ldif' : "True",
+ 'outputFile' : '%s/core/psearch/add/add_blank.out' % remote.data
+ }
+ </call>
+ </sequence>
+
+ <sequence>
+
+ <message>
+ 'psearch_add_blank: wait event from psearch'
+ </message>
+
+ <call function="'WaitEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_add_blank: delete event from psearch'
+ </message>
+
+ <call function="'DeleteEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch/Ready'
+ }
+ </call>
+
+ <message>
+ 'psearch_add_blank: modify entry uid=Blam Blo, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/add/modify.ldif' % remote.data
+ }
+ </call>
+
+ <message>
+ 'psearch_add_blank: moodn entry uid=Bil Bo, ou=People, dc=example,dc=com'
+ </message>
+
+ <call function="'ldapModifyWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/add/moddn.ldif' % remote.data
+ }
+ </call>
+
+
+ <message>
+ 'psearch_add_blank: delete entry uid=Blum Blue,ou=People,dc=example,dc=com'
+ </message>
+
+ <call function="'ldapDeleteWithScript'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+ 'dsFilename' : '%s/core/psearch/add/delete.ldif' % remote.data
+ }
+ </call>
+
+ <call function="'SendEvent'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'name' : 'PSearch tests/Completed'
+ }
+ </call>
+
+ </sequence>
+
+
+ </parallel>
+
+ <message>
+ 'psearch_add: Check "delete,moddn,modify" operations have not been detected'
+ </message>
+
+ <call function="'GetEntry'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME ,
+ 'entry' : '%s/core/psearch/add/add_blank.out' % remote.data,
+ 'attribute' : 'TYPE'
+ }
+ </call>
+
+ <if expr="RC != 48">
+ <tcstatus result="'fail'"/>
+ </if>
+
+ </sequence>
+
+ <catch exception="'STAXException.*'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+
+ </try>
+
+ </testcase>
+ </function>
+
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/dsml/dsml_setup.xml b/opends/tests/staf-tests/functional-tests/testcases/dsml/dsml_setup.xml
index 4e66d89..30798ca 100755
--- a/opends/tests/staf-tests/functional-tests/testcases/dsml/dsml_setup.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/dsml/dsml_setup.xml
@@ -103,6 +103,14 @@
'remotehost' : STAXServiceMachine
}
</call>
+ <call function="'copyFile'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME,
+ 'srcfile' : '%s/../../ext/emma/lib/emma.jar' % TESTS_ROOT,
+ 'destfile' : '%s/dsml/STAF-INF/jars/emma.jar' % TMPDIR,
+ 'remotehost' : STAXServiceMachine
+ }
+ </call>
<script>
if is_windows_platform(STAXServiceMachine):
@@ -111,6 +119,7 @@
separator=':'
opendsjar='%s/dsml/STAF-INF/jars/OpenDS.jar' % TMPDIR
+ emmajar='%s/dsml/STAF-INF/jars/emma.jar' % TMPDIR
dsmlclasses='%s/dsml/STAF-INF/classes' % TMPDIR
</script>
@@ -130,8 +139,8 @@
'location' : STAXServiceMachine,
'foldername' : '%s/src' % TESTS_DSML_DIR,
'destfolder' : '%s/dsml/STAF-INF/classes' % TMPDIR,
- 'classpath' : '%s%s%s%s%s' \
- % (opendsjar,separator,dsmlclasses,separator,cp)
+ 'classpath' : '%s%s%s%s%s%s%s' \
+ % (opendsjar,separator,emmajar,separator,dsmlclasses,separator,cp)
}
</call>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml
new file mode 100644
index 0000000..5006314
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml
@@ -0,0 +1,1082 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! 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
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+ <defaultcall function="replication_aci"/>
+
+ <function name="replication_aci">
+
+ <sequence>
+
+ <block name="'aci'">
+
+ <sequence>
+
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group']='aci'
+ CurrentTestPath['suite']=STAXCurrentBlock
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <!--- Test Suite information
+ #@TestSuiteName Replication ACI Tests
+ #@TestSuitePurpose Verify that updates on ACIs are replicated all
+ right and are applied accordingly across the
+ topology.
+ #@TestSuiteID ACI Tests
+ #@TestSuiteGroup ACI
+ #@TestGroup Replication
+ #@TestScript replication_aci.xml
+ #@TestHTMLLink http://opends.dev.java.net/
+ -->
+
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'dataFile' : 'Short_Example.ldif' }
+ </call>
+
+ <script>
+ class Entry:
+ def __init__(self, rdn, suffix):
+ self.userDn = '%s,ou=People,%s' \
+ % (rdn, suffix)
+ self.suffix = suffix
+ self.listAttr = []
+ self.listAttr.append('objectclass:top')
+ self.listAttr.append('objectclass:organizationalperson')
+ self.listAttr.append('objectclass:inetorgperson')
+ self.listAttr.append('objectclass:person')
+ def getDn(self):
+ return self.userDn
+ def getSuffix(self):
+ return self.suffix
+ def getAttrList(self):
+ return self.listAttr
+ def addAttr(self, attrType, attrValue):
+ self.listAttr.append('%s:%s' % (attrType, attrValue))
+ </script>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Add entry with ACI
+ #@TestID Add entry with ACI
+ #@TestPurpose Check ACI replication over an entry add
+ #@TestPreamble
+ #@TestSteps Add entry with ACI: deny self description write
+ #@TestSteps Binding as entry, add givenname to entry
+ (expect SUCCESS)
+ #@TestSteps Binding as entry, add description to entry
+ (expect ERROR 50)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Add entry with ACI')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Add entry with ACI. Check ACI replication \
+ over an entry add.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)"
+ myUserpassword = 'entryPwd'
+
+ myEntry = Entry('cn=ACI entry', synchroSuffix)
+ myEntry.addAttr('sn', 'ACI repl tests')
+ myEntry.addAttr('aci', myAci)
+ myEntry.addAttr('userpassword', myUserpassword)
+ </script>
+
+ <!-- Add entry to "master" server with aci:
+ ! (targetattr="description")(version 3.0; acl
+ ! "Deny Self Description Write"; deny (write)
+ ! userdn="ldap:///self";)
+ -->
+ <message>
+ 'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci)
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nDeny "%s" the access to write its own \
+ description attribute.' % myEntry.getDn()
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myGivenname = 'My own GIVENNAME value %s' % i
+ myDescription = 'My own DESCRIPTION value %s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add givenname %s to entry %s on server \
+ %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myGivenname, myEntry.getDn(),
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'givenname',
+ 'newAttributeValue' : myGivenname,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
+ Rights)' % \
+ (myEntry.getDn(), myDescription, myEntry.getDn(),
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'description',
+ 'newAttributeValue' : myDescription,
+ 'changetype' : 'add',
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_add ACI
+ #@TestID Modify_add ACI
+ #@TestPurpose Check ACI replication over a modify_add
+ #@TestPreamble Add a user entry to suffix
+ #@TestSteps Binding as user, add description to child entry
+ (expect ERROR 50)
+ #@TestSteps Add ACI to parent entry: allow user full access
+ to all description attributes
+ #@TestSteps Binding as user, add description to child entry
+ (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Modify_add ACI')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Modify_add ACI. Check ACI replication \
+ over a modify_add.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
+ mySn = 'ACI repl user'
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+ myEntry.addAttr('sn', mySn)
+ myEntry.addAttr('userpassword', myUserpassword)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ </script>
+
+ <!-- Add user entry to "master" server -->
+ <message>
+ 'Add user entry %s' % myEntry.getDn()
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myDescription = 'He was a serious opium adict - %s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
+ Rights)' % \
+ (myEntry.getDn(), myDescription, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'description',
+ 'newAttributeValue' : myDescription,
+ 'changetype' : 'add',
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Add aci to entry ou=People,o=example on "master" server:
+ ! (targetattr="description")(version 3.0; acl
+ ! "Allow ACI-user access to description"; allow (all)
+ ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
+ -->
+ <message>
+ 'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nAllow "%s" full access to all description \
+ attributes under ou=People,%s.' % \
+ (myEntry.getDn(), synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myDescription = 'He was a serious opium adict - %s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myDescription, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'description',
+ 'newAttributeValue' : myDescription,
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_replace ACI target
+ #@TestID Modify_replace ACI target
+ #@TestPurpose Check ACI replication over a modify_replace of
+ the ACI target
+ #@TestPreamble
+ #@TestSteps Binding as user, add telephonenumber to child
+ entry (expect ERROR 50)
+ #@TestSteps Replace ACI on parent entry: allow user full
+ access to all telephonenumber attributes
+ #@TestSteps Binding as user, add telephonenumber to child
+ entry (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Modify_replace ACI target')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Modify_replace ACI target. Check ACI \
+ replication over a modify_replace of the ACI target.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myTelephonenumber = '221-221-221-%s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add telephonenumber %s to entry %s on \
+ server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
+ Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'telephonenumber',
+ 'newAttributeValue' : myTelephonenumber,
+ 'changetype' : 'add',
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Replace aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Allow ACI-user access to telephonenumber"; allow (all)
+ ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
+ -->
+ <message>
+ 'Replace ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\
+ attributes under ou=People,%s.' % \
+ (myEntry.getDn(), synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myTelephonenumber = '221-221-221-%s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'telephonenumber',
+ 'newAttributeValue' : myTelephonenumber,
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_replace ACI permission
+ #@TestID Modify_replace ACI permission
+ #@TestPurpose Check ACI replication over a modify_replace of
+ the ACI permission
+ #@TestPreamble
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect SUCCESS)
+ #@TestSteps Replace ACI on parent entry: deny user access to
+ telephonenumber attributes
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect ERROR 50)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Modify_replace ACI permission')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Modify_replace ACI permission. Check ACI \
+ replication over a modify_replace of the ACI permission.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Replace aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Deny ACI-user access to telephonenumber"; deny (all)
+ ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
+ -->
+ <message>
+ 'Replace ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nDeny "%s" access to all telephonenumber \
+ attributes under ou=People,%s.' % \
+ (myEntry.getDn(), synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_replace ACI bind rule
+ #@TestID Modify_replace ACI bind rule
+ #@TestPurpose Check ACI replication over a modify_replace of
+ the ACI bind rule
+ #@TestPreamble Add new user entry
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect SUCCESS)
+ #@TestSteps Replace ACI on parent entry: deny users with
+ a given sn access to telephonenumber attributes
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect ERROR 50)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Modify_replace ACI bind rule')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Modify_replace ACI bind rule. Check ACI \
+ replication over a modify_replace of the ACI bind rule.'
+ </message>
+
+ <script>
+ mySn = 'ACI repl user'
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
+ myUserpassword = 'secondUserPwd'
+
+ myEntry = Entry('cn=Second ACI user', synchroSuffix)
+ myEntry.addAttr('sn', mySn)
+ myEntry.addAttr('userpassword', myUserpassword)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <!-- Add user entry to "master" server -->
+ <message>
+ 'Add user entry %s' % myEntry.getDn()
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Replace aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Deny ACI repl users access to telephonenumber"; deny (all)
+ ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
+ -->
+ <message>
+ 'Replace ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nDeny users with (sn=%s) access to all \
+ telephonenumber attributes under ou=People,%s.' % \
+ (mySn, synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Bypass-acl privilege
+ #@TestID Bypass-acl privilege
+ #@TestPurpose Check the bypass-acl privilege is replicated and
+ successfully applied over the topology
+ #@TestPreamble
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect ERROR 50)
+ #@TestSteps Add ds-privilege-name:bypass-acl to new user
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Bypass-acl privilege')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \
+ privilege is replicated and successfully applied over the \
+ topology'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
+ myUserpassword = 'secondUserPwd'
+ myPrivilege = 'bypass-acl'
+
+ myEntry = Entry('cn=Second ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Add bypass-acl privilege to new user entry -->
+ <message>
+ 'Add %s privilege to entry %s: \n' % \
+ (myPrivilege, myEntry.getDn())
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'ds-privilege-name',
+ 'newAttributeValue' : myPrivilege,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <message>
+ '+++ Active ACI +++\nDeny users with (sn=%s) access to all \
+ telephonenumber attributes under ou=People,%s.' % \
+ (mySn, synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_delete ACI
+ #@TestID Modify_delete ACI
+ #@TestPurpose Check ACI replication over a modify_delete
+ #@TestPreamble
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect ERROR 50)
+ #@TestSteps Delete ACI on parent entry
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <testcase name="getTestCaseName('Modify_delete ACI')">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: ACI: Modify_delete ACI. Check ACI \
+ replication over a modify_delete.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Delete aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Deny ACI repl users access to telephonenumber"; deny (all)
+ ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
+ -->
+ <message>
+ 'Delete ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'" />
+
+ <call function="'testSuite_Postamble'"/>
+
+ </sequence>
+
+ </block>
+
+ </sequence>
+
+ </function>
+
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
index a875d7e..1680138 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
@@ -5123,6 +5123,13 @@
indexvar="indx">
<sequence>
<script>
+ if ecl_mode == 'opends':
+ # Issue 4502: ECL: error 53 when searching with cookie older
+ # than updates on several server
+ myKnownIssue = '4502'
+ else:
+ myKnownIssue = None
+
if globalSplitServers:
replServer = _topologyReplServerList[indx]
else:
@@ -5149,7 +5156,8 @@
'dsBaseDN' : 'cn=changelog',
'dsFilter' : '(objectclass=*)',
'changeNumberFilter' : chgNumberFilter,
- 'changelogCookie' : lastCookie
+ 'changelogCookie' : lastCookie,
+ 'knownIssue' : myKnownIssue
}
</call>
<script>
@@ -5960,23 +5968,28 @@
indexvar="indx">
<sequence>
<!-- Disable ECL for synchroSuffix on server -->
+ <script>
+ myOptionString = """--domain-name "%s" --set enabled:false""" \
+ % synchroSuffix
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
<message>
'Disable ECL for suffix %s on server %s:%s' % \
- (synchroSuffix, server.getHostname(), server.getPort())
+ (synchroSuffix, replServer.getHostname(), replServer.getPort())
</message>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myOptionString = """--domain-name "%s" --set enabled:false""" \
- % synchroSuffix
- </script>
<call function="'dsconfig'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstanceAdminPort' : server.getAdminPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
'subcommand' : 'set-external-changelog-domain-prop',
'objectType' : 'provider-name',
'objectName' : 'Multimaster Synchronization',
@@ -6542,23 +6555,28 @@
indexvar="indx">
<sequence>
<!-- Re-enable ECL for synchroSuffix on server -->
+ <script>
+ myOptionString = """--domain-name "%s" --set enabled:true""" \
+ % synchroSuffix
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
<message>
'Re-enable ECL for suffix %s on server %s:%s' % \
- (synchroSuffix, server.getHostname(), server.getPort())
+ (synchroSuffix, replServer.getHostname(), replServer.getPort())
</message>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myOptionString = """--domain-name "%s" --set enabled:true""" \
- % synchroSuffix
- </script>
<call function="'dsconfig'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstanceAdminPort' : server.getAdminPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
'subcommand' : 'set-external-changelog-domain-prop',
'objectType' : 'provider-name',
'objectName' : 'Multimaster Synchronization',
@@ -6967,23 +6985,28 @@
indexvar="indx">
<sequence>
<!-- Disable ECL for synchroSuffix on server -->
+ <script>
+ myOptionString = """--domain-name "%s" --set enabled:false""" \
+ % synchroSuffix
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
<message>
'Disable ECL for suffix %s on server %s:%s' % \
- (synchroSuffix, server.getHostname(), server.getPort())
+ (synchroSuffix, replServer.getHostname(), replServer.getPort())
</message>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myOptionString = """--domain-name "%s" --set enabled:false""" \
- % synchroSuffix
- </script>
<call function="'dsconfig'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstanceAdminPort' : server.getAdminPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
'subcommand' : 'set-external-changelog-domain-prop',
'objectType' : 'provider-name',
'objectName' : 'Multimaster Synchronization',
@@ -7021,23 +7044,28 @@
indexvar="indx">
<sequence>
<!-- Re-enable ECL for synchroSuffix on server -->
+ <script>
+ myOptionString = """--domain-name "%s" --set enabled:true""" \
+ % synchroSuffix
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
<message>
'Re-enable ECL for suffix %s on server %s:%s' % \
- (synchroSuffix, server.getHostname(), server.getPort())
+ (synchroSuffix, replServer.getHostname(), replServer.getPort())
</message>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myOptionString = """--domain-name "%s" --set enabled:true""" \
- % synchroSuffix
- </script>
<call function="'dsconfig'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstanceAdminPort' : server.getAdminPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
'subcommand' : 'set-external-changelog-domain-prop',
'objectType' : 'provider-name',
'objectName' : 'Multimaster Synchronization',
@@ -7285,6 +7313,5355 @@
</testcase>
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Add, single-value include-attr
+ #@TestID Include-Attributes: Add, single-value include-attr
+ #@TestPurpose Verify add operation is recorded properly in the
+ external changelog on each replication server and
+ include-attributes are published
+ #@TestPreamble Read lastExternalChangelogCookie/lastChangenumber
+ #@TestSteps Set include-attribute on server A: sn
+ #@TestSteps Add entry to server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Add, single-value include-attr' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: Add, \
+ single-value include-attr. \
+ Verify add operation is recorded properly in the external \
+ changelog on each replication server and include-attributes are \
+ published' % ecl_mode
+ </message>
+
+ <!-- Read last index from root DSE (lastExternalChangelogCookie /
+ ! lastChangenumber) -->
+ <script>
+ lastIndexAttr = None
+ lastIndexValue = None
+
+ if ecl_mode == 'opends':
+ lastIndexAttr = 'lastexternalchangelogcookie'
+ else:
+ lastIndexAttr = 'lastchangenumber'
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[0]
+ else:
+ replServer = master
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'base',
+ 'dsBaseDN' : ' ',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : lastIndexAttr
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <script>
+ lastIndexValue = None
+ pendingValue = 0
+
+ for line in searchResult.splitlines():
+ notBlank = (len(line.strip()) != 0)
+ if line.strip().lower().startswith(lastIndexAttr):
+ # line corresponds to lastIndexAttr:_lastIndexValue_
+ lastIndexValue = line[line.find(':') + 1:].lstrip()
+ pendingValue = 1
+ elif (notBlank and pendingValue):
+ lastIndexValue += line.lstrip()
+ elif pendingValue:
+ pendingValue = 0
+ break
+
+ if ecl_mode == 'opends':
+ nextIndex = lastIndexValue
+ else:
+ nextChgNumber = int(lastIndexValue) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Last index read from root DSE entry %s attribute: %s' % \
+ (lastIndexAttr, lastIndexValue)
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read root DSE entry from server %s:%s' % \
+ (server.getHostname(), server.getPort())
+ </message>
+ </else>
+ </if>
+
+
+ <!-- Configure include-attributes for synchroSuffix on master -->
+ <script>
+ incAttr = 'sn'
+
+ myOptionString = """--domain-name "%s" --set ecl-include:%s""" \
+ % (synchroSuffix, incAttr)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[0]
+ else:
+ replServer = master
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Set include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttr, synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+
+
+ <!-- Add entry to "master" server -->
+ <script>
+ myEntry = Entry('cn=Inc-SN-1', synchroSuffix)
+ myEntry.addAttr(incAttr, 'Include-Attr')
+
+ addedEntry = None
+ eclEntry = None
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : addOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ addedEntry = STAXResult
+
+ myTargetDN = addedEntry['dn'][0]
+ myChangeType = 'add'
+ myChangeTime = addedEntry['createtimestamp'][0]
+ myTargetEntryUUID = addedEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myChanges = {}
+ myIncAttrs = { incAttr : addedEntry[incAttr] }
+
+ for attr in addedEntry.keys():
+ if (attr != 'dn') and (attr != 'changelogcookie') :
+ myChanges[attr] = addedEntry[attr]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry add -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s' %\
+ (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % \
+ nextIndex
+ </message>
+
+ <if expr="addedEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ addedEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes
+ Add (on peer server), single-value include-attr
+ #@TestID Include-Attributes: Add (on peer server),
+ single-value include-attr
+ #@TestPurpose Verify add operation (on a server other than where
+ the include-attr has been configured) is recorded
+ properly and include-attributes are still published
+ #@TestPreamble
+ #@TestSteps Add entry to server B
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Add (on peer server), single-value include-attr' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include Attributes: Add (on \
+ peer server), single-value include-attr. \
+ Verify add operation (on a server other than where the include-attr\
+ has been configured) is recorded properly and include-attributes \
+ are still published' % ecl_mode
+ </message>
+
+ <!-- Add entry to "consumer" server -->
+ <script>
+ incAttr = 'sn'
+
+ myEntry = Entry('cn=Inc-SN-2', synchroSuffix)
+ myEntry.addAttr(incAttr, 'Include-Attr')
+
+ consumer = _topologyServerList[1]
+ consumerPath = '%s/%s' % (consumer.getDir(), OPENDSNAME)
+
+ addedEntry = None
+ eclEntry = None
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : consumer.getHostname(),
+ 'dsPath' : consumerPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : addOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ addedEntry = STAXResult
+
+ myTargetDN = addedEntry['dn'][0]
+ myChangeType = 'add'
+ myChangeTime = addedEntry['createtimestamp'][0]
+ myTargetEntryUUID = addedEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myChanges = {}
+ myIncAttrs = { incAttr : addedEntry[incAttr] }
+
+ for attr in addedEntry.keys():
+ if (attr != 'dn') and (attr != 'changelogcookie') :
+ myChanges[attr] = addedEntry[attr]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry add -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s' %\
+ (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % \
+ nextIndex
+ </message>
+
+ <!-- We may come across issue CR 6929416:
+ ! ECL: updates done on server don't publish include-attrs
+ ! configured on peer server -->
+ <if expr="addedEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'knownIssue' : '6929416'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ addedEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-attributes:
+ Add, multiple-value include-attr
+ #@TestID Include-attributes: Add, multiple-value include-attr
+ #@TestPurpose Verify add operation is recorded properly in the
+ external changelog on each replication server and
+ newly set include-attributes are published, unlike
+ the old include-attributes, that should no longer
+ be published
+ #@TestPreamble
+ #@TestSteps Set include-attribute on server A: description
+ #@TestSteps Add entry to server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Add, multiple-value include-attr' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: Add, \
+ multiple-value include-attr. \
+ Verify add operation is recorded properly in the external \
+ changelog on each replication server and newly set \
+ include-attributes are published, unlike the old include-attributes\
+ , that should no longer be published' % ecl_mode
+ </message>
+
+
+ <!-- Configure include-attributes for synchroSuffix on master -->
+ <script>
+ incAttr = 'description'
+ oldIncAttr = 'sn'
+
+ myOptionString = """--domain-name "%s" --set ecl-include:%s""" \
+ % (synchroSuffix, incAttr)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[0]
+ else:
+ replServer = master
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Set include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttr, synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+
+
+ <!-- Add entry to "master" server -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+ myEntry.addAttr('sn', 'Include')
+ myEntry.addAttr(incAttr, 'This is my first Include-Attr value')
+ myEntry.addAttr(incAttr, 'This is my second Include-Attr value')
+
+ addedEntry = None
+ eclEntry = None
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : addOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ addedEntry = STAXResult
+
+ myTargetDN = addedEntry['dn'][0]
+ myChangeType = 'add'
+ myChangeTime = addedEntry['createtimestamp'][0]
+ myTargetEntryUUID = addedEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myChanges = {}
+ myIncAttrs = {}
+
+ for attr in addedEntry.keys():
+ if (attr != 'dn') and (attr != 'changelogcookie') :
+ myChanges[attr] = addedEntry[attr]
+
+ for attr in [incAttr, oldIncAttr]:
+ if attr in addedEntry.keys():
+ myIncAttrs[attr] = addedEntry[attr]
+ else:
+ myIncAttrs[attr] = ' '
+
+ # oldIncAttr is no longer configured as an include-attribute, so
+ # expect NO 'target*' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [oldIncAttr]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry add -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s' %\
+ (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % \
+ nextIndex
+ </message>
+
+ <!-- We may come across issue CR 6932197:
+ ! ECL: old ecl-include attributes still published in
+ ! change entries until server restart -->
+ <if expr="addedEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : '6932197'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ addedEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Add, several include-attrs
+ #@TestID Include-Attributes: Add, several include-attrs
+ #@TestPurpose Verify add operation is recorded properly in the
+ external changelog on each replication server and
+ include-attributes are published
+ #@TestPreamble Add include-attribute on server A: uid
+ #@TestSteps Add entry to server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Add, several include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: Add, \
+ several include-attrs. \
+ Verify add operation is recorded properly in the external \
+ changelog on each replication server and include-attributes are \
+ published' % ecl_mode
+ </message>
+
+
+ <!-- Configure include-attributes for synchroSuffix on master -->
+ <!-- 'description' has already been set as include-attribute, so
+ ! only need to add 'uid'.
+ -->
+ <script>
+ incAttrs = ['uid', 'description']
+
+ myOptionString = """--domain-name "%s" --add ecl-include:%s""" \
+ % (synchroSuffix, incAttrs[0])
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[0]
+ else:
+ replServer = master
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Add include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttrs[0], synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+
+
+ <!-- Add entry to "master" server -->
+ <script>
+ myEntry = Entry('cn=Inc-UID-DESCRIPTION', synchroSuffix)
+ myEntry.addAttr('sn', 'Include')
+ myEntry.addAttr(incAttrs[0], 'Include-Attr value')
+ myEntry.addAttr(incAttrs[1], 'This is my first Include-Attr value')
+ myEntry.addAttr(incAttrs[1], 'This is my second Include-Attr value')
+
+ addedEntry = None
+ eclEntry = None
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : addOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ addedEntry = STAXResult
+
+ myTargetDN = addedEntry['dn'][0]
+ myChangeType = 'add'
+ myChangeTime = addedEntry['createtimestamp'][0]
+ myTargetEntryUUID = addedEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myChanges = {}
+ myIncAttrs = {}
+
+ for attr in addedEntry.keys():
+ if (attr != 'dn') and (attr != 'changelogcookie') :
+ myChanges[attr] = addedEntry[attr]
+
+ for incAttr in incAttrs:
+ if incAttr in addedEntry.keys():
+ myIncAttrs[incAttr] = addedEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry add -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s' %\
+ (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % \
+ nextIndex
+ </message>
+
+ <if expr="addedEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ addedEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Add to unconfigured suffix
+ #@TestID Include-Attributes: Add to unconfigured suffix
+ #@TestPurpose Verify add operation is recorded properly in the
+ external changelog but include-attributes are NOT
+ published
+ #@TestPreamble
+ #@TestSteps Add entry to unconfigured suffix
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Add to unconfigured suffix' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-attributes: Add to \
+ unconfigured suffix. \
+ Verify add operation is recorded properly in the external \
+ changelog obut include-attributes are NOT published' % ecl_mode
+ </message>
+
+
+ <!-- ['uid','description'} have already been set as include-attrs -->
+ <script>
+ incAttrs = ['uid', 'description']
+
+ newReplSuffix = 'o=new_suffix_repl'
+ </script>
+
+ <!-- Add entry to "master" server -->
+ <script>
+ myEntry = Entry('cn=Inc-Unconfigured', newReplSuffix)
+ myEntry.addAttr('sn', 'Unconfigured')
+ myEntry.addAttr(incAttrs[0], 'Include-Unconfigured')
+ myEntry.addAttr(incAttrs[1], 'This is my first Include-Attr value')
+ myEntry.addAttr(incAttrs[1], 'This is my second Include-Attr value')
+
+ addedEntry = None
+ eclEntry = None
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, newReplSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : addOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ addedEntry = STAXResult
+
+ myTargetDN = addedEntry['dn'][0]
+ myChangeType = 'add'
+ myChangeTime = addedEntry['createtimestamp'][0]
+ myTargetEntryUUID = addedEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myChanges = {}
+ myIncAttrs = {}
+
+ # No include-attr configured for newReplSuffix, so expect NO
+ # include-attr to be present in the changelog entry
+ myMissingIncAttrs = incAttrs
+
+ for attr in addedEntry.keys():
+ if (attr != 'dn') and (attr != 'changelogcookie') :
+ myChanges[attr] = addedEntry[attr]
+
+ for incAttr in incAttrs:
+ if incAttr in addedEntry.keys():
+ myIncAttrs[incAttr] = addedEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry add -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s' %\
+ (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % \
+ nextIndex
+ </message>
+
+ <if expr="addedEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ addedEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Add, different include-attr per server
+ #@TestID Include-Attributes: Add, different include-attr per
+ server
+ #@TestPurpose Verify add operation is recorded properly in the
+ external changelog and ALL configured
+ include-attributes are published
+ #@TestPreamble Read lastExternalChangelogCookie/lastChangenumber
+ #@TestSteps Set include-attribute on server A: givenname
+ #@TestSteps Set include-attribute on server B: l
+ #@TestSteps Add entry to server A
+ #@TestSteps Add entry to server B
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Add, different include-attr per server' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: Add, \
+ different include-attr per server. \
+ Verify add operation is recorded properly in the external \
+ changelog and ALL configured include-attributes are published' \
+ % ecl_mode
+ </message>
+
+
+ <script>
+ incAttrs = ['givenname', 'l']
+ </script>
+
+ <iterate var="incAttr"
+ in="incAttrs"
+ indexvar="indx">
+ <sequence>
+ <!-- Configure include-attributes for synchroSuffix on server -->
+ <script>
+ myOptionString = """--domain-name "%s" --set ecl-include:%s""" \
+ % (synchroSuffix, incAttr)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = _topologyServerList[indx]
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Set include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttr, synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+
+ <!-- Add entries to servers -->
+ <script>
+ myEntries = []
+
+ myEntry = Entry('cn=INCLUDE-1', synchroSuffix)
+ myEntry.addAttr('sn', 'Multi-server Include-Attrs')
+ for incAttr in incAttrs:
+ myEntry.addAttr(incAttr, 'INC-ATTR %s-1' % incAttr)
+ myEntries.append(myEntry)
+
+ myEntry = Entry('cn=INCLUDE-2', synchroSuffix)
+ myEntry.addAttr('sn', 'Multi-server Include-Attrs')
+ for incAttr in incAttrs:
+ myEntry.addAttr(incAttr, 'INC-ATTR %s-2' % incAttr)
+ myEntries.append(myEntry)
+
+ addedEntries = []
+ eclEntries = []
+ </script>
+ <iterate var="myEntry"
+ in="myEntries"
+ indexvar="indx">
+ <sequence>
+ <script>
+ serverIndex = indx % len(_topologyServerList)
+
+ server = _topologyServerList[serverIndex]
+ </script>
+ <message>
+ 'Adding entry %s to server %s:%s)' % \
+ (myEntry.getDn(), server.getHostname(), server.getPort())
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'sn=Multi-server Include-Attrs',
+ 'dsAttributes' : addOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'These are the entries as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+
+ <call function="'parseLdifEntries'">
+ { 'ldifEntries' : searchResult }
+ </call>
+ <script>
+ addedEntries = STAXResult
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entries from server %s:%s' % \
+ (masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry add -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'These are the ECL entries as read from server %s:%s: \n%s' \
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntries'">
+ { 'ldifEntries' : searchResult }
+ </call>
+ <script>
+ eclEntries = STAXResult
+ </script>
+
+ <if expr="len(addedEntries) != len(eclEntries)">
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Number of added entries %s does not match number of ECL \
+ entries %s' % (len(addedEntries), len(eclEntries))
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </if>
+
+ <iterate var="eclEntry"
+ in="eclEntries"
+ indexvar="i">
+ <sequence>
+
+ <script>
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+
+ addedEntry = addedEntries[i]
+ myTargetDN = addedEntry['dn'][0]
+ myChangeType = 'add'
+ myChangeTime = addedEntry['createtimestamp'][0]
+ myTargetEntryUUID = addedEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myChanges = {}
+ myIncAttrs = {}
+
+ for attr in addedEntry.keys():
+ if (attr != 'dn') and (attr != 'changelogcookie') :
+ myChanges[attr] = addedEntry[attr]
+
+ for incAttr in incAttrs:
+ if incAttr in addedEntry.keys():
+ myIncAttrs[incAttr] = addedEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+
+ if ecl_mode != 'opends':
+ myIntChangeNumber = int(searchIndex) + i
+ myChangeNumber = str(myIntChangeNumber)
+ else:
+ myChangeNumber = None
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue CR 6929416:
+ ! ECL: updates done on server don't publish
+ ! include-attrs configured on peer server -->
+ <if expr="addedEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'knownIssue' : '6929416'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ </iterate>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ addedEntries = []
+ addedEntry = None
+ eclEntries = []
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_add, attribute NOT in include-attrs
+ #@TestID Include-Attributes: Modify_add, attribute NOT in
+ include-attrs
+ #@TestPurpose Verify modify-add operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble Set include-attribute: 'description'
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_add, attribute NOT in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_add, attribute NOT in include-attrs. \
+ Verify modify-add operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Include
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttr = 'description'
+ myIncAttrs = {}
+
+ addAttr = 'postaladdress'
+ addValue = 'Includeland'
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <!-- Configure include-attributes for synchroSuffix on server -->
+ <script>
+ myOptionString = """--domain-name "%s" --set ecl-include:%s""" \
+ % (synchroSuffix, incAttr)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Set include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttr, synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : incAttr
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ myIncAttrs = { incAttr : stubEntry[incAttr] }
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+
+ <!-- Modify entry on one of the servers:
+ ! add: postaladdress
+ ! postaladdress: Includeland
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : addAttr,
+ 'newAttributeValue' : addValue,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['add', addAttr, addValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issues:
+ ! CR 6929429: ECL: include-attributes not published unless
+ ! directly concerned by modify operation
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'knownIssue' : ['6929429', '6939312']
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_add, multiple-value attribute in include-attrs
+ #@TestID Include-Attributes: Modify_add, multiple-value
+ attribute in include-attrs
+ #@TestPurpose Verify modify-add operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_add, multiple-value attribute in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_add, multiple-value attribute in include-attrs. \
+ Verify modify-add operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Include
+ ! postaladdress: Includeland
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ !
+ ! There is already an include-attribute configured: 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttr = 'description'
+ myIncAttrs = {}
+
+ addAttr = 'description'
+ addValue = 'This is my third Include-Attr value'
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : incAttr
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ myIncAttrs = { incAttr : stubEntry[incAttr] }
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! add: description
+ ! description: This is my third Include-Attr value
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : addAttr,
+ 'newAttributeValue' : addValue,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['add', addAttr, addValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'knownIssue' : '6939312'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_add, single-value attribute in include-attrs
+ #@TestID Include-Attributes: Modify_add, single-value
+ attribute in include-attrs
+ #@TestPurpose Verify modify-add operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble Add include-attribute: 'employeenumber'
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_add, single-value attribute in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_add, single-value attribute in include-attrs. \
+ Verify modify-add operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Include
+ ! postaladdress: Includeland
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ ! description: This is my third Include-Attr value
+ !
+ ! There is already an include-attribute configured: 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttrs = ['employeenumber', 'description']
+ myIncAttrs = {}
+
+ addAttr = 'employeenumber'
+ addValue = '12345'
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Configure include-attributes for synchroSuffix on master -->
+ <!-- 'description' has already been set as include-attribute, so
+ ! only need to add 'employeenumber'.
+ -->
+ <script>
+ myOptionString = """--domain-name "%s" --add ecl-include:%s""" \
+ % (synchroSuffix, incAttrs[0])
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[0]
+ else:
+ replServer = master
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Add include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttrs[0], synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs)
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! add: employeenumber
+ ! employeenumber: 12345
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : addAttr,
+ 'newAttributeValue' : addValue,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['add', addAttr, addValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttrs[0]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : '6939312'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_delete, attribute NOT in include-attrs
+ #@TestID Include-Attributes: Modify_delete, attribute NOT in
+ include-attrs
+ #@TestPurpose Verify modify-delete operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_delete, attribute NOT in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_delete, attribute NOT in include-attrs. \
+ Verify modify-delete operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Include
+ ! postaladdress: Includeland
+ ! employeenumber: 12345
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ ! description: This is my third Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttrs = ['employeenumber', 'description']
+ myIncAttrs = {}
+
+ delAttr = 'postaladdress'
+ delValue = None
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs + [delAttr])
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ delValue = stubEntry[delAttr][0]
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! delete: postaladdress
+ ! postaladdress: Includeland
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : delAttr,
+ 'newAttributeValue' : delValue,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['delete', delAttr, delValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6929429: ECL: include-attributes not published unless
+ ! directly concerned by modify operation
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'knownIssue' : ['6929429', '6939312']
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_delete, attribute in include-attrs
+ #@TestID Include-Attributes: Modify_delete, attribute in
+ include-attrs
+ #@TestPurpose Verify modify-delete operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_delete, attribute in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_delete, attribute in include-attrs. \
+ Verify modify-delete operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Include
+ ! employeenumber: 12345
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ ! description: This is my third Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttrs = ['employeenumber', 'description']
+ myIncAttrs = {}
+
+ delAttr = 'employeenumber'
+ delValue = None
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs + [delAttr])
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ delValue = stubEntry[delAttr][0]
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! delete: employeenumber
+ ! employeenumber: 12345
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : delAttr,
+ 'newAttributeValue' : delValue,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['delete', delAttr, delValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'knownIssue' : '6939312'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_replace, attribute NOT in include-attrs
+ #@TestID Include-Attributes: Modify_replace, attribute NOT in
+ include-attrs
+ #@TestPurpose Verify modify-replace operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_replace, attribute NOT in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_replace, attribute NOT in include-attrs. \
+ Verify modify-replace operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Include
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ ! description: This is my third Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttrs = ['employeenumber', 'description']
+ myIncAttrs = {}
+
+ replAttr = 'sn'
+ replValue = 'Replaced Include'
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs)
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! replace: sn
+ ! sn: Replaced Include
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : replAttr,
+ 'newAttributeValue' : replValue,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['replace', replAttr, replValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttr[0]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issues:
+ ! CR 6929429: ECL: include-attributes not published unless
+ ! directly concerned by modify operation
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : ['6929429', '6939312']
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modify_replace, attribute in include-attrs
+ #@TestID Include-Attributes: Modify_replace, attribute in
+ include-attrs
+ #@TestPurpose Verify modify-replace operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modify entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modify_replace, attribute in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modify_replace, attribute in include-attrs. \
+ Verify modify-replace operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Inc-DESCRIPTION
+ ! sn: Replaced Include
+ ! description: This is my first Include-Attr value
+ ! description: This is my second Include-Attr value
+ ! description: This is my third Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttrs = ['employeenumber', 'description']
+ myIncAttrs = {}
+
+ replAttr = 'description'
+ replValue = 'This is my only Include-Attr value'
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs)
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! replace: description
+ ! description: This is my only Include-Attr value
+ -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : replAttr,
+ 'newAttributeValue' : replValue,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = modEntry['dn'][0]
+ myChangeType = 'modify'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myModifiersName = modEntry['modifiersname'][0]
+ myModifyTimestamp = modEntry['modifytimestamp'][0]
+ myChanges = []
+ myChanges.append(['replace', replAttr, replValue])
+ myChanges.append(['replace', 'modifiersname', myModifiersName])
+ myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp])
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttrs[0]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read modified entry %s from server %s:%s' % \
+ (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'changes' : myChanges,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : '6939312'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modrdn_deleteoldrdn_true, rdn NOT in include-attrs
+ #@TestID Include-Attributes: Modrdn_deleteoldrdn_true, rdn
+ NOT in include-attrs
+ #@TestPurpose Verify modrdn operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modrdn entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modrdn_deleteoldrdn_true, rdn NOT in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modrdn_deleteoldrdn_true, rdn NOT in include-attrs. \
+ Verify modrdn operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Inc-DESCRIPTION, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! sn: Replaced Include
+ ! description: This is my only Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Inc-DESCRIPTION', synchroSuffix)
+
+ incAttrs = ['employeenumber', 'description']
+ myIncAttrs = {}
+
+ oldEntry = myEntry
+ newRdn = 'cn=Renamed-Include-Attr-Entry'
+ newEntry = Entry(newRdn, synchroSuffix)
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs)
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! newrdn: cn=Renamed-Include-Attr-Entry
+ ! deleteoldrdn: true
+ -->
+ <call function="'modifyDn'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : oldEntry.getDn(),
+ 'newRDN' : newRdn
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : newEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = oldEntry.getDn()
+ myChangeType = 'modrdn'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myNewRDN = newRdn
+ myDeleteOldRDN = 'true'
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttrs[0]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issues:
+ ! CR 6929429: ECL: include-attributes not published unless
+ ! directly concerned by modify operation
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'newRDN' : myNewRDN,
+ 'deleteOldRDN' : myDeleteOldRDN,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : ['6929429', '6939312']
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Modrdn_deleteoldrdn_true, rdn in include-attrs
+ #@TestID Include-Attributes: Modrdn_deleteoldrdn_true, rdn
+ in include-attrs
+ #@TestPurpose Verify modrdn operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble Add include-attribute: 'cn'
+ #@TestSteps Modrdn entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Modrdn_deleteoldrdn_true, rdn in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Modrdn_deleteoldrdn_true, rdn in include-attrs. \
+ Verify modrdn operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Renamed-Include-Attr-Entry, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: Renamed-Include-Attr-Entry
+ ! sn: Replaced Include
+ ! description: This is my only Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Renamed-Include-Attr-Entry', synchroSuffix)
+
+ incAttrs = ['cn', 'employeenumber', 'description']
+ myIncAttrs = {}
+
+ oldEntry = myEntry
+ newRdn = 'cn=NEW-Renamed-Include-Attr-Entry'
+ newEntry = Entry(newRdn, synchroSuffix)
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Configure include-attributes for synchroSuffix on master -->
+ <!-- Add 'cn' to the existing: 'employeenumber' and 'description'.
+ -->
+ <script>
+ myOptionString = """--domain-name "%s" --add ecl-include:%s""" \
+ % (synchroSuffix, incAttrs[0])
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[0]
+ else:
+ replServer = master
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+ <message>
+ 'Add include-attribute %s for suffix %s on server %s:%s' \
+ % (incAttrs[0], synchroSuffix, replServer.getHostname(),
+ replServer.getPort())
+ </message>
+ <call function="'dsconfig'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'subcommand' : 'set-external-changelog-domain-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : 'Multimaster Synchronization',
+ 'optionsString' : myOptionString
+ }
+ </call>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs)
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! newrdn: cn=NEW-Renamed-Include-Attr-Entry
+ ! deleteoldrdn: true
+ -->
+ <call function="'modifyDn'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : oldEntry.getDn(),
+ 'newRDN' : newRdn
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : newEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = oldEntry.getDn()
+ myChangeType = 'modrdn'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myNewRDN = newRdn
+ myDeleteOldRDN = 'true'
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttrs[1]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'newRDN' : myNewRDN,
+ 'deleteOldRDN' : myDeleteOldRDN,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : '6939312'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Moddn_deleteoldrdn_false, rdn in include-attrs
+ #@TestID Include-Attributes: Moddn_deleteoldrdn_false, rdn
+ in include-attrs
+ #@TestPurpose Verify moddn operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Modddn entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Moddn_deleteoldrdn_false, rdn in include-attrs' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: \
+ Moddn_deleteoldrdn_false, rdn in include-attrs. \
+ Verify moddn operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=NEW-Renamed-Include-Attr-Entry, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: NEW-Renamed-Include-Attr-Entry
+ ! sn: Replaced Include
+ ! description: This is my only Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'cn', 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=NEW-Renamed-Include-Attr-Entry', synchroSuffix)
+
+ incAttrs = ['cn', 'employeenumber', 'description']
+ myIncAttrs = {}
+
+ oldEntry = myEntry
+ newRdn = 'cn=Moved-Include-Attr-Entry'
+ newSuperior = 'cn=entry,ou=People,%s' % synchroSuffix
+ newEntry = Entry('%s,cn=entry' % newRdn, synchroSuffix)
+
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry's include-attribute's information prior to modify
+ ! for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : ' '.join(incAttrs)
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ stubEntry = STAXResult
+
+ for incAttr in incAttrs:
+ if incAttr in stubEntry.keys():
+ myIncAttrs[incAttr] = stubEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Modify entry on one of the servers:
+ ! newrdn: cn=Moved-Include-Attr-Entry
+ ! newSuperior: ou=People,o=new_suffix_repl
+ ! deleteoldrdn: false
+ -->
+ <call function="'modifyDn'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : oldEntry.getDn(),
+ 'newRDN' : newRdn,
+ 'newSuperior' : newSuperior,
+ 'deleteOldRDN' : 0
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : newEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ modEntry = STAXResult
+
+ myTargetDN = oldEntry.getDn()
+ myChangeType = 'modrdn'
+ myChangeTime = modEntry['modifytimestamp'][0]
+ myTargetEntryUUID = modEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+ myNewRDN = newRdn
+ myNewSuperior = newSuperior
+ myDeleteOldRDN = 'false'
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttrs[1]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue:
+ ! CR 6939312: ECL: after entry ADDs, include attributes not
+ ! published for MODIFY operations
+ -->
+ <if expr="modEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'changeTime' : myChangeTime,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'newRDN' : myNewRDN,
+ 'newSuperior' : myNewSuperior,
+ 'deleteOldRDN' : myDeleteOldRDN,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : '6939312'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ modEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication External Changelog Tests
+ #@TestName Replication: External Changelog: Include-Attributes:
+ Delete
+ #@TestID Include-Attributes: Delete
+ #@TestPurpose Verify delete operation is recorded properly
+ in the external changelog and include-attributes are
+ published
+ #@TestPreamble
+ #@TestSteps Delete entry on server A
+ #@TestSteps Verify servers in sync
+ #@TestSteps Read entry from ldap server
+ #@TestSteps Read last changelog entry on each repl server
+ #@TestSteps Check changelog entry against expected values
+ #@TestPostamble
+ #@TestResult Success if the server synchronised and the
+ changelog entry value check succeeds
+ -->
+ <testcase name="getTestCaseName('%s - Include-Attributes: Delete' % ecl_mode)">
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Replication: External Changelog: %s - Include-Attributes: Delete. \
+ Verify delete operation is recorded properly in the \
+ external changelog and include-attributes are published' % ecl_mode
+ </message>
+
+ <!-- We will use the entry added in a previous testcase:
+ ! dn: cn=Moved-Include-Attr-Entry, cn=entry, ou=People, o=example
+ ! objectclass: top
+ ! objectclass: person
+ ! objectclass: organizationalperson
+ ! objectclass: inetorgperson
+ ! cn: NEW-Renamed-Include-Attr-Entry
+ ! cn: Moved-Include-Attr-Entry
+ ! sn: Replaced Include
+ ! description: This is my only Include-Attr value
+ !
+ ! There are already include-attributes configured:
+ ! 'cn', 'employeenumber', 'description'
+ -->
+ <script>
+ myEntry = Entry('cn=Moved-Include-Attr-Entry,cn=entry',
+ synchroSuffix)
+
+ incAttrs = ['cn', 'employeenumber', 'description']
+ myIncAttrs = {}
+
+ delEntry = None
+ eclEntry = None
+ </script>
+
+ <!-- Retrieve entry information for checkChangelogEntry's sake -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : modOperationalAttrs
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the entry as read from server %s:%s: \n%s' % \
+ (masterHost, master.getPort(), searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ delEntry = STAXResult
+
+ myTargetDN = delEntry['dn'][0]
+ myChangeType = 'delete'
+ myTargetEntryUUID = delEntry['entryuuid'][0]
+ # myReplicationCSN = ----> grab from where???
+ # myReplicatIdentifier = ----> grab from ldap server
+
+ for incAttr in incAttrs:
+ if incAttr in delEntry.keys():
+ myIncAttrs[incAttr] = delEntry[incAttr]
+ else:
+ myIncAttrs[incAttr] = ' '
+
+ # 'employeenumber' contained no value prior to the modify op, so
+ # expect NO 'targetemployeenumber' include-attr to be present
+ # in the changelog entry
+ myMissingIncAttrs = [incAttrs[1]]
+
+ if ecl_mode != 'opends':
+ myChangeNumber = searchIndex
+ else:
+ myChangeNumber = None
+ </script>
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read added entry %s from server %s:%s' % \
+ (newEntry.getDn(), masterHost, master.getPort())
+ </message>
+ </else>
+ </if>
+
+ <!-- Delete entry on one of the servers -->
+ <call function="'DeleteEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn()
+ }
+ </call>
+
+ <!-- Check delete worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ <script>
+ if ecl_mode == 'opends':
+ lastCookie = searchIndex
+ chgNumberFilter = None
+ else:
+ lastCookie = None
+ chgNumberFilter = """(changenumber>=%s)""" % searchIndex
+ </script>
+
+ <!-- Search changelog in the various replication servers -->
+ <iterate var="server"
+ in="_topologyServerList"
+ indexvar="indx">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[indx]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Reading changelog in replication server %s:%s from index: \
+ %s' % \
+ (replServer.getHostname(), replServer.getPort(), searchIndex)
+ </message>
+
+ <!-- Search for entry modify -->
+ <call function="'SearchExternalChangelog'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsScope' : 'subordinate',
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(objectclass=*)',
+ 'changeNumberFilter' : chgNumberFilter,
+ 'changelogCookie' : lastCookie
+ }
+ </call>
+ <script>
+ searchRC = RC
+ searchResult = STAXResult[0][1]
+ </script>
+ <if expr="searchRC == 0">
+ <sequence>
+ <message>
+ 'This is the ECL entry as read from server %s:%s: \n%s'\
+ % (replServer.getHostname(), replServer.getPort(),
+ searchResult)
+ </message>
+ <call function="'parseLdifEntry'">
+ { 'ldifEntry' : searchResult }
+ </call>
+ <script>
+ eclEntry = STAXResult
+
+ if ecl_mode == 'opends':
+ nextIndex = eclEntry['changelogcookie'][0]
+ else:
+ nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+ nextIndex = str(nextChgNumber)
+ </script>
+ <message>
+ 'Parsed changelog entry: \n%s' % eclEntry
+ </message>
+ <message>
+ 'Index to use for the next ECL search: %s' % nextIndex
+ </message>
+
+ <!-- We may come across issue CR 6929429:
+ ! ECL: include-attributes not published unless directly
+ ! concerned by modify operation -->
+ <if expr="delEntry and eclEntry">
+ <call function="'checkChangelogEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'changelogEntry' : eclEntry,
+ 'targetDN' : myTargetDN,
+ 'changeNumber' : myChangeNumber,
+ 'changeType' : myChangeType,
+ 'targetEntryUUID' : myTargetEntryUUID,
+ 'includeAttrs' : myIncAttrs,
+ 'expectMissingIncAttrs' : myMissingIncAttrs,
+ 'knownIssue' : '6929429'
+ }
+ </call>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Unable to check external changelog entry \
+ (failed to read LDAP and/or changelog entry)'
+ </message>
+ <call function="'testFailed'"/>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ <else>
+ <message log="1" level="'Error'">
+ 'Could not read changelog on replication server %s:%s' \
+ % (replServer.getHostname(), replServer.getPort())
+ </message>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+
+ <script>
+ # set the index for the next ECL search
+ if nextIndex:
+ searchIndex = nextIndex
+ nextIndex = None
+
+ # reset variables, just in case
+ delEntry = None
+ eclEntry = None
+ </script>
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
<!--- Test Case information
#@TestMarker Replication External Changelog Tests
#@TestName Replication: External Changelog: Clean up
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/replication.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/replication.xml
index 56671cf..ac6e2ee 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/replication.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/replication.xml
@@ -23,7 +23,7 @@
!
! CDDL HEADER END
!
- ! Copyright 2007-2009 Sun Microsystems, Inc.
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
! -->
<stax>
<defaultcall function="main_replication"/>
@@ -62,6 +62,7 @@
suiteList.append('changelog')
suiteList.append('conflict')
suiteList.append('externalchangelog')
+ suiteList.append('aci')
globalAssuredReplication = None
diff --git a/opends/tests/staf-tests/shared/ant/build.properties b/opends/tests/staf-tests/shared/ant/build.properties
index e68cff6..f9f0f0e 100644
--- a/opends/tests/staf-tests/shared/ant/build.properties
+++ b/opends/tests/staf-tests/shared/ant/build.properties
@@ -111,8 +111,8 @@
ldclt.dir=
temp.dir=/tmp
test.plan.custom=
-test.plan.functional.default=aci,backends,clu,core,dsconfig,dsml,groups,i18n,indexes,logging,monitoring,plugins,privileges,replication,schema,security,setup,snmp,tasks,virtualAttributes,fractional-replication
-test.plan.stress.default=ldap_operation,import_ldif
+test.plan.functional.default=aci,backends,clu,clu_secure,core,dsconfig,dsml,fractional-replication,groups,i18n,indexes,logging,monitoring,plugins,privileges,replication,schema,security,setup,snmp,tasks,virtualAttributes,replication-safe-data,replication-safe-read
+test.plan.stress.default=import_ldif,ldap_operation,replication
verbose.mode=false
product.name=OpenDS Directory Server
diff --git a/opends/tests/staf-tests/shared/ant/tests.xml b/opends/tests/staf-tests/shared/ant/tests.xml
index a663dbf..27330d6 100644
--- a/opends/tests/staf-tests/shared/ant/tests.xml
+++ b/opends/tests/staf-tests/shared/ant/tests.xml
@@ -112,7 +112,7 @@
<property name="tests.request" value="EXECUTE FILE ${tests.xml} JOBNAME OpenDS_${tests.type} SCRIPTFILE ${tests.run.dir}/${tests.run.time}/config/${tests.config.file} WAIT CLEARLOGS"/>
<echo>While the tests are running you may tail the job logs at</echo>
- <echo>${staf.install.dir}/${staf.name}/logs/MACHINE/${host.name}</echo>
+ <echo>${staf.install.dir}/${staf.name}/data-${host.name}/service/log/MACHINE/${host.name}/GLOBAL</echo>
<echo>Running tests. This will take more than a while.</echo>
<property name="CLASSPATH" value="${staf.lib.dir}/JSTAF.jar:."/>
<exec
@@ -126,9 +126,9 @@
<env key="STAFCODEPAGE" value="LATIN_1"/>
</exec>
- <symlink link="${tests.run.dir}/latest" resource="${tests.run.time}" overwrite="true"/>
+ <symlink link="${tests.run.dir}/${remote.hostname}-latest" resource="${tests.run.time}" overwrite="true"/>
<echo>Report is available at</echo>
- <echo>${tests.run.dir}/latest</echo>
+ <echo>${tests.run.dir}/${remote.hostname}-latest</echo>
</target>
<target name="configure">
@@ -398,28 +398,35 @@
</target>
<target name="coverage-instrument" if="coverage.on">
<delete dir="${tests.tmp.dir}/coverage-instr" />
- <mkdir dir="${tests.tmp.dir}/coverage-instr" />
+ <mkdir dir="${tests.tmp.dir}/coverage-instr/opends" />
+ <mkdir dir="${tests.tmp.dir}/coverage-instr/dsml" />
<!-- unzip the original package in a temporary location to make the
changes necessary so that the coverage tool is called
-->
<unzip src="${opends.dir}/${opends.name}.zip"
- dest="${tests.tmp.dir}/coverage-instr"/>
+ dest="${tests.tmp.dir}/coverage-instr/opends"/>
+
+ <unzip src="${opends.dir}/${opends.name}-DSML.war"
+ dest="${tests.tmp.dir}/coverage-instr/dsml"/>
<!-- Add emma in the package along with the other librairies
this has the advantage of being automatically picked up by the scripts
-->
<copy file="${project.home}/ext/emma/lib/emma.jar"
- tofile="${tests.tmp.dir}/coverage-instr/${opends.name}/lib/emma.jar"/>
+ tofile="${tests.tmp.dir}/coverage-instr/opends/${opends.name}/lib/emma.jar"/>
+ <copy file="${project.home}/ext/emma/lib/emma.jar"
+ tofile="${tests.tmp.dir}/coverage-instr/dsml/WEB-INF/lib/emma.jar"/>
<!-- move the original product package to make room for the coverage
enabled package
-->
<move file="${opends.dir}/${opends.name}.zip" tofile="${opends.dir}/${opends.name}.zip.nocov"/>
+ <move file="${opends.dir}/${opends.name}-DSML.war" tofile="${opends.dir}/${opends.name}-DSML.war.nocov"/>
<!-- intrument the OpenDS java archive to gather coverage -->
- <java classpath="${tests.tmp.dir}/coverage-instr/${opends.name}/lib/emma.jar"
+ <java classpath="${tests.tmp.dir}/coverage-instr/opends/${opends.name}/lib/emma.jar"
classname="emma" fork="true">
- <jvmarg value="-Demma.metadata.out.file=${tests.tmp.dir}/coverage-instr/${opends.name}/coverage.em" />
+ <jvmarg value="-Demma.metadata.out.file=${tests.tmp.dir}/coverage-instr/opends/${opends.name}/coverage.em" />
<arg value="instr" />
<arg value="-m" />
<arg value="overwrite" />
@@ -432,20 +439,46 @@
<arg value="-ix" />
<arg value="com.*" />
<arg value="-ip" />
- <arg value="${tests.tmp.dir}/coverage-instr/${opends.name}/lib/OpenDS.jar:${tests.tmp.dir}/coverage-instr/${opends.name}/lib/extensions/snmp-mib2605.jar" />
+ <arg value="${tests.tmp.dir}/coverage-instr/opends/${opends.name}/lib/OpenDS.jar:${tests.tmp.dir}/coverage-instr/opends/${opends.name}/lib/extensions/snmp-mib2605.jar" />
</java>
- <!-- Repackage the product with coverage enabled scripts -->
- <zip basedir="${tests.tmp.dir}/coverage-instr" destfile="${opends.dir}/${opends.name}.zip">
- <zipfileset dir="${tests.tmp.dir}/coverage-instr"
+ <java classpath="${tests.tmp.dir}/coverage-instr/dsml/WEB-INF/lib/emma.jar"
+ classname="emma" fork="true">
+ <jvmarg value="-Demma.metadata.out.file=${tests.tmp.dir}/coverage-instr/dsml/WEB-INF/lib/coverage.em" />
+ <arg value="instr" />
+ <arg value="-m" />
+ <arg value="overwrite" />
+ <arg value="-ix" />
+ <arg value="-org.opends.guitools.*" />
+ <arg value="-ix" />
+ <arg value="-org.opends.quicksetup.*" />
+ <arg value="-ix" />
+ <arg value="org.*" />
+ <arg value="-ix" />
+ <arg value="com.*" />
+ <arg value="-ip" />
+ <arg value="${tests.tmp.dir}/coverage-instr/dsml/WEB-INF/classes" />
+ </java>
+ <!-- Repackage OpenDS the product with coverage enabled scripts -->
+ <zip basedir="${tests.tmp.dir}/coverage-instr/opends" destfile="${opends.dir}/${opends.name}.zip">
+ <zipfileset dir="${tests.tmp.dir}/coverage-instr/opends"
includes="${opends.name}/setup,${opends.name}/uninstall,${opends.name}/upgrade,${opends.name}/bin/*,${opends.name}/lib/*.sh"
filemode="755" dirmode="755" />
</zip>
+
+ <!-- Repackage DSML Gateway the product with coverage enabled scripts -->
+ <zip basedir="${tests.tmp.dir}/coverage-instr/dsml" destfile="${opends.dir}/${opends.name}-DSML.war">
+ <zipfileset dir="${tests.tmp.dir}/coverage-instr/dsml"
+ includes="WEB-INF/**,META-INF/**"/>
+ </zip>
+
<!-- <delete dir="${tests.tmp.dir}/coverage-instr"/> -->
</target>
<target name="restore-pkg" if="coverage.on">
<delete file="${opends.dir}/${opends.name}.zip"/>
<move file="${opends.dir}/${opends.name}.zip.nocov" tofile="${opends.dir}/${opends.name}.zip"/>
+ <delete file="${opends.dir}/${opends.name}-DSML.war"/>
+ <move file="${opends.dir}/${opends.name}-DSML.war.nocov" tofile="${opends.dir}/${opends.name}-DSML.war"/>
</target>
<target name="testwithcoverage" depends="coverage-on,coverage-instrument,run,restore-pkg"/>
diff --git a/opends/tests/staf-tests/shared/functions/security.xml b/opends/tests/staf-tests/shared/functions/security.xml
index aafce6c..b1f2178 100755
--- a/opends/tests/staf-tests/shared/functions/security.xml
+++ b/opends/tests/staf-tests/shared/functions/security.xml
@@ -23,7 +23,7 @@
!
! CDDL HEADER END
!
- ! Copyright 2007-2008 Sun Microsystems, Inc.
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
! -->
<stax>
<!-- **************************************************** -->
@@ -331,6 +331,97 @@
<!-- **************************************************** -->
+ <!-- Add certificate to an attribute -->
+ <!-- **************************************************** -->
+ <function name="addCertificate">
+ <function-prolog>
+ This function add certificate to an user attribute
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="location" type="optional" default="STAF_REMOTE_HOSTNAME">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="user_cert_file_rfc" type="required" default="''">
+ <function-arg-description>
+ Path to certificate RFC file
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="userdn" type="optional" default="''">
+ <function-arg-description>
+ User DN to modify
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="ldif_path" type="required" default="''">
+ <function-arg-description>
+ Path to the ldif file
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+ <sequence>
+
+ <call function="'getFile'">
+ {
+ 'location' : STAF_REMOTE_HOSTNAME,
+ 'filename' : user_cert_file_rfc
+ }
+ </call>
+
+ <message>
+ 'Certificate contents:\n %s' % cmdResult
+ </message>
+
+ <!-- Extract BEGIN CERTIFICATE and END CERTIFICATE -->
+ <script>
+ certList=STAXResult[1].split('\n')
+ ret_str = ""
+ for line in certList:
+ index_cert = line.find("CERTIFICATE")
+ if index_cert == -1:
+ ret_str+=line.strip()
+ </script>
+
+ <script>
+ listAttr = []
+ listAttr.append('dn: %s' %userdn)
+ listAttr.append('changetype: modify')
+ listAttr.append('add: objectclass')
+ listAttr.append('objectclass:ds-certificate-user')
+ listAttr.append('-')
+ listAttr.append('add: userCertificate;binary')
+ listAttr.append('userCertificate;binary:: %s' % ret_str)
+ </script>
+
+ <!-- Write out the ldif -->
+ <script>
+ addCertificateldif='%s' % (ldif_path)
+ outfile = open(addCertificateldif,"w")
+ for line in listAttr:
+ outfile.write("%s\n" % line)
+ outfile.close()
+ </script>
+
+ <call function="'modifyEntry'">
+ {
+ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
+ 'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'entryToBeModified' : addCertificateldif,
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </function>
+
+
+
+
+
+
+
+ <!-- **************************************************** -->
<!-- get MD5 and SHA1 values -->
<!-- **************************************************** -->
<function name="getFingerprint">
@@ -445,6 +536,12 @@
</function-arg-description>
<function-arg-property name="type" value="string"/>
</function-arg-def>
+ <function-arg-def name="keystoreFile" type="optional" default="'config/keystore'">
+ <function-arg-description>
+ Keystore File
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
<function-arg-def name="keystoreType" type="optional" default="'JKS'">
<function-arg-description>
Keystore type : JKS or PKCS12
@@ -494,7 +591,7 @@
'subcommand' : 'create-key-manager-provider' ,
'objectType' : 'provider-name' ,
'objectName' : customKeyMgr ,
- 'optionsString' : '--type file-based --set enabled:true --set key-store-file:config/keystore --set key-store-pin:%s --set key-store-type:JKS' % keystorePin,
+ 'optionsString' : '--type file-based --set enabled:true --set key-store-file:%s --set key-store-pin:%s --set key-store-type:JKS' % (keystoreFile,keystorePin),
'expectedRC' : 0
}
</call>
@@ -643,6 +740,18 @@
</function-arg-description>
<function-arg-property name="type" value="string"/>
</function-arg-def>
+ <function-arg-def name="keystoreFile" type="optional" default="'config/keystore'">
+ <function-arg-description>
+ Keystore file path
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="customKeyMgr" type="optional" default="''">
+ <function-arg-description>
+ Name for a new key manager
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
<function-arg-def name="certAlias" type="optional" default="'server-cert'">
<function-arg-description>
Alias certificate
@@ -666,8 +775,24 @@
<message>
'Configure Key Manager Provider'
</message>
-
- <call function="'dsconfig'">
+
+ <if expr="len(customKeyMgr.strip()) != 0">
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'create-key-manager-provider' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : customKeyMgr ,
+ 'optionsString' : '--type file-based --set enabled:true --set key-store-file:%s --set key-store-pin:%s --set key-store-type:JKS' % (keystoreFile,keystorePin),
+ 'expectedRC' : 0
+ }
+ </call>
+ <else>
+ <call function="'dsconfig'">
{ 'location' : location,
'dsPath' : dsPath,
'dsInstanceHost' : dsInstanceHost,
@@ -677,10 +802,12 @@
'subcommand' : 'set-key-manager-provider-prop',
'objectType' : 'provider-name',
'objectName' : keystoreType,
- 'optionsString' : '--set key-store-file:config/keystore --reset key-store-pin-file --set key-store-pin:%s --set enabled:true' % keystorePin,
+ 'optionsString' : '--set key-store-file:%s --reset key-store-pin-file --set key-store-pin:%s --set enabled:true' % (keystoreFile,keystorePin),
'expectedRC' : 0
}
- </call>
+ </call>
+ </else>
+ </if>
<!--- configure Trust Manager Provider -->
<message>
@@ -711,9 +838,12 @@
<script>
option1='--set ssl-cert-nickname:%s' % certAlias
option2='--set trust-manager-provider:"Blind Trust" '
- option3='--set key-manager-provider:"%s"' % (keystoreType)
- option4='--set allow-start-tls:true'
- optionsString='%s %s %s %s' % (option1,option2,option3,option4)
+ if customKeyMgr:
+ option3='--set key-manager-provider:"%s"' % (customKeyMgr)
+ else:
+ option3='--set key-manager-provider:"%s"' % (keystoreType)
+ option4='--set allow-start-tls:true'
+ optionsString='%s %s %s %s' % (option1,option2,option3,option4)
</script>
<call function="'dsconfig'">
@@ -734,6 +864,322 @@
</function>
+ <!-- ################################################## -->
+ <!-- configure SASL-->
+ <!-- ################################################## -->
+ <function name="configureSASL">
+ <function-prolog>
+ This function makes the configuration changes for SASL
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="location" type="optional" default="STAF_REMOTE_HOSTNAME">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
+ </function-arg-def>
+ <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
+ <function-arg-description>
+ Pathname to installation root
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstanceHost" type="optional">
+ <function-arg-description>
+ Directory server hostname or IP address
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstanceAdminPort" type="optional" default="'%s' % DIRECTORY_INSTANCE_ADMIN_PORT">
+ <function-arg-description>
+ Directory server admin port number
+ </function-arg-description>
+ <function-arg-property name="type" value="Port number"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstanceDn" type="optional">
+ <function-arg-description>
+ Bind DN
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="certAlias" type="optional" default="''">
+ <function-arg-description>
+ Alias certificate
+ </function-arg-description>
+ <function-arg-property name="type" value="DN"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstancePswd" type="optional">
+ <function-arg-description>
+ Bind password
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="keystoreFile" type="optional" default="'config/keystore'">
+ <function-arg-description>
+ Keystore File
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="keystorePin" type="optional" default="'keystorepass'">
+ <function-arg-description>
+ Keystore pin
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="keystoreType" type="optional" default="'JKS'">
+ <function-arg-description>
+ Keystore type : JKS or PKCS12
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="createTrustMgr" type="optional" default="False">
+ <function-arg-description>
+ Create or enable custom key Manager.
+ </function-arg-description>
+ <function-arg-property name="type" value="enum">
+ <function-arg-property-description>
+ This argument can only have boolean values
+ </function-arg-property-description>
+ <function-arg-property-data type="choice" value="True"/>
+ <function-arg-property-data type="choice" value="False"/>
+ </function-arg-property>
+ </function-arg-def>
+ <function-arg-def name="createKeyMgr" type="optional" default="False">
+ <function-arg-description>
+ Create or enable custom key Manager.
+ </function-arg-description>
+ <function-arg-property name="type" value="enum">
+ <function-arg-property-description>
+ This argument can only have boolean values
+ </function-arg-property-description>
+ <function-arg-property-data type="choice" value="True"/>
+ <function-arg-property-data type="choice" value="False"/>
+ </function-arg-property>
+ </function-arg-def>
+ <function-arg-def name="KeyMgr" type="optional" default="''">
+ <function-arg-description>
+ Name for a new key manager
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="trustMgr" type="optional" default="''">
+ <function-arg-description>
+ Name for a new trust manager
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="truststoreFile" type="optional" default="'config/truststore'">
+ <function-arg-description>
+ Truststore File
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="truststoreType" type="optional" default="'JKS'">
+ <function-arg-description>
+ Truststore type : JKS or PKCS12
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="truststorePin" type="optional" default="'truststorepass'">
+ <function-arg-description>
+ Truststore pin
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="certMapper" type="optional" default="'Subject Equals DN'">
+ <function-arg-description>
+ Certificate mapper name
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="handlerName" type="optional" default="'EXTERNAL'">
+ <function-arg-description>
+ SASL mechanism handler name
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="optionSaSL" type="optional" default="''">
+ <function-arg-description>
+ SASL mechanism handler options
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="optionMapper" type="optional" default="''">
+ <function-arg-description>
+ Mapping options
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="extraParams" type="optional">
+ <function-arg-description>
+ Optional extra parameters for specific test cases
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+
+ <!--- configure Key Manager Provider -->
+ <message>
+ 'Configure Key Manager Provider'
+ </message>
+
+ <if expr="createKeyMgr == True">
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'create-key-manager-provider' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : KeyMgr ,
+ 'optionsString' : '--set key-store-file:%s --set key-store-pin:%s --set key-store-type:%s --type file-based --set enabled:true --no-prompt ' % (keystoreFile,keystorePin,truststoreType),
+ 'expectedRC' : 0
+ }
+ </call>
+ <else>
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-key-manager-provider-prop' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : KeyMgr,
+ 'optionsString' : '--set key-store-file:%s --reset key-store-pin-file --set key-store-pin:%s --set enabled:true' % (keystoreFile,keystorePin),
+ 'expectedRC' : 0
+ }
+ </call>
+ </else>
+ </if>
+
+ <!--- configure Trust Manager Provider -->
+ <message>
+ 'Configure Trust Manager Provider'
+ </message>
+
+ <if expr="len(trustMgr.strip()) != 0">
+ <if expr="createTrustMgr == True">
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'create-trust-manager-provider' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : trustMgr ,
+ 'optionsString' : '--set trust-store-file:%s --set trust-store-pin:%s --type file-based --set trust-store-type:%s --set enabled:true ' %(truststoreFile,truststorePin,truststoreType),
+ 'expectedRC' : 0
+ }
+ </call>
+ <else>
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-trust-manager-provider-prop' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : trustMgr ,
+ 'optionsString' : '--set trust-store-file:%s --set trust-store-pin:%s --set enabled:true' %(truststoreFile,truststorePin),
+ 'expectedRC' : 0
+ }
+ </call>
+ </else>
+ </if>
+ <else>
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-trust-manager-provider-prop' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : 'Blind Trust',
+ 'optionsString' : '--set enabled:true' ,
+ 'expectedRC' : 0
+ }
+ </call>
+ </else>
+ </if>
+
+
+ <!--- Enable LDAPS Connection Handler -->
+ <message>
+ 'Enabling LDAPS Connection Handler - Keystore type'
+ </message>
+
+ <script>
+ option1='--set ssl-cert-nickname:%s' % certAlias
+ if trustMgr:
+ option2='--set trust-manager-provider:"%s"' % (trustMgr)
+ else:
+ option2='--set trust-manager-provider:"Blind Trust"'
+ option3='--set key-manager-provider:"%s"' % (KeyMgr)
+ option4='--set listen-port:%s' % DIRECTORY_INSTANCE_SSL_PORT
+ option5='--set enabled:true --set use-ssl:true --set ssl-client-auth-policy:required'
+ optionsString='%s %s %s %s %s' % (option1,option2,option3,option4,option5)
+ </script>
+
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-connection-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAPS Connection Handler',
+ 'optionsString' : optionsString,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!--- Setting the mapper -->
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-certificate-mapper-prop',
+ 'objectType' : 'mapper-name' ,
+ 'objectName' : certMapper,
+ 'optionsString' : '--set enabled:true --no-prompt %s'%optionMapper,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!--- Setting the sasl mechanism -->
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-sasl-mechanism-handler-prop',
+ 'objectType' : 'handler-name' ,
+ 'objectName' : handlerName,
+ 'optionsString' : '--set certificate-mapper:"%s" --set enabled:true --no-prompt %s'%(certMapper,optionSaSL),
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </function>
+
<!-- ################################################## -->
<!-- configure SSL and TLS -->
<!-- ################################################## -->
@@ -1129,6 +1575,12 @@
</function-arg-description>
<function-arg-property name="type" value="string"/>
</function-arg-def>
+ <function-arg-def name="customKeyMgr" type="optional" default="''">
+ <function-arg-description>
+ Name for the key manager
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
<function-arg-def name="keystoreType" type="optional" default="'JKS'">
<function-arg-description>
Keystore type : JKS or PKCS12
@@ -1162,6 +1614,21 @@
'expectedRC' : 0
}
</call>
+
+ <call function="'dsconfig'">
+ { 'location' : location,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'set-connection-handler-prop' ,
+ 'objectType' : 'handler-name' ,
+ 'objectName' : 'LDAP Connection Handler',
+ 'optionsString' : '--reset key-manager-provider --reset trust-manager-provider --reset ssl-cert-nickname',
+ 'expectedRC' : 0
+ }
+ </call>
<!--- Disable SSL Trust Manager Provider -->
<message>
@@ -1186,8 +1653,23 @@
<message>
'Disabling Key Manager Provider'
</message>
-
- <call function="'dsconfig'">
+
+ <if expr="len(customKeyMgr.strip()) != 0">
+ <call function="'dsconfig'">
+ { 'location' : location ,
+ 'dsPath' : dsPath ,
+ 'dsInstanceHost' : dsInstanceHost ,
+ 'dsInstanceAdminPort' : dsInstanceAdminPort ,
+ 'dsInstanceDn' : dsInstanceDn ,
+ 'dsInstancePswd' : dsInstancePswd ,
+ 'subcommand' : 'delete-key-manager-provider' ,
+ 'objectType' : 'provider-name' ,
+ 'objectName' : customKeyMgr ,
+ 'expectedRC' : 0
+ }
+ </call>
+ <else>
+ <call function="'dsconfig'">
{ 'location' : location,
'dsPath' : dsPath,
'dsInstanceHost' : dsInstanceHost,
@@ -1200,7 +1682,10 @@
'optionsString' : '--set enabled:false',
'expectedRC' : 0
}
- </call>
+ </call>
+ </else>
+ </if>
+
</sequence>
</function>
diff --git a/opends/tests/staf-tests/shared/functions/utils.xml b/opends/tests/staf-tests/shared/functions/utils.xml
index 38c0dac..b3580c3 100755
--- a/opends/tests/staf-tests/shared/functions/utils.xml
+++ b/opends/tests/staf-tests/shared/functions/utils.xml
@@ -1063,7 +1063,7 @@
reportCfg = open('%s/logs/report.cfg' % LOGS_ROOT, 'w')
reportCfg.write('[Main]\n')
- reportCfg.write('product = OpenDS_SE2.4 (Directory)\n')
+ reportCfg.write('product = Directory\n')
if TESTS_TYPE == 'functional-tests':
reportCfg.write('category = Functional\n')
else:
@@ -3331,6 +3331,25 @@
</function-arg-description>
<function-arg-property name="type" value="string"/>
</function-arg-def>
+ <function-arg-def name="includeAttrs"
+ type="optional"
+ default="None">
+ <function-arg-description>
+ Map containing the attributes configured as include-attributes along
+ with their values, e.g.:
+ { 'description':['desc1', desc2'], 'telephonenumber':['11-22-33']}
+ </function-arg-description>
+ <function-arg-property name="type" value="map"/>
+ </function-arg-def>
+ <function-arg-def name="expectMissingIncAttrs"
+ type="optional"
+ default="[]">
+ <function-arg-description>
+ List of the attributes in includeAttrs expected NOT TO BE FOUND in the
+ changelog entry.
+ </function-arg-description>
+ <function-arg-property name="type" value="list"/>
+ </function-arg-def>
<function-arg-def name="knownIssue" type="optional" default="None">
<function-arg-description>
Known issue. Corresponds to an issue number.
@@ -3342,6 +3361,7 @@
<script>
myLocation = location
myPath = dsPath
+ myKnownIssue = knownIssue
# Mandatory attributes in a changeLogEntry
ecl_DN = changelogEntry['dn'][0]
@@ -3386,7 +3406,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_targetDN,
'expectedString' : targetDN,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
@@ -3396,7 +3417,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_changeType,
'expectedString' : changeType,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
@@ -3408,7 +3430,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_changeTime,
'expectedString' : changeTime,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3422,7 +3445,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_changeNumber,
'expectedString' : changeNumber,
- 'searchType' : 'exact-case-sensitive'
+ 'searchType' : 'exact-case-sensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3437,7 +3461,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_replicationCSN,
'expectedString' : replicationCSN,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3446,7 +3471,14 @@
<message log="1" level="'Error'">
'No replicationCSN could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3461,7 +3493,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_replicaIdentifier,
'expectedString' : replicaIdentifier,
- 'searchType' : 'exact-case-sensitive'
+ 'searchType' : 'exact-case-sensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3470,7 +3503,14 @@
<message log="1" level="'Error'">
'No replicaIdentifier could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3485,7 +3525,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_targetEntryUUID,
'expectedString' : targetEntryUUID,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3494,7 +3535,14 @@
<message log="1" level="'Error'">
'No targetEntryUUID could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3509,7 +3557,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_newRDN,
'expectedString' : newRDN,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3518,7 +3567,14 @@
<message log="1" level="'Error'">
'No newRDN could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3533,7 +3589,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_deleteOldRDN,
'expectedString' : deleteOldRDN,
- 'searchType' : 'exact-case-sensitive'
+ 'searchType' : 'exact-case-sensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3542,7 +3599,14 @@
<message log="1" level="'Error'">
'No deleteOldRDN could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3557,7 +3621,8 @@
<call function="'searchString'">
{ 'returnString' : ecl_newSuperior,
'expectedString' : newSuperior,
- 'searchType' : 'exact-case-insensitive'
+ 'searchType' : 'exact-case-insensitive',
+ 'knownIssue' : myKnownIssue
}
</call>
</sequence>
@@ -3566,7 +3631,14 @@
<message log="1" level="'Error'">
'No newSuperior could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3641,7 +3713,14 @@
'Expected values %s could not be found in %s' \
% (valueList, ecl_valueList)
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3651,7 +3730,14 @@
<message log="1" level="'Error'">
'No %s could be found in the changes' % attr
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3697,7 +3783,14 @@
'Expected change %s could not be found in %s'\
% (mod, ecl_changesList)
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
@@ -3713,12 +3806,280 @@
<message log="1" level="'Error'">
'No changes could be found in the changelog entry'
</message>
- <call function="'testFailed'"/>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
</sequence>
</else>
</if>
</if>
+ <if expr="includeAttrs">
+ <iterate var="attr" in="includeAttrs.keys()">
+ <sequence>
+ <message>
+ 'checkChangelogEntry: Checking include-attribute: %s' % attr
+ </message>
+ <script>
+ # included-attributes are preceded by 'target' prefix in the
+ # changelog entry, e.g.: 'description' -> 'targetdescription'
+ targetAttr = 'target%s' % attr
+ valueList = includeAttrs[attr]
+ ecl_valueList = None
+
+ if targetAttr in changelogEntry.keys():
+ ecl_valueList = changelogEntry[targetAttr]
+ ecl_valueList.sort()
+ valueList.sort()
+ </script>
+ <if expr="ecl_valueList != None">
+ <!-- Some value found for (include-attribute) targetAttr -->
+ <if expr="attr in expectMissingIncAttrs">
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Found values %s for %s while NONE expected.' \
+ % (valueList, targetAttr)
+ </message>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
+ </sequence>
+ <else>
+ <if expr="valueList == ecl_valueList">
+ <message>
+ 'Found expected values for include attribute in %s: \
+ %s' % (targetAttr, valueList)
+ </message>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'Expected values %s could not be found in %s: %s' \
+ % (valueList, targetAttr, ecl_valueList)
+ </message>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
+ </sequence>
+ </else>
+ </if>
+ </else>
+ </if>
+ <else>
+ <!-- No (include-attribute) targetAttr found -->
+ <if expr="attr in expectMissingIncAttrs">
+ <message>
+ 'No %s could be found in the changelog entry, AS EXPECTED' \
+ % targetAttr
+ </message>
+ <else>
+ <sequence>
+ <message log="1" level="'Error'">
+ 'No %s could be found in the changelog entry' % targetAttr
+ </message>
+ <if expr="myKnownIssue == None">
+ <call function="'testFailed'"/>
+ <else>
+ <call function="'setKnownIssue'">
+ { 'issueId' : myKnownIssue }
+ </call>
+ </else>
+ </if>
+ </sequence>
+ </else>
+ </if>
+ </else>
+ </if>
+ </sequence>
+ </iterate>
+ </if>
+
</sequence>
</function>
+
+ <!-- PSEARCH -->
+ <function name="psearch" scope="local">
+ <function-prolog>
+ This function performs a psearch request
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="location"
+ type="optional"
+ default="STAF_REMOTE_HOSTNAME">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstanceHost"
+ type="optional"
+ default="STAF_REMOTE_HOSTNAME">
+ <function-arg-description>
+ Target directory server hostname or IP address
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname" />
+ </function-arg-def>
+ <function-arg-def name="dsInstancePort" type="required">
+ <function-arg-description>
+ Directory server port number
+ </function-arg-description>
+ <function-arg-property name="type" value="Port number"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstanceDn" type="required">
+ <function-arg-description>
+ Directory server dn
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="dsInstancePswd" type="required">
+ <function-arg-description>
+ Bind password
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="dsBaseDn" type="required">
+ <function-arg-description>
+ Specify the base DN for which to perform the verification
+ </function-arg-description>
+ <function-arg-property name="type" value="dn"/>
+ </function-arg-def>
+ <function-arg-def name="nbrOfThread" type="optional" default="1">
+ <function-arg-description>
+ Specify the number of threads to use
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="outputFile" type="optional">
+ <function-arg-description>
+ Specify the output file path
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="operation" type="optional">
+ <function-arg-description>
+ Specify the opeation type
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="display" type="optional">
+ <function-arg-description>
+ Optional do not perform any display in terminal
+ </function-arg-description>
+ <function-arg-property name="type" value="boolean"/>
+ </function-arg-def>
+ <function-arg-def name="ldif" type="optional">
+ <function-arg-description>
+ Optional output file in ldif format
+ </function-arg-description>
+ <function-arg-property name="type" value="boolean"/>
+ </function-arg-def>
+ <function-arg-def name="expectedRC" type="optional" default="0">
+ <function-arg-description>
+ Expected return code value. Default value is 0
+ Wildcard 'noCheck' to not check the RC
+ </function-arg-description>
+ <function-arg-property name="type" value="integer"/>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+
+ <script>
+ if is_windows_platform(location):
+ jstaf_jarfile='%s\\bin\\JSTAF.jar' % REMOTE_STAF_ROOT
+ else:
+ jstaf_jarfile='%s/lib/JSTAF.jar' % REMOTE_STAF_ROOT
+ </script>
+
+ <!-- Build the command -->
+ <script>
+ STAFCmdParamsList=[]
+ STAFCmdParams=''
+
+ if dsInstanceHost:
+ STAFCmdParamsList.append('-h %s' % dsInstanceHost)
+
+ if dsInstancePort:
+ STAFCmdParamsList.append('-p %s' % dsInstancePort)
+
+ if dsInstanceDn:
+ STAFCmdParamsList.append('-D %s' % dsInstanceDn)
+
+ if dsBaseDn:
+ STAFCmdParamsList.append('-b %s' % dsBaseDn)
+
+ if dsInstancePswd:
+ STAFCmdParamsList.append('-w %s' % dsInstancePswd)
+
+ if display:
+ STAFCmdParamsList.append('-s')
+
+ if ldif:
+ STAFCmdParamsList.append('-l')
+
+ if outputFile:
+ STAFCmdParamsList.append('-f %s' % outputFile)
+
+ if nbrOfThread:
+ STAFCmdParamsList.append('-n %s' % nbrOfThread)
+
+ if operation:
+ STAFCmdParamsList.append('-o %s' % operation)
+
+ STAFCmdParams=' '.join(STAFCmdParamsList)
+
+ STAFCmd='PSearch'
+
+ if is_windows_platform(location):
+ separator=';'
+ else:
+ separator=':'
+
+ ldapjdkPath='%s/ldapjdk' % remote.java
+ ldapjdk_jarfile='%s/ldapjdk.jar' % ldapjdkPath
+ cp = 'CLASSPATH=%s%s%s%s.' \
+ % (ldapjdk_jarfile,separator,jstaf_jarfile,separator)
+
+ env = ['%s' % cp]
+
+ </script>
+
+ <message>
+ '%s %s' % (STAFCmd, STAFCmdParams)
+ </message>
+
+ <call function="'runCommand'" >
+ {
+ 'name' : 'PSearch' ,
+ 'command' : '%s/bin/java' % JAVA_HOME ,
+ 'arguments' : '%s %s' % (STAFCmd, STAFCmdParams) ,
+ 'location' : location ,
+ 'path' : '%s/ldapjdk' % remote.java ,
+ 'envCmd' : env ,
+ 'expectedRC' : expectedRC
+ }
+ </call>
+
+ <return>
+ STAXResult
+ </return>
+
+ </sequence>
+ </function>
+
+
</stax>
diff --git a/opends/tests/staf-tests/shared/functions/webcontainer.xml b/opends/tests/staf-tests/shared/functions/webcontainer.xml
index 6b712f2..75dd3e1 100755
--- a/opends/tests/staf-tests/shared/functions/webcontainer.xml
+++ b/opends/tests/staf-tests/shared/functions/webcontainer.xml
@@ -23,7 +23,7 @@
!
! CDDL HEADER END
!
- ! Portions Copyright 2008-2009 Sun Microsystems, Inc.
+ ! Portions Copyright 2008-2010 Sun Microsystems, Inc.
! -->
<stax>
@@ -186,7 +186,12 @@
'remotehost' : '%s' % STAF_REMOTE_HOSTNAME
}
</call>
-
+ <call function="'copyFile'">
+ { 'srcfile' : '%s/../../ext/emma/lib/emma.jar' % TESTS_ROOT,
+ 'destfile' : '%s/apache-%s-%s/lib/emma.jar' % (wcPath, WC_TYPE, WC_VERSION),
+ 'remotehost' : '%s' % STAF_REMOTE_HOSTNAME
+ }
+ </call>
<if expr="RC != 0">
<return>RC</return>
</if>
diff --git a/opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java b/opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java
index 3169c5c..925b523 100644
--- a/opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java
+++ b/opends/tests/staf-tests/shared/java/ldapjdk/PSearch.java
@@ -22,109 +22,129 @@
* CDDL HEADER END
*
*
- * Copyright 2009 Sun Microsystems, Inc.
+ * Copyright 2009-2010 Sun Microsystems, Inc.
*/
import netscape.ldap.util.GetOpt;
+import com.ibm.staf.STAFHandle;
public class PSearch {
- public static void main(String[] args) {
- String usage = "Usage: psearch -h <hostname> -p <port> -b <suffix>" + "[-D bindDN] [-w bindPW]" + "-f <fileURL+file name>" + "-l <y>" + "-n <number of thread>" + " -o <add,modify,delete,moddn>";
- String hostname = "localhost";
- int portnumber = 1389; //LDAPv3.DEFAULT_PORT;
- int nbThreads = 1;//number of thread by default
- // Check for these options. -H means to print out a usage message.
- GetOpt options = new GetOpt("h:p:b:D:w:H:f:n:o:l", args);
+ public static void main(String[] args) {
+ String usage = "Usage: psearch -h <hostname> -p <port> -b <suffix>" + "[-D bindDN] [-w bindPW]" + "-f <fileURL+file name>" + "-s" + "-n <number of thread>" + " -o <add,modify,delete,moddn>"+ " -l";
+ String hostname = "localhost";
+ int portnumber = 1389; //LDAPv3.DEFAULT_PORT;
+ int nbThreads = 1;//number of thread by default
+ // Check for these options. -H means to print out a usage message.
+ GetOpt options = new GetOpt("h:p:b:D:w:H:f:n:o:s:l", args);
- // Get the arguments specified for each option.
- String host = options.getOptionParam('h');
- // host
- if (options.hasOption('h')) {
- if (host == null) {
- // usage
- System.out.println(usage);
- System.exit(1);
- } else {
- hostname = host;
- }
- }
- String port = options.getOptionParam('p');
- // If a port number was specified, convert the port value
- // to an integer.
- if (port != null) {
- try {
- portnumber = java.lang.Integer.parseInt(port);
- } catch (java.lang.Exception e) {
- System.out.println("Invalid port number: " + port);
- System.out.println(usage);
- System.exit(1);
- }
- }
- //number of thread
- String nbT = options.getOptionParam('n');
- if (nbT != null) {
- try {
- nbThreads = java.lang.Integer.parseInt(nbT);
- } catch (java.lang.Exception e) {
- System.out.println("Invalid Thread number: " + nbT);
- System.out.println(usage);
- System.exit(1);
- }
- }
- // PSearch suffix
- String suffix = options.getOptionParam('b');
-
- String bindDN = options.getOptionParam('D');
-
- String bindPW = options.getOptionParam('w');
-
- //operations all by default
- String operation = PSearchOperations.ALL;
- if (options.hasOption('o')) {
- String opParam = options.getOptionParam('o');
- if (opParam.equals("add")) {
- operation = PSearchOperations.ADD;
- } else if (opParam.equals("modify")) {
- operation = PSearchOperations.MODIFY;
- } else if (opParam.equals("delete")) {
- operation = PSearchOperations.DELETE;
- } else if (opParam.equals("moddn")) {
- operation = PSearchOperations.MODDN;
- }else if (opParam.equals("all")) {
- operation = PSearchOperations.ALL;;
- } else {
- System.out.println("Invalid operation type: " + opParam);
- System.out.println(usage);
- System.exit(1);
- }
- }
-
- // to disable the log files
- boolean useFile = false;
- String fileName = "logLile";
- if (options.hasOption('f')) {
- useFile = options.hasOption('f');
- fileName = options.getOptionParam('f');
- }
- // to enable system out logs
- boolean output = options.hasOption('l');
-
- System.out.println("Connecting to " + hostname + ":" + portnumber +
- " as \"" + bindDN + "\"" +
- " on suffix \"" + suffix + "\"" +
- " on operation \"" + operation + "\"" +
- " use file: \"" + useFile + "\" output: \"" + output + "\"");
- //start all thread
- for (int i = 0; i < nbThreads; i++) {
- PSearchOperations ps = new PSearchOperations(i, hostname, portnumber, bindDN, bindPW, suffix);
- if (useFile) {
- ps.useLogFile(useFile);
- ps.setLogFile(fileName);
- }
- ps.setOutput(output);
- ps.setOperation(operation);
- ps.start();
- }
+ // Get the arguments specified for each option.
+ String host = options.getOptionParam('h');
+ // host
+ if (options.hasOption('h')) {
+ if (host == null) {
+ // usage
+ System.out.println(usage);
+ System.exit(1);
+ } else {
+ hostname = host;
+ }
}
+ String port = options.getOptionParam('p');
+ // If a port number was specified, convert the port value
+ // to an integer.
+ if (port != null) {
+ try {
+ portnumber = java.lang.Integer.parseInt(port);
+ } catch (java.lang.Exception e) {
+ System.out.println("Invalid port number: " + port);
+ System.out.println(usage);
+ System.exit(1);
+ }
+ }
+ //number of thread
+ String nbT = options.getOptionParam('n');
+ if (nbT != null) {
+ try {
+ nbThreads = java.lang.Integer.parseInt(nbT);
+ } catch (java.lang.Exception e) {
+ System.out.println("Invalid Thread number: " + nbT);
+ System.out.println(usage);
+ System.exit(1);
+ }
+ }
+ // PSearch suffix
+ String suffix = options.getOptionParam('b');
+
+ String bindDN = options.getOptionParam('D');
+
+ String bindPW = options.getOptionParam('w');
+
+ //operations all by default
+ String operation = PSearchOperations.ALL;
+ if (options.hasOption('o')) {
+ String opParam = options.getOptionParam('o');
+ if (opParam.equals("add")) {
+ operation = PSearchOperations.ADD;
+ } else if (opParam.equals("modify")) {
+ operation = PSearchOperations.MODIFY;
+ } else if (opParam.equals("delete")) {
+ operation = PSearchOperations.DELETE;
+ } else if (opParam.equals("moddn")) {
+ operation = PSearchOperations.MODDN;
+ } else if (opParam.equals("all")) {
+ operation = PSearchOperations.ALL;
+ ;
+ } else {
+ System.out.println("Invalid operation type: " + opParam);
+ System.out.println(usage);
+ System.exit(1);
+ }
+ }
+
+ // to disable the log files
+ boolean useFile = false;
+ String fileName = "logLile";
+ if (options.hasOption('f')) {
+ useFile = options.hasOption('f');
+ fileName = options.getOptionParam('f');
+ }
+
+ // to enable diff format
+ boolean ldifFormat = options.hasOption('l');
+
+ // to enable system out logs
+ boolean output = options.hasOption('s');
+
+ System.out.println("Connecting to " + hostname + ":" + portnumber +
+ " as \"" + bindDN + "\"" +
+ " on suffix \"" + suffix + "\"" +
+ " on operation \"" + operation + "\"" +
+ " use file: \"" + useFile + "\" output: \"" + output + "\"");
+ //start all thread
+
+
+ for (int i = 0; i < nbThreads; i++) {
+ PSearchOperations ps = new PSearchOperations(i, hostname, portnumber, bindDN, bindPW, suffix);
+ if (useFile) {
+ ps.useLogFile(useFile);
+ ps.setLogFile(fileName);
+ }
+ ps.setOutput(output);
+ ps.setLdifFormat(ldifFormat);
+ ps.setOperation(operation);
+ ps.start();
+ }
+
+ try {
+ STAFHandle handle = new STAFHandle("PSearch listener");
+ handle.submit2(hostname, "SEM", "PULSE EVENT PSearch/Ready");
+ handle.submit2(hostname, "SEM", "WAIT EVENT PSearch tests/Completed");
+ handle.submit2(hostname, "SEM", "DELETE EVENT PSearch tests/Completed");
+ System.exit(0);
+ } catch (Exception e) {
+ System.out.println("STAF Handle fail");
+ }
+
+ }
}
diff --git a/opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java b/opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java
index a4aa6ff..de6c8f8 100644
--- a/opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java
+++ b/opends/tests/staf-tests/shared/java/ldapjdk/PSearchOperations.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2009 Sun Microsystems, Inc.
+ * Copyright 2009-2010 Sun Microsystems, Inc.
*/
import java.io.File;
@@ -57,6 +57,7 @@
private int threadId;
private String fileName;
private boolean output;
+ private boolean ldifFormat;
private boolean logFile;
private String operation;
/**
@@ -77,6 +78,7 @@
this.threadId = id;
this.output = false;
this.logFile = false;
+ this.ldifFormat = false;
//by default all operation
this.operation = ALL;
@@ -121,6 +123,10 @@
this.operation = operation;
}
+ public void setLdifFormat(boolean ldifFormat) {
+ this.ldifFormat = ldifFormat;
+ }
+
/**
*Connect to server.
*/
@@ -129,7 +135,8 @@
connection = new LDAPConnection();
connection.connect(3, hostname, portnumber, "", "");
connection.authenticate(3, bindDN, bindPW);
- write("[Thread id: " + threadId + "] \n" + getDate() + connection);
+ if(!ldifFormat)
+ write("[Thread id: " + threadId + "] \n" + getDate() + connection);
} catch (LDAPException ex) {
System.out.println("[Thread id: " + threadId + "]Connection :" + ex.getMessage());
System.exit(0);
@@ -263,20 +270,25 @@
Enumeration attrs = attrSet.getAttributes();
if (entry.getDN().contains("break")) {
String message = "\n[Thread id: " + threadId + "] " + getDate() + " [BREAK]";
- write(message);
+ if(!ldifFormat)
+ write(message);
System.exit(0);
} else if (entry.getDN().contains("stop")) {
try {
connection.disconnect();
String message = "\n[Thread id: " + threadId + "] " + getDate() + "[STOP]";
- write(message);
+ if(!ldifFormat)
+ write(message);
System.exit(0);
} catch (LDAPException ex) {
System.out.println("[Thread id: " + threadId + "]run :" + ex.getLDAPErrorMessage());
}
}
String message = "[Thread id: " + threadId + "] " + getDate() + " [" + controlName(arr[4]) + "]";
- write("\n" + message);
+ if(!ldifFormat)
+ write("\n" + message);
+ else
+ write("\n");
String dn = "dn: " + entry.getDN();
write(dn);
while (attrs.hasMoreElements()) {
diff --git a/opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java b/opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java
index 09b1012..7c8802b 100644
--- a/opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java
+++ b/opends/tests/staf-tests/shared/java/ldapjndi/addAnEntry.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2008 Sun Microsystems, Inc.
+ * Copyright 2008-2010 Sun Microsystems, Inc.
*/
import java.util.Hashtable;
@@ -115,7 +115,10 @@
attrToComplete = new BasicAttribute(attributeName);
attributeSet.add(attrToComplete);
}
- attrToComplete.add(attributeValue);
+ if (attributeValue != null) {
+ attributeValue = attributeValue.replaceAll("QUOT","\\\"");
+ attrToComplete.add(attributeValue);
+ }
}
k++;
}
diff --git a/opends/tests/staf-tests/shared/staf/staf-controller.cfg b/opends/tests/staf-tests/shared/staf/staf-controller.cfg
index 0f5b9f0..1c4a643 100644
--- a/opends/tests/staf-tests/shared/staf/staf-controller.cfg
+++ b/opends/tests/staf-tests/shared/staf/staf-controller.cfg
@@ -21,7 +21,10 @@
# CDDL HEADER END
#
#
-# Copyright 2007-2009 Sun Microsystems, Inc.
+# Copyright 2007-2010 Sun Microsystems, Inc.
+
+# Change default data directory
+SET DATADIR {STAF/Config/STAFRoot}/data-${local.hostname}
# Turn on tracing of internal errors and deprecated options
trace enable tracepoints "error deprecated"
@@ -32,23 +35,20 @@
# Set default local trust
trust machine local://local level 5
trust level 5 machine tcp://localhost
-# this is required for the Zip Service to be able to expand archives
+
+# This is required for the Zip Service to be able to expand archives
trust level 5 user anonymous
# Default Service Loader Service
serviceloader library STAFDSLS
-# LOG SERVICE CONFIGURATION
-SERVICE Log LIBRARY STAFLog \
- PARMS "Directory {STAF/Config/STAFRoot}/logs"
-
# ZIP SERVICE CONFIGURATION
SERVICE Zip LIBRARY STAFZip
# STAX SERVICE CONFIGURATION
SERVICE Stax LIBRARY JSTAF \
EXECUTE ${staf.install.dir}/${stax.name}/STAX.jar \
- OPTION JVMNAME=stafJVM-${local.hostname} \
+ OPTION JVMNAME=staxJVM-${local.hostname} \
OPTION J2=-Xms1g -Xmx1g \
-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled \
-XX:+CMSClassUnloadingEnabled -XX:NewSize=500m -XX:MaxNewSize=500m \
@@ -58,15 +58,18 @@
# EVENT SERVICE CONFIGURATION
SERVICE Event LIBRARY JSTAF \
- EXECUTE ${staf.install.dir}/${event.name}/STAFEvent.jar
+ EXECUTE ${staf.install.dir}/${event.name}/STAFEvent.jar \
+ OPTION JVMNAME=eventJVM-${local.hostname}
# EVENTMANAGER SERVICE CONFIGURATION
SERVICE EventManager LIBRARY JSTAF \
- EXECUTE ${staf.install.dir}/${eventmanager.name}/STAFEventManager.jar
+ EXECUTE ${staf.install.dir}/${eventmanager.name}/STAFEventManager.jar \
+ OPTION JVMNAME=eventmanagerJVM-${local.hostname}
# EMAIL SERVICE CONFIGURATION
SERVICE Email LIBRARY JSTAF \
EXECUTE ${staf.install.dir}/${email.name}/STAFEmail.jar \
+ OPTION JVMNAME=emailJVM-${local.hostname} \
PARMS "MAILSERVER ${email.server.host} PORT ${email.server.port}"
SET MAXQUEUESIZE 10000
diff --git a/opends/tests/staf-tests/shared/staf/staf-slave.cfg b/opends/tests/staf-tests/shared/staf/staf-slave.cfg
index 28635dc..358888a 100644
--- a/opends/tests/staf-tests/shared/staf/staf-slave.cfg
+++ b/opends/tests/staf-tests/shared/staf/staf-slave.cfg
@@ -21,7 +21,10 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc.
+# Copyright 2008-2010 Sun Microsystems, Inc.
+
+# Change default data directory
+SET DATADIR {STAF/Config/STAFRoot}/data-${remote.hostname}
# Turn on tracing of internal errors and deprecated options
trace enable tracepoints "error deprecated"
diff --git a/opends/tests/staf-tests/shared/tests/runTestJob.xml b/opends/tests/staf-tests/shared/tests/runTestJob.xml
index ec5db8d..c19e496 100644
--- a/opends/tests/staf-tests/shared/tests/runTestJob.xml
+++ b/opends/tests/staf-tests/shared/tests/runTestJob.xml
@@ -997,8 +997,8 @@
<iterate var="thisChild" in="listOfChildren2">
<sequence>
<script>
- srcFile = '%s/logs/MACHINE/%s/GLOBAL/STAX_Job_%s.log' \
- % (STAFRoot,STAF_LOCAL_HOSTNAME,thisChild)
+ srcFile = '%s/data-%s/service/log/MACHINE/%s/GLOBAL/STAX_Job_%s.log' \
+ % (STAFRoot,STAF_LOCAL_HOSTNAME,STAF_LOCAL_HOSTNAME,thisChild)
destFile = '%s/staf-logs/STAX_Job_%s.txt' \
% (LOGS_ROOT,thisChild)
</script>
@@ -1012,8 +1012,8 @@
</process>
<script>
- srcFile = '%s/logs/MACHINE/%s/GLOBAL/STAX_Job_%s_User.log' \
- % (STAFRoot,STAF_LOCAL_HOSTNAME,thisChild)
+ srcFile = '%s/data-%s/service/log/MACHINE/%s/GLOBAL/STAX_Job_%s_User.log' \
+ % (STAFRoot,STAF_LOCAL_HOSTNAME,STAF_LOCAL_HOSTNAME,thisChild)
destFile = '%s/staf-logs/STAX_Job_%s_User.txt' \
% (LOGS_ROOT,thisChild)
</script>
diff --git a/opends/tests/staf-tests/shared/tests/runTests.xml b/opends/tests/staf-tests/shared/tests/runTests.xml
index dcb06d5..f86fb81 100755
--- a/opends/tests/staf-tests/shared/tests/runTests.xml
+++ b/opends/tests/staf-tests/shared/tests/runTests.xml
@@ -71,7 +71,7 @@
starttime = time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(TESTS_TIMESTAMP))
reportCfg = open('%s/logs/report.cfg' % LOGS_ROOT, 'w')
reportCfg.write('[Main]\n')
- reportCfg.write('product = OpenDS_SE2.4 (Directory)\n')
+ reportCfg.write('product = Directory\n')
if TESTS_TYPE == 'functional-tests':
reportCfg.write('category = Functional\n')
else:
diff --git a/opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_10m.xml b/opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_10m.xml
index d230142..31905e9 100644
--- a/opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_10m.xml
+++ b/opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_10m.xml
@@ -23,7 +23,7 @@
!
! CDDL HEADER END
!
- ! Copyright 2009 Sun Microsystems, Inc.
+ ! Copyright 2009-2010 Sun Microsystems, Inc.
! -->
<stax>
@@ -343,7 +343,7 @@
</sequence>
</testcase>
- <testcase name="getTestCaseName('Rebuild all indexes online')">
+ <testcase name="getTestCaseName('Rebuild all indexes offline')">
<sequence>
<call function="'testCase_Preamble'"/>
@@ -363,18 +363,17 @@
</call>
<message>
- 'Import Ldif: Binary Attribute: Rebuild all indexes online'
+ 'Import Ldif: Binary Attribute: Rebuild all indexes offline'
</message>
<call function="'rebuildIndexWithScript'">
{
'dsBaseDN' : 'dc=com' ,
- 'dsRebuildAll' : 'True'
+ 'dsRebuildAll' : 'True' ,
+ 'knownIssue' : '6928546'
}
</call>
-
-
<script>
returnString = STAXResult[0][1]
msgIndexLocation1 = 'Index l.presence phase two processing completed'
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java
index e71ef29..36912e1 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/DbHandlerTest.java
@@ -22,7 +22,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006-2009 Sun Microsystems, Inc.
+ * Copyright 2006-2010 Sun Microsystems, Inc.
*/
package org.opends.server.replication.server;
@@ -30,6 +30,7 @@
import java.net.ServerSocket;
import org.opends.server.TestCaseUtils;
+import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.replication.ReplicationTestCase;
import org.opends.server.replication.common.ChangeNumber;
import org.opends.server.replication.common.ChangeNumberGenerator;
@@ -37,13 +38,29 @@
import org.testng.annotations.Test;
import static org.testng.Assert.*;
import static org.opends.server.TestCaseUtils.*;
+import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
+import static org.opends.server.loggers.debug.DebugLogger.getTracer;
/**
* Test the dbHandler class
*/
public class DbHandlerTest extends ReplicationTestCase
{
- @Test()
+ // The tracer object for the debug logger
+ private static final DebugTracer TRACER = getTracer();
+ /**
+ * Utility - log debug message - highlight it is from the test and not
+ * from the server code. Makes easier to observe the test steps.
+ */
+ private void debugInfo(String tn, String s)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugInfo("** TEST " + tn + " ** " + s);
+ }
+ }
+
+ @Test(enabled=true)
void testDbHandlerTrim() throws Exception
{
File testRoot = null;
@@ -265,7 +282,7 @@
* The clear feature is used when a replication server receives a request
* to reset the generationId of a given domain.
*/
- @Test()
+ @Test(enabled=true)
void testDbHandlerClear() throws Exception
{
File testRoot = null;
@@ -345,4 +362,255 @@
TestCaseUtils.deleteDirectory(testRoot);
}
}
+ /**
+ * Test the logic that manages counter records in the DbHandler in order to
+ * optimize the counting of record in the replication changelog db.
+ * @throws Exception
+ */
+ @Test(enabled=true)
+ void testDbCounts() throws Exception
+ {
+ // It's worth testing with 2 different setting for counterRecord
+ // - a counter record is put every 10 Update msg in the db - just a unit
+ // setting.
+ // - a counter record is put every 1000 Update msg in the db - something
+ // closer to real setting.
+ // In both cases, we want to test the counting algorithm,
+ // - when start and stop are before the first counter record,
+ // - when start and stop are before and after the first counter record,
+ // - when start and stop are after the first counter record,
+ // - when start and stop are before and after more than one counter record,
+ // After a purge.
+ // After shutdowning/closing and reopening the db.
+ testDBCount(40, 10);
+ testDBCount(4000, 1000);
+ }
+
+ private void testDBCount(int max, int counterWindow) throws Exception
+ {
+ String tn = "testDBCount("+max+","+counterWindow+")";
+ debugInfo(tn, "Starting test");
+
+ File testRoot = null;
+ ReplicationServer replicationServer = null;
+ ReplicationDbEnv dbEnv = null;
+ DbHandler handler = null;
+ ReplicationIterator ri = null;
+ int actualCnt = 0;
+ String testcase;
+ try
+ {
+ TestCaseUtils.startServer();
+
+ // find a free port for the replicationServer
+ ServerSocket socket = TestCaseUtils.bindFreePort();
+ int changelogPort = socket.getLocalPort();
+ socket.close();
+
+ // configure a ReplicationServer.
+ ReplServerFakeConfiguration conf =
+ new ReplServerFakeConfiguration(changelogPort, null, 0,
+ 2, 0, 100000, null);
+ replicationServer = new ReplicationServer(conf);
+
+ // create or clean a directory for the dbHandler
+ String buildRoot = System.getProperty(TestCaseUtils.PROPERTY_BUILD_ROOT);
+ String path = buildRoot + File.separator + "build" + File.separator +
+ "unit-tests" + File.separator + "dbHandlercp";
+ testRoot = new File(path);
+ if (testRoot.exists())
+ {
+ TestCaseUtils.deleteDirectory(testRoot);
+ }
+ testRoot.mkdirs();
+
+ dbEnv = new ReplicationDbEnv(path, replicationServer);
+
+ // Create the handler
+ handler =
+ new DbHandler( 1, TEST_ROOT_DN_STRING,
+ replicationServer, dbEnv, 10);
+ handler.setCounterWindowSize(counterWindow);
+
+ // Populate the db with 'max' msg
+ int mySeqnum = 1;
+ ChangeNumber cnarray[] = new ChangeNumber[2*(max+1)];
+ long now = System.currentTimeMillis();
+ for (int i=1; i<=max; i++)
+ {
+ cnarray[i] = new ChangeNumber(now+i, mySeqnum, 1);
+ mySeqnum+=2;
+ DeleteMsg update1 = new DeleteMsg(TEST_ROOT_DN_STRING, cnarray[i], "uid");
+ handler.add(update1);
+ }
+ handler.flush();
+
+ // Test first and last
+ ChangeNumber cn1 = handler.getFirstChange();
+ assertEquals(cn1, cnarray[1], "First change");
+ ChangeNumber cnlast = handler.getLastChange();
+ assertEquals(cnlast, cnarray[max], "Last change");
+
+ // Test count in different subcases trying to handle all special cases
+ // regarding the 'counter' record and 'count' algorithm
+ testcase="FROM change1 TO change1 ";
+ actualCnt = handler.getCount(cnarray[1], cnarray[1]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, 1, testcase);
+
+ testcase="FROM change1 TO change2 ";
+ actualCnt = handler.getCount(cnarray[1], cnarray[2]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, 2, testcase);
+
+ testcase="FROM change1 TO counterWindow="+(counterWindow);
+ actualCnt = handler.getCount(cnarray[1], cnarray[counterWindow]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, counterWindow, testcase);
+
+ testcase="FROM change1 TO counterWindow+1="+(counterWindow+1);
+ actualCnt = handler.getCount(cnarray[1], cnarray[counterWindow+1]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, counterWindow+1, testcase);
+
+ testcase="FROM change1 TO 2*counterWindow="+(2*counterWindow);
+ actualCnt = handler.getCount(cnarray[1], cnarray[2*counterWindow]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, 2*counterWindow, testcase);
+
+ testcase="FROM change1 TO 2*counterWindow+1="+((2*counterWindow)+1);
+ actualCnt = handler.getCount(cnarray[1], cnarray[(2*counterWindow)+1]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, (2*counterWindow)+1, testcase);
+
+ testcase="FROM change2 TO change5 ";
+ actualCnt = handler.getCount(cnarray[2], cnarray[5]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, 4, testcase);
+
+ testcase="FROM counterWindow+2 TO counterWindow+5 ";
+ actualCnt = handler.getCount(cnarray[(counterWindow+2)], cnarray[(counterWindow+5)]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, 4, testcase);
+
+ testcase="FROM change2 TO counterWindow+5 ";
+ actualCnt = handler.getCount(cnarray[2], cnarray[(counterWindow+5)]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, counterWindow+4, testcase);
+
+ testcase="FROM counterWindow+4 TO counterWindow+4 ";
+ actualCnt = handler.getCount(cnarray[(counterWindow+4)], cnarray[(counterWindow+4)]);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, 1, testcase);
+
+ // Now test with changes older than first or newer than last
+ ChangeNumber olderThanFirst = null;
+ ChangeNumber newerThanLast =
+ new ChangeNumber(System.currentTimeMillis() + (2*(max+1)), 100, 1);
+
+ // Now we want to test with start and stop outside of the db
+
+ testcase="FROM our first generated change TO now (> newest change in the db)";
+ actualCnt = handler.getCount(cnarray[1], newerThanLast);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, max, testcase);
+
+ testcase="FROM null (start of time) TO now (> newest change in the db)";
+ actualCnt = handler.getCount(olderThanFirst, newerThanLast);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, max, testcase);
+
+ // Now we want to test that after closing and reopening the db, the
+ // counting algo is well reinitialized and when new messages are added
+ // the new counter are correctly generated.
+ debugInfo(tn,"SHUTDOWN handler and recreate");
+ handler.shutdown();
+
+ handler =
+ new DbHandler( 1, TEST_ROOT_DN_STRING,
+ replicationServer, dbEnv, 10);
+ handler.setCounterWindowSize(counterWindow);
+
+ // Test first and last
+ cn1 = handler.getFirstChange();
+ assertEquals(cn1, cnarray[1], "First change");
+ cnlast = handler.getLastChange();
+ assertEquals(cnlast, cnarray[max], "Last change");
+
+ testcase="FROM our first generated change TO now (> newest change in the db)";
+ actualCnt = handler.getCount(cnarray[1], newerThanLast);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, max, testcase);
+
+ // Populate the db with 'max' msg
+ for (int i=max+1; i<=(2*max); i++)
+ {
+ cnarray[i] = new ChangeNumber(now+i, mySeqnum, 1);
+ mySeqnum+=2;
+ DeleteMsg update1 = new DeleteMsg(TEST_ROOT_DN_STRING, cnarray[i], "uid");
+ handler.add(update1);
+ }
+ handler.flush();
+
+ // Test first and last
+ cn1 = handler.getFirstChange();
+ assertEquals(cn1, cnarray[1], "First change");
+ cnlast = handler.getLastChange();
+ assertEquals(cnlast, cnarray[2*max], "Last change");
+
+ testcase="FROM our first generated change TO now (> newest change in the db)";
+ actualCnt = handler.getCount(cnarray[1], newerThanLast);
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, (2*max), testcase);
+
+ //
+
+ handler.setPurgeDelay(100);
+ sleep(4000);
+ int totalCount = handler.getCount(null, null);
+ debugInfo(tn,testcase + " After purge, total count=" + totalCount);
+
+ testcase="AFTER PURGE (first, last)=";
+ debugInfo(tn,testcase + handler.getFirstChange() + handler.getLastChange());
+ assertEquals(handler.getLastChange(), cnarray[2*max], "Last=");
+
+ testcase="AFTER PURGE ";
+ actualCnt = handler.getCount(cnarray[1], newerThanLast);
+ int expectedCnt;
+ if (totalCount>1)
+ {
+ expectedCnt = ((handler.getLastChange().getSeqnum()
+ - handler.getFirstChange().getSeqnum() + 1)/2)+1;
+ }
+ else
+ {
+ expectedCnt = 1;
+ }
+ debugInfo(tn,testcase + " actualCnt=" + actualCnt);
+ assertEquals(actualCnt, expectedCnt, testcase);
+
+ // Clear ...
+ debugInfo(tn,"clear:");
+ handler.clear();
+
+ // Check the db is cleared.
+ assertEquals(null, handler.getFirstChange());
+ assertEquals(null, handler.getLastChange());
+ debugInfo(tn,"Success");
+
+ }
+ finally
+ {
+ if (ri!=null)
+ ri.releaseCursor();
+ if (handler != null)
+ handler.shutdown();
+ if (dbEnv != null)
+ dbEnv.shutdown();
+ if (replicationServer != null)
+ replicationServer.remove();
+ if (testRoot != null)
+ TestCaseUtils.deleteDirectory(testRoot);
+ }
+ }
}
--
Gitblit v1.10.0