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,17 @@
1
+ require 'timeout'
2
+
3
+ module Timeout
4
+ # STUB
5
+ def Timeout.alarm(sec, exception=Timeout::Error, &block)
6
+ timeout(sec, exception, &block)
7
+ end
8
+ end # Timeout
9
+
10
+ if __FILE__ == $0
11
+ require 'time'
12
+ Timeout.alarm(2) do
13
+ loop do
14
+ p Time.now
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,92 @@
1
+ require 'English'
2
+ require 'digest/md5'
3
+ require 'digest/sha1'
4
+
5
+ module ActiveLdap
6
+ module UserPassword
7
+ module_function
8
+ def valid?(password, hashed_password)
9
+ unless /^\{([A-Z][A-Z\d]+)\}/ =~ hashed_password
10
+ raise ArgumentError, _("Invalid hashed password: %s") % hashed_password
11
+ end
12
+ type = $1
13
+ hashed_password_without_type = $POSTMATCH
14
+ normalized_type = type.downcase
15
+ unless respond_to?(normalized_type)
16
+ raise ArgumentError, _("Unknown Hash type: %s") % type
17
+ end
18
+ salt_extractor = "extract_salt_for_#{normalized_type}"
19
+ if respond_to?(salt_extractor)
20
+ salt = send(salt_extractor, hashed_password_without_type)
21
+ if salt.nil?
22
+ raise ArgumentError,
23
+ _("Can't extract salt from hashed password: %s") % hashed_password
24
+ end
25
+ generated_password = send(normalized_type, password, salt)
26
+ else
27
+ generated_password = send(normalized_type, password)
28
+ end
29
+ hashed_password == generated_password
30
+ end
31
+
32
+ def crypt(password, salt=nil)
33
+ salt ||= "$1$#{Salt.generate(8)}"
34
+ "{CRYPT}#{password.crypt(salt)}"
35
+ end
36
+
37
+ def extract_salt_for_crypt(crypted_password)
38
+ if /^\$1\$/ =~ crypted_password
39
+ $MATCH + $POSTMATCH[0, 8].sub(/\$.*/, '') + "$"
40
+ else
41
+ crypted_password[0, 2]
42
+ end
43
+ end
44
+
45
+ def md5(password)
46
+ "{MD5}#{[Digest::MD5.digest(password)].pack('m').chomp}"
47
+ end
48
+
49
+ def smd5(password, salt=nil)
50
+ if salt and salt.size != 4
51
+ raise ArgumentError, _("salt size must be == 4: %s") % salt.inspect
52
+ end
53
+ salt ||= Salt.generate(4)
54
+ md5_hash_with_salt = "#{Digest::MD5.digest(password + salt)}#{salt}"
55
+ "{SMD5}#{[md5_hash_with_salt].pack('m').chomp}"
56
+ end
57
+
58
+ def extract_salt_for_smd5(smd5ed_password)
59
+ Base64.decode64(smd5ed_password)[-4, 4]
60
+ end
61
+
62
+ def sha(password)
63
+ "{SHA}#{[Digest::SHA1.digest(password)].pack('m').chomp}"
64
+ end
65
+
66
+ def ssha(password, salt=nil)
67
+ if salt and salt.size != 4
68
+ raise ArgumentError, _("salt size must be == 4: %s") % salt.inspect
69
+ end
70
+ salt ||= Salt.generate(4)
71
+ sha1_hash_with_salt = "#{Digest::SHA1.digest(password + salt)}#{salt}"
72
+ "{SSHA}#{[sha1_hash_with_salt].pack('m').chomp}"
73
+ end
74
+
75
+ def extract_salt_for_ssha(sshaed_password)
76
+ extract_salt_for_smd5(sshaed_password)
77
+ end
78
+
79
+ module Salt
80
+ CHARS = ['.', '/'] + ['0'..'9', 'A'..'Z', 'a'..'z'].collect do |x|
81
+ x.to_a
82
+ end.flatten
83
+
84
+ module_function
85
+ def generate(length)
86
+ salt = ""
87
+ length.times {salt << CHARS[rand(CHARS.length)]}
88
+ salt
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,229 @@
1
+ module ActiveLdap
2
+ module Validations
3
+ def self.append_features(base)
4
+ super
5
+
6
+ base.class_eval do
7
+ alias_method :new_record?, :new_entry?
8
+ class << self
9
+ alias_method :human_attribute_name_active_ldap,
10
+ :human_attribute_name
11
+ end
12
+ include ActiveRecord::Validations
13
+ class << self
14
+ alias_method :human_attribute_name_active_record,
15
+ :human_attribute_name
16
+ alias_method :human_attribute_name,
17
+ :human_attribute_name_active_ldap
18
+ unless method_defined?(:human_attribute_name_with_gettext)
19
+ def human_attribute_name_with_gettext(attribute_key_name)
20
+ s_("#{self}|#{attribute_key_name.humanize}")
21
+ end
22
+ end
23
+ end
24
+
25
+ class_local_attr_accessor true, :validation_skip_attributes
26
+ remove_method :validation_skip_attributes
27
+ self.validation_skip_attributes = []
28
+
29
+ validate :validate_duplicated_dn_creation, :on => :create
30
+ validate :validate_duplicated_dn_rename, :on => :update
31
+ validate :validate_dn
32
+ validate :validate_excluded_classes
33
+ validate :validate_required_ldap_values
34
+ validate :validate_ldap_values
35
+
36
+ class << self
37
+ if method_defined?(:evaluate_condition)
38
+ def evaluate_condition_with_active_ldap_support(condition, entry)
39
+ evaluate_condition_without_active_ldap_support(condition, entry)
40
+ rescue ActiveRecord::ActiveRecordError
41
+ raise Error, $!.message
42
+ end
43
+ alias_method_chain :evaluate_condition, :active_ldap_support
44
+ end
45
+ end
46
+
47
+ def save_with_active_ldap_support!
48
+ save_without_active_ldap_support!
49
+ rescue ActiveRecord::RecordInvalid
50
+ raise EntryInvalid, $!.message
51
+ end
52
+ alias_method_chain :save!, :active_ldap_support
53
+
54
+ private
55
+ def run_validations_with_active_ldap_support(validation_method)
56
+ run_validations_without_active_ldap_support(validation_method)
57
+ rescue ActiveRecord::ActiveRecordError
58
+ raise Error, $!.message
59
+ end
60
+ if private_method_defined?(:run_validations)
61
+ alias_method_chain :run_validations, :active_ldap_support
62
+ else
63
+ alias_method(:run_callbacks_with_active_ldap_support,
64
+ :run_validations_with_active_ldap_support)
65
+ alias_method_chain :run_callbacks, :active_ldap_support
66
+ alias_method(:run_validations_without_active_ldap_support,
67
+ :run_callbacks_without_active_ldap_support)
68
+ end
69
+ end
70
+ end
71
+
72
+ def validation_skip_attributes
73
+ @validation_skip_attributes ||= []
74
+ end
75
+
76
+ def validation_skip_attributes=(attributes)
77
+ @validation_skip_attributes = attributes
78
+ end
79
+
80
+ private
81
+ def format_validation_message(format, parameters)
82
+ format % parameters
83
+ end
84
+
85
+ def validate_duplicated_dn_creation
86
+ _dn = nil
87
+ begin
88
+ _dn = dn
89
+ rescue DistinguishedNameInvalid, DistinguishedNameNotSetError
90
+ return
91
+ end
92
+ if _dn and exist?
93
+ format = _("is duplicated: %s")
94
+ message = format_validation_message(format, _dn)
95
+ errors.add("distinguishedName", message)
96
+ end
97
+ end
98
+
99
+ def validate_duplicated_dn_rename
100
+ _dn_attribute = dn_attribute_with_fallback
101
+ original_dn_value = @ldap_data[_dn_attribute]
102
+ current_dn_value = @data[_dn_attribute]
103
+ return if original_dn_value == current_dn_value
104
+ return if original_dn_value == [current_dn_value]
105
+
106
+ _dn = nil
107
+ begin
108
+ _dn = dn
109
+ rescue DistinguishedNameInvalid, DistinguishedNameNotSetError
110
+ return
111
+ end
112
+ if _dn and exist?
113
+ format = _("is duplicated: %s")
114
+ message = format_validation_message(format, _dn)
115
+ errors.add("distinguishedName", message)
116
+ end
117
+ end
118
+
119
+ def validate_dn
120
+ dn
121
+ rescue DistinguishedNameInvalid
122
+ format = _("is invalid: %s")
123
+ message = format_validation_message(format, $!.message)
124
+ errors.add("distinguishedName", message)
125
+ rescue DistinguishedNameNotSetError
126
+ format = _("isn't set: %s")
127
+ message = format_validation_message(format, $!.message)
128
+ errors.add("distinguishedName", message)
129
+ end
130
+
131
+ def validate_excluded_classes
132
+ excluded_classes = self.class.excluded_classes
133
+ return if excluded_classes.empty?
134
+
135
+ _schema = schema
136
+ _classes = classes.collect do |name|
137
+ _schema.object_class(name)
138
+ end
139
+ unexpected_classes = excluded_classes.inject([]) do |classes, name|
140
+ excluded_class = _schema.object_class(name)
141
+ if _classes.include?(excluded_class)
142
+ classes << excluded_class
143
+ end
144
+ classes
145
+ end
146
+ return if unexpected_classes.empty?
147
+
148
+ names = unexpected_classes.collect do |object_class|
149
+ self.class.human_object_class_name(object_class)
150
+ end
151
+ format = n_("has excluded value: %s",
152
+ "has excluded values: %s",
153
+ names.size)
154
+ message = format_validation_message(format, names.join(", "))
155
+ errors.add("objectClass", message)
156
+ end
157
+
158
+ # validate_required_ldap_values
159
+ #
160
+ # Basic validation:
161
+ # - Verify that every 'MUST' specified in the schema has a value defined
162
+ def validate_required_ldap_values
163
+ _schema = nil
164
+ @validation_skip_attributes ||= []
165
+ _validation_skip_attributes =
166
+ @validation_skip_attributes +
167
+ (self.class.validation_skip_attributes || [])
168
+ # Make sure all MUST attributes have a value
169
+ entry_attribute.object_classes.each do |object_class|
170
+ object_class.must.each do |required_attribute|
171
+ # Normalize to ensure we catch schema problems
172
+ # needed?
173
+ real_name = to_real_attribute_name(required_attribute.name, true)
174
+ raise UnknownAttribute.new(required_attribute) if real_name.nil?
175
+
176
+ next if required_attribute.read_only?
177
+ next if _validation_skip_attributes.include?(real_name)
178
+
179
+ value = @data[real_name] || []
180
+ next unless self.class.blank_value?(value)
181
+
182
+ _schema ||= schema
183
+ aliases = required_attribute.aliases.collect do |name|
184
+ self.class.human_attribute_name(name)
185
+ end
186
+ args = [self.class.human_object_class_name(object_class)]
187
+ if aliases.empty?
188
+ format = _("is required attribute by objectClass '%s'")
189
+ else
190
+ format = _("is required attribute by objectClass " \
191
+ "'%s': aliases: %s")
192
+ args << aliases.join(', ')
193
+ end
194
+ message = format_validation_message(format, args)
195
+ errors.add(real_name, message)
196
+ end
197
+ end
198
+ end
199
+
200
+ def validate_ldap_values
201
+ entry_attribute.schemata.each do |name, attribute|
202
+ value = self[name]
203
+ next if self.class.blank_value?(value)
204
+ validate_ldap_value(attribute, name, value)
205
+ end
206
+ end
207
+
208
+ def validate_ldap_value(attribute, name, value)
209
+ failed_reason, option = attribute.validate(value)
210
+ return if failed_reason.nil?
211
+ if attribute.binary?
212
+ inspected_value = _("<binary-value>")
213
+ else
214
+ inspected_value = self.class.human_readable_format(value)
215
+ end
216
+ params = [inspected_value,
217
+ self.class.human_syntax_description(attribute.syntax),
218
+ failed_reason]
219
+ if option
220
+ format = _("(%s) has invalid format: %s: required syntax: %s: %s")
221
+ else
222
+ format = _("has invalid format: %s: required syntax: %s: %s")
223
+ end
224
+ params.unshift(option) if option
225
+ message = format_validation_message(format, params)
226
+ errors.add(name, message)
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,122 @@
1
+ require 'erb'
2
+ require 'builder'
3
+
4
+ require 'active_ldap/ldif'
5
+
6
+ module ActiveLdap
7
+ class Xml
8
+ class Serializer
9
+ PRINTABLE_STRING = /[\x20-\x7e\w\s]*/
10
+
11
+ def initialize(dn, attributes, schema, options={})
12
+ @dn = dn
13
+ @attributes = attributes
14
+ @schema = schema
15
+ @options = options
16
+ end
17
+
18
+ def to_s
19
+ root = @options[:root]
20
+ indent = @options[:indent] || 2
21
+ xml = @options[:builder] || Builder::XmlMarkup.new(:indent => indent)
22
+ xml.tag!(root) do
23
+ target_attributes.each do |key, values|
24
+ values = normalize_values(values).sort_by {|value, _| value}
25
+ if @schema.attribute(key).single_value?
26
+ serialize_attribute_value(xml, key, *values[0])
27
+ else
28
+ serialize_attribute_values(xml, key, values)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+ def target_attributes
36
+ except_dn = false
37
+ attributes = @attributes.dup
38
+ (@options[:except] || []).each do |name|
39
+ if name == "dn"
40
+ except_dn = true
41
+ else
42
+ attributes.delete(name)
43
+ end
44
+ end
45
+ attributes = attributes.sort_by {|key, values| key}
46
+ attributes.unshift(["dn", [@dn]]) unless except_dn
47
+ attributes
48
+ end
49
+
50
+ def normalize_values(values)
51
+ targets = []
52
+ values.each do |value|
53
+ targets.concat(normalize_value(value))
54
+ end
55
+ targets
56
+ end
57
+
58
+ def normalize_value(value, options=[])
59
+ targets = []
60
+ case value
61
+ when Hash
62
+ value.each do |real_option, real_value|
63
+ targets.concat(normalize_value(real_value, options + [real_option]))
64
+ end
65
+ when Array
66
+ value.each do |real_value|
67
+ targets.concat(normalize_value(real_value, options))
68
+ end
69
+ when DN
70
+ targets.concat(normalize_value(value.to_s, options))
71
+ when nil
72
+ # ignore
73
+ else
74
+ if /\A#{PRINTABLE_STRING}\z/ !~ value
75
+ value = [value].pack("m").gsub(/\n/u, '')
76
+ options += ["base64"]
77
+ end
78
+ xml_attributes = {}
79
+ options.each do |name, val|
80
+ xml_attributes[name] = val || "true"
81
+ end
82
+ targets << [value, xml_attributes]
83
+ end
84
+ targets
85
+ end
86
+
87
+ def serialize_attribute_values(xml, name, values)
88
+ return if values.blank?
89
+
90
+ if name == "dn" or @options[:type].to_s.downcase == "ldif"
91
+ values.each do |value, xml_attributes|
92
+ serialize_attribute_value(xml, name, value, xml_attributes)
93
+ end
94
+ else
95
+ plural_name = name.pluralize
96
+ attributes = @options[:skip_types] ? {} : {"type" => "array"}
97
+ xml.tag!(plural_name, attributes) do
98
+ values.each do |value, xml_attributes|
99
+ serialize_attribute_value(xml, name, value, xml_attributes)
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ def serialize_attribute_value(xml, name, value, xml_attributes)
106
+ xml.tag!(name, value, xml_attributes)
107
+ end
108
+ end
109
+
110
+ def initialize(dn, attributes, schema)
111
+ @dn = dn
112
+ @attributes = attributes
113
+ @schema = schema
114
+ end
115
+
116
+ def to_s(options={})
117
+ Serializer.new(@dn, @attributes, @schema, options).to_s
118
+ end
119
+ end
120
+
121
+ XML = Xml
122
+ end