activeldap 4.0.6 → 5.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 549828cfce6c587f25851096b0adf279c77b8da2
4
- data.tar.gz: c8b3dc33d6e602e801f6ea7a223fcfd02fc587a3
3
+ metadata.gz: 9c8e12943a7cec9dc82ccb3d0691ef449ac50218
4
+ data.tar.gz: 7a5902d6f963ff74d9bb54c8f7f52a0e063c1929
5
5
  SHA512:
6
- metadata.gz: b75cccdfba4b4f3735f9a3f2b11d3e1d1595c823ecfd979c7fa351b4e034645634cec04650c6c127e888c895b96715f25613883770dbf115dc068700ec60e6fe
7
- data.tar.gz: 4531111740536884deb9c5dd3d4be3adea9a944849bf4ebc61d96b5bc0468eeb05b144495787fa5e0f074e3430cc33f30eccb1b66dccec76bc3b3835bcbb11e7
6
+ metadata.gz: 7f0106de394d61a8ca1524676c88d00cfbf8cf8839fa6004509685e1c30b0f37ddf3efee78d8a53eb23e7c905daa3fc0322cf4f5c2d9cff65bb9c4b4b4a6c42f
7
+ data.tar.gz: 71532cb3525dc88eb99f9dfe19203f2fd294e7e6575b589fe61649bd0fbd13f8d7b78ced72f8d6803b549b1f20a591c3b886b17951b15a8b9a97e31c8e9d906e
@@ -1,5 +1,35 @@
1
1
  h1. News
2
2
 
3
+ h2(#release-5-1-0). 5.1.0: 2017-05-01
4
+
5
+ h3. Improvements
6
+
7
+ * Supported Rails 5.1.0.
8
+
9
+ * Supported sub class instantiate by objectClass.
10
+ [GitHub#134][Patch by Chris Garrigues]
11
+
12
+ * Improved error messages.
13
+
14
+ * Changed to the default LDAP client to net-ldap from ruby-ldap
15
+ because ruby-ldap doesn't support timeout.
16
+
17
+ * Suppressed warnings.
18
+ [GitHub#146][Reported by jas01]
19
+
20
+ h3. Fixes
21
+
22
+ * Added missing dependency.
23
+ [GitHub#145][Reported by Tom Wardrop]
24
+
25
+ h3. Thanks
26
+
27
+ * Chris Garrigues
28
+
29
+ * Tom Wardrop
30
+
31
+ * jas01
32
+
3
33
  h2(#release-4-0-6). 4.0.6: 2016-04-07
4
34
 
5
35
  h3. Improvements
data/lib/active_ldap.rb CHANGED
@@ -8,12 +8,6 @@ module ActiveLdap
8
8
  autoload :Command, "active_ldap/command"
9
9
  end
10
10
 
11
- if RUBY_PLATFORM.match('linux')
12
- require 'active_ldap/timeout'
13
- else
14
- require 'active_ldap/timeout_stub'
15
- end
16
-
17
11
  require 'active_ldap/get_text'
18
12
 
19
13
  require 'active_ldap/compatible'
@@ -1,3 +1,5 @@
1
+ require 'timeout'
2
+
1
3
  require 'active_ldap/schema'
2
4
  require 'active_ldap/entry_attribute'
3
5
  require 'active_ldap/ldap_error'
@@ -328,7 +330,7 @@ module ActiveLdap
328
330
  n_retries = 0
329
331
  retry_limit = options[:retry_limit] || @retry_limit
330
332
  begin
331
- do_in_timeout(@timeout, &block)
333
+ Timeout.timeout(@timeout, &block)
332
334
  rescue Timeout::Error => e
333
335
  @logger.error {_('Requested action timed out.')}
334
336
  if @retry_on_timeout and (retry_limit < 0 or n_retries <= retry_limit)
@@ -344,10 +346,6 @@ module ActiveLdap
344
346
  end
345
347
  end
346
348
 
347
- def do_in_timeout(timeout, &block)
348
- Timeout.alarm(timeout, &block)
349
- end
350
-
351
349
  def sasl_bind(bind_dn, options={})
352
350
  # Get all SASL mechanisms
353
351
  mechanisms = operation(options) do
@@ -601,9 +599,13 @@ module ActiveLdap
601
599
  raise
602
600
  rescue => detail
603
601
  @logger.error do
604
- _("Reconnect to server failed: %s\n" \
602
+ _("Reconnect to server failed: %s: %s\n" \
605
603
  "Reconnect to server failed backtrace:\n" \
606
- "%s") % [detail.message, detail.backtrace.join("\n")]
604
+ "%s") % [
605
+ detail.class,
606
+ detail.message,
607
+ detail.backtrace.join("\n"),
608
+ ]
607
609
  end
608
610
  # Do not loop if forced
609
611
  raise ConnectionError, detail.message if force
@@ -75,15 +75,15 @@ module ActiveLdap
75
75
  association_class = Association::BelongsTo
76
76
  opts[:foreign_key_name] ||= "#{association_id}_id"
77
77
 
78
- before_save(<<-EOC)
79
- if defined?(@#{association_id})
80
- association = @#{association_id}
78
+ before_save do
79
+ if instance_variable_defined?(:"@#{association_id}")
80
+ association = instance_variable_get(:"@#{association_id}")
81
81
  if association and association.updated?
82
82
  self[association.__send__(:primary_key)] =
83
- association[#{opts[:foreign_key_name].dump}]
83
+ association[opts[:foreign_key_name]]
84
84
  end
85
85
  end
86
- EOC
86
+ end
87
87
  end
88
88
 
89
89
  association_accessor(association_id) do |target|
@@ -32,6 +32,7 @@
32
32
  require 'English'
33
33
  require 'thread'
34
34
  require 'erb'
35
+ require 'set'
35
36
 
36
37
  module ActiveLdap
37
38
  # OO-interface to LDAP assuming pam/nss_ldap-style organization with
@@ -330,6 +331,7 @@ module ActiveLdap
330
331
  class_local_attr_accessor true, :dn_attribute, :scope, :sort_by, :order
331
332
  class_local_attr_accessor true, :required_classes, :recommended_classes
332
333
  class_local_attr_accessor true, :excluded_classes
334
+ class_local_attr_accessor false, :sub_classes
333
335
 
334
336
  class << self
335
337
  # Hide new in Base
@@ -340,6 +342,7 @@ module ActiveLdap
340
342
  sub_class.module_eval do
341
343
  include GetTextSupport
342
344
  end
345
+ (self.sub_classes ||= []) << sub_class
343
346
  end
344
347
 
345
348
  # Set LDAP connection configuration up. It doesn't connect
@@ -548,6 +551,20 @@ module ActiveLdap
548
551
  defaults.first || name || to_s
549
552
  end
550
553
 
554
+ protected
555
+ def find_real_class(object_classes)
556
+ (sub_classes || []).each do |sub_class|
557
+ real_class = sub_class.find_real_class(object_classes)
558
+ return real_class if real_class
559
+ end
560
+
561
+ if object_classes.superset?(Set.new(classes))
562
+ self
563
+ else
564
+ nil
565
+ end
566
+ end
567
+
551
568
  private
552
569
  def inspect_attributes(attributes)
553
570
  inspected_attribute_names = {}
@@ -594,12 +611,19 @@ module ActiveLdap
594
611
  def instantiate(args)
595
612
  dn, attributes, options = args
596
613
  options ||= {}
597
- if self.class == Class
598
- klass = self.ancestors[0].to_s.split(':').last
599
- real_klass = self.ancestors[0]
614
+
615
+ object_classes_raw =
616
+ attributes["objectClass"] ||
617
+ attributes["objectclass"] ||
618
+ []
619
+ if sub_classes.nil? or object_classes_raw.empty?
620
+ real_klass = self
600
621
  else
601
- klass = self.class.to_s.split(':').last
602
- real_klass = self.class
622
+ object_classes = Set.new
623
+ object_classes_raw.each do |object_class_raw|
624
+ object_classes << schema.object_class(object_class_raw)
625
+ end
626
+ real_klass = find_real_class(object_classes) || self
603
627
  end
604
628
 
605
629
  obj = real_klass.allocate
@@ -14,13 +14,12 @@ module ActiveLdap
14
14
  included do
15
15
  extend ActiveModel::Callbacks
16
16
  include ActiveModel::Validations::Callbacks
17
-
17
+ singleton_class.class_eval do
18
+ prepend CallbackedInstantiatable
19
+ end
20
+
18
21
  define_model_callbacks :initialize, :find, :touch, :only => :after
19
22
  define_model_callbacks :save, :create, :update, :destroy
20
-
21
- class << self
22
- alias_method_chain :instantiate, :callbacks
23
- end
24
23
  end
25
24
 
26
25
  module ClassMethods
@@ -33,9 +32,9 @@ module ActiveLdap
33
32
  end
34
33
  end
35
34
 
36
- module ClassMethods
37
- def instantiate_with_callbacks(record)
38
- object = instantiate_without_callbacks(record)
35
+ module CallbackedInstantiatable
36
+ def instantiate(record)
37
+ object = super(record)
39
38
  object.run_callbacks(:find)
40
39
  object.run_callbacks(:initialize)
41
40
  object
@@ -197,27 +197,9 @@ module ActiveLdap
197
197
  if Object.respond_to?(:java)
198
198
  "jndi"
199
199
  else
200
- ruby_ldap_available = false
201
- $LOAD_PATH.each do |path|
202
- if File.exist?(File.join(path, "ldap", "ldif.rb"))
203
- ruby_ldap_available = true
204
- break
205
- end
206
- end
207
- if !ruby_ldap_available and Object.const_defined?(:Gem)
208
- ruby_ldap_available = gem_available?("ruby-ldap")
209
- end
210
- if ruby_ldap_available
211
- "ldap"
212
- else
213
- "net-ldap"
214
- end
200
+ "net-ldap"
215
201
  end
216
202
  end
217
-
218
- def gem_available?(name)
219
- not Gem::Specification.find_all_by_name(name).empty?
220
- end
221
203
  end
222
204
 
223
205
  def setup_connection(config=nil)
@@ -1,3 +1,3 @@
1
1
  module ActiveLdap
2
- VERSION = "4.0.6"
2
+ VERSION = "5.1.0"
3
3
  end
data/po/en/active-ldap.po CHANGED
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: Ruby/ActiveLdap 1.1.1\n"
9
9
  "POT-Creation-Date: 2009-08-04 23:26+0900\n"
10
- "PO-Revision-Date: 2009-02-25 08:40+0900\n"
10
+ "PO-Revision-Date: 2016-05-13 21:52+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"
@@ -3524,7 +3524,7 @@ msgstr ""
3524
3524
 
3525
3525
  #: lib/active_ldap/adapter/base.rb:579
3526
3526
  msgid ""
3527
- "Reconnect to server failed: %s\n"
3527
+ "Reconnect to server failed: %s: %s\n"
3528
3528
  "Reconnect to server failed backtrace:\n"
3529
3529
  "%s"
3530
3530
  msgstr ""
data/po/ja/active-ldap.po CHANGED
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: Ruby/ActiveLdap 1.1.1\n"
9
9
  "POT-Creation-Date: 2009-08-04 23:26+0900\n"
10
- "PO-Revision-Date: 2009-08-04 23:28+0900\n"
10
+ "PO-Revision-Date: 2016-05-13 21:53+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"
@@ -3533,11 +3533,11 @@ msgstr "再接続を試みています"
3533
3533
 
3534
3534
  #: lib/active_ldap/adapter/base.rb:579
3535
3535
  msgid ""
3536
- "Reconnect to server failed: %s\n"
3536
+ "Reconnect to server failed: %s: %s\n"
3537
3537
  "Reconnect to server failed backtrace:\n"
3538
3538
  "%s"
3539
3539
  msgstr ""
3540
- "サーバへの再接続が失敗しました: %s\n"
3540
+ "サーバへの再接続が失敗しました: %s: %s\n"
3541
3541
  "サーバへの再接続失敗時のバックトレース:\n"
3542
3542
  "%s"
3543
3543
 
data/test/command.rb CHANGED
@@ -36,24 +36,21 @@ module Command
36
36
  return java_run(cmd, *args, &block) if Object.respond_to?(:java)
37
37
  in_r, in_w = IO.pipe
38
38
  out_r, out_w = IO.pipe
39
- pid = nil
40
- Thread.exclusive do
41
- verbose = $VERBOSE
42
- # ruby(>=1.8)'s fork terminates other threads with warning messages
43
- $VERBOSE = nil
44
- pid = fork do
45
- $VERBOSE = verbose
46
- detach_io
47
- STDIN.reopen(in_r)
48
- in_r.close
49
- STDOUT.reopen(out_w)
50
- STDERR.reopen(out_w)
51
- out_w.close
52
- exec(cmd, *args)
53
- exit!(-1)
54
- end
39
+ verbose = $VERBOSE
40
+ # ruby(>=1.8)'s fork terminates other threads with warning messages
41
+ $VERBOSE = nil
42
+ pid = fork do
55
43
  $VERBOSE = verbose
44
+ detach_io
45
+ STDIN.reopen(in_r)
46
+ in_r.close
47
+ STDOUT.reopen(out_w)
48
+ STDERR.reopen(out_w)
49
+ out_w.close
50
+ exec(cmd, *args)
51
+ exit!(-1)
56
52
  end
53
+ $VERBOSE = verbose
57
54
  yield(out_r, in_w) if block_given?
58
55
  in_r.close unless in_r.closed?
59
56
  out_w.close unless out_w.closed?
data/test/test_base.rb CHANGED
@@ -663,6 +663,43 @@ class TestBase < Test::Unit::TestCase
663
663
  end
664
664
  end
665
665
 
666
+ class TestInstantiate < self
667
+ class Person < ActiveLdap::Base
668
+ ldap_mapping dn_attribute: "cn",
669
+ prefix: "ou=People",
670
+ scope: :one,
671
+ classes: ["top", "person"]
672
+ end
673
+
674
+ class OrganizationalPerson < Person
675
+ ldap_mapping dn_attribute: "cn",
676
+ prefix: "",
677
+ classes: ["top", "person", "organizationalPerson"]
678
+ end
679
+
680
+ class ResidentialPerson < Person
681
+ ldap_mapping dn_attribute: "cn",
682
+ prefix: "",
683
+ classes: ["top", "person", "residentialPerson"]
684
+ end
685
+
686
+ def test_sub_class
687
+ make_ou("People")
688
+ residential_person = ResidentialPerson.new(cn: "John Doe",
689
+ sn: "Doe",
690
+ street: "123 Main Street",
691
+ l: "Anytown")
692
+ residential_person.save!
693
+ organizational_person = OrganizationalPerson.new(cn: "Jane Smith",
694
+ sn: "Smith",
695
+ title: "General Manager")
696
+ organizational_person.save!
697
+ people = Person.all
698
+ assert_equal([ResidentialPerson, OrganizationalPerson],
699
+ people.collect(&:class))
700
+ end
701
+ end
702
+
666
703
  def test_reload_of_not_exists_entry
667
704
  make_temporary_user do |user,|
668
705
  assert_nothing_raised do
@@ -6,10 +6,10 @@ class TestCallback < Test::Unit::TestCase
6
6
  priority :must
7
7
  def test_new
8
8
  initialized_entries = []
9
- @group_class.instance_variable_set("@initialized_entries",
10
- initialized_entries)
11
9
  @group_class.module_eval do
12
- after_initialize "self.class.instance_variable_get('@initialized_entries') << self"
10
+ after_initialize do
11
+ initialized_entries << self
12
+ end
13
13
  end
14
14
  assert_equal([], initialized_entries)
15
15
  new_group = @group_class.new(:cn => "new-cn")
@@ -22,12 +22,14 @@ class TestCallback < Test::Unit::TestCase
22
22
  make_temporary_group do |group|
23
23
  found_entries = []
24
24
  initialized_entries = []
25
- @group_class.instance_variable_set("@found_entries", found_entries)
26
- @group_class.instance_variable_set("@initialized_entries",
27
- initialized_entries)
28
25
  @group_class.module_eval do
29
- after_find "self.class.instance_variable_get('@found_entries') << self"
30
- after_initialize "self.class.instance_variable_get('@initialized_entries') << self"
26
+ prepend ActiveLdap::Callbacks::CallbackedInstantiatable
27
+ after_find do
28
+ found_entries << self
29
+ end
30
+ after_initialize do
31
+ initialized_entries << self
32
+ end
31
33
  end
32
34
 
33
35
  assert_equal([], found_entries)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeldap
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.6
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Drewry
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-04-07 00:00:00.000000000 Z
12
+ date: 2017-05-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: builder
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: bundler
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -265,8 +279,6 @@ files:
265
279
  - lib/active_ldap/schema.rb
266
280
  - lib/active_ldap/schema/syntaxes.rb
267
281
  - lib/active_ldap/supported_control.rb
268
- - lib/active_ldap/timeout.rb
269
- - lib/active_ldap/timeout_stub.rb
270
282
  - lib/active_ldap/user_password.rb
271
283
  - lib/active_ldap/validations.rb
272
284
  - lib/active_ldap/version.rb
@@ -347,7 +359,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
347
359
  version: '0'
348
360
  requirements: []
349
361
  rubyforge_project: ruby-activeldap
350
- rubygems_version: 2.5.1
362
+ rubygems_version: 2.5.2
351
363
  signing_key:
352
364
  specification_version: 4
353
365
  summary: ActiveLdap is a object-oriented API to LDAP
@@ -400,4 +412,3 @@ test_files:
400
412
  - test/test_usermod-lang-add.rb
401
413
  - test/test_usermod.rb
402
414
  - test/test_validation.rb
403
- has_rdoc:
@@ -1,75 +0,0 @@
1
- require 'timeout'
2
-
3
- module Timeout
4
-
5
- # A forking timeout implementation that relies on
6
- # signals to interrupt blocking I/O instead of passing
7
- # that code to run in a separate process.
8
- #
9
- # A process is fork()ed, sleeps for _sec_,
10
- # then sends a ALRM signal to the Process.ppid
11
- # process. ALRM is used to avoid conflicts with sleep()
12
- #
13
- # This overwrites any signal
14
- def Timeout.alarm(sec, exception=Timeout::Error, &block)
15
- return block.call if sec == nil or sec.zero?
16
-
17
-
18
- # Trap an alarm in case it comes before we're ready
19
- orig_alrm = trap(:ALRM, 'IGNORE')
20
-
21
- # Setup a fallback in case of a race condition of an
22
- # alarm before we set the other trap
23
- trap(:ALRM) do
24
- # Don't leave zombies
25
- Process.wait2()
26
- # Restore the original handler
27
- trap('ALRM', orig_alrm)
28
- # Now raise an exception!
29
- raise exception, 'execution expired'
30
- end
31
-
32
- # Spawn the sleeper
33
- pid = Process.fork {
34
- begin
35
- # Sleep x seconds then send SIGALRM
36
- sleep(sec)
37
- # Send alarm!
38
- Process.kill(:ALRM, Process.ppid)
39
- end
40
- exit! 0
41
- }
42
-
43
- # Setup the real handler
44
- trap(:ALRM) do
45
- # Make sure we clean up any zombies
46
- Process.waitpid(pid)
47
- # Restore the original handler
48
- trap(:ALRM, orig_alrm)
49
- # Now raise an exception!
50
- raise exception, 'execution expired'
51
- end
52
-
53
- begin
54
- # Run the code!
55
- return block.call
56
- ensure
57
- # Restore old alarm handler since we're done
58
- trap(:ALRM, orig_alrm)
59
- # Make sure the process is dead
60
- # This may be run twice (trap occurs during execution) so ignore ESRCH
61
- Process.kill(:TERM, pid) rescue Errno::ESRCH
62
- # Don't leave zombies
63
- Process.waitpid(pid) rescue Errno::ECHILD
64
- end
65
- end
66
- end # Timeout
67
-
68
- if __FILE__ == $0
69
- require 'time'
70
- Timeout.alarm(2) do
71
- loop do
72
- p Time.now
73
- end
74
- end
75
- end
@@ -1,17 +0,0 @@
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