activeldap3 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. data/.gitignore +6 -0
  2. data/CHANGES +691 -0
  3. data/COPYING +340 -0
  4. data/LICENSE +58 -0
  5. data/README +154 -0
  6. data/Rakefile +121 -0
  7. data/TODO +32 -0
  8. data/activeldap3.gemspec +18 -0
  9. data/benchmark/bench-al.rb +263 -0
  10. data/benchmark/config.yaml.sample +5 -0
  11. data/examples/al-admin/README +182 -0
  12. data/examples/al-admin/Rakefile +16 -0
  13. data/examples/al-admin/app/controllers/account_controller.rb +60 -0
  14. data/examples/al-admin/app/controllers/application_controller.rb +46 -0
  15. data/examples/al-admin/app/controllers/attributes_controller.rb +17 -0
  16. data/examples/al-admin/app/controllers/directory_controller.rb +49 -0
  17. data/examples/al-admin/app/controllers/object_classes_controller.rb +17 -0
  18. data/examples/al-admin/app/controllers/syntaxes_controller.rb +17 -0
  19. data/examples/al-admin/app/controllers/users_controller.rb +66 -0
  20. data/examples/al-admin/app/controllers/welcome_controller.rb +12 -0
  21. data/examples/al-admin/app/helpers/account_helper.rb +2 -0
  22. data/examples/al-admin/app/helpers/application_helper.rb +46 -0
  23. data/examples/al-admin/app/helpers/attributes_helper.rb +15 -0
  24. data/examples/al-admin/app/helpers/directory_helper.rb +7 -0
  25. data/examples/al-admin/app/helpers/object_classes_helper.rb +10 -0
  26. data/examples/al-admin/app/helpers/syntaxes_helper.rb +10 -0
  27. data/examples/al-admin/app/helpers/url_helper.rb +17 -0
  28. data/examples/al-admin/app/helpers/users_helper.rb +17 -0
  29. data/examples/al-admin/app/helpers/welcome_helper.rb +2 -0
  30. data/examples/al-admin/app/models/entry.rb +23 -0
  31. data/examples/al-admin/app/models/ldap_user.rb +58 -0
  32. data/examples/al-admin/app/models/user.rb +91 -0
  33. data/examples/al-admin/app/views/_entry/_attributes_information.html.erb +29 -0
  34. data/examples/al-admin/app/views/_entry/_entry.html.erb +15 -0
  35. data/examples/al-admin/app/views/_schema/_aliases.html.erb +7 -0
  36. data/examples/al-admin/app/views/_switcher/_after.html.erb +2 -0
  37. data/examples/al-admin/app/views/_switcher/_before.html.erb +5 -0
  38. data/examples/al-admin/app/views/account/login.html.erb +26 -0
  39. data/examples/al-admin/app/views/account/sign_up.html.erb +29 -0
  40. data/examples/al-admin/app/views/attributes/_attributes.html.erb +19 -0
  41. data/examples/al-admin/app/views/attributes/_detail.html.erb +29 -0
  42. data/examples/al-admin/app/views/attributes/index.html.erb +3 -0
  43. data/examples/al-admin/app/views/attributes/show.html.erb +31 -0
  44. data/examples/al-admin/app/views/directory/_tree.html.erb +10 -0
  45. data/examples/al-admin/app/views/directory/_tree_view_js.html.erb +25 -0
  46. data/examples/al-admin/app/views/directory/index.html.erb +13 -0
  47. data/examples/al-admin/app/views/directory/populate.html.erb +2 -0
  48. data/examples/al-admin/app/views/layouts/_footer.html.erb +11 -0
  49. data/examples/al-admin/app/views/layouts/_header_menu.html.erb +10 -0
  50. data/examples/al-admin/app/views/layouts/_main_menu.html.erb +18 -0
  51. data/examples/al-admin/app/views/layouts/application.html.erb +57 -0
  52. data/examples/al-admin/app/views/object_classes/_attributes.html.erb +28 -0
  53. data/examples/al-admin/app/views/object_classes/_object_classes.html.erb +19 -0
  54. data/examples/al-admin/app/views/object_classes/index.html.erb +3 -0
  55. data/examples/al-admin/app/views/object_classes/show.html.erb +39 -0
  56. data/examples/al-admin/app/views/syntaxes/_detail.html.erb +14 -0
  57. data/examples/al-admin/app/views/syntaxes/_syntaxes.html.erb +19 -0
  58. data/examples/al-admin/app/views/syntaxes/index.html.erb +3 -0
  59. data/examples/al-admin/app/views/syntaxes/show.html.erb +22 -0
  60. data/examples/al-admin/app/views/users/_attributes_update_form.html.erb +42 -0
  61. data/examples/al-admin/app/views/users/_form.html.erb +13 -0
  62. data/examples/al-admin/app/views/users/_object_classes_update_form.html.erb +46 -0
  63. data/examples/al-admin/app/views/users/_password_change_form.html.erb +20 -0
  64. data/examples/al-admin/app/views/users/edit.html.erb +15 -0
  65. data/examples/al-admin/app/views/users/index.html.erb +10 -0
  66. data/examples/al-admin/app/views/users/show.html.erb +11 -0
  67. data/examples/al-admin/app/views/welcome/index.html.erb +13 -0
  68. data/examples/al-admin/config.ru +7 -0
  69. data/examples/al-admin/config/boot.rb +110 -0
  70. data/examples/al-admin/config/database.yml.example +19 -0
  71. data/examples/al-admin/config/environment.rb +73 -0
  72. data/examples/al-admin/config/environments/development.rb +17 -0
  73. data/examples/al-admin/config/environments/production.rb +24 -0
  74. data/examples/al-admin/config/environments/test.rb +22 -0
  75. data/examples/al-admin/config/initializers/exception_notifier.rb +2 -0
  76. data/examples/al-admin/config/initializers/fast_gettext.rb +3 -0
  77. data/examples/al-admin/config/initializers/inflections.rb +10 -0
  78. data/examples/al-admin/config/initializers/mime_types.rb +5 -0
  79. data/examples/al-admin/config/initializers/session_store.rb +23 -0
  80. data/examples/al-admin/config/ldap.yml.example +21 -0
  81. data/examples/al-admin/config/routes.rb +58 -0
  82. data/examples/al-admin/db/migrate/001_create_users.rb +16 -0
  83. data/examples/al-admin/doc/README_FOR_APP +2 -0
  84. data/examples/al-admin/lib/authenticated_system.rb +124 -0
  85. data/examples/al-admin/lib/authenticated_test_helper.rb +113 -0
  86. data/examples/al-admin/lib/ldap_test_helper.rb +38 -0
  87. data/examples/al-admin/lib/tasks/testing.rake +10 -0
  88. data/examples/al-admin/po/en/al-admin.po +343 -0
  89. data/examples/al-admin/po/ja/al-admin.po +343 -0
  90. data/examples/al-admin/po/nl/al-admin.po +380 -0
  91. data/examples/al-admin/public/.htaccess +40 -0
  92. data/examples/al-admin/public/404.html +30 -0
  93. data/examples/al-admin/public/500.html +30 -0
  94. data/examples/al-admin/public/dispatch.cgi +10 -0
  95. data/examples/al-admin/public/dispatch.fcgi +24 -0
  96. data/examples/al-admin/public/dispatch.rb +10 -0
  97. data/examples/al-admin/public/favicon.ico +0 -0
  98. data/examples/al-admin/public/images/active-ldap.svg +6351 -0
  99. data/examples/al-admin/public/images/al-admin.png +0 -0
  100. data/examples/al-admin/public/images/al-admin.svg +6371 -0
  101. data/examples/al-admin/public/images/header-background.png +0 -0
  102. data/examples/al-admin/public/images/header-background.svg +99 -0
  103. data/examples/al-admin/public/images/rails.png +0 -0
  104. data/examples/al-admin/public/images/spinelz/accordion_tab_left_active.gif +0 -0
  105. data/examples/al-admin/public/images/spinelz/accordion_tab_left_inactive.gif +0 -0
  106. data/examples/al-admin/public/images/spinelz/accordion_tab_middle_active.gif +0 -0
  107. data/examples/al-admin/public/images/spinelz/accordion_tab_middle_inactive.gif +0 -0
  108. data/examples/al-admin/public/images/spinelz/accordion_tab_right_active.gif +0 -0
  109. data/examples/al-admin/public/images/spinelz/accordion_tab_right_inactive.gif +0 -0
  110. data/examples/al-admin/public/images/spinelz/balloon_back.gif +0 -0
  111. data/examples/al-admin/public/images/spinelz/balloon_bottom_left.gif +0 -0
  112. data/examples/al-admin/public/images/spinelz/balloon_bottom_middle.gif +0 -0
  113. data/examples/al-admin/public/images/spinelz/balloon_bottom_right.gif +0 -0
  114. data/examples/al-admin/public/images/spinelz/balloon_left_down_arrow.gif +0 -0
  115. data/examples/al-admin/public/images/spinelz/balloon_left_up_arrow.gif +0 -0
  116. data/examples/al-admin/public/images/spinelz/balloon_middle_left.gif +0 -0
  117. data/examples/al-admin/public/images/spinelz/balloon_middle_right.gif +0 -0
  118. data/examples/al-admin/public/images/spinelz/balloon_right_down_arrow.gif +0 -0
  119. data/examples/al-admin/public/images/spinelz/balloon_right_up_arrow.gif +0 -0
  120. data/examples/al-admin/public/images/spinelz/balloon_top_left.gif +0 -0
  121. data/examples/al-admin/public/images/spinelz/balloon_top_middle.gif +0 -0
  122. data/examples/al-admin/public/images/spinelz/balloon_top_right.gif +0 -0
  123. data/examples/al-admin/public/images/spinelz/barchart_h.gif +0 -0
  124. data/examples/al-admin/public/images/spinelz/barchart_v.gif +0 -0
  125. data/examples/al-admin/public/images/spinelz/button.gif +0 -0
  126. data/examples/al-admin/public/images/spinelz/calendar_default_handler.gif +0 -0
  127. data/examples/al-admin/public/images/spinelz/calendar_delete.gif +0 -0
  128. data/examples/al-admin/public/images/spinelz/calendar_next.gif +0 -0
  129. data/examples/al-admin/public/images/spinelz/calendar_next_second.gif +0 -0
  130. data/examples/al-admin/public/images/spinelz/calendar_pre.gif +0 -0
  131. data/examples/al-admin/public/images/spinelz/calendar_pre_second.gif +0 -0
  132. data/examples/al-admin/public/images/spinelz/calendar_private_icon.gif +0 -0
  133. data/examples/al-admin/public/images/spinelz/calendar_schedule.gif +0 -0
  134. data/examples/al-admin/public/images/spinelz/calender_back.gif +0 -0
  135. data/examples/al-admin/public/images/spinelz/calender_back_second.gif +0 -0
  136. data/examples/al-admin/public/images/spinelz/datepicker2_back.gif +0 -0
  137. data/examples/al-admin/public/images/spinelz/datepicker2_back_second.gif +0 -0
  138. data/examples/al-admin/public/images/spinelz/datepicker2_next.gif +0 -0
  139. data/examples/al-admin/public/images/spinelz/datepicker2_next_second.gif +0 -0
  140. data/examples/al-admin/public/images/spinelz/datepicker2_pre.gif +0 -0
  141. data/examples/al-admin/public/images/spinelz/datepicker2_pre_second.gif +0 -0
  142. data/examples/al-admin/public/images/spinelz/datepicker_back.gif +0 -0
  143. data/examples/al-admin/public/images/spinelz/datepicker_back_second.gif +0 -0
  144. data/examples/al-admin/public/images/spinelz/datepicker_next.gif +0 -0
  145. data/examples/al-admin/public/images/spinelz/datepicker_next_second.gif +0 -0
  146. data/examples/al-admin/public/images/spinelz/datepicker_pre.gif +0 -0
  147. data/examples/al-admin/public/images/spinelz/datepicker_pre_second.gif +0 -0
  148. data/examples/al-admin/public/images/spinelz/grid_down.gif +0 -0
  149. data/examples/al-admin/public/images/spinelz/grid_state.gif +0 -0
  150. data/examples/al-admin/public/images/spinelz/grid_up.gif +0 -0
  151. data/examples/al-admin/public/images/spinelz/icon_day.gif +0 -0
  152. data/examples/al-admin/public/images/spinelz/icon_month.gif +0 -0
  153. data/examples/al-admin/public/images/spinelz/icon_week.gif +0 -0
  154. data/examples/al-admin/public/images/spinelz/menubar_back.gif +0 -0
  155. data/examples/al-admin/public/images/spinelz/menubar_subcontents_back.gif +0 -0
  156. data/examples/al-admin/public/images/spinelz/navPanel_tab_left_active.gif +0 -0
  157. data/examples/al-admin/public/images/spinelz/navPanel_tab_left_inactive.gif +0 -0
  158. data/examples/al-admin/public/images/spinelz/navPanel_tab_middle_active.gif +0 -0
  159. data/examples/al-admin/public/images/spinelz/navPanel_tab_middle_inactive.gif +0 -0
  160. data/examples/al-admin/public/images/spinelz/navPanel_tab_right_active.gif +0 -0
  161. data/examples/al-admin/public/images/spinelz/navPanel_tab_right_inactive.gif +0 -0
  162. data/examples/al-admin/public/images/spinelz/select_date.gif +0 -0
  163. data/examples/al-admin/public/images/spinelz/selectabletable_selected.gif +0 -0
  164. data/examples/al-admin/public/images/spinelz/sideBarBox_about.gif +0 -0
  165. data/examples/al-admin/public/images/spinelz/sideBarBox_menu.gif +0 -0
  166. data/examples/al-admin/public/images/spinelz/sideBarBox_sample.gif +0 -0
  167. data/examples/al-admin/public/images/spinelz/sideBarBox_tabBottomActive.gif +0 -0
  168. data/examples/al-admin/public/images/spinelz/sideBarBox_tabBottomInactive.gif +0 -0
  169. data/examples/al-admin/public/images/spinelz/sideBarBox_tabMiddleActive.gif +0 -0
  170. data/examples/al-admin/public/images/spinelz/sideBarBox_tabMiddleActive2.gif +0 -0
  171. data/examples/al-admin/public/images/spinelz/sideBarBox_tabMiddleInactive.gif +0 -0
  172. data/examples/al-admin/public/images/spinelz/sideBarBox_tabMiddleInactive2.gif +0 -0
  173. data/examples/al-admin/public/images/spinelz/sideBarBox_tabTopActive.gif +0 -0
  174. data/examples/al-admin/public/images/spinelz/sideBarBox_tabTopInactive.gif +0 -0
  175. data/examples/al-admin/public/images/spinelz/sideBarBox_tabbar.gif +0 -0
  176. data/examples/al-admin/public/images/spinelz/sortableTable_down.gif +0 -0
  177. data/examples/al-admin/public/images/spinelz/sortableTable_normal.gif +0 -0
  178. data/examples/al-admin/public/images/spinelz/sortableTable_up.gif +0 -0
  179. data/examples/al-admin/public/images/spinelz/switcher_close.gif +0 -0
  180. data/examples/al-admin/public/images/spinelz/switcher_open.gif +0 -0
  181. data/examples/al-admin/public/images/spinelz/tabBox_close.gif +0 -0
  182. data/examples/al-admin/public/images/spinelz/tabBox_tabLeftActive.gif +0 -0
  183. data/examples/al-admin/public/images/spinelz/tabBox_tabLeftInactive.gif +0 -0
  184. data/examples/al-admin/public/images/spinelz/tabBox_tabMiddleActive.gif +0 -0
  185. data/examples/al-admin/public/images/spinelz/tabBox_tabMiddleInactive.gif +0 -0
  186. data/examples/al-admin/public/images/spinelz/tabBox_tabRightActive.gif +0 -0
  187. data/examples/al-admin/public/images/spinelz/tabBox_tabRightInactive.gif +0 -0
  188. data/examples/al-admin/public/images/spinelz/tab_bar.gif +0 -0
  189. data/examples/al-admin/public/images/spinelz/table_back.gif +0 -0
  190. data/examples/al-admin/public/images/spinelz/timepicker_clock.gif +0 -0
  191. data/examples/al-admin/public/images/spinelz/toolbar_close.gif +0 -0
  192. data/examples/al-admin/public/images/spinelz/toolbar_left.gif +0 -0
  193. data/examples/al-admin/public/images/spinelz/toolbar_max.gif +0 -0
  194. data/examples/al-admin/public/images/spinelz/toolbar_middle.gif +0 -0
  195. data/examples/al-admin/public/images/spinelz/toolbar_min.gif +0 -0
  196. data/examples/al-admin/public/images/spinelz/toolbar_next.gif +0 -0
  197. data/examples/al-admin/public/images/spinelz/toolbar_right.gif +0 -0
  198. data/examples/al-admin/public/images/spinelz/treeview_dir.gif +0 -0
  199. data/examples/al-admin/public/images/spinelz/treeview_file.gif +0 -0
  200. data/examples/al-admin/public/images/spinelz/treeview_group.gif +0 -0
  201. data/examples/al-admin/public/images/spinelz/treeview_group_special.gif +0 -0
  202. data/examples/al-admin/public/images/spinelz/treeview_state.gif +0 -0
  203. data/examples/al-admin/public/images/spinelz/treeview_user.gif +0 -0
  204. data/examples/al-admin/public/images/spinelz/window_bottom_left.gif +0 -0
  205. data/examples/al-admin/public/images/spinelz/window_bottom_middle.gif +0 -0
  206. data/examples/al-admin/public/images/spinelz/window_bottom_right.gif +0 -0
  207. data/examples/al-admin/public/images/spinelz/window_close.gif +0 -0
  208. data/examples/al-admin/public/images/spinelz/window_max.gif +0 -0
  209. data/examples/al-admin/public/images/spinelz/window_middle_left.gif +0 -0
  210. data/examples/al-admin/public/images/spinelz/window_middle_right.gif +0 -0
  211. data/examples/al-admin/public/images/spinelz/window_min.gif +0 -0
  212. data/examples/al-admin/public/images/spinelz/window_top_left.gif +0 -0
  213. data/examples/al-admin/public/images/spinelz/window_top_middle.gif +0 -0
  214. data/examples/al-admin/public/images/spinelz/window_top_right.gif +0 -0
  215. data/examples/al-admin/public/javascripts/application.js +2 -0
  216. data/examples/al-admin/public/javascripts/controls.js +963 -0
  217. data/examples/al-admin/public/javascripts/dragdrop.js +973 -0
  218. data/examples/al-admin/public/javascripts/effects.js +1128 -0
  219. data/examples/al-admin/public/javascripts/prototype.js +4320 -0
  220. data/examples/al-admin/public/javascripts/spinelz/accordion.js +185 -0
  221. data/examples/al-admin/public/javascripts/spinelz/ajaxHistory.js +157 -0
  222. data/examples/al-admin/public/javascripts/spinelz/balloon.js +287 -0
  223. data/examples/al-admin/public/javascripts/spinelz/barchart.js +524 -0
  224. data/examples/al-admin/public/javascripts/spinelz/calendar.js +3012 -0
  225. data/examples/al-admin/public/javascripts/spinelz/colorpicker.js +128 -0
  226. data/examples/al-admin/public/javascripts/spinelz/datepicker.js +438 -0
  227. data/examples/al-admin/public/javascripts/spinelz/grid.js +1391 -0
  228. data/examples/al-admin/public/javascripts/spinelz/grid_resizeEx.js +100 -0
  229. data/examples/al-admin/public/javascripts/spinelz/grid_sortabletableEx.js +129 -0
  230. data/examples/al-admin/public/javascripts/spinelz/inplaceEditorEx.js +148 -0
  231. data/examples/al-admin/public/javascripts/spinelz/menubar.js +232 -0
  232. data/examples/al-admin/public/javascripts/spinelz/navPanel.js +170 -0
  233. data/examples/al-admin/public/javascripts/spinelz/selectableTable.js +433 -0
  234. data/examples/al-admin/public/javascripts/spinelz/sideBarBox.js +282 -0
  235. data/examples/al-admin/public/javascripts/spinelz/sideBarBox_effects.js +83 -0
  236. data/examples/al-admin/public/javascripts/spinelz/sortableTable.js +270 -0
  237. data/examples/al-admin/public/javascripts/spinelz/switcher.js +78 -0
  238. data/examples/al-admin/public/javascripts/spinelz/tabBox.js +469 -0
  239. data/examples/al-admin/public/javascripts/spinelz/timepicker.js +384 -0
  240. data/examples/al-admin/public/javascripts/spinelz/toolbar.js +152 -0
  241. data/examples/al-admin/public/javascripts/spinelz/treeview.js +703 -0
  242. data/examples/al-admin/public/javascripts/spinelz/window.js +641 -0
  243. data/examples/al-admin/public/javascripts/spinelz/window_resizeEx.js +130 -0
  244. data/examples/al-admin/public/javascripts/spinelz_lib/builder.js +131 -0
  245. data/examples/al-admin/public/javascripts/spinelz_lib/controls.js +835 -0
  246. data/examples/al-admin/public/javascripts/spinelz_lib/dragdrop.js +944 -0
  247. data/examples/al-admin/public/javascripts/spinelz_lib/effects.js +1090 -0
  248. data/examples/al-admin/public/javascripts/spinelz_lib/json.js +139 -0
  249. data/examples/al-admin/public/javascripts/spinelz_lib/prototype.js +2515 -0
  250. data/examples/al-admin/public/javascripts/spinelz_lib/resize.js +215 -0
  251. data/examples/al-admin/public/javascripts/spinelz_lib/scriptaculous.js +51 -0
  252. data/examples/al-admin/public/javascripts/spinelz_lib/slider.js +278 -0
  253. data/examples/al-admin/public/javascripts/spinelz_lib/spinelz_util.js +1266 -0
  254. data/examples/al-admin/public/javascripts/spinelz_lib/unittest.js +564 -0
  255. data/examples/al-admin/public/robots.txt +1 -0
  256. data/examples/al-admin/public/stylesheets/account.css +41 -0
  257. data/examples/al-admin/public/stylesheets/attributes.css +1 -0
  258. data/examples/al-admin/public/stylesheets/base.css +104 -0
  259. data/examples/al-admin/public/stylesheets/detail.css +36 -0
  260. data/examples/al-admin/public/stylesheets/directory.css +22 -0
  261. data/examples/al-admin/public/stylesheets/object-classes.css +6 -0
  262. data/examples/al-admin/public/stylesheets/rails.css +35 -0
  263. data/examples/al-admin/public/stylesheets/spinelz/accordion.css +59 -0
  264. data/examples/al-admin/public/stylesheets/spinelz/balloon.css +151 -0
  265. data/examples/al-admin/public/stylesheets/spinelz/calendar.css +564 -0
  266. data/examples/al-admin/public/stylesheets/spinelz/datepicker.css +175 -0
  267. data/examples/al-admin/public/stylesheets/spinelz/grid.css +137 -0
  268. data/examples/al-admin/public/stylesheets/spinelz/menubar.css +78 -0
  269. data/examples/al-admin/public/stylesheets/spinelz/modal.css +22 -0
  270. data/examples/al-admin/public/stylesheets/spinelz/navPanel.css +58 -0
  271. data/examples/al-admin/public/stylesheets/spinelz/selectableTable.css +28 -0
  272. data/examples/al-admin/public/stylesheets/spinelz/sideBarBox.css +82 -0
  273. data/examples/al-admin/public/stylesheets/spinelz/sortableTable.css +51 -0
  274. data/examples/al-admin/public/stylesheets/spinelz/switcher.css +23 -0
  275. data/examples/al-admin/public/stylesheets/spinelz/tabBox.css +94 -0
  276. data/examples/al-admin/public/stylesheets/spinelz/timepicker.css +508 -0
  277. data/examples/al-admin/public/stylesheets/spinelz/toolbar.css +82 -0
  278. data/examples/al-admin/public/stylesheets/spinelz/treeview.css +121 -0
  279. data/examples/al-admin/public/stylesheets/spinelz/window.css +140 -0
  280. data/examples/al-admin/public/stylesheets/structure.css +81 -0
  281. data/examples/al-admin/public/stylesheets/syntaxes.css +1 -0
  282. data/examples/al-admin/public/stylesheets/users.css +13 -0
  283. data/examples/al-admin/public/stylesheets/welcome.css +0 -0
  284. data/examples/al-admin/script/about +3 -0
  285. data/examples/al-admin/script/console +3 -0
  286. data/examples/al-admin/script/dbconsole +3 -0
  287. data/examples/al-admin/script/destroy +3 -0
  288. data/examples/al-admin/script/generate +3 -0
  289. data/examples/al-admin/script/performance/benchmarker +3 -0
  290. data/examples/al-admin/script/performance/profiler +3 -0
  291. data/examples/al-admin/script/performance/request +3 -0
  292. data/examples/al-admin/script/plugin +3 -0
  293. data/examples/al-admin/script/process/inspector +3 -0
  294. data/examples/al-admin/script/process/reaper +3 -0
  295. data/examples/al-admin/script/process/spawner +3 -0
  296. data/examples/al-admin/script/runner +3 -0
  297. data/examples/al-admin/script/server +3 -0
  298. data/examples/al-admin/test/fixtures/users.yml +9 -0
  299. data/examples/al-admin/test/functional/account_controller_test.rb +12 -0
  300. data/examples/al-admin/test/functional/attributes_controller_test.rb +8 -0
  301. data/examples/al-admin/test/functional/directory_controller_test.rb +8 -0
  302. data/examples/al-admin/test/functional/object_classes_controller_test.rb +8 -0
  303. data/examples/al-admin/test/functional/syntaxes_controller_test.rb +8 -0
  304. data/examples/al-admin/test/functional/users_controller_test.rb +8 -0
  305. data/examples/al-admin/test/functional/welcome_controller_test.rb +8 -0
  306. data/examples/al-admin/test/integration/sign_up_test.rb +44 -0
  307. data/examples/al-admin/test/run-test.sh +3 -0
  308. data/examples/al-admin/test/test_helper.rb +52 -0
  309. data/examples/al-admin/test/unit/user_test.rb +12 -0
  310. data/examples/al-admin/vendor/plugins/exception_notification/README +111 -0
  311. data/examples/al-admin/vendor/plugins/exception_notification/init.rb +1 -0
  312. data/examples/al-admin/vendor/plugins/exception_notification/lib/exception_notifiable.rb +99 -0
  313. data/examples/al-admin/vendor/plugins/exception_notification/lib/exception_notifier.rb +66 -0
  314. data/examples/al-admin/vendor/plugins/exception_notification/lib/exception_notifier_helper.rb +78 -0
  315. data/examples/al-admin/vendor/plugins/exception_notification/test/exception_notifier_helper_test.rb +61 -0
  316. data/examples/al-admin/vendor/plugins/exception_notification/test/test_helper.rb +7 -0
  317. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_backtrace.rhtml +1 -0
  318. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_environment.rhtml +7 -0
  319. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_inspect_model.rhtml +16 -0
  320. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_request.rhtml +4 -0
  321. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_session.rhtml +2 -0
  322. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/_title.rhtml +3 -0
  323. data/examples/al-admin/vendor/plugins/exception_notification/views/exception_notifier/exception_notification.rhtml +6 -0
  324. data/examples/config.yaml.example +5 -0
  325. data/examples/example.der +0 -0
  326. data/examples/example.jpg +0 -0
  327. data/examples/groupadd +41 -0
  328. data/examples/groupdel +35 -0
  329. data/examples/groupls +49 -0
  330. data/examples/groupmod +42 -0
  331. data/examples/lpasswd +55 -0
  332. data/examples/objects/group.rb +13 -0
  333. data/examples/objects/ou.rb +4 -0
  334. data/examples/objects/user.rb +20 -0
  335. data/examples/ouadd +38 -0
  336. data/examples/useradd +45 -0
  337. data/examples/useradd-binary +53 -0
  338. data/examples/userdel +34 -0
  339. data/examples/userls +50 -0
  340. data/examples/usermod +42 -0
  341. data/examples/usermod-binary-add +50 -0
  342. data/examples/usermod-binary-add-time +54 -0
  343. data/examples/usermod-binary-del +48 -0
  344. data/examples/usermod-lang-add +43 -0
  345. data/lib/active_ldap.rb +105 -0
  346. data/lib/active_ldap/action_controller/ldap_benchmarking.rb +55 -0
  347. data/lib/active_ldap/acts/tree.rb +75 -0
  348. data/lib/active_ldap/adapter/base.rb +705 -0
  349. data/lib/active_ldap/adapter/jndi.rb +184 -0
  350. data/lib/active_ldap/adapter/jndi_connection.rb +185 -0
  351. data/lib/active_ldap/adapter/ldap.rb +290 -0
  352. data/lib/active_ldap/adapter/ldap_ext.rb +105 -0
  353. data/lib/active_ldap/adapter/net_ldap.rb +309 -0
  354. data/lib/active_ldap/adapter/net_ldap_ext.rb +23 -0
  355. data/lib/active_ldap/association/belongs_to.rb +47 -0
  356. data/lib/active_ldap/association/belongs_to_many.rb +58 -0
  357. data/lib/active_ldap/association/children.rb +21 -0
  358. data/lib/active_ldap/association/collection.rb +105 -0
  359. data/lib/active_ldap/association/has_many.rb +31 -0
  360. data/lib/active_ldap/association/has_many_utils.rb +44 -0
  361. data/lib/active_ldap/association/has_many_wrap.rb +62 -0
  362. data/lib/active_ldap/association/proxy.rb +107 -0
  363. data/lib/active_ldap/associations.rb +202 -0
  364. data/lib/active_ldap/attributes.rb +184 -0
  365. data/lib/active_ldap/base.rb +1594 -0
  366. data/lib/active_ldap/callbacks.rb +52 -0
  367. data/lib/active_ldap/command.rb +49 -0
  368. data/lib/active_ldap/compatible.rb +44 -0
  369. data/lib/active_ldap/configuration.rb +147 -0
  370. data/lib/active_ldap/connection.rb +294 -0
  371. data/lib/active_ldap/distinguished_name.rb +291 -0
  372. data/lib/active_ldap/entry_attribute.rb +78 -0
  373. data/lib/active_ldap/escape.rb +12 -0
  374. data/lib/active_ldap/get_text.rb +9 -0
  375. data/lib/active_ldap/get_text/parser.rb +161 -0
  376. data/lib/active_ldap/get_text_fallback.rb +60 -0
  377. data/lib/active_ldap/get_text_support.rb +20 -0
  378. data/lib/active_ldap/helper.rb +92 -0
  379. data/lib/active_ldap/human_readable.rb +132 -0
  380. data/lib/active_ldap/ldap_error.rb +74 -0
  381. data/lib/active_ldap/ldif.rb +930 -0
  382. data/lib/active_ldap/object_class.rb +95 -0
  383. data/lib/active_ldap/operations.rb +610 -0
  384. data/lib/active_ldap/populate.rb +53 -0
  385. data/lib/active_ldap/railtie.rb +31 -0
  386. data/lib/active_ldap/schema.rb +699 -0
  387. data/lib/active_ldap/schema/syntaxes.rb +417 -0
  388. data/lib/active_ldap/timeout.rb +75 -0
  389. data/lib/active_ldap/timeout_stub.rb +17 -0
  390. data/lib/active_ldap/user_password.rb +92 -0
  391. data/lib/active_ldap/validations.rb +229 -0
  392. data/lib/active_ldap/xml.rb +122 -0
  393. data/po/en/active-ldap.po +4029 -0
  394. data/po/ja/active-ldap.po +4060 -0
  395. data/rails_generators/model_active_ldap/USAGE +17 -0
  396. data/rails_generators/model_active_ldap/model_active_ldap_generator.rb +69 -0
  397. data/rails_generators/model_active_ldap/templates/model_active_ldap.rb +3 -0
  398. data/rails_generators/model_active_ldap/templates/unit_test.rb +8 -0
  399. data/rails_generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb +7 -0
  400. data/rails_generators/scaffold_active_ldap/templates/ldap.yml +18 -0
  401. data/test/al-test-utils.rb +439 -0
  402. data/test/command.rb +112 -0
  403. data/test/config.yaml.sample +6 -0
  404. data/test/fixtures/lower_case_object_class_schema.rb +802 -0
  405. data/test/run-test.rb +44 -0
  406. data/test/test_acts_as_tree.rb +60 -0
  407. data/test/test_adapter.rb +121 -0
  408. data/test/test_associations.rb +664 -0
  409. data/test/test_attributes.rb +117 -0
  410. data/test/test_base.rb +1177 -0
  411. data/test/test_base_per_instance.rb +61 -0
  412. data/test/test_bind.rb +62 -0
  413. data/test/test_callback.rb +37 -0
  414. data/test/test_configuration.rb +40 -0
  415. data/test/test_connection.rb +82 -0
  416. data/test/test_connection_per_class.rb +112 -0
  417. data/test/test_connection_per_dn.rb +112 -0
  418. data/test/test_dn.rb +172 -0
  419. data/test/test_find.rb +176 -0
  420. data/test/test_groupadd.rb +50 -0
  421. data/test/test_groupdel.rb +46 -0
  422. data/test/test_groupls.rb +107 -0
  423. data/test/test_groupmod.rb +51 -0
  424. data/test/test_ldif.rb +1891 -0
  425. data/test/test_load.rb +133 -0
  426. data/test/test_lpasswd.rb +75 -0
  427. data/test/test_object_class.rb +74 -0
  428. data/test/test_reflection.rb +182 -0
  429. data/test/test_schema.rb +559 -0
  430. data/test/test_syntax.rb +383 -0
  431. data/test/test_user.rb +217 -0
  432. data/test/test_user_password.rb +101 -0
  433. data/test/test_useradd-binary.rb +62 -0
  434. data/test/test_useradd.rb +57 -0
  435. data/test/test_userdel.rb +48 -0
  436. data/test/test_userls.rb +91 -0
  437. data/test/test_usermod-binary-add-time.rb +65 -0
  438. data/test/test_usermod-binary-add.rb +64 -0
  439. data/test/test_usermod-binary-del.rb +66 -0
  440. data/test/test_usermod-lang-add.rb +60 -0
  441. data/test/test_usermod.rb +58 -0
  442. data/test/test_validation.rb +274 -0
  443. metadata +502 -0
@@ -0,0 +1,117 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'al-test-utils'
4
+
5
+ class TestAttributes < Test::Unit::TestCase
6
+ include AlTestUtils
7
+
8
+ priority :must
9
+
10
+ priority :normal
11
+ def test_to_real_attribute_name
12
+ user = @user_class.new("user")
13
+ assert_equal("objectClass",
14
+ user.__send__(:to_real_attribute_name, "objectclass"))
15
+ assert_equal("objectClass",
16
+ user.__send__(:to_real_attribute_name, "objectclass", true))
17
+ assert_nil(user.__send__(:to_real_attribute_name, "objectclass", false))
18
+ end
19
+
20
+ def test_protect_object_class_from_mass_assignment
21
+ classes = @user_class.required_classes + ["inetOrgPerson"]
22
+ user = @user_class.new(:uid => "XXX", :object_class => classes)
23
+ assert_equal(["inetOrgPerson"],
24
+ user.classes - @user_class.required_classes)
25
+
26
+ user = @user_class.new(:uid => "XXX", :object_class => ['inetOrgPerson'])
27
+ assert_equal(["inetOrgPerson"],
28
+ user.classes - @user_class.required_classes)
29
+
30
+ user = @user_class.new("XXX")
31
+ assert_equal([], user.classes - @user_class.required_classes)
32
+ user.attributes = {:object_class => classes}
33
+ assert_equal([], user.classes - @user_class.required_classes)
34
+ end
35
+
36
+ def test_normalize_attribute
37
+ assert_normalize_attribute(["usercertificate", [{"binary" => []}]],
38
+ "userCertificate",
39
+ [])
40
+ assert_normalize_attribute(["usercertificate", [{"binary" => []}]],
41
+ "userCertificate",
42
+ nil)
43
+ assert_normalize_attribute(["usercertificate",
44
+ [{"binary" => "BINARY DATA"}]],
45
+ "userCertificate",
46
+ "BINARY DATA")
47
+ assert_normalize_attribute(["usercertificate",
48
+ [{"binary" => ["BINARY DATA"]}]],
49
+ "userCertificate",
50
+ {"binary" => ["BINARY DATA"]})
51
+ end
52
+
53
+ def test_unnormalize_attribute
54
+ assert_unnormalize_attribute({"sn" => ["Surname"]},
55
+ "sn",
56
+ ["Surname"])
57
+ assert_unnormalize_attribute({"userCertificate;binary" => []},
58
+ "userCertificate",
59
+ [{"binary" => []}])
60
+ assert_unnormalize_attribute({"userCertificate;binary" => ["BINARY DATA"]},
61
+ "userCertificate",
62
+ [{"binary" => ["BINARY DATA"]}])
63
+ assert_unnormalize_attribute({
64
+ "sn" => ["Yamada"],
65
+ "sn;lang-ja" => ["山田"],
66
+ "sn;lang-ja;phonetic" => ["やまだ"]
67
+ },
68
+ "sn",
69
+ ["Yamada",
70
+ {"lang-ja" => ["山田",
71
+ {"phonetic" => ["やまだ"]}]}])
72
+ end
73
+
74
+ def test_attr_protected
75
+ user = @user_class.new(:uid => "XXX")
76
+ assert_equal("XXX", user.uid)
77
+ user.attributes = {:uid => "ZZZ"}
78
+ assert_equal("XXX", user.uid)
79
+
80
+ user = @user_class.new(:sn => "ZZZ")
81
+ assert_equal("ZZZ", user.sn)
82
+
83
+ user = @user_class.new(:uid => "XXX", :sn => "ZZZ")
84
+ assert_equal("XXX", user.uid)
85
+ assert_equal("ZZZ", user.sn)
86
+
87
+ @user_class.attr_protected :sn
88
+ user = @user_class.new(:sn => "ZZZ")
89
+ assert_nil(user.sn)
90
+
91
+ sub_user_class = Class.new(@user_class)
92
+ sub_user_class.ldap_mapping :dn_attribute => "uid"
93
+ user = sub_user_class.new(:uid => "XXX", :sn => "ZZZ")
94
+ assert_equal("XXX", user.uid)
95
+ assert_nil(user.sn)
96
+
97
+ sub_user_class.attr_protected :cn
98
+ user = sub_user_class.new(:uid => "XXX", :sn => "ZZZ", :cn => "Common Name")
99
+ assert_equal("XXX", user.uid)
100
+ assert_nil(user.sn)
101
+ assert_nil(user.cn)
102
+
103
+ user = @user_class.new(:uid => "XXX", :sn => "ZZZ", :cn => "Common Name")
104
+ assert_equal("XXX", user.uid)
105
+ assert_nil(user.sn)
106
+ assert_equal("Common Name", user.cn)
107
+ end
108
+
109
+ private
110
+ def assert_normalize_attribute(expected, name, value)
111
+ assert_equal(expected, ActiveLdap::Base.normalize_attribute(name, value))
112
+ end
113
+
114
+ def assert_unnormalize_attribute(expected, name, value)
115
+ assert_equal(expected, ActiveLdap::Base.unnormalize_attribute(name, value))
116
+ end
117
+ end
@@ -0,0 +1,1177 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'al-test-utils'
4
+
5
+ class TestBase < Test::Unit::TestCase
6
+ include AlTestUtils
7
+
8
+ priority :must
9
+ def test_search_colon_value
10
+ make_temporary_group(:cn => "temp:group") do |group|
11
+ assert_equal("temp:group", group.cn)
12
+ assert_not_nil(@group_class.find("temp:group"))
13
+ end
14
+ end
15
+
16
+ priority :normal
17
+ def test_lower_case_object_class
18
+ fixture_file = fixture("lower_case_object_class_schema.rb")
19
+ schema_entries = eval(File.read(fixture_file))
20
+ schema = ActiveLdap::Schema.new(schema_entries)
21
+ target_class = Class.new(ActiveLdap::Base) do
22
+ ldap_mapping :dn_attribute => "umpn",
23
+ :prefix => "cn=site",
24
+ :classes => ['top', 'umphone', 'umphonenumber']
25
+ end
26
+ target_class.connection.instance_variable_set("@schema", schema)
27
+ target_class.connection.instance_variable_set("@entry_attributes", {})
28
+ target = target_class.send(:instantiate,
29
+ [
30
+ "umpn=1.555.5551234,#{target_class.base}",
31
+ {
32
+ "umpn" => "1.555.5551234",
33
+ "objectclass" => ["top",
34
+ "umphone",
35
+ "umphonenumber"],
36
+ }
37
+ ])
38
+ assert_equal("1.555.5551234", target.umpn)
39
+ end
40
+
41
+ def test_set_and_get_false
42
+ user = @user_class.new
43
+ user.sn = false
44
+ assert_equal(false, user.sn)
45
+ end
46
+
47
+ def test_modify_entry_with_attribute_with_nested_options
48
+ make_temporary_user(:simple => true) do |user,|
49
+ user.sn = ["Yamada",
50
+ {"lang-ja" => ["山田",
51
+ {"phonetic" => ["やまだ"]}]}]
52
+ assert_nothing_raised do
53
+ user.save!
54
+ end
55
+ end
56
+ end
57
+
58
+ def test_add_entry_with_attribute_with_nested_options
59
+ ensure_delete_user("temp-user") do |uid,|
60
+ user = @user_class.new
61
+ user.cn = uid
62
+ user.uid = uid
63
+ user.uid_number = 1000
64
+ user.gid_number = 1000
65
+ user.home_directory = "/home/#{uid}"
66
+
67
+ assert_not_predicate(user, :valid?)
68
+ user.sn = ["Yamada",
69
+ {"lang-ja" => ["山田",
70
+ {"phonetic" => ["やまだ"]}]}]
71
+ assert_predicate(user, :valid?)
72
+ assert_nothing_raised do
73
+ user.save!
74
+ end
75
+ end
76
+ end
77
+
78
+ def test_not_rename_by_mass_update
79
+ make_temporary_user(:simple => true) do |user,|
80
+ original_id = user.id
81
+ assert_true(user.update_attributes(:id => "user2"))
82
+ assert_equal(original_id, user.id)
83
+ end
84
+ end
85
+
86
+ def test_attributes
87
+ make_temporary_group do |group|
88
+ assert_equal({
89
+ "cn" => group.cn,
90
+ "gidNumber" => group.gidNumber,
91
+ "objectClass" => group.classes,
92
+ },
93
+ group.attributes)
94
+ end
95
+ end
96
+
97
+ def test_rename_with_superior
98
+ make_ou("sub,ou=users")
99
+ make_temporary_user(:simple => true) do |user,|
100
+ user.id = "user2,ou=sub,#{@user_class.base}"
101
+ case user.connection.class.to_s.demodulize
102
+ when "Jndi"
103
+ assert_true(user.save)
104
+
105
+ found_user = nil
106
+ assert_nothing_raised do
107
+ found_user = @user_class.find("user2")
108
+ end
109
+ base = @user_class.base
110
+ assert_equal("#{@user_class.dn_attribute}=user2,ou=sub,#{base}",
111
+ found_user.dn.to_s)
112
+ else
113
+ assert_raise(ActiveLdap::NotImplemented) do
114
+ user.save
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ def test_rename
121
+ make_temporary_user(:simple => true) do |user,|
122
+ assert_not_equal("user2", user.id)
123
+ assert_raise(ActiveLdap::EntryNotFound) do
124
+ @user_class.find("user2")
125
+ end
126
+ user.id = "user2"
127
+ assert_true(user.save)
128
+ assert_equal("user2", user.id)
129
+
130
+ found_user = nil
131
+ assert_nothing_raised do
132
+ found_user = @user_class.find("user2")
133
+ end
134
+ assert_equal("user2", found_user.id)
135
+ end
136
+ end
137
+
138
+ def test_operational_attributes
139
+ make_temporary_group do |group|
140
+ dn, attributes = @group_class.search(:attributes => ["*"])[0]
141
+ normal_attributes = attributes.keys
142
+ dn, attributes = @group_class.search(:attributes => ["*", "+"])[0]
143
+ operational_attributes = attributes.keys - normal_attributes
144
+ operational_attribute = operational_attributes[0]
145
+
146
+ group = @group_class.find(:first, :attributes => ["*", "+"])
147
+ operational_attribute_value = group[operational_attribute]
148
+ assert_not_nil(operational_attribute_value)
149
+ group.save!
150
+ assert_equal(operational_attribute_value, group[operational_attribute])
151
+ end
152
+ end
153
+
154
+ def test_destroy_mixed_tree_by_instance
155
+ make_ou("base")
156
+ _entry_class = entry_class("ou=base")
157
+ _ou_class = ou_class("ou=base")
158
+ _dc_class = dc_class("ou=base")
159
+
160
+ root1 = _ou_class.create("root1")
161
+ child1 = _ou_class.create(:ou => "child1", :parent => root1)
162
+ child2 = _ou_class.create(:ou => "child2", :parent => root1)
163
+ domain = _dc_class.create(:dc => "domain", :o => "domain", :parent => root1)
164
+ child3 = _ou_class.create(:ou => "child3", :parent => root1)
165
+ root2 = _ou_class.create("root2")
166
+ assert_equal(["base",
167
+ "root1", "child1", "child2", "domain", "child3",
168
+ "root2"],
169
+ _entry_class.find(:all).collect(&:id))
170
+ assert_raise(ActiveLdap::DeleteError) do
171
+ root1.destroy_all
172
+ end
173
+ assert_equal(["base", "root1", "domain", "root2"],
174
+ _entry_class.find(:all).collect(&:id))
175
+ end
176
+
177
+ def test_delete_mixed_tree_by_instance
178
+ make_ou("base")
179
+ _entry_class = entry_class("ou=base")
180
+ _ou_class = ou_class("ou=base")
181
+ _dc_class = dc_class("ou=base")
182
+
183
+ root1 = _ou_class.create("root1")
184
+ child1 = _ou_class.create(:ou => "child1", :parent => root1)
185
+ child2 = _ou_class.create(:ou => "child2", :parent => root1)
186
+ domain = _dc_class.create(:dc => "domain", :o => "domain", :parent => root1)
187
+ child3 = _ou_class.create(:ou => "child3", :parent => root1)
188
+ root2 = _ou_class.create("root2")
189
+ assert_equal(["base",
190
+ "root1", "child1", "child2", "domain", "child3",
191
+ "root2"],
192
+ _entry_class.find(:all).collect(&:id))
193
+ assert_raise(ActiveLdap::DeleteError) do
194
+ root1.delete_all
195
+ end
196
+ assert_equal(["base", "root1", "domain", "root2"],
197
+ _entry_class.find(:all).collect(&:id))
198
+ end
199
+
200
+ def test_delete_tree
201
+ make_ou("base")
202
+ _ou_class = ou_class("ou=base")
203
+ root1 = _ou_class.create("root1")
204
+ child1 = _ou_class.create(:ou => "child1", :parent => root1)
205
+ child2 = _ou_class.create(:ou => "child2", :parent => root1)
206
+ root2 = _ou_class.create("root2")
207
+ assert_equal(["base", "root1", "child1", "child2", "root2"],
208
+ _ou_class.find(:all).collect(&:ou))
209
+ _ou_class.delete_all(:base => root1.dn)
210
+ assert_equal(["base", "root2"],
211
+ _ou_class.find(:all).collect(&:ou))
212
+ end
213
+
214
+ def test_delete_mixed_tree
215
+ make_ou("base")
216
+ _ou_class = ou_class("ou=base")
217
+ domain_class = Class.new(ActiveLdap::Base)
218
+ domain_class.ldap_mapping :dn_attribute => "dc",
219
+ :prefix => "",
220
+ :classes => ['domain']
221
+
222
+ root1 = _ou_class.create("root1")
223
+ child1 = _ou_class.create(:ou => "child1", :parent => root1)
224
+ domain1 = domain_class.create(:dc => "domain1", :parent => child1)
225
+ grandchild1 = _ou_class.create(:ou => "grandchild1", :parent => child1)
226
+ child2 = _ou_class.create(:ou => "child2", :parent => root1)
227
+ domain2 = domain_class.create(:dc => "domain2", :parent => child2)
228
+ root2 = _ou_class.create("root2")
229
+
230
+ entry_class = Class.new(ActiveLdap::Base)
231
+ entry_class.ldap_mapping :prefix => "ou=base",
232
+ :classes => ["top"]
233
+ entry_class.dn_attribute = nil
234
+ assert_equal(["base", "root1", "child1", "domain1", "grandchild1",
235
+ "child2", "domain2", "root2"],
236
+ entry_class.find(:all).collect(&:id))
237
+ entry_class.delete_all(nil, :base => child2.dn)
238
+ assert_equal(["base", "root1", "child1", "domain1", "grandchild1", "root2"],
239
+ entry_class.find(:all).collect(&:id))
240
+ end
241
+
242
+ def test_first
243
+ make_temporary_user(:simple => true) do |user1,|
244
+ make_temporary_user(:simple => true) do |user2,|
245
+ assert_equal(user1, @user_class.find(:first))
246
+ assert_equal(user2, @user_class.find(:first, user2.cn))
247
+ end
248
+ end
249
+ end
250
+
251
+ def test_last
252
+ make_temporary_user(:simple => true) do |user1,|
253
+ make_temporary_user(:simple => true) do |user2,|
254
+ assert_equal(user2, @user_class.find(:last))
255
+ assert_equal(user1, @user_class.find(:last, user1.cn))
256
+ end
257
+ end
258
+ end
259
+
260
+ def test_convenient_operation_methods
261
+ make_temporary_user(:simple => true) do |user1,|
262
+ make_temporary_user(:simple => true) do |user2,|
263
+ assert_equal(user1, @user_class.first)
264
+ assert_equal(user2, @user_class.last)
265
+ assert_equal([user1, user2], @user_class.all)
266
+ end
267
+ end
268
+ end
269
+
270
+ def test_set_attributes_with_a_blank_value_in_values
271
+ make_temporary_user(:simple => true) do |user,|
272
+ user.attributes = {"description" => ["a", "b", ""]}
273
+ assert(user.save)
274
+ end
275
+ end
276
+
277
+ def test_set_attributes_with_a_blank_value
278
+ make_temporary_user(:simple => true) do |user,|
279
+ user.attributes = {"description" => [""]}
280
+ assert(user.save)
281
+ end
282
+ end
283
+
284
+ def test_create_invalid
285
+ user = @user_class.create
286
+ assert_not_predicate(user.errors, :empty?)
287
+ end
288
+
289
+ def test_id_with_invalid_dn_attribute_value
290
+ user = @user_class.new("#")
291
+ assert_equal("#", user.uid)
292
+ assert_equal("#", user.id)
293
+ end
294
+
295
+ def test_non_string_dn_attribute_value
296
+ user = @user_class.new("uidNumber=10110")
297
+ user.uid = user.cn = user.sn = "test-user"
298
+ user.gid_number = 10000
299
+ user.home_directory = "/home/test-user"
300
+ assert_nothing_raised do
301
+ user.save!
302
+ end
303
+ end
304
+
305
+ def test_set_dn_with_unnormalized_dn_attribute
306
+ make_temporary_user do |user,|
307
+ assert_not_equal("ZZZ", user.cn)
308
+ user.dn = "CN=ZZZ"
309
+ assert_equal("ZZZ", user.cn)
310
+ end
311
+ end
312
+
313
+ def test_destroy_with_empty_base_and_prefix_of_class
314
+ make_temporary_user do |user,|
315
+ base = user.class.base
316
+ prefix = user.class.prefix
317
+ begin
318
+ user.class.base = ""
319
+ user.class.prefix = ""
320
+ user.base = base
321
+ user.destroy
322
+ ensure
323
+ user.class.base = base
324
+ user.class.prefix = prefix
325
+ end
326
+ end
327
+ end
328
+
329
+ def test_empty_base_of_class
330
+ make_temporary_user do |user,|
331
+ user.class.prefix = ""
332
+ user.class.base = ""
333
+ user.base = "dc=net"
334
+ assert_equal("dc=net", user.base)
335
+ end
336
+ end
337
+
338
+ def test_search_value_with_no_dn_attribute
339
+ make_temporary_user do |user1,|
340
+ make_temporary_user do |user2,|
341
+ options = {:attribute => "seeAlso", :value => user2.dn}
342
+ assert_equal([],
343
+ user1.class.find(:all, options).collect(&:dn))
344
+
345
+ user1.see_also = user2.dn
346
+ user1.save!
347
+
348
+ assert_equal([user1.dn],
349
+ user1.class.find(:all, options).collect(&:dn))
350
+ end
351
+ end
352
+ end
353
+
354
+ def test_to_s
355
+ make_temporary_group do |group|
356
+ assert_equal(group.to_s, group.to_ldif)
357
+ end
358
+ end
359
+
360
+ def test_to_ldif
361
+ make_temporary_group do |group|
362
+ assert_to_ldif(group)
363
+
364
+ group.gidNumber += 1
365
+ group.description = ["Description", {"en" => "Description(en)"}]
366
+ assert_to_ldif(group)
367
+ end
368
+ end
369
+
370
+ def test_save_with_changes
371
+ make_temporary_user do |user, password|
372
+ user.cn += "!!!"
373
+ assert_true(detect_modify(user) {user.save})
374
+ end
375
+ end
376
+
377
+ def test_save_without_changes
378
+ make_temporary_user do |user, password|
379
+ assert_false(detect_modify(user) {user.save})
380
+ end
381
+ end
382
+
383
+ def test_normalize_dn_attribute
384
+ make_ou("Ous")
385
+ ou_class = Class.new(ActiveLdap::Base)
386
+ ou_class.ldap_mapping(:dn_attribute => "OU",
387
+ :prefix => "ou=OUS",
388
+ :classes => ["top", "organizationalUnit"])
389
+ ou_class.new("ou1").save!
390
+ ou_class.new("ou2").save!
391
+
392
+ ou1 = ou_class.find("ou1")
393
+ assert_equal("ou1", ou1.ou)
394
+ assert_equal("ou=ou1,#{ou_class.base}", ou1.dn)
395
+ ou2 = ou_class.find("ou2")
396
+ assert_equal("ou2", ou2.ou)
397
+ assert_equal("ou=ou2,#{ou_class.base}", ou2.dn)
398
+ end
399
+
400
+ def test_excluded_classes
401
+ mapping = {:classes => ["person"]}
402
+ person_class = Class.new(@user_class)
403
+ person_class.ldap_mapping(mapping)
404
+ person_class.prefix = nil
405
+
406
+ no_organizational_person_class = Class.new(@user_class)
407
+ no_organizational_person_mapping =
408
+ mapping.merge(:excluded_classes => ["organizationalPerson"])
409
+ no_organizational_person_class.ldap_mapping(no_organizational_person_mapping)
410
+ no_organizational_person_class.prefix = nil
411
+
412
+ no_simple_person_class = Class.new(@user_class)
413
+ no_simple_person_mapping =
414
+ mapping.merge(:excluded_classes => ['shadowAccount', 'inetOrgPerson',
415
+ "organizationalPerson"])
416
+ no_simple_person_class.ldap_mapping(no_simple_person_mapping)
417
+ no_simple_person_class.prefix = nil
418
+
419
+ make_temporary_user do |user1,|
420
+ make_temporary_user(:simple => true) do |user2,|
421
+ assert_equal([user1.dn, user2.dn].sort,
422
+ person_class.find(:all).collect(&:dn).sort)
423
+
424
+ no_organizational_people = no_organizational_person_class.find(:all)
425
+ assert_equal([user2.dn].sort,
426
+ no_organizational_people.collect(&:dn).sort)
427
+
428
+ assert_equal([user2.dn].sort,
429
+ no_simple_person_class.find(:all).collect(&:dn).sort)
430
+ end
431
+ end
432
+ end
433
+
434
+ def test_new_with_dn
435
+ cn = "XXX"
436
+ dn = "cn=#{cn},#{@user_class.base}"
437
+ user = @user_class.new(ActiveLdap::DN.parse(dn))
438
+ assert_equal(cn, user.cn)
439
+ assert_equal(dn, user.dn)
440
+ end
441
+
442
+ def test_dn_attribute_per_instance_with_invalid_value
443
+ user = @user_class.new
444
+ assert_equal("uid", user.dn_attribute)
445
+
446
+ user.dn = nil
447
+ assert_equal("uid", user.dn_attribute)
448
+ assert_nil(user.uid)
449
+
450
+ user.dn = ""
451
+ assert_equal("uid", user.dn_attribute)
452
+ assert_nil(user.uid)
453
+ end
454
+
455
+ def test_dn_attribute_per_instance
456
+ user = @user_class.new
457
+ assert_equal("uid", user.dn_attribute)
458
+ assert_nil(user.uid)
459
+
460
+ user.dn = "cn=xxx"
461
+ assert_equal("cn", user.dn_attribute)
462
+ assert_nil(user.uid)
463
+ assert_equal("xxx", user.cn)
464
+ assert_equal("cn=xxx,#{@user_class.base}", user.dn)
465
+
466
+ assert_equal("uid", @user_class.new.dn_attribute)
467
+
468
+ user.dn = "ZZZ"
469
+ assert_equal("cn", user.dn_attribute)
470
+ assert_nil(user.uid)
471
+ assert_equal("ZZZ", user.cn)
472
+ assert_equal("cn=ZZZ,#{@user_class.base}", user.dn)
473
+
474
+ user.dn = "uid=aaa"
475
+ assert_equal("uid", user.dn_attribute)
476
+ assert_equal("aaa", user.uid)
477
+ assert_equal("ZZZ", user.cn)
478
+ assert_equal("uid=aaa,#{@user_class.base}", user.dn)
479
+ end
480
+
481
+ def test_case_insensitive_nested_ou
482
+ ou_class("ou=Users").new("Sub").save!
483
+ make_temporary_user(:uid => "test-user,ou=SUB") do |user, password|
484
+ sub_user_class = Class.new(@user_class)
485
+ sub_user_class.ldap_mapping :prefix => "ou=sub"
486
+ assert_equal(dn("uid=test-user,ou=sub,#{@user_class.base}"),
487
+ sub_user_class.find(user.uid).dn)
488
+ end
489
+ end
490
+
491
+ def test_nested_ou
492
+ make_ou("units")
493
+ units = ou_class("ou=units")
494
+ units.new("one").save!
495
+ units.new("two").save!
496
+ units.new("three").save!
497
+
498
+ ous = units.find(:all, :scope => :sub).collect {|unit| unit.ou}
499
+ assert_equal(["one", "two", "three", "units"].sort, ous.sort)
500
+
501
+ ous = units.find(:all, :scope => :base).collect {|unit| unit.ou}
502
+ assert_equal(["units"].sort, ous.sort)
503
+
504
+ ous = units.find(:all, :scope => :one).collect {|unit| unit.ou}
505
+ assert_equal(["one", "two", "three"].sort, ous.sort)
506
+ end
507
+
508
+ def test_initialize_with_recommended_classes
509
+ mapping = {
510
+ :dn_attribute => "cn",
511
+ :prefix => "",
512
+ :scope => :one,
513
+ :classes => ["person"],
514
+ }
515
+ person_class = Class.new(ActiveLdap::Base)
516
+ person_class.ldap_mapping mapping
517
+
518
+ person_with_uid_class = Class.new(ActiveLdap::Base)
519
+ person_with_uid_mapping =
520
+ mapping.merge(:recommended_classes => ["uidObject"])
521
+ person_with_uid_class.ldap_mapping person_with_uid_mapping
522
+
523
+ name = "sample"
524
+ name_with_uid = "sample-with-uid"
525
+ uid = "1000"
526
+
527
+ person = person_class.new(name)
528
+ person.sn = name
529
+ assert(person.save)
530
+ assert_equal([name, name], [person.cn, person.sn])
531
+
532
+ person_with_uid = person_with_uid_class.new(name_with_uid)
533
+ person_with_uid.sn = name_with_uid
534
+ assert(!person_with_uid.save)
535
+ person_with_uid.uid = uid
536
+ assert(person_with_uid.save)
537
+ assert_equal([name_with_uid, name_with_uid],
538
+ [person_with_uid.cn, person_with_uid.sn])
539
+ assert_equal(uid, person_with_uid.uid)
540
+
541
+ assert_equal([person.dn, person_with_uid.dn],
542
+ person_class.search.collect {|dn, attrs| dn})
543
+ person_class.required_classes += ["uidObject"]
544
+ assert_equal([person_with_uid.dn],
545
+ person_class.search.collect {|dn, attrs| dn})
546
+
547
+ assert_equal([person.dn, person_with_uid.dn],
548
+ person_with_uid_class.search.collect {|dn, attrs| dn})
549
+ end
550
+
551
+ def test_search_with_object_class
552
+ ou_class = Class.new(ActiveLdap::Base)
553
+ ou_class.ldap_mapping :dn_attribute => "ou",
554
+ :prefix => "",
555
+ :scope => :one,
556
+ :classes => ["organizationalUnit"]
557
+
558
+ name = "sample"
559
+ ou = ou_class.new(name)
560
+ assert(ou.save)
561
+ assert_equal(name, ou.ou)
562
+
563
+ assert_equal([ou.dn],
564
+ ou_class.search(:value => name).collect {|dn, attrs| dn})
565
+ ou_class.required_classes += ["organization"]
566
+ assert_equal([],
567
+ ou_class.search(:value => name).collect {|dn, attrs| dn})
568
+ end
569
+
570
+ def test_search_with_attributes_without_object_class
571
+ make_temporary_user do |user, password|
572
+ entries = @user_class.search(:filter => "#{user.dn_attribute}=#{user.id}",
573
+ :attributes => ["uidNumber"])
574
+ assert_equal([[user.dn, {"uidNumber" => [user.uid_number.to_s]}]],
575
+ entries)
576
+ end
577
+ end
578
+
579
+ def test_new_without_argument
580
+ user = @user_class.new
581
+ assert_equal(@user_class_classes, user.classes)
582
+ assert(user.respond_to?(:cn))
583
+ end
584
+
585
+ def test_new_with_invalid_argument
586
+ user = @user_class.new
587
+ assert_raises(ArgumentError) do
588
+ @user_class.new(100)
589
+ end
590
+ end
591
+
592
+ def test_loose_dn
593
+ make_temporary_user do |user,|
594
+ assert(user.class.exists?(user.dn.to_s))
595
+ assert(user.class.exists?(user.dn.to_s.gsub(/\b,/, " , ")))
596
+ assert(user.class.exists?(user.dn.to_s.gsub(/\b=/, " = ")))
597
+ end
598
+ end
599
+
600
+ def test_new_without_class
601
+ no_class_class = Class.new(ActiveLdap::Base)
602
+ no_class_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
603
+ :classes => []
604
+ assert_raises(ActiveLdap::UnknownAttribute) do
605
+ no_class_class.new("xxx")
606
+ end
607
+ end
608
+
609
+ def test_save_for_dNSDomain
610
+ domain_class = Class.new(ActiveLdap::Base)
611
+ domain_class.ldap_mapping :dn_attribute => "dc", :prefix => "",
612
+ :classes => ['top', 'dcObject', 'dNSDomain']
613
+ name = "ftp"
614
+ a_record = "192.168.1.1"
615
+
616
+ domain = domain_class.new('ftp')
617
+ domain.a_record = a_record
618
+ assert(domain.save)
619
+ assert_equal(a_record, domain.a_record)
620
+ assert_equal(a_record, domain_class.find(name).a_record)
621
+ ensure
622
+ domain_class.delete(name) if domain_class.exists?(name)
623
+ end
624
+
625
+ def test_dn_by_index_getter
626
+ make_temporary_user do |user,|
627
+ assert_equal(user.dn, user["dn"])
628
+ end
629
+ end
630
+
631
+ def test_create_multiple
632
+ ensure_delete_user("temp-user1") do |uid1,|
633
+ ensure_delete_user("temp-user2") do |uid2,|
634
+ attributes = {
635
+ :uid => uid2,
636
+ :sn => uid2,
637
+ :cn => uid2,
638
+ :uid_number => "1000",
639
+ :gid_number => "1000",
640
+ :home_directory => "/home/#{uid2}",
641
+ }
642
+
643
+ user1, user2 = @user_class.create([{:uid => uid1}, attributes])
644
+ assert(!user1.errors.empty?)
645
+ assert(!@user_class.exists?(uid1))
646
+
647
+ assert_equal([], user2.errors.to_a)
648
+ assert(@user_class.exists?(uid2))
649
+ attributes.each do |key, value|
650
+ value = value.to_i if [:uid_number, :gid_number].include?(key)
651
+ assert_equal(value, user2[key])
652
+ end
653
+ end
654
+ end
655
+ end
656
+
657
+ def test_create
658
+ ensure_delete_user("temp-user") do |uid,|
659
+ user = @user_class.create(:uid => uid)
660
+ assert(!user.errors.empty?)
661
+ assert(!@user_class.exists?(uid))
662
+
663
+ attributes = {
664
+ :uid => uid,
665
+ :sn => uid,
666
+ :cn => uid,
667
+ :uid_number => "1000",
668
+ :gid_number => "1000",
669
+ :home_directory => "/home/#{uid}",
670
+ }
671
+ user = @user_class.create(attributes)
672
+ assert_equal([], user.errors.to_a)
673
+ assert(@user_class.exists?(uid))
674
+ attributes.each do |key, value|
675
+ value = value.to_i if [:uid_number, :gid_number].include?(key)
676
+ assert_equal(value, user[key])
677
+ end
678
+ end
679
+ end
680
+
681
+ def test_reload_of_not_exists_entry
682
+ make_temporary_user do |user,|
683
+ assert_nothing_raised do
684
+ user.reload
685
+ end
686
+
687
+ user.destroy
688
+
689
+ assert_raises(ActiveLdap::EntryNotFound) do
690
+ user.reload
691
+ end
692
+ end
693
+ end
694
+
695
+ def test_reload_and_new_entry
696
+ make_temporary_user do |user1,|
697
+ user2 = @user_class.new(user1.uid)
698
+ assert_equal(user1.attributes["uid"], user2.attributes["uid"])
699
+ assert_not_equal(user1.attributes["objectClass"],
700
+ @user_class.required_classes)
701
+ assert_equal(@user_class.required_classes,
702
+ user2.attributes["objectClass"])
703
+ assert_not_equal(user1.attributes["objectClass"],
704
+ user2.attributes["objectClass"])
705
+ assert(user2.exists?)
706
+ assert(user2.new_entry?)
707
+
708
+ user2.reload
709
+ assert(user2.exists?)
710
+ assert(!user2.new_entry?)
711
+ assert_equal(user1.attributes, user2.attributes)
712
+ end
713
+ end
714
+
715
+ def test_exists_for_instance
716
+ make_temporary_user do |user,|
717
+ assert(user.exists?)
718
+ assert(!user.new_entry?)
719
+
720
+ new_user = @user_class.new(user.uid)
721
+ assert(new_user.exists?)
722
+ assert(new_user.new_entry?)
723
+
724
+ user.destroy
725
+ assert(!user.exists?)
726
+ assert(user.new_entry?)
727
+
728
+ assert(!new_user.exists?)
729
+ assert(new_user.new_entry?)
730
+ end
731
+ end
732
+
733
+ def test_exists_without_required_object_class
734
+ make_temporary_user do |user,|
735
+ @user_class.required_classes -= ["posixAccount"]
736
+ user.remove_class("posixAccount")
737
+ assert(user.save)
738
+
739
+ assert(@user_class.exists?(user.dn))
740
+ @user_class.required_classes += ["posixAccount"]
741
+ assert(!@user_class.exists?(user.dn))
742
+ assert_raises(ActiveLdap::EntryNotFound) do
743
+ @user_class.find(user.dn)
744
+ end
745
+ end
746
+ end
747
+
748
+ def test_find_dns_without_required_object_class
749
+ make_temporary_user do |user1,|
750
+ make_temporary_user do |user2,|
751
+ make_temporary_user do |user3,|
752
+ @user_class.required_classes -= ["posixAccount"]
753
+ user1.remove_class("posixAccount")
754
+ assert(user1.save)
755
+
756
+ @user_class.required_classes += ["posixAccount"]
757
+ assert_raises(ActiveLdap::EntryNotFound) do
758
+ @user_class.find(user1.dn, user2.dn, user3.dn)
759
+ end
760
+ assert_equal([user2.dn, user3.dn],
761
+ @user_class.find(user2.dn, user3.dn).collect {|u| u.dn})
762
+ end
763
+ end
764
+ end
765
+ end
766
+
767
+ def test_reload
768
+ make_temporary_user do |user1,|
769
+ user2 = @user_class.find(user1.uid)
770
+ assert_equal(user1.attributes, user2.attributes)
771
+
772
+ user1.cn = "new #{user1.cn}"
773
+ assert_not_equal(user1.attributes, user2.attributes)
774
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
775
+ user2.attributes.reject {|k, v| k == "cn"})
776
+
777
+ user2.reload
778
+ assert_not_equal(user1.attributes, user2.attributes)
779
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
780
+ user2.attributes.reject {|k, v| k == "cn"})
781
+
782
+ assert(user1.save)
783
+ assert_not_equal(user1.attributes, user2.attributes)
784
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
785
+ user2.attributes.reject {|k, v| k == "cn"})
786
+
787
+ user2.reload
788
+ assert_equal(user1.cn, user2.cn)
789
+ assert_equal(user1.attributes.reject {|k, v| k == "cn"},
790
+ user2.attributes.reject {|k, v| k == "cn"})
791
+ end
792
+ end
793
+
794
+ def test_delete
795
+ make_temporary_user do |user1,|
796
+ make_temporary_user do |user2,|
797
+ make_temporary_user do |user3,|
798
+ assert(@user_class.exists?(user1.uid))
799
+ @user_class.delete(user1.dn)
800
+ assert(!@user_class.exists?(user1.uid))
801
+
802
+ assert(@user_class.exists?(user2.dn))
803
+ @user_class.delete(user2.uid)
804
+ assert(!@user_class.exists?(user2.dn))
805
+
806
+ assert(@user_class.exists?(user3.dn))
807
+ @user_class.delete("uid=#{user3.uid}")
808
+ assert(!@user_class.exists?(user3.dn))
809
+ end
810
+ end
811
+ end
812
+
813
+ make_temporary_user do |user1,|
814
+ make_temporary_user do |user2,|
815
+ make_temporary_user do |user3,|
816
+ assert(@user_class.exists?(user1.uid))
817
+ assert(@user_class.exists?(user2.uid))
818
+ assert(@user_class.exists?(user3.uid))
819
+ @user_class.delete([user1.dn, user2.uid, "uid=#{user3.uid}"])
820
+ assert(!@user_class.exists?(user1.uid))
821
+ assert(!@user_class.exists?(user2.uid))
822
+ assert(!@user_class.exists?(user3.uid))
823
+ end
824
+ end
825
+ end
826
+ end
827
+
828
+ def test_inherit_base
829
+ sub_user_class = Class.new(@user_class)
830
+ sub_user_class.ldap_mapping :prefix => "ou=Sub"
831
+ assert_equal("ou=Sub,#{@user_class.base}", sub_user_class.base)
832
+ sub_user_class.send(:include, Module.new)
833
+ assert_equal("ou=Sub,#{@user_class.base}", sub_user_class.base)
834
+
835
+ sub_sub_user_class = Class.new(sub_user_class)
836
+ sub_sub_user_class.ldap_mapping :prefix => "ou=SubSub"
837
+ assert_equal("ou=SubSub,#{sub_user_class.base}", sub_sub_user_class.base)
838
+ sub_sub_user_class.send(:include, Module.new)
839
+ assert_equal("ou=SubSub,#{sub_user_class.base}", sub_sub_user_class.base)
840
+ end
841
+
842
+ def test_compare
843
+ make_temporary_user do |user1,|
844
+ make_temporary_user do |user2,|
845
+ make_temporary_user do |user3,|
846
+ make_temporary_user do |user4,|
847
+ actual = ([user1, user2, user3] & [user1, user4])
848
+ assert_equal([user1].collect {|user| user.id},
849
+ actual.collect {|user| user.id})
850
+ end
851
+ end
852
+ end
853
+ end
854
+ end
855
+
856
+ def test_ldap_mapping_symbol_dn_attribute
857
+ ou_class = Class.new(ActiveLdap::Base)
858
+ ou_class.ldap_mapping(:dn_attribute => :ou,
859
+ :prefix => "",
860
+ :classes => ["top", "organizationalUnit"])
861
+ assert_equal(["ou=Groups,#{current_configuration['base']}",
862
+ "ou=Users,#{current_configuration['base']}"],
863
+ ou_class.find(:all).collect(&:dn).sort)
864
+ end
865
+
866
+ def test_ldap_mapping_validation
867
+ ou_class = Class.new(ActiveLdap::Base)
868
+ assert_raises(ArgumentError) do
869
+ ou_class.ldap_mapping :dnattr => "ou"
870
+ end
871
+
872
+ assert_nothing_raised do
873
+ ou_class.ldap_mapping :dn_attribute => "ou",
874
+ :prefix => "",
875
+ :classes => ["top", "organizationalUnit"]
876
+ end
877
+ end
878
+
879
+ def test_to_xml
880
+ ou = ou_class.new("Sample")
881
+ assert_equal(<<-EOX, ou.to_xml(:root => "ou"))
882
+ <ou>
883
+ <dn>#{ou.dn}</dn>
884
+ <objectClasses type="array">
885
+ <objectClass>organizationalUnit</objectClass>
886
+ <objectClass>top</objectClass>
887
+ </objectClasses>
888
+ <ous type="array">
889
+ <ou>Sample</ou>
890
+ </ous>
891
+ </ou>
892
+ EOX
893
+
894
+ assert_equal(<<-EOX, ou.to_xml)
895
+ <anonymous>
896
+ <dn>#{ou.dn}</dn>
897
+ <objectClasses type="array">
898
+ <objectClass>organizationalUnit</objectClass>
899
+ <objectClass>top</objectClass>
900
+ </objectClasses>
901
+ <ous type="array">
902
+ <ou>Sample</ou>
903
+ </ous>
904
+ </anonymous>
905
+ EOX
906
+
907
+ make_temporary_user do |user, password|
908
+ xml = normalize_attributes_order(user.to_xml(:root => "user"))
909
+ assert_equal(<<-EOX, xml)
910
+ <user>
911
+ <dn>#{user.dn}</dn>
912
+ <cns type="array">
913
+ <cn>#{user.cn}</cn>
914
+ </cns>
915
+ <gidNumber>#{user.gid_number}</gidNumber>
916
+ <homeDirectory>#{user.home_directory}</homeDirectory>
917
+ <jpegPhotos type="array">
918
+ <jpegPhoto base64="true">#{base64(jpeg_photo)}</jpegPhoto>
919
+ </jpegPhotos>
920
+ <objectClasses type="array">
921
+ <objectClass>inetOrgPerson</objectClass>
922
+ <objectClass>organizationalPerson</objectClass>
923
+ <objectClass>person</objectClass>
924
+ <objectClass>posixAccount</objectClass>
925
+ <objectClass>shadowAccount</objectClass>
926
+ </objectClasses>
927
+ <sns type="array">
928
+ <sn>#{user.sn}</sn>
929
+ </sns>
930
+ <uids type="array">
931
+ <uid>#{user.uid}</uid>
932
+ </uids>
933
+ <uidNumber>#{user.uid_number}</uidNumber>
934
+ <userCertificates type="array">
935
+ <userCertificate base64="true" binary="true">#{base64(certificate)}</userCertificate>
936
+ </userCertificates>
937
+ <userPasswords type="array">
938
+ <userPassword>#{user.user_password}</userPassword>
939
+ </userPasswords>
940
+ </user>
941
+ EOX
942
+ end
943
+ end
944
+
945
+ def test_to_xml_except
946
+ ou = ou_class.new("Sample")
947
+ assert_equal(<<-EOX, ou.to_xml(:root => "sample", :except => [:objectClass]))
948
+ <sample>
949
+ <dn>#{ou.dn}</dn>
950
+ <ous type="array">
951
+ <ou>Sample</ou>
952
+ </ous>
953
+ </sample>
954
+ EOX
955
+
956
+ except = [:dn, :object_class]
957
+ assert_equal(<<-EOX, ou.to_xml(:root => "sample", :except => except))
958
+ <sample>
959
+ <ous type="array">
960
+ <ou>Sample</ou>
961
+ </ous>
962
+ </sample>
963
+ EOX
964
+ end
965
+
966
+ def test_to_xml_escape
967
+ make_temporary_user do |user, password|
968
+ sn = user.sn
969
+ user.sn = "<#{sn}>"
970
+ except = [:jpeg_photo, :user_certificate]
971
+ assert_equal(<<-EOX, user.to_xml(:root => "user", :except => except))
972
+ <user>
973
+ <dn>#{user.dn}</dn>
974
+ <cns type="array">
975
+ <cn>#{user.cn}</cn>
976
+ </cns>
977
+ <gidNumber>#{user.gid_number}</gidNumber>
978
+ <homeDirectory>#{user.home_directory}</homeDirectory>
979
+ <objectClasses type="array">
980
+ <objectClass>inetOrgPerson</objectClass>
981
+ <objectClass>organizationalPerson</objectClass>
982
+ <objectClass>person</objectClass>
983
+ <objectClass>posixAccount</objectClass>
984
+ <objectClass>shadowAccount</objectClass>
985
+ </objectClasses>
986
+ <sns type="array">
987
+ <sn>&lt;#{sn}&gt;</sn>
988
+ </sns>
989
+ <uids type="array">
990
+ <uid>#{user.uid}</uid>
991
+ </uids>
992
+ <uidNumber>#{user.uid_number}</uidNumber>
993
+ <userPasswords type="array">
994
+ <userPassword>#{user.user_password}</userPassword>
995
+ </userPasswords>
996
+ </user>
997
+ EOX
998
+ end
999
+ end
1000
+
1001
+ def test_to_xml_type_ldif
1002
+ make_temporary_user do |user, password|
1003
+ sn = user.sn
1004
+ user.sn = "<#{sn}>"
1005
+ except = [:jpeg_photo, :user_certificate]
1006
+ options = {:root => "user", :except => except, :type => :ldif}
1007
+ assert_equal(<<-EOX, user.to_xml(options))
1008
+ <user>
1009
+ <dn>#{user.dn}</dn>
1010
+ <cn>#{user.cn}</cn>
1011
+ <gidNumber>#{user.gid_number}</gidNumber>
1012
+ <homeDirectory>#{user.home_directory}</homeDirectory>
1013
+ <objectClass>inetOrgPerson</objectClass>
1014
+ <objectClass>organizationalPerson</objectClass>
1015
+ <objectClass>person</objectClass>
1016
+ <objectClass>posixAccount</objectClass>
1017
+ <objectClass>shadowAccount</objectClass>
1018
+ <sn>&lt;#{sn}&gt;</sn>
1019
+ <uid>#{user.uid}</uid>
1020
+ <uidNumber>#{user.uid_number}</uidNumber>
1021
+ <userPassword>#{user.user_password}</userPassword>
1022
+ </user>
1023
+ EOX
1024
+ end
1025
+ end
1026
+
1027
+ def test_to_xml_nil
1028
+ ou = ou_class.new("Sample")
1029
+ ou.description = [nil]
1030
+ assert_equal(<<-EOX, ou.to_xml(:root => "sample"))
1031
+ <sample>
1032
+ <dn>#{ou.dn}</dn>
1033
+ <objectClasses type="array">
1034
+ <objectClass>organizationalUnit</objectClass>
1035
+ <objectClass>top</objectClass>
1036
+ </objectClasses>
1037
+ <ous type="array">
1038
+ <ou>Sample</ou>
1039
+ </ous>
1040
+ </sample>
1041
+ EOX
1042
+ end
1043
+
1044
+ def test_save
1045
+ make_temporary_user do |user, password|
1046
+ user.sn = nil
1047
+ assert(!user.save)
1048
+ assert_raises(ActiveLdap::EntryInvalid) do
1049
+ user.save!
1050
+ end
1051
+
1052
+ user.sn = "Surname"
1053
+ assert(user.save)
1054
+ user.sn = "Surname2"
1055
+ assert_nothing_raised {user.save!}
1056
+ end
1057
+ end
1058
+
1059
+ def test_have_attribute?
1060
+ make_temporary_user do |user, password|
1061
+ assert_true(user.have_attribute?(:cn))
1062
+ assert_true(user.have_attribute?(:commonName))
1063
+ assert_true(user.have_attribute?(:common_name))
1064
+ assert_true(user.have_attribute?(:commonname))
1065
+ assert_true(user.have_attribute?(:COMMONNAME))
1066
+
1067
+ assert_false(user.have_attribute?(:unknown_attribute))
1068
+ end
1069
+ end
1070
+
1071
+ def test_attribute_present?
1072
+ make_temporary_user do |user, password|
1073
+ assert(user.attribute_present?(:sn))
1074
+ user.sn = nil
1075
+ assert(!user.attribute_present?(:sn))
1076
+ user.sn = "Surname"
1077
+ assert(user.attribute_present?(:sn))
1078
+ user.sn = [nil]
1079
+ assert(!user.attribute_present?(:sn))
1080
+ end
1081
+ end
1082
+
1083
+ def test_attribute_present_with_unknown_attribute
1084
+ make_temporary_user do |user, password|
1085
+ assert(!user.attribute_present?(:unknown_attribute))
1086
+ end
1087
+ end
1088
+
1089
+ def test_update_all
1090
+ make_temporary_user do |user, password|
1091
+ make_temporary_user do |user2, password2|
1092
+ user2_cn = user2.cn
1093
+ new_cn = "New #{user.cn}"
1094
+ @user_class.update_all({:cn => new_cn}, user.uid)
1095
+ assert_equal(new_cn, @user_class.find(user.uid).cn)
1096
+ assert_equal(user2_cn, @user_class.find(user2.uid).cn)
1097
+
1098
+ new_sn = "New SN"
1099
+ @user_class.update_all({:sn => [new_sn]})
1100
+ assert_equal(new_sn, @user_class.find(user.uid).sn)
1101
+ assert_equal(new_sn, @user_class.find(user2.uid).sn)
1102
+
1103
+ new_sn2 = "New SN2"
1104
+ @user_class.update_all({:sn => [new_sn2]}, user2.uid)
1105
+ assert_equal(new_sn, @user_class.find(user.uid).sn)
1106
+ assert_equal(new_sn2, @user_class.find(user2.uid).sn)
1107
+ end
1108
+ end
1109
+ end
1110
+
1111
+ def test_update
1112
+ make_temporary_user do |user, password|
1113
+ new_cn = "New #{user.cn}"
1114
+ new_user = @user_class.update(user.dn, {:cn => new_cn})
1115
+ assert_equal(new_cn, new_user.cn)
1116
+
1117
+ make_temporary_user do |user2, password2|
1118
+ new_sns = ["New SN1", "New SN2"]
1119
+ new_cn2 = "New #{user2.cn}"
1120
+ new_user, new_user2 = @user_class.update([user.dn, user2.dn],
1121
+ [{:sn => new_sns[0]},
1122
+ {:sn => new_sns[1],
1123
+ :cn => new_cn2}])
1124
+ assert_equal(new_sns, [new_user.sn, new_user2.sn])
1125
+ assert_equal(new_cn2, new_user2.cn)
1126
+ end
1127
+ end
1128
+ end
1129
+
1130
+ private
1131
+ def detect_modify(object)
1132
+ modify_called = false
1133
+ singleton_class = class << object; self; end
1134
+ singleton_class.send(:define_method, :modify_entry) do |*args|
1135
+ dn, attributes, options = args
1136
+ options ||= {}
1137
+ modify_detector = Object.new
1138
+ modify_detector.instance_variable_set("@called", false)
1139
+ def modify_detector.modify(dn, entries, options)
1140
+ @called = true
1141
+ end
1142
+ options[:connection] = modify_detector
1143
+ result = super(dn, attributes, options)
1144
+ modify_called = modify_detector.instance_variable_get("@called")
1145
+ result
1146
+ end
1147
+ yield
1148
+ modify_called
1149
+ end
1150
+
1151
+ def assert_to_ldif(entry)
1152
+ records = ActiveLdap::LDIF.parse(entry.to_ldif).records
1153
+ parsed_entries = records.collect do |record|
1154
+ entry.class.send(:instantiate, [record.dn, record.attributes])
1155
+ end
1156
+ assert_equal([entry], parsed_entries)
1157
+ end
1158
+
1159
+ def base64(string)
1160
+ [string].pack("m").gsub(/\n/u, "")
1161
+ end
1162
+
1163
+ def normalize_attributes_order(xml)
1164
+ xml.gsub(/<(\S+) (.+?)(\/?)>/) do |matched|
1165
+ name = $1
1166
+ attributes = $2
1167
+ close_mark = $3
1168
+ attributes = attributes.scan(/(\S+)="(.+?)"/)
1169
+ normalized_attributes = attributes.sort_by do |key, value|
1170
+ key
1171
+ end.collect do |key, value|
1172
+ "#{key}=\"#{value}\""
1173
+ end.join(' ')
1174
+ "<#{name} #{normalized_attributes}#{close_mark}>"
1175
+ end
1176
+ end
1177
+ end