plugin_tests.py 84 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296
  1. '''
  2. Created on Dec 09, 2014
  3. @author: mreynolds
  4. '''
  5. import os
  6. import sys
  7. import time
  8. import ldap
  9. import logging
  10. import pytest
  11. from lib389 import DirSrv, Entry, tools, tasks
  12. from lib389.tools import DirSrvTools
  13. from lib389._constants import *
  14. from lib389.properties import *
  15. from lib389.tasks import *
  16. log = logging.getLogger(__name__)
  17. USER1_DN = 'uid=user1,' + DEFAULT_SUFFIX
  18. USER2_DN = 'uid=user2,' + DEFAULT_SUFFIX
  19. USER3_DN = 'uid=user3,' + DEFAULT_SUFFIX
  20. BUSER1_DN = 'uid=user1,ou=branch1,' + DEFAULT_SUFFIX
  21. BUSER2_DN = 'uid=user2,ou=branch2,' + DEFAULT_SUFFIX
  22. BUSER3_DN = 'uid=user3,ou=branch2,' + DEFAULT_SUFFIX
  23. BRANCH1_DN = 'ou=branch1,' + DEFAULT_SUFFIX
  24. BRANCH2_DN = 'ou=branch2,' + DEFAULT_SUFFIX
  25. GROUP_OU = 'ou=groups,' + DEFAULT_SUFFIX
  26. PEOPLE_OU = 'ou=people,' + DEFAULT_SUFFIX
  27. GROUP_DN = 'cn=group,' + DEFAULT_SUFFIX
  28. CONFIG_AREA = 'nsslapd-pluginConfigArea'
  29. '''
  30. Functional tests for each plugin
  31. Test:
  32. plugin restarts (test when on and off)
  33. plugin config validation
  34. plugin dependencies
  35. plugin functionality (including plugin tasks)
  36. '''
  37. ################################################################################
  38. #
  39. # Test Plugin Dependency
  40. #
  41. ################################################################################
  42. def test_dependency(inst, plugin):
  43. """
  44. Set the "account usabilty" plugin to depend on this plugin. This plugin
  45. is generic, always enabled, and perfect for our testing
  46. """
  47. try:
  48. inst.modify_s('cn=' + PLUGIN_ACCT_USABILITY + ',cn=plugins,cn=config',
  49. [(ldap.MOD_REPLACE, 'nsslapd-plugin-depends-on-named', plugin)])
  50. except ldap.LDAPError, e:
  51. log.error('test_dependency: Failed to modify ' + PLUGIN_ACCT_USABILITY + ': error ' + e.message['desc'])
  52. assert False
  53. try:
  54. inst.modify_s('cn=' + plugin + ',cn=plugins,cn=config',
  55. [(ldap.MOD_REPLACE, 'nsslapd-pluginenabled', 'off')])
  56. except ldap.UNWILLING_TO_PERFORM:
  57. # failed as expected
  58. pass
  59. else:
  60. # Incorrectly succeeded
  61. log.error('test_dependency: Plugin dependency check failed (%s)' % plugin)
  62. assert False
  63. # Now undo the change
  64. try:
  65. inst.modify_s('cn=' + PLUGIN_ACCT_USABILITY + ',cn=plugins,cn=config',
  66. [(ldap.MOD_DELETE, 'nsslapd-plugin-depends-on-named', None)])
  67. except ldap.LDAPError, e:
  68. log.error('test_dependency: Failed to reset ' + plugin + ': error ' + e.message['desc'])
  69. assert False
  70. ################################################################################
  71. #
  72. # Wait for task to complete
  73. #
  74. ################################################################################
  75. def wait_for_task(conn, task_dn):
  76. finished = False
  77. count = 0
  78. while count < 60:
  79. try:
  80. task_entry = conn.search_s(task_dn, ldap.SCOPE_BASE, 'objectclass=*')
  81. if not task_entry:
  82. log.fatal('wait_for_task: Search failed to find task: ' + task_dn)
  83. assert False
  84. if task_entry[0].hasAttr('nstaskexitcode'):
  85. # task is done
  86. finished = True
  87. break
  88. except ldap.LDAPError, e:
  89. log.fatal('wait_for_task: Search failed: ' + e.message['desc'])
  90. assert False
  91. time.sleep(1)
  92. count += 1
  93. if not finished:
  94. log.error('wait_for_task: Task (%s) did not complete!' % task_dn)
  95. assert False
  96. ################################################################################
  97. #
  98. # Test Account Policy Plugin (0)
  99. #
  100. ################################################################################
  101. def test_acctpolicy(inst, args=None):
  102. # stop the plugin, and start it
  103. inst.plugins.disable(name=PLUGIN_ACCT_POLICY)
  104. inst.plugins.enable(name=PLUGIN_ACCT_POLICY)
  105. if args == "restart":
  106. return True
  107. CONFIG_DN = 'cn=config,cn=Account Policy Plugin,cn=plugins,cn=config'
  108. log.info('Testing ' + PLUGIN_ACCT_POLICY + '...')
  109. ############################################################################
  110. # Configure plugin
  111. ############################################################################
  112. # Add the config entry
  113. try:
  114. inst.add_s(Entry((CONFIG_DN, {
  115. 'objectclass': 'top extensibleObject'.split(),
  116. 'cn': 'config',
  117. 'alwaysrecordlogin': 'yes',
  118. 'stateattrname': 'lastLoginTime'
  119. })))
  120. except ldap.ALREADY_EXISTS:
  121. try:
  122. inst.modify_s(CONFIG_DN,
  123. [(ldap.MOD_REPLACE, 'alwaysrecordlogin', 'yes'),
  124. (ldap.MOD_REPLACE, 'stateattrname', 'lastLoginTime')])
  125. except ldap.LDAPError, e:
  126. log.error('test_acctpolicy: Failed to modify config entry: error ' + e.message['desc'])
  127. assert False
  128. except ldap.LDAPError, e:
  129. log.error('test_acctpolicy: Failed to add config entry: error ' + e.message['desc'])
  130. assert False
  131. ############################################################################
  132. # Test plugin
  133. ############################################################################
  134. # Add an entry
  135. time.sleep(1)
  136. try:
  137. inst.add_s(Entry((USER1_DN, {'objectclass': "top extensibleObject".split(),
  138. 'sn': '1',
  139. 'cn': 'user 1',
  140. 'uid': 'user1',
  141. 'userpassword': 'password'})))
  142. except ldap.LDAPError, e:
  143. log.error('test_acctpolicy: Failed to add test user' + USER1_DN + ': error ' + e.message['desc'])
  144. assert False
  145. # bind as user
  146. try:
  147. inst.simple_bind_s(USER1_DN, "password")
  148. except ldap.LDAPError, e:
  149. log.error('test_acctpolicy: Failed to bind as user1: ' + e.message['desc'])
  150. assert False
  151. # Bind as Root DN
  152. time.sleep(1)
  153. try:
  154. inst.simple_bind_s(DN_DM, PASSWORD)
  155. except ldap.LDAPError, e:
  156. log.error('test_acctpolicy: Failed to bind as rootDN: ' + e.message['desc'])
  157. assert False
  158. # Check lastLoginTime of USER1
  159. try:
  160. entries = inst.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, 'lastLoginTime=*')
  161. if not entries:
  162. log.fatal('test_acctpolicy: Search failed to find an entry with lastLoginTime.')
  163. assert False
  164. except ldap.LDAPError, e:
  165. log.fatal('test_acctpolicy: Search failed: ' + e.message['desc'])
  166. assert False
  167. ############################################################################
  168. # Change config - change the stateAttrName to a new attribute
  169. ############################################################################
  170. try:
  171. inst.modify_s(CONFIG_DN, [(ldap.MOD_REPLACE, 'stateattrname', 'testLastLoginTime')])
  172. except ldap.LDAPError, e:
  173. log.error('test_acctpolicy: Failed to modify config entry: error ' + e.message['desc'])
  174. assert False
  175. ############################################################################
  176. # Test plugin
  177. ############################################################################
  178. time.sleep(1)
  179. # login as user
  180. try:
  181. inst.simple_bind_s(USER1_DN, "password")
  182. except ldap.LDAPError, e:
  183. log.error('test_acctpolicy: Failed to bind(2nd) as user1: ' + e.message['desc'])
  184. assert False
  185. time.sleep(1)
  186. # Bind as Root DN
  187. try:
  188. inst.simple_bind_s(DN_DM, PASSWORD)
  189. except ldap.LDAPError, e:
  190. log.error('test_acctpolicy: Failed to bind as rootDN: ' + e.message['desc'])
  191. assert False
  192. # Check testLastLoginTime was added to USER1
  193. try:
  194. entries = inst.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(testLastLoginTime=*)')
  195. if not entries:
  196. log.fatal('test_acctpolicy: Search failed to find an entry with testLastLoginTime.')
  197. assert False
  198. except ldap.LDAPError, e:
  199. log.fatal('test_acctpolicy: Search failed: ' + e.message['desc'])
  200. assert False
  201. ############################################################################
  202. # Test plugin dependency
  203. ############################################################################
  204. test_dependency(inst, PLUGIN_ACCT_POLICY)
  205. ############################################################################
  206. # Cleanup
  207. ############################################################################
  208. try:
  209. inst.delete_s(USER1_DN)
  210. except ldap.LDAPError, e:
  211. log.error('test_acctpolicy: Failed to delete test entry: ' + e.message['desc'])
  212. assert False
  213. ############################################################################
  214. # Test passed
  215. ############################################################################
  216. log.info('test_acctpolicy: PASS\n')
  217. return
  218. ################################################################################
  219. #
  220. # Test Attribute Uniqueness Plugin (1)
  221. #
  222. ################################################################################
  223. def test_attruniq(inst, args=None):
  224. # stop the plugin, and start it
  225. inst.plugins.disable(name=PLUGIN_ATTR_UNIQUENESS)
  226. inst.plugins.enable(name=PLUGIN_ATTR_UNIQUENESS)
  227. if args == "restart":
  228. return
  229. log.info('Testing ' + PLUGIN_ATTR_UNIQUENESS + '...')
  230. ############################################################################
  231. # Configure plugin
  232. ############################################################################
  233. try:
  234. inst.modify_s('cn=' + PLUGIN_ATTR_UNIQUENESS + ',cn=plugins,cn=config',
  235. [(ldap.MOD_REPLACE, 'uniqueness-attribute-name', 'uid')])
  236. except ldap.LDAPError, e:
  237. log.error('test_attruniq: Failed to configure plugin for "uid": error ' + e.message['desc'])
  238. assert False
  239. ############################################################################
  240. # Test plugin
  241. ############################################################################
  242. # Add an entry
  243. try:
  244. inst.add_s(Entry((USER1_DN, {'objectclass': "top extensibleObject".split(),
  245. 'sn': '1',
  246. 'cn': 'user 1',
  247. 'uid': 'user1',
  248. 'mail': '[email protected]',
  249. 'userpassword': 'password'})))
  250. except ldap.LDAPError, e:
  251. log.error('test_attruniq: Failed to add test user' + USER1_DN + ': error ' + e.message['desc'])
  252. assert False
  253. # Add an entry with a duplicate "uid"
  254. try:
  255. inst.add_s(Entry((USER2_DN, {'objectclass': "top extensibleObject".split(),
  256. 'sn': '2',
  257. 'cn': 'user 2',
  258. 'uid': 'user2',
  259. 'uid': 'user1',
  260. 'userpassword': 'password'})))
  261. except ldap.CONSTRAINT_VIOLATION:
  262. pass
  263. else:
  264. log.error('test_attruniq: Adding of 2nd entry(uid) incorrectly succeeded')
  265. assert False
  266. ############################################################################
  267. # Change config to use "mail" instead of "uid"
  268. ############################################################################
  269. try:
  270. inst.modify_s('cn=' + PLUGIN_ATTR_UNIQUENESS + ',cn=plugins,cn=config',
  271. [(ldap.MOD_REPLACE, 'uniqueness-attribute-name', 'mail')])
  272. except ldap.LDAPError, e:
  273. log.error('test_attruniq: Failed to configure plugin for "mail": error ' + e.message['desc'])
  274. assert False
  275. ############################################################################
  276. # Test plugin - Add an entry, that has a duplicate "mail" value
  277. ############################################################################
  278. try:
  279. inst.add_s(Entry((USER2_DN, {'objectclass': "top extensibleObject".split(),
  280. 'sn': '2',
  281. 'cn': 'user 2',
  282. 'uid': 'user2',
  283. 'mail': '[email protected]',
  284. 'userpassword': 'password'})))
  285. except ldap.CONSTRAINT_VIOLATION:
  286. pass
  287. else:
  288. log.error('test_attruniq: Adding of 2nd entry(mail) incorrectly succeeded')
  289. assert False
  290. ############################################################################
  291. # Test plugin dependency
  292. ############################################################################
  293. test_dependency(inst, PLUGIN_ATTR_UNIQUENESS)
  294. ############################################################################
  295. # Cleanup
  296. ############################################################################
  297. try:
  298. inst.delete_s(USER1_DN)
  299. except ldap.LDAPError, e:
  300. log.error('test_attruniq: Failed to delete test entry: ' + e.message['desc'])
  301. assert False
  302. ############################################################################
  303. # Test passed
  304. ############################################################################
  305. log.info('test_attruniq: PASS\n')
  306. return
  307. ################################################################################
  308. #
  309. # Test Auto Membership Plugin (2)
  310. #
  311. ################################################################################
  312. def test_automember(inst, args=None):
  313. # stop the plugin, and start it
  314. inst.plugins.disable(name=PLUGIN_AUTOMEMBER)
  315. inst.plugins.enable(name=PLUGIN_AUTOMEMBER)
  316. if args == "restart":
  317. return
  318. CONFIG_DN = 'cn=config,cn=' + PLUGIN_AUTOMEMBER + ',cn=plugins,cn=config'
  319. log.info('Testing ' + PLUGIN_AUTOMEMBER + '...')
  320. ############################################################################
  321. # Configure plugin
  322. ############################################################################
  323. # Add the automember group
  324. try:
  325. inst.add_s(Entry((GROUP_DN, {
  326. 'objectclass': 'top extensibleObject'.split(),
  327. 'cn': 'group'
  328. })))
  329. except ldap.LDAPError, e:
  330. log.error('test_automember: Failed to add group: error ' + e.message['desc'])
  331. assert False
  332. # Add ou=branch1
  333. try:
  334. inst.add_s(Entry((BRANCH1_DN, {
  335. 'objectclass': 'top extensibleObject'.split(),
  336. 'ou': 'branch1'
  337. })))
  338. except ldap.LDAPError, e:
  339. log.error('test_automember: Failed to add branch1: error ' + e.message['desc'])
  340. assert False
  341. # Add ou=branch2
  342. try:
  343. inst.add_s(Entry((BRANCH2_DN, {
  344. 'objectclass': 'top extensibleObject'.split(),
  345. 'ou': 'branch2'
  346. })))
  347. except ldap.LDAPError, e:
  348. log.error('test_automember: Failed to add branch2: error ' + e.message['desc'])
  349. assert False
  350. # Add the automember config entry
  351. try:
  352. inst.add_s(Entry((CONFIG_DN, {
  353. 'objectclass': 'top autoMemberDefinition'.split(),
  354. 'cn': 'config',
  355. 'autoMemberScope': 'ou=branch1,' + DEFAULT_SUFFIX,
  356. 'autoMemberFilter': 'objectclass=top',
  357. 'autoMemberDefaultGroup': 'cn=group,' + DEFAULT_SUFFIX,
  358. 'autoMemberGroupingAttr': 'member:dn'
  359. })))
  360. except ldap.LDAPError, e:
  361. log.error('test_automember: Failed to add config entry: error ' + e.message['desc'])
  362. assert False
  363. ############################################################################
  364. # Test the plugin
  365. ############################################################################
  366. # Add a user that should get added to the group
  367. try:
  368. inst.add_s(Entry((BUSER1_DN, {
  369. 'objectclass': 'top extensibleObject'.split(),
  370. 'uid': 'user1'
  371. })))
  372. except ldap.LDAPError, e:
  373. log.error('test_automember: Failed to add user: error ' + e.message['desc'])
  374. assert False
  375. # Check the group
  376. try:
  377. entries = inst.search_s(GROUP_DN, ldap.SCOPE_BASE,
  378. '(member=' + BUSER1_DN + ')')
  379. if not entries:
  380. log.fatal('test_automember: Search failed to find member user1')
  381. assert False
  382. except ldap.LDAPError, e:
  383. log.fatal('test_automember: Search failed: ' + e.message['desc'])
  384. assert False
  385. ############################################################################
  386. # Change config
  387. ############################################################################
  388. try:
  389. inst.modify_s(CONFIG_DN,
  390. [(ldap.MOD_REPLACE, 'autoMemberGroupingAttr', 'uniquemember:dn'),
  391. (ldap.MOD_REPLACE, 'autoMemberScope', 'ou=branch2,' + DEFAULT_SUFFIX)])
  392. except ldap.LDAPError, e:
  393. log.error('test_automember: Failed to modify config entry: error ' + e.message['desc'])
  394. assert False
  395. ############################################################################
  396. # Test plugin
  397. ############################################################################
  398. # Add a user that should get added to the group
  399. try:
  400. inst.add_s(Entry((BUSER2_DN, {
  401. 'objectclass': 'top extensibleObject'.split(),
  402. 'uid': 'user2'
  403. })))
  404. except ldap.LDAPError, e:
  405. log.error('test_automember: Failed to user to branch2: error ' + e.message['desc'])
  406. assert False
  407. # Check the group
  408. try:
  409. entries = inst.search_s(GROUP_DN, ldap.SCOPE_BASE,
  410. '(uniquemember=' + BUSER2_DN + ')')
  411. if not entries:
  412. log.fatal('test_automember: Search failed to find uniquemember user2')
  413. assert False
  414. except ldap.LDAPError, e:
  415. log.fatal('test_automember: Search failed: ' + e.message['desc'])
  416. assert False
  417. ############################################################################
  418. # Test Task
  419. ############################################################################
  420. # Disable plugin
  421. inst.plugins.disable(name=PLUGIN_AUTOMEMBER)
  422. # Add an entry that should be picked up by automember - verify it is not(yet)
  423. try:
  424. inst.add_s(Entry((BUSER3_DN, {
  425. 'objectclass': 'top extensibleObject'.split(),
  426. 'uid': 'user3'
  427. })))
  428. except ldap.LDAPError, e:
  429. log.error('test_automember: Failed to user3 to branch2: error ' + e.message['desc'])
  430. assert False
  431. # Check the group - uniquemember should not exist
  432. try:
  433. entries = inst.search_s(GROUP_DN, ldap.SCOPE_BASE,
  434. '(uniquemember=' + BUSER3_DN + ')')
  435. if entries:
  436. log.fatal('test_automember: user3 was incorrectly added to the group')
  437. assert False
  438. except ldap.LDAPError, e:
  439. log.fatal('test_automember: Search failed: ' + e.message['desc'])
  440. assert False
  441. # Enable plugin
  442. inst.plugins.enable(name=PLUGIN_AUTOMEMBER)
  443. TASK_DN = 'cn=task-' + str(int(time.time())) + ',cn=automember rebuild membership,cn=tasks,cn=config'
  444. # Add the task
  445. try:
  446. inst.add_s(Entry((TASK_DN, {
  447. 'objectclass': 'top extensibleObject'.split(),
  448. 'basedn': 'ou=branch2,' + DEFAULT_SUFFIX,
  449. 'filter': 'objectclass=top'})))
  450. except ldap.LDAPError, e:
  451. log.error('test_automember: Failed to add task: error ' + e.message['desc'])
  452. assert False
  453. wait_for_task(inst, TASK_DN)
  454. # Verify the fixup task worked
  455. try:
  456. entries = inst.search_s(GROUP_DN, ldap.SCOPE_BASE,
  457. '(uniquemember=' + BUSER3_DN + ')')
  458. if not entries:
  459. log.fatal('test_automember: user3 was not added to the group')
  460. assert False
  461. except ldap.LDAPError, e:
  462. log.fatal('test_automember: Search failed: ' + e.message['desc'])
  463. assert False
  464. ############################################################################
  465. # Test plugin dependency
  466. ############################################################################
  467. test_dependency(inst, PLUGIN_AUTOMEMBER)
  468. ############################################################################
  469. # Cleanup
  470. ############################################################################
  471. try:
  472. inst.delete_s(BUSER1_DN)
  473. except ldap.LDAPError, e:
  474. log.error('test_automember: Failed to delete test entry1: ' + e.message['desc'])
  475. assert False
  476. try:
  477. inst.delete_s(BUSER2_DN)
  478. except ldap.LDAPError, e:
  479. log.error('test_automember: Failed to delete test entry2: ' + e.message['desc'])
  480. assert False
  481. try:
  482. inst.delete_s(BUSER3_DN)
  483. except ldap.LDAPError, e:
  484. log.error('test_automember: Failed to delete test entry3: ' + e.message['desc'])
  485. assert False
  486. try:
  487. inst.delete_s(BRANCH1_DN)
  488. except ldap.LDAPError, e:
  489. log.error('test_automember: Failed to delete branch1: ' + e.message['desc'])
  490. assert False
  491. try:
  492. inst.delete_s(BRANCH2_DN)
  493. except ldap.LDAPError, e:
  494. log.error('test_automember: Failed to delete test branch2: ' + e.message['desc'])
  495. assert False
  496. try:
  497. inst.delete_s(GROUP_DN)
  498. except ldap.LDAPError, e:
  499. log.error('test_automember: Failed to delete test group: ' + e.message['desc'])
  500. assert False
  501. try:
  502. inst.delete_s(CONFIG_DN)
  503. except ldap.LDAPError, e:
  504. log.error('test_automember: Failed to delete plugin config entry: ' + e.message['desc'])
  505. assert False
  506. ############################################################################
  507. # Test passed
  508. ############################################################################
  509. log.info('test_automember: PASS\n')
  510. return
  511. ################################################################################
  512. #
  513. # Test DNA Plugin (3)
  514. #
  515. ################################################################################
  516. def test_dna(inst, args=None):
  517. # stop the plugin, and start it
  518. inst.plugins.disable(name=PLUGIN_DNA)
  519. inst.plugins.enable(name=PLUGIN_DNA)
  520. if args == "restart":
  521. return
  522. CONFIG_DN = 'cn=config,cn=' + PLUGIN_DNA + ',cn=plugins,cn=config'
  523. log.info('Testing ' + PLUGIN_DNA + '...')
  524. ############################################################################
  525. # Configure plugin
  526. ############################################################################
  527. try:
  528. inst.add_s(Entry((CONFIG_DN, {
  529. 'objectclass': 'top dnaPluginConfig'.split(),
  530. 'cn': 'config',
  531. 'dnatype': 'uidNumber',
  532. 'dnafilter': '(objectclass=top)',
  533. 'dnascope': DEFAULT_SUFFIX,
  534. 'dnaMagicRegen': '-1',
  535. 'dnaMaxValue': '50000',
  536. 'dnaNextValue': '1'
  537. })))
  538. except ldap.ALREADY_EXISTS:
  539. try:
  540. inst.modify_s(CONFIG_DN, [(ldap.MOD_REPLACE, 'dnaNextValue', '1'),
  541. (ldap.MOD_REPLACE, 'dnaMagicRegen', '-1')])
  542. except ldap.LDAPError, e:
  543. log.error('test_dna: Failed to set the DNA plugin: error ' + e.message['desc'])
  544. assert False
  545. except ldap.LDAPError, e:
  546. log.error('test_dna: Failed to add config entry: error ' + e.message['desc'])
  547. assert False
  548. ############################################################################
  549. # Test plugin
  550. ############################################################################
  551. try:
  552. inst.add_s(Entry((USER1_DN, {
  553. 'objectclass': 'top extensibleObject'.split(),
  554. 'uid': 'user1'
  555. })))
  556. except ldap.LDAPError, e:
  557. log.error('test_dna: Failed to user1: error ' + e.message['desc'])
  558. assert False
  559. # See if the entry now has the new uidNumber assignment - uidNumber=1
  560. try:
  561. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(uidNumber=1)')
  562. if not entries:
  563. log.fatal('test_dna: user1 was not updated - (looking for uidNumber: 1)')
  564. assert False
  565. except ldap.LDAPError, e:
  566. log.fatal('test_dna: Search for user1 failed: ' + e.message['desc'])
  567. assert False
  568. # Test the magic regen value
  569. try:
  570. inst.modify_s(USER1_DN, [(ldap.MOD_REPLACE, 'uidNumber', '-1')])
  571. except ldap.LDAPError, e:
  572. log.error('test_dna: Failed to set the magic reg value: error ' + e.message['desc'])
  573. assert False
  574. # See if the entry now has the new uidNumber assignment - uidNumber=2
  575. try:
  576. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(uidNumber=2)')
  577. if not entries:
  578. log.fatal('test_dna: user1 was not updated (looking for uidNumber: 2)')
  579. assert False
  580. except ldap.LDAPError, e:
  581. log.fatal('test_dna: Search for user1 failed: ' + e.message['desc'])
  582. assert False
  583. ################################################################################
  584. # Change the config
  585. ################################################################################
  586. try:
  587. inst.modify_s(CONFIG_DN, [(ldap.MOD_REPLACE, 'dnaMagicRegen', '-2')])
  588. except ldap.LDAPError, e:
  589. log.error('test_dna: Failed to set the magic reg value to -2: error ' + e.message['desc'])
  590. assert False
  591. ################################################################################
  592. # Test plugin
  593. ################################################################################
  594. # Test the magic regen value
  595. try:
  596. inst.modify_s(USER1_DN, [(ldap.MOD_REPLACE, 'uidNumber', '-2')])
  597. except ldap.LDAPError, e:
  598. log.error('test_dna: Failed to set the magic reg value: error ' + e.message['desc'])
  599. assert False
  600. # See if the entry now has the new uidNumber assignment - uidNumber=3
  601. try:
  602. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(uidNumber=3)')
  603. if not entries:
  604. log.fatal('test_dna: user1 was not updated (looking for uidNumber: 3)')
  605. assert False
  606. except ldap.LDAPError, e:
  607. log.fatal('test_dna: Search for user1 failed: ' + e.message['desc'])
  608. assert False
  609. ############################################################################
  610. # Test plugin dependency
  611. ############################################################################
  612. test_dependency(inst, PLUGIN_AUTOMEMBER)
  613. ############################################################################
  614. # Cleanup
  615. ############################################################################
  616. try:
  617. inst.delete_s(USER1_DN)
  618. except ldap.LDAPError, e:
  619. log.error('test_dna: Failed to delete test entry1: ' + e.message['desc'])
  620. assert False
  621. inst.plugins.disable(name=PLUGIN_DNA)
  622. ############################################################################
  623. # Test passed
  624. ############################################################################
  625. log.info('test_dna: PASS\n')
  626. return
  627. ################################################################################
  628. #
  629. # Test Linked Attrs Plugin (4)
  630. #
  631. ################################################################################
  632. def test_linkedattrs(inst, args=None):
  633. # stop the plugin, and start it
  634. inst.plugins.disable(name=PLUGIN_LINKED_ATTRS)
  635. inst.plugins.enable(name=PLUGIN_LINKED_ATTRS)
  636. if args == "restart":
  637. return
  638. CONFIG_DN = 'cn=config,cn=' + PLUGIN_LINKED_ATTRS + ',cn=plugins,cn=config'
  639. log.info('Testing ' + PLUGIN_LINKED_ATTRS + '...')
  640. ############################################################################
  641. # Configure plugin
  642. ############################################################################
  643. # Add test entries
  644. try:
  645. inst.add_s(Entry((USER1_DN, {
  646. 'objectclass': 'top extensibleObject'.split(),
  647. 'uid': 'user1'
  648. })))
  649. except ldap.LDAPError, e:
  650. log.error('test_linkedattrs: Failed to user1: error ' + e.message['desc'])
  651. assert False
  652. try:
  653. inst.add_s(Entry((USER2_DN, {
  654. 'objectclass': 'top extensibleObject'.split(),
  655. 'uid': 'user2'
  656. })))
  657. except ldap.LDAPError, e:
  658. log.error('test_linkedattrs: Failed to user1: error ' + e.message['desc'])
  659. assert False
  660. # Add the linked attrs config entry
  661. try:
  662. inst.add_s(Entry((CONFIG_DN, {
  663. 'objectclass': 'top extensibleObject'.split(),
  664. 'cn': 'config',
  665. 'linkType': 'directReport',
  666. 'managedType': 'manager'
  667. })))
  668. except ldap.LDAPError, e:
  669. log.error('test_linkedattrs: Failed to add config entry: error ' + e.message['desc'])
  670. assert False
  671. ############################################################################
  672. # Test plugin
  673. ############################################################################
  674. # Set "directReport" should add "manager" to the other entry
  675. try:
  676. inst.modify_s(USER1_DN, [(ldap.MOD_REPLACE, 'directReport', USER2_DN)])
  677. except ldap.LDAPError, e:
  678. log.error('test_linkedattrs: Failed to add "directReport" to user1: error ' + e.message['desc'])
  679. assert False
  680. # See if manager was added to the other entry
  681. try:
  682. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  683. if not entries:
  684. log.fatal('test_linkedattrs: user2 missing "manager" attribute')
  685. assert False
  686. except ldap.LDAPError, e:
  687. log.fatal('test_linkedattrs: Search for user1 failed: ' + e.message['desc'])
  688. assert False
  689. # Remove "directReport" should remove "manager" to the other entry
  690. try:
  691. inst.modify_s(USER1_DN, [(ldap.MOD_DELETE, 'directReport', None)])
  692. except ldap.LDAPError, e:
  693. log.error('test_linkedattrs: Failed to delete directReport: error ' + e.message['desc'])
  694. assert False
  695. # See if manager was removed
  696. try:
  697. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  698. if entries:
  699. log.fatal('test_linkedattrs: user2 "manager" attribute not removed')
  700. assert False
  701. except ldap.LDAPError, e:
  702. log.fatal('test_linkedattrs: Search for user1 failed: ' + e.message['desc'])
  703. assert False
  704. ############################################################################
  705. # Change the config - using linkType "indirectReport" now
  706. ############################################################################
  707. try:
  708. inst.modify_s(CONFIG_DN, [(ldap.MOD_REPLACE, 'linkType', 'indirectReport')])
  709. except ldap.LDAPError, e:
  710. log.error('test_linkedattrs: Failed to set linkTypee: error ' + e.message['desc'])
  711. assert False
  712. ############################################################################
  713. # Test plugin
  714. ############################################################################
  715. # Make sure the old linkType(directManager) is not working
  716. try:
  717. inst.modify_s(USER1_DN, [(ldap.MOD_REPLACE, 'directReport', USER2_DN)])
  718. except ldap.LDAPError, e:
  719. log.error('test_linkedattrs: Failed to add "directReport" to user1: error ' + e.message['desc'])
  720. assert False
  721. # See if manager was added to the other entry, better not be...
  722. try:
  723. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  724. if entries:
  725. log.fatal('test_linkedattrs: user2 had "manager" added unexpectedly')
  726. assert False
  727. except ldap.LDAPError, e:
  728. log.fatal('test_linkedattrs: Search for user2 failed: ' + e.message['desc'])
  729. assert False
  730. # Now, set the new linkType "indirectReport", which should add "manager" to the other entry
  731. try:
  732. inst.modify_s(USER1_DN, [(ldap.MOD_REPLACE, 'indirectReport', USER2_DN)])
  733. except ldap.LDAPError, e:
  734. log.error('test_linkedattrs: Failed to add "indirectReport" to user1: error ' + e.message['desc'])
  735. assert False
  736. # See if manager was added to the other entry, better not be
  737. try:
  738. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  739. if not entries:
  740. log.fatal('test_linkedattrs: user2 missing "manager"')
  741. assert False
  742. except ldap.LDAPError, e:
  743. log.fatal('test_linkedattrs: Search for user2 failed: ' + e.message['desc'])
  744. assert False
  745. # Remove "indirectReport" should remove "manager" to the other entry
  746. try:
  747. inst.modify_s(USER1_DN, [(ldap.MOD_DELETE, 'indirectReport', None)])
  748. except ldap.LDAPError, e:
  749. log.error('test_linkedattrs: Failed to delete directReport: error ' + e.message['desc'])
  750. assert False
  751. # See if manager was removed
  752. try:
  753. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  754. if entries:
  755. log.fatal('test_linkedattrs: user2 "manager" attribute not removed')
  756. assert False
  757. except ldap.LDAPError, e:
  758. log.fatal('test_linkedattrs: Search for user1 failed: ' + e.message['desc'])
  759. assert False
  760. ############################################################################
  761. # Test Fixup Task
  762. ############################################################################
  763. # Disable plugin and make some updates that would of triggered the plugin
  764. inst.plugins.disable(name=PLUGIN_LINKED_ATTRS)
  765. try:
  766. inst.modify_s(USER1_DN, [(ldap.MOD_REPLACE, 'indirectReport', USER2_DN)])
  767. except ldap.LDAPError, e:
  768. log.error('test_linkedattrs: Failed to add "indirectReport" to user1: error ' + e.message['desc'])
  769. assert False
  770. # The entry should not have a manager attribute
  771. try:
  772. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  773. if entries:
  774. log.fatal('test_linkedattrs: user2 incorrectly has a "manager" attr')
  775. assert False
  776. except ldap.LDAPError, e:
  777. log.fatal('test_linkedattrs: Search for user1 failed: ' + e.message['desc'])
  778. assert False
  779. # Enable the plugin and rerun the task entry
  780. inst.plugins.enable(name=PLUGIN_LINKED_ATTRS)
  781. # Add the task again
  782. TASK_DN = 'cn=task-' + str(int(time.time())) + ',cn=fixup linked attributes,cn=tasks,cn=config'
  783. try:
  784. inst.add_s(Entry(('cn=task-' + str(int(time.time())) + ',cn=fixup linked attributes,cn=tasks,cn=config', {
  785. 'objectclass': 'top extensibleObject'.split(),
  786. 'basedn': DEFAULT_SUFFIX,
  787. 'filter': 'objectclass=top'})))
  788. except ldap.LDAPError, e:
  789. log.error('test_linkedattrs: Failed to add task: error ' + e.message['desc'])
  790. assert False
  791. wait_for_task(inst, TASK_DN)
  792. # Check if user2 now has a manager attribute now
  793. try:
  794. entries = inst.search_s(USER2_DN, ldap.SCOPE_BASE, '(manager=*)')
  795. if not entries:
  796. log.fatal('test_linkedattrs: task failed: user2 missing "manager" attr')
  797. assert False
  798. except ldap.LDAPError, e:
  799. log.fatal('test_linkedattrs: Search for user1 failed: ' + e.message['desc'])
  800. assert False
  801. ############################################################################
  802. # Test plugin dependency
  803. ############################################################################
  804. test_dependency(inst, PLUGIN_LINKED_ATTRS)
  805. ############################################################################
  806. # Cleanup
  807. ############################################################################
  808. try:
  809. inst.delete_s(USER1_DN)
  810. except ldap.LDAPError, e:
  811. log.error('test_linkedattrs: Failed to delete test entry1: ' + e.message['desc'])
  812. assert False
  813. try:
  814. inst.delete_s(USER2_DN)
  815. except ldap.LDAPError, e:
  816. log.error('test_linkedattrs: Failed to delete test entry2: ' + e.message['desc'])
  817. assert False
  818. try:
  819. inst.delete_s(CONFIG_DN)
  820. except ldap.LDAPError, e:
  821. log.error('test_linkedattrs: Failed to delete plugin config entry: ' + e.message['desc'])
  822. assert False
  823. ############################################################################
  824. # Test passed
  825. ############################################################################
  826. log.info('test_linkedattrs: PASS\n')
  827. return
  828. ################################################################################
  829. #
  830. # Test MemberOf Plugin (5)
  831. #
  832. ################################################################################
  833. def test_memberof(inst, args=None):
  834. # stop the plugin, and start it
  835. inst.plugins.disable(name=PLUGIN_MEMBER_OF)
  836. inst.plugins.enable(name=PLUGIN_MEMBER_OF)
  837. if args == "restart":
  838. return
  839. PLUGIN_DN = 'cn=' + PLUGIN_MEMBER_OF + ',cn=plugins,cn=config'
  840. SHARED_CONFIG_DN = 'cn=memberOf Config,' + DEFAULT_SUFFIX
  841. log.info('Testing ' + PLUGIN_MEMBER_OF + '...')
  842. ############################################################################
  843. # Configure plugin
  844. ############################################################################
  845. try:
  846. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'memberofgroupattr', 'member')])
  847. except ldap.LDAPError, e:
  848. log.error('test_memberof: Failed to update config(member): error ' + e.message['desc'])
  849. assert False
  850. ############################################################################
  851. # Test plugin
  852. ############################################################################
  853. # Add our test entries
  854. try:
  855. inst.add_s(Entry((USER1_DN, {
  856. 'objectclass': 'top extensibleObject'.split(),
  857. 'uid': 'user1'
  858. })))
  859. except ldap.LDAPError, e:
  860. log.error('test_memberof: Failed to add user1: error ' + e.message['desc'])
  861. assert False
  862. try:
  863. inst.add_s(Entry((GROUP_DN, {
  864. 'objectclass': 'top groupOfNames groupOfUniqueNames extensibleObject'.split(),
  865. 'cn': 'group',
  866. 'member': USER1_DN
  867. })))
  868. except ldap.LDAPError, e:
  869. log.error('test_memberof: Failed to add group: error ' + e.message['desc'])
  870. assert False
  871. try:
  872. inst.add_s(Entry((SHARED_CONFIG_DN, {
  873. 'objectclass': 'top extensibleObject'.split(),
  874. 'memberofgroupattr': 'member',
  875. 'memberofattr': 'memberof'
  876. })))
  877. except ldap.LDAPError, e:
  878. log.error('test_memberof: Failed to shared config entry: error ' + e.message['desc'])
  879. assert False
  880. # Check if the user now has a "memberOf" attribute
  881. try:
  882. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  883. if not entries:
  884. log.fatal('test_memberof: user1 missing memberOf')
  885. assert False
  886. except ldap.LDAPError, e:
  887. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  888. assert False
  889. # Remove "member" should remove "memberOf" from the entry
  890. try:
  891. inst.modify_s(GROUP_DN, [(ldap.MOD_DELETE, 'member', None)])
  892. except ldap.LDAPError, e:
  893. log.error('test_memberof: Failed to delete member: error ' + e.message['desc'])
  894. assert False
  895. # Check that "memberOf" was removed
  896. try:
  897. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  898. if entries:
  899. log.fatal('test_memberof: user1 incorrectly has memberOf attr')
  900. assert False
  901. except ldap.LDAPError, e:
  902. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  903. assert False
  904. ############################################################################
  905. # Change the config
  906. ############################################################################
  907. try:
  908. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'memberofgroupattr', 'uniquemember')])
  909. except ldap.LDAPError, e:
  910. log.error('test_memberof: Failed to update config(uniquemember): error ' + e.message['desc'])
  911. assert False
  912. ############################################################################
  913. # Test plugin
  914. ############################################################################
  915. try:
  916. inst.modify_s(GROUP_DN, [(ldap.MOD_REPLACE, 'uniquemember', USER1_DN)])
  917. except ldap.LDAPError, e:
  918. log.error('test_memberof: Failed to add uniquemember: error ' + e.message['desc'])
  919. assert False
  920. # Check if the user now has a "memberOf" attribute
  921. try:
  922. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  923. if not entries:
  924. log.fatal('test_memberof: user1 missing memberOf')
  925. assert False
  926. except ldap.LDAPError, e:
  927. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  928. assert False
  929. # Remove "uniquemember" should remove "memberOf" from the entry
  930. try:
  931. inst.modify_s(GROUP_DN, [(ldap.MOD_DELETE, 'uniquemember', None)])
  932. except ldap.LDAPError, e:
  933. log.error('test_memberof: Failed to delete member: error ' + e.message['desc'])
  934. assert False
  935. # Check that "memberOf" was removed
  936. try:
  937. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  938. if entries:
  939. log.fatal('test_memberof: user1 incorrectly has memberOf attr')
  940. assert False
  941. except ldap.LDAPError, e:
  942. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  943. assert False
  944. ############################################################################
  945. # Set the shared config entry and test the plugin
  946. ############################################################################
  947. # The shared config entry uses "member" - the above test uses "uniquemember"
  948. try:
  949. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, CONFIG_AREA, SHARED_CONFIG_DN)])
  950. except ldap.LDAPError, e:
  951. log.error('test_memberof: Failed to set plugin area: error ' + e.message['desc'])
  952. assert False
  953. # Delete the test entries then readd them to start with a clean slate
  954. try:
  955. inst.delete_s(USER1_DN)
  956. except ldap.LDAPError, e:
  957. log.error('test_memberof: Failed to delete test entry1: ' + e.message['desc'])
  958. assert False
  959. try:
  960. inst.delete_s(GROUP_DN)
  961. except ldap.LDAPError, e:
  962. log.error('test_memberof: Failed to delete test group: ' + e.message['desc'])
  963. assert False
  964. try:
  965. inst.add_s(Entry((USER1_DN, {
  966. 'objectclass': 'top extensibleObject'.split(),
  967. 'uid': 'user1'
  968. })))
  969. except ldap.LDAPError, e:
  970. log.error('test_memberof: Failed to add user1: error ' + e.message['desc'])
  971. assert False
  972. try:
  973. inst.add_s(Entry((GROUP_DN, {
  974. 'objectclass': 'top groupOfNames groupOfUniqueNames extensibleObject'.split(),
  975. 'cn': 'group',
  976. 'member': USER1_DN
  977. })))
  978. except ldap.LDAPError, e:
  979. log.error('test_memberof: Failed to add group: error ' + e.message['desc'])
  980. assert False
  981. # Test the shared config
  982. # Check if the user now has a "memberOf" attribute
  983. try:
  984. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  985. if not entries:
  986. log.fatal('test_memberof: user1 missing memberOf')
  987. assert False
  988. except ldap.LDAPError, e:
  989. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  990. assert False
  991. # Remove "member" should remove "memberOf" from the entry
  992. try:
  993. inst.modify_s(GROUP_DN, [(ldap.MOD_DELETE, 'member', None)])
  994. except ldap.LDAPError, e:
  995. log.error('test_memberof: Failed to delete member: error ' + e.message['desc'])
  996. assert False
  997. # Check that "memberOf" was removed
  998. try:
  999. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1000. if entries:
  1001. log.fatal('test_memberof: user1 incorrectly has memberOf attr')
  1002. assert False
  1003. except ldap.LDAPError, e:
  1004. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1005. assert False
  1006. ############################################################################
  1007. # Change the shared config entry to use 'uniquemember' and test the plugin
  1008. ############################################################################
  1009. try:
  1010. inst.modify_s(SHARED_CONFIG_DN, [(ldap.MOD_REPLACE, 'memberofgroupattr', 'uniquemember')])
  1011. except ldap.LDAPError, e:
  1012. log.error('test_memberof: Failed to set shared plugin entry(uniquemember): error '
  1013. + e.message['desc'])
  1014. assert False
  1015. try:
  1016. inst.modify_s(GROUP_DN, [(ldap.MOD_REPLACE, 'uniquemember', USER1_DN)])
  1017. except ldap.LDAPError, e:
  1018. log.error('test_memberof: Failed to add uniquemember: error ' + e.message['desc'])
  1019. assert False
  1020. # Check if the user now has a "memberOf" attribute
  1021. try:
  1022. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1023. if not entries:
  1024. log.fatal('test_memberof: user1 missing memberOf')
  1025. assert False
  1026. except ldap.LDAPError, e:
  1027. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1028. assert False
  1029. # Remove "uniquemember" should remove "memberOf" from the entry
  1030. try:
  1031. inst.modify_s(GROUP_DN, [(ldap.MOD_DELETE, 'uniquemember', None)])
  1032. except ldap.LDAPError, e:
  1033. log.error('test_memberof: Failed to delete member: error ' + e.message['desc'])
  1034. assert False
  1035. # Check that "memberOf" was removed
  1036. try:
  1037. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1038. if entries:
  1039. log.fatal('test_memberof: user1 incorrectly has memberOf attr')
  1040. assert False
  1041. except ldap.LDAPError, e:
  1042. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1043. assert False
  1044. ############################################################################
  1045. # Remove shared config from plugin, and retest
  1046. ############################################################################
  1047. # First change the plugin to use member before we move the shared config that uses uniquemember
  1048. try:
  1049. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'memberofgroupattr', 'member')])
  1050. except ldap.LDAPError, e:
  1051. log.error('test_memberof: Failed to update config(uniquemember): error ' + e.message['desc'])
  1052. assert False
  1053. # Remove shared config from plugin
  1054. try:
  1055. inst.modify_s(PLUGIN_DN, [(ldap.MOD_DELETE, CONFIG_AREA, None)])
  1056. except ldap.LDAPError, e:
  1057. log.error('test_memberof: Failed to add uniquemember: error ' + e.message['desc'])
  1058. assert False
  1059. try:
  1060. inst.modify_s(GROUP_DN, [(ldap.MOD_REPLACE, 'member', USER1_DN)])
  1061. except ldap.LDAPError, e:
  1062. log.error('test_memberof: Failed to add uniquemember: error ' + e.message['desc'])
  1063. assert False
  1064. # Check if the user now has a "memberOf" attribute
  1065. try:
  1066. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1067. if not entries:
  1068. log.fatal('test_memberof: user1 missing memberOf')
  1069. assert False
  1070. except ldap.LDAPError, e:
  1071. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1072. assert False
  1073. # Remove "uniquemember" should remove "memberOf" from the entry
  1074. try:
  1075. inst.modify_s(GROUP_DN, [(ldap.MOD_DELETE, 'member', None)])
  1076. except ldap.LDAPError, e:
  1077. log.error('test_memberof: Failed to delete member: error ' + e.message['desc'])
  1078. assert False
  1079. # Check that "memberOf" was removed
  1080. try:
  1081. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1082. if entries:
  1083. log.fatal('test_memberof: user1 incorrectly has memberOf attr')
  1084. assert False
  1085. except ldap.LDAPError, e:
  1086. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1087. assert False
  1088. ############################################################################
  1089. # Test Fixup Task
  1090. ############################################################################
  1091. inst.plugins.disable(name=PLUGIN_MEMBER_OF)
  1092. # First change the plugin to use uniquemember
  1093. try:
  1094. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'memberofgroupattr', 'uniquemember')])
  1095. except ldap.LDAPError, e:
  1096. log.error('test_memberof: Failed to update config(uniquemember): error ' + e.message['desc'])
  1097. assert False
  1098. # Add uniquemember, should not update USER1
  1099. try:
  1100. inst.modify_s(GROUP_DN, [(ldap.MOD_REPLACE, 'uniquemember', USER1_DN)])
  1101. except ldap.LDAPError, e:
  1102. log.error('test_memberof: Failed to add uniquemember: error ' + e.message['desc'])
  1103. assert False
  1104. # Check for "memberOf"
  1105. try:
  1106. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1107. if entries:
  1108. log.fatal('test_memberof: user1 incorrect has memberOf attr')
  1109. assert False
  1110. except ldap.LDAPError, e:
  1111. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1112. assert False
  1113. # Enable the plugin, and run the task
  1114. inst.plugins.enable(name=PLUGIN_MEMBER_OF)
  1115. TASK_DN = 'cn=task-' + str(int(time.time())) + ',' + DN_MBO_TASK
  1116. try:
  1117. inst.add_s(Entry((TASK_DN, {
  1118. 'objectclass': 'top extensibleObject'.split(),
  1119. 'basedn': DEFAULT_SUFFIX,
  1120. 'filter': 'objectclass=top'})))
  1121. except ldap.LDAPError, e:
  1122. log.error('test_memberof: Failed to add task: error ' + e.message['desc'])
  1123. assert False
  1124. wait_for_task(inst, TASK_DN)
  1125. # Check for "memberOf"
  1126. try:
  1127. entries = inst.search_s(USER1_DN, ldap.SCOPE_BASE, '(memberOf=*)')
  1128. if not entries:
  1129. log.fatal('test_memberof: user1 missing memberOf attr')
  1130. assert False
  1131. except ldap.LDAPError, e:
  1132. log.fatal('test_memberof: Search for user1 failed: ' + e.message['desc'])
  1133. assert False
  1134. ############################################################################
  1135. # Test plugin dependency
  1136. ############################################################################
  1137. test_dependency(inst, PLUGIN_MEMBER_OF)
  1138. ############################################################################
  1139. # Cleanup
  1140. ############################################################################
  1141. try:
  1142. inst.delete_s(USER1_DN)
  1143. except ldap.LDAPError, e:
  1144. log.error('test_memberof: Failed to delete test entry1: ' + e.message['desc'])
  1145. assert False
  1146. try:
  1147. inst.delete_s(GROUP_DN)
  1148. except ldap.LDAPError, e:
  1149. log.error('test_memberof: Failed to delete test group: ' + e.message['desc'])
  1150. assert False
  1151. try:
  1152. inst.delete_s(SHARED_CONFIG_DN)
  1153. except ldap.LDAPError, e:
  1154. log.error('test_memberof: Failed to delete shared config entry: ' + e.message['desc'])
  1155. assert False
  1156. ############################################################################
  1157. # Test passed
  1158. ############################################################################
  1159. log.info('test_memberof: PASS\n')
  1160. return
  1161. ################################################################################
  1162. #
  1163. # Test Managed Entry Plugin (6)
  1164. #
  1165. ################################################################################
  1166. def test_mep(inst, args=None):
  1167. # stop the plugin, and start it
  1168. inst.plugins.disable(name=PLUGIN_MANAGED_ENTRY)
  1169. inst.plugins.enable(name=PLUGIN_MANAGED_ENTRY)
  1170. if args == "restart":
  1171. return
  1172. USER_DN = 'uid=user1,ou=people,' + DEFAULT_SUFFIX
  1173. MEP_USER_DN = 'cn=user1,ou=groups,' + DEFAULT_SUFFIX
  1174. USER_DN2 = 'uid=user 1,ou=people,' + DEFAULT_SUFFIX
  1175. MEP_USER_DN2 = 'uid=user 1,ou=groups,' + DEFAULT_SUFFIX
  1176. CONFIG_DN = 'cn=config,cn=' + PLUGIN_MANAGED_ENTRY + ',cn=plugins,cn=config'
  1177. TEMPLATE_DN = 'cn=MEP Template,' + DEFAULT_SUFFIX
  1178. TEMPLATE_DN2 = 'cn=MEP Template2,' + DEFAULT_SUFFIX
  1179. log.info('Testing ' + PLUGIN_MANAGED_ENTRY + '...')
  1180. ############################################################################
  1181. # Configure plugin
  1182. ############################################################################
  1183. # Add our org units
  1184. try:
  1185. inst.add_s(Entry((PEOPLE_OU, {
  1186. 'objectclass': 'top extensibleObject'.split(),
  1187. 'ou': 'people'})))
  1188. except ldap.ALREADY_EXISTS:
  1189. pass
  1190. except ldap.LDAPError, e:
  1191. log.error('test_mep: Failed to add people org unit: error ' + e.message['desc'])
  1192. assert False
  1193. try:
  1194. inst.add_s(Entry((GROUP_OU, {
  1195. 'objectclass': 'top extensibleObject'.split(),
  1196. 'ou': 'people'})))
  1197. except ldap.ALREADY_EXISTS:
  1198. pass
  1199. except ldap.LDAPError, e:
  1200. log.error('test_mep: Failed to add people org unit: error ' + e.message['desc'])
  1201. assert False
  1202. # Add the template entry
  1203. try:
  1204. inst.add_s(Entry((TEMPLATE_DN, {
  1205. 'objectclass': 'top mepTemplateEntry extensibleObject'.split(),
  1206. 'cn': 'MEP Template',
  1207. 'mepRDNAttr': 'cn',
  1208. 'mepStaticAttr': 'objectclass: posixGroup|objectclass: extensibleObject'.split('|'),
  1209. 'mepMappedAttr': 'cn: $cn|uid: $cn|gidNumber: $uidNumber'.split('|')
  1210. })))
  1211. except ldap.LDAPError, e:
  1212. log.error('test_mep: Failed to add template entry: error ' + e.message['desc'])
  1213. assert False
  1214. # Add the config entry
  1215. try:
  1216. inst.add_s(Entry((CONFIG_DN, {
  1217. 'objectclass': 'top extensibleObject'.split(),
  1218. 'cn': 'config',
  1219. 'originScope': PEOPLE_OU,
  1220. 'originFilter': 'objectclass=posixAccount',
  1221. 'managedBase': GROUP_OU,
  1222. 'managedTemplate': TEMPLATE_DN
  1223. })))
  1224. except ldap.LDAPError, e:
  1225. log.error('test_mep: Failed to add config entry: error ' + e.message['desc'])
  1226. assert False
  1227. ############################################################################
  1228. # Test plugin
  1229. ############################################################################
  1230. # Add an entry that meets the MEP scope
  1231. try:
  1232. inst.add_s(Entry((USER_DN, {
  1233. 'objectclass': 'top posixAccount extensibleObject'.split(),
  1234. 'uid': 'user1',
  1235. 'cn': 'user1',
  1236. 'uidNumber': '1',
  1237. 'gidNumber': '1',
  1238. 'homeDirectory': '/home/user1'
  1239. })))
  1240. except ldap.LDAPError, e:
  1241. log.error('test_mep: Failed to user1: error ' + e.message['desc'])
  1242. assert False
  1243. # Check if a managed group entry was created
  1244. try:
  1245. inst.search_s(MEP_USER_DN, ldap.SCOPE_BASE, '(objectclass=top)')
  1246. except ldap.LDAPError, e:
  1247. log.fatal('test_mep: Unable to find MEP entry: ' + e.message['desc'])
  1248. assert False
  1249. ############################################################################
  1250. # Change the config
  1251. ############################################################################
  1252. # Add a new template entry
  1253. try:
  1254. inst.add_s(Entry((TEMPLATE_DN2, {
  1255. 'objectclass': 'top mepTemplateEntry extensibleObject'.split(),
  1256. 'cn': 'MEP Template2',
  1257. 'mepRDNAttr': 'uid',
  1258. 'mepStaticAttr': 'objectclass: posixGroup|objectclass: extensibleObject'.split('|'),
  1259. 'mepMappedAttr': 'cn: $uid|uid: $cn|gidNumber: $gidNumber'.split('|')
  1260. })))
  1261. except ldap.LDAPError, e:
  1262. log.error('test_mep: Failed to add template entry2: error ' + e.message['desc'])
  1263. assert False
  1264. # Set the new template dn
  1265. try:
  1266. inst.modify_s(CONFIG_DN, [(ldap.MOD_REPLACE, 'managedTemplate', TEMPLATE_DN2)])
  1267. except ldap.LDAPError, e:
  1268. log.error('test_mep: Failed to set mep plugin config: error ' + e.message['desc'])
  1269. assert False
  1270. ############################################################################
  1271. # Test plugin
  1272. ############################################################################
  1273. # Add an entry that meets the MEP scope
  1274. try:
  1275. inst.add_s(Entry((USER_DN2, {
  1276. 'objectclass': 'top posixAccount extensibleObject'.split(),
  1277. 'uid': 'user 1',
  1278. 'cn': 'user 1',
  1279. 'uidNumber': '1',
  1280. 'gidNumber': '1',
  1281. 'homeDirectory': '/home/user2'
  1282. })))
  1283. except ldap.LDAPError, e:
  1284. log.error('test_mep: Failed to user2: error ' + e.message['desc'])
  1285. assert False
  1286. # Check if a managed group entry was created
  1287. try:
  1288. inst.search_s(MEP_USER_DN2, ldap.SCOPE_BASE, '(objectclass=top)')
  1289. except ldap.LDAPError, e:
  1290. log.fatal('test_mep: Unable to find MEP entry2: ' + e.message['desc'])
  1291. assert False
  1292. ############################################################################
  1293. # Test plugin dependency
  1294. ############################################################################
  1295. test_dependency(inst, PLUGIN_MANAGED_ENTRY)
  1296. ############################################################################
  1297. # Cleanup
  1298. ############################################################################
  1299. try:
  1300. inst.delete_s(USER_DN)
  1301. except ldap.LDAPError, e:
  1302. log.error('test_mep: Failed to delete test user1: ' + e.message['desc'])
  1303. assert False
  1304. try:
  1305. inst.delete_s(USER_DN2)
  1306. except ldap.LDAPError, e:
  1307. log.error('test_mep: Failed to delete test user 2: ' + e.message['desc'])
  1308. assert False
  1309. try:
  1310. inst.delete_s(TEMPLATE_DN)
  1311. except ldap.LDAPError, e:
  1312. log.error('test_mep: Failed to delete template1: ' + e.message['desc'])
  1313. assert False
  1314. inst.plugins.disable(name=PLUGIN_MANAGED_ENTRY)
  1315. try:
  1316. inst.delete_s(TEMPLATE_DN2)
  1317. except ldap.LDAPError, e:
  1318. log.error('test_mep: Failed to delete template2: ' + e.message['desc'])
  1319. assert False
  1320. try:
  1321. inst.delete_s(CONFIG_DN)
  1322. except ldap.LDAPError, e:
  1323. log.error('test_mep: Failed to delete config: ' + e.message['desc'])
  1324. assert False
  1325. ############################################################################
  1326. # Test passed
  1327. ############################################################################
  1328. log.info('test_mep: PASS\n')
  1329. return
  1330. ################################################################################
  1331. #
  1332. # Test Passthru Plugin (7)
  1333. #
  1334. ################################################################################
  1335. def test_passthru(inst, args=None):
  1336. # Passthru is a bit picky about the state of the entry - we can't just restart it
  1337. if args == "restart":
  1338. return
  1339. # stop the plugin
  1340. inst.plugins.disable(name=PLUGIN_PASSTHRU)
  1341. PLUGIN_DN = 'cn=' + PLUGIN_PASSTHRU + ',cn=plugins,cn=config'
  1342. PASSTHRU_DN = 'uid=admin,dc=pass,dc=thru'
  1343. PASSTHRU_DN2 = 'uid=admin2,dc=pass2,dc=thru'
  1344. PASS_SUFFIX1 = 'dc=pass,dc=thru'
  1345. PASS_SUFFIX2 = 'dc=pass2,dc=thru'
  1346. PASS_BE2 = 'PASS2'
  1347. log.info('Testing ' + PLUGIN_PASSTHRU + '...')
  1348. ############################################################################
  1349. # Add a new "remote" instance, and a user for auth
  1350. ############################################################################
  1351. # Create second instance
  1352. passthru_inst = DirSrv(verbose=False)
  1353. # Args for the instance
  1354. args_instance[SER_HOST] = LOCALHOST
  1355. args_instance[SER_PORT] = 33333
  1356. args_instance[SER_SERVERID_PROP] = 'passthru'
  1357. args_instance[SER_CREATION_SUFFIX] = PASS_SUFFIX1
  1358. args_passthru_inst = args_instance.copy()
  1359. passthru_inst.allocate(args_passthru_inst)
  1360. passthru_inst.create()
  1361. passthru_inst.open()
  1362. # Create a second backend
  1363. passthru_inst.backend.create(PASS_SUFFIX2, {BACKEND_NAME: PASS_BE2})
  1364. passthru_inst.mappingtree.create(PASS_SUFFIX2, bename=PASS_BE2)
  1365. # Create the top of the tree
  1366. try:
  1367. passthru_inst.add_s(Entry((PASS_SUFFIX2, {
  1368. 'objectclass': 'top domain'.split(),
  1369. 'dc': 'pass2'})))
  1370. except ldap.ALREADY_EXISTS:
  1371. pass
  1372. except ldap.LDAPError, e:
  1373. log.error('test_passthru: Failed to create suffix entry: error ' + e.message['desc'])
  1374. passthru_inst.delete()
  1375. assert False
  1376. # Add user to suffix1
  1377. try:
  1378. passthru_inst.add_s(Entry((PASSTHRU_DN, {
  1379. 'objectclass': 'top extensibleObject'.split(),
  1380. 'uid': 'admin',
  1381. 'userpassword': 'password'
  1382. })))
  1383. except ldap.LDAPError, e:
  1384. log.error('test_passthru: Failed to admin1: error ' + e.message['desc'])
  1385. passthru_inst.delete()
  1386. assert False
  1387. # Add user to suffix 2
  1388. try:
  1389. passthru_inst.add_s(Entry((PASSTHRU_DN2, {
  1390. 'objectclass': 'top extensibleObject'.split(),
  1391. 'uid': 'admin2',
  1392. 'userpassword': 'password'
  1393. })))
  1394. except ldap.LDAPError, e:
  1395. log.error('test_passthru: Failed to admin2 : error ' + e.message['desc'])
  1396. passthru_inst.delete()
  1397. assert False
  1398. ############################################################################
  1399. # Configure and start plugin
  1400. ############################################################################
  1401. try:
  1402. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'nsslapd-pluginenabled', 'on'),
  1403. (ldap.MOD_REPLACE, 'nsslapd-pluginarg0', 'ldap://127.0.0.1:33333/dc=pass,dc=thru')])
  1404. except ldap.LDAPError, e:
  1405. log.error('test_passthru: Failed to set mep plugin config: error ' + e.message['desc'])
  1406. passthru_inst.delete()
  1407. assert False
  1408. ############################################################################
  1409. # Test plugin
  1410. ############################################################################
  1411. # login as user
  1412. try:
  1413. inst.simple_bind_s(PASSTHRU_DN, "password")
  1414. except ldap.LDAPError, e:
  1415. log.error('test_passthru: pass through bind failed: ' + e.message['desc'])
  1416. passthru_inst.delete()
  1417. assert False
  1418. ############################################################################
  1419. # Change the config
  1420. ############################################################################
  1421. # login as root DN
  1422. try:
  1423. inst.simple_bind_s(DN_DM, PASSWORD)
  1424. except ldap.LDAPError, e:
  1425. log.error('test_passthru: pass through bind failed: ' + e.message['desc'])
  1426. passthru_inst.delete()
  1427. assert False
  1428. try:
  1429. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'nsslapd-pluginarg0', 'ldap://127.0.0.1:33333/dc=pass2,dc=thru')])
  1430. except ldap.LDAPError, e:
  1431. log.error('test_passthru: Failed to set mep plugin config: error ' + e.message['desc'])
  1432. passthru_inst.delete()
  1433. assert False
  1434. ############################################################################
  1435. # Test plugin
  1436. ############################################################################
  1437. # login as user
  1438. try:
  1439. inst.simple_bind_s(PASSTHRU_DN2, "password")
  1440. except ldap.LDAPError, e:
  1441. log.error('test_passthru: pass through bind failed: ' + e.message['desc'])
  1442. passthru_inst.delete()
  1443. assert False
  1444. # login as root DN
  1445. try:
  1446. inst.simple_bind_s(DN_DM, PASSWORD)
  1447. except ldap.LDAPError, e:
  1448. log.error('test_passthru: pass through bind failed: ' + e.message['desc'])
  1449. passthru_inst.delete()
  1450. assert False
  1451. ############################################################################
  1452. # Test plugin dependency
  1453. ############################################################################
  1454. test_dependency(inst, PLUGIN_PASSTHRU)
  1455. ############################################################################
  1456. # Cleanup
  1457. ############################################################################
  1458. # remove the passthru instance
  1459. passthru_inst.delete()
  1460. ############################################################################
  1461. # Test passed
  1462. ############################################################################
  1463. log.info('test_passthru: PASS\n')
  1464. return
  1465. ################################################################################
  1466. #
  1467. # Test Referential Integrity Plugin (8)
  1468. #
  1469. ################################################################################
  1470. def test_referint(inst, args=None):
  1471. # stop the plugin, and start it
  1472. inst.plugins.disable(name=PLUGIN_REFER_INTEGRITY)
  1473. inst.plugins.enable(name=PLUGIN_REFER_INTEGRITY)
  1474. if args == "restart":
  1475. return
  1476. log.info('Testing ' + PLUGIN_REFER_INTEGRITY + '...')
  1477. PLUGIN_DN = 'cn=' + PLUGIN_REFER_INTEGRITY + ',cn=plugins,cn=config'
  1478. SHARED_CONFIG_DN = 'cn=RI Config,' + DEFAULT_SUFFIX
  1479. ############################################################################
  1480. # Configure plugin
  1481. ############################################################################
  1482. try:
  1483. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'referint-membership-attr', 'member')])
  1484. except ldap.LDAPError, e:
  1485. log.error('test_referint: Failed to configure RI plugin: error ' + e.message['desc'])
  1486. assert False
  1487. ############################################################################
  1488. # Test plugin
  1489. ############################################################################
  1490. # Add some users and a group
  1491. try:
  1492. inst.add_s(Entry((USER1_DN, {
  1493. 'objectclass': 'top extensibleObject'.split(),
  1494. 'uid': 'user1'
  1495. })))
  1496. except ldap.LDAPError, e:
  1497. log.error('test_referint: Failed to add user1: error ' + e.message['desc'])
  1498. assert False
  1499. try:
  1500. inst.add_s(Entry((USER2_DN, {
  1501. 'objectclass': 'top extensibleObject'.split(),
  1502. 'uid': 'user2'
  1503. })))
  1504. except ldap.LDAPError, e:
  1505. log.error('test_referint: Failed to add user2: error ' + e.message['desc'])
  1506. assert False
  1507. try:
  1508. inst.add_s(Entry((GROUP_DN, {
  1509. 'objectclass': 'top extensibleObject'.split(),
  1510. 'cn': 'group',
  1511. 'member': USER1_DN,
  1512. 'uniquemember': USER2_DN
  1513. })))
  1514. except ldap.LDAPError, e:
  1515. log.error('test_referint: Failed to add group: error ' + e.message['desc'])
  1516. assert False
  1517. # Grab the referint log file from the plugin
  1518. try:
  1519. entries = inst.search_s(PLUGIN_DN, ldap.SCOPE_BASE, '(objectclass=top)')
  1520. REFERINT_LOGFILE = entries[0].getValue('referint-logfile')
  1521. except ldap.LDAPError, e:
  1522. log.fatal('test_referint: Unable to search plugin entry: ' + e.message['desc'])
  1523. assert False
  1524. # Add shared config entry
  1525. try:
  1526. inst.add_s(Entry((SHARED_CONFIG_DN, {
  1527. 'objectclass': 'top extensibleObject'.split(),
  1528. 'referint-membership-attr': 'member',
  1529. 'referint-update-delay': '0',
  1530. 'referint-logfile': REFERINT_LOGFILE,
  1531. 'referint-logchanges': '0'
  1532. })))
  1533. except ldap.LDAPError, e:
  1534. log.error('test_referint: Failed to shared config entry: error ' + e.message['desc'])
  1535. assert False
  1536. # Delete a user
  1537. try:
  1538. inst.delete_s(USER1_DN)
  1539. except ldap.LDAPError, e:
  1540. log.error('test_referint: Failed to delete user1: ' + e.message['desc'])
  1541. assert False
  1542. # Check for integrity
  1543. try:
  1544. entry = inst.search_s(GROUP_DN, ldap.SCOPE_BASE, '(member=' + USER1_DN + ')')
  1545. if entry:
  1546. log.error('test_referint: user1 was not removed from group')
  1547. assert False
  1548. except ldap.LDAPError, e:
  1549. log.fatal('test_referint: Unable to search group: ' + e.message['desc'])
  1550. assert False
  1551. ############################################################################
  1552. # Change the config
  1553. ############################################################################
  1554. try:
  1555. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'referint-membership-attr', 'uniquemember')])
  1556. except ldap.LDAPError, e:
  1557. log.error('test_referint: Failed to configure RI plugin: error ' + e.message['desc'])
  1558. assert False
  1559. ############################################################################
  1560. # Test plugin
  1561. ############################################################################
  1562. # Delete a user
  1563. try:
  1564. inst.delete_s(USER2_DN)
  1565. except ldap.LDAPError, e:
  1566. log.error('test_referint: Failed to delete user1: ' + e.message['desc'])
  1567. assert False
  1568. # Check for integrity
  1569. try:
  1570. entry = inst.search_s(GROUP_DN, ldap.SCOPE_BASE, '(uniquemember=' + USER2_DN + ')')
  1571. if entry:
  1572. log.error('test_referint: user2 was not removed from group')
  1573. assert False
  1574. except ldap.LDAPError, e:
  1575. log.fatal('test_referint: Unable to search group: ' + e.message['desc'])
  1576. assert False
  1577. ############################################################################
  1578. # Set the shared config entry and test the plugin
  1579. ############################################################################
  1580. # The shared config entry uses "member" - the above test used "uniquemember"
  1581. try:
  1582. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, CONFIG_AREA, SHARED_CONFIG_DN)])
  1583. except ldap.LDAPError, e:
  1584. log.error('test_referint: Failed to set plugin area: error ' + e.message['desc'])
  1585. assert False
  1586. # Delete the group, and readd everything
  1587. try:
  1588. inst.delete_s(GROUP_DN)
  1589. except ldap.LDAPError, e:
  1590. log.error('test_referint: Failed to delete group: ' + e.message['desc'])
  1591. assert False
  1592. try:
  1593. inst.add_s(Entry((USER1_DN, {
  1594. 'objectclass': 'top extensibleObject'.split(),
  1595. 'uid': 'user1'
  1596. })))
  1597. except ldap.LDAPError, e:
  1598. log.error('test_referint: Failed to add user1: error ' + e.message['desc'])
  1599. assert False
  1600. try:
  1601. inst.add_s(Entry((USER2_DN, {
  1602. 'objectclass': 'top extensibleObject'.split(),
  1603. 'uid': 'user2'
  1604. })))
  1605. except ldap.LDAPError, e:
  1606. log.error('test_referint: Failed to add user2: error ' + e.message['desc'])
  1607. assert False
  1608. try:
  1609. inst.add_s(Entry((GROUP_DN, {
  1610. 'objectclass': 'top extensibleObject'.split(),
  1611. 'cn': 'group',
  1612. 'member': USER1_DN,
  1613. 'uniquemember': USER2_DN
  1614. })))
  1615. except ldap.LDAPError, e:
  1616. log.error('test_referint: Failed to add group: error ' + e.message['desc'])
  1617. assert False
  1618. # Delete a user
  1619. try:
  1620. inst.delete_s(USER1_DN)
  1621. except ldap.LDAPError, e:
  1622. log.error('test_referint: Failed to delete user1: ' + e.message['desc'])
  1623. assert False
  1624. # Check for integrity
  1625. try:
  1626. entry = inst.search_s(GROUP_DN, ldap.SCOPE_BASE, '(member=' + USER1_DN + ')')
  1627. if entry:
  1628. log.error('test_referint: user1 was not removed from group')
  1629. assert False
  1630. except ldap.LDAPError, e:
  1631. log.fatal('test_referint: Unable to search group: ' + e.message['desc'])
  1632. assert False
  1633. ############################################################################
  1634. # Change the shared config entry to use 'uniquemember' and test the plugin
  1635. ############################################################################
  1636. try:
  1637. inst.modify_s(SHARED_CONFIG_DN, [(ldap.MOD_REPLACE, 'referint-membership-attr', 'uniquemember')])
  1638. except ldap.LDAPError, e:
  1639. log.error('test_referint: Failed to set shared plugin entry(uniquemember): error '
  1640. + e.message['desc'])
  1641. assert False
  1642. # Delete a user
  1643. try:
  1644. inst.delete_s(USER2_DN)
  1645. except ldap.LDAPError, e:
  1646. log.error('test_referint: Failed to delete user1: ' + e.message['desc'])
  1647. assert False
  1648. # Check for integrity
  1649. try:
  1650. entry = inst.search_s(GROUP_DN, ldap.SCOPE_BASE, '(uniquemember=' + USER2_DN + ')')
  1651. if entry:
  1652. log.error('test_referint: user2 was not removed from group')
  1653. assert False
  1654. except ldap.LDAPError, e:
  1655. log.fatal('test_referint: Unable to search group: ' + e.message['desc'])
  1656. assert False
  1657. ############################################################################
  1658. # Remove shared config from plugin, and retest
  1659. ############################################################################
  1660. # First change the plugin to use member before we move the shared config that uses uniquemember
  1661. try:
  1662. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'referint-membership-attr', 'member')])
  1663. except ldap.LDAPError, e:
  1664. log.error('test_referint: Failed to update config(uniquemember): error ' + e.message['desc'])
  1665. assert False
  1666. # Remove shared config from plugin
  1667. try:
  1668. inst.modify_s(PLUGIN_DN, [(ldap.MOD_DELETE, CONFIG_AREA, None)])
  1669. except ldap.LDAPError, e:
  1670. log.error('test_referint: Failed to add uniquemember: error ' + e.message['desc'])
  1671. assert False
  1672. # Add test user
  1673. try:
  1674. inst.add_s(Entry((USER1_DN, {
  1675. 'objectclass': 'top extensibleObject'.split(),
  1676. 'uid': 'user1'
  1677. })))
  1678. except ldap.LDAPError, e:
  1679. log.error('test_referint: Failed to add user1: error ' + e.message['desc'])
  1680. assert False
  1681. # Add user to group
  1682. try:
  1683. inst.modify_s(GROUP_DN, [(ldap.MOD_REPLACE, 'member', USER1_DN)])
  1684. except ldap.LDAPError, e:
  1685. log.error('test_referint: Failed to add uniquemember: error ' + e.message['desc'])
  1686. assert False
  1687. # Delete a user
  1688. try:
  1689. inst.delete_s(USER1_DN)
  1690. except ldap.LDAPError, e:
  1691. log.error('test_referint: Failed to delete user1: ' + e.message['desc'])
  1692. assert False
  1693. # Check for integrity
  1694. try:
  1695. entry = inst.search_s(GROUP_DN, ldap.SCOPE_BASE, '(member=' + USER1_DN + ')')
  1696. if entry:
  1697. log.error('test_referint: user1 was not removed from group')
  1698. assert False
  1699. except ldap.LDAPError, e:
  1700. log.fatal('test_referint: Unable to search group: ' + e.message['desc'])
  1701. assert False
  1702. ############################################################################
  1703. # Test plugin dependency
  1704. ############################################################################
  1705. test_dependency(inst, PLUGIN_REFER_INTEGRITY)
  1706. ############################################################################
  1707. # Cleanup
  1708. ############################################################################
  1709. try:
  1710. inst.delete_s(GROUP_DN)
  1711. except ldap.LDAPError, e:
  1712. log.error('test_referint: Failed to delete group: ' + e.message['desc'])
  1713. assert False
  1714. try:
  1715. inst.delete_s(SHARED_CONFIG_DN)
  1716. except ldap.LDAPError, e:
  1717. log.error('test_referint: Failed to delete shared config entry: ' + e.message['desc'])
  1718. assert False
  1719. ############################################################################
  1720. # Test passed
  1721. ############################################################################
  1722. log.info('test_referint: PASS\n')
  1723. return
  1724. ################################################################################
  1725. #
  1726. # Test Retro Changelog Plugin (9)
  1727. #
  1728. ################################################################################
  1729. def test_retrocl(inst, args=None):
  1730. # stop the plugin, and start it
  1731. inst.plugins.disable(name=PLUGIN_RETRO_CHANGELOG)
  1732. inst.plugins.enable(name=PLUGIN_RETRO_CHANGELOG)
  1733. if args == "restart":
  1734. return
  1735. log.info('Testing ' + PLUGIN_RETRO_CHANGELOG + '...')
  1736. ############################################################################
  1737. # Configure plugin
  1738. ############################################################################
  1739. # Gather the current change count (it's not 1 once we start the stabilty tests)
  1740. try:
  1741. entry = inst.search_s(RETROCL_SUFFIX, ldap.SCOPE_SUBTREE, '(changenumber=*)')
  1742. except ldap.LDAPError, e:
  1743. log.error('test_retrocl: Failed to get the count: error ' + e.message['desc'])
  1744. assert False
  1745. entry_count = len(entry)
  1746. ############################################################################
  1747. # Test plugin
  1748. ############################################################################
  1749. # Add a user
  1750. try:
  1751. inst.add_s(Entry((USER1_DN, {
  1752. 'objectclass': 'top extensibleObject'.split(),
  1753. 'uid': 'user1'
  1754. })))
  1755. except ldap.LDAPError, e:
  1756. log.error('test_retrocl: Failed to add user1: error ' + e.message['desc'])
  1757. assert False
  1758. # Check we logged this in the retro cl
  1759. try:
  1760. entry = inst.search_s(RETROCL_SUFFIX, ldap.SCOPE_SUBTREE, '(changenumber=*)')
  1761. if not entry or len(entry) == entry_count:
  1762. log.error('test_retrocl: changelog not updated')
  1763. assert False
  1764. except ldap.LDAPError, e:
  1765. log.fatal('test_retrocl: Unable to search group: ' + e.message['desc'])
  1766. assert False
  1767. entry_count += 1
  1768. ############################################################################
  1769. # Change the config - disable plugin
  1770. ############################################################################
  1771. inst.plugins.disable(name=PLUGIN_RETRO_CHANGELOG)
  1772. ############################################################################
  1773. # Test plugin
  1774. ############################################################################
  1775. try:
  1776. inst.delete_s(USER1_DN)
  1777. except ldap.LDAPError, e:
  1778. log.error('test_retrocl: Failed to delete user1: ' + e.message['desc'])
  1779. assert False
  1780. # Check we didn't logged this in the retro cl
  1781. try:
  1782. entry = inst.search_s(RETROCL_SUFFIX, ldap.SCOPE_SUBTREE, '(changenumber=*)')
  1783. if len(entry) != entry_count:
  1784. log.error('test_retrocl: changelog incorrectly updated - change count: '
  1785. + str(len(entry)) + ' - expected 1')
  1786. assert False
  1787. except ldap.LDAPError, e:
  1788. log.fatal('test_retrocl: Unable to search retro changelog: ' + e.message['desc'])
  1789. assert False
  1790. ############################################################################
  1791. # Test plugin dependency
  1792. ############################################################################
  1793. inst.plugins.enable(name=PLUGIN_RETRO_CHANGELOG)
  1794. test_dependency(inst, PLUGIN_RETRO_CHANGELOG)
  1795. ############################################################################
  1796. # Cleanup
  1797. ############################################################################
  1798. # None
  1799. ############################################################################
  1800. # Test passed
  1801. ############################################################################
  1802. log.info('test_retrocl: PASS\n')
  1803. return
  1804. ################################################################################
  1805. #
  1806. # Test Root DN Access Control Plugin (10)
  1807. #
  1808. ################################################################################
  1809. def test_rootdn(inst, args=None):
  1810. # stop the plugin, and start it
  1811. inst.plugins.disable(name=PLUGIN_ROOTDN_ACCESS)
  1812. inst.plugins.enable(name=PLUGIN_ROOTDN_ACCESS)
  1813. if args == "restart":
  1814. return
  1815. PLUGIN_DN = 'cn=' + PLUGIN_ROOTDN_ACCESS + ',cn=plugins,cn=config'
  1816. ############################################################################
  1817. # Configure plugin
  1818. ############################################################################
  1819. # Add an user and aci to open up cn=config
  1820. try:
  1821. inst.add_s(Entry((USER1_DN, {
  1822. 'objectclass': 'top extensibleObject'.split(),
  1823. 'uid': 'user1',
  1824. 'userpassword': 'password'
  1825. })))
  1826. except ldap.LDAPError, e:
  1827. log.error('test_rootdn: Failed to add user1: error ' + e.message['desc'])
  1828. assert False
  1829. # Set an aci so we can modify the plugin after ew deny the root dn
  1830. ACI = '(target ="ldap:///cn=config")(targetattr = "*")(version 3.0;acl "all access";allow (all)(userdn="ldap:///anyone");)'
  1831. try:
  1832. inst.modify_s(DN_CONFIG, [(ldap.MOD_ADD, 'aci', ACI)])
  1833. except ldap.LDAPError, e:
  1834. log.error('test_rootdn: Failed to add aci to config: error ' + e.message['desc'])
  1835. assert False
  1836. # Set allowed IP to an unknown host - blocks root dn
  1837. try:
  1838. inst.modify_s(PLUGIN_DN, [(ldap.MOD_REPLACE, 'rootdn-allow-ip', '10.10.10.10')])
  1839. except ldap.LDAPError, e:
  1840. log.error('test_rootdn: Failed to set rootDN plugin config: error ' + e.message['desc'])
  1841. assert False
  1842. ############################################################################
  1843. # Test plugin
  1844. ############################################################################
  1845. # Bind as Root DN
  1846. failed = False
  1847. try:
  1848. inst.simple_bind_s(DN_DM, PASSWORD)
  1849. except ldap.LDAPError, e:
  1850. failed = True
  1851. if not failed:
  1852. log.error('test_rootdn: Root DN was incorrectly able to bind')
  1853. assert False
  1854. ############################################################################
  1855. # Change the config
  1856. ############################################################################
  1857. try:
  1858. inst.simple_bind_s(USER1_DN, 'password')
  1859. except ldap.LDAPError, e:
  1860. log.error('test_rootdn: failed to bind as user1')
  1861. assert False
  1862. # Remove the restriction
  1863. try:
  1864. inst.modify_s(PLUGIN_DN, [(ldap.MOD_DELETE, 'rootdn-allow-ip', None)])
  1865. except ldap.LDAPError, e:
  1866. log.error('test_rootdn: Failed to set rootDN plugin config: error ' + e.message['desc'])
  1867. assert False
  1868. ############################################################################
  1869. # Test plugin
  1870. ############################################################################
  1871. # Bind as Root DN
  1872. failed = False
  1873. try:
  1874. inst.simple_bind_s(DN_DM, PASSWORD)
  1875. except ldap.LDAPError, e:
  1876. failed = True
  1877. if failed:
  1878. log.error('test_rootdn: Root DN was not able to bind')
  1879. assert False
  1880. ############################################################################
  1881. # Test plugin dependency
  1882. ############################################################################
  1883. test_dependency(inst, PLUGIN_ROOTDN_ACCESS)
  1884. ############################################################################
  1885. # Cleanup - remove ACI from cn=config and test user
  1886. ############################################################################
  1887. try:
  1888. inst.modify_s(DN_CONFIG, [(ldap.MOD_DELETE, 'aci', ACI)])
  1889. except ldap.LDAPError, e:
  1890. log.error('test_rootdn: Failed to add aci to config: error ' + e.message['desc'])
  1891. assert False
  1892. try:
  1893. inst.delete_s(USER1_DN)
  1894. except ldap.LDAPError, e:
  1895. log.error('test_rootdn: Failed to delete user1: ' + e.message['desc'])
  1896. assert False
  1897. ############################################################################
  1898. # Test passed
  1899. ############################################################################
  1900. log.info('test_rootdn: PASS\n')
  1901. return
  1902. # Array of test functions
  1903. func_tests = [test_acctpolicy, test_attruniq, test_automember, test_dna,
  1904. test_linkedattrs, test_memberof, test_mep, test_passthru,
  1905. test_referint, test_retrocl, test_rootdn]
  1906. def test_all_plugins(inst, args=None):
  1907. for func in func_tests:
  1908. func(inst, args)
  1909. return