1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
import pytest
from lib389.tasks import *
from lib389.utils import *
from lib389.topologies import topology_st
from lib389._constants import SUFFIX, DEFAULT_SUFFIX, DEFAULT_BENAME
pytestmark = pytest.mark.tier2
logging.getLogger(__name__).setLevel(logging.DEBUG)
log = logging.getLogger(__name__)
NEW_ACCOUNT = "new_account"
MAX_ACCOUNTS = 20
MIXED_VALUE = "/home/mYhOmEdIrEcToRy"
LOWER_VALUE = "/home/myhomedirectory"
HOMEDIRECTORY_INDEX = 'cn=homeDirectory,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config'
HOMEDIRECTORY_CN = "homedirectory"
MATCHINGRULE = 'nsMatchingRule'
UIDNUMBER_INDEX = 'cn=uidnumber,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config'
UIDNUMBER_CN = "uidnumber"
def test_ticket48746_init(topology_st):
log.info("Initialization: add dummy entries for the tests")
for cpt in range(MAX_ACCOUNTS):
name = "%s%d" % (NEW_ACCOUNT, cpt)
topology_st.standalone.add_s(Entry(("uid=%s,%s" % (name, SUFFIX), {
'objectclass': "top posixAccount".split(),
'uid': name,
'cn': name,
'uidnumber': str(111),
'gidnumber': str(222),
'homedirectory': "/home/tbordaz_%d" % cpt})))
def test_ticket48746_homeDirectory_indexed_cis(topology_st):
log.info("\n\nindex homeDirectory in caseIgnoreIA5Match and caseExactIA5Match")
try:
ent = topology_st.standalone.getEntry(HOMEDIRECTORY_INDEX, ldap.SCOPE_BASE)
except ldap.NO_SUCH_OBJECT:
topology_st.standalone.add_s(Entry((HOMEDIRECTORY_INDEX, {
'objectclass': "top nsIndex".split(),
'cn': HOMEDIRECTORY_CN,
'nsSystemIndex': 'false',
'nsIndexType': 'eq'})))
# log.info("attach debugger")
# time.sleep(60)
IGNORE_MR_NAME = b'caseIgnoreIA5Match'
EXACT_MR_NAME = b'caseExactIA5Match'
mod = [(ldap.MOD_REPLACE, MATCHINGRULE, (IGNORE_MR_NAME, EXACT_MR_NAME))]
topology_st.standalone.modify_s(HOMEDIRECTORY_INDEX, mod)
# topology_st.standalone.stop(timeout=10)
log.info("successfully checked that filter with exact mr , a filter with lowercase eq is failing")
# assert topology_st.standalone.db2index(bename=DEFAULT_BENAME, suffixes=None, attrs=['homeDirectory'])
# topology_st.standalone.start(timeout=10)
args = {TASK_WAIT: True}
topology_st.standalone.tasks.reindex(suffix=SUFFIX, attrname='homeDirectory', args=args)
log.info("Check indexing succeeded with a specified matching rule")
file_obj = open(topology_st.standalone.errlog, "r")
# Check if the MR configuration failure occurs
regex = re.compile("unknown or invalid matching rule")
while True:
line = file_obj.readline()
found = regex.search(line)
if ((line == '') or (found)):
break
if (found):
log.info("The configuration of a specific MR fails")
log.info(line)
assert not found
def test_ticket48746_homeDirectory_mixed_value(topology_st):
# Set a homedirectory value with mixed case
name = "uid=%s1,%s" % (NEW_ACCOUNT, SUFFIX)
mod = [(ldap.MOD_REPLACE, 'homeDirectory', ensure_bytes(MIXED_VALUE))]
topology_st.standalone.modify_s(name, mod)
def test_ticket48746_extensible_search_after_index(topology_st):
name = "uid=%s1,%s" % (NEW_ACCOUNT, SUFFIX)
# check with the exact stored value
# log.info("Default: can retrieve an entry filter syntax with exact stored value")
# ent = topology_st.standalone.getEntry(name, ldap.SCOPE_BASE, "(homeDirectory=%s)" % MIXED_VALUE)
# log.info("attach debugger")
# time.sleep(60)
# This search is enought to trigger the crash
# because it loads a registered filter MR plugin that has no indexer create function
# following index will trigger the crash
log.info("Default: can retrieve an entry filter caseExactIA5Match with exact stored value")
ent = topology_st.standalone.getEntry(name, ldap.SCOPE_BASE, "(homeDirectory:caseExactIA5Match:=%s)" % MIXED_VALUE)
def test_ticket48746_homeDirectory_indexed_ces(topology_st):
log.info("\n\nindex homeDirectory in caseExactIA5Match, this would trigger the crash")
try:
ent = topology_st.standalone.getEntry(HOMEDIRECTORY_INDEX, ldap.SCOPE_BASE)
except ldap.NO_SUCH_OBJECT:
topology_st.standalone.add_s(Entry((HOMEDIRECTORY_INDEX, {
'objectclass': "top nsIndex".split(),
'cn': HOMEDIRECTORY_CN,
'nsSystemIndex': 'false',
'nsIndexType': 'eq'})))
# log.info("attach debugger")
# time.sleep(60)
EXACT_MR_NAME = b'caseExactIA5Match'
mod = [(ldap.MOD_REPLACE, MATCHINGRULE, (EXACT_MR_NAME))]
topology_st.standalone.modify_s(HOMEDIRECTORY_INDEX, mod)
# topology_st.standalone.stop(timeout=10)
log.info("successfully checked that filter with exact mr , a filter with lowercase eq is failing")
# assert topology_st.standalone.db2index(bename=DEFAULT_BENAME, suffixes=None, attrs=['homeDirectory'])
# topology_st.standalone.start(timeout=10)
args = {TASK_WAIT: True}
topology_st.standalone.tasks.reindex(suffix=SUFFIX, attrname='homeDirectory', args=args)
log.info("Check indexing succeeded with a specified matching rule")
file_obj = open(topology_st.standalone.errlog, "r")
# Check if the MR configuration failure occurs
regex = re.compile("unknown or invalid matching rule")
while True:
line = file_obj.readline()
found = regex.search(line)
if ((line == '') or (found)):
break
if (found):
log.info("The configuration of a specific MR fails")
log.info(line)
assert not found
if __name__ == '__main__':
# Run isolated
# -s for DEBUG mode
CURRENT_FILE = os.path.realpath(__file__)
pytest.main("-s %s" % CURRENT_FILE)
|