activeldap 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/CHANGES +11 -0
  2. data/README +6 -3
  3. data/Rakefile +6 -6
  4. data/examples/al-admin/config/environment.rb +3 -3
  5. data/examples/groupadd +1 -1
  6. data/examples/groupdel +1 -1
  7. data/examples/groupls +1 -1
  8. data/examples/groupmod +1 -1
  9. data/examples/lpasswd +1 -1
  10. data/examples/ouadd +1 -1
  11. data/examples/useradd +1 -1
  12. data/examples/useradd-binary +1 -1
  13. data/examples/userdel +1 -1
  14. data/examples/userls +1 -1
  15. data/examples/usermod +1 -1
  16. data/examples/usermod-binary-add +1 -1
  17. data/examples/usermod-binary-add-time +1 -1
  18. data/examples/usermod-binary-del +1 -1
  19. data/examples/usermod-lang-add +1 -1
  20. data/lib/active_ldap.rb +6 -6
  21. data/lib/active_ldap/adapter/base.rb +14 -1
  22. data/lib/active_ldap/adapter/jndi.rb +5 -1
  23. data/lib/active_ldap/adapter/net_ldap.rb +7 -1
  24. data/lib/active_ldap/association/belongs_to_many.rb +4 -0
  25. data/lib/active_ldap/association/has_many.rb +5 -5
  26. data/lib/active_ldap/association/has_many_utils.rb +5 -6
  27. data/lib/active_ldap/association/has_many_wrap.rb +13 -9
  28. data/lib/active_ldap/association/proxy.rb +5 -1
  29. data/lib/active_ldap/associations.rb +1 -1
  30. data/lib/active_ldap/attributes.rb +7 -3
  31. data/lib/active_ldap/base.rb +16 -2
  32. data/lib/active_ldap/distinguished_name.rb +3 -6
  33. data/lib/active_ldap/operations.rb +11 -8
  34. data/lib/active_ldap/timeout_stub.rb +1 -1
  35. data/lib/active_ldap/xml.rb +5 -2
  36. data/test-unit/History.txt +54 -0
  37. data/test-unit/Manifest.txt +3 -3
  38. data/test-unit/README.txt +4 -1
  39. data/test-unit/images/color-diff.png +0 -0
  40. data/test-unit/lib/test/unit.rb +23 -42
  41. data/test-unit/lib/test/unit/assertionfailederror.rb +11 -0
  42. data/test-unit/lib/test/unit/assertions.rb +77 -8
  43. data/test-unit/lib/test/unit/autorunner.rb +13 -2
  44. data/test-unit/lib/test/unit/collector/load.rb +2 -3
  45. data/test-unit/lib/test/unit/color-scheme.rb +13 -1
  46. data/test-unit/lib/test/unit/diff.rb +223 -37
  47. data/test-unit/lib/test/unit/failure.rb +27 -5
  48. data/test-unit/lib/test/unit/omission.rb +47 -3
  49. data/test-unit/lib/test/unit/testcase.rb +42 -0
  50. data/test-unit/lib/test/unit/ui/console/testrunner.rb +189 -3
  51. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +14 -0
  52. data/test-unit/lib/test/unit/ui/testrunner.rb +8 -0
  53. data/test-unit/lib/test/unit/version.rb +1 -1
  54. data/test-unit/sample/{tc_adder.rb → test_adder.rb} +3 -1
  55. data/test-unit/sample/{tc_subtracter.rb → test_subtracter.rb} +3 -1
  56. data/test-unit/sample/test_user.rb +1 -0
  57. data/test-unit/test/run-test.rb +2 -0
  58. data/test-unit/test/test-color-scheme.rb +7 -0
  59. data/test-unit/test/test-diff.rb +48 -7
  60. data/test-unit/test/test-omission.rb +1 -1
  61. data/test-unit/test/test-testcase.rb +27 -0
  62. data/test-unit/test/test_assertions.rb +43 -10
  63. data/test/al-test-utils.rb +15 -0
  64. data/test/test_associations.rb +46 -1
  65. data/test/test_attributes.rb +43 -20
  66. data/test/test_base.rb +60 -3
  67. metadata +12 -12
  68. data/test-unit/sample/ts_examples.rb +0 -7
data/CHANGES CHANGED
@@ -1,5 +1,16 @@
1
1
  = CHANGES
2
2
 
3
+ == 1.2.1: 2009-12-15
4
+
5
+ * Supported ActiveRecord 2.3.5 and Rails 2.3.5.
6
+ * Supported GetText 2.1.0 and Locale 2.0.5.
7
+ * belongs_to(:many) support DN attribute.
8
+ * [#31] ActiveLdap::Base#attributes returns data that reflects
9
+ schema definition. [Alexey.Chebotar]
10
+ * blocks DN attribute change by mass assignment with :id => ....
11
+ * [#35] fix has_many association is broken. [culturespy]
12
+ * Supported nested attribute options. [Hideyuki Yasuda]
13
+
3
14
  == 1.2.0: 2009-09-22
4
15
 
5
16
  * Supported ActiveRecord 2.3.4 and Rails 2.3.4.
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = Ruby/ActiveLdap
1
+ = ActiveLdap
2
2
 
3
3
  ruby library for object-oriented LDAP interction
4
4
 
@@ -13,7 +13,7 @@ Contributors::
13
13
 
14
14
  == DESCRIPTION
15
15
 
16
- 'Ruby/ActiveLdap' is a ruby extension library which provides a clean objected
16
+ 'ActiveLdap' is a ruby extension library which provides a clean objected
17
17
  oriented interface to the Ruby/LDAP[0] library. It was inspired by
18
18
  ActivRecord[3]. This is not nearly as clean or as flexible as ActiveRecord, but
19
19
  it is still trivial to define new objects and manipulate them with minimal
@@ -114,7 +114,9 @@ list, please point out.
114
114
  * Lennon Day-Reynolds: Bug reports.
115
115
  * Tilo: A bug report.
116
116
  * Matt Mencel: A bug report.
117
- * CultureSpy: A bug report.
117
+ * CultureSpy:
118
+ * Bug reports.
119
+ * Bug fixes.
118
120
  * gwarf12: A bug report.
119
121
  * Baptiste Grenier: API improvement ideas.
120
122
  * Richard 3 Nicholas: API improvement ideas.
@@ -137,3 +139,4 @@ list, please point out.
137
139
  * George Montana Harkin: A suggestion.
138
140
  * Marc Dequènes: Bug reports.
139
141
  * brad@lucky-dip.net: A bug report.
142
+ * Hideyuki Yasuda: Bug reports.
data/Rakefile CHANGED
@@ -59,21 +59,21 @@ project = Hoe.spec('activeldap') do
59
59
  self.rubyforge_name = 'ruby-activeldap'
60
60
  self.author = ['Will Drewry', 'Kouhei Sutou']
61
61
  self.email = ['redpig@dataspill.org', 'kou@cozmixng.org']
62
- self.summary = 'Ruby/ActiveLdap is a object-oriented API to LDAP'
62
+ self.summary = 'ActiveLdap is a object-oriented API to LDAP'
63
63
  self.url = 'http://rubyforge.org/projects/ruby-activeldap/'
64
64
  self.test_globs = ['test/test_*.rb']
65
65
  self.changes = self.paragraphs_of('CHANGES', 1..2).join("\n\n")
66
66
  self.extra_deps = [
67
67
  # ['ruby-ldap', '= 0.9.9'],
68
- ['activerecord', '= 2.3.4'],
69
- ['locale', '= 2.0.4'],
70
- ['gettext', '= 2.0.4'],
71
- ['gettext_activerecord', '= 2.0.4'],
68
+ ['activerecord', '= 2.3.5'],
69
+ ['locale', '= 2.0.5'],
70
+ ['gettext', '= 2.1.0'],
71
+ ['gettext_activerecord', '= 2.1.0'],
72
72
  ]
73
73
  self.remote_rdoc_dir = "doc"
74
74
  self.rsync_args += " --chmod=Dg+ws,Fg+w"
75
75
  self.description = String.new(<<-EOF)
76
- 'Ruby/ActiveLdap' is a ruby extension library which provides a clean
76
+ 'ActiveLdap' is a ruby extension library which provides a clean
77
77
  objected oriented interface to the Ruby/LDAP library. It was inspired
78
78
  by ActiveRecord. This is not nearly as clean or as flexible as
79
79
  ActiveRecord, but it is still trivial to define new objects and manipulate
@@ -5,7 +5,7 @@
5
5
  # ENV['RAILS_ENV'] ||= 'production'
6
6
 
7
7
  # Specifies gem version of Rails to use when vendor/rails is not present
8
- RAILS_GEM_VERSION = '2.3.4' unless defined? RAILS_GEM_VERSION
8
+ RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
9
9
 
10
10
  # Bootstrap the Rails environment, frameworks, and default configuration
11
11
  require File.join(File.dirname(__FILE__), 'boot')
@@ -27,8 +27,8 @@ Rails::Initializer.run do |config|
27
27
  # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
28
28
  # config.gem "sqlite3-ruby", :lib => "sqlite3"
29
29
  # config.gem "aws-s3", :lib => "aws/s3"
30
- config.gem "locale_rails", :version => "2.0.4"
31
- config.gem "gettext_rails", :version => "2.0.4"
30
+ config.gem "locale_rails", :version => "2.0.5"
31
+ config.gem "gettext_rails", :version => "2.1.0"
32
32
 
33
33
  # Only load the plugins named here, in the order given. By default, all plugins
34
34
  # in vendor/plugins are loaded in alphabetical order.
data/examples/groupadd CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/groupdel CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/groupls CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/groupmod CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/lpasswd CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/ouadd CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/useradd CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/userdel CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/userls CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/examples/usermod CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -W0
1
+ #!/usr/bin/ruby
2
2
 
3
3
  base = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
4
  $LOAD_PATH << File.join(base, "lib")
data/lib/active_ldap.rb CHANGED
@@ -901,7 +901,7 @@ require_gem_if_need = Proc.new do |library_name, gem_name, *gem_args|
901
901
  end
902
902
  end
903
903
 
904
- require_gem_if_need.call("active_support", "activesupport", "= 2.3.4")
904
+ require_gem_if_need.call("active_support", "activesupport", "= 2.3.5")
905
905
 
906
906
  if ActiveSupport.const_defined?(:Dependencies)
907
907
  dependencies = ActiveSupport::Dependencies
@@ -914,7 +914,7 @@ if dependencies.respond_to?(:load_paths)
914
914
  end
915
915
 
916
916
  module ActiveLdap
917
- VERSION = "1.2.0"
917
+ VERSION = "1.2.1"
918
918
  end
919
919
 
920
920
  if RUBY_PLATFORM.match('linux')
@@ -923,11 +923,11 @@ else
923
923
  require 'active_ldap/timeout_stub'
924
924
  end
925
925
 
926
- require_gem_if_need.call("active_record", "activerecord", "= 2.3.4")
926
+ require_gem_if_need.call("active_record", "activerecord", "= 2.3.5")
927
927
  begin
928
- require_gem_if_need.call("locale", nil, "= 2.0.4")
929
- require_gem_if_need.call("gettext", nil, "= 2.0.4")
930
- require_gem_if_need.call("gettext_activerecord", nil, "= 2.0.4")
928
+ require_gem_if_need.call("locale", nil, "= 2.0.5")
929
+ require_gem_if_need.call("gettext", nil, "= 2.1.0")
930
+ require_gem_if_need.call("gettext_activerecord", nil, "= 2.1.0")
931
931
  rescue LoadError
932
932
  end
933
933
  require 'active_ldap/get_text'
@@ -67,7 +67,7 @@ module ActiveLdap
67
67
  def bind(options={})
68
68
  @bind_tried = true
69
69
 
70
- bind_dn = options[:bind_dn] || @bind_dn
70
+ bind_dn = ensure_dn_string(options[:bind_dn] || @bind_dn)
71
71
  try_sasl = options.has_key?(:try_sasl) ? options[:try_sasl] : @try_sasl
72
72
  if options.has_key?(:allow_anonymous)
73
73
  allow_anonymous = options[:allow_anonymous]
@@ -164,6 +164,7 @@ module ActiveLdap
164
164
  values << value
165
165
  end
166
166
 
167
+ base = ensure_dn_string(base)
167
168
  begin
168
169
  operation(options) do
169
170
  yield(base, scope, filter, attrs, limit, callback)
@@ -185,6 +186,7 @@ module ActiveLdap
185
186
  begin
186
187
  operation(options) do
187
188
  targets.each do |target|
189
+ target = ensure_dn_string(target)
188
190
  begin
189
191
  yield(target)
190
192
  rescue LdapError::UnwillingToPerform, LdapError::InsufficientAccess
@@ -198,6 +200,7 @@ module ActiveLdap
198
200
  end
199
201
 
200
202
  def add(dn, entries, options={})
203
+ dn = ensure_dn_string(dn)
201
204
  begin
202
205
  operation(options) do
203
206
  yield(dn, entries)
@@ -218,6 +221,7 @@ module ActiveLdap
218
221
  end
219
222
 
220
223
  def modify(dn, entries, options={})
224
+ dn = ensure_dn_string(dn)
221
225
  begin
222
226
  operation(options) do
223
227
  begin
@@ -234,6 +238,7 @@ module ActiveLdap
234
238
  end
235
239
 
236
240
  def modify_rdn(dn, new_rdn, delete_old_rdn, new_superior, options={})
241
+ dn = ensure_dn_string(dn)
237
242
  operation(options) do
238
243
  yield(dn, new_rdn, delete_old_rdn, new_superior)
239
244
  end
@@ -685,6 +690,14 @@ module ActiveLdap
685
690
  log_entry
686
691
  end
687
692
  end
693
+
694
+ def ensure_dn_string(dn)
695
+ if dn.is_a?(DN)
696
+ dn.to_s
697
+ else
698
+ dn
699
+ end
700
+ end
688
701
  end
689
702
  end
690
703
  end
@@ -76,8 +76,12 @@ module ActiveLdap
76
76
  super do |_dn, _new_rdn, _delete_old_rdn, _new_superior|
77
77
  info = {
78
78
  :name => "modify: RDN",
79
- :dn => _dn, :new_rdn => _new_rdn, :delete_old_rdn => _delete_old_rdn,
79
+ :dn => _dn,
80
+ :new_rdn => _new_rdn,
81
+ :new_superior => _new_superior,
82
+ :delete_old_rdn => _delete_old_rdn
80
83
  }
84
+ _new_rdn = "#{_new_rdn},#{_new_superior}" if _new_superior
81
85
  execute(:modify_rdn, info, _dn, _new_rdn, _delete_old_rdn)
82
86
  end
83
87
  end
@@ -118,9 +118,15 @@ module ActiveLdap
118
118
 
119
119
  def modify_rdn(dn, new_rdn, delete_old_rdn, new_superior, options={})
120
120
  super do |_dn, _new_rdn, _delete_old_rdn, _new_superior|
121
+ if _new_superior
122
+ raise NotImplemented.new(_("modify RDN with new superior"))
123
+ end
121
124
  info = {
122
125
  :name => "modify: RDN",
123
- :dn => _dn, :new_rdn => _new_rdn, :delete_old_rdn => _delete_old_rdn,
126
+ :dn => _dn,
127
+ :new_rdn => _new_rdn,
128
+ :new_superior => _new_superior,
129
+ :delete_old_rdn => _delete_old_rdn
124
130
  }
125
131
  execute(:rename, info,
126
132
  :olddn => _dn,
@@ -5,6 +5,8 @@ module ActiveLdap
5
5
  class BelongsToMany < Collection
6
6
  private
7
7
  def insert_entry(entry)
8
+ _foreign_class = foreign_class
9
+ entry = _foreign_class.find(entry) unless entry.is_a?(_foreign_class)
8
10
  old_value = entry[@options[:many], true]
9
11
  primary_key_name = @options[:primary_key_name]
10
12
  if primary_key_name == "dn"
@@ -21,7 +23,9 @@ module ActiveLdap
21
23
  end
22
24
 
23
25
  def delete_entries(entries)
26
+ _foreign_class = foreign_class
24
27
  entries.each do |entry|
28
+ entry = _foreign_class.find(entry) unless entry.is_a?(_foreign_class)
25
29
  old_value = entry[@options[:many], true]
26
30
  primary_key_name = @options[:primary_key_name]
27
31
  if primary_key_name == "dn"
@@ -8,23 +8,23 @@ module ActiveLdap
8
8
 
9
9
  private
10
10
  def insert_entry(entry)
11
- entry[@options[:foreign_key_name]] = @owner[primary_key]
11
+ entry[foreign_key] = @owner[primary_key]
12
12
  entry.save
13
13
  end
14
14
 
15
15
  def find_target
16
- collect_targets(:primary_key_name)
16
+ collect_targets(primary_key)
17
17
  end
18
18
 
19
19
  def delete_entries(entries)
20
- key = @options[:foreign_key_name]
20
+ _foreign_key = foreign_key
21
21
  components = @owner[primary_key, true].reject do |value|
22
22
  value.nil?
23
23
  end
24
24
  filter = [:and,
25
- [:and, {key => components}],
25
+ [:and, {_foreign_key => components}],
26
26
  [:or, {foreign_class.dn_attribute => entries.collect(&:id)}]]
27
- foreign_class.update_all({key => []}, filter)
27
+ foreign_class.update_all({_foreign_key => []}, filter)
28
28
  end
29
29
  end
30
30
  end
@@ -3,15 +3,14 @@ module ActiveLdap
3
3
  module HasManyUtils
4
4
  private
5
5
  def collect_targets(requested_target_key, need_requested_targets=false)
6
- foreign_base_key = primary_key
7
- return [] if foreign_base_key.nil?
8
-
9
- requested_targets = @owner[@options[requested_target_key], true]
6
+ _foreign_key = foreign_key
7
+ return [] if _foreign_key.nil?
10
8
 
9
+ requested_targets = @owner[requested_target_key, true]
11
10
  requested_targets = requested_targets.reject(&:nil?)
12
11
  if requested_targets.empty?
13
12
  targets = []
14
- elsif foreign_base_key == "dn"
13
+ elsif _foreign_key == "dn"
15
14
  requested_targets = requested_targets.collect do |target|
16
15
  if target.is_a?(DN)
17
16
  target
@@ -28,7 +27,7 @@ module ActiveLdap
28
27
  end
29
28
  else
30
29
  components = requested_targets.collect do |value|
31
- [foreign_base_key, value]
30
+ [_foreign_key, value]
32
31
  end
33
32
  options = find_options(:filter => [:or, *components])
34
33
  targets = foreign_class.find(:all, options)
@@ -9,11 +9,11 @@ module ActiveLdap
9
9
  private
10
10
  def insert_entry(entry)
11
11
  old_value = @owner[@options[:wrap], true]
12
- _primary_key = primary_key
13
- if _primary_key == "dn"
12
+ _foreign_key = foreign_key
13
+ if _foreign_key == "dn"
14
14
  old_value = dn_values_to_string_values(old_value)
15
15
  end
16
- current_value = entry[_primary_key, true]
16
+ current_value = entry[_foreign_key, true]
17
17
  current_value = dn_values_to_string_values(current_value)
18
18
  new_value = (old_value + current_value).uniq.sort
19
19
  if old_value != new_value
@@ -24,11 +24,11 @@ module ActiveLdap
24
24
 
25
25
  def delete_entries(entries)
26
26
  old_value = @owner[@options[:wrap], true]
27
- _primary_key = primary_key
28
- if _primary_key == "dn"
27
+ _foreign_key = foreign_key
28
+ if _foreign_key == "dn"
29
29
  old_value = dn_values_to_string_values(old_value)
30
30
  end
31
- current_value = entries.collect {|entry| entry[_primary_key]}
31
+ current_value = entries.collect {|entry| entry[_foreign_key]}
32
32
  current_value = dn_values_to_string_values(current_value)
33
33
  new_value = old_value - current_value
34
34
  new_value = new_value.uniq.sort
@@ -39,13 +39,13 @@ module ActiveLdap
39
39
  end
40
40
 
41
41
  def find_target
42
- targets, requested_targets = collect_targets(:wrap, true)
42
+ targets, requested_targets = collect_targets(@options[:wrap], true)
43
43
  return [] if targets.nil?
44
44
 
45
45
  found_targets = {}
46
- foreign_base_key = primary_key
46
+ _foreign_key = foreign_key
47
47
  targets.each do |target|
48
- found_targets[target[foreign_base_key]] ||= target
48
+ found_targets[target[_foreign_key]] ||= target
49
49
  end
50
50
 
51
51
  klass = foreign_class
@@ -53,6 +53,10 @@ module ActiveLdap
53
53
  found_targets[name] || klass.new(name)
54
54
  end
55
55
  end
56
+
57
+ def foreign_key
58
+ @options[:primary_key_name] || foreign_class.dn_attribute
59
+ end
56
60
  end
57
61
  end
58
62
  end