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,53 @@
1
+ module ActiveLdap
2
+ module Populate
3
+ module_function
4
+ def ensure_base(base_class=nil)
5
+ base_class ||= Base
6
+ return unless base_class.search(:scope => :base).empty?
7
+
8
+ base_dn = DN.parse(base_class.base)
9
+ suffixes = []
10
+
11
+ base_dn.rdns.reverse_each do |rdn|
12
+ name, value = rdn.to_a[0]
13
+ prefix = suffixes.join(",")
14
+ suffixes.unshift("#{name}=#{value}")
15
+ next unless name == "dc"
16
+ begin
17
+ ensure_dc(value, prefix, base_class)
18
+ rescue ActiveLdap::OperationNotPermitted
19
+ end
20
+ end
21
+ end
22
+
23
+ def ensure_ou(name, base_class=nil)
24
+ base_class ||= Base
25
+ name = name.to_s if name.is_a?(DN)
26
+ name = name.gsub(/\Aou\s*=\s*/i, '')
27
+
28
+ ou_class = Class.new(base_class)
29
+ ou_class.ldap_mapping(:dn_attribute => "ou",
30
+ :prefix => "",
31
+ :classes => ["top", "organizationalUnit"])
32
+ return if ou_class.exist?(name)
33
+ ou_class.new(name).save!
34
+ end
35
+
36
+ def ensure_dc(name, prefix, base_class=nil)
37
+ base_class ||= Base
38
+ name = name.to_s if name.is_a?(DN)
39
+ name = name.gsub(/\Adc\s*=\s*/i, '')
40
+
41
+ dc_class = Class.new(base_class)
42
+ dc_class.ldap_mapping(:dn_attribute => "dc",
43
+ :prefix => "",
44
+ :scope => :base,
45
+ :classes => ["top", "dcObject", "organization"])
46
+ dc_class.base = prefix
47
+ return if dc_class.exist?(name)
48
+ dc = dc_class.new(name)
49
+ dc.o = dc.dc
50
+ dc.save!
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,31 @@
1
+ module Rails
2
+ module ActiveLdap
3
+ class Railtie < Rails::Railtie
4
+ initializer "setup database" do
5
+ ldap_configuration_file = Rails.root.join("config", "ldap.yml")
6
+ if ldap_configuration_file.file?
7
+ configurations = YAML.load(ERB.new(IO.read(ldap_configuration_file)).result)
8
+ ::ActiveLdap::Base.configurations = configurations
9
+ ::ActiveLdap::Base.setup_connection
10
+ ::ActiveLdap::Base.logger ||= Rails.logger
11
+ end
12
+ end
13
+
14
+ # After initialization we will warn the user if we can't find a mongoid.yml and
15
+ # alert to create one.
16
+ initializer "warn when configuration is missing" do
17
+ config.after_initialize do
18
+ puts "|#{Rails.root}| - |#{Rails.root.join('config', 'ldap.yml')}|"
19
+ unless Rails.root.join("config", "ldap.yml").file?
20
+ puts("You should run 'script/generator scaffold_active_ldap' to make ldap.yml.")
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ class ::ActionView::Base
29
+ include ActiveLdap::Helper
30
+ end
31
+
@@ -0,0 +1,699 @@
1
+ module ActiveLdap
2
+ class Schema
3
+ include GetTextSupport
4
+
5
+ def initialize(entries)
6
+ @entries = normalize_entries(entries || {})
7
+ @schema_info = {}
8
+ @class_attributes_info = {}
9
+ @cache = {}
10
+ end
11
+
12
+ def ids(group)
13
+ ensure_parse(group)
14
+ info, ids, aliases = ensure_schema_info(group)
15
+ ids.keys
16
+ end
17
+
18
+ def names(group)
19
+ alias_map(group).keys
20
+ end
21
+
22
+ def exist_name?(group, name)
23
+ alias_map(group).has_key?(normalize_schema_name(name))
24
+ end
25
+
26
+ def resolve_name(group, name)
27
+ alias_map(group)[normalize_schema_name(name)]
28
+ end
29
+
30
+ # fetch
31
+ #
32
+ # This is just like LDAP::Schema#attribute except that it allows
33
+ # look up in any of the given keys.
34
+ # e.g.
35
+ # fetch('attributeTypes', 'cn', 'DESC')
36
+ # fetch('ldapSyntaxes', '1.3.6.1.4.1.1466.115.121.1.5', 'DESC')
37
+ def fetch(group, id_or_name, attribute_name)
38
+ return [] if attribute_name.empty?
39
+ attribute_name = normalize_attribute_name(attribute_name)
40
+ value = entry(group, id_or_name)[attribute_name]
41
+ value ? value.dup : []
42
+ end
43
+ alias_method :[], :fetch
44
+
45
+ NUMERIC_OID_RE = "\\d[\\d\\.]+"
46
+ DESCRIPTION_RE = "[a-zA-Z][a-zA-Z\\d\\-]*"
47
+ OID_RE = "(?:#{NUMERIC_OID_RE}|#{DESCRIPTION_RE}-oid)"
48
+ def entry(group, id_or_name)
49
+ return {} if group.empty? or id_or_name.empty?
50
+
51
+ unless @entries.has_key?(group)
52
+ raise ArgumentError, _("Unknown schema group: %s") % group
53
+ end
54
+
55
+ # Initialize anything that is required
56
+ info, ids, aliases = ensure_schema_info(group)
57
+ id, name = determine_id_or_name(id_or_name, aliases)
58
+
59
+ # Check already parsed options first
60
+ return ids[id] if ids.has_key?(id)
61
+
62
+ schemata = @entries[group] || []
63
+ while schema = schemata.shift
64
+ next unless /\A\s*\(\s*(#{OID_RE})\s*(.*)\s*\)\s*\z/ =~ schema
65
+ schema_id = $1
66
+ rest = $2
67
+
68
+ if ids.has_key?(schema_id)
69
+ attributes = ids[schema_id]
70
+ else
71
+ attributes = {}
72
+ ids[schema_id] = attributes
73
+ end
74
+
75
+ parse_attributes(rest, attributes)
76
+ (attributes["NAME"] || []).each do |v|
77
+ normalized_name = normalize_schema_name(v)
78
+ aliases[normalized_name] = schema_id
79
+ id = schema_id if id.nil? and name == normalized_name
80
+ end
81
+
82
+ break if id == schema_id
83
+ end
84
+
85
+ ids[id || aliases[name]] || {}
86
+ end
87
+
88
+ def attribute(name)
89
+ cache([:attribute, name]) do
90
+ Attribute.new(name, self)
91
+ end
92
+ end
93
+
94
+ def attributes
95
+ cache([:attributes]) do
96
+ names("attributeTypes").collect do |name|
97
+ attribute(name)
98
+ end
99
+ end
100
+ end
101
+
102
+ def attribute_type(name, attribute_name)
103
+ cache([:attribute_type, name, attribute_name]) do
104
+ fetch("attributeTypes", name, attribute_name)
105
+ end
106
+ end
107
+
108
+ def object_class(name)
109
+ cache([:object_class, name]) do
110
+ ObjectClass.new(name, self)
111
+ end
112
+ end
113
+
114
+ def object_classes
115
+ cache([:object_classes]) do
116
+ names("objectClasses").collect do |name|
117
+ object_class(name)
118
+ end
119
+ end
120
+ end
121
+
122
+ def object_class_attribute(name, attribute_name)
123
+ cache([:object_class_attribute, name, attribute_name]) do
124
+ fetch("objectClasses", name, attribute_name)
125
+ end
126
+ end
127
+
128
+ def dit_content_rule_attribute(name, attribute_name)
129
+ cache([:dit_content_rule_attribute, name, attribute_name]) do
130
+ fetch("dITContentRules", name, attribute_name)
131
+ end
132
+ end
133
+
134
+ def ldap_syntax(name)
135
+ cache([:ldap_syntax, name]) do
136
+ Syntax.new(name, self)
137
+ end
138
+ end
139
+
140
+ def ldap_syntaxes
141
+ cache([:ldap_syntaxes]) do
142
+ ids("ldapSyntaxes").collect do |id|
143
+ ldap_syntax(id)
144
+ end
145
+ end
146
+ end
147
+
148
+ def ldap_syntax_attribute(name, attribute_name)
149
+ cache([:ldap_syntax_attribute, name, attribute_name]) do
150
+ fetch("ldapSyntaxes", name, attribute_name)
151
+ end
152
+ end
153
+
154
+ def dump(output=nil)
155
+ require 'pp'
156
+ output ||= STDOUT
157
+ if output.respond_to?(:write)
158
+ PP.pp(@entries, output)
159
+ else
160
+ open(output, "w") {|out| PP.pp(@entries, out)}
161
+ end
162
+ nil
163
+ end
164
+
165
+ private
166
+ def cache(key)
167
+ (@cache[key] ||= [yield])[0]
168
+ end
169
+
170
+ def ensure_schema_info(group)
171
+ @schema_info[group] ||= {:ids => {}, :aliases => {}}
172
+ info = @schema_info[group]
173
+ [info, info[:ids], info[:aliases]]
174
+ end
175
+
176
+ def determine_id_or_name(id_or_name, aliases)
177
+ if /\A[\d\.]+\z/ =~ id_or_name
178
+ id = id_or_name
179
+ name = nil
180
+ else
181
+ name = normalize_schema_name(id_or_name)
182
+ id = aliases[name]
183
+ end
184
+ [id, name]
185
+ end
186
+
187
+ # from RFC 2252
188
+ attribute_type_description_reserved_names =
189
+ ["NAME", "DESC", "OBSOLETE", "SUP", "EQUALITY", "ORDERING", "SUBSTR",
190
+ "SYNTAX", "SINGLE-VALUE", "COLLECTIVE", "NO-USER-MODIFICATION", "USAGE"]
191
+ syntax_description_reserved_names = ["DESC"]
192
+ object_class_description_reserved_names =
193
+ ["NAME", "DESC", "OBSOLETE", "SUP", "ABSTRACT", "STRUCTURAL",
194
+ "AUXILIARY", "MUST", "MAY"]
195
+ matching_rule_description_reserved_names =
196
+ ["NAME", "DESC", "OBSOLETE", "SYNTAX"]
197
+ matching_rule_use_description_reserved_names =
198
+ ["NAME", "DESC", "OBSOLETE", "APPLIES"]
199
+ private_experiment_reserved_names = ["X-[A-Z\\-_]+"]
200
+ reserved_names =
201
+ (attribute_type_description_reserved_names +
202
+ syntax_description_reserved_names +
203
+ object_class_description_reserved_names +
204
+ matching_rule_description_reserved_names +
205
+ matching_rule_use_description_reserved_names +
206
+ private_experiment_reserved_names).uniq
207
+ RESERVED_NAMES_RE = /(?:#{reserved_names.join('|')})/
208
+
209
+ def parse_attributes(str, attributes)
210
+ str.scan(/([A-Z\-_]+)\s+
211
+ (?:\(\s*(\w[\w\-;]*(?:\s+\$\s+\w[\w\-;]*)*)\s*\)|
212
+ \(\s*([^\)]*)\s*\)|
213
+ '([^\']*)'|
214
+ ((?!#{RESERVED_NAMES_RE})[a-zA-Z][a-zA-Z\d\-;]*)|
215
+ (\d[\d\.\{\}]+)|
216
+ ()
217
+ )/x
218
+ ) do |name, multi_amp, multi, string, literal, syntax, no_value|
219
+ case
220
+ when multi_amp
221
+ values = multi_amp.rstrip.split(/\s*\$\s*/)
222
+ when multi
223
+ values = multi.scan(/\s*'([^\']*)'\s*/).collect {|value| value[0]}
224
+ when string
225
+ values = [string]
226
+ when literal
227
+ values = [literal]
228
+ when syntax
229
+ values = [syntax]
230
+ when no_value
231
+ values = ["TRUE"]
232
+ end
233
+ attributes[normalize_attribute_name(name)] ||= []
234
+ attributes[normalize_attribute_name(name)].concat(values)
235
+ end
236
+ end
237
+
238
+ def alias_map(group)
239
+ ensure_parse(group)
240
+ return {} if @schema_info[group].nil?
241
+ @schema_info[group][:aliases] || {}
242
+ end
243
+
244
+ def ensure_parse(group)
245
+ return if @entries[group].nil?
246
+ unless @entries[group].empty?
247
+ fetch(group, 'nonexistent', 'nonexistent')
248
+ end
249
+ end
250
+
251
+ def normalize_schema_name(name)
252
+ name.downcase.sub(/;.*$/, '')
253
+ end
254
+
255
+ def normalize_attribute_name(name)
256
+ name.upcase.gsub(/_/, "-")
257
+ end
258
+
259
+ def default_entries
260
+ {
261
+ "objectClasses" => [],
262
+ "attributeTypes" => [],
263
+ "ldapSyntaxes" => [],
264
+ "dITContentRules" => [],
265
+ "matchingRules" => [],
266
+ }
267
+ end
268
+
269
+ def normalize_entries(entries)
270
+ normalized_entries = default_entries
271
+ normalized_keys = normalized_entries.keys
272
+ entries.each do |name, values|
273
+ normalized_name = normalized_keys.find do |key|
274
+ key.downcase == name
275
+ end
276
+ normalized_entries[normalized_name || name] = values
277
+ end
278
+ normalized_entries
279
+ end
280
+
281
+ class Entry
282
+ include Comparable
283
+
284
+ attr_reader :id, :name, :aliases, :description
285
+ def initialize(name, schema, group)
286
+ @schema = schema
287
+ @name, *@aliases = attribute("NAME", name)
288
+ @name ||= name
289
+ @id = @schema.resolve_name(group, @name)
290
+ collect_info
291
+ @schema = nil
292
+ end
293
+
294
+ def eql?(other)
295
+ self.class == other.class and
296
+ (id == other.id or
297
+ (id.nil? and other.nil? and name == other.name))
298
+ end
299
+
300
+ def hash
301
+ id.nil? ? name.hash : id.hash
302
+ end
303
+
304
+ def <=>(other)
305
+ name <=> other.name
306
+ end
307
+
308
+ def to_param
309
+ name
310
+ end
311
+ end
312
+
313
+ class Syntax < Entry
314
+ attr_reader :length
315
+ def initialize(id, schema)
316
+ if /\{(\d+)\}\z/ =~ id
317
+ id = $PREMATCH
318
+ @length = Integer($1)
319
+ else
320
+ @length = nil
321
+ end
322
+ super(id, schema, "ldapSyntaxes")
323
+ @id = id
324
+ @name = nil if @name == @id
325
+ @validator = Syntaxes[@id]
326
+ end
327
+
328
+ def binary_transfer_required?
329
+ @binary_transfer_required
330
+ end
331
+
332
+ def human_readable?
333
+ @human_readable
334
+ end
335
+
336
+ def valid?(value)
337
+ validate(value).nil?
338
+ end
339
+
340
+ def validate(value)
341
+ if @validator
342
+ @validator.validate(value)
343
+ else
344
+ nil
345
+ end
346
+ end
347
+
348
+ def type_cast(value)
349
+ if @validator
350
+ @validator.type_cast(value)
351
+ else
352
+ value
353
+ end
354
+ end
355
+
356
+ def normalize_value(value)
357
+ if @validator
358
+ @validator.normalize_value(value)
359
+ else
360
+ value
361
+ end
362
+ end
363
+
364
+ def <=>(other)
365
+ id <=> other.id
366
+ end
367
+
368
+ def to_param
369
+ id
370
+ end
371
+
372
+ private
373
+ def attribute(attribute_name, name=@name)
374
+ @schema.ldap_syntax_attribute(name, attribute_name)
375
+ end
376
+
377
+ def collect_info
378
+ @description = attribute("DESC")[0]
379
+ @binary_transfer_required =
380
+ (attribute('X-BINARY-TRANSFER-REQUIRED')[0] == 'TRUE')
381
+ @human_readable = (attribute('X-NOT-HUMAN-READABLE')[0] != 'TRUE')
382
+ end
383
+ end
384
+
385
+ class Attribute < Entry
386
+ include GetTextSupport
387
+ include HumanReadable
388
+
389
+ attr_reader :super_attribute
390
+ def initialize(name, schema)
391
+ super(name, schema, "attributeTypes")
392
+ end
393
+
394
+ # read_only?
395
+ #
396
+ # Returns true if an attribute is read-only
397
+ # NO-USER-MODIFICATION
398
+ def read_only?
399
+ @read_only
400
+ end
401
+
402
+ # single_value?
403
+ #
404
+ # Returns true if an attribute can only have one
405
+ # value defined
406
+ # SINGLE-VALUE
407
+ def single_value?
408
+ @single_value
409
+ end
410
+
411
+ # binary?
412
+ #
413
+ # Returns true if the given attribute's syntax
414
+ # is X-NOT-HUMAN-READABLE or X-BINARY-TRANSFER-REQUIRED
415
+ def binary?
416
+ @binary
417
+ end
418
+
419
+ # binary_required?
420
+ #
421
+ # Returns true if the value MUST be transferred in binary
422
+ def binary_required?
423
+ @binary_required
424
+ end
425
+
426
+ # directory_operation?
427
+ #
428
+ # Returns true if an attribute is directory operation.
429
+ # It means that USAGE contains directoryOperation.
430
+ def directory_operation?
431
+ @directory_operation
432
+ end
433
+
434
+ def syntax
435
+ @derived_syntax
436
+ end
437
+
438
+ def valid?(value)
439
+ validate(value).nil?
440
+ end
441
+
442
+ def validate(value)
443
+ error_info = validate_each_value(value)
444
+ return error_info if error_info
445
+ begin
446
+ normalize_value(value)
447
+ nil
448
+ rescue AttributeValueInvalid
449
+ [$!.message]
450
+ end
451
+ end
452
+
453
+ def type_cast(value)
454
+ send_to_syntax(value, :type_cast, value)
455
+ end
456
+
457
+ def normalize_value(value)
458
+ normalize_value_internal(value, false)
459
+ end
460
+
461
+ def syntax_description
462
+ send_to_syntax(nil, :description)
463
+ end
464
+
465
+ def human_attribute_name
466
+ self.class.human_attribute_name(self)
467
+ end
468
+
469
+ def human_attribute_description
470
+ self.class.human_attribute_description(self)
471
+ end
472
+
473
+ def to_hash
474
+ {
475
+ :read_only => read_only?,
476
+ :single_value => single_value?,
477
+ :binary => binary?,
478
+ :binary_required => binary_required?,
479
+ :directory_operation => directory_operation?,
480
+ :syntax => syntax,
481
+ :syntax_description => syntax_description,
482
+ }
483
+ end
484
+
485
+ private
486
+ def attribute(attribute_name, name=@name)
487
+ @schema.attribute_type(name, attribute_name)
488
+ end
489
+
490
+ def collect_info
491
+ @description = attribute("DESC")[0]
492
+ @super_attribute = attribute("SUP")[0]
493
+ if @super_attribute
494
+ @super_attribute = @schema.attribute(@super_attribute)
495
+ @super_attribute = nil if @super_attribute.id.nil?
496
+ end
497
+ @read_only = attribute('NO-USER-MODIFICATION')[0] == 'TRUE'
498
+ @single_value = attribute('SINGLE-VALUE')[0] == 'TRUE'
499
+ @syntax = attribute("SYNTAX")[0]
500
+ @syntax = @schema.ldap_syntax(@syntax) if @syntax
501
+ if @syntax
502
+ @binary_required = @syntax.binary_transfer_required?
503
+ @binary = (@binary_required or !@syntax.human_readable?)
504
+ @derived_syntax = @syntax
505
+ else
506
+ @binary_required = false
507
+ @binary = false
508
+ @derived_syntax = nil
509
+ @derived_syntax = @super_attribute.syntax if @super_attribute
510
+ end
511
+ @directory_operation = attribute("USAGE").include?("directoryOperation")
512
+ end
513
+
514
+ def send_to_syntax(default_value, method_name, *args)
515
+ _syntax = syntax
516
+ if _syntax
517
+ _syntax.send(method_name, *args)
518
+ else
519
+ default_value
520
+ end
521
+ end
522
+
523
+ def validate_each_value(value, option=nil)
524
+ failed_reason = nil
525
+ case value
526
+ when Hash
527
+ original_option = option
528
+ value.each do |sub_option, val|
529
+ opt = [original_option, sub_option].compact.join(";")
530
+ failed_reason, option = validate_each_value(val, opt)
531
+ break if failed_reason
532
+ end
533
+ when Array
534
+ original_option = option
535
+ value.each do |val|
536
+ failed_reason, option = validate_each_value(val, original_option)
537
+ break if failed_reason
538
+ end
539
+ else
540
+ failed_reason = send_to_syntax(nil, :validate, value)
541
+ end
542
+ return nil if failed_reason.nil?
543
+ [failed_reason, option]
544
+ end
545
+
546
+ def normalize_value_internal(value, have_binary_mark)
547
+ case value
548
+ when Array
549
+ normalize_array_value(value, have_binary_mark)
550
+ when Hash
551
+ normalize_hash_value(value, have_binary_mark)
552
+ else
553
+ if value.blank?
554
+ value = []
555
+ else
556
+ value = send_to_syntax(value, :normalize_value, value)
557
+ end
558
+ if !have_binary_mark and binary_required?
559
+ [{'binary' => value}]
560
+ else
561
+ value.is_a?(Array) ? value : [value]
562
+ end
563
+ end
564
+ end
565
+
566
+ def normalize_array_value(value, have_binary_mark)
567
+ if single_value? and value.reject {|v| v.is_a?(Hash)}.size > 1
568
+ format = _("Attribute %s can only have a single value: %s")
569
+ message = format % [human_attribute_name, value.inspect]
570
+ raise AttributeValueInvalid.new(self, value, message)
571
+ end
572
+ if value.empty?
573
+ if !have_binary_mark and binary_required?
574
+ [{'binary' => value}]
575
+ else
576
+ value
577
+ end
578
+ else
579
+ value.collect do |entry|
580
+ normalize_value_internal(entry, have_binary_mark)[0]
581
+ end
582
+ end
583
+ end
584
+
585
+ def normalize_hash_value(value, have_binary_mark)
586
+ if value.size > 1
587
+ format = _("Attribute %s: Hash must have one key-value pair only: %s")
588
+ message = format % [human_attribute_name, value.inspect]
589
+ raise AttributeValueInvalid.new(self, value, message)
590
+ end
591
+
592
+ if !have_binary_mark and binary_required? and !have_binary_key?(value)
593
+ [append_binary_key(value)]
594
+ else
595
+ key = value.keys[0]
596
+ have_binary_mark ||= key == "binary"
597
+ [{key => normalize_value_internal(value.values[0], have_binary_mark)}]
598
+ end
599
+ end
600
+
601
+ def have_binary_key?(hash)
602
+ key, value = hash.to_a[0]
603
+ return true if key == "binary"
604
+ return have_binary_key?(value) if value.is_a?(Hash)
605
+ false
606
+ end
607
+
608
+ def append_binary_key(hash)
609
+ key, value = hash.to_a[0]
610
+ if value.is_a?(Hash)
611
+ append_binary_key(value)
612
+ else
613
+ hash.merge(key => {"binary" => value})
614
+ end
615
+ end
616
+ end
617
+
618
+ class ObjectClass < Entry
619
+ attr_reader :super_classes
620
+ def initialize(name, schema)
621
+ super(name, schema, "objectClasses")
622
+ end
623
+
624
+ def super_class?(object_class)
625
+ @super_classes.include?(object_class)
626
+ end
627
+
628
+ def must(include_super_class=true)
629
+ if include_super_class
630
+ @all_must
631
+ else
632
+ @must
633
+ end
634
+ end
635
+
636
+ def may(include_super_class=true)
637
+ if include_super_class
638
+ @all_may
639
+ else
640
+ @may
641
+ end
642
+ end
643
+
644
+ private
645
+ def collect_info
646
+ @description = attribute("DESC")[0]
647
+ @super_classes = collect_super_classes
648
+ @must, @may, @all_must, @all_may = collect_attributes
649
+ end
650
+
651
+ def collect_super_classes
652
+ super_classes = attribute('SUP')
653
+ loop do
654
+ start_size = super_classes.size
655
+ new_super_classes = []
656
+ super_classes.each do |super_class|
657
+ new_super_classes.concat(attribute('SUP', super_class))
658
+ end
659
+
660
+ super_classes.concat(new_super_classes)
661
+ super_classes.uniq!
662
+ break if super_classes.size == start_size
663
+ end
664
+ super_classes.collect do |name|
665
+ @schema.object_class(name)
666
+ end
667
+ end
668
+
669
+ UNWRITABLE_MUST_ATTRIBUTES = ["nTSecurityDescriptor"]
670
+ def collect_attributes
671
+ must = attribute('MUST').reject do |name|
672
+ UNWRITABLE_MUST_ATTRIBUTES.include?(name)
673
+ end.uniq
674
+ must = must.collect {|name| @schema.attribute(name)}
675
+ may = attribute('MAY').uniq.collect {|name| @schema.attribute(name)}
676
+
677
+ all_must = must.dup
678
+ all_may = may.dup
679
+ @super_classes.each do |super_class|
680
+ all_must.concat(super_class.must(false))
681
+ all_may.concat(super_class.may(false))
682
+ end
683
+
684
+ # Clean out the dupes.
685
+ all_must.uniq!
686
+ all_may.uniq!
687
+
688
+ [must, may, all_must, all_may]
689
+ end
690
+
691
+ def attribute(attribute_name, name=@name)
692
+ @schema.object_class_attribute(name, attribute_name) +
693
+ @schema.dit_content_rule_attribute(name, attribute_name)
694
+ end
695
+ end
696
+ end
697
+ end
698
+
699
+ require 'active_ldap/schema/syntaxes'