activeldap 4.0.3 → 4.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|