plugin_tests.py 90 KB

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