plugin_tests.py 92 KB

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