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
@@ -21,7 +21,6 @@ module ActiveLdap
21
21
  }
22
22
 
23
23
  def connect(options={})
24
- @bound = false
25
24
  super do |host, port, method|
26
25
  config = {
27
26
  :host => host,
@@ -41,11 +40,14 @@ module ActiveLdap
41
40
  end
42
41
 
43
42
  def unbind(options={})
44
- log("unbind") {@bound = false}
43
+ super do
44
+ log("unbind") do
45
+ @connection.close # Net::LDAP doesn't implement unbind.
46
+ end
47
+ end
45
48
  end
46
49
 
47
50
  def bind(options={})
48
- @bound = false
49
51
  begin
50
52
  super
51
53
  rescue Net::LDAP::LdapError
@@ -55,16 +57,11 @@ module ActiveLdap
55
57
 
56
58
  def bind_as_anonymous(options={})
57
59
  super do
58
- @bound = false
59
60
  execute(:bind, {:name => "bind: anonymous"}, {:method => :anonymous})
60
- @bound = true
61
+ true
61
62
  end
62
63
  end
63
64
 
64
- def bound?
65
- connecting? and @bound
66
- end
67
-
68
65
  def search(options={}, &block)
69
66
  super(options) do |base, scope, filter, attrs, limit, callback|
70
67
  args = {
@@ -97,38 +94,38 @@ module ActiveLdap
97
94
  end
98
95
 
99
96
  def add(dn, entries, options={})
100
- super do |dn, entries|
97
+ super do |_dn, _entries|
101
98
  attributes = {}
102
- entries.each do |type, key, attrs|
99
+ _entries.each do |type, key, attrs|
103
100
  attrs.each do |name, values|
104
101
  attributes[name] = values
105
102
  end
106
103
  end
107
- args = {:dn => dn, :attributes => attributes}
104
+ args = {:dn => _dn, :attributes => attributes}
108
105
  info = args.dup
109
106
  execute(:add, info, args)
110
107
  end
111
108
  end
112
109
 
113
110
  def modify(dn, entries, options={})
114
- super do |dn, entries|
115
- info = {:dn => dn, :attributes => entries}
111
+ super do |_dn, _entries|
112
+ info = {:dn => _dn, :attributes => _entries}
116
113
  execute(:modify, info,
117
- :dn => dn,
118
- :operations => parse_entries(entries))
114
+ :dn => _dn,
115
+ :operations => parse_entries(_entries))
119
116
  end
120
117
  end
121
118
 
122
119
  def modify_rdn(dn, new_rdn, delete_old_rdn, new_superior, options={})
123
- super do |dn, new_rdn, delete_old_rdn, new_superior|
120
+ super do |_dn, _new_rdn, _delete_old_rdn, _new_superior|
124
121
  info = {
125
- :name => "modify: RDN", :dn => dn, :new_rdn => new_rdn,
126
- :delete_old_rdn => delete_old_rdn,
122
+ :name => "modify: RDN",
123
+ :dn => _dn, :new_rdn => _new_rdn, :delete_old_rdn => _delete_old_rdn,
127
124
  }
128
125
  execute(:rename, info,
129
- :olddn => dn,
130
- :newrdn => new_rdn,
131
- :delete_attributes => delete_old_rdn)
126
+ :olddn => _dn,
127
+ :newrdn => _new_rdn,
128
+ :delete_attributes => _delete_old_rdn)
132
129
  end
133
130
  end
134
131
 
@@ -183,24 +180,23 @@ module ActiveLdap
183
180
  end
184
181
 
185
182
  def sasl_bind(bind_dn, options={})
186
- super do |bind_dn, mechanism, quiet|
183
+ super do |_bind_dn, mechanism, quiet|
187
184
  normalized_mechanism = mechanism.downcase.gsub(/-/, '_')
188
185
  sasl_bind_setup = "sasl_bind_setup_#{normalized_mechanism}"
189
186
  next unless respond_to?(sasl_bind_setup, true)
190
187
  initial_credential, challenge_response =
191
- send(sasl_bind_setup, bind_dn, options)
188
+ send(sasl_bind_setup, _bind_dn, options)
192
189
  args = {
193
190
  :method => :sasl,
194
191
  :initial_credential => initial_credential,
195
192
  :mechanism => mechanism,
196
193
  :challenge_response => challenge_response,
197
194
  }
198
- @bound = false
199
195
  info = {
200
- :name => "bind: SASL", :dn => bind_dn, :mechanism => mechanism,
196
+ :name => "bind: SASL", :dn => _bind_dn, :mechanism => mechanism,
201
197
  }
202
198
  execute(:bind, info, args)
203
- @bound = true
199
+ true
204
200
  end
205
201
  end
206
202
 
@@ -264,15 +260,14 @@ module ActiveLdap
264
260
  end
265
261
 
266
262
  def simple_bind(bind_dn, options={})
267
- super do |bind_dn, passwd|
263
+ super do |_bind_dn, password|
268
264
  args = {
269
265
  :method => :simple,
270
- :username => bind_dn,
271
- :password => passwd,
266
+ :username => _bind_dn,
267
+ :password => password,
272
268
  }
273
- @bound = false
274
- execute(:bind, {:dn => bind_dn}, args)
275
- @bound = true
269
+ execute(:bind, {:dn => _bind_dn}, args)
270
+ true
276
271
  end
277
272
  end
278
273
 
@@ -18,12 +18,6 @@ module Net
18
18
  def original_attribute_names
19
19
  @original_attribute_names.compact.uniq
20
20
  end
21
-
22
- def each_attribute
23
- attribute_names.sort_by {|name| name.to_s}.each do |name|
24
- yield name, self[name]
25
- end
26
- end
27
21
  end
28
22
  end
29
23
  end
@@ -3,12 +3,13 @@ module ActiveLdap
3
3
  class Proxy
4
4
  alias_method :proxy_respond_to?, :respond_to?
5
5
  alias_method :proxy_extend, :extend
6
+ delegate :to_param, :to => :target
6
7
 
7
8
  def initialize(owner, options)
8
9
  @owner = owner
9
10
  @options = options
10
- extend(options[:extend]) if options[:extend]
11
11
  reset
12
+ extend(options[:extend]) if options[:extend]
12
13
  end
13
14
 
14
15
  def respond_to?(symbol, include_priv=false)
@@ -26,10 +26,41 @@ module ActiveLdap
26
26
  value.values.all? {|val| blank_value?(val)}
27
27
  when Array
28
28
  value.all? {|val| blank_value?(val)}
29
+ when String
30
+ /\A\s*\z/ =~ value
31
+ when nil
32
+ true
29
33
  else
30
34
  value.blank?
31
35
  end
32
36
  end
37
+
38
+ def remove_blank_value(value)
39
+ case value
40
+ when Hash
41
+ result = {}
42
+ value.each do |k, v|
43
+ result[k] = remove_blank_value(v) || []
44
+ end
45
+ result
46
+ when Array
47
+ result = []
48
+ value.each do |v|
49
+ v = remove_blank_value(v)
50
+ next if v.nil?
51
+ result << v
52
+ end
53
+ result
54
+ when String
55
+ if /\A\s*\z/ =~ value
56
+ nil
57
+ else
58
+ value
59
+ end
60
+ else
61
+ value
62
+ end
63
+ end
33
64
  end
34
65
 
35
66
  module Normalizable
@@ -44,6 +44,24 @@ module ActiveLdap
44
44
  # Multiple entries become lists.
45
45
  # If this isn't read-only then lists become multiple entries, etc.
46
46
 
47
+ class << self
48
+ include GetTextSupport
49
+ def const_missing(id)
50
+ case id
51
+ when :ConnectionNotEstablished
52
+ message =
53
+ _("ActiveLdap::ConnectionNotEstablished has been deprecated " \
54
+ "since 1.1.0. " \
55
+ "Please use ActiveLdap::ConnectionNotSetup instead.")
56
+ ActiveSupport::Deprecation.warn(message)
57
+ const_set("ConnectionNotEstablished", ConnectionNotSetup)
58
+ ConnectionNotEstablished
59
+ else
60
+ super
61
+ end
62
+ end
63
+ end
64
+
47
65
  class Error < StandardError
48
66
  include GetTextSupport
49
67
  end
@@ -155,13 +173,16 @@ module ActiveLdap
155
173
  NEAREST_MARK = "|@|"
156
174
  private
157
175
  def detect_nearest(line, column)
158
- nearest = @ldif.to_a[line - 1] || ""
176
+ lines = Compatible.string_to_lines(@ldif).to_a
177
+ nearest = lines[line - 1] || ""
159
178
  if column - 1 == nearest.size # for JRuby 1.0.2 :<
160
179
  nearest << NEAREST_MARK
161
180
  else
162
181
  nearest[column - 1, 0] = NEAREST_MARK
163
182
  end
164
- nearest = "#{@ldif.to_a[line - 2]}#{nearest}" if nearest == NEAREST_MARK
183
+ if nearest == NEAREST_MARK
184
+ nearest = "#{lines[line - 2]}#{nearest}"
185
+ end
165
186
  nearest
166
187
  end
167
188
 
@@ -182,7 +203,7 @@ module ActiveLdap
182
203
 
183
204
  def numbered_ldif
184
205
  return @ldif if @ldif.blank?
185
- lines = @ldif.to_a
206
+ lines = Compatible.string_to_lines(@ldif)
186
207
  format = "%#{Math.log10(lines.size).truncate + 1}d: %s"
187
208
  i = 0
188
209
  lines.collect do |line|
@@ -207,7 +228,7 @@ module ActiveLdap
207
228
  class OperationNotPermitted < Error
208
229
  end
209
230
 
210
- class ConnectionNotEstablished < Error
231
+ class ConnectionNotSetup < Error
211
232
  end
212
233
 
213
234
  class AdapterNotSpecified < Error
@@ -288,7 +309,6 @@ module ActiveLdap
288
309
  end
289
310
  def #{sym}; self.class.#{sym}; end
290
311
  def self.#{sym}=(value); @#{sym} = value; end
291
- def #{sym}=(value); self.class.#{sym} = value; end
292
312
  EOS
293
313
  end
294
314
  end
@@ -340,13 +360,24 @@ module ActiveLdap
340
360
  # search() requests. Be warned.
341
361
  # :retry_on_timeout - whether to reconnect when timeouts occur. Defaults
342
362
  # to true
343
- # See lib/configuration.rb for defaults for each option
344
- def establish_connection(config=nil)
363
+ # See lib/active_ldap/configuration.rb for defaults for each option
364
+ def setup_connection(config=nil)
345
365
  super
346
366
  ensure_logger
347
367
  nil
348
368
  end
349
369
 
370
+ # establish_connection is deprecated since 1.1.0. Please use
371
+ # setup_connection() instead.
372
+ def establish_connection(config=nil)
373
+ message =
374
+ _("ActiveLdap::Base.establish_connection has been deprecated " \
375
+ "since 1.1.0. " \
376
+ "Please use ActiveLdap::Base.setup_connection instead.")
377
+ ActiveSupport::Deprecation.warn(message)
378
+ setup_connection(config)
379
+ end
380
+
350
381
  def create(attributes=nil, &block)
351
382
  if attributes.is_a?(Array)
352
383
  attributes.collect {|attrs| create(attrs, &block)}
@@ -473,7 +504,7 @@ module ActiveLdap
473
504
  end
474
505
  end
475
506
 
476
- def self_and_descendents_from_active_ldap
507
+ def self_and_descendants_from_active_ldap
477
508
  klass = self
478
509
  classes = [klass]
479
510
  while klass != klass.base_class
@@ -483,11 +514,17 @@ module ActiveLdap
483
514
  rescue
484
515
  [self]
485
516
  end
486
- alias_method(:self_and_descendents_from_active_record,
487
- :self_and_descendents_from_active_ldap)
517
+ if ActiveRecord::Base.respond_to?(:self_and_descendents_from_active_record)
518
+ # ActiveRecord 2.2.2 has a typo. :<
519
+ alias_method(:self_and_descendents_from_active_record,
520
+ :self_and_descendants_from_active_ldap)
521
+ else
522
+ alias_method(:self_and_descendants_from_active_record,
523
+ :self_and_descendants_from_active_ldap)
524
+ end
488
525
 
489
526
  def human_name(options={})
490
- defaults = self_and_descendents_from_active_ldap.collect do |klass|
527
+ defaults = self_and_descendants_from_active_ldap.collect do |klass|
491
528
  if klass.name.blank?
492
529
  nil
493
530
  else
@@ -563,20 +600,16 @@ module ActiveLdap
563
600
  end
564
601
 
565
602
  def default_dn_attribute
566
- if name.empty?
567
- dn_attribute = nil
568
- parent_class = ancestors[1]
569
- if parent_class.respond_to?(:dn_attribute)
570
- dn_attribute = parent_class.dn_attribute
571
- end
572
- dn_attribute || "cn"
573
- else
574
- name.demodulize.underscore
603
+ dn_attribute = nil
604
+ parent_class = ancestors[1]
605
+ if parent_class.respond_to?(:dn_attribute)
606
+ dn_attribute = parent_class.dn_attribute
575
607
  end
608
+ dn_attribute || "cn"
576
609
  end
577
610
 
578
611
  def default_prefix
579
- if name.empty?
612
+ if name.blank?
580
613
  nil
581
614
  else
582
615
  "ou=#{name.demodulize.pluralize}"
@@ -666,7 +699,7 @@ module ActiveLdap
666
699
 
667
700
  def attribute_present?(name)
668
701
  values = get_attribute(name, true)
669
- !values.empty? or values.any? {|x| not (x and x.empty?)}
702
+ !values.empty? or values.any? {|x| !(x and x.empty?)}
670
703
  end
671
704
 
672
705
  # exist?
@@ -863,7 +896,7 @@ module ActiveLdap
863
896
 
864
897
  def to_xml(options={})
865
898
  options = options.dup
866
- options[:root] ||= self.class.name.underscore
899
+ options[:root] ||= (self.class.name || '').underscore
867
900
  except = options[:except]
868
901
  if except
869
902
  options[:except] = except.collect do |name|
@@ -883,7 +916,7 @@ module ActiveLdap
883
916
 
884
917
  def have_attribute?(name, except=[])
885
918
  real_name = to_real_attribute_name(name)
886
- real_name and !except.include?(real_name)
919
+ !real_name.nil? and !except.include?(real_name)
887
920
  end
888
921
  alias_method :has_attribute?, :have_attribute?
889
922
 
@@ -930,7 +963,7 @@ module ActiveLdap
930
963
  end
931
964
  config = {:bind_dn => dn, :allow_anonymous => false}.merge(config)
932
965
  config[:password_block] ||= block if block_given?
933
- establish_connection(config)
966
+ setup_connection(config)
934
967
 
935
968
  before_connection = @connection
936
969
  begin
@@ -970,8 +1003,8 @@ module ActiveLdap
970
1003
  end.join(",")
971
1004
  end
972
1005
 
973
- undef_method :base=
974
1006
  def base=(object_local_base)
1007
+ ensure_update_dn
975
1008
  @dn = nil
976
1009
  @base = object_local_base
977
1010
  end
@@ -981,7 +1014,6 @@ module ActiveLdap
981
1014
  @scope || scope_of_class
982
1015
  end
983
1016
 
984
- undef_method :scope=
985
1017
  def scope=(scope)
986
1018
  self.class.validate_scope(scope)
987
1019
  @scope = scope
@@ -1061,6 +1093,8 @@ module ActiveLdap
1061
1093
 
1062
1094
  def initialize_by_ldap_data(dn, attributes)
1063
1095
  init_base
1096
+ dn = Compatible.convert_to_utf8_encoded_object(dn)
1097
+ attributes = Compatible.convert_to_utf8_encoded_object(attributes)
1064
1098
  @dn = dn
1065
1099
  @new_entry = false
1066
1100
  @dn_is_base = false
@@ -1084,7 +1118,7 @@ module ActiveLdap
1084
1118
  obj
1085
1119
  end
1086
1120
 
1087
- def to_real_attribute_name(name, allow_normalized_name=false)
1121
+ def to_real_attribute_name(name, allow_normalized_name=true)
1088
1122
  return name if name.nil?
1089
1123
  if allow_normalized_name
1090
1124
  entry_attribute.normalize(name, allow_normalized_name) ||
@@ -1356,8 +1390,12 @@ module ActiveLdap
1356
1390
 
1357
1391
  next if v == value
1358
1392
 
1393
+ x = value
1394
+ value = self.class.remove_blank_value(value) || []
1395
+ next if v == value
1396
+
1359
1397
  # Create mod entries
1360
- if value.empty?
1398
+ if self.class.blank_value?(value)
1361
1399
  # Since some types do not have equality matching rules,
1362
1400
  # delete doesn't work
1363
1401
  # Replacing with nothing is equivalent.
@@ -1372,7 +1410,11 @@ module ActiveLdap
1372
1410
  end
1373
1411
  data.each do |k, v|
1374
1412
  value = v || []
1375
- next if ldap_data.has_key?(k) or value.empty?
1413
+ next if ldap_data.has_key?(k)
1414
+
1415
+ value = self.class.remove_blank_value(value) || []
1416
+ next if self.class.blank_value?(value)
1417
+
1376
1418
 
1377
1419
  # Detect subtypes and account for them
1378
1420
  # REPLACE will function like ADD, but doesn't hit EQUALITY problems
@@ -1393,7 +1435,9 @@ module ActiveLdap
1393
1435
  oc_value = data['objectClass']
1394
1436
  attributes.push(['objectClass', oc_value])
1395
1437
  data.each do |key, value|
1396
- next if value.empty? or key == 'objectClass' or key == dn_attr
1438
+ next if key == 'objectClass' or key == dn_attr
1439
+ value = self.class.remove_blank_value(value)
1440
+ next if self.class.blank_value?(value)
1397
1441
 
1398
1442
  attributes.push([key, value])
1399
1443
  end
@@ -0,0 +1,44 @@
1
+ module ActiveLdap
2
+ module Compatible
3
+ module_function
4
+ if "".respond_to?(:force_encoding)
5
+ def convert_to_utf8_encoded_object(object)
6
+ case object
7
+ when Array
8
+ object.collect {|element| convert_to_utf8_encoded_object(element)}
9
+ when Hash
10
+ encoded = {}
11
+ object.each do |key, value|
12
+ key = convert_to_utf8_encoded_object(key)
13
+ value = convert_to_utf8_encoded_object(value)
14
+ encoded[key] = value
15
+ end
16
+ encoded
17
+ when String
18
+ encoded = object.dup
19
+ encoded.force_encoding("utf-8")
20
+ encoded = object unless encoded.valid_encoding?
21
+ encoded
22
+ else
23
+ object
24
+ end
25
+ end
26
+ else
27
+ def convert_to_utf8_encoded_object(object)
28
+ object
29
+ end
30
+ end
31
+
32
+ if "".respond_to?(:lines)
33
+ def string_to_lines(string)
34
+ string.lines.to_a
35
+ end
36
+ else
37
+ def string_to_lines(string)
38
+ ary = []
39
+ string.each_line{|l| ary << l}
40
+ ary
41
+ end
42
+ end
43
+ end
44
+ end
@@ -31,14 +31,14 @@ module ActiveLdap
31
31
  DEFAULT_CONFIG[:password] = nil
32
32
  DEFAULT_CONFIG[:store_password] = true
33
33
  DEFAULT_CONFIG[:allow_anonymous] = true
34
- DEFAULT_CONFIG[:sasl_quiet] = false
34
+ DEFAULT_CONFIG[:sasl_quiet] = true
35
35
  DEFAULT_CONFIG[:try_sasl] = false
36
36
  # See http://www.iana.org/assignments/sasl-mechanisms
37
37
  DEFAULT_CONFIG[:sasl_mechanisms] = ["GSSAPI", "DIGEST-MD5",
38
38
  "CRAM-MD5", "EXTERNAL"]
39
39
 
40
- DEFAULT_CONFIG[:retry_limit] = 3
41
- DEFAULT_CONFIG[:retry_wait] = 3
40
+ DEFAULT_CONFIG[:retry_limit] = 1
41
+ DEFAULT_CONFIG[:retry_wait] = 1
42
42
  DEFAULT_CONFIG[:timeout] = 0 # in seconds; 0 <= Never timeout
43
43
  # Whether or not to retry on timeouts
44
44
  DEFAULT_CONFIG[:retry_on_timeout] = true
@@ -55,7 +55,7 @@ module ActiveLdap
55
55
  def clear_active_connection_name
56
56
  @active_connection_name = nil
57
57
  ObjectSpace.each_object(Class) do |klass|
58
- if klass < self and !klass.name.empty?
58
+ if klass < self and !klass.name.blank?
59
59
  klass.instance_variable_set("@active_connection_name", nil)
60
60
  end
61
61
  end
@@ -81,9 +81,9 @@ module ActiveLdap
81
81
  config = adapter
82
82
  self.connection = instantiate_adapter(config)
83
83
  elsif adapter.nil?
84
- raise ConnectionNotEstablished
84
+ raise ConnectionNotSetup
85
85
  else
86
- establish_connection(adapter)
86
+ setup_connection(adapter)
87
87
  end
88
88
  end
89
89
 
@@ -115,15 +115,15 @@ module ActiveLdap
115
115
  def retrieve_connection
116
116
  conn = nil
117
117
  name = active_connection_name
118
- raise ConnectionNotEstablished unless name
118
+ raise ConnectionNotSetup unless name
119
119
  conn = active_connections[name]
120
120
  if conn.nil?
121
121
  config = configuration(name)
122
- raise ConnectionNotEstablished unless config
122
+ raise ConnectionNotSetup unless config
123
123
  self.connection = config
124
124
  conn = active_connections[name]
125
125
  end
126
- raise ConnectionNotEstablished if conn.nil?
126
+ raise ConnectionNotSetup if conn.nil?
127
127
  conn
128
128
  end
129
129
 
@@ -136,12 +136,12 @@ module ActiveLdap
136
136
  config = configuration(key)
137
137
  conn = active_connections[key]
138
138
  remove_configuration_by_configuration(config)
139
- active_connections.delete_if {|key, value| value == conn}
139
+ active_connections.delete_if {|_key, value| value == conn}
140
140
  conn.disconnect! if conn
141
141
  config
142
142
  end
143
143
 
144
- def establish_connection(config=nil)
144
+ def setup_connection(config=nil)
145
145
  config = ensure_configuration(config)
146
146
  remove_connection
147
147
 
@@ -151,6 +151,15 @@ module ActiveLdap
151
151
  define_configuration(key, merge_configuration(config))
152
152
  end
153
153
 
154
+ def establish_connection(config=nil)
155
+ message =
156
+ _("ActiveLdap::Connection.establish_connection has been deprecated " \
157
+ "since 1.1.0. " \
158
+ "Please use ActiveLdap::Connection.setup_connection instead.")
159
+ ActiveSupport::Deprecation.warn(message)
160
+ setup_connection(config)
161
+ end
162
+
154
163
  # Return the schema object
155
164
  def schema
156
165
  connection.schema
@@ -164,7 +173,7 @@ module ActiveLdap
164
173
 
165
174
  private
166
175
  def active_connection_key(k=self)
167
- k.name.empty? ? k.object_id : k.name
176
+ k.name.blank? ? k.object_id : k.name
168
177
  end
169
178
 
170
179
  def determine_active_connection_name
@@ -191,11 +200,22 @@ module ActiveLdap
191
200
  end
192
201
 
193
202
  def guess_available_adapter
194
- Object.respond_to?(:java) ? "jndi" : "ldap"
203
+ if Object.respond_to?(:java)
204
+ "jndi"
205
+ else
206
+ ldap_ldif_path = $LOAD_PATH.find do |path|
207
+ File.exist?(File.join(path, "ldap", "ldif.rb"))
208
+ end
209
+ if ldap_ldif_path
210
+ "ldap"
211
+ else
212
+ "net-ldap"
213
+ end
214
+ end
195
215
  end
196
216
  end
197
217
 
198
- def establish_connection(config=nil)
218
+ def setup_connection(config=nil)
199
219
  config = self.class.ensure_configuration(config)
200
220
  config = self.class.configuration.merge(config)
201
221
  config = self.class.merge_configuration(config, self)
@@ -204,6 +224,15 @@ module ActiveLdap
204
224
  self.class.define_configuration(dn, config)
205
225
  end
206
226
 
227
+ def establish_connection(config=nil)
228
+ message =
229
+ _("ActiveLdap::Connection#establish_connection has been deprecated " \
230
+ "since 1.1.0. " \
231
+ "Please use ActiveLdap::Connection#setup_connection instead.")
232
+ ActiveSupport::Deprecation.warn(message)
233
+ setup_connection(config)
234
+ end
235
+
207
236
  def remove_connection
208
237
  self.class.remove_connection(dn)
209
238
  @connection = nil
@@ -235,7 +264,7 @@ module ActiveLdap
235
264
  config = adapter
236
265
  @connection = self.class.instantiate_adapter(config)
237
266
  else
238
- establish_connection(adapter)
267
+ setup_connection(adapter)
239
268
  end
240
269
  end
241
270
 
@@ -124,6 +124,7 @@ module ActiveLdap
124
124
  result << scanner[1]
125
125
  end
126
126
  end
127
+ result.force_encoding("utf-8") if result.respond_to?(:force_encoding)
127
128
  result
128
129
  end
129
130
 
@@ -1,11 +1,4 @@
1
1
  if Object.const_defined?(:GetText)
2
- require 'active_record/version'
3
- active_record_version = [ActiveRecord::VERSION::MAJOR,
4
- ActiveRecord::VERSION::MINOR,
5
- ActiveRecord::VERSION::TINY]
6
- if (active_record_version <=> [2, 2, 0]) < 0
7
- require "gettext/active_record"
8
- end
9
2
  ActiveLdap.const_set("GetText", GetText)
10
3
  end
11
4