activeldap 1.0.2 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/CHANGES +32 -0
  2. data/README +8 -1
  3. data/data/locale/en/LC_MESSAGES/active-ldap.mo +0 -0
  4. data/data/locale/ja/LC_MESSAGES/active-ldap.mo +0 -0
  5. data/examples/al-admin/app/controllers/{application.rb → application_controller.rb} +3 -1
  6. data/examples/al-admin/app/views/account/sign_up.html.erb +6 -5
  7. data/examples/al-admin/config/boot.rb +1 -0
  8. data/examples/al-admin/config/environment.rb +4 -2
  9. data/examples/al-admin/config.ru +7 -0
  10. data/examples/al-admin/lib/ldap_test_helper.rb +38 -0
  11. data/examples/al-admin/lib/tasks/gettext.rake +3 -2
  12. data/examples/al-admin/lib/tasks/testing.rake +10 -0
  13. data/examples/al-admin/po/en/al-admin.po +4 -4
  14. data/examples/al-admin/po/ja/al-admin.po +4 -4
  15. data/examples/al-admin/po/nl/al-admin.po +3 -3
  16. data/examples/al-admin/public/dispatch.cgi +2 -2
  17. data/examples/al-admin/public/dispatch.fcgi +1 -1
  18. data/examples/al-admin/public/dispatch.rb +2 -2
  19. data/examples/al-admin/test/functional/account_controller_test.rb +2 -14
  20. data/examples/al-admin/test/functional/attributes_controller_test.rb +2 -12
  21. data/examples/al-admin/test/functional/directory_controller_test.rb +2 -12
  22. data/examples/al-admin/test/functional/object_classes_controller_test.rb +2 -12
  23. data/examples/al-admin/test/functional/syntaxes_controller_test.rb +2 -12
  24. data/examples/al-admin/test/functional/users_controller_test.rb +2 -12
  25. data/examples/al-admin/test/functional/welcome_controller_test.rb +2 -12
  26. data/examples/al-admin/test/integration/sign_up_test.rb +44 -0
  27. data/examples/al-admin/test/run-test.sh +1 -1
  28. data/examples/al-admin/test/test_helper.rb +25 -1
  29. data/examples/al-admin/test/unit/user_test.rb +1 -2
  30. data/examples/groupadd +2 -2
  31. data/examples/groupdel +2 -2
  32. data/examples/groupls +2 -2
  33. data/examples/groupmod +2 -2
  34. data/examples/lpasswd +2 -2
  35. data/examples/objects/group.rb +2 -2
  36. data/examples/objects/user.rb +1 -1
  37. data/examples/ouadd +2 -2
  38. data/examples/useradd +2 -2
  39. data/examples/useradd-binary +6 -3
  40. data/examples/userdel +2 -2
  41. data/examples/userls +2 -2
  42. data/examples/usermod +2 -2
  43. data/examples/usermod-binary-add +6 -3
  44. data/examples/usermod-binary-add-time +6 -3
  45. data/examples/usermod-binary-del +2 -2
  46. data/examples/usermod-lang-add +2 -2
  47. data/lib/active_ldap/adapter/base.rb +47 -23
  48. data/lib/active_ldap/adapter/jndi.rb +30 -28
  49. data/lib/active_ldap/adapter/jndi_connection.rb +6 -0
  50. data/lib/active_ldap/adapter/ldap.rb +25 -26
  51. data/lib/active_ldap/adapter/net_ldap.rb +28 -33
  52. data/lib/active_ldap/adapter/net_ldap_ext.rb +0 -6
  53. data/lib/active_ldap/association/proxy.rb +2 -1
  54. data/lib/active_ldap/attributes.rb +31 -0
  55. data/lib/active_ldap/base.rb +75 -31
  56. data/lib/active_ldap/compatible.rb +44 -0
  57. data/lib/active_ldap/configuration.rb +3 -3
  58. data/lib/active_ldap/connection.rb +41 -12
  59. data/lib/active_ldap/distinguished_name.rb +1 -0
  60. data/lib/active_ldap/get_text.rb +0 -7
  61. data/lib/active_ldap/ldif.rb +59 -44
  62. data/lib/active_ldap/operations.rb +41 -10
  63. data/lib/active_ldap/schema.rb +41 -6
  64. data/lib/active_ldap/user_password.rb +7 -7
  65. data/lib/active_ldap/validations.rb +24 -12
  66. data/lib/active_ldap/xml.rb +2 -2
  67. data/lib/active_ldap.rb +120 -139
  68. data/po/en/active-ldap.po +5 -5
  69. data/po/ja/active-ldap.po +5 -5
  70. data/rails/README +2 -2
  71. data/rails/init.rb +2 -2
  72. data/test/al-test-utils.rb +11 -4
  73. data/test/run-test.rb +6 -2
  74. data/test/test_associations.rb +4 -4
  75. data/test/test_attributes.rb +3 -1
  76. data/test/test_base.rb +75 -15
  77. data/test/test_base_per_instance.rb +7 -1
  78. data/test/test_bind.rb +4 -4
  79. data/test/test_connection.rb +36 -14
  80. data/test/test_connection_per_class.rb +5 -5
  81. data/test/test_connection_per_dn.rb +11 -5
  82. data/test/test_groupadd.rb +2 -2
  83. data/test/test_groupdel.rb +2 -2
  84. data/test/test_groupls.rb +1 -1
  85. data/test/test_groupmod.rb +2 -2
  86. data/test/test_ldif.rb +11 -1
  87. data/test/test_schema.rb +38 -2
  88. data/test/test_syntax.rb +12 -2
  89. data/test/test_useradd-binary.rb +1 -0
  90. data/test/test_usermod-binary-add-time.rb +1 -0
  91. data/test/test_usermod-binary-add.rb +1 -0
  92. data/test/test_validation.rb +24 -13
  93. data/test-unit/lib/test/unit/assertions.rb +97 -14
  94. data/test-unit/lib/test/unit/autorunner.rb +20 -4
  95. data/test-unit/lib/test/unit/priority.rb +21 -1
  96. data/test-unit/lib/test/unit/ui/console/testrunner.rb +7 -4
  97. data/test-unit/test/test_assertions.rb +52 -5
  98. metadata +10 -14
  99. data/rails/plugin/active_ldap/README +0 -54
  100. data/rails/plugin/active_ldap/generators/README +0 -2
  101. data/rails/plugin/active_ldap/generators/model_active_ldap/USAGE +0 -17
  102. data/rails/plugin/active_ldap/generators/model_active_ldap/model_active_ldap_generator.rb +0 -70
  103. data/rails/plugin/active_ldap/generators/model_active_ldap/templates/fixtures.yml +0 -11
  104. data/rails/plugin/active_ldap/generators/model_active_ldap/templates/model_active_ldap.rb +0 -3
  105. data/rails/plugin/active_ldap/generators/model_active_ldap/templates/unit_test.rb +0 -10
  106. data/rails/plugin/active_ldap/generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb +0 -7
  107. data/rails/plugin/active_ldap/generators/scaffold_al/scaffold_al_generator.rb +0 -20
  108. data/rails/plugin/active_ldap/init.rb +0 -36
  109. data/rails_generators/scaffold_al/scaffold_al_generator.rb +0 -20
data/lib/active_ldap.rb CHANGED
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/ruby
2
- # = Ruby/ActiveLdap
2
+ # = ActiveLdap
3
3
  #
4
- # "Ruby/ActiveLdap" Copyright (C) 2004,2005 Will Drewry mailto:will@alum.bu.edu
4
+ # "ActiveLdap" Copyright (C) 2004,2005 Will Drewry mailto:will@alum.bu.edu
5
+ # Copyright (C) 2006-2009 Kouhei Sutou <kou@cozmixng.org>
5
6
  #
6
7
  # == Introduction
7
8
  #
8
- # Ruby/ActiveLdap is a novel way of interacting with LDAP. Most interaction with
9
+ # ActiveLdap is a novel way of interacting with LDAP. Most interaction with
9
10
  # LDAP is done using clunky LDIFs, web interfaces, or with painful APIs that
10
- # required a thick reference manual nearby. Ruby/ActiveLdap aims to fix that.
11
- # Inspired by ActiveRecord[http://activerecord.rubyonrails.org], Ruby/ActiveLdap provides an
11
+ # required a thick reference manual nearby. ActiveLdap aims to fix that.
12
+ # Inspired by ActiveRecord[http://activerecord.rubyonrails.org], ActiveLdap provides an
12
13
  # object oriented interface to LDAP entries.
13
14
  #
14
15
  # The target audience is system administrators and LDAP users everywhere that
@@ -29,40 +30,38 @@
29
30
  # * RFC1777[http://www.faqs.org/rfcs/rfc1777.html] - Lightweight Directory Access Protocol
30
31
  # * OpenLDAP[http://www.openldap.org]
31
32
  #
32
- # === So why use Ruby/ActiveLdap?
33
+ # === So why use ActiveLdap?
33
34
  #
34
35
  # Well if you like to fumble around in the dark, dank innards of LDAP, you can
35
36
  # quit reading now. However, if you'd like a cleaner way to integrate LDAP in to
36
- # your existing code, hopefully that's why you'll want to use Ruby/ActiveLdap.
37
+ # your existing code, hopefully that's why you'll want to use ActiveLdap.
37
38
  #
38
39
  # Using LDAP directly (even with the excellent Ruby/LDAP), leaves you bound to
39
40
  # the world of the predefined LDAP API. While this API is important for many
40
41
  # reasons, having to extract code out of LDAP search blocks and create huge
41
42
  # arrays of LDAP.mod entries make code harder to read, less intuitive, and just
42
- # less fun to write. Hopefully, Ruby/ActiveLdap will remedy all of these
43
+ # less fun to write. Hopefully, ActiveLdap will remedy all of these
43
44
  # problems!
44
45
  #
45
46
  # == Getting Started
46
47
  #
47
- # Ruby/ActiveLdap does have some overhead when you get started. You must not
48
+ # ActiveLdap does have some overhead when you get started. You must not
48
49
  # only install the package and all of it's requirements, but you must also make
49
50
  # customizations that will let it work in your environment.
50
51
  #
51
52
  # === Requirements
52
53
  #
53
- # * Ruby[http://www.ruby-lang.org] 1.8.x
54
- # * Ruby/LDAP[http://ruby-ldap.sourceforge.net]
55
- # * (Optional) Ruby/LDAP+GSSAPI[http://caliban.org/files/redhat/RPMS/i386/ruby-ldap-0.8.2-4.i386.rpm]
56
- # * An LDAP server compatible with Ruby/LDAP: OpenLDAP[http://www.openldap.org], etc
54
+ # * A Ruby implementation: Ruby[http://www.ruby-lang.org] 1.8.x, 1.9.1 or JRuby[http://jruby.codehaus.org/]
55
+ # * A LDAP library: Ruby/LDAP[http://code.google.com/p/ruby-activeldap/wiki/RubyLDAP] (for Ruby), Net::LDAP[http://rubyforge.org/projects/net-ldap/] (for Ruby or JRuby) or JNDI (for JRuby)
56
+ # * A LDAP server: OpenLDAP[http://www.openldap.org], etc
57
57
  # - Your LDAP server must allow root_dse queries to allow for schema queries
58
- # * Examples also require: Ruby/Password[http://raa.ruby-lang.org/project/ruby-password/]
59
58
  #
60
59
  # === Installation
61
60
  #
62
61
  # Assuming all the requirements are installed, you can install by grabbing the latest tgz file from
63
62
  # the download site[http://rubyforge.org/frs/?group_id=381].
64
63
  #
65
- # The following steps will get the Ruby/ActiveLdap installed in no time!
64
+ # The following steps will get the ActiveLdap installed in no time!
66
65
  #
67
66
  # $ tar -xzvf ruby-activeldap-current.tgz
68
67
  # $ cd ruby-activeldap-VERSION
@@ -90,7 +89,7 @@
90
89
  #
91
90
  # === Customizations
92
91
  #
93
- # Now that Ruby/ActiveLdap is installed and working, we still have a few more
92
+ # Now that ActiveLdap is installed and working, we still have a few more
94
93
  # steps to make it useful for programming.
95
94
  #
96
95
  # Let's say that you are writing a Ruby program for managing user and group
@@ -116,7 +115,7 @@
116
115
  #
117
116
  # == Usage
118
117
  #
119
- # This section covers using Ruby/ActiveLdap from writing extension classes to
118
+ # This section covers using ActiveLdap from writing extension classes to
120
119
  # writing applications that use them.
121
120
  #
122
121
  # Just to give a taste of what's to come, here is a quick example using irb:
@@ -126,7 +125,7 @@
126
125
  # Here's an extension class that maps to the LDAP Group objects:
127
126
  #
128
127
  # irb> class Group < ActiveLdap::Base
129
- # irb* ldap_mapping
128
+ # irb* ldap_mapping
130
129
  # irb* end
131
130
  #
132
131
  # Here is the Group class in use:
@@ -135,10 +134,7 @@
135
134
  # => ["root", "daemon", "bin", "sys", "adm", "tty", ..., "develop"]
136
135
  #
137
136
  # irb> group = Group.find("develop")
138
- # => #<Group:0x..........>
139
- #
140
- # irb> group.members.collect {|member| member.uid}
141
- # => ["drewry"]
137
+ # => #<Group objectClass:<...> ...>
142
138
  #
143
139
  # irb> group.cn
144
140
  # => "develop"
@@ -155,7 +151,7 @@
155
151
  #
156
152
  # ==== Why do I need them?
157
153
  #
158
- # Extension classes are what make Ruby/ActiveLdap "active"! They do all the
154
+ # Extension classes are what make ActiveLdap "active"! They do all the
159
155
  # background work to make easy-to-use objects by mapping the LDAP object's
160
156
  # attributes on to a Ruby class.
161
157
  #
@@ -169,7 +165,7 @@
169
165
  # ===== ldap_mapping
170
166
  #
171
167
  # ldap_mapping is the only required method to setup an extension class for use
172
- # with Ruby/ActiveLdap. It must be called inside of a subclass as shown above.
168
+ # with ActiveLdap. It must be called inside of a subclass as shown above.
173
169
  #
174
170
  # Below is a much more realistic Group class:
175
171
  #
@@ -208,9 +204,9 @@
208
204
  # for dn_attribute matches.
209
205
  # (e.g. cn=develop,ou=DevGroups,ou=Groups,dc=dataspill,dc=org)
210
206
  #
211
- # Something's missing: :classes. :classes is used to tell Ruby/ActiveLdap what
207
+ # Something's missing: :classes. :classes is used to tell ActiveLdap what
212
208
  # the minimum requirement is when creating a new object. LDAP uses objectClasses
213
- # to define what attributes a LDAP object may have. Ruby/ActiveLdap needs to know
209
+ # to define what attributes a LDAP object may have. ActiveLdap needs to know
214
210
  # what classes are required when creating a new object. Of course, you can leave
215
211
  # that field out to default to ['top'] only. Then you can let each application
216
212
  # choose what objectClasses their objects should have by calling the method e.g.
@@ -222,8 +218,8 @@
222
218
  # may help avoid programmer error later.
223
219
  #
224
220
  # :classes isn't the only optional argument. If :dn_attribute is left off,
225
- # it defaults to underscored class name or 'cn'. If :prefix is left off,
226
- # it will default to 'ou=PLURALIZED_CLASSNAME'. In this
221
+ # it defaults to super class's value or 'cn'. If :prefix is left off,
222
+ # it will default to 'ou=PluralizedClassName'. In this
227
223
  # case, it would be 'ou=Groups'.
228
224
  #
229
225
  # :classes should be an Array. :dn_attribute should be a String and so should
@@ -256,7 +252,7 @@
256
252
  #
257
253
  # irb> class User < ActiveLdap::Base
258
254
  # irb* ldap_mapping :dn_attribute => 'uid', :prefix => 'People', :classes => ['top','account']
259
- # irb* belongs_to :groups, :class => 'Group', :many => 'memberUid', :foreign_key => 'uid'
255
+ # irb* belongs_to :groups, :class_name => 'Group', :many => 'memberUid', :foreign_key => 'uid'
260
256
  # irb* end
261
257
  #
262
258
  # Now, class User will have a method called 'groups' which will retrieve all
@@ -264,7 +260,7 @@
264
260
  #
265
261
  # irb> me = User.find('drewry')
266
262
  # irb> me.groups
267
- # => [#<Group:0x000001 ...>, #<Group:0x000002 ...>, ...]
263
+ # => [#<Group ...>, #<Group ...>, ...]
268
264
  # irb> me.groups.each { |group| p group.cn };nil
269
265
  # "cdrom"
270
266
  # "audio"
@@ -284,18 +280,18 @@
284
280
  # Now let's talk about the arguments. The first argument is the name of the
285
281
  # method you wish to create. In this case, we created a method called groups
286
282
  # using the symbol :groups. The next collection of arguments are actually a Hash
287
- # (as with ldap_mapping). :class should be a string that has the name of a
283
+ # (as with ldap_mapping). :class_name should be a string that has the name of a
288
284
  # class you've already included. If you class is inside of a module, be sure to
289
- # put the whole name, e.g. :class => "MyLdapModule::Group". :primary_key
285
+ # put the whole name, e.g. :class_name => "MyLdapModule::Group". :foreign_key
290
286
  # tells belongs_to what attribute Group objects have that match the
291
287
  # :many. :many is the name of the local attribute whose value
292
- # should be looked up in Group under the primary key. If :foreign_key is left
288
+ # should be looked up in Group under the foreign key. If :foreign_key is left
293
289
  # off of the argument list, it is assumed to be the dn_attribute. With this in
294
290
  # mind, the above definition could become:
295
291
  #
296
292
  # irb> class User < ActiveLdap::Base
297
293
  # irb* ldap_mapping :dn_attribute => 'uid', :prefix => 'People', :classes => ['top','account']
298
- # irb* belongs_to :groups, :class => 'Group', :many => 'memberUid'
294
+ # irb* belongs_to :groups, :class_name => 'Group', :many => 'memberUid'
299
295
  # irb* end
300
296
  #
301
297
  # In addition, you can do simple membership tests by doing the following:
@@ -314,7 +310,7 @@
314
310
  #
315
311
  # class Group < ActiveLdap::Base
316
312
  # ldap_mapping :dn_attribute => 'cn', :prefix => 'ou=Groups', :classes => ['top', 'posixGroup']
317
- # has_many :members, :class => "User", :wrap => "memberUid", :primary_key => 'uid'
313
+ # has_many :members, :class_name => "User", :wrap => "memberUid", :primary_key => 'uid'
318
314
  # end
319
315
  #
320
316
  # Now we can see that group develop has user 'drewry' as a member, and it can
@@ -323,13 +319,13 @@
323
319
  # irb> develop = Group.find('develop')
324
320
  # => ...
325
321
  # irb> develop.members
326
- # => [#<User:0x000001 ...>, #<User:...>]
322
+ # => [#<User ...>, #<User ...>]
327
323
  #
328
324
  #
329
325
  # The arguments for has_many follow the exact same idea that belongs_to's
330
326
  # arguments followed. :wrap's contents are used to search for matching
331
327
  # :primary_key content. If :primary_key is not specified, it defaults to the
332
- # dn_attribute of the specified :class.
328
+ # dn_attribute of the specified :class_name.
333
329
  #
334
330
  # === Using these new classes
335
331
  #
@@ -341,21 +337,21 @@
341
337
  #
342
338
  # ==== .find
343
339
  #
344
- # .find is a class method that is accessible from any subclass of Base that has
345
- # 'ldap_mapping' called. When called it returns the first match of the given
346
- # class.
340
+ # .find is a class method that is accessible from
341
+ # any subclass of Base that has 'ldap_mapping' called. When
342
+ # called .first(:first) returns the first match of the given class.
347
343
  #
348
- # irb> Group.find('*').cn
349
- # => "root"
344
+ # irb> Group.find(:first, 'deve*").cn
345
+ # => "develop"
350
346
  #
351
347
  # In this simple example, Group.find took the search string of 'deve*' and
352
348
  # searched for the first match in Group where the dn_attribute matched the
353
349
  # query. This is the simplest example of .find.
354
350
  #
355
- # irb> Group.find(:all, '*').collect {|group| group.cn}
351
+ # irb> Group.find(:all).collect {|group| group.cn}
356
352
  # => ["root", "daemon", "bin", "sys", "adm", "tty", ..., "develop"]
357
353
  #
358
- # Here .find(:all) returns all matches to the same query. Both .find and
354
+ # Here .find(:all) returns all matches to the same query. Both .find(:first) and
359
355
  # .find(:all) also can take more expressive arguments:
360
356
  #
361
357
  # irb> Group.find(:all, :attribute => 'gidNumber', :value => '1003').collect {|group| group.cn}
@@ -412,25 +408,25 @@
412
408
  #
413
409
  # ==== What is it?
414
410
  #
415
- # ActiveLdap::Base is the heart of Ruby/ActiveLdap. It does all the schema
411
+ # ActiveLdap::Base is the heart of ActiveLdap. It does all the schema
416
412
  # parsing for validation and attribute-to-method mangling as well as manage the
417
413
  # connection to LDAP.
418
414
  #
419
- # ===== establish_connection
415
+ # ===== setup_connection
420
416
  #
421
- # Base.establish_connection takes many (optional) arguments and is used to
417
+ # Base.setup_connection takes many (optional) arguments and is used to
422
418
  # connect to the LDAP server. Sometimes you will want to connect anonymously
423
- # and other times over TLS with user credentials. Base.establish_connection is
419
+ # and other times over TLS with user credentials. Base.setup_connection is
424
420
  # here to do all of that for you.
425
421
  #
426
422
  #
427
423
  # By default, if you call any subclass of Base, such as Group, it will call
428
- # Base.establish_connection() if these is no active LDAP connection. If your
424
+ # Base.setup_connection() if these is no active LDAP connection. If your
429
425
  # server allows anonymous binding, and you only want to access data in a
430
- # read-only fashion, you won't need to call Base.establish_connection. Here
426
+ # read-only fashion, you won't need to call Base.setup_connection. Here
431
427
  # is a fully parameterized call:
432
428
  #
433
- # Base.establish_connection(
429
+ # Base.setup_connection(
434
430
  # :host => 'ldap.dataspill.org',
435
431
  # :port => 389,
436
432
  # :base => 'dc=dataspill,dc=org',
@@ -446,7 +442,7 @@
446
442
  # * :port defaults to @@port from configuration.rb as well
447
443
  # * :base defaults to Base.base() from configuration.rb
448
444
  # * :bind_dn defaults @@bind_format from configuration.rb
449
- # * :logger defaults to a Log4r object that prints fatal messages to stderr
445
+ # * :logger defaults to a Logger object that prints fatal messages to stderr
450
446
  # * :password_block defaults to nil
451
447
  # * :allow_anonymous defaults to true
452
448
  # * :try_sasl defaults to false - see Advanced Topics for more on this one.
@@ -471,15 +467,16 @@
471
467
  # * :try_sasl, when true, tells ActiveLdap to attempt a SASL-GSSAPI bind
472
468
  # * :sasl_quiet, when true, tells the SASL libraries to not spew messages to STDOUT
473
469
  # * :method indicates whether to use :ssl, :tls, or :plain
474
- # * :retries - indicates the number of attempts to reconnect that will be undertaken when a stale connection occurs. -1 means infinite.
470
+ # * :retry_limit - indicates the number of attempts to reconnect that will be undertaken when a stale connection occurs. -1 means infinite.
475
471
  # * :retry_wait - seconds to wait before retrying a connection
476
472
  # * :scope - dictates how to find objects. (Default: :one)
477
473
  # * :timeout - time in seconds - defaults to disabled. This CAN interrupt search() requests. Be warned.
478
474
  # * :retry_on_timeout - whether to reconnect when timeouts occur. Defaults to true
479
475
  # See lib/configuration.rb for defaults for each option
480
476
  #
481
- # Base.establish_connection both connects and binds in one step. It follows
482
- # roughly the following approach:
477
+ # Base.setup_connection just setups connection
478
+ # configuration. A connection is connected and bound when it
479
+ # is needed. It follows roughly the following approach:
483
480
  #
484
481
  # * Connect to host:port using :method
485
482
  #
@@ -488,9 +485,10 @@
488
485
  # anonymously.
489
486
  # * If that fails, error out.
490
487
  #
491
- # On connect, the configuration options passed in are stored in an internal class variable
492
- # @configuration which is used to cache the information without ditching the defaults passed in
493
- # from configuration.rb
488
+ # On connect, the configuration options passed in are stored
489
+ # in an internal class variable which is used to cache the
490
+ # information without ditching the defaults passed in from
491
+ # configuration.rb
494
492
  #
495
493
  # ===== connection
496
494
  #
@@ -498,7 +496,7 @@
498
496
  #
499
497
  # === Exceptions
500
498
  #
501
- # There are a few custom exceptions used in Ruby/ActiveLdap. They are detailed below.
499
+ # There are a few custom exceptions used in ActiveLdap. They are detailed below.
502
500
  #
503
501
  # ==== DeleteError
504
502
  #
@@ -514,14 +512,14 @@
514
512
  #
515
513
  # ==== AuthenticationError
516
514
  #
517
- # This exception is raised during Base.establish_connection if no valid authentication methods
515
+ # This exception is raised during Base.setup_connection if no valid authentication methods
518
516
  # succeeded.
519
517
  #
520
518
  # ==== ConnectionError
521
519
  #
522
- # This exception is raised during Base.establish_connection if no valid
520
+ # This exception is raised during Base.setup_connection if no valid
523
521
  # connection to the LDAP server could be created. Check you configuration.rb,
524
- # Base.establish_connection arguments, and network connectivity! Also check
522
+ # Base.setup_connection arguments, and network connectivity! Also check
525
523
  # your LDAP server logs to see if it ever saw the request.
526
524
  #
527
525
  # ==== ObjectClassError
@@ -538,7 +536,7 @@
538
536
  #
539
537
  # === Putting it all together
540
538
  #
541
- # Now that all of the components of Ruby/ActiveLdap have been covered, it's time
539
+ # Now that all of the components of ActiveLdap have been covered, it's time
542
540
  # to put it all together! The rest of this section will show the steps to setup
543
541
  # example user and group management scripts for use with the LDAP tree described
544
542
  # above.
@@ -551,7 +549,7 @@
551
549
  # cat <<EOF
552
550
  # class User < ActiveLdap::Base
553
551
  # ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People', :classes => ['top', 'account', 'posixAccount']
554
- # belongs_to :groups, :class => 'Group', :wrap => 'memberUid'
552
+ # belongs_to :groups, :class_name => 'Group', :wrap => 'memberUid'
555
553
  # end
556
554
  # EOF
557
555
  #
@@ -559,8 +557,8 @@
559
557
  # cat <<EOF
560
558
  # class Group < ActiveLdap::Base
561
559
  # ldap_mapping :classes => ['top', 'posixGroup'], :prefix => 'ou=Group'
562
- # has_many :members, :class => "User", :many => "memberUid"
563
- # has_many :primary_members, :class => 'User', :foreign_key => 'gidNumber', :primary_key => 'gidNumber'
560
+ # has_many :members, :class_name => "User", :many => "memberUid"
561
+ # has_many :primary_members, :class_name => 'User', :foreign_key => 'gidNumber', :primary_key => 'gidNumber'
564
562
  # end # Group
565
563
  # EOF
566
564
  #
@@ -570,36 +568,37 @@
570
568
  #
571
569
  # Now let's create a really dumb script for adding users - ldapadmin/useradd:
572
570
  #
573
- # #!/usr/bin/ruby -W0
574
- #
571
+ # base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
572
+ # $LOAD_PATH << File.join(base, "lib")
573
+ # $LOAD_PATH << File.join(base, "examples")
574
+ #
575
575
  # require 'active_ldap'
576
- # require 'lib/user'
577
- # require 'lib/group'
578
- # require 'password'
579
- #
576
+ # require 'objects/user'
577
+ # require 'objects/group'
578
+ #
580
579
  # argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
581
580
  # opts.banner += " USER_NAME CN UID"
582
581
  # end
583
- #
582
+ #
584
583
  # if argv.size == 3
585
584
  # name, cn, uid = argv
586
585
  # else
587
586
  # $stderr.puts opts
588
587
  # exit 1
589
588
  # end
590
- #
589
+ #
591
590
  # pwb = Proc.new do |user|
592
591
  # ActiveLdap::Command.read_password("[#{user}] Password: ")
593
592
  # end
594
- #
595
- # ActiveLdap::Base.establish_connection(:password_block => pwb,
596
- # :allow_anonymous => false)
597
- #
593
+ #
594
+ # ActiveLdap::Base.setup_connection(:password_block => pwb,
595
+ # :allow_anonymous => false)
596
+ #
598
597
  # if User.exists?(name)
599
598
  # $stderr.puts("User #{name} already exists.")
600
599
  # exit 1
601
600
  # end
602
- #
601
+ #
603
602
  # user = User.new(name)
604
603
  # user.add_class('shadowAccount')
605
604
  # user.cn = cn
@@ -618,34 +617,38 @@
618
617
  # Now let's create another dumb script for modifying users - ldapadmin/usermod:
619
618
  #
620
619
  # #!/usr/bin/ruby -W0
621
- #
620
+ #
621
+ # base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
622
+ # $LOAD_PATH << File.join(base, "lib")
623
+ # $LOAD_PATH << File.join(base, "examples")
624
+ #
622
625
  # require 'active_ldap'
623
- # require 'lib/user'
624
- # require 'lib/group'
625
- #
626
+ # require 'objects/user'
627
+ # require 'objects/group'
628
+ #
626
629
  # argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
627
630
  # opts.banner += " USER_NAME CN UID"
628
631
  # end
629
- #
632
+ #
630
633
  # if argv.size == 3
631
634
  # name, cn, uid = argv
632
635
  # else
633
636
  # $stderr.puts opts
634
637
  # exit 1
635
638
  # end
636
- #
639
+ #
637
640
  # pwb = Proc.new do |user|
638
641
  # ActiveLdap::Command.read_password("[#{user}] Password: ")
639
642
  # end
640
- #
641
- # ActiveLdap::Base.establish_connection(:password_block => pwb,
642
- # :allow_anonymous => false)
643
- #
643
+ #
644
+ # ActiveLdap::Base.setup_connection(:password_block => pwb,
645
+ # :allow_anonymous => false)
646
+ #
644
647
  # unless User.exists?(name)
645
648
  # $stderr.puts("User #{name} doesn't exist.")
646
649
  # exit 1
647
650
  # end
648
- #
651
+ #
649
652
  # user = User.find(name)
650
653
  # user.cn = cn
651
654
  # user.uid_number = uid
@@ -656,45 +659,9 @@
656
659
  # exit 1
657
660
  # end
658
661
  #
659
- # ==== Removing LDAP entries
660
- #
661
- # And finally, a dumb script for removing user - ldapadmin/userdel:
662
- #
663
- #
664
- # #!/usr/bin/ruby -W0
665
- #
666
- # require 'active_ldap'
667
- # require 'lib/user'
668
- # require 'lib/group'
669
- #
670
- # argv, opts, options = ActiveLdap::Command.parse_options do |opts, options|
671
- # opts.banner += " USER_NAME"
672
- # end
673
- #
674
- # if argv.size == 1
675
- # name = argv.shift
676
- # else
677
- # $stderr.puts opts
678
- # exit 1
679
- # end
680
- #
681
- # pwb = Proc.new do |user|
682
- # ActiveLdap::Command.read_password("[#{user}] Password: ")
683
- # end
684
- #
685
- # ActiveLdap::Base.establish_connection(:password_block => pwb,
686
- # :allow_anonymous => false)
687
- #
688
- # unless User.exists?(name)
689
- # $stderr.puts("User #{name} doesn't exist.")
690
- # exit 1
691
- # end
692
- #
693
- # User.destroy(name)
694
- #
695
662
  # === Advanced Topics
696
663
  #
697
- # Below are some situation tips and tricks to get the most out of Ruby/ActiveLdap.
664
+ # Below are some situation tips and tricks to get the most out of ActiveLdap.
698
665
  #
699
666
  #
700
667
  # ==== Binary data and other subtypes
@@ -706,7 +673,7 @@
706
673
  # irb> user = User.new('drewry')
707
674
  # => ...
708
675
  # # This adds a cn entry in lang-en and whatever the server default is.
709
- # irb> user.cn = [ 'wad', {'lang-en' => ['wad', 'foo']} ]
676
+ # irb> user.cn = [ 'wad', {'lang-en' => ['wad', 'Will Drewry']} ]
710
677
  # => ...
711
678
  # irb> user.cn
712
679
  # => ["wad", {"lang-en-us" => ["wad", "Will Drewry"]}]
@@ -729,7 +696,7 @@
729
696
  #
730
697
  # You should note that some binary data does not use the binary subtype all the time.
731
698
  # One example is jpegPhoto. You can use it as jpegPhoto;binary or just as jpegPhoto.
732
- # Since the schema dictates that it is a binary value, Ruby/ActiveLdap will write
699
+ # Since the schema dictates that it is a binary value, ActiveLdap will write
733
700
  # it as binary, but the subtype will not be automatically appended as above. The
734
701
  # use of the subtype on attributes like jpegPhoto is ultimately decided by the
735
702
  # LDAP site policy and not by any programmatic means.
@@ -737,7 +704,7 @@
737
704
  # The only subtypes defined in LDAPv3 are lang-* and binary. These can be nested
738
705
  # though:
739
706
  #
740
- # irb> user.cn = [{'lang-JP-jp' => {'binary' => 'somejp'}}]
707
+ # irb> user.cn = [{'lang-ja' => {'binary' => 'some Japanese'}}]
741
708
  #
742
709
  # As I understand it, OpenLDAP does not support nested subtypes, but some
743
710
  # documentation I've read suggests that Netscape's LDAP server does. I only
@@ -766,7 +733,7 @@
766
733
  # module MyLDAP
767
734
  # class User < ActiveLdap::Base
768
735
  # ldap_mapping :dn_attribute => 'uid', :prefix => 'ou=People', :classes => ['top', 'account', 'posixAccount']
769
- # belongs_to :groups, :class => 'MyLDAP::Group', :many => 'memberUid'
736
+ # belongs_to :groups, :class_name => 'MyLDAP::Group', :many => 'memberUid'
770
737
  # end
771
738
  # end
772
739
  #
@@ -774,8 +741,8 @@
774
741
  # module MyLDAP
775
742
  # class Group < ActiveLdap::Base
776
743
  # ldap_mapping :classes => ['top', 'posixGroup'], :prefix => 'ou=Group'
777
- # has_many :members, :class => 'MyLDAP::User', :wrap => 'memberUid'
778
- # has_many :primary_members, :class => 'MyLDAP::User', :foreign_key => 'gidNumber', :primary_key => 'gidNumber'
744
+ # has_many :members, :class_name => 'MyLDAP::User', :wrap => 'memberUid'
745
+ # has_many :primary_members, :class_name => 'MyLDAP::User', :foreign_key => 'gidNumber', :primary_key => 'gidNumber'
779
746
  # end
780
747
  # end
781
748
  #
@@ -791,7 +758,7 @@
791
758
  #
792
759
  # ==== force array results for single values
793
760
  #
794
- # Even though Ruby/ActiveLdap attempts to maintain programmatic ease by
761
+ # Even though ActiveLdap attempts to maintain programmatic ease by
795
762
  # returning Array values only. By specifying 'true' as an argument to
796
763
  # any attribute method you will get back a Array if it is single value.
797
764
  # Here's an example:
@@ -820,11 +787,11 @@
820
787
  #
821
788
  # irb> anon_class = Class.new(Base)
822
789
  # => ...
823
- # irb> anon_class.establish_connection
790
+ # irb> anon_class.setup_connection
824
791
  # => ...
825
792
  # irb> auth_class = Class.new(Base)
826
793
  # => ...
827
- # irb> auth_class.establish_connection(:password_block => {'mypass'})
794
+ # irb> auth_class.setup_connection(:password_block => {'mypass'})
828
795
  # => ...
829
796
  #
830
797
  # This can be useful for doing authentication tests and other such tricks.
@@ -893,7 +860,7 @@
893
860
  #
894
861
  # === Speed
895
862
  #
896
- # Currently, Ruby/ActiveLdap could be faster. I have some recursive type
863
+ # Currently, ActiveLdap could be faster. I have some recursive type
897
864
  # checking going on which slows object creation down, and I'm sure there
898
865
  # are many, many other places optimizations can be done. Feel free
899
866
  # to send patches, or just hang in there until I can optimize away the
@@ -906,6 +873,7 @@
906
873
  #
907
874
 
908
875
  require_gem_if_need = Proc.new do |library_name, gem_name, *gem_args|
876
+ gem_name ||= library_name
909
877
  begin
910
878
  if !gem_args.empty? and Object.const_defined?(:Gem)
911
879
  gem gem_name, *gem_args
@@ -931,7 +899,7 @@ if dependencies.respond_to?(:load_paths)
931
899
  end
932
900
 
933
901
  module ActiveLdap
934
- VERSION = "1.0.2"
902
+ VERSION = "1.0.9"
935
903
  end
936
904
 
937
905
  if RUBY_PLATFORM.match('linux')
@@ -942,12 +910,25 @@ end
942
910
 
943
911
  require_gem_if_need.call("active_record", "activerecord")
944
912
  begin
913
+ raise LoadError, "GetText is disabled."
945
914
  require_gem_if_need.call("locale")
946
- require_gem_if_need.call("gettext", "gettext", ">= 1.94")
915
+ require_gem_if_need.call("gettext")
916
+
917
+ require 'active_record/version'
918
+ active_record_version = [ActiveRecord::VERSION::MAJOR,
919
+ ActiveRecord::VERSION::MINOR,
920
+ ActiveRecord::VERSION::TINY]
921
+ if (active_record_version <=> [2, 2, 0]) < 0
922
+ require "gettext/active_record"
923
+ else
924
+ require_gem_if_need.call("gettext_activerecord")
925
+ end
947
926
  rescue LoadError
948
927
  end
949
928
  require 'active_ldap/get_text'
950
929
 
930
+ require 'active_ldap/compatible'
931
+
951
932
  require 'active_ldap/base'
952
933
 
953
934
  require 'active_ldap/distinguished_name'
data/po/en/active-ldap.po CHANGED
@@ -1,13 +1,13 @@
1
- # English translations for Ruby/ActiveLdap package.
2
- # Copyright (C) 2007 Kouhei Sutou
3
- # This file is distributed under the same license as the Ruby/ActiveLdap package.
1
+ # English translations for ActiveLdap package.
2
+ # Copyright (C) 2007-2009 Kouhei Sutou
3
+ # This file is distributed under the same license as the ActiveLdap package.
4
4
  # Kouhei Sutou <kou@cozmixng.org>, 2007.
5
5
  #
6
6
  msgid ""
7
7
  msgstr ""
8
- "Project-Id-Version: Ruby/ActiveLdap 1.0.2\n"
8
+ "Project-Id-Version: ActiveLdap 1.1.0\n"
9
9
  "POT-Creation-Date: 2008-06-17 21:42+0900\n"
10
- "PO-Revision-Date: 2007-08-19 09:49+0900\n"
10
+ "PO-Revision-Date: 2009-02-25 08:40+0900\n"
11
11
  "Last-Translator: Kouhei Sutou <kou@cozmixng.org>\n"
12
12
  "Language-Team: English\n"
13
13
  "MIME-Version: 1.0\n"
data/po/ja/active-ldap.po CHANGED
@@ -1,13 +1,13 @@
1
- # Japanese translations for Ruby/ActiveLdap.
2
- # Copyright (C) 2007 Kouhei Sutou
3
- # This file is distributed under the same license as the Ruby/ActiveLdap package.
1
+ # Japanese translations for ActiveLdap.
2
+ # Copyright (C) 2007-2009 Kouhei Sutou
3
+ # This file is distributed under the same license as the ActiveLdap package.
4
4
  # Kouhei Sutou <kou@cozmixng.org>, 2007.
5
5
  #
6
6
  msgid ""
7
7
  msgstr ""
8
- "Project-Id-Version: Ruby/ActiveLdap 1.0.2\n"
8
+ "Project-Id-Version: ActiveLdap 1.1.0\n"
9
9
  "POT-Creation-Date: 2008-06-17 21:42+0900\n"
10
- "PO-Revision-Date: 2008-06-17 21:53+0900\n"
10
+ "PO-Revision-Date: 2009-02-25 08:40+0900\n"
11
11
  "Last-Translator: Kouhei Sutou <kou@cozmixng.org>\n"
12
12
  "Language-Team: Japanese\n"
13
13
  "MIME-Version: 1.0\n"