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,383 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'al-test-utils'
4
+
5
+ class TestSyntax < Test::Unit::TestCase
6
+ include AlTestUtils
7
+ include ActiveLdap::Helper
8
+
9
+ SYNTAXES = \
10
+ [
11
+ "( 1.3.6.1.1.16.1 DESC 'UUID' )",
12
+ "( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' )",
13
+ "( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' )",
14
+ "( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
15
+ "( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
16
+ "( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' " +
17
+ "X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )",
18
+ "( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' )",
19
+ "( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
20
+ "( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
21
+ "( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
22
+ "( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
23
+ "( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
24
+ "( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
25
+ "( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
26
+ "( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' X-NOT-HUMAN-READABLE 'TRUE' )",
27
+ "( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
28
+ "( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
29
+ "( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
30
+ "( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
31
+ "( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
32
+ "( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
33
+ "( 1.2.36.79672281.1.5.0 DESC 'RDN' )",
34
+ "( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
35
+ "( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
36
+ "( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' " +
37
+ "X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )",
38
+ "( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' " +
39
+ "X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )",
40
+ "( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' " +
41
+ "X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )",
42
+ "( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )",
43
+ "( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )",
44
+ "( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-READABLE 'TRUE' )",
45
+ "( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' X-NOT-HUMAN-READABLE 'TRUE' )"
46
+ ]
47
+
48
+ def setup
49
+ @schema = ActiveLdap::Schema.new("ldapSyntaxes" => SYNTAXES.dup)
50
+ @syntaxes = {}
51
+ @schema.ldap_syntaxes.each do |syntax|
52
+ @syntaxes[syntax.description] = syntax
53
+ end
54
+ end
55
+
56
+ def teardown
57
+ end
58
+
59
+ priority :must
60
+ def test_id_with_length
61
+ id = "1.3.6.1.4.1.1466.115.121.1.26"
62
+
63
+ syntax = ActiveLdap::Schema::Syntax.new(id, @schema)
64
+ assert_equal([id, nil], [syntax.id, syntax.length])
65
+
66
+ syntax = ActiveLdap::Schema::Syntax.new("#{id}{128}", @schema)
67
+ assert_equal([id, 128], [syntax.id, syntax.length])
68
+ end
69
+
70
+ priority :normal
71
+ def test_bit_string_type_cast
72
+ assert_type_cast_without_validation(nil, nil, 'Bit String')
73
+ assert_type_cast("0101111101", "'0101111101'B", 'Bit String')
74
+ end
75
+
76
+ def test_boolean_type_cast
77
+ assert_type_cast_without_validation(nil, nil, 'Boolean')
78
+ assert_type_cast(true, "TRUE", "Boolean")
79
+ assert_type_cast(false, "FALSE", "Boolean")
80
+ end
81
+
82
+ def test_boolean_normalize_value
83
+ assert_normalize_value("TRUE", true, 'Boolean')
84
+ assert_normalize_value("TRUE", "1", 'Boolean')
85
+ assert_normalize_value("FALSE", false, 'Boolean')
86
+ assert_normalize_value("FALSE", "0", 'Boolean')
87
+ end
88
+
89
+ def test_dn_type_cast
90
+ assert_type_cast_without_validation(nil, nil, 'Distinguished Name')
91
+ assert_dn_type_cast("cn=test", 'Distinguished Name')
92
+ end
93
+
94
+ def test_generalized_time_type_cast
95
+ assert_type_cast_without_validation(nil, nil, "Generalized Time")
96
+ assert_type_cast(Time.parse("1994/12/16 10:32:12"), "19941216103212",
97
+ "Generalized Time")
98
+ assert_type_cast(Time.parse("1994/12/16 10:32:12Z"), "19941216103212Z",
99
+ "Generalized Time")
100
+ assert_type_cast(Time.parse("1994/12/16 10:32:12.345 +09:00"),
101
+ "19941216103212.345+0900",
102
+ "Generalized Time")
103
+ begin
104
+ Time.utc(1601)
105
+ assert_type_cast(Time.utc(1601, 1, 1, 0, 4, 17),
106
+ "16010101000417.0Z",
107
+ "Generalized Time")
108
+ rescue ArgumentError
109
+ assert_type_cast(Time.at(0),
110
+ "16010101000417.0Z",
111
+ "Generalized Time")
112
+ end
113
+
114
+ begin
115
+ Time.at(-1)
116
+ rescue ArgumentError
117
+ if $!.message == "argument out of range"
118
+ assert_type_cast(Time.parse("1969/12/31 23:59:59 +00:00"),
119
+ "19691231235959+0000",
120
+ "Generalized Time")
121
+ end
122
+ end
123
+ end
124
+
125
+ def test_integer_type_cast
126
+ assert_type_cast_without_validation(nil, nil, "Generalized Time")
127
+ assert_type_cast(1321, "1321", "Integer")
128
+ end
129
+
130
+ def test_bit_string_validate
131
+ assert_valid("'0101111101'B", 'Bit String')
132
+ assert_valid("''B", 'Bit String')
133
+
134
+ value = "0101111101'B"
135
+ assert_invalid(_("%s doesn't have the first \"'\"") % value.inspect,
136
+ value, 'Bit String')
137
+
138
+ value = "'0101111101'"
139
+ assert_invalid(_("%s doesn't have the last \"'B\"") % value.inspect,
140
+ value, 'Bit String')
141
+
142
+ value = "'0101111101B"
143
+ assert_invalid(_("%s doesn't have the last \"'B\"") % value.inspect,
144
+ value, 'Bit String')
145
+
146
+ value = "'0A'B"
147
+ assert_invalid(_("%s has invalid character '%s'") % [value.inspect, "A"],
148
+ value, 'Bit String')
149
+ end
150
+
151
+ def test_boolean_validate
152
+ assert_valid("TRUE", "Boolean")
153
+ assert_valid("FALSE", "Boolean")
154
+
155
+ value = "true"
156
+ assert_invalid(_("%s should be TRUE or FALSE") % value.inspect,
157
+ value, "Boolean")
158
+ end
159
+
160
+ def test_country_string_validate
161
+ assert_valid("ja", "Country String")
162
+ assert_valid("JA", "Country String")
163
+
164
+ value = "japan"
165
+ assert_invalid(_("%s should be just 2 printable characters") % value.inspect,
166
+ value, "Country String")
167
+ end
168
+
169
+ def test_dn_validate
170
+ assert_valid("cn=test", 'Distinguished Name')
171
+ assert_valid("CN=Steve Kille,O=Isode Limited,C=GB", 'Distinguished Name')
172
+ assert_valid("OU=Sales+CN=J. Smith,O=Widget Inc.,C=US", 'Distinguished Name')
173
+ assert_valid("CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB",
174
+ 'Distinguished Name')
175
+ assert_valid("CN=Before\\0DAfter,O=Test,C=GB", 'Distinguished Name')
176
+ assert_valid("1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB",
177
+ 'Distinguished Name')
178
+ assert_valid("SN=Lu\\C4\\8Di\\C4\\87", 'Distinguished Name')
179
+
180
+ value = "test"
181
+ params = [value, _("attribute value is missing")]
182
+ assert_invalid(_('%s is invalid distinguished name (DN): %s') % params,
183
+ value, 'Distinguished Name')
184
+ end
185
+
186
+ def test_directory_string_validate
187
+ assert_valid("This is a string of DirectoryString containing \#!%\#@",
188
+ "Directory String")
189
+ assert_valid("これはDirectoryString文字列です。",
190
+ "Directory String")
191
+
192
+ value = "これはDirectoryString文字列です。"
193
+ if value.respond_to?(:encode)
194
+ value = value.encode("euc-jp")
195
+ else
196
+ value = NKF.nkf("-We", value)
197
+ end
198
+ assert_invalid(_("%s has invalid UTF-8 character") % value.inspect,
199
+ value, "Directory String")
200
+ end
201
+
202
+ def test_generalized_time_validate
203
+ assert_valid("19941216103201", "Generalized Time")
204
+ assert_valid("19941216103212Z", "Generalized Time")
205
+ assert_valid("19941216103230+0900", "Generalized Time")
206
+ assert_valid("20080107034615.0Z", "Generalized Time")
207
+ assert_valid("20080107034615,123-0900", "Generalized Time")
208
+
209
+ value = "1994"
210
+ params = [value.inspect, %w(month day hour minute second).join(", ")]
211
+ assert_invalid(_("%s has missing components: %s") % params,
212
+ value, "Generalized Time")
213
+ value = "199412161032"
214
+ params = [value.inspect, %w(second).join(", ")]
215
+ assert_invalid(_("%s has missing components: %s") % params,
216
+ value, "Generalized Time")
217
+ end
218
+
219
+ def test_integer_validate
220
+ assert_valid("1321", "Integer")
221
+
222
+ assert_invalid_integer("13.5")
223
+ assert_invalid_integer("string")
224
+ end
225
+
226
+ def test_jpeg_validate
227
+ assert_valid([0xffd8].pack("n"), "JPEG")
228
+
229
+ assert_invalid(_("invalid JPEG format"), "", "JPEG")
230
+ assert_invalid(_("invalid JPEG format"), "jpeg", "JPEG")
231
+ end
232
+
233
+ def test_name_and_optional_uid_validate
234
+ assert_valid("1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB#'0101'B",
235
+ "Name And Optional UID")
236
+ assert_valid("cn=test", "Name And Optional UID")
237
+
238
+ value = "test"
239
+ params = [value, _("attribute value is missing")]
240
+ assert_invalid(_('%s is invalid distinguished name (DN): %s') % params,
241
+ value, "Name And Optional UID")
242
+
243
+ bit_string = "'00x'B"
244
+ params = [bit_string.inspect, "x"]
245
+ assert_invalid(_("%s has invalid character '%s'") % params,
246
+ "cn=test\##{bit_string}", "Name And Optional UID")
247
+ end
248
+
249
+ def test_numeric_string_validate
250
+ assert_valid("1997", "Numeric String")
251
+
252
+ assert_invalid_numeric_string("-3")
253
+ assert_invalid_numeric_string("-3.5")
254
+ assert_invalid_numeric_string("string")
255
+ end
256
+
257
+ def test_oid_validate
258
+ assert_valid("1.2.3.4", "OID")
259
+ assert_valid("cn", "OID")
260
+
261
+ assert_invalid_oid("\#@!", "attribute type is missing")
262
+ end
263
+
264
+ def test_other_mailbox_validate
265
+ assert_valid("smtp$bob@example.com", "Other Mailbox")
266
+
267
+
268
+ value = "smtp"
269
+ assert_invalid(_("%s has no mailbox") % value.inspect,
270
+ value, "Other Mailbox")
271
+
272
+ value = "smtp$"
273
+ assert_invalid(_("%s has no mailbox") % value.inspect,
274
+ value, "Other Mailbox")
275
+
276
+ value = "$bob@example.com"
277
+ assert_invalid(_("%s has no mailbox type") % value.inspect,
278
+ value, "Other Mailbox")
279
+
280
+ value = "!$bob@example.com"
281
+ params = [value.inspect, "!"]
282
+ reason = _("%s has unprintable character in mailbox type: '%s'") % params
283
+ assert_invalid(reason, value, "Other Mailbox")
284
+ end
285
+
286
+ def test_postal_address_validate
287
+ assert_valid("1234 Main St.$Anytown, CA 12345$USA", "Postal Address")
288
+ assert_valid("\\241,000,000 Sweepstakes$PO Box 1000000$Anytown, " +
289
+ "CA 12345$USA", "Postal Address")
290
+ assert_valid("$", "Postal Address")
291
+ assert_valid("1234 Main St.$", "Postal Address")
292
+
293
+
294
+ assert_invalid(_("empty string"), "", "Postal Address")
295
+
296
+ value = "東京"
297
+ if value.respond_to?(:encode)
298
+ value = value.encode("euc-jp")
299
+ else
300
+ value = NKF.nkf("-We", value)
301
+ end
302
+ assert_invalid(_("%s has invalid UTF-8 character") % value.inspect,
303
+ value, "Postal Address")
304
+ end
305
+
306
+ def test_printable_string_validate
307
+ assert_valid("This is a PrintableString", "Printable String")
308
+
309
+ assert_invalid(_("empty string"), "", "Printable String")
310
+
311
+
312
+ value = "abc!def"
313
+ params = [value.inspect, "!"]
314
+ reason = _("%s has unprintable character: '%s'") % params
315
+ assert_invalid(reason, value, "Printable String")
316
+
317
+ value = "abcあdef"
318
+ params = [value.inspect, "あ"]
319
+ reason = _("%s has unprintable character: '%s'") % params
320
+ assert_invalid(reason, value, "Printable String")
321
+ end
322
+
323
+ def test_telephone_number_validate
324
+ assert_valid("+1 512 305 0280", "Telephone Number")
325
+ assert_valid("", "Telephone Number")
326
+
327
+ value = "+1 5!2 305 0280"
328
+ params = [value.inspect, "!"]
329
+ reason = _("%s has unprintable character: '%s'") % params
330
+ assert_invalid(reason, value, "Telephone Number")
331
+ end
332
+
333
+ private
334
+ def assert_valid(value, syntax_name)
335
+ assert_nil(@syntaxes[syntax_name].validate(value))
336
+ end
337
+
338
+ def assert_invalid(reason, value, syntax_name)
339
+ assert_equal(reason, @syntaxes[syntax_name].validate(value))
340
+ end
341
+
342
+ def assert_invalid_integer(value)
343
+ assert_invalid(_("%s is invalid integer format") % value.inspect,
344
+ value, "Integer")
345
+ end
346
+
347
+ def assert_invalid_numeric_string(value)
348
+ assert_invalid(_("%s is invalid numeric format") % value.inspect,
349
+ value, "Numeric String")
350
+ end
351
+
352
+ def assert_invalid_oid(value, reason=nil)
353
+ if reason
354
+ message = _("%s is invalid OID format: %s") % [value.inspect, _(reason)]
355
+ else
356
+ message = _("%s is invalid OID format") % value.inspect
357
+ end
358
+ assert_invalid(message, value, "OID")
359
+ end
360
+
361
+ def assert_type_cast_without_validation(type_casted_value, original_value,
362
+ syntax_name)
363
+ syntax = @syntaxes[syntax_name]
364
+ assert_equal(type_casted_value, syntax.type_cast(original_value))
365
+ assert_equal(type_casted_value, syntax.type_cast(type_casted_value))
366
+ end
367
+
368
+ def assert_type_cast(type_casted_value, original_value, syntax_name)
369
+ assert_type_cast_without_validation(type_casted_value, original_value,
370
+ syntax_name)
371
+ assert_valid(type_casted_value, syntax_name)
372
+ end
373
+
374
+ def assert_dn_type_cast(original_value, syntax_name)
375
+ assert_type_cast(ActiveLdap::DN.parse(original_value), original_value,
376
+ syntax_name)
377
+ end
378
+
379
+ def assert_normalize_value(normalized_value, original_value, syntax_name)
380
+ syntax = @syntaxes[syntax_name]
381
+ assert_equal(normalized_value, syntax.normalize_value(original_value))
382
+ end
383
+ end
@@ -0,0 +1,217 @@
1
+ require 'al-test-utils'
2
+
3
+ class TestUser < Test::Unit::TestCase
4
+ include AlTestUtils
5
+
6
+ # This adds all required attributes and writes
7
+ def test_add
8
+ ensure_delete_user("test-user") do |uid|
9
+ user = @user_class.new(uid)
10
+
11
+ assert(user.new_entry?, "#{uid} must not exist in LDAP prior to testing")
12
+
13
+ assert_equal(['posixAccount', 'person'].sort, user.classes.sort,
14
+ "Class User's ldap_mapping should specify " +
15
+ "['posixAccount', 'person']. This was not returned.")
16
+
17
+ user.add_class('posixAccount', 'shadowAccount',
18
+ 'person', 'inetOrgPerson', 'organizationalPerson')
19
+
20
+ cn = 'Test User (Default Language)'
21
+ user.cn = cn
22
+ assert_equal(cn, user.cn, 'user.cn should have returned "#{cn}"')
23
+
24
+ # test force_array
25
+ assert_equal([cn], user.cn(true),
26
+ 'user.cn(true) should have returned "[#{cn}]"')
27
+
28
+ cn = {'lang-en-us' => 'Test User (EN-US Language)'}
29
+ user.cn = cn
30
+ # Test subtypes
31
+ assert_equal(cn, user.cn, 'user.cn should match')
32
+
33
+ cn = ['Test User (Default Language)',
34
+ {'lang-en-us' => ['Test User (EN-US Language)', 'Foo']}]
35
+ user.cn = cn
36
+ # Test multiple entries with subtypes
37
+ assert_equal(cn, user.cn,
38
+ 'This should have returned an array of a ' +
39
+ 'normal cn and a lang-en-us cn.')
40
+
41
+ uid_number = "9000"
42
+ user.uid_number = uid_number
43
+ assert_equal(uid_number.to_i, user.uid_number)
44
+ assert_equal(uid_number, user.uid_number_before_type_cast)
45
+
46
+ gid_number = 9000
47
+ user.gid_number = gid_number
48
+ assert_equal(gid_number, user.gid_number)
49
+ assert_equal(gid_number, user.gid_number_before_type_cast)
50
+
51
+ home_directory = '/home/foo'
52
+ user.home_directory = home_directory
53
+ # just for sanity's sake
54
+ assert_equal(home_directory, user.home_directory,
55
+ 'This should be #{home_directory.dump}.')
56
+ assert_equal([home_directory], user.home_directory(true),
57
+ 'This should be [#{home_directory.dump}].')
58
+
59
+ see_also = "cn=XXX,dc=local,dc=net"
60
+ user.see_also = see_also
61
+ assert_equal(ActiveLdap::DN.parse(see_also), user.see_also)
62
+
63
+ see_also = ActiveLdap::DN.parse(see_also)
64
+ user.see_also = see_also
65
+ assert_equal(see_also, user.see_also)
66
+
67
+ assert(!user.valid?)
68
+ assert(user.errors[:sn].any?)
69
+ errors = %w(person organizationalPerson
70
+ inetOrgPerson).collect do |object_class|
71
+ if ActiveLdap.get_text_supported?
72
+ format = _("is required attribute by objectClass '%s': " \
73
+ "aliases: %s")
74
+ format = user._(format)
75
+ format % [user.class.human_object_class_name(object_class),
76
+ user.class.human_attribute_name("surname")]
77
+ else
78
+ format = "is required attribute by objectClass '%s': aliases: %s"
79
+ user._(format) % [object_class, "surname"]
80
+ end
81
+ end
82
+ assert_equal(errors.sort, user.errors[:sn].sort)
83
+ user.sn = ['User']
84
+ assert(user.valid?)
85
+ assert_equal(0, user.errors.size)
86
+
87
+ assert_nothing_raised {user.save!}
88
+
89
+ user.user_certificate = certificate
90
+ user.jpeg_photo = jpeg_photo
91
+
92
+ assert(ActiveLdap::Base.schema.attribute('jpegPhoto').binary?,
93
+ 'jpegPhoto is binary?')
94
+
95
+ assert(ActiveLdap::Base.schema.attribute('userCertificate').binary?,
96
+ 'userCertificate is binary?')
97
+ assert_nothing_raised {user.save!}
98
+ end
99
+ end
100
+
101
+
102
+ # This tests the reload of a binary_required type
103
+ def test_binary_required
104
+ require 'openssl'
105
+ make_temporary_user do |user, password|
106
+ # validate add
107
+ user.user_certificate = nil
108
+ assert_nil(user.user_certificate)
109
+ assert_nothing_raised() { user.save! }
110
+ assert_nil(user.user_certificate)
111
+
112
+ user.user_certificate = {"binary" => [certificate]}
113
+ assert_equal(certificate, user.user_certificate)
114
+ assert_nothing_raised() { user.save! }
115
+ assert_equal(certificate, user.user_certificate)
116
+
117
+ # now test modify
118
+ user.user_certificate = nil
119
+ assert_nil(user.user_certificate)
120
+ assert_nothing_raised() { user.save! }
121
+ assert_nil(user.user_certificate)
122
+
123
+ user.user_certificate = certificate
124
+ assert_equal(certificate, user.user_certificate)
125
+ assert_nothing_raised() { user.save! }
126
+
127
+ # validate modify
128
+ user = @user_class.find(user.uid)
129
+ assert_equal(certificate, user.user_certificate)
130
+
131
+ expected_cert = OpenSSL::X509::Certificate.new(certificate)
132
+ actual_cert = user.user_certificate
133
+ actual_cert = OpenSSL::X509::Certificate.new(actual_cert)
134
+ assert_equal(expected_cert.subject.to_s,
135
+ actual_cert.subject.to_s,
136
+ 'Cert must parse correctly still')
137
+ end
138
+ end
139
+
140
+ def test_binary_required_nested
141
+ make_temporary_user do |user, password|
142
+ user.user_certificate = {"lang-en" => [certificate]}
143
+ assert_equal({'lang-en' => certificate},
144
+ user.user_certificate)
145
+ assert_nothing_raised() { user.save! }
146
+ assert_equal({'lang-en' => certificate},
147
+ user.user_certificate)
148
+ end
149
+ end
150
+
151
+ # This tests the reload of a binary type (not forced!)
152
+ def test_binary
153
+ make_temporary_user do |user, password|
154
+ # reload and see what happens
155
+ assert_equal(jpeg_photo, user.jpeg_photo,
156
+ "This should have been equal to #{jpeg_photo_path.dump}")
157
+
158
+ # now test modify
159
+ user.jpeg_photo = nil
160
+ assert_nil(user.jpeg_photo)
161
+ assert_nothing_raised() { user.save! }
162
+ assert_nil(user.jpeg_photo)
163
+
164
+ user.jpeg_photo = jpeg_photo
165
+ assert_equal(jpeg_photo, user.jpeg_photo)
166
+ assert_nothing_raised() { user.save! }
167
+
168
+ # now validate modify
169
+ user = @user_class.find(user.uid)
170
+ assert_equal(jpeg_photo, user.jpeg_photo)
171
+ end
172
+ end
173
+
174
+ # This tests the removal of a objectclass
175
+ def test_remove_object_class
176
+ make_temporary_user do |user, password|
177
+ assert_nil(user.shadow_max,
178
+ 'Should get the default nil value for shadowMax')
179
+
180
+ # Remove shadowAccount
181
+ user.remove_class('shadowAccount')
182
+ assert(user.valid?)
183
+ assert_nothing_raised() { user.save! }
184
+
185
+ assert_raise(NoMethodError,
186
+ 'shadowMax should not be defined anymore' ) do
187
+ user.shadow_max
188
+ end
189
+ end
190
+ end
191
+
192
+
193
+ # Just modify a few random attributes
194
+ def test_modify_with_subtypes
195
+ make_temporary_user do |user, password|
196
+ cn = ['Test User', {'lang-en-us' => ['Test User', 'wad']}]
197
+ user.cn = cn
198
+ assert_nothing_raised() { user.save! }
199
+
200
+ user = @user_class.find(user.uid)
201
+ assert_equal(cn, user.cn,
202
+ 'Making sure a modify with mixed subtypes works')
203
+ end
204
+ end
205
+
206
+ # This tests some invalid input handling
207
+ def test_invalid_input
208
+ end
209
+
210
+ # This tests deletion
211
+ def test_destroy
212
+ make_temporary_user do |user, password|
213
+ user.destroy
214
+ assert(user.new_entry?, 'user should no longer exist')
215
+ end
216
+ end
217
+ end