plugin_tests.py 90 KB

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