activeldap 4.0.3 → 4.0.4
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 +4 -4
- data/README.textile +3 -3
- data/doc/text/news.textile +41 -0
- data/examples/useradd +2 -0
- data/lib/active_ldap/adapter/base.rb +35 -9
- data/lib/active_ldap/adapter/ldap.rb +3 -0
- data/lib/active_ldap/base.rb +0 -2
- data/lib/active_ldap/configuration.rb +47 -7
- data/lib/active_ldap/log_subscriber.rb +5 -4
- data/lib/active_ldap/populate.rb +16 -4
- data/lib/active_ldap/version.rb +1 -1
- data/test/al-test-utils.rb +1 -1
- data/test/test_base.rb +1 -1
- data/test/test_configuration.rb +8 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c12549921e8f9d7aa8674add95bc2f48f82afdd
|
4
|
+
data.tar.gz: dd5633df0f5fc5ce5241ff4d77545bc243b8becb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ef5b66f2ece4f6eea6b6c46db97df52e97dd72b3d80e47d4027ed135346780f90de594b3bce5a2cae221d1f186fb3e225627600a8bd786b2326713388064efa
|
7
|
+
data.tar.gz: 580ccd4daf6d3625358be6c7ccba2f3a64aee0722dd8e9d7b2bc354c32120915692d42c59287054b1edb6cb37aee42f6b2cacfd4b0d5ead69be200b6e75f2008
|
data/README.textile
CHANGED
@@ -14,7 +14,7 @@ flexible as ActiveRecord, but it is still trivial to define
|
|
14
14
|
new objects and manipulate them with minimal difficulty.
|
15
15
|
|
16
16
|
For example and usage - read the
|
17
|
-
"document":http://
|
17
|
+
"document":http://activeldap.github.io/.
|
18
18
|
|
19
19
|
h2. Prerequisites
|
20
20
|
|
@@ -29,8 +29,8 @@ See the above links for installation.
|
|
29
29
|
JRuby doesn't need to install new library because JRuby
|
30
30
|
has builtin LDAP support. Ruby users need one of them:
|
31
31
|
|
32
|
-
* "Ruby/LDAP":http://
|
33
|
-
* "Net::LDAP":http://
|
32
|
+
* "Ruby/LDAP":http://ruby-ldap.sourceforge.net/
|
33
|
+
* "Net::LDAP":http://rubyldap.com/
|
34
34
|
|
35
35
|
See the above links for installation.
|
36
36
|
=:
|
data/doc/text/news.textile
CHANGED
@@ -1,5 +1,46 @@
|
|
1
1
|
h1. News
|
2
2
|
|
3
|
+
h2(#release-4-0-4). 4.0.4: 2014-10-11
|
4
|
+
|
5
|
+
h3. Improvements
|
6
|
+
|
7
|
+
* Migrated to commit mail mailing list to "Google
|
8
|
+
Groups":https://groups.google.com/forum/?hl=ja#!forum/activeldap-commit
|
9
|
+
from RubyForge. Thanks to RubyForge! RubyForge was very helpful!
|
10
|
+
* Update project homepage URL in README.
|
11
|
+
[GitHub#103] [Patch by Adam Whittingham]
|
12
|
+
* Removed needless @Enumerable@ inclusion in @ActiveLdap::Base@.
|
13
|
+
[GitHub#104] [Patch by Murray Steele]
|
14
|
+
* {ActiveLdap::Populate.ensure_base}: Supported ou entry creation in base DN.
|
15
|
+
* Added @follow_referrals@ configuration. You can disable auto
|
16
|
+
referrals following by specifying @false@. It is useful when you
|
17
|
+
can't access referrals.
|
18
|
+
|
19
|
+
This configuration is enabled by default.
|
20
|
+
|
21
|
+
This configuration works only with ruby-ldap adapter.
|
22
|
+
|
23
|
+
[GitHub#99] [Suggested by hadmut]
|
24
|
+
|
25
|
+
* Supported @bindname@ extension in LDAP URL such as
|
26
|
+
@ldap://host/dc=base,dc=name????bindname=cn%3Dadmin%2Cdc%3Dexample%2Cdc%3Dcom%3F@.
|
27
|
+
|
28
|
+
h3. Fixes
|
29
|
+
|
30
|
+
* Fixed a bug logging is failed on removing a connection.
|
31
|
+
[GitHub#94] [Reported by Francisco Miguel Biete]
|
32
|
+
* Fixed homepage URL in RubyGems.
|
33
|
+
[GitHub#95] [Patch by Vít Ondruch]
|
34
|
+
* Fixed a bug that DN in LDAP URL is used as bind DN not base DN.
|
35
|
+
|
36
|
+
h3. Thanks
|
37
|
+
|
38
|
+
* Francisco Miguel Biete
|
39
|
+
* Vít Ondruch
|
40
|
+
* Adam Whittingham
|
41
|
+
* Murray Steele
|
42
|
+
* hadmut
|
43
|
+
|
3
44
|
h2(#4-0-3). 4.0.3: 2014-05-15
|
4
45
|
|
5
46
|
h3. Improvements
|
data/examples/useradd
CHANGED
@@ -8,13 +8,26 @@ module ActiveLdap
|
|
8
8
|
class Base
|
9
9
|
include GetTextSupport
|
10
10
|
|
11
|
-
VALID_ADAPTER_CONFIGURATION_KEYS = [
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
VALID_ADAPTER_CONFIGURATION_KEYS = [
|
12
|
+
:host,
|
13
|
+
:port,
|
14
|
+
:method,
|
15
|
+
:timeout,
|
16
|
+
:retry_on_timeout,
|
17
|
+
:retry_limit,
|
18
|
+
:retry_wait,
|
19
|
+
:bind_dn,
|
20
|
+
:password,
|
21
|
+
:password_block,
|
22
|
+
:try_sasl,
|
23
|
+
:sasl_mechanisms,
|
24
|
+
:sasl_quiet,
|
25
|
+
:allow_anonymous,
|
26
|
+
:store_password,
|
27
|
+
:scope,
|
28
|
+
:sasl_options,
|
29
|
+
:follow_referrals,
|
30
|
+
]
|
18
31
|
|
19
32
|
@@row_even = true
|
20
33
|
|
@@ -24,12 +37,14 @@ module ActiveLdap
|
|
24
37
|
@bound = false
|
25
38
|
@bind_tried = false
|
26
39
|
@entry_attributes = {}
|
40
|
+
@follow_referrals = nil
|
27
41
|
@configuration = configuration.dup
|
28
42
|
@logger = @configuration.delete(:logger)
|
29
43
|
@configuration.assert_valid_keys(VALID_ADAPTER_CONFIGURATION_KEYS)
|
30
44
|
VALID_ADAPTER_CONFIGURATION_KEYS.each do |name|
|
31
45
|
instance_variable_set("@#{name}", configuration[name])
|
32
46
|
end
|
47
|
+
@follow_referrals = true if @follow_referrals.nil?
|
33
48
|
@instrumenter = ActiveSupport::Notifications.instrumenter
|
34
49
|
end
|
35
50
|
|
@@ -246,6 +261,15 @@ module ActiveLdap
|
|
246
261
|
end
|
247
262
|
end
|
248
263
|
|
264
|
+
def follow_referrals?(options={})
|
265
|
+
option_follow_referrals = options[:follow_referrals]
|
266
|
+
if option_follow_referrals.nil?
|
267
|
+
@follow_referrals
|
268
|
+
else
|
269
|
+
option_follow_referrals
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
249
273
|
def prepare_connection(options)
|
250
274
|
end
|
251
275
|
|
@@ -658,8 +682,10 @@ module ActiveLdap
|
|
658
682
|
|
659
683
|
def log(name, info=nil)
|
660
684
|
result = nil
|
661
|
-
payload = {
|
662
|
-
|
685
|
+
payload = {
|
686
|
+
:name => name,
|
687
|
+
:info => info || {},
|
688
|
+
}
|
663
689
|
@instrumenter.instrument("log_info.active_ldap", payload) do
|
664
690
|
result = yield if block_given?
|
665
691
|
end
|
@@ -189,6 +189,9 @@ module ActiveLdap
|
|
189
189
|
def prepare_connection(options={})
|
190
190
|
operation(options) do
|
191
191
|
@connection.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
|
192
|
+
unless follow_referrals?(options)
|
193
|
+
@connection.set_option(LDAP::LDAP_OPT_REFERRALS, 0)
|
194
|
+
end
|
192
195
|
end
|
193
196
|
end
|
194
197
|
|
data/lib/active_ldap/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "English"
|
2
|
+
require "cgi"
|
1
3
|
require 'uri'
|
2
4
|
begin
|
3
5
|
require 'uri/ldaps'
|
@@ -43,6 +45,7 @@ module ActiveLdap
|
|
43
45
|
DEFAULT_CONFIG[:timeout] = 0 # in seconds; 0 <= Never timeout
|
44
46
|
# Whether or not to retry on timeouts
|
45
47
|
DEFAULT_CONFIG[:retry_on_timeout] = true
|
48
|
+
DEFAULT_CONFIG[:follow_referrals] = true
|
46
49
|
|
47
50
|
DEFAULT_CONFIG[:logger] = nil
|
48
51
|
|
@@ -96,7 +99,7 @@ module ActiveLdap
|
|
96
99
|
def remove_connection_related_configuration(config)
|
97
100
|
config.reject do |key, value|
|
98
101
|
CONNECTION_CONFIGURATION_KEYS.include?(key)
|
99
|
-
|
102
|
+
end
|
100
103
|
end
|
101
104
|
|
102
105
|
def merge_configuration(user_configuration, target=self)
|
@@ -135,12 +138,49 @@ module ActiveLdap
|
|
135
138
|
raise ConfigurationError.new(_("not a LDAP URI: %s") % uri.to_s)
|
136
139
|
end
|
137
140
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
141
|
+
merger = URIConfigurationMerger.new(uri)
|
142
|
+
merger.merge(configuration)
|
143
|
+
end
|
144
|
+
|
145
|
+
class URIConfigurationMerger
|
146
|
+
def initialize(uri)
|
147
|
+
@uri = uri
|
148
|
+
end
|
149
|
+
|
150
|
+
def merge(configuration)
|
151
|
+
uri_configuration = {:port => @uri.port}
|
152
|
+
uri_configuration[:host] = @uri.host if @uri.host
|
153
|
+
uri_configuration[:base] = @uri.dn if @uri.dn
|
154
|
+
extensions = parse_extensions
|
155
|
+
bindname_extension = extensions["bindname"]
|
156
|
+
if bindname_extension
|
157
|
+
uri_configuration[:bind_dn] = bindname_extension[:value]
|
158
|
+
uri_configuration[:allow_anonymous] = !bindname_extension[:critical]
|
159
|
+
end
|
160
|
+
uri_configuration[:scope] = @uri.scope if @uri.scope
|
161
|
+
uri_configuration[:method] = :ssl if @uri.is_a?(URI::LDAPS)
|
162
|
+
uri_configuration.merge(configuration)
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
def parse_extensions
|
167
|
+
extensions = {}
|
168
|
+
(@uri.extensions || "").split(",").collect do |extension|
|
169
|
+
name, value = extension.split("=", 2)
|
170
|
+
case name
|
171
|
+
when /\A!/
|
172
|
+
critical = true
|
173
|
+
name = $POSTMATCH
|
174
|
+
else
|
175
|
+
critical = false
|
176
|
+
end
|
177
|
+
extensions[name] = {
|
178
|
+
:critical => critical,
|
179
|
+
:value => CGI.unescape(value || ""),
|
180
|
+
}
|
181
|
+
end
|
182
|
+
extensions
|
183
|
+
end
|
144
184
|
end
|
145
185
|
end
|
146
186
|
end
|
@@ -23,19 +23,20 @@ module ActiveLdap
|
|
23
23
|
return unless logger.debug?
|
24
24
|
|
25
25
|
payload = event.payload
|
26
|
+
info = payload[:info] || {}
|
26
27
|
label = payload[:name]
|
27
|
-
label += ": FAILED" if
|
28
|
+
label += ": FAILED" if info[:exception]
|
28
29
|
name = 'LDAP: %s (%.1fms)' % [label, event.duration]
|
29
|
-
|
30
|
+
inspected_info = info.inspect
|
30
31
|
|
31
32
|
if odd?
|
32
33
|
name = color(name, CYAN, true)
|
33
|
-
|
34
|
+
inspected_info = color(inspected_info, nil, true)
|
34
35
|
else
|
35
36
|
name = color(name, MAGENTA, true)
|
36
37
|
end
|
37
38
|
|
38
|
-
debug " #{name} #{
|
39
|
+
debug " #{name} #{inspected_info}"
|
39
40
|
end
|
40
41
|
|
41
42
|
def odd?
|
data/lib/active_ldap/populate.rb
CHANGED
@@ -12,16 +12,27 @@ module ActiveLdap
|
|
12
12
|
name, value = rdn.to_a[0]
|
13
13
|
prefix = suffixes.join(",")
|
14
14
|
suffixes.unshift("#{name}=#{value}")
|
15
|
-
next unless name == "dc"
|
16
15
|
begin
|
17
|
-
|
16
|
+
case name.downcase
|
17
|
+
when "dc"
|
18
|
+
ensure_dc(value, prefix, base_class)
|
19
|
+
when "ou"
|
20
|
+
ensure_ou(value,
|
21
|
+
:base => prefix,
|
22
|
+
:base_class => base_class)
|
23
|
+
end
|
18
24
|
rescue ActiveLdap::OperationNotPermitted
|
19
25
|
end
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
23
|
-
def ensure_ou(name,
|
24
|
-
|
29
|
+
def ensure_ou(name, options={})
|
30
|
+
if options.is_a?(Class)
|
31
|
+
base_class = options
|
32
|
+
options = {}
|
33
|
+
else
|
34
|
+
base_class = options[:base_class] || Base
|
35
|
+
end
|
25
36
|
name = name.to_s if name.is_a?(DN)
|
26
37
|
name = name.gsub(/\Aou\s*=\s*/i, '')
|
27
38
|
|
@@ -29,6 +40,7 @@ module ActiveLdap
|
|
29
40
|
ou_class.ldap_mapping(:dn_attribute => "ou",
|
30
41
|
:prefix => "",
|
31
42
|
:classes => ["top", "organizationalUnit"])
|
43
|
+
ou_class.base = options[:base]
|
32
44
|
return if ou_class.exist?(name)
|
33
45
|
ou_class.new(name).save!
|
34
46
|
end
|
data/lib/active_ldap/version.rb
CHANGED
data/test/al-test-utils.rb
CHANGED
data/test/test_base.rb
CHANGED
@@ -811,7 +811,7 @@ class TestBase < Test::Unit::TestCase
|
|
811
811
|
:classes => ["top", "organizationalUnit"])
|
812
812
|
assert_equal(["ou=Groups,#{current_configuration['base']}",
|
813
813
|
"ou=Users,#{current_configuration['base']}"],
|
814
|
-
ou_class.find(:all).collect(&:dn).sort)
|
814
|
+
ou_class.find(:all).collect(&:dn).collect(&:to_s).sort)
|
815
815
|
end
|
816
816
|
|
817
817
|
def test_ldap_mapping_validation
|
data/test/test_configuration.rb
CHANGED
@@ -6,25 +6,26 @@ class TestConfiguration < Test::Unit::TestCase
|
|
6
6
|
priority :normal
|
7
7
|
def test_prepare_configuration_with_silent_uri
|
8
8
|
configuration = {
|
9
|
-
:
|
9
|
+
:base => "dc=example,dc=com",
|
10
10
|
:password => "secret",
|
11
|
-
:uri => "ldap://example.com/
|
11
|
+
:uri => "ldap://example.com/dc=ignore,dc=me"
|
12
12
|
}
|
13
13
|
prepared_configuration =
|
14
14
|
ActiveLdap::Base.prepare_configuration(configuration)
|
15
15
|
assert_equal({
|
16
16
|
:host => "example.com",
|
17
17
|
:port => 389,
|
18
|
-
:
|
18
|
+
:base => "dc=example,dc=com",
|
19
19
|
:password => "secret",
|
20
20
|
},
|
21
21
|
prepared_configuration)
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_prepare_configuration_with_detailed_uri
|
25
|
+
bind_dn = "cn=admin,dc=example,dc=com"
|
25
26
|
configuration = {
|
26
27
|
:host => "example.net",
|
27
|
-
:uri => "ldaps://example.com/
|
28
|
+
:uri => "ldaps://example.com/dc=example,dc=com??sub??!bindname=#{CGI.escape(bind_dn)}"
|
28
29
|
}
|
29
30
|
prepared_configuration =
|
30
31
|
ActiveLdap::Base.prepare_configuration(configuration)
|
@@ -32,8 +33,10 @@ class TestConfiguration < Test::Unit::TestCase
|
|
32
33
|
:host => "example.net",
|
33
34
|
:port => 636,
|
34
35
|
:method => :ssl,
|
35
|
-
:
|
36
|
+
:base => "dc=example,dc=com",
|
36
37
|
:scope => "sub",
|
38
|
+
:bind_dn => "cn=admin,dc=example,dc=com",
|
39
|
+
:allow_anonymous => false,
|
37
40
|
},
|
38
41
|
prepared_configuration)
|
39
42
|
end
|
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.
|
4
|
+
version: 4.0.4
|
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: 2014-
|
12
|
+
date: 2014-10-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -326,7 +326,7 @@ files:
|
|
326
326
|
- test/test_usermod-lang-add.rb
|
327
327
|
- test/test_usermod.rb
|
328
328
|
- test/test_validation.rb
|
329
|
-
homepage: http://
|
329
|
+
homepage: http://activeldap.github.io/
|
330
330
|
licenses:
|
331
331
|
- Ruby's
|
332
332
|
- GPLv2 or later
|