ldap/admin/src/scripts/DSCreate.pm.in | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
New commits:
commit c4233ec14a82d1d4c0c71915be40913259d417fa
Author: Noriko Hosoi <nhosoi(a)redhat.com>
Date: Tue Dec 8 12:30:15 2015 -0800
Ticket #48305 - perl module conditional test is not conditional when checking SELinux policies
Description: commit 9fefc13c02c9ae037fad053152193794706aaa31 introduced
a regression:
Bug 1287547 - 389-ds-base-1.3.4.5-1.fc23.x86_64 leaves empty /NUL around
after ipa-server-install
To check the existence of a character special file "/dev/null", "-c" is
supposed to be used instead of "-f".
Reviewed by mreynolds(a)redhat.com (Thank you, Mark!!)
https://fedorahosted.org/389/ticket/48305
diff --git a/ldap/admin/src/scripts/DSCreate.pm.in b/ldap/admin/src/scripts/DSCreate.pm.in
index d449b02..e62ae2c 100644
--- a/ldap/admin/src/scripts/DSCreate.pm.in
+++ b/ldap/admin/src/scripts/DSCreate.pm.in
@@ -283,7 +283,7 @@ sub createInstanceScripts {
my $skip = shift;
my $perlexec = "@perlexec@" || "/usr/bin/env perl";
my $myperl = "!$perlexec";
- my $mydevnull = (-f "/dev/null" ? " /dev/null " : " NUL ");
+ my $mydevnull = (-c "/dev/null" ? " /dev/null " : " NUL ");
# If we have InstScriptsEnabled, we likely have setup.inf or the argument.
# However, during an upgrade, we need to know if we should upgrade the template files or not.
@@ -997,7 +997,7 @@ sub setDefaults {
sub updateSelinuxPolicy {
my $inf = shift;
- my $mydevnull = (-f "/dev/null" ? " /dev/null " : " NUL ");
+ my $mydevnull = (-c "/dev/null" ? " /dev/null " : " NUL ");
# if selinux is not available, do nothing
if ((getLogin() eq 'root') and "@with_selinux@" and
@@ -1451,7 +1451,7 @@ sub removeDSInstance {
}
# remove the selinux label from the ports if needed
- my $mydevnull = (-f "/dev/null" ? " /dev/null " : " NUL ");
+ my $mydevnull = (-c "/dev/null" ? " /dev/null " : " NUL ");
if ((getLogin() eq 'root') and "@with_selinux@" and
-f "@sbindir@/sestatus" and !system ("@sbindir@/sestatus | egrep -i \"selinux status:\\s*enabled\" > $mydevnull 2>&1")) {
foreach my $port (@{$entry->{"nsslapd-port"}})
.gitignore | 2 ++
1 file changed, 2 insertions(+)
New commits:
commit 2eeaf899be53abcfc51a84132e77f4268d5ee99d
Author: William Brown <firstyear(a)redhat.com>
Date: Thu Dec 3 08:17:00 2015 +1000
Ticket 48333 - Simplify accessiblitiy of tests for ds
Bug Description: Previously, it was hard to run the full test suite without
scripting or other external means. We want to be able to run
py.test dirsrvtests
To test the full scope of the application. We can also use this to trigger
specific tests:
py.test dirsrvtests -k test_ticket48109_1
Fix Description: To achieve this, we create __init__.py in all the needed
folders, to make the python path accessible by py.test to discover all the
tests. Additionally, we add __pycache__ and *.pyc to gitignore
https://fedorahosted.org/389/ticket/48333
Author: wibrown
Review by: mreynolds (Thanks!)
diff --git a/.gitignore b/.gitignore
index 9ab10e4..f6583c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,8 @@ autom4te.cache
*.la
*.lo
*.o
+*.pyc
+__pycache__
.libs
.deps
rpmbuild
diff --git a/dirsrvtests/__init__.py b/dirsrvtests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/cmd/__init__.py b/dirsrvtests/cmd/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/cmd/dsadm/__init__.py b/dirsrvtests/cmd/dsadm/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/data/__init__.py b/dirsrvtests/data/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/data/basic/__init__.py b/dirsrvtests/data/basic/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/data/ticket47953/__init__.py b/dirsrvtests/data/ticket47953/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/data/ticket47988/__init__.py b/dirsrvtests/data/ticket47988/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/data/ticket48212/__init__.py b/dirsrvtests/data/ticket48212/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/__init__.py b/dirsrvtests/suites/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/acct_usability_plugin/__init__.py b/dirsrvtests/suites/acct_usability_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/acctpolicy_plugin/__init__.py b/dirsrvtests/suites/acctpolicy_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/acl/__init__.py b/dirsrvtests/suites/acl/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/attr_encryption/__init__.py b/dirsrvtests/suites/attr_encryption/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/attr_uniqueness_plugin/__init__.py b/dirsrvtests/suites/attr_uniqueness_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/automember_plugin/__init__.py b/dirsrvtests/suites/automember_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/basic/__init__.py b/dirsrvtests/suites/basic/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/betxns/__init__.py b/dirsrvtests/suites/betxns/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/chaining_plugin/__init__.py b/dirsrvtests/suites/chaining_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/clu/__init__.py b/dirsrvtests/suites/clu/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/collation_plugin/__init__.py b/dirsrvtests/suites/collation_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/config/__init__.py b/dirsrvtests/suites/config/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/cos_plugin/__init__.py b/dirsrvtests/suites/cos_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/deref_plugin/__init__.py b/dirsrvtests/suites/deref_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/disk_monitoring/__init__.py b/dirsrvtests/suites/disk_monitoring/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/distrib_plugin/__init__.py b/dirsrvtests/suites/distrib_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/dna_plugin/__init__.py b/dirsrvtests/suites/dna_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/ds_logs/__init__.py b/dirsrvtests/suites/ds_logs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/dynamic-plugins/__init__.py b/dirsrvtests/suites/dynamic-plugins/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/filter/__init__.py b/dirsrvtests/suites/filter/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/get_effective_rights/__init__.py b/dirsrvtests/suites/get_effective_rights/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/ldapi/__init__.py b/dirsrvtests/suites/ldapi/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/linkedattrs_plugin/__init__.py b/dirsrvtests/suites/linkedattrs_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/mapping_tree/__init__.py b/dirsrvtests/suites/mapping_tree/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/memberof_plugin/__init__.py b/dirsrvtests/suites/memberof_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/memory_leaks/__init__.py b/dirsrvtests/suites/memory_leaks/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/mep_plugin/__init__.py b/dirsrvtests/suites/mep_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/monitor/__init__.py b/dirsrvtests/suites/monitor/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/paged_results/__init__.py b/dirsrvtests/suites/paged_results/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/pam_passthru_plugin/__init__.py b/dirsrvtests/suites/pam_passthru_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/passthru_plugin/__init__.py b/dirsrvtests/suites/passthru_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/password/__init__.py b/dirsrvtests/suites/password/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/posix_winsync_plugin/__init__.py b/dirsrvtests/suites/posix_winsync_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/psearch/__init__.py b/dirsrvtests/suites/psearch/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/referint_plugin/__init__.py b/dirsrvtests/suites/referint_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/replication/__init__.py b/dirsrvtests/suites/replication/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/replsync_plugin/__init__.py b/dirsrvtests/suites/replsync_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/resource_limits/__init__.py b/dirsrvtests/suites/resource_limits/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/retrocl_plugin/__init__.py b/dirsrvtests/suites/retrocl_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/reverpwd_plugin/__init__.py b/dirsrvtests/suites/reverpwd_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/roles_plugin/__init__.py b/dirsrvtests/suites/roles_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/rootdn_plugin/__init__.py b/dirsrvtests/suites/rootdn_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/sasl/__init__.py b/dirsrvtests/suites/sasl/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/schema/__init__.py b/dirsrvtests/suites/schema/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/schema_reload_plugin/__init__.py b/dirsrvtests/suites/schema_reload_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/snmp/__init__.py b/dirsrvtests/suites/snmp/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/ssl/__init__.py b/dirsrvtests/suites/ssl/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/syntax_plugin/__init__.py b/dirsrvtests/suites/syntax_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/usn_plugin/__init__.py b/dirsrvtests/suites/usn_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/views_plugin/__init__.py b/dirsrvtests/suites/views_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/vlv/__init__.py b/dirsrvtests/suites/vlv/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/suites/whoami_plugin/__init__.py b/dirsrvtests/suites/whoami_plugin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/tickets/__init__.py b/dirsrvtests/tickets/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dirsrvtests/tmp/__init__.py b/dirsrvtests/tmp/__init__.py
new file mode 100644
index 0000000..e69de29
ldap/servers/slapd/plugin.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 324cf9f38f57108eda0965dfe9415f39ecf63a26
Author: William Brown <firstyear(a)redhat.com>
Date: Fri Dec 4 14:47:46 2015 +1000
Ticket 48280 - enable logging of internal ops in the audit log
Bug Description: many plugins add and modify entries, but these changes are not
visible in the audit log. It can be very useful to have these changes available.
Fix Description: This feature actually already existed:
nsslapd-logAccess
nsslapd-logAudit
On a plugin, will turn on the respective logs.
This change brings the audit log in line with access to respect the value of
nsslapd-plugin-logging
Such that when plugin-logging is enabled globally in cn=config, plugins will
log based on the values in:
nsslapd-accesslog-logging-enabled
nsslapd-auditlog-logging-enabled
nsslapd-auditfaillog-logging-enabled
https://fedorahosted.org/389/ticket/48280
Author: wibrown
Review by: ???
diff --git a/ldap/servers/slapd/plugin.c b/ldap/servers/slapd/plugin.c
index 0e99095..4ab644b 100644
--- a/ldap/servers/slapd/plugin.c
+++ b/ldap/servers/slapd/plugin.c
@@ -3808,7 +3808,7 @@ int plugin_build_operation_action_bitmap (int input_actions, const struct slapdp
if (plugin->plg_conf.plgc_log_access || config_get_plugin_logging())
result_actions |= OP_FLAG_ACTION_LOG_ACCESS;
- if (plugin->plg_conf.plgc_log_audit)
+ if (plugin->plg_conf.plgc_log_audit || config_get_plugin_logging())
result_actions |= OP_FLAG_ACTION_LOG_AUDIT;
/*
dirsrvtests/tickets/ticket48370_test.py | 236 ++++++++++++++++++++++++++++++++
ldap/servers/slapd/back-ldbm/index.c | 29 +--
2 files changed, 247 insertions(+), 18 deletions(-)
New commits:
commit c7cf0001002da1bcabe0371d9511a014d8e2b16f
Author: Mark Reynolds <mreynolds(a)redhat.com>
Date: Mon Dec 7 16:45:06 2015 -0500
Ticket 48370 - The 'eq' index does not get updated properly
when deleting and re-adding attributes in
the same modify operation
Bug Description: If you delete several values of the same attribute, and
add at least one of them back in the same operation, the
equality index does not get updated.
Fix Description: Modify the logic of the index code to update the index if
at least one of the values in the entry changes.
Also did pep8 cleanup of create_test.py
https://fedorahosted.org/389/ticket/48370
Reviewed by: wibrown(Thanks!)
(cherry picked from commit 63b80b5c31ebda51445c662903a28e2a79ebe60a)
(cherry picked from commit 5cd8f73205007ecbd44ae2fbfb5bcdf7e39c3d6e)
(cherry picked from commit 8e49d6db6973078396b869ab4ed59c565d7010a9)
diff --git a/dirsrvtests/tickets/ticket48370_test.py b/dirsrvtests/tickets/ticket48370_test.py
new file mode 100644
index 0000000..f5b1f47
--- /dev/null
+++ b/dirsrvtests/tickets/ticket48370_test.py
@@ -0,0 +1,236 @@
+import os
+import ldap
+import logging
+import pytest
+from lib389 import DirSrv, Entry
+from lib389._constants import *
+from lib389.properties import *
+from lib389.tasks import *
+from lib389.utils import *
+
+logging.getLogger(__name__).setLevel(logging.DEBUG)
+log = logging.getLogger(__name__)
+
+installation1_prefix = None
+
+
+class TopologyStandalone(object):
+ def __init__(self, standalone):
+ standalone.open()
+ self.standalone = standalone
+
+
+(a)pytest.fixture(scope="module")
+def topology(request):
+ global installation1_prefix
+ if installation1_prefix:
+ args_instance[SER_DEPLOYED_DIR] = installation1_prefix
+
+ # Creating standalone instance ...
+ standalone = DirSrv(verbose=False)
+ args_instance[SER_HOST] = HOST_STANDALONE
+ args_instance[SER_PORT] = PORT_STANDALONE
+ args_instance[SER_SERVERID_PROP] = SERVERID_STANDALONE
+ args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
+ args_standalone = args_instance.copy()
+ standalone.allocate(args_standalone)
+ instance_standalone = standalone.exists()
+ if instance_standalone:
+ standalone.delete()
+ standalone.create()
+ standalone.open()
+
+ # Delete each instance in the end
+ def fin():
+ standalone.delete()
+ request.addfinalizer(fin)
+
+ # Clear out the tmp dir
+ standalone.clearTmpDir(__file__)
+
+ return TopologyStandalone(standalone)
+
+
+def test_ticket48370(topology):
+ """
+ Deleting attirbute values and readding a value does not properly update
+ the pres index. The values are not actually deleted from the index
+ """
+
+ DN = 'uid=user0099,' + DEFAULT_SUFFIX
+
+ #
+ # Add an entry
+ #
+ topology.standalone.add_s(Entry((DN, {
+ 'objectclass': ['top', 'person',
+ 'organizationalPerson',
+ 'inetorgperson',
+ 'posixAccount'],
+ 'givenname': 'test',
+ 'sn': 'user',
+ 'loginshell': '/bin/bash',
+ 'uidNumber': '10099',
+ 'gidNumber': '10099',
+ 'gecos': 'Test User',
+ 'mail': ['user0099(a)dev.null',
+ 'alias(a)dev.null',
+ 'user0099(a)redhat.com'],
+ 'cn': 'Test User',
+ 'homeDirectory': '/home/user0099',
+ 'uid': 'admin2',
+ 'userpassword': 'password'})))
+
+ #
+ # Perform modify (delete & add mail attributes)
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'alias(a)dev.null'),
+ (ldap.MOD_ADD,
+ 'mail', 'user0099(a)dev.null')])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value- no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=alias(a)dev.null')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Search using existing attribute value - the entry should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)dev.null')
+ if entry is None:
+ log.fatal('Entry not found, but it should have been')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Delete the last values
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)redhat.com')
+ ])
+ except ldap.LDAPError as e:
+ log.fatal('Failed to modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value - no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)redhat.com')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Make sure presence index is correctly updated - no entries should be
+ # returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=*')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Now add the attributes back, and lets run a different set of tests with
+ # a different number of attributes
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_ADD,
+ 'mail',
+ ['user0099(a)dev.null',
+ 'alias(a)dev.null'])])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Remove and readd some attibutes
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'alias(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_ADD,
+ 'mail', 'user0099(a)dev.null')])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value - no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=alias(a)dev.null')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Search using existing attribute value - the entry should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)dev.null')
+ if entry is None:
+ log.fatal('Entry not found, but it should have been')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ log.info('Test PASSED')
+
+
+if __name__ == '__main__':
+ # Run isolated
+ # -s for DEBUG mode
+ CURRENT_FILE = os.path.realpath(__file__)
+ pytest.main("-s %s" % CURRENT_FILE)
diff --git a/ldap/servers/slapd/back-ldbm/index.c b/ldap/servers/slapd/back-ldbm/index.c
index 90d1d23..0b41ce4 100644
--- a/ldap/servers/slapd/back-ldbm/index.c
+++ b/ldap/servers/slapd/back-ldbm/index.c
@@ -740,31 +740,24 @@ index_add_mods(
flags = BE_INDEX_DEL|BE_INDEX_PRESENCE|BE_INDEX_EQUALITY;
} else {
flags = BE_INDEX_DEL;
-
- /* If the same value doesn't exist in a subtype, set
- * BE_INDEX_EQUALITY flag so the equality index is
- * removed.
- */
curr_attr = NULL;
slapi_entry_attr_find(olde->ep_entry,
- mods[i]->mod_type, &curr_attr);
+ mods[i]->mod_type,
+ &curr_attr);
if (curr_attr) {
- int found = 0;
for (j = 0; mods_valueArray[j] != NULL; j++ ) {
- if ( slapi_valueset_find(curr_attr, all_vals, mods_valueArray[j])) {
- /* The same value found in evals.
- * We don't touch the equality index. */
- found = 1;
+ if ( !slapi_valueset_find(curr_attr, all_vals, mods_valueArray[j]) ) {
+ /*
+ * If the mod del value is not found in all_vals
+ * we need to update the equality index as the
+ * final value(s) have changed
+ */
+ if (!(flags & BE_INDEX_EQUALITY)) {
+ flags |= BE_INDEX_EQUALITY;
+ }
break;
}
}
- /*
- * to-be-deleted curr_attr does not exist in the
- * new value set evals. So, we can remove it.
- */
- if (!found && !(flags & BE_INDEX_EQUALITY)) {
- flags |= BE_INDEX_EQUALITY;
- }
}
}
dirsrvtests/tickets/ticket48370_test.py | 236 ++++++++++++++++++++++++++++++++
ldap/servers/slapd/back-ldbm/index.c | 29 +--
2 files changed, 247 insertions(+), 18 deletions(-)
New commits:
commit c24ecabcfcb9016c4049fa8b0524108c704b640d
Author: Mark Reynolds <mreynolds(a)redhat.com>
Date: Mon Dec 7 16:45:06 2015 -0500
Ticket 48370 - The 'eq' index does not get updated properly
when deleting and re-adding attributes in
the same modify operation
Bug Description: If you delete several values of the same attribute, and
add at least one of them back in the same operation, the
equality index does not get updated.
Fix Description: Modify the logic of the index code to update the index if
at least one of the values in the entry changes.
Also did pep8 cleanup of create_test.py
https://fedorahosted.org/389/ticket/48370
Reviewed by: wibrown(Thanks!)
(cherry picked from commit 63b80b5c31ebda51445c662903a28e2a79ebe60a)
(cherry picked from commit 5cd8f73205007ecbd44ae2fbfb5bcdf7e39c3d6e)
(cherry picked from commit 8e49d6db6973078396b869ab4ed59c565d7010a9)
diff --git a/dirsrvtests/tickets/ticket48370_test.py b/dirsrvtests/tickets/ticket48370_test.py
new file mode 100644
index 0000000..f5b1f47
--- /dev/null
+++ b/dirsrvtests/tickets/ticket48370_test.py
@@ -0,0 +1,236 @@
+import os
+import ldap
+import logging
+import pytest
+from lib389 import DirSrv, Entry
+from lib389._constants import *
+from lib389.properties import *
+from lib389.tasks import *
+from lib389.utils import *
+
+logging.getLogger(__name__).setLevel(logging.DEBUG)
+log = logging.getLogger(__name__)
+
+installation1_prefix = None
+
+
+class TopologyStandalone(object):
+ def __init__(self, standalone):
+ standalone.open()
+ self.standalone = standalone
+
+
+(a)pytest.fixture(scope="module")
+def topology(request):
+ global installation1_prefix
+ if installation1_prefix:
+ args_instance[SER_DEPLOYED_DIR] = installation1_prefix
+
+ # Creating standalone instance ...
+ standalone = DirSrv(verbose=False)
+ args_instance[SER_HOST] = HOST_STANDALONE
+ args_instance[SER_PORT] = PORT_STANDALONE
+ args_instance[SER_SERVERID_PROP] = SERVERID_STANDALONE
+ args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
+ args_standalone = args_instance.copy()
+ standalone.allocate(args_standalone)
+ instance_standalone = standalone.exists()
+ if instance_standalone:
+ standalone.delete()
+ standalone.create()
+ standalone.open()
+
+ # Delete each instance in the end
+ def fin():
+ standalone.delete()
+ request.addfinalizer(fin)
+
+ # Clear out the tmp dir
+ standalone.clearTmpDir(__file__)
+
+ return TopologyStandalone(standalone)
+
+
+def test_ticket48370(topology):
+ """
+ Deleting attirbute values and readding a value does not properly update
+ the pres index. The values are not actually deleted from the index
+ """
+
+ DN = 'uid=user0099,' + DEFAULT_SUFFIX
+
+ #
+ # Add an entry
+ #
+ topology.standalone.add_s(Entry((DN, {
+ 'objectclass': ['top', 'person',
+ 'organizationalPerson',
+ 'inetorgperson',
+ 'posixAccount'],
+ 'givenname': 'test',
+ 'sn': 'user',
+ 'loginshell': '/bin/bash',
+ 'uidNumber': '10099',
+ 'gidNumber': '10099',
+ 'gecos': 'Test User',
+ 'mail': ['user0099(a)dev.null',
+ 'alias(a)dev.null',
+ 'user0099(a)redhat.com'],
+ 'cn': 'Test User',
+ 'homeDirectory': '/home/user0099',
+ 'uid': 'admin2',
+ 'userpassword': 'password'})))
+
+ #
+ # Perform modify (delete & add mail attributes)
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'alias(a)dev.null'),
+ (ldap.MOD_ADD,
+ 'mail', 'user0099(a)dev.null')])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value- no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=alias(a)dev.null')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Search using existing attribute value - the entry should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)dev.null')
+ if entry is None:
+ log.fatal('Entry not found, but it should have been')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Delete the last values
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)redhat.com')
+ ])
+ except ldap.LDAPError as e:
+ log.fatal('Failed to modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value - no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)redhat.com')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Make sure presence index is correctly updated - no entries should be
+ # returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=*')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Now add the attributes back, and lets run a different set of tests with
+ # a different number of attributes
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_ADD,
+ 'mail',
+ ['user0099(a)dev.null',
+ 'alias(a)dev.null'])])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Remove and readd some attibutes
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'alias(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_ADD,
+ 'mail', 'user0099(a)dev.null')])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value - no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=alias(a)dev.null')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Search using existing attribute value - the entry should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)dev.null')
+ if entry is None:
+ log.fatal('Entry not found, but it should have been')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ log.info('Test PASSED')
+
+
+if __name__ == '__main__':
+ # Run isolated
+ # -s for DEBUG mode
+ CURRENT_FILE = os.path.realpath(__file__)
+ pytest.main("-s %s" % CURRENT_FILE)
diff --git a/ldap/servers/slapd/back-ldbm/index.c b/ldap/servers/slapd/back-ldbm/index.c
index eac265b..b820805 100644
--- a/ldap/servers/slapd/back-ldbm/index.c
+++ b/ldap/servers/slapd/back-ldbm/index.c
@@ -741,31 +741,24 @@ index_add_mods(
flags = BE_INDEX_DEL|BE_INDEX_PRESENCE|BE_INDEX_EQUALITY;
} else {
flags = BE_INDEX_DEL;
-
- /* If the same value doesn't exist in a subtype, set
- * BE_INDEX_EQUALITY flag so the equality index is
- * removed.
- */
curr_attr = NULL;
slapi_entry_attr_find(olde->ep_entry,
- mods[i]->mod_type, &curr_attr);
+ mods[i]->mod_type,
+ &curr_attr);
if (curr_attr) {
- int found = 0;
for (j = 0; mods_valueArray[j] != NULL; j++ ) {
- if ( slapi_valueset_find(curr_attr, all_vals, mods_valueArray[j])) {
- /* The same value found in evals.
- * We don't touch the equality index. */
- found = 1;
+ if ( !slapi_valueset_find(curr_attr, all_vals, mods_valueArray[j]) ) {
+ /*
+ * If the mod del value is not found in all_vals
+ * we need to update the equality index as the
+ * final value(s) have changed
+ */
+ if (!(flags & BE_INDEX_EQUALITY)) {
+ flags |= BE_INDEX_EQUALITY;
+ }
break;
}
}
- /*
- * to-be-deleted curr_attr does not exist in the
- * new value set evals. So, we can remove it.
- */
- if (!found && !(flags & BE_INDEX_EQUALITY)) {
- flags |= BE_INDEX_EQUALITY;
- }
}
}
dirsrvtests/tickets/ticket48370_test.py | 236 ++++++++++++++++++++++++++++++++
ldap/servers/slapd/back-ldbm/index.c | 29 +--
2 files changed, 247 insertions(+), 18 deletions(-)
New commits:
commit 8e49d6db6973078396b869ab4ed59c565d7010a9
Author: Mark Reynolds <mreynolds(a)redhat.com>
Date: Mon Dec 7 16:45:06 2015 -0500
Ticket 48370 - The 'eq' index does not get updated properly
when deleting and re-adding attributes in
the same modify operation
Bug Description: If you delete several values of the same attribute, and
add at least one of them back in the same operation, the
equality index does not get updated.
Fix Description: Modify the logic of the index code to update the index if
at least one of the values in the entry changes.
Also did pep8 cleanup of create_test.py
https://fedorahosted.org/389/ticket/48370
Reviewed by: wibrown(Thanks!)
(cherry picked from commit 63b80b5c31ebda51445c662903a28e2a79ebe60a)
(cherry picked from commit 5cd8f73205007ecbd44ae2fbfb5bcdf7e39c3d6e)
diff --git a/dirsrvtests/tickets/ticket48370_test.py b/dirsrvtests/tickets/ticket48370_test.py
new file mode 100644
index 0000000..f5b1f47
--- /dev/null
+++ b/dirsrvtests/tickets/ticket48370_test.py
@@ -0,0 +1,236 @@
+import os
+import ldap
+import logging
+import pytest
+from lib389 import DirSrv, Entry
+from lib389._constants import *
+from lib389.properties import *
+from lib389.tasks import *
+from lib389.utils import *
+
+logging.getLogger(__name__).setLevel(logging.DEBUG)
+log = logging.getLogger(__name__)
+
+installation1_prefix = None
+
+
+class TopologyStandalone(object):
+ def __init__(self, standalone):
+ standalone.open()
+ self.standalone = standalone
+
+
+(a)pytest.fixture(scope="module")
+def topology(request):
+ global installation1_prefix
+ if installation1_prefix:
+ args_instance[SER_DEPLOYED_DIR] = installation1_prefix
+
+ # Creating standalone instance ...
+ standalone = DirSrv(verbose=False)
+ args_instance[SER_HOST] = HOST_STANDALONE
+ args_instance[SER_PORT] = PORT_STANDALONE
+ args_instance[SER_SERVERID_PROP] = SERVERID_STANDALONE
+ args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
+ args_standalone = args_instance.copy()
+ standalone.allocate(args_standalone)
+ instance_standalone = standalone.exists()
+ if instance_standalone:
+ standalone.delete()
+ standalone.create()
+ standalone.open()
+
+ # Delete each instance in the end
+ def fin():
+ standalone.delete()
+ request.addfinalizer(fin)
+
+ # Clear out the tmp dir
+ standalone.clearTmpDir(__file__)
+
+ return TopologyStandalone(standalone)
+
+
+def test_ticket48370(topology):
+ """
+ Deleting attirbute values and readding a value does not properly update
+ the pres index. The values are not actually deleted from the index
+ """
+
+ DN = 'uid=user0099,' + DEFAULT_SUFFIX
+
+ #
+ # Add an entry
+ #
+ topology.standalone.add_s(Entry((DN, {
+ 'objectclass': ['top', 'person',
+ 'organizationalPerson',
+ 'inetorgperson',
+ 'posixAccount'],
+ 'givenname': 'test',
+ 'sn': 'user',
+ 'loginshell': '/bin/bash',
+ 'uidNumber': '10099',
+ 'gidNumber': '10099',
+ 'gecos': 'Test User',
+ 'mail': ['user0099(a)dev.null',
+ 'alias(a)dev.null',
+ 'user0099(a)redhat.com'],
+ 'cn': 'Test User',
+ 'homeDirectory': '/home/user0099',
+ 'uid': 'admin2',
+ 'userpassword': 'password'})))
+
+ #
+ # Perform modify (delete & add mail attributes)
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'alias(a)dev.null'),
+ (ldap.MOD_ADD,
+ 'mail', 'user0099(a)dev.null')])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value- no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=alias(a)dev.null')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Search using existing attribute value - the entry should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)dev.null')
+ if entry is None:
+ log.fatal('Entry not found, but it should have been')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Delete the last values
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)redhat.com')
+ ])
+ except ldap.LDAPError as e:
+ log.fatal('Failed to modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value - no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)redhat.com')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Make sure presence index is correctly updated - no entries should be
+ # returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=*')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Now add the attributes back, and lets run a different set of tests with
+ # a different number of attributes
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_ADD,
+ 'mail',
+ ['user0099(a)dev.null',
+ 'alias(a)dev.null'])])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Remove and readd some attibutes
+ #
+ try:
+ topology.standalone.modify_s(DN, [(ldap.MOD_DELETE,
+ 'mail',
+ 'alias(a)dev.null'),
+ (ldap.MOD_DELETE,
+ 'mail',
+ 'user0099(a)dev.null'),
+ (ldap.MOD_ADD,
+ 'mail', 'user0099(a)dev.null')])
+ except ldap.LDAPError as e:
+ log.fatal('Failedto modify user: ' + str(e))
+ assert False
+
+ #
+ # Search using deleted attribute value - no entries should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=alias(a)dev.null')
+ if entry:
+ log.fatal('Entry incorrectly returned')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ #
+ # Search using existing attribute value - the entry should be returned
+ #
+ try:
+ entry = topology.standalone.search_s(DEFAULT_SUFFIX,
+ ldap.SCOPE_SUBTREE,
+ 'mail=user0099(a)dev.null')
+ if entry is None:
+ log.fatal('Entry not found, but it should have been')
+ assert False
+ except ldap.LDAPError as e:
+ log.fatal('Failed to search for user: ' + str(e))
+ assert False
+
+ log.info('Test PASSED')
+
+
+if __name__ == '__main__':
+ # Run isolated
+ # -s for DEBUG mode
+ CURRENT_FILE = os.path.realpath(__file__)
+ pytest.main("-s %s" % CURRENT_FILE)
diff --git a/ldap/servers/slapd/back-ldbm/index.c b/ldap/servers/slapd/back-ldbm/index.c
index ffeedef..ff59875 100644
--- a/ldap/servers/slapd/back-ldbm/index.c
+++ b/ldap/servers/slapd/back-ldbm/index.c
@@ -747,31 +747,24 @@ index_add_mods(
flags = BE_INDEX_DEL|BE_INDEX_PRESENCE|BE_INDEX_EQUALITY;
} else {
flags = BE_INDEX_DEL;
-
- /* If the same value doesn't exist in a subtype, set
- * BE_INDEX_EQUALITY flag so the equality index is
- * removed.
- */
curr_attr = NULL;
slapi_entry_attr_find(olde->ep_entry,
- mods[i]->mod_type, &curr_attr);
+ mods[i]->mod_type,
+ &curr_attr);
if (curr_attr) {
- int found = 0;
for (j = 0; mods_valueArray[j] != NULL; j++ ) {
- if ( slapi_valueset_find(curr_attr, all_vals, mods_valueArray[j])) {
- /* The same value found in evals.
- * We don't touch the equality index. */
- found = 1;
+ if ( !slapi_valueset_find(curr_attr, all_vals, mods_valueArray[j]) ) {
+ /*
+ * If the mod del value is not found in all_vals
+ * we need to update the equality index as the
+ * final value(s) have changed
+ */
+ if (!(flags & BE_INDEX_EQUALITY)) {
+ flags |= BE_INDEX_EQUALITY;
+ }
break;
}
}
- /*
- * to-be-deleted curr_attr does not exist in the
- * new value set evals. So, we can remove it.
- */
- if (!found && !(flags & BE_INDEX_EQUALITY)) {
- flags |= BE_INDEX_EQUALITY;
- }
}
}