Blame SOURCES/openldap-cbinding-ITS-8573-TLS-option-test-suite.patch

e4ff3b
From eb087e0861f207858a4e08c72836a86f26d9701c Mon Sep 17 00:00:00 2001
e4ff3b
From: Quanah Gibson-Mount <quanah@openldap.org>
e4ff3b
Date: Thu, 14 Jun 2018 16:12:59 +0100
e4ff3b
Subject: [PATCH] ITS#8573 TLS option test suite
e4ff3b
e4ff3b
---
e4ff3b
 configure                                     |   4 +
e4ff3b
 configure.in                                  |   4 +
e4ff3b
 tests/data/slapd-tls-sasl.conf                |  65 ++
e4ff3b
 tests/data/slapd-tls.conf                     |  61 ++
e4ff3b
 tests/data/tls/ca/certs/testsuiteCA.crt       |  16 +
e4ff3b
 tests/data/tls/ca/private/testsuiteCA.key     |  16 +
e4ff3b
 .../tls/certs/bjensen@mailgw.example.com.crt  |  16 +
e4ff3b
 tests/data/tls/certs/localhost.crt            |  16 +
e4ff3b
 tests/data/tls/conf/openssl.cnf               | 129 ++++
e4ff3b
 tests/data/tls/create-crt.sh                  |  78 +++
e4ff3b
 .../private/bjensen@mailgw.example.com.key    |  16 +
e4ff3b
 tests/data/tls/private/localhost.key          |  16 +
e4ff3b
 tests/run.in                                  |   3 +-
e4ff3b
 tests/scripts/defines.sh                      |  21 +-
e4ff3b
 tests/scripts/test067-tls                     | 140 +++++
e4ff3b
 tests/scripts/test068-sasl-tls-external       | 102 ++++
e4ff3b
 .../test069-delta-multimaster-starttls        | 574 ++++++++++++++++++
e4ff3b
 tests/scripts/test070-delta-multimaster-ldaps | 571 +++++++++++++++++
e4ff3b
 18 files changed, 1846 insertions(+), 2 deletions(-)
e4ff3b
 create mode 100644 tests/data/slapd-tls-sasl.conf
e4ff3b
 create mode 100644 tests/data/slapd-tls.conf
e4ff3b
 create mode 100644 tests/data/tls/ca/certs/testsuiteCA.crt
e4ff3b
 create mode 100644 tests/data/tls/ca/private/testsuiteCA.key
e4ff3b
 create mode 100644 tests/data/tls/certs/bjensen@mailgw.example.com.crt
e4ff3b
 create mode 100644 tests/data/tls/certs/localhost.crt
e4ff3b
 create mode 100644 tests/data/tls/conf/openssl.cnf
e4ff3b
 create mode 100755 tests/data/tls/create-crt.sh
e4ff3b
 create mode 100644 tests/data/tls/private/bjensen@mailgw.example.com.key
e4ff3b
 create mode 100644 tests/data/tls/private/localhost.key
e4ff3b
 create mode 100755 tests/scripts/test067-tls
e4ff3b
 create mode 100755 tests/scripts/test068-sasl-tls-external
e4ff3b
 create mode 100755 tests/scripts/test069-delta-multimaster-starttls
e4ff3b
 create mode 100755 tests/scripts/test070-delta-multimaster-ldaps
e4ff3b
e4ff3b
diff --git a/configure b/configure
e4ff3b
index e87850ec2..e8a720961 100755
e4ff3b
--- a/configure
e4ff3b
+++ b/configure
e4ff3b
@@ -758,6 +758,7 @@ AUTH_LIBS
e4ff3b
 LIBSLAPI
e4ff3b
 SLAPI_LIBS
e4ff3b
 MODULES_LIBS
e4ff3b
+WITH_TLS_TYPE
e4ff3b
 TLS_LIBS
e4ff3b
 SASL_LIBS
e4ff3b
 KRB5_LIBS
e4ff3b
@@ -5133,6 +5134,7 @@ KRB4_LIBS=
e4ff3b
 KRB5_LIBS=
e4ff3b
 SASL_LIBS=
e4ff3b
 TLS_LIBS=
e4ff3b
+WITH_TLS_TYPE=
e4ff3b
 MODULES_LIBS=
e4ff3b
 SLAPI_LIBS=
e4ff3b
 LIBSLAPI=
e4ff3b
@@ -15582,6 +15584,7 @@ fi
e4ff3b
 		if test $have_openssl = yes ; then
e4ff3b
 			ol_with_tls=openssl
e4ff3b
 			ol_link_tls=yes
e4ff3b
+			WITH_TLS_TYPE=openssl
e4ff3b
 
e4ff3b
 
e4ff3b
 $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h
e4ff3b
@@ -15716,6 +15719,7 @@ fi
e4ff3b
 			if test $have_gnutls = yes ; then
e4ff3b
 				ol_with_tls=gnutls
e4ff3b
 				ol_link_tls=yes
e4ff3b
+				WITH_TLS_TYPE=gnutls
e4ff3b
 
e4ff3b
 				TLS_LIBS="-lgnutls"
e4ff3b
 
e4ff3b
diff --git a/configure.in b/configure.in
e4ff3b
index 0c7c0a9ee..cf143d9bf 100644
e4ff3b
--- a/configure.in
e4ff3b
+++ b/configure.in
e4ff3b
@@ -592,6 +592,7 @@ KRB4_LIBS=
e4ff3b
 KRB5_LIBS=
e4ff3b
 SASL_LIBS=
e4ff3b
 TLS_LIBS=
e4ff3b
+WITH_TLS_TYPE=
e4ff3b
 MODULES_LIBS=
e4ff3b
 SLAPI_LIBS=
e4ff3b
 LIBSLAPI=
e4ff3b
@@ -1186,6 +1187,7 @@ if test $ol_with_tls = openssl || test $ol_with_tls = auto ; then
e4ff3b
 		if test $have_openssl = yes ; then
e4ff3b
 			ol_with_tls=openssl
e4ff3b
 			ol_link_tls=yes
e4ff3b
+			WITH_TLS_TYPE=openssl
e4ff3b
 
e4ff3b
 			AC_DEFINE(HAVE_OPENSSL, 1, 
e4ff3b
 				[define if you have OpenSSL])
e4ff3b
@@ -1226,6 +1228,7 @@ if test $ol_link_tls = no ; then
e4ff3b
 			if test $have_gnutls = yes ; then
e4ff3b
 				ol_with_tls=gnutls
e4ff3b
 				ol_link_tls=yes
e4ff3b
+				WITH_TLS_TYPE=gnutls
e4ff3b
 
e4ff3b
 				TLS_LIBS="-lgnutls"
e4ff3b
 
e4ff3b
@@ -3163,6 +3166,7 @@ AC_SUBST(KRB4_LIBS)
e4ff3b
 AC_SUBST(KRB5_LIBS)
e4ff3b
 AC_SUBST(SASL_LIBS)
e4ff3b
 AC_SUBST(TLS_LIBS)
e4ff3b
+AC_SUBST(WITH_TLS_TYPE)
e4ff3b
 AC_SUBST(MODULES_LIBS)
e4ff3b
 AC_SUBST(SLAPI_LIBS)
e4ff3b
 AC_SUBST(LIBSLAPI)
e4ff3b
diff --git a/tests/data/slapd-tls-sasl.conf b/tests/data/slapd-tls-sasl.conf
e4ff3b
new file mode 100644
e4ff3b
index 000000000..f4bb0773e
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/slapd-tls-sasl.conf
e4ff3b
@@ -0,0 +1,65 @@
e4ff3b
+# stand-alone slapd config -- for testing (with indexing)
e4ff3b
+# $OpenLDAP$
e4ff3b
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
e4ff3b
+##
e4ff3b
+## Copyright 1998-2017 The OpenLDAP Foundation.
e4ff3b
+## All rights reserved.
e4ff3b
+##
e4ff3b
+## Redistribution and use in source and binary forms, with or without
e4ff3b
+## modification, are permitted only as authorized by the OpenLDAP
e4ff3b
+## Public License.
e4ff3b
+##
e4ff3b
+## A copy of this license is available in the file LICENSE in the
e4ff3b
+## top-level directory of the distribution or, alternatively, at
e4ff3b
+## <http://www.OpenLDAP.org/license.html>.
e4ff3b
+
e4ff3b
+#
e4ff3b
+include		@SCHEMADIR@/core.schema
e4ff3b
+include		@SCHEMADIR@/cosine.schema
e4ff3b
+#
e4ff3b
+include		@SCHEMADIR@/corba.schema
e4ff3b
+include		@SCHEMADIR@/java.schema
e4ff3b
+include		@SCHEMADIR@/inetorgperson.schema
e4ff3b
+include		@SCHEMADIR@/misc.schema
e4ff3b
+include		@SCHEMADIR@/nis.schema
e4ff3b
+include		@SCHEMADIR@/openldap.schema
e4ff3b
+#
e4ff3b
+include		@SCHEMADIR@/duaconf.schema
e4ff3b
+include		@SCHEMADIR@/dyngroup.schema
e4ff3b
+include		@SCHEMADIR@/ppolicy.schema
e4ff3b
+
e4ff3b
+#
e4ff3b
+pidfile		@TESTDIR@/slapd.1.pid
e4ff3b
+argsfile	@TESTDIR@/slapd.1.args
e4ff3b
+
e4ff3b
+# SSL configuration
e4ff3b
+TLSCACertificateFile @TESTDIR@/tls/ca/certs/testsuiteCA.crt
e4ff3b
+TLSCertificateKeyFile @TESTDIR@/tls/private/localhost.key
e4ff3b
+TLSCertificateFile @TESTDIR@/tls/certs/localhost.crt
e4ff3b
+TLSVerifyClient hard
e4ff3b
+
e4ff3b
+#
e4ff3b
+rootdse 	@DATADIR@/rootdse.ldif
e4ff3b
+
e4ff3b
+#mod#modulepath	../servers/slapd/back-@BACKEND@/
e4ff3b
+#mod#moduleload	back_@BACKEND@.la
e4ff3b
+#monitormod#modulepath ../servers/slapd/back-monitor/
e4ff3b
+#monitormod#moduleload back_monitor.la
e4ff3b
+
e4ff3b
+authz-regexp "email=([^,]*),cn=[^,]*,ou=OpenLDAP,o=OpenLDAP Foundation,st=CA,c=US" ldap:///ou=People,dc=example,dc=com??sub?(mail=$1)
e4ff3b
+
e4ff3b
+#######################################################################
e4ff3b
+# database definitions
e4ff3b
+#######################################################################
e4ff3b
+
e4ff3b
+database	@BACKEND@
e4ff3b
+suffix          "dc=example,dc=com"
e4ff3b
+rootdn          "cn=Manager,dc=example,dc=com"
e4ff3b
+rootpw          secret
e4ff3b
+#~null~#directory	@TESTDIR@/db.1.a
e4ff3b
+#indexdb#index		objectClass eq
e4ff3b
+#indexdb#index		mail eq
e4ff3b
+#ndb#dbname db_1_a
e4ff3b
+#ndb#include @DATADIR@/ndb.conf
e4ff3b
+
e4ff3b
+#monitor#database	monitor
e4ff3b
diff --git a/tests/data/slapd-tls.conf b/tests/data/slapd-tls.conf
e4ff3b
new file mode 100644
e4ff3b
index 000000000..6a7785557
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/slapd-tls.conf
e4ff3b
@@ -0,0 +1,61 @@
e4ff3b
+# stand-alone slapd config -- for testing (with indexing)
e4ff3b
+# $OpenLDAP$
e4ff3b
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
e4ff3b
+##
e4ff3b
+## Copyright 1998-2017 The OpenLDAP Foundation.
e4ff3b
+## All rights reserved.
e4ff3b
+##
e4ff3b
+## Redistribution and use in source and binary forms, with or without
e4ff3b
+## modification, are permitted only as authorized by the OpenLDAP
e4ff3b
+## Public License.
e4ff3b
+##
e4ff3b
+## A copy of this license is available in the file LICENSE in the
e4ff3b
+## top-level directory of the distribution or, alternatively, at
e4ff3b
+## <http://www.OpenLDAP.org/license.html>.
e4ff3b
+
e4ff3b
+#
e4ff3b
+include		@SCHEMADIR@/core.schema
e4ff3b
+include		@SCHEMADIR@/cosine.schema
e4ff3b
+#
e4ff3b
+include		@SCHEMADIR@/corba.schema
e4ff3b
+include		@SCHEMADIR@/java.schema
e4ff3b
+include		@SCHEMADIR@/inetorgperson.schema
e4ff3b
+include		@SCHEMADIR@/misc.schema
e4ff3b
+include		@SCHEMADIR@/nis.schema
e4ff3b
+include		@SCHEMADIR@/openldap.schema
e4ff3b
+#
e4ff3b
+include		@SCHEMADIR@/duaconf.schema
e4ff3b
+include		@SCHEMADIR@/dyngroup.schema
e4ff3b
+include		@SCHEMADIR@/ppolicy.schema
e4ff3b
+
e4ff3b
+#
e4ff3b
+pidfile		@TESTDIR@/slapd.1.pid
e4ff3b
+argsfile	@TESTDIR@/slapd.1.args
e4ff3b
+
e4ff3b
+# SSL configuration
e4ff3b
+TLSCertificateKeyFile @TESTDIR@/tls/private/localhost.key
e4ff3b
+TLSCertificateFile @TESTDIR@/tls/certs/localhost.crt
e4ff3b
+
e4ff3b
+#
e4ff3b
+rootdse 	@DATADIR@/rootdse.ldif
e4ff3b
+
e4ff3b
+#mod#modulepath	../servers/slapd/back-@BACKEND@/
e4ff3b
+#mod#moduleload	back_@BACKEND@.la
e4ff3b
+#monitormod#modulepath ../servers/slapd/back-monitor/
e4ff3b
+#monitormod#moduleload back_monitor.la
e4ff3b
+
e4ff3b
+#######################################################################
e4ff3b
+# database definitions
e4ff3b
+#######################################################################
e4ff3b
+
e4ff3b
+database	@BACKEND@
e4ff3b
+suffix          "dc=example,dc=com"
e4ff3b
+rootdn          "cn=Manager,dc=example,dc=com"
e4ff3b
+rootpw          secret
e4ff3b
+#~null~#directory	@TESTDIR@/db.1.a
e4ff3b
+#indexdb#index		objectClass eq
e4ff3b
+#indexdb#index		mail eq
e4ff3b
+#ndb#dbname db_1_a
e4ff3b
+#ndb#include @DATADIR@/ndb.conf
e4ff3b
+
e4ff3b
+#monitor#database	monitor
e4ff3b
diff --git a/tests/data/tls/ca/certs/testsuiteCA.crt b/tests/data/tls/ca/certs/testsuiteCA.crt
e4ff3b
new file mode 100644
e4ff3b
index 000000000..7458e7461
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/ca/certs/testsuiteCA.crt
e4ff3b
@@ -0,0 +1,16 @@
e4ff3b
+-----BEGIN CERTIFICATE-----
e4ff3b
+MIICgjCCAeugAwIBAgIJAJGJtO9oGgLiMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV
e4ff3b
+BAYTAlVTMQswCQYDVQQIDAJDQTEcMBoGA1UECgwTT3BlbkxEQVAgRm91bmRhdGlv
e4ff3b
+bjEfMB0GA1UECwwWT3BlbkxEQVAgVGVzdCBTdWl0ZSBDQTAgFw0xNzAxMTkyMDI0
e4ff3b
+NTFaGA8yNTE4MDIwMjIwMjQ1MVowWTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNB
e4ff3b
+MRwwGgYDVQQKDBNPcGVuTERBUCBGb3VuZGF0aW9uMR8wHQYDVQQLDBZPcGVuTERB
e4ff3b
+UCBUZXN0IFN1aXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3xcMd
e4ff3b
+rvEPxIzZ0FnGVfk6sLXW//4UbBZmmsHSNT7UDNpL301QrsOaATyiOMSPHxmQoLPb
e4ff3b
+lYOtTCPaHN9/KIHoCnEQ6tJRe30okA0DFnZvSH5jAm9E2QvsXMVXU5XIi9dZTNdL
e4ff3b
+6jwRajPQP3YfK+PyrtIqc0IvhB4Ori39vrFLpQIDAQABo1AwTjAdBgNVHQ4EFgQU
e4ff3b
+7fEPwfVJESrieK5MzzjBSK8xEfIwHwYDVR0jBBgwFoAU7fEPwfVJESrieK5MzzjB
e4ff3b
+SK8xEfIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQBtXLZWW6ZKZux/
e4ff3b
+wk7uLNZl01kPJUBiI+yMU5uY5PgOph1CpaUXp3QftCb0yRQ2g5d0CNYI5DyXuHws
e4ff3b
+ZSZRFF8SRwm3AogkMzYKenPF5m2OXSpvOMdnlbbFmIJnvwUfKhtinw+r0zvW8I8Q
e4ff3b
+aL52EFPS0o3tiAJXS82U2wrQdJ0YEw==
e4ff3b
+-----END CERTIFICATE-----
e4ff3b
diff --git a/tests/data/tls/ca/private/testsuiteCA.key b/tests/data/tls/ca/private/testsuiteCA.key
e4ff3b
new file mode 100644
e4ff3b
index 000000000..2e14d7033
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/ca/private/testsuiteCA.key
e4ff3b
@@ -0,0 +1,16 @@
e4ff3b
+-----BEGIN PRIVATE KEY-----
e4ff3b
+MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALfFwx2u8Q/EjNnQ
e4ff3b
+WcZV+Tqwtdb//hRsFmaawdI1PtQM2kvfTVCuw5oBPKI4xI8fGZCgs9uVg61MI9oc
e4ff3b
+338ogegKcRDq0lF7fSiQDQMWdm9IfmMCb0TZC+xcxVdTlciL11lM10vqPBFqM9A/
e4ff3b
+dh8r4/Ku0ipzQi+EHg6uLf2+sUulAgMBAAECgYBDOb7kjuh0Iix8SXFt0ml3hMkg
e4ff3b
+O0kQ43FWW2pnoT64h3MbqjY4O5YmMimiFi4hRPkvJPpma01eCapb0ZAYjhLm1bpf
e4ff3b
+7Ey+724CEN3/DnorbQ3b/Fe2AVl4msJKEQFoercnaS9tFDPoijzH/quC2agH41tn
e4ff3b
+rGWTpahq6JUIP6xkwQJBAPHJZVHGQ8P/5bGxqOkPLtjIfDLtAgInMxZgDjHhHw2f
e4ff3b
+wGoeRrZ3J1yW0tnWtTXBN+5fKjCd6QpEvBmwhiZ+S+0CQQDCk1JBq64UotqeSWnk
e4ff3b
+AmhRMyVs87P0DPW2Gg8y96Q3d5Rwmy65ITr4pf/xufcSkrTSObDLhfhRyJKz7W4l
e4ff3b
+vjeZAkBq99CtZuugENxLyu+RfDgbjEb2OMjErxb49TISeyhD3MNBr3dVTk3Jtqg9
e4ff3b
+27F7wKm/+bYuoA3zjwkwzFntOb7ZAkAY0Hz/DwwGabaD1U0B3SS8pk8xk+rxRu3X
e4ff3b
+KX+iul5hDIkLy16sEYbZyyHXDCZsYfVZki3v5sgCdhfvhmozugyRAkBQgCeI8K1N
e4ff3b
+I9rHrcMZUjVT/3AdjSu6xIM87Vv/oIzGUNaadnQONRaXZ+Kp5pv9j4B/18rPcQwL
e4ff3b
++b2qljWeZbGH
e4ff3b
+-----END PRIVATE KEY-----
e4ff3b
diff --git a/tests/data/tls/certs/bjensen@mailgw.example.com.crt b/tests/data/tls/certs/bjensen@mailgw.example.com.crt
e4ff3b
new file mode 100644
e4ff3b
index 000000000..93e3a0d39
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/certs/bjensen@mailgw.example.com.crt
e4ff3b
@@ -0,0 +1,16 @@
e4ff3b
+-----BEGIN CERTIFICATE-----
e4ff3b
+MIICejCCAeOgAwIBAgIBADANBgkqhkiG9w0BAQsFADBZMQswCQYDVQQGEwJVUzEL
e4ff3b
+MAkGA1UECAwCQ0ExHDAaBgNVBAoME09wZW5MREFQIEZvdW5kYXRpb24xHzAdBgNV
e4ff3b
+BAsMFk9wZW5MREFQIFRlc3QgU3VpdGUgQ0EwIBcNMTcwNTEwMjMxNjExWhgPMjUx
e4ff3b
+ODA1MjQyMzE2MTFaMIGbMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExHDAaBgNV
e4ff3b
+BAoME09wZW5MREFQIEZvdW5kYXRpb24xETAPBgNVBAsMCE9wZW5MREFQMSMwIQYD
e4ff3b
+VQQDDBpiamVuc2VuQG1haWxndy5leGFtcGxlLmNvbTEpMCcGCSqGSIb3DQEJARYa
e4ff3b
+YmplbnNlbkBtYWlsZ3cuZXhhbXBsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A
e4ff3b
+MIGJAoGBAMjb2C5VL+f/B/f2xJyhsdXeaGhWdABWqJlCiupk7QVPotpZphqJ2fKg
e4ff3b
+QbX2w0sPazujt8hG96F2mBv49pHqzhSrKN70EA/E7b8d6ynjJpBU2P9ZgVlttnmU
e4ff3b
+U++22BSuhthP5VQK7IqNyI7ZyQ4hFzuqb/XrHD1VCDo/Z/JAkw7jAgMBAAGjDTAL
e4ff3b
+MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADgYEAmAQhIIKqjC13rtAGEQHV/pKn
e4ff3b
+wOnLbNOumODqM+0MkEfqXXtR6eNGres2RNAtCJ5fqqDBTQCTqRzIt67cqdlJle2f
e4ff3b
+7vXYm8Y6NgxHwG+N1y7S0Xf+oo7/BJ+YJTLF7CLJuPNRqILWvXGlcNDcM1nekeKo
e4ff3b
+4DnnYQBDnq48VORVX94=
e4ff3b
+-----END CERTIFICATE-----
e4ff3b
diff --git a/tests/data/tls/certs/localhost.crt b/tests/data/tls/certs/localhost.crt
e4ff3b
new file mode 100644
e4ff3b
index 000000000..194cb119d
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/certs/localhost.crt
e4ff3b
@@ -0,0 +1,16 @@
e4ff3b
+-----BEGIN CERTIFICATE-----
e4ff3b
+MIICgzCCAeygAwIBAgIBADANBgkqhkiG9w0BAQsFADBZMQswCQYDVQQGEwJVUzEL
e4ff3b
+MAkGA1UECAwCQ0ExHDAaBgNVBAoME09wZW5MREFQIEZvdW5kYXRpb24xHzAdBgNV
e4ff3b
+BAsMFk9wZW5MREFQIFRlc3QgU3VpdGUgQ0EwIBcNMTcwNTEwMjMxNjExWhgPMjUx
e4ff3b
+ODA1MjQyMzE2MTFaMGoxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEcMBoGA1UE
e4ff3b
+CgwTT3BlbkxEQVAgRm91bmRhdGlvbjEcMBoGA1UECwwTT3BlbkxEQVAgVGVzdCBT
e4ff3b
+dWl0ZTESMBAGA1UEAwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
e4ff3b
+iQKBgQDutp3GaZXGSm7joDm1TYI+dhBAuL1+O+oJlmZL10GX/oHqc8WNobvuZGH4
e4ff3b
+7H8mQf7zWwJQWxL805oBDMPi2ncgha5ydaVsf4rBZATpweji04vd+672qtR/dGgv
e4ff3b
+8Re5G3ZFYWxUv8nb/DJojG601V2Ye/K3rf+Xwa9u4Q9EJqIivwIDAQABo0gwRjAJ
e4ff3b
+BgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAsBgNVHREEJTAjgglsb2NhbGhvc3SHBH8A
e4ff3b
+AAGHEAAAAAAAAAAAAAAAAAAAAAEwDQYJKoZIhvcNAQELBQADgYEAYItH9TDh/lqG
e4ff3b
+8XcBPi0bzGaUPkGlDY615xvsVCflnsfRqLKP/dCfi1GjaDajEmE874pvnmmZfwxl
e4ff3b
+0MRTqnhEmFdqjPzVSVKCeNQYWGr3wzKwI7qrhTLMg3Tz98Sz0+HUY8G9fwsNekAR
e4ff3b
+GjeZB1FxqDGHjxBq2O828iejw28bSz4=
e4ff3b
+-----END CERTIFICATE-----
e4ff3b
diff --git a/tests/data/tls/conf/openssl.cnf b/tests/data/tls/conf/openssl.cnf
e4ff3b
new file mode 100644
e4ff3b
index 000000000..a3c8ad9f6
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/conf/openssl.cnf
e4ff3b
@@ -0,0 +1,129 @@
e4ff3b
+HOME                    = .
e4ff3b
+RANDFILE                = $ENV::HOME/.rnd
e4ff3b
+
e4ff3b
+oid_section             = new_oids
e4ff3b
+
e4ff3b
+[ new_oids ]
e4ff3b
+tsa_policy1 = 1.2.3.4.1
e4ff3b
+tsa_policy2 = 1.2.3.4.5.6
e4ff3b
+tsa_policy3 = 1.2.3.4.5.7
e4ff3b
+
e4ff3b
+[ ca ]
e4ff3b
+default_ca      = CA_default            # The default ca section
e4ff3b
+
e4ff3b
+[ CA_default ]
e4ff3b
+
e4ff3b
+dir             = ./cruft		# Where everything is kept
e4ff3b
+certs           = $dir/certs            # Where the issued certs are kept
e4ff3b
+crl_dir         = $dir/crl              # Where the issued crl are kept
e4ff3b
+database        = $dir/index.txt        # database index file.
e4ff3b
+new_certs_dir   = $dir/certs         # default place for new certs.
e4ff3b
+certificate     = $dir/cacert.pem       # The CA certificate
e4ff3b
+serial          = $dir/serial           # The current serial number
e4ff3b
+crlnumber       = $dir/crlnumber        # the current crl number
e4ff3b
+crl             = $dir/crl.pem          # The current CRL
e4ff3b
+private_key     = $dir/private/cakey.pem# The private key
e4ff3b
+RANDFILE        = $dir/private/.rand    # private random number file
e4ff3b
+x509_extensions = usr_cert              # The extentions to add to the cert
e4ff3b
+name_opt        = ca_default            # Subject Name options
e4ff3b
+cert_opt        = ca_default            # Certificate field options
e4ff3b
+default_days    = 365                   # how long to certify for
e4ff3b
+default_crl_days= 30                    # how long before next CRL
e4ff3b
+default_md      = default               # use public key default MD
e4ff3b
+preserve        = no                    # keep passed DN ordering
e4ff3b
+policy          = policy_match
e4ff3b
+
e4ff3b
+[ policy_match ]
e4ff3b
+countryName             = match
e4ff3b
+stateOrProvinceName     = match
e4ff3b
+organizationName        = match
e4ff3b
+organizationalUnitName  = optional
e4ff3b
+commonName              = supplied
e4ff3b
+emailAddress            = optional
e4ff3b
+
e4ff3b
+[ policy_anything ]
e4ff3b
+countryName             = optional
e4ff3b
+stateOrProvinceName     = optional
e4ff3b
+localityName            = optional
e4ff3b
+organizationName        = optional
e4ff3b
+organizationalUnitName  = optional
e4ff3b
+commonName              = supplied
e4ff3b
+emailAddress            = optional
e4ff3b
+
e4ff3b
+[ req ]
e4ff3b
+default_bits            = 2048
e4ff3b
+default_keyfile         = privkey.pem
e4ff3b
+distinguished_name      = req_distinguished_name
e4ff3b
+attributes              = req_attributes
e4ff3b
+x509_extensions = v3_ca # The extentions to add to the self signed cert
e4ff3b
+
e4ff3b
+string_mask = utf8only
e4ff3b
+
e4ff3b
+[ req_distinguished_name ]
e4ff3b
+basicConstraints=CA:FALSE
e4ff3b
+
e4ff3b
+[ req_attributes ]
e4ff3b
+challengePassword               = A challenge password
e4ff3b
+challengePassword_min           = 4
e4ff3b
+challengePassword_max           = 20
e4ff3b
+
e4ff3b
+unstructuredName                = An optional company name
e4ff3b
+
e4ff3b
+[ usr_cert ]
e4ff3b
+
e4ff3b
+basicConstraints=CA:FALSE
e4ff3b
+nsComment                       = "OpenSSL Generated Certificate"
e4ff3b
+
e4ff3b
+subjectKeyIdentifier=hash
e4ff3b
+authorityKeyIdentifier=keyid,issuer
e4ff3b
+
e4ff3b
+[ v3_req ]
e4ff3b
+
e4ff3b
+basicConstraints = CA:FALSE
e4ff3b
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
e4ff3b
+subjectAltName = DNS:localhost,IP:127.0.0.1,IP:::1
e4ff3b
+
e4ff3b
+[ v3_ca ]
e4ff3b
+subjectKeyIdentifier=hash
e4ff3b
+authorityKeyIdentifier=keyid:always,issuer
e4ff3b
+basicConstraints = CA:true
e4ff3b
+
e4ff3b
+[ crl_ext ]
e4ff3b
+
e4ff3b
+authorityKeyIdentifier=keyid:always
e4ff3b
+
e4ff3b
+[ proxy_cert_ext ]
e4ff3b
+basicConstraints=CA:FALSE
e4ff3b
+nsComment                       = "OpenSSL Generated Certificate"
e4ff3b
+
e4ff3b
+subjectKeyIdentifier=hash
e4ff3b
+authorityKeyIdentifier=keyid,issuer
e4ff3b
+proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
e4ff3b
+
e4ff3b
+[ tsa ]
e4ff3b
+
e4ff3b
+default_tsa = tsa_config1       # the default TSA section
e4ff3b
+
e4ff3b
+[ tsa_config1 ]
e4ff3b
+
e4ff3b
+dir             = ./demoCA              # TSA root directory
e4ff3b
+serial          = $dir/tsaserial        # The current serial number (mandatory)
e4ff3b
+crypto_device   = builtin               # OpenSSL engine to use for signing
e4ff3b
+signer_cert     = $dir/tsacert.pem      # The TSA signing certificate
e4ff3b
+                                        # (optional)
e4ff3b
+certs           = $dir/cacert.pem       # Certificate chain to include in reply
e4ff3b
+                                        # (optional)
e4ff3b
+signer_key      = $dir/private/tsakey.pem # The TSA private key (optional)
e4ff3b
+
e4ff3b
+default_policy  = tsa_policy1           # Policy if request did not specify it
e4ff3b
+                                        # (optional)
e4ff3b
+other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional)
e4ff3b
+digests         = md5, sha1             # Acceptable message digests (mandatory)
e4ff3b
+accuracy        = secs:1, millisecs:500, microsecs:100  # (optional)
e4ff3b
+clock_precision_digits  = 0     # number of digits after dot. (optional)
e4ff3b
+ordering                = yes   # Is ordering defined for timestamps?
e4ff3b
+                                # (optional, default: no)
e4ff3b
+tsa_name                = yes   # Must the TSA name be included in the reply?
e4ff3b
+                                # (optional, default: no)
e4ff3b
+ess_cert_id_chain       = no    # Must the ESS cert id chain be included?
e4ff3b
+                                # (optional, default: no)
e4ff3b
diff --git a/tests/data/tls/create-crt.sh b/tests/data/tls/create-crt.sh
e4ff3b
new file mode 100755
e4ff3b
index 000000000..8c33a24fe
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/create-crt.sh
e4ff3b
@@ -0,0 +1,78 @@
e4ff3b
+#!/bin/sh
e4ff3b
+openssl=$(which openssl)
e4ff3b
+
e4ff3b
+if [ x"$openssl" = "x" ]; then
e4ff3b
+echo "OpenSSL command line binary not found, skipping..."
e4ff3b
+fi
e4ff3b
+
e4ff3b
+USAGE="$0 [-s] [-u <user@domain.com>]"
e4ff3b
+SERVER=0
e4ff3b
+USER=0
e4ff3b
+EMAIL=
e4ff3b
+
e4ff3b
+while test $# -gt 0 ; do
e4ff3b
+	case "$1" in
e4ff3b
+		-s | -server)
e4ff3b
+			SERVER=1;
e4ff3b
+			shift;;
e4ff3b
+		-u | -user)
e4ff3b
+			if [ x"$2" = "x" ]; then
e4ff3b
+				echo "User cert requires an email address as an argument"
e4ff3b
+				exit;
e4ff3b
+			fi
e4ff3b
+			USER=1;
e4ff3b
+			EMAIL="$2";
e4ff3b
+			shift; shift;;
e4ff3b
+		-)
e4ff3b
+			shift;;
e4ff3b
+		-*)
e4ff3b
+			echo "$USAGE"; exit 1
e4ff3b
+			;;
e4ff3b
+		*)
e4ff3b
+			break;;
e4ff3b
+	esac
e4ff3b
+done
e4ff3b
+
e4ff3b
+if [ $SERVER = 0 -a $USER = 0 ]; then
e4ff3b
+	echo "$USAGE";
e4ff3b
+	exit 1;
e4ff3b
+fi
e4ff3b
+
e4ff3b
+rm -rf ./openssl.cnf cruft
e4ff3b
+mkdir -p private certs cruft/private cruft/certs
e4ff3b
+
e4ff3b
+echo "00" > cruft/serial
e4ff3b
+touch cruft/index.txt
e4ff3b
+touch cruft/index.txt.attr
e4ff3b
+hn=$(hostname -f)
e4ff3b
+sed -e "s;@HOSTNAME@;$hn;" conf/openssl.cnf >  ./openssl.cnf
e4ff3b
+
e4ff3b
+if [ $SERVER = 1 ]; then
e4ff3b
+	rm -rf private/localhost.key certs/localhost.crt
e4ff3b
+
e4ff3b
+	$openssl req -new -nodes -out localhost.csr -keyout private/localhost.key \
e4ff3b
+		-newkey rsa:1024 -config ./openssl.cnf \
e4ff3b
+		-subj "/CN=localhost/OU=OpenLDAP Test Suite/O=OpenLDAP Foundation/ST=CA/C=US" \
e4ff3b
+		-batch > /dev/null 2>&1
e4ff3b
+
e4ff3b
+	$openssl ca -out certs/localhost.crt -notext -config ./openssl.cnf -days 183000 -in localhost.csr \
e4ff3b
+		-keyfile ca/private/testsuiteCA.key -extensions v3_req -cert ca/certs/testsuiteCA.crt \
e4ff3b
+		-batch >/dev/null 2>&1
e4ff3b
+
e4ff3b
+	rm -rf ./openssl.cnf ./localhost.csr cruft
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if [ $USER = 1 ]; then
e4ff3b
+	rm -f certs/$EMAIL.crt private/$EMAIL.key $EMAIL.csr
e4ff3b
+
e4ff3b
+	$openssl req -new -nodes -out $EMAIL.csr -keyout private/$EMAIL.key \
e4ff3b
+		-newkey rsa:1024 -config ./openssl.cnf \
e4ff3b
+		-subj "/emailAddress=$EMAIL/CN=$EMAIL/OU=OpenLDAP/O=OpenLDAP Foundation/ST=CA/C=US" \
e4ff3b
+		-batch >/dev/null 2>&1
e4ff3b
+
e4ff3b
+	$openssl ca -out certs/$EMAIL.crt -notext -config ./openssl.cnf -days 183000 -in $EMAIL.csr \
e4ff3b
+		-keyfile ca/private/testsuiteCA.key -extensions req_distinguished_name \
e4ff3b
+		-cert ca/certs/testsuiteCA.crt -batch >/dev/null 2>&1
e4ff3b
+
e4ff3b
+	rm -rf ./openssl.cnf ./$EMAIL.csr cruft
e4ff3b
+fi
e4ff3b
diff --git a/tests/data/tls/private/bjensen@mailgw.example.com.key b/tests/data/tls/private/bjensen@mailgw.example.com.key
e4ff3b
new file mode 100644
e4ff3b
index 000000000..5f4625fd7
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/private/bjensen@mailgw.example.com.key
e4ff3b
@@ -0,0 +1,16 @@
e4ff3b
+-----BEGIN PRIVATE KEY-----
e4ff3b
+MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMjb2C5VL+f/B/f2
e4ff3b
+xJyhsdXeaGhWdABWqJlCiupk7QVPotpZphqJ2fKgQbX2w0sPazujt8hG96F2mBv4
e4ff3b
+9pHqzhSrKN70EA/E7b8d6ynjJpBU2P9ZgVlttnmUU++22BSuhthP5VQK7IqNyI7Z
e4ff3b
+yQ4hFzuqb/XrHD1VCDo/Z/JAkw7jAgMBAAECgYEApDgKQadoaZd7nmJlUWJqEV+r
e4ff3b
+oVK9uOEhK1zaUtV9bBA2J6uQQLZgORyJXQqJlT7f/3zVb6uGHr7lkkk03wxIu+3e
e4ff3b
+nIi7or/Cw6KmxhgslsQamf/ujjeqRlij/4pJIpEYByme9SstfzMBFNWU4t+fguPg
e4ff3b
+xXz6lvVZuNiYRWWuXxECQQDwakp31mNczqLPg8fuhdgixz7HCK5g6p4XDw+Cu9Ra
e4ff3b
+EenuOJVlnwXdW+g5jooiV5RWhxbTO6ImtgbcBGoeLSbVAkEA1eEcifIzgSi8XODd
e4ff3b
+9i6dCSMHKk4FgDRk2DJxRePLK2J1kt2bhOz/N1130fTargDWo8QiQAnd7RBOMJO/
e4ff3b
+pGaq1wJAZ2afzrjzlWf+WFgqdmk0k4i0dHBEZ8Sg5/P/TNAyPeb0gRPvFXz2zcUI
e4ff3b
+tTCcMrcOQsTpSUKdtB6YBqsTZRUwXQI/FbjHLTtr/7Ijb0tnP5l8WXE1SRajeGHZ
e4ff3b
+3BtDZdW8zKszRbc8FEP9p6HWiXxUuVdcdUV2NQrLf0goqMZYsFm9AkBtV3URLS4D
e4ff3b
+tw0VPr/TtzDx0UTJU5POdRcNrrpm233A0EyGNmLuM7y0iLxrvCIN9z0RVu7AeMBg
e4ff3b
+36Ixj3L+5H18
e4ff3b
+-----END PRIVATE KEY-----
e4ff3b
diff --git a/tests/data/tls/private/localhost.key b/tests/data/tls/private/localhost.key
e4ff3b
new file mode 100644
e4ff3b
index 000000000..8a24f69f8
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/data/tls/private/localhost.key
e4ff3b
@@ -0,0 +1,16 @@
e4ff3b
+-----BEGIN PRIVATE KEY-----
e4ff3b
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAO62ncZplcZKbuOg
e4ff3b
+ObVNgj52EEC4vX476gmWZkvXQZf+gepzxY2hu+5kYfjsfyZB/vNbAlBbEvzTmgEM
e4ff3b
+w+LadyCFrnJ1pWx/isFkBOnB6OLTi937rvaq1H90aC/xF7kbdkVhbFS/ydv8MmiM
e4ff3b
+brTVXZh78ret/5fBr27hD0QmoiK/AgMBAAECgYEA0gs5tNY/BaWFASGA5bj3u4Ij
e4ff3b
+Nu/XPPX3Lsx54o3bl6RIKEYKNF91f4QweNmP39f+P596373jbTe7sOTMkBXu7qnf
e4ff3b
+2B51VBJ72Uq92gO2VXImK+uuC6JdZfYTlX1QJkaR6mxhBl3KAgUeGUgbL0Xp9XeJ
e4ff3b
+bVcPqDOpRyIlW/80EHECQQD6PWRkk+0H4EMRA3GAnMQv/+Cy+sqF0T0OBNsQ846q
e4ff3b
+1hQhJfVvjgj2flmJZpH9zBTaqDn4grJDfQ9cViZwf4k7AkEA9DVNHPNVpkeToWrf
e4ff3b
+3yH55Ya5WEAl/6oNsHlaSZ88SHCZGqY7hQrpjSycsEezmsnDeqfdVuO97G2nHC7U
e4ff3b
+VdPUTQJAAq8r54RKs53tOj5+NjH4TMeC4oicKYlQDVlx/CGQszZuqthcZKDyaap7
e4ff3b
+TWUDReStiJbrYEYOoXiy9HucF/LWRwJAQKeH9f06lN5oaJkKEmJFbg5ALew14z1b
e4ff3b
+iHhofgtpg2hEMLkIEw4zjUvdZBJnq7h1R5j/0cxT8S+KybxgPSTrFQJBAPTrj7bP
e4ff3b
+5M7tPyQtyFxhFhas6g4ZHz/D2yB7BL+hL3IiJf3fdWNcHTzBDFEgDOVjR/7CZ6L3
e4ff3b
+b61hkjQZfbEg5cg=
e4ff3b
+-----END PRIVATE KEY-----
e4ff3b
diff --git a/tests/run.in b/tests/run.in
e4ff3b
index a542eedec..468c3e1f2 100644
e4ff3b
--- a/tests/run.in
e4ff3b
+++ b/tests/run.in
e4ff3b
@@ -56,6 +56,7 @@ AC_valsort=valsort@BUILD_VALSORT@
e4ff3b
 # misc
e4ff3b
 AC_WITH_SASL=@WITH_SASL@
e4ff3b
 AC_WITH_TLS=@WITH_TLS@
e4ff3b
+AC_TLS_TYPE=@WITH_TLS_TYPE@
e4ff3b
 AC_WITH_MODULES_ENABLED=@WITH_MODULES_ENABLED@
e4ff3b
 AC_ACI_ENABLED=aci@WITH_ACI_ENABLED@
e4ff3b
 AC_THREADS=threads@BUILD_THREAD@
e4ff3b
@@ -74,7 +75,7 @@ export AC_bdb AC_hdb AC_ldap AC_mdb AC_meta AC_monitor AC_null AC_relay AC_sql \
e4ff3b
 	AC_refint AC_retcode AC_rwm AC_unique AC_syncprov AC_translucent \
e4ff3b
 	AC_valsort \
e4ff3b
 	AC_WITH_SASL AC_WITH_TLS AC_WITH_MODULES_ENABLED AC_ACI_ENABLED \
e4ff3b
-	AC_THREADS AC_LIBS_DYNAMIC
e4ff3b
+	AC_THREADS AC_LIBS_DYNAMIC AC_WITH_TLS AC_TLS_TYPE
e4ff3b
 
e4ff3b
 if test ! -x ../servers/slapd/slapd ; then
e4ff3b
 	echo "Could not locate slapd(8)"
e4ff3b
diff --git a/tests/scripts/defines.sh b/tests/scripts/defines.sh
e4ff3b
index b374cc500..8f7c7b853 100755
e4ff3b
--- a/tests/scripts/defines.sh
e4ff3b
+++ b/tests/scripts/defines.sh
e4ff3b
@@ -45,6 +45,9 @@ VALSORT=${AC_valsort-valsortno}
e4ff3b
 # misc
e4ff3b
 WITH_SASL=${AC_WITH_SASL-no}
e4ff3b
 USE_SASL=${SLAPD_USE_SASL-no}
e4ff3b
+WITH_TLS=${AC_WITH_TLS-no}
e4ff3b
+WITH_TLS_TYPE=${AC_TLS_TYPE-no}
e4ff3b
+
e4ff3b
 ACI=${AC_ACI_ENABLED-acino}
e4ff3b
 THREADS=${AC_THREADS-threadsno}
e4ff3b
 SLEEP0=${SLEEP0-1}
e4ff3b
@@ -103,6 +106,8 @@ P2SRCONSUMERCONF=$DATADIR/slapd-syncrepl-consumer-persist2.conf
e4ff3b
 P3SRCONSUMERCONF=$DATADIR/slapd-syncrepl-consumer-persist3.conf
e4ff3b
 REFCONSUMERCONF=$DATADIR/slapd-ref-consumer.conf
e4ff3b
 SCHEMACONF=$DATADIR/slapd-schema.conf
e4ff3b
+TLSCONF=$DATADIR/slapd-tls.conf
e4ff3b
+TLSSASLCONF=$DATADIR/slapd-tls-sasl.conf
e4ff3b
 GLUECONF=$DATADIR/slapd-glue.conf
e4ff3b
 REFINTCONF=$DATADIR/slapd-refint.conf
e4ff3b
 RETCODECONF=$DATADIR/slapd-retcode.conf
e4ff3b
@@ -163,6 +168,7 @@ SLURPLOG=$TESTDIR/slurp.log
e4ff3b
 CONFIGPWF=$TESTDIR/configpw
e4ff3b
 
e4ff3b
 # args
e4ff3b
+SASLARGS="-Q"
e4ff3b
 TOOLARGS="-x $LDAP_TOOLARGS"
e4ff3b
 TOOLPROTO="-P 3"
e4ff3b
 
e4ff3b
@@ -184,7 +190,8 @@ BCMP="diff -iB"
e4ff3b
 CMPOUT=/dev/null
e4ff3b
 SLAPD="$TESTWD/../servers/slapd/slapd -s0"
e4ff3b
 LDAPPASSWD="$CLIENTDIR/ldappasswd $TOOLARGS"
e4ff3b
-LDAPSASLSEARCH="$CLIENTDIR/ldapsearch $TOOLPROTO $LDAP_TOOLARGS -LLL"
e4ff3b
+LDAPSASLSEARCH="$CLIENTDIR/ldapsearch $SASLARGS $TOOLPROTO $LDAP_TOOLARGS -LLL"
e4ff3b
+LDAPSASLWHOAMI="$CLIENTDIR/ldapwhoami $SASLARGS $LDAP_TOOLARGS"
e4ff3b
 LDAPSEARCH="$CLIENTDIR/ldapsearch $TOOLPROTO $TOOLARGS -LLL"
e4ff3b
 LDAPRSEARCH="$CLIENTDIR/ldapsearch $TOOLPROTO $TOOLARGS"
e4ff3b
 LDAPDELETE="$CLIENTDIR/ldapdelete $TOOLPROTO $TOOLARGS"
e4ff3b
@@ -199,6 +206,7 @@ LDIFFILTER=$PROGDIR/ldif-filter
e4ff3b
 SLAPDMTREAD=$PROGDIR/slapd-mtread
e4ff3b
 LVL=${SLAPD_DEBUG-0x4105}
e4ff3b
 LOCALHOST=localhost
e4ff3b
+LOCALIP=127.0.0.1
e4ff3b
 BASEPORT=${SLAPD_BASEPORT-9010}
e4ff3b
 PORT1=`expr $BASEPORT + 1`
e4ff3b
 PORT2=`expr $BASEPORT + 2`
e4ff3b
@@ -207,11 +215,22 @@ PORT4=`expr $BASEPORT + 4`
e4ff3b
 PORT5=`expr $BASEPORT + 5`
e4ff3b
 PORT6=`expr $BASEPORT + 6`
e4ff3b
 URI1="ldap://${LOCALHOST}:$PORT1/"
e4ff3b
+URIP1="ldap://${LOCALIP}:$PORT1/"
e4ff3b
 URI2="ldap://${LOCALHOST}:$PORT2/"
e4ff3b
+URIP2="ldap://${LOCALIP}:$PORT2/"
e4ff3b
 URI3="ldap://${LOCALHOST}:$PORT3/"
e4ff3b
+URIP3="ldap://${LOCALIP}:$PORT3/"
e4ff3b
 URI4="ldap://${LOCALHOST}:$PORT4/"
e4ff3b
 URI5="ldap://${LOCALHOST}:$PORT5/"
e4ff3b
 URI6="ldap://${LOCALHOST}:$PORT6/"
e4ff3b
+SURI1="ldaps://${LOCALHOST}:$PORT1/"
e4ff3b
+SURIP1="ldaps://${LOCALIP}:$PORT1/"
e4ff3b
+SURI2="ldaps://${LOCALHOST}:$PORT2/"
e4ff3b
+SURIP2="ldaps://${LOCALIP}:$PORT2/"
e4ff3b
+SURI3="ldaps://${LOCALHOST}:$PORT3/"
e4ff3b
+SURI4="ldaps://${LOCALHOST}:$PORT4/"
e4ff3b
+SURI5="ldaps://${LOCALHOST}:$PORT5/"
e4ff3b
+SURI6="ldaps://${LOCALHOST}:$PORT6/"
e4ff3b
 
e4ff3b
 # LDIF
e4ff3b
 LDIF=$DATADIR/test.ldif
e4ff3b
diff --git a/tests/scripts/test067-tls b/tests/scripts/test067-tls
e4ff3b
new file mode 100755
e4ff3b
index 000000000..2b245f5f5
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/scripts/test067-tls
e4ff3b
@@ -0,0 +1,140 @@
e4ff3b
+#! /bin/sh
e4ff3b
+# $OpenLDAP$
e4ff3b
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
e4ff3b
+##
e4ff3b
+## Copyright 1998-2017 The OpenLDAP Foundation.
e4ff3b
+## All rights reserved.
e4ff3b
+##
e4ff3b
+## Redistribution and use in source and binary forms, with or without
e4ff3b
+## modification, are permitted only as authorized by the OpenLDAP
e4ff3b
+## Public License.
e4ff3b
+##
e4ff3b
+## A copy of this license is available in the file LICENSE in the
e4ff3b
+## top-level directory of the distribution or, alternatively, at
e4ff3b
+## <http://www.OpenLDAP.org/license.html>.
e4ff3b
+
e4ff3b
+echo "running defines.sh"
e4ff3b
+. $SRCDIR/scripts/defines.sh
e4ff3b
+
e4ff3b
+if test $WITH_TLS = no ; then
e4ff3b
+        echo "TLS support not available, test skipped"
e4ff3b
+        exit 0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+mkdir -p $TESTDIR $DBDIR1
e4ff3b
+cp -r $DATADIR/tls $TESTDIR
e4ff3b
+
e4ff3b
+cd $TESTWD
e4ff3b
+
e4ff3b
+echo "Starting ldap:/// slapd on TCP/IP port $PORT1 and ldaps:/// slapd on $PORT2..."
e4ff3b
+. $CONFFILTER $BACKEND $MONITORDB < $TLSCONF > $CONF1
e4ff3b
+$SLAPD -f $CONF1 -h "$URI1 $SURI2" -d $LVL $TIMING > $LOG1 2>&1 &
e4ff3b
+PID=$!
e4ff3b
+if test $WAIT != 0 ; then
e4ff3b
+    echo PID $PID
e4ff3b
+    read foo
e4ff3b
+fi
e4ff3b
+KILLPIDS="$PID"
e4ff3b
+
e4ff3b
+sleep 1
e4ff3b
+
e4ff3b
+for i in 0 1 2 3 4 5; do
e4ff3b
+	$LDAPSEARCH -s base -b "" -H $URI1 \
e4ff3b
+		'objectclass=*' > /dev/null 2>&1
e4ff3b
+        RC=$?
e4ff3b
+        if test $RC = 0 ; then
e4ff3b
+                break
e4ff3b
+        fi
e4ff3b
+        echo "Waiting 5 seconds for slapd to start..."
e4ff3b
+        sleep 5
e4ff3b
+done
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Using ldapsearch with startTLS with no server cert validation...."
e4ff3b
+$LDAPSEARCH -o tls_reqcert=never -ZZ -b "" -s base -H $URIP1 \
e4ff3b
+	'@extensibleObject' > $SEARCHOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch (startTLS) failed ($RC)!"
e4ff3b
+	exit $RC
e4ff3b
+else
e4ff3b
+	echo "success"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Using ldapsearch with startTLS with hard require cert...."
e4ff3b
+$LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -o tls_reqcert=hard -ZZ -b "" -s base -H $URIP1 \
e4ff3b
+	'@extensibleObject' > $SEARCHOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch (startTLS) failed ($RC)!"
e4ff3b
+	exit $RC
e4ff3b
+else
e4ff3b
+	echo "success"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if test $WITH_TLS_TYPE = openssl ; then
e4ff3b
+	echo -n "Using ldapsearch with startTLS and specific protocol version...."
e4ff3b
+	$LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -o tls_reqcert=hard -o tls_protocol_min=3.3 -ZZ -b "" -s base -H $URIP1 \
e4ff3b
+		'@extensibleObject' > $SEARCHOUT 2>&1
e4ff3b
+	RC=$?
e4ff3b
+	if test $RC != 0 ; then
e4ff3b
+		echo "ldapsearch (protocol-min) failed ($RC)!"
e4ff3b
+		exit $RC
e4ff3b
+	else
e4ff3b
+		echo "success"
e4ff3b
+	fi
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Using ldapsearch on $SURI2 with no server cert validation..."
e4ff3b
+$LDAPSEARCH -o tls_reqcert=never -b "cn=Subschema" -s base -H $SURIP2 \
e4ff3b
+	'(&(objectClasses=top)(objectClasses=2.5.6.0))' cn objectClass \
e4ff3b
+	>> $SEARCHOUT  2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch (ldaps) failed($RC)!"
e4ff3b
+	exit $RC
e4ff3b
+else
e4ff3b
+	echo "success"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Using ldapsearch on $SURI2 with reqcert HARD and no CA cert.  Should fail..."
e4ff3b
+$LDAPSEARCH -o tls_reqcert=hard -b "cn=Subschema" -s base -H $SURIP2 \
e4ff3b
+	'(&(objectClasses=top)(objectClasses=2.5.6.0))' cn objectClass \
e4ff3b
+	>> $SEARCHOUT  2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC = 0 ; then
e4ff3b
+	echo "ldapsearch (ldaps) succeeded when it should have failed($RC)!"
e4ff3b
+	exit 1
e4ff3b
+else
e4ff3b
+	echo "failed correctly with error code ($RC)"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Using ldapsearch on $SURI2 with CA cert and reqcert HARD..."
e4ff3b
+$LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -o tls_reqcert=hard -b "cn=Subschema" -s base -H $SURIP2 \
e4ff3b
+	'(&(objectClasses=top)(objectClasses=2.5.6.0))' cn objectClass \
e4ff3b
+	>> $SEARCHOUT  2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch (ldaps) failed ($RC)!"
e4ff3b
+	exit $RC
e4ff3b
+else
e4ff3b
+	echo "success"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo ">>>>> Test failed"
e4ff3b
+else
e4ff3b
+	echo ">>>>> Test succeeded"
e4ff3b
+	RC=0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && wait
e4ff3b
+
e4ff3b
+exit $RC
e4ff3b
diff --git a/tests/scripts/test068-sasl-tls-external b/tests/scripts/test068-sasl-tls-external
e4ff3b
new file mode 100755
e4ff3b
index 000000000..dcbc50fd4
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/scripts/test068-sasl-tls-external
e4ff3b
@@ -0,0 +1,102 @@
e4ff3b
+#! /bin/sh
e4ff3b
+# $OpenLDAP$
e4ff3b
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
e4ff3b
+##
e4ff3b
+## Copyright 1998-2017 The OpenLDAP Foundation.
e4ff3b
+## All rights reserved.
e4ff3b
+##
e4ff3b
+## Redistribution and use in source and binary forms, with or without
e4ff3b
+## modification, are permitted only as authorized by the OpenLDAP
e4ff3b
+## Public License.
e4ff3b
+##
e4ff3b
+## A copy of this license is available in the file LICENSE in the
e4ff3b
+## top-level directory of the distribution or, alternatively, at
e4ff3b
+## <http://www.OpenLDAP.org/license.html>.
e4ff3b
+
e4ff3b
+echo "running defines.sh"
e4ff3b
+. $SRCDIR/scripts/defines.sh
e4ff3b
+
e4ff3b
+if test $WITH_TLS = no ; then
e4ff3b
+        echo "TLS support not available, test skipped"
e4ff3b
+        exit 0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+mkdir -p $TESTDIR $DBDIR1
e4ff3b
+cp -r $DATADIR/tls $TESTDIR
e4ff3b
+
e4ff3b
+cd $TESTWD
e4ff3b
+
e4ff3b
+echo "Running slapadd to build slapd database..."
e4ff3b
+. $CONFFILTER $BACKEND $MONITORDB < $TLSSASLCONF > $CONF1
e4ff3b
+$SLAPADD -f $CONF1 -l $LDIFORDERED
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+        echo "slapadd failed ($RC)!"
e4ff3b
+        exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo "Starting ldap:/// slapd on TCP/IP port $PORT1 and ldaps:/// slapd on $PORT2..."
e4ff3b
+$SLAPD -f $CONF1 -h "$URI1 $SURI2" -d $LVL $TIMING > $LOG1 2>&1 &
e4ff3b
+PID=$!
e4ff3b
+if test $WAIT != 0 ; then
e4ff3b
+    echo PID $PID
e4ff3b
+    read foo
e4ff3b
+fi
e4ff3b
+KILLPIDS="$PID"
e4ff3b
+
e4ff3b
+sleep 1
e4ff3b
+
e4ff3b
+for i in 0 1 2 3 4 5; do
e4ff3b
+	$LDAPSEARCH -s base -b "" -H $URI1 \
e4ff3b
+		'objectclass=*' > /dev/null 2>&1
e4ff3b
+        RC=$?
e4ff3b
+        if test $RC = 0 ; then
e4ff3b
+                break
e4ff3b
+        fi
e4ff3b
+        echo "Waiting 5 seconds for slapd to start..."
e4ff3b
+        sleep 5
e4ff3b
+done
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Using ldapwhoami with SASL/EXTERNAL...."
e4ff3b
+$LDAPSASLWHOAMI -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -o tls_reqcert=hard \
e4ff3b
+	-o tls_cert=$TESTDIR/tls/certs/bjensen@mailgw.example.com.crt -o tls_key=$TESTDIR/tls/private/bjensen@mailgw.example.com.key -ZZ -Y EXTERNAL -H $URIP1 \
e4ff3b
+	> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapwhoami (startTLS) failed ($RC)!"
e4ff3b
+	exit $RC
e4ff3b
+else
e4ff3b
+	echo "success"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo -n "Validating mapped SASL ID..."
e4ff3b
+echo 'dn:cn=barbara jensen,ou=information technology division,ou=people,dc=example,dc=com' > $TESTDIR/dn.out
e4ff3b
+$CMP $TESTDIR/dn.out $TESTOUT > $CMPOUT
e4ff3b
+
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "Comparison failed"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $PID
e4ff3b
+	exit $RC
e4ff3b
+else
e4ff3b
+	echo "success"
e4ff3b
+fi
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo ">>>>> Test failed"
e4ff3b
+else
e4ff3b
+	echo ">>>>> Test succeeded"
e4ff3b
+	RC=0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && wait
e4ff3b
+
e4ff3b
+exit $RC
e4ff3b
diff --git a/tests/scripts/test069-delta-multimaster-starttls b/tests/scripts/test069-delta-multimaster-starttls
e4ff3b
new file mode 100755
e4ff3b
index 000000000..2dfbb30a1
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/scripts/test069-delta-multimaster-starttls
e4ff3b
@@ -0,0 +1,574 @@
e4ff3b
+#! /bin/sh
e4ff3b
+# $OpenLDAP$
e4ff3b
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
e4ff3b
+##
e4ff3b
+## Copyright 1998-2017 The OpenLDAP Foundation.
e4ff3b
+## All rights reserved.
e4ff3b
+##
e4ff3b
+## Redistribution and use in source and binary forms, with or without
e4ff3b
+## modification, are permitted only as authorized by the OpenLDAP
e4ff3b
+## Public License.
e4ff3b
+##
e4ff3b
+## A copy of this license is available in the file LICENSE in the
e4ff3b
+## top-level directory of the distribution or, alternatively, at
e4ff3b
+## <http://www.OpenLDAP.org/license.html>.
e4ff3b
+
e4ff3b
+echo "running defines.sh"
e4ff3b
+. $SRCDIR/scripts/defines.sh
e4ff3b
+
e4ff3b
+if test $WITH_TLS = no ; then
e4ff3b
+        echo "TLS support not available, test skipped"
e4ff3b
+        exit 0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if test $SYNCPROV = syncprovno; then
e4ff3b
+	echo "Syncrepl provider overlay not available, test skipped"
e4ff3b
+	exit 0
e4ff3b
+fi
e4ff3b
+if test $ACCESSLOG = accesslogno; then
e4ff3b
+	echo "Accesslog overlay not available, test skipped"
e4ff3b
+	exit 0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+MMR=2
e4ff3b
+
e4ff3b
+XDIR=$TESTDIR/srv
e4ff3b
+TMP=$TESTDIR/tmp
e4ff3b
+
e4ff3b
+mkdir -p $TESTDIR
e4ff3b
+cp -r $DATADIR/tls $TESTDIR
e4ff3b
+
e4ff3b
+$SLAPPASSWD -g -n >$CONFIGPWF
e4ff3b
+
e4ff3b
+if test x"$SYNCMODE" = x ; then
e4ff3b
+	SYNCMODE=rp
e4ff3b
+fi
e4ff3b
+case "$SYNCMODE" in
e4ff3b
+	ro)
e4ff3b
+		SYNCTYPE="type=refreshOnly interval=00:00:00:03"
e4ff3b
+		;;
e4ff3b
+	rp)
e4ff3b
+		SYNCTYPE="type=refreshAndPersist interval=00:00:00:03"
e4ff3b
+		;;
e4ff3b
+	*)
e4ff3b
+		echo "unknown sync mode $SYNCMODE"
e4ff3b
+		exit 1;
e4ff3b
+		;;
e4ff3b
+esac
e4ff3b
+
e4ff3b
+#
e4ff3b
+# Test delta-sync mmr
e4ff3b
+# - start servers
e4ff3b
+# - configure over ldap
e4ff3b
+# - populate over ldap
e4ff3b
+# - configure syncrepl over ldap
e4ff3b
+# - break replication
e4ff3b
+# - modify each server separately
e4ff3b
+# - restore replication
e4ff3b
+# - compare results
e4ff3b
+#
e4ff3b
+
e4ff3b
+nullExclude=""
e4ff3b
+test $BACKEND = null && nullExclude="# "
e4ff3b
+
e4ff3b
+KILLPIDS=
e4ff3b
+
e4ff3b
+echo "Initializing server configurations..."
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+
e4ff3b
+DBDIR=${XDIR}$n/db
e4ff3b
+CFDIR=${XDIR}$n/slapd.d
e4ff3b
+
e4ff3b
+mkdir -p ${XDIR}$n $DBDIR.1 $DBDIR.2 $CFDIR
e4ff3b
+
e4ff3b
+o=`expr 3 - $n`
e4ff3b
+cat > $TMP <
e4ff3b
+dn: cn=config
e4ff3b
+objectClass: olcGlobal
e4ff3b
+cn: config
e4ff3b
+olcServerID: $n
e4ff3b
+olcTLSCertificateFile: $TESTDIR/tls/certs/localhost.crt
e4ff3b
+olcTLSCertificateKeyFile: $TESTDIR/tls/private/localhost.key
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+
e4ff3b
+if [ "$SYNCPROV" = syncprovmod -o "$ACCESSLOG" = accesslogmod ]; then
e4ff3b
+  cat <<EOF >> $TMP
e4ff3b
+dn: cn=module,cn=config
e4ff3b
+objectClass: olcModuleList
e4ff3b
+cn: module
e4ff3b
+olcModulePath: $TESTWD/../servers/slapd/overlays
e4ff3b
+EOF
e4ff3b
+  if [ "$SYNCPROV" = syncprovmod ]; then
e4ff3b
+  echo "olcModuleLoad: syncprov.la" >> $TMP
e4ff3b
+  fi
e4ff3b
+  if [ "$ACCESSLOG" = accesslogmod ]; then
e4ff3b
+  echo "olcModuleLoad: accesslog.la" >> $TMP
e4ff3b
+  fi
e4ff3b
+  echo "" >> $TMP
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if [ "$BACKENDTYPE" = mod ]; then
e4ff3b
+cat <<EOF >> $TMP
e4ff3b
+dn: cn=module,cn=config
e4ff3b
+objectClass: olcModuleList
e4ff3b
+cn: module
e4ff3b
+olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
e4ff3b
+olcModuleLoad: back_$BACKEND.la
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+fi
e4ff3b
+MYURI=`eval echo '$URI'$n`
e4ff3b
+PROVIDERURI=`eval echo '$URIP'$o`
e4ff3b
+if test $INDEXDB = indexdb ; then
e4ff3b
+INDEX1="olcDbIndex: objectClass,entryCSN,reqStart,reqDN,reqResult eq"
e4ff3b
+INDEX2="olcDbIndex: objectClass,entryCSN,entryUUID eq"
e4ff3b
+else
e4ff3b
+INDEX1=
e4ff3b
+INDEX2=
e4ff3b
+fi
e4ff3b
+cat >> $TMP <
e4ff3b
+dn: cn=schema,cn=config
e4ff3b
+objectclass: olcSchemaconfig
e4ff3b
+cn: schema
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/core.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/cosine.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/inetorgperson.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/openldap.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/nis.ldif
e4ff3b
+
e4ff3b
+dn: olcDatabase={0}config,cn=config
e4ff3b
+objectClass: olcDatabaseConfig
e4ff3b
+olcDatabase: {0}config
e4ff3b
+olcRootPW:< file://$CONFIGPWF
e4ff3b
+
e4ff3b
+dn: olcDatabase={1}$BACKEND,cn=config
e4ff3b
+objectClass: olcDatabaseConfig
e4ff3b
+${nullExclude}objectClass: olc${BACKEND}Config
e4ff3b
+olcDatabase: {1}$BACKEND
e4ff3b
+olcSuffix: cn=log
e4ff3b
+${nullExclude}olcDbDirectory: ${DBDIR}.1
e4ff3b
+olcRootDN: $MANAGERDN
e4ff3b
+$INDEX1
e4ff3b
+
e4ff3b
+dn: olcOverlay=syncprov,olcDatabase={1}$BACKEND,cn=config
e4ff3b
+objectClass: olcOverlayConfig
e4ff3b
+objectClass: olcSyncProvConfig
e4ff3b
+olcOverlay: syncprov
e4ff3b
+olcSpNoPresent: TRUE
e4ff3b
+olcSpReloadHint: TRUE
e4ff3b
+
e4ff3b
+dn: olcDatabase={2}$BACKEND,cn=config
e4ff3b
+objectClass: olcDatabaseConfig
e4ff3b
+${nullExclude}objectClass: olc${BACKEND}Config
e4ff3b
+olcDatabase: {2}$BACKEND
e4ff3b
+olcSuffix: $BASEDN
e4ff3b
+${nullExclude}olcDbDirectory: ${DBDIR}.2
e4ff3b
+olcRootDN: $MANAGERDN
e4ff3b
+olcRootPW: $PASSWD
e4ff3b
+olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
e4ff3b
+  credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
e4ff3b
+  retry="3 +" timeout=3 logbase="cn=log"
e4ff3b
+  logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
e4ff3b
+  syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
e4ff3b
+  starttls=critical
e4ff3b
+olcMirrorMode: TRUE
e4ff3b
+$INDEX2
e4ff3b
+
e4ff3b
+dn: olcOverlay=syncprov,olcDatabase={2}$BACKEND,cn=config
e4ff3b
+objectClass: olcOverlayConfig
e4ff3b
+objectClass: olcSyncProvConfig
e4ff3b
+olcOverlay: syncprov
e4ff3b
+
e4ff3b
+dn: olcOverlay=accesslog,olcDatabase={2}$BACKEND,cn=config
e4ff3b
+objectClass: olcOverlayConfig
e4ff3b
+objectClass: olcAccessLogConfig
e4ff3b
+olcOverlay: accesslog
e4ff3b
+olcAccessLogDB: cn=log
e4ff3b
+olcAccessLogOps: writes
e4ff3b
+olcAccessLogSuccess: TRUE
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+$SLAPADD -F $CFDIR -n 0  -d-1< $TMP > $TESTOUT 2>&1
e4ff3b
+PORT=`eval echo '$PORT'$n`
e4ff3b
+echo "Starting server $n on TCP/IP port $PORT..."
e4ff3b
+cd ${XDIR}${n}
e4ff3b
+LOG=`eval echo '$LOG'$n`
e4ff3b
+$SLAPD -F slapd.d -h $MYURI -d $LVL $TIMING > $LOG 2>&1 &
e4ff3b
+PID=$!
e4ff3b
+if test $WAIT != 0 ; then
e4ff3b
+    echo PID $PID
e4ff3b
+    read foo
e4ff3b
+fi
e4ff3b
+KILLPIDS="$PID $KILLPIDS"
e4ff3b
+cd $TESTWD
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to check that server $n is running..."
e4ff3b
+for i in 0 1 2 3 4 5; do
e4ff3b
+	$LDAPSEARCH -s base -b "" -H $MYURI \
e4ff3b
+		'objectclass=*' > /dev/null 2>&1
e4ff3b
+	RC=$?
e4ff3b
+	if test $RC = 0 ; then
e4ff3b
+		break
e4ff3b
+	fi
e4ff3b
+	echo "Waiting 5 seconds for slapd to start..."
e4ff3b
+	sleep 5
e4ff3b
+done
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if [ $n = 1 ]; then
e4ff3b
+echo "Using ldapadd for context on server 1..."
e4ff3b
+$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDCP \
e4ff3b
+	>> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapadd failed for server $n database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+fi
e4ff3b
+
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Using ldapadd to populate server 1..."
e4ff3b
+$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDNOCP \
e4ff3b
+	>> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapadd failed for server $n database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
e4ff3b
+sleep $SLEEP1
e4ff3b
+
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+PORT=`expr $BASEPORT + $n`
e4ff3b
+URI="ldap://${LOCALHOST}:$PORT/"
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to read all the entries from server $n..."
e4ff3b
+$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
e4ff3b
+	'objectclass=*' > $TESTDIR/server$n.out 2>&1
e4ff3b
+RC=$?
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed at server $n ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+$LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=2
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+echo "Comparing retrieved entries from server 1 and server $n..."
e4ff3b
+$CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
e4ff3b
+
e4ff3b
+if test $? != 0 ; then
e4ff3b
+	echo "test failed - server 1 and server $n databases differ"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit 1
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Using ldapadd to populate server 2..."
e4ff3b
+$LDAPADD -D "$MANAGERDN" -H $URI2 -w $PASSWD -f $LDIFADD1 \
e4ff3b
+	>> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapadd failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+THEDN="cn=James A Jones 2,ou=Alumni Association,ou=People,dc=example,dc=com"
e4ff3b
+sleep 1
e4ff3b
+for i in 1 2 3; do
e4ff3b
+	$LDAPSEARCH -S "" -b "$THEDN" -H $URI1 \
e4ff3b
+		-s base '(objectClass=*)' entryCSN > "${MASTEROUT}.$i" 2>&1
e4ff3b
+	RC=$?
e4ff3b
+
e4ff3b
+	if test $RC = 0 ; then
e4ff3b
+		break
e4ff3b
+	fi
e4ff3b
+
e4ff3b
+	if test $RC != 32 ; then
e4ff3b
+		echo "ldapsearch failed at slave ($RC)!"
e4ff3b
+		test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+		exit $RC
e4ff3b
+	fi
e4ff3b
+
e4ff3b
+	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
e4ff3b
+	sleep $SLEEP1
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+PORT=`expr $BASEPORT + $n`
e4ff3b
+URI="ldap://${LOCALHOST}:$PORT/"
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to read all the entries from server $n..."
e4ff3b
+$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
e4ff3b
+	'objectclass=*' > $TESTDIR/server$n.out 2>&1
e4ff3b
+RC=$?
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed at server $n ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+$LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=2
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+echo "Comparing retrieved entries from server 1 and server $n..."
e4ff3b
+$CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
e4ff3b
+
e4ff3b
+if test $? != 0 ; then
e4ff3b
+	echo "test failed - server 1 and server $n databases differ"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit 1
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Breaking replication between server 1 and 2..."
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+o=`expr 3 - $n`
e4ff3b
+MYURI=`eval echo '$URI'$n`
e4ff3b
+PROVIDERURI=`eval echo '$URIP'$o`
e4ff3b
+$LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <
e4ff3b
+dn: olcDatabase={2}$BACKEND,cn=config
e4ff3b
+changetype: modify
e4ff3b
+replace: olcSyncRepl
e4ff3b
+olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
e4ff3b
+  credentials=InvalidPw searchbase="$BASEDN" $SYNCTYPE
e4ff3b
+  retry="3 +" timeout=3 logbase="cn=log"
e4ff3b
+  logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
e4ff3b
+  syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
e4ff3b
+  starttls=critical
e4ff3b
+-
e4ff3b
+replace: olcMirrorMode
e4ff3b
+olcMirrorMode: TRUE
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server $n config ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Using ldapmodify to force conflicts between server 1 and 2..."
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: description
e4ff3b
+description: Amazing
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: description
e4ff3b
+description: Stupendous
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+delete: description
e4ff3b
+description: Outstanding
e4ff3b
+-
e4ff3b
+add: description
e4ff3b
+description: Mindboggling
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+delete: description
e4ff3b
+description: OutStanding
e4ff3b
+-
e4ff3b
+add: description
e4ff3b
+description: Bizarre
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: carLicense
e4ff3b
+carLicense: 123-XYZ
e4ff3b
+-
e4ff3b
+add: employeeNumber
e4ff3b
+employeeNumber: 32
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: employeeType
e4ff3b
+employeeType: deadwood
e4ff3b
+-
e4ff3b
+add: employeeNumber
e4ff3b
+employeeNumber: 64
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+replace: sn
e4ff3b
+sn: Replaced later
e4ff3b
+-
e4ff3b
+replace: sn
e4ff3b
+sn: Surname
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo "Restoring replication between server 1 and 2..."
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+o=`expr 3 - $n`
e4ff3b
+MYURI=`eval echo '$URI'$n`
e4ff3b
+PROVIDERURI=`eval echo '$URIP'$o`
e4ff3b
+$LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <
e4ff3b
+dn: olcDatabase={2}$BACKEND,cn=config
e4ff3b
+changetype: modify
e4ff3b
+replace: olcSyncRepl
e4ff3b
+olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
e4ff3b
+  credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
e4ff3b
+  retry="3 +" timeout=3 logbase="cn=log"
e4ff3b
+  logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
e4ff3b
+  syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
e4ff3b
+  starttls=critical
e4ff3b
+-
e4ff3b
+replace: olcMirrorMode
e4ff3b
+olcMirrorMode: TRUE
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server $n config ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
e4ff3b
+sleep $SLEEP1
e4ff3b
+
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+PORT=`expr $BASEPORT + $n`
e4ff3b
+URI="ldap://${LOCALHOST}:$PORT/"
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to read all the entries from server $n..."
e4ff3b
+$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
e4ff3b
+	'objectclass=*' > $TESTDIR/server$n.out 2>&1
e4ff3b
+RC=$?
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed at server $n ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+$LDIFFILTER -s a < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=2
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+echo "Comparing retrieved entries from server 1 and server $n..."
e4ff3b
+$CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
e4ff3b
+
e4ff3b
+if test $? != 0 ; then
e4ff3b
+	echo "test failed - server 1 and server $n databases differ"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit 1
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+
e4ff3b
+echo ">>>>> Test succeeded"
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && wait
e4ff3b
+
e4ff3b
+exit 0
e4ff3b
diff --git a/tests/scripts/test070-delta-multimaster-ldaps b/tests/scripts/test070-delta-multimaster-ldaps
e4ff3b
new file mode 100755
e4ff3b
index 000000000..1024640ef
e4ff3b
--- /dev/null
e4ff3b
+++ b/tests/scripts/test070-delta-multimaster-ldaps
e4ff3b
@@ -0,0 +1,571 @@
e4ff3b
+#! /bin/sh
e4ff3b
+# $OpenLDAP$
e4ff3b
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
e4ff3b
+##
e4ff3b
+## Copyright 1998-2017 The OpenLDAP Foundation.
e4ff3b
+## All rights reserved.
e4ff3b
+##
e4ff3b
+## Redistribution and use in source and binary forms, with or without
e4ff3b
+## modification, are permitted only as authorized by the OpenLDAP
e4ff3b
+## Public License.
e4ff3b
+##
e4ff3b
+## A copy of this license is available in the file LICENSE in the
e4ff3b
+## top-level directory of the distribution or, alternatively, at
e4ff3b
+## <http://www.OpenLDAP.org/license.html>.
e4ff3b
+
e4ff3b
+echo "running defines.sh"
e4ff3b
+. $SRCDIR/scripts/defines.sh
e4ff3b
+
e4ff3b
+if test $WITH_TLS = no ; then
e4ff3b
+        echo "TLS support not available, test skipped"
e4ff3b
+        exit 0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if test $SYNCPROV = syncprovno; then
e4ff3b
+	echo "Syncrepl provider overlay not available, test skipped"
e4ff3b
+	exit 0
e4ff3b
+fi
e4ff3b
+if test $ACCESSLOG = accesslogno; then
e4ff3b
+	echo "Accesslog overlay not available, test skipped"
e4ff3b
+	exit 0
e4ff3b
+fi
e4ff3b
+
e4ff3b
+MMR=2
e4ff3b
+
e4ff3b
+XDIR=$TESTDIR/srv
e4ff3b
+TMP=$TESTDIR/tmp
e4ff3b
+
e4ff3b
+mkdir -p $TESTDIR
e4ff3b
+cp -r $DATADIR/tls $TESTDIR
e4ff3b
+
e4ff3b
+$SLAPPASSWD -g -n >$CONFIGPWF
e4ff3b
+
e4ff3b
+if test x"$SYNCMODE" = x ; then
e4ff3b
+	SYNCMODE=rp
e4ff3b
+fi
e4ff3b
+case "$SYNCMODE" in
e4ff3b
+	ro)
e4ff3b
+		SYNCTYPE="type=refreshOnly interval=00:00:00:03"
e4ff3b
+		;;
e4ff3b
+	rp)
e4ff3b
+		SYNCTYPE="type=refreshAndPersist interval=00:00:00:03"
e4ff3b
+		;;
e4ff3b
+	*)
e4ff3b
+		echo "unknown sync mode $SYNCMODE"
e4ff3b
+		exit 1;
e4ff3b
+		;;
e4ff3b
+esac
e4ff3b
+
e4ff3b
+#
e4ff3b
+# Test delta-sync mmr
e4ff3b
+# - start servers
e4ff3b
+# - configure over ldap
e4ff3b
+# - populate over ldap
e4ff3b
+# - configure syncrepl over ldap
e4ff3b
+# - break replication
e4ff3b
+# - modify each server separately
e4ff3b
+# - restore replication
e4ff3b
+# - compare results
e4ff3b
+#
e4ff3b
+
e4ff3b
+nullExclude=""
e4ff3b
+test $BACKEND = null && nullExclude="# "
e4ff3b
+
e4ff3b
+KILLPIDS=
e4ff3b
+
e4ff3b
+echo "Initializing server configurations..."
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+
e4ff3b
+DBDIR=${XDIR}$n/db
e4ff3b
+CFDIR=${XDIR}$n/slapd.d
e4ff3b
+
e4ff3b
+mkdir -p ${XDIR}$n $DBDIR.1 $DBDIR.2 $CFDIR
e4ff3b
+
e4ff3b
+o=`expr 3 - $n`
e4ff3b
+cat > $TMP <
e4ff3b
+dn: cn=config
e4ff3b
+objectClass: olcGlobal
e4ff3b
+cn: config
e4ff3b
+olcServerID: $n
e4ff3b
+olcTLSCertificateFile: $TESTDIR/tls/certs/localhost.crt
e4ff3b
+olcTLSCertificateKeyFile: $TESTDIR/tls/private/localhost.key
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+
e4ff3b
+if [ "$SYNCPROV" = syncprovmod -o "$ACCESSLOG" = accesslogmod ]; then
e4ff3b
+  cat <<EOF >> $TMP
e4ff3b
+dn: cn=module,cn=config
e4ff3b
+objectClass: olcModuleList
e4ff3b
+cn: module
e4ff3b
+olcModulePath: $TESTWD/../servers/slapd/overlays
e4ff3b
+EOF
e4ff3b
+  if [ "$SYNCPROV" = syncprovmod ]; then
e4ff3b
+  echo "olcModuleLoad: syncprov.la" >> $TMP
e4ff3b
+  fi
e4ff3b
+  if [ "$ACCESSLOG" = accesslogmod ]; then
e4ff3b
+  echo "olcModuleLoad: accesslog.la" >> $TMP
e4ff3b
+  fi
e4ff3b
+  echo "" >> $TMP
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if [ "$BACKENDTYPE" = mod ]; then
e4ff3b
+cat <<EOF >> $TMP
e4ff3b
+dn: cn=module,cn=config
e4ff3b
+objectClass: olcModuleList
e4ff3b
+cn: module
e4ff3b
+olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
e4ff3b
+olcModuleLoad: back_$BACKEND.la
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+fi
e4ff3b
+MYURI=`eval echo '$SURIP'$n`
e4ff3b
+PROVIDERURI=`eval echo '$SURIP'$o`
e4ff3b
+if test $INDEXDB = indexdb ; then
e4ff3b
+INDEX1="olcDbIndex: objectClass,entryCSN,reqStart,reqDN,reqResult eq"
e4ff3b
+INDEX2="olcDbIndex: objectClass,entryCSN,entryUUID eq"
e4ff3b
+else
e4ff3b
+INDEX1=
e4ff3b
+INDEX2=
e4ff3b
+fi
e4ff3b
+cat >> $TMP <
e4ff3b
+dn: cn=schema,cn=config
e4ff3b
+objectclass: olcSchemaconfig
e4ff3b
+cn: schema
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/core.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/cosine.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/inetorgperson.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/openldap.ldif
e4ff3b
+
e4ff3b
+include: file://$ABS_SCHEMADIR/nis.ldif
e4ff3b
+
e4ff3b
+dn: olcDatabase={0}config,cn=config
e4ff3b
+objectClass: olcDatabaseConfig
e4ff3b
+olcDatabase: {0}config
e4ff3b
+olcRootPW:< file://$CONFIGPWF
e4ff3b
+
e4ff3b
+dn: olcDatabase={1}$BACKEND,cn=config
e4ff3b
+objectClass: olcDatabaseConfig
e4ff3b
+${nullExclude}objectClass: olc${BACKEND}Config
e4ff3b
+olcDatabase: {1}$BACKEND
e4ff3b
+olcSuffix: cn=log
e4ff3b
+${nullExclude}olcDbDirectory: ${DBDIR}.1
e4ff3b
+olcRootDN: $MANAGERDN
e4ff3b
+$INDEX1
e4ff3b
+
e4ff3b
+dn: olcOverlay=syncprov,olcDatabase={1}$BACKEND,cn=config
e4ff3b
+objectClass: olcOverlayConfig
e4ff3b
+objectClass: olcSyncProvConfig
e4ff3b
+olcOverlay: syncprov
e4ff3b
+olcSpNoPresent: TRUE
e4ff3b
+olcSpReloadHint: TRUE
e4ff3b
+
e4ff3b
+dn: olcDatabase={2}$BACKEND,cn=config
e4ff3b
+objectClass: olcDatabaseConfig
e4ff3b
+${nullExclude}objectClass: olc${BACKEND}Config
e4ff3b
+olcDatabase: {2}$BACKEND
e4ff3b
+olcSuffix: $BASEDN
e4ff3b
+${nullExclude}olcDbDirectory: ${DBDIR}.2
e4ff3b
+olcRootDN: $MANAGERDN
e4ff3b
+olcRootPW: $PASSWD
e4ff3b
+olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
e4ff3b
+  credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
e4ff3b
+  retry="3 +" timeout=3 logbase="cn=log"
e4ff3b
+  logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
e4ff3b
+  syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
e4ff3b
+olcMirrorMode: TRUE
e4ff3b
+$INDEX2
e4ff3b
+
e4ff3b
+dn: olcOverlay=syncprov,olcDatabase={2}$BACKEND,cn=config
e4ff3b
+objectClass: olcOverlayConfig
e4ff3b
+objectClass: olcSyncProvConfig
e4ff3b
+olcOverlay: syncprov
e4ff3b
+
e4ff3b
+dn: olcOverlay=accesslog,olcDatabase={2}$BACKEND,cn=config
e4ff3b
+objectClass: olcOverlayConfig
e4ff3b
+objectClass: olcAccessLogConfig
e4ff3b
+olcOverlay: accesslog
e4ff3b
+olcAccessLogDB: cn=log
e4ff3b
+olcAccessLogOps: writes
e4ff3b
+olcAccessLogSuccess: TRUE
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+$SLAPADD -F $CFDIR -n 0  -d-1< $TMP > $TESTOUT 2>&1
e4ff3b
+PORT=`eval echo '$PORT'$n`
e4ff3b
+echo "Starting server $n on TCP/IP port $PORT..."
e4ff3b
+cd ${XDIR}${n}
e4ff3b
+LOG=`eval echo '$LOG'$n`
e4ff3b
+$SLAPD -F slapd.d -h $MYURI -d $LVL $TIMING > $LOG 2>&1 &
e4ff3b
+PID=$!
e4ff3b
+if test $WAIT != 0 ; then
e4ff3b
+    echo PID $PID
e4ff3b
+    read foo
e4ff3b
+fi
e4ff3b
+KILLPIDS="$PID $KILLPIDS"
e4ff3b
+cd $TESTWD
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to check that server $n is running..."
e4ff3b
+for i in 0 1 2 3 4 5; do
e4ff3b
+	$LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -s base -b "" -H $MYURI \
e4ff3b
+		'objectclass=*' > /dev/null 2>&1
e4ff3b
+	RC=$?
e4ff3b
+	if test $RC = 0 ; then
e4ff3b
+		break
e4ff3b
+	fi
e4ff3b
+	echo "Waiting 5 seconds for slapd to start..."
e4ff3b
+	sleep 5
e4ff3b
+done
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+if [ $n = 1 ]; then
e4ff3b
+echo "Using ldapadd for context on server 1..."
e4ff3b
+$LDAPADD -D "$MANAGERDN" -H $SURIP1 -w $PASSWD -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -f $LDIFORDEREDCP \
e4ff3b
+	>> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapadd failed for server $n database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+fi
e4ff3b
+
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Using ldapadd to populate server 1..."
e4ff3b
+$LDAPADD -D "$MANAGERDN" -H $SURIP1 -w $PASSWD -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -f $LDIFORDEREDNOCP \
e4ff3b
+	>> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapadd failed for server $n database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
e4ff3b
+sleep $SLEEP1
e4ff3b
+
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+PORT=`expr $BASEPORT + $n`
e4ff3b
+URI="ldaps://${LOCALIP}:$PORT/"
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to read all the entries from server $n..."
e4ff3b
+$LDAPSEARCH -S "" -b "$BASEDN" -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $URI -w $PASSWD  \
e4ff3b
+	'objectclass=*' > $TESTDIR/server$n.out 2>&1
e4ff3b
+RC=$?
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed at server $n ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+$LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=2
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+echo "Comparing retrieved entries from server 1 and server $n..."
e4ff3b
+$CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
e4ff3b
+
e4ff3b
+if test $? != 0 ; then
e4ff3b
+	echo "test failed - server 1 and server $n databases differ"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit 1
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Using ldapadd to populate server 2..."
e4ff3b
+$LDAPADD -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD -f $LDIFADD1 \
e4ff3b
+	>> $TESTOUT 2>&1
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapadd failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+THEDN="cn=James A Jones 2,ou=Alumni Association,ou=People,dc=example,dc=com"
e4ff3b
+sleep 1
e4ff3b
+for i in 1 2 3; do
e4ff3b
+	$LDAPSEARCH -S "" -b "$THEDN" -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -H $SURIP1 \
e4ff3b
+		-s base '(objectClass=*)' entryCSN > "${MASTEROUT}.$i" 2>&1
e4ff3b
+	RC=$?
e4ff3b
+
e4ff3b
+	if test $RC = 0 ; then
e4ff3b
+		break
e4ff3b
+	fi
e4ff3b
+
e4ff3b
+	if test $RC != 32 ; then
e4ff3b
+		echo "ldapsearch failed at slave ($RC)!"
e4ff3b
+		test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+		exit $RC
e4ff3b
+	fi
e4ff3b
+
e4ff3b
+	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
e4ff3b
+	sleep $SLEEP1
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+PORT=`expr $BASEPORT + $n`
e4ff3b
+URI="ldaps://${LOCALIP}:$PORT/"
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to read all the entries from server $n..."
e4ff3b
+$LDAPSEARCH -S "" -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
e4ff3b
+	'objectclass=*' > $TESTDIR/server$n.out 2>&1
e4ff3b
+RC=$?
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed at server $n ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+$LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=2
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+echo "Comparing retrieved entries from server 1 and server $n..."
e4ff3b
+$CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
e4ff3b
+
e4ff3b
+if test $? != 0 ; then
e4ff3b
+	echo "test failed - server 1 and server $n databases differ"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit 1
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Breaking replication between server 1 and 2..."
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+o=`expr 3 - $n`
e4ff3b
+MYURI=`eval echo '$SURIP'$n`
e4ff3b
+PROVIDERURI=`eval echo '$SURIP'$o`
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <
e4ff3b
+dn: olcDatabase={2}$BACKEND,cn=config
e4ff3b
+changetype: modify
e4ff3b
+replace: olcSyncRepl
e4ff3b
+olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
e4ff3b
+  credentials=InvalidPw searchbase="$BASEDN" $SYNCTYPE
e4ff3b
+  retry="3 +" timeout=3 logbase="cn=log"
e4ff3b
+  logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
e4ff3b
+  syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
e4ff3b
+-
e4ff3b
+replace: olcMirrorMode
e4ff3b
+olcMirrorMode: TRUE
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server $n config ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Using ldapmodify to force conflicts between server 1 and 2..."
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: description
e4ff3b
+description: Amazing
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: description
e4ff3b
+description: Stupendous
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+delete: description
e4ff3b
+description: Outstanding
e4ff3b
+-
e4ff3b
+add: description
e4ff3b
+description: Mindboggling
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+delete: description
e4ff3b
+description: OutStanding
e4ff3b
+-
e4ff3b
+add: description
e4ff3b
+description: Bizarre
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: carLicense
e4ff3b
+carLicense: 123-XYZ
e4ff3b
+-
e4ff3b
+add: employeeNumber
e4ff3b
+employeeNumber: 32
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+add: employeeType
e4ff3b
+employeeType: deadwood
e4ff3b
+-
e4ff3b
+add: employeeNumber
e4ff3b
+employeeNumber: 64
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 2 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+$LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
e4ff3b
+	>> $TESTOUT 2>&1 << EOF
e4ff3b
+dn: $THEDN
e4ff3b
+changetype: modify
e4ff3b
+replace: sn
e4ff3b
+sn: Replaced later
e4ff3b
+-
e4ff3b
+replace: sn
e4ff3b
+sn: Surname
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server 1 database ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+
e4ff3b
+echo "Restoring replication between server 1 and 2..."
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+o=`expr 3 - $n`
e4ff3b
+MYURI=`eval echo '$SURIP'$n`
e4ff3b
+PROVIDERURI=`eval echo '$SURIP'$o`
e4ff3b
+$LDAPMODIFY -D cn=config -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <
e4ff3b
+dn: olcDatabase={2}$BACKEND,cn=config
e4ff3b
+changetype: modify
e4ff3b
+replace: olcSyncRepl
e4ff3b
+olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
e4ff3b
+  credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
e4ff3b
+  retry="3 +" timeout=3 logbase="cn=log"
e4ff3b
+  logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
e4ff3b
+  syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
e4ff3b
+-
e4ff3b
+replace: olcMirrorMode
e4ff3b
+olcMirrorMode: TRUE
e4ff3b
+
e4ff3b
+EOF
e4ff3b
+RC=$?
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapmodify failed for server $n config ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
e4ff3b
+sleep $SLEEP1
e4ff3b
+
e4ff3b
+n=1
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+PORT=`expr $BASEPORT + $n`
e4ff3b
+URI="ldaps://${LOCALIP}:$PORT/"
e4ff3b
+
e4ff3b
+echo "Using ldapsearch to read all the entries from server $n..."
e4ff3b
+$LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
e4ff3b
+	'objectclass=*' > $TESTDIR/server$n.out 2>&1
e4ff3b
+RC=$?
e4ff3b
+
e4ff3b
+if test $RC != 0 ; then
e4ff3b
+	echo "ldapsearch failed at server $n ($RC)!"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit $RC
e4ff3b
+fi
e4ff3b
+$LDIFFILTER -s a < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+n=2
e4ff3b
+while [ $n -le $MMR ]; do
e4ff3b
+echo "Comparing retrieved entries from server 1 and server $n..."
e4ff3b
+$CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
e4ff3b
+
e4ff3b
+if test $? != 0 ; then
e4ff3b
+	echo "test failed - server 1 and server $n databases differ"
e4ff3b
+	test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+	exit 1
e4ff3b
+fi
e4ff3b
+n=`expr $n + 1`
e4ff3b
+done
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && kill -HUP $KILLPIDS
e4ff3b
+
e4ff3b
+echo ">>>>> Test succeeded"
e4ff3b
+
e4ff3b
+test $KILLSERVERS != no && wait
e4ff3b
+
e4ff3b
+exit 0
e4ff3b
-- 
e4ff3b
2.29.2
e4ff3b