activeldap 4.0.1 → 4.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -1
- data/README.textile +2 -1
- data/doc/text/news.textile +37 -0
- data/doc/text/tutorial.textile +24 -0
- data/lib/active_ldap/adapter/base.rb +2 -1
- data/lib/active_ldap/adapter/jndi.rb +9 -2
- data/lib/active_ldap/adapter/jndi_connection.rb +5 -1
- data/lib/active_ldap/base.rb +1 -0
- data/lib/active_ldap/callbacks.rb +0 -4
- data/lib/active_ldap/persistence.rb +1 -1
- data/lib/active_ldap/schema.rb +20 -0
- data/lib/active_ldap/schema/syntaxes.rb +15 -0
- data/lib/active_ldap/user_password.rb +2 -2
- data/lib/active_ldap/validations.rb +1 -3
- data/lib/active_ldap/version.rb +1 -1
- data/test/test_base.rb +7 -14
- data/test/test_callback.rb +13 -1
- data/test/test_schema.rb +73 -0
- data/test/test_user_password.rb +2 -0
- metadata +35 -62
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b4ef32fb85ed5c2137308ba532b8f99650160a13
|
4
|
+
data.tar.gz: 7f8dcf79cc1f7a9429b4ed2806c4128054780ec3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e8210af85a2630ad646f7384290ce3b2d87652564c043e3f899083758c003daffc39c5fa3df5f92d3cb312e670736dfa0a6bcef51583a82658f83dd376d80bf5
|
7
|
+
data.tar.gz: f43645ddd1c12fd63ee4b898b9eb3175d21bbfc84d4d96077f29f4edb40141ef16dc6650556bfe930f1d44aa0502a70575a253dd7c0ec70199cbc370bc44821b
|
data/Gemfile
CHANGED
data/README.textile
CHANGED
@@ -45,7 +45,8 @@ h2. Notes
|
|
45
45
|
|
46
46
|
h2. Rails
|
47
47
|
|
48
|
-
See "Rails":doc/text/rails.textile
|
48
|
+
See "Rails":file.rails.html ("doc/text/rails.textile":doc/text/rails.textile
|
49
|
+
in the repository and on GitHub) page for Rails integration.
|
49
50
|
|
50
51
|
h2. Licence
|
51
52
|
|
data/doc/text/news.textile
CHANGED
@@ -1,5 +1,41 @@
|
|
1
1
|
h1. News
|
2
2
|
|
3
|
+
h2(#4-0-2). 4.0.2: 2014-01-04
|
4
|
+
|
5
|
+
h3. Improvements
|
6
|
+
|
7
|
+
* Supported sub-tree moving by all adapters.
|
8
|
+
* Used YARD style link in documentation. [Reported by Fraser McCrossan]
|
9
|
+
* Supported Object-Security-Descriptor (OID: 1.2.840.113556.1.4.907)
|
10
|
+
[GitHub:#66] [Reported by Nowhere Man]
|
11
|
+
* Made JEPG syntax binary.
|
12
|
+
* Supported binary encoding for values in a container.
|
13
|
+
[GitHub:#66] [Reported by Nowhere Man]
|
14
|
+
* Added documentation about @:filter@ option of {ActiveLdap::Base.find}
|
15
|
+
into tutorial.
|
16
|
+
[GitHub:#72] [Patch by Fernando Martinez]
|
17
|
+
* Migrated to gettext gem from gettext_i18n_rails gem because ActiveLdap
|
18
|
+
dosen't use any gettext_i18n_rails gem features..
|
19
|
+
[activeldap-discuss] [Reported by Christian Nennemann]
|
20
|
+
* Supported retry on timeout on JNDI adapter.
|
21
|
+
[GitHub:#77] [Patch by Ryosuke Yamazaki]
|
22
|
+
|
23
|
+
h3. Fixes
|
24
|
+
|
25
|
+
* Removed needless newlines generated by @pack("m")@.
|
26
|
+
[GitHub:#75] [GitHub:#76] [Patch by Ryosuke Yamazaki]
|
27
|
+
* Fixed a bug that @after_initialize@ isn't run.
|
28
|
+
[GitHub:#79] [Patch by Nobutaka OSHIRO]
|
29
|
+
|
30
|
+
h3. Thanks
|
31
|
+
|
32
|
+
* Fraser McCrossan
|
33
|
+
* Nowhere Man
|
34
|
+
* Fernando Martinez
|
35
|
+
* Christian Nennemann
|
36
|
+
* Ryosuke Yamazaki
|
37
|
+
* Nobutaka OSHIRO
|
38
|
+
|
3
39
|
h2(#4-0-1). 4.0.1: 2013-08-29
|
4
40
|
|
5
41
|
h3. Improvements
|
@@ -49,6 +85,7 @@ h3. Improvements
|
|
49
85
|
[Patch by superscott]
|
50
86
|
* [GitHub:#63] Handled Errno::ECONNRESET as connection in
|
51
87
|
net-ldap adapter [Patch by mpoornima]
|
88
|
+
|
52
89
|
h3. Fixes
|
53
90
|
|
54
91
|
* [GitHub:#44] Fixed a typo in document.
|
data/doc/text/tutorial.textile
CHANGED
@@ -403,6 +403,30 @@ If :attribute is unspecified, it defaults to the dn_attribute.
|
|
403
403
|
It is also possible to override :attribute and :value by specifying :filter. This
|
404
404
|
argument allows the direct specification of a LDAP filter to retrieve objects by.
|
405
405
|
|
406
|
+
h5. Using the :filter option
|
407
|
+
|
408
|
+
The filter option lets you pass in an LDAP query string.
|
409
|
+
For example retrieving all groups with cn which starts with @'dev'@ and has @guid@ == 1:
|
410
|
+
|
411
|
+
<pre>
|
412
|
+
irb> Group.find(:all, :filter => '(&(cn=dev*)(guid=1))').collect {|group| group.cn}
|
413
|
+
=> ["develop"]
|
414
|
+
</pre>
|
415
|
+
|
416
|
+
It also allows a hash like sintax (sparing you the need to write the query by hand ):
|
417
|
+
|
418
|
+
<pre>
|
419
|
+
irb> Group.find(:all, :filter => {:cn => 'dev*', :guid => 1 }).collect {|group| group.cn}
|
420
|
+
=> ["develop", "developers", "sys", "sysadmin"]
|
421
|
+
</pre>
|
422
|
+
|
423
|
+
You can build complex queries combining the hash syntax with arrays and @:or@ and @:and@ operators retrieving all users whose name contains 'john' or cn ends with 'smith' or contains 'liz'
|
424
|
+
|
425
|
+
<pre>
|
426
|
+
irb> User.find(:all, filter: [:or, [:or, { :cn => '*smith', :name => '*john*'} ], { cn: '*liz*' }]).collect(&:cn)
|
427
|
+
=> ['john.smith', 'jane.smith', 'john tha ripper', 'liz.taylor', ...]
|
428
|
+
</pre>
|
429
|
+
|
406
430
|
h4. .search
|
407
431
|
|
408
432
|
.search is a class method that is accessible from any subclass of Base, and Base.
|
@@ -317,7 +317,8 @@ module ActiveLdap
|
|
317
317
|
do_in_timeout(@timeout, &block)
|
318
318
|
rescue Timeout::Error => e
|
319
319
|
@logger.error {_('Requested action timed out.')}
|
320
|
-
if @retry_on_timeout and retry_limit < 0
|
320
|
+
if @retry_on_timeout and (retry_limit < 0 or n_retries <= retry_limit)
|
321
|
+
n_retries += 1
|
321
322
|
if connecting?
|
322
323
|
retry
|
323
324
|
elsif try_reconnect
|
@@ -23,7 +23,7 @@ module ActiveLdap
|
|
23
23
|
uri = construct_uri(host, port, method == :ssl)
|
24
24
|
with_start_tls = method == :start_tls
|
25
25
|
info = {:uri => uri, :with_start_tls => with_start_tls}
|
26
|
-
[log("connect", info) {JndiConnection.new(host, port, method)},
|
26
|
+
[log("connect", info) {JndiConnection.new(host, port, method, @timeout)},
|
27
27
|
uri, with_start_tls]
|
28
28
|
end
|
29
29
|
end
|
@@ -93,7 +93,9 @@ module ActiveLdap
|
|
93
93
|
def execute(method, info=nil, *args, &block)
|
94
94
|
name = (info || {}).delete(:name) || method
|
95
95
|
log(name, info) {@connection.send(method, *args, &block)}
|
96
|
-
rescue JndiConnection::CommunicationException => e
|
96
|
+
rescue JndiConnection::CommunicationException, JndiConnection::ServiceUnavailableException => e
|
97
|
+
disconnect! if connecting?
|
98
|
+
|
97
99
|
raise ActiveLdap::ConnectionError.new(e.getMessage())
|
98
100
|
rescue JndiConnection::NamingException
|
99
101
|
if /\[LDAP: error code (\d+) - ([^\]]+)\]/ =~ $!.to_s
|
@@ -101,7 +103,12 @@ module ActiveLdap
|
|
101
103
|
klass = LdapError::ERRORS[Integer($1)]
|
102
104
|
klass ||= ActiveLdap::LdapError
|
103
105
|
raise klass, message
|
106
|
+
elsif /LDAP response read timed out/ =~ $!.to_s
|
107
|
+
disconnect! if connecting?
|
108
|
+
|
109
|
+
raise Timeout::Error.new($!.to_s)
|
104
110
|
end
|
111
|
+
|
105
112
|
raise
|
106
113
|
end
|
107
114
|
|
@@ -27,6 +27,7 @@ module ActiveLdap
|
|
27
27
|
Control = ldap.Control
|
28
28
|
|
29
29
|
CommunicationException = naming.CommunicationException
|
30
|
+
ServiceUnavailableException = naming.ServiceUnavailableException
|
30
31
|
NamingException = naming.NamingException
|
31
32
|
NameNotFoundException = naming.NameNotFoundException
|
32
33
|
|
@@ -72,10 +73,11 @@ module ActiveLdap
|
|
72
73
|
end
|
73
74
|
end
|
74
75
|
|
75
|
-
def initialize(host, port, method)
|
76
|
+
def initialize(host, port, method, timeout)
|
76
77
|
@host = host
|
77
78
|
@port = port
|
78
79
|
@method = method
|
80
|
+
@timeout = timeout
|
79
81
|
@context = nil
|
80
82
|
@tls = nil
|
81
83
|
end
|
@@ -158,6 +160,8 @@ module ActiveLdap
|
|
158
160
|
environment = {
|
159
161
|
Context::INITIAL_CONTEXT_FACTORY => "com.sun.jndi.ldap.LdapCtxFactory",
|
160
162
|
Context::PROVIDER_URL => ldap_uri,
|
163
|
+
'com.sun.jndi.ldap.connect.timeout' => (@timeout * 1000).to_i.to_s,
|
164
|
+
'com.sun.jndi.ldap.read.timeout' => (@timeout * 1000).to_i.to_s,
|
161
165
|
}
|
162
166
|
environment = HashTable.new(environment)
|
163
167
|
context = InitialLdapContext.new(environment, nil)
|
data/lib/active_ldap/base.rb
CHANGED
@@ -689,6 +689,7 @@ module ActiveLdap
|
|
689
689
|
raise ArgumentError, format % attributes.inspect
|
690
690
|
end
|
691
691
|
yield self if block_given?
|
692
|
+
run_callbacks :initialize unless _initialize_callbacks.empty?
|
692
693
|
end
|
693
694
|
|
694
695
|
# Returns true if the +comparison_object+ is the same object, or is of
|
data/lib/active_ldap/schema.rb
CHANGED
@@ -424,6 +424,26 @@ module ActiveLdap
|
|
424
424
|
@binary
|
425
425
|
end
|
426
426
|
|
427
|
+
# Sets binary encoding to value if the given attribute's syntax
|
428
|
+
# is binary syntax. Does nothing otherwise.
|
429
|
+
# @return [void]
|
430
|
+
def apply_encoding(value)
|
431
|
+
return unless binary?
|
432
|
+
case value
|
433
|
+
when Hash
|
434
|
+
value.each_value do |sub_value|
|
435
|
+
apply_encoding(sub_value)
|
436
|
+
end
|
437
|
+
when Array
|
438
|
+
value.each do |sub_value|
|
439
|
+
apply_encoding(sub_value)
|
440
|
+
end
|
441
|
+
else
|
442
|
+
return unless value.respond_to?(:force_encoding)
|
443
|
+
value.force_encoding("ASCII-8BIT")
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
427
447
|
# binary_required?
|
428
448
|
#
|
429
449
|
# Returns true if the value MUST be transferred in binary
|
@@ -278,6 +278,10 @@ module ActiveLdap
|
|
278
278
|
class JPEG < Base
|
279
279
|
SYNTAXES["1.3.6.1.4.1.1466.115.121.1.28"] = self
|
280
280
|
|
281
|
+
def binary?
|
282
|
+
true
|
283
|
+
end
|
284
|
+
|
281
285
|
private
|
282
286
|
def validate_normalized_value(value, original_value)
|
283
287
|
if value.unpack("n")[0] == 0xffd8
|
@@ -429,6 +433,17 @@ module ActiveLdap
|
|
429
433
|
super
|
430
434
|
end
|
431
435
|
end
|
436
|
+
|
437
|
+
class ObjectSecurityDescriptor < OctetString
|
438
|
+
# @see http://tools.ietf.org/html/draft-armijo-ldap-syntax-00
|
439
|
+
# Object-Security-Descriptor: 1.2.840.113556.1.4.907
|
440
|
+
#
|
441
|
+
# Encoded as an Octet-String (OID 1.3.6.1.4.1.1466.115.121.1.40)
|
442
|
+
#
|
443
|
+
# @see http://msdn.microsoft.com/en-us/library/cc223229.aspx
|
444
|
+
# String(NT-Sec-Desc) 1.2.840.113556.1.4.907
|
445
|
+
SYNTAXES["1.2.840.113556.1.4.907"] = self
|
446
|
+
end
|
432
447
|
end
|
433
448
|
end
|
434
449
|
end
|
@@ -54,7 +54,7 @@ module ActiveLdap
|
|
54
54
|
end
|
55
55
|
salt ||= Salt.generate(4)
|
56
56
|
md5_hash_with_salt = "#{Digest::MD5.digest(password + salt)}#{salt}"
|
57
|
-
"{SMD5}#{[md5_hash_with_salt].pack('m').
|
57
|
+
"{SMD5}#{[md5_hash_with_salt].pack('m').gsub("\n", '')}"
|
58
58
|
end
|
59
59
|
|
60
60
|
def extract_salt_for_smd5(smd5ed_password)
|
@@ -71,7 +71,7 @@ module ActiveLdap
|
|
71
71
|
end
|
72
72
|
salt ||= Salt.generate(4)
|
73
73
|
sha1_hash_with_salt = "#{Digest::SHA1.digest(password + salt)}#{salt}"
|
74
|
-
"{SSHA}#{[sha1_hash_with_salt].pack('m').
|
74
|
+
"{SSHA}#{[sha1_hash_with_salt].pack('m').gsub("\n", '')}"
|
75
75
|
end
|
76
76
|
|
77
77
|
def extract_salt_for_ssha(sshaed_password)
|
@@ -172,9 +172,7 @@ module ActiveLdap
|
|
172
172
|
entry_attribute.schemata.each do |name, attribute|
|
173
173
|
value = self[name]
|
174
174
|
# Is it really proper location for setting encoding?
|
175
|
-
|
176
|
-
value.force_encoding("ASCII-8BIT")
|
177
|
-
end
|
175
|
+
attribute.apply_encoding(value)
|
178
176
|
next if self.class.blank_value?(value)
|
179
177
|
validate_ldap_value(attribute, name, value)
|
180
178
|
end
|
data/lib/active_ldap/version.rb
CHANGED
data/test/test_base.rb
CHANGED
@@ -90,22 +90,15 @@ class TestBase < Test::Unit::TestCase
|
|
90
90
|
make_ou("sub,ou=users")
|
91
91
|
make_temporary_user(:simple => true) do |user,|
|
92
92
|
user.id = "user2,ou=sub,#{@user_class.base}"
|
93
|
-
|
94
|
-
when "Jndi"
|
95
|
-
assert_true(user.save)
|
93
|
+
assert_true(user.save)
|
96
94
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
end
|
101
|
-
base = @user_class.base
|
102
|
-
assert_equal("#{@user_class.dn_attribute}=user2,ou=sub,#{base}",
|
103
|
-
found_user.dn.to_s)
|
104
|
-
else
|
105
|
-
assert_raise(ActiveLdap::NotImplemented) do
|
106
|
-
user.save
|
107
|
-
end
|
95
|
+
found_user = nil
|
96
|
+
assert_nothing_raised do
|
97
|
+
found_user = @user_class.find("user2")
|
108
98
|
end
|
99
|
+
base = @user_class.base
|
100
|
+
assert_equal("#{@user_class.dn_attribute}=user2,ou=sub,#{base}",
|
101
|
+
found_user.dn.to_s)
|
109
102
|
end
|
110
103
|
end
|
111
104
|
|
data/test/test_callback.rb
CHANGED
@@ -4,9 +4,21 @@ class TestCallback < Test::Unit::TestCase
|
|
4
4
|
include AlTestUtils
|
5
5
|
|
6
6
|
priority :must
|
7
|
+
def test_new
|
8
|
+
initialized_entries = []
|
9
|
+
@group_class.instance_variable_set("@initialized_entries",
|
10
|
+
initialized_entries)
|
11
|
+
@group_class.module_eval do
|
12
|
+
after_initialize "self.class.instance_variable_get('@initialized_entries') << self"
|
13
|
+
end
|
14
|
+
assert_equal([], initialized_entries)
|
15
|
+
new_group = @group_class.new(:cn => "new-cn")
|
16
|
+
assert_equal([new_group.cn].sort,
|
17
|
+
initialized_entries.collect {|g| g.cn}.sort)
|
18
|
+
end
|
7
19
|
|
8
20
|
priority :normal
|
9
|
-
def
|
21
|
+
def test_find
|
10
22
|
make_temporary_group do |group|
|
11
23
|
found_entries = []
|
12
24
|
initialized_entries = []
|
data/test/test_schema.rb
CHANGED
@@ -556,4 +556,77 @@ class TestSchema < Test::Unit::TestCase
|
|
556
556
|
attribute_hash[:syntax] = syntax.id if syntax
|
557
557
|
assert_equal(expected, attribute_hash)
|
558
558
|
end
|
559
|
+
|
560
|
+
class TestAttribute < self
|
561
|
+
class TestApplyEncoding < self
|
562
|
+
class TestNotBinary < self
|
563
|
+
def setup
|
564
|
+
super
|
565
|
+
uid_schema =
|
566
|
+
"( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) " +
|
567
|
+
"DESC 'RFC1274: user identifier' EQUALITY caseIgnoreMatch " +
|
568
|
+
"SUBSTR caseIgnoreSubstringsMatch " +
|
569
|
+
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )"
|
570
|
+
entries = {
|
571
|
+
"attributeTypes" => [uid_schema],
|
572
|
+
}
|
573
|
+
schema = ActiveLdap::Schema.new(entries)
|
574
|
+
@attribute = schema.attribute("uid")
|
575
|
+
end
|
576
|
+
|
577
|
+
def test_do_nothing
|
578
|
+
value = ""
|
579
|
+
value.force_encoding("UTF-8")
|
580
|
+
@attribute.apply_encoding(value)
|
581
|
+
assert_equal(Encoding::UTF_8, value.encoding)
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
class TestBinary < self
|
586
|
+
def setup
|
587
|
+
super
|
588
|
+
jpeg_schema =
|
589
|
+
"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " +
|
590
|
+
"X-NOT-HUMAN-READABLE 'TRUE' )"
|
591
|
+
jpeg_photo_schema =
|
592
|
+
"( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' " +
|
593
|
+
"DESC 'RFC2798: a JPEG image' SYNTAX " +
|
594
|
+
"1.3.6.1.4.1.1466.115.121.1.28 )"
|
595
|
+
entries = {
|
596
|
+
"attributeTypes" => [jpeg_photo_schema],
|
597
|
+
"ldapSyntaxes" => [jpeg_schema],
|
598
|
+
}
|
599
|
+
schema = ActiveLdap::Schema.new(entries)
|
600
|
+
@attribute = schema.attribute("jpegPhoto")
|
601
|
+
end
|
602
|
+
|
603
|
+
def test_string
|
604
|
+
value = ""
|
605
|
+
value.force_encoding("UTF-8")
|
606
|
+
@attribute.apply_encoding(value)
|
607
|
+
assert_equal(Encoding::ASCII_8BIT, value.encoding)
|
608
|
+
end
|
609
|
+
|
610
|
+
def test_array
|
611
|
+
values = [""]
|
612
|
+
values.each do |value|
|
613
|
+
value.force_encoding("UTF-8")
|
614
|
+
end
|
615
|
+
@attribute.apply_encoding(values)
|
616
|
+
assert_equal([Encoding::ASCII_8BIT],
|
617
|
+
values.collect(&:encoding))
|
618
|
+
end
|
619
|
+
|
620
|
+
def test_hash
|
621
|
+
values = {:binary => ""}
|
622
|
+
values.each_value do |value|
|
623
|
+
value.force_encoding("UTF-8")
|
624
|
+
end
|
625
|
+
@attribute.apply_encoding(values)
|
626
|
+
assert_equal([Encoding::ASCII_8BIT],
|
627
|
+
values.each_value.collect(&:encoding))
|
628
|
+
end
|
629
|
+
end
|
630
|
+
end
|
631
|
+
end
|
559
632
|
end
|
data/test/test_user_password.rb
CHANGED
@@ -10,9 +10,11 @@ class TestUserPassword < Test::Unit::TestCase
|
|
10
10
|
"{MD5}DRB9CfW75Ayt495ccenptw==" => 'letmein', #MD5
|
11
11
|
"{SMD5}8L2iXJuazftLVHrAf7ptPFQIDaw=" => 'letmein', #SMD5 as generated by slappasswd (4 bytes of salt)
|
12
12
|
"{SMD5}kXibTNG+O98gaQtkugYcmSTiE+M2Z5TA" => 'letmein', #SMD5 as generated by Apache Directory Studio (8 bytes of salt)
|
13
|
+
"{SMD5}4PkkYH5qI6ydk/9pwvZD3DYwYzVlMzVlLTBkZDEtNGJhMi05NjI5LWRlODgyMDhiMWZmYQ==" => 'letmein', #SMD5 generated with 36 bytes of salt
|
13
14
|
"{SHA}t6h1/B6iKLkGEEG3zsS9PFKrPOM=" => 'letmein', #SHA
|
14
15
|
"{SSHA}YA87hc9/L/cCGR1HValcJb7a8AYxZXY4" => 'wibble', # SSHA as generated by slappasswd (4 bytes of salt)
|
15
16
|
"{SSHA}6J6Ios3l1panY9sm0+g9l3/jFz2kwOPrVA4+OA==" => 'letmein', # SSHA as generated by Apache Directory Studio (8 bytes of salt)
|
17
|
+
"{SSHA}f/j1unqoJg1C1zjw8tvxSp4xpow2MGM1ZTM1ZS0wZGQxLTRiYTItOTYyOS1kZTg4MjA4YjFmZmE=" => 'letmein', #SSHA generated with 36 bytes of salt
|
16
18
|
"letmein" => 'letmein', #Cleartext password
|
17
19
|
}.each do |hash, plain|
|
18
20
|
assert_send([ActiveLdap::UserPassword, :valid?,
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeldap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
5
|
-
prerelease:
|
4
|
+
version: 4.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Will Drewry
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-01-04 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: activemodel
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ~>
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ~>
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,167 +28,149 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: locale
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - '>='
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: gettext
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - '>='
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '0'
|
55
49
|
type: :runtime
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - '>='
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: gettext_i18n_rails
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :runtime
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: bundler
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
|
-
- -
|
74
|
+
- - '>='
|
85
75
|
- !ruby/object:Gem::Version
|
86
76
|
version: '0'
|
87
77
|
type: :development
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - '>='
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
85
|
name: rake
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
87
|
requirements:
|
100
|
-
- -
|
88
|
+
- - '>='
|
101
89
|
- !ruby/object:Gem::Version
|
102
90
|
version: '0'
|
103
91
|
type: :development
|
104
92
|
prerelease: false
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
|
-
- -
|
95
|
+
- - '>='
|
109
96
|
- !ruby/object:Gem::Version
|
110
97
|
version: '0'
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
99
|
name: test-unit
|
113
100
|
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
101
|
requirements:
|
116
|
-
- -
|
102
|
+
- - '>='
|
117
103
|
- !ruby/object:Gem::Version
|
118
104
|
version: '0'
|
119
105
|
type: :development
|
120
106
|
prerelease: false
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
108
|
requirements:
|
124
|
-
- -
|
109
|
+
- - '>='
|
125
110
|
- !ruby/object:Gem::Version
|
126
111
|
version: '0'
|
127
112
|
- !ruby/object:Gem::Dependency
|
128
113
|
name: test-unit-notify
|
129
114
|
requirement: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
115
|
requirements:
|
132
|
-
- -
|
116
|
+
- - '>='
|
133
117
|
- !ruby/object:Gem::Version
|
134
118
|
version: '0'
|
135
119
|
type: :development
|
136
120
|
prerelease: false
|
137
121
|
version_requirements: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
122
|
requirements:
|
140
|
-
- -
|
123
|
+
- - '>='
|
141
124
|
- !ruby/object:Gem::Version
|
142
125
|
version: '0'
|
143
126
|
- !ruby/object:Gem::Dependency
|
144
127
|
name: yard
|
145
128
|
requirement: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
129
|
requirements:
|
148
|
-
- -
|
130
|
+
- - '>='
|
149
131
|
- !ruby/object:Gem::Version
|
150
132
|
version: '0'
|
151
133
|
type: :development
|
152
134
|
prerelease: false
|
153
135
|
version_requirements: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
136
|
requirements:
|
156
|
-
- -
|
137
|
+
- - '>='
|
157
138
|
- !ruby/object:Gem::Version
|
158
139
|
version: '0'
|
159
140
|
- !ruby/object:Gem::Dependency
|
160
141
|
name: RedCloth
|
161
142
|
requirement: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
143
|
requirements:
|
164
|
-
- -
|
144
|
+
- - '>='
|
165
145
|
- !ruby/object:Gem::Version
|
166
146
|
version: '0'
|
167
147
|
type: :development
|
168
148
|
prerelease: false
|
169
149
|
version_requirements: !ruby/object:Gem::Requirement
|
170
|
-
none: false
|
171
150
|
requirements:
|
172
|
-
- -
|
151
|
+
- - '>='
|
173
152
|
- !ruby/object:Gem::Version
|
174
153
|
version: '0'
|
175
154
|
- !ruby/object:Gem::Dependency
|
176
155
|
name: packnga
|
177
156
|
requirement: !ruby/object:Gem::Requirement
|
178
|
-
none: false
|
179
157
|
requirements:
|
180
|
-
- -
|
158
|
+
- - '>='
|
181
159
|
- !ruby/object:Gem::Version
|
182
160
|
version: '0'
|
183
161
|
type: :development
|
184
162
|
prerelease: false
|
185
163
|
version_requirements: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
164
|
requirements:
|
188
|
-
- -
|
165
|
+
- - '>='
|
189
166
|
- !ruby/object:Gem::Version
|
190
167
|
version: '0'
|
191
|
-
description:
|
192
|
-
|
193
|
-
|
194
|
-
|
168
|
+
description: |2
|
169
|
+
'ActiveLdap' is a ruby library which provides a clean
|
170
|
+
objected oriented interface to the Ruby/LDAP library. It was inspired
|
171
|
+
by ActiveRecord. This is not nearly as clean or as flexible as
|
172
|
+
ActiveRecord, but it is still trivial to define new objects and manipulate
|
173
|
+
them with minimal difficulty.
|
195
174
|
email:
|
196
175
|
- redpig@dataspill.org
|
197
176
|
- kou@cozmixng.org
|
@@ -347,34 +326,28 @@ files:
|
|
347
326
|
- test/test_validation.rb
|
348
327
|
homepage: http://ruby-activeldap.rubyforge.org/
|
349
328
|
licenses:
|
350
|
-
- Ruby's
|
329
|
+
- Ruby's
|
330
|
+
- GPLv2 or later
|
331
|
+
metadata: {}
|
351
332
|
post_install_message:
|
352
333
|
rdoc_options: []
|
353
334
|
require_paths:
|
354
335
|
- lib
|
355
336
|
required_ruby_version: !ruby/object:Gem::Requirement
|
356
|
-
none: false
|
357
337
|
requirements:
|
358
|
-
- -
|
338
|
+
- - '>='
|
359
339
|
- !ruby/object:Gem::Version
|
360
340
|
version: '0'
|
361
|
-
segments:
|
362
|
-
- 0
|
363
|
-
hash: -4556557570349939659
|
364
341
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
365
|
-
none: false
|
366
342
|
requirements:
|
367
|
-
- -
|
343
|
+
- - '>='
|
368
344
|
- !ruby/object:Gem::Version
|
369
345
|
version: '0'
|
370
|
-
segments:
|
371
|
-
- 0
|
372
|
-
hash: -4556557570349939659
|
373
346
|
requirements: []
|
374
347
|
rubyforge_project: ruby-activeldap
|
375
|
-
rubygems_version:
|
348
|
+
rubygems_version: 2.0.14
|
376
349
|
signing_key:
|
377
|
-
specification_version:
|
350
|
+
specification_version: 4
|
378
351
|
summary: ActiveLdap is a object-oriented API to LDAP
|
379
352
|
test_files:
|
380
353
|
- test/add-phonetic-attribute-options-to-slapd.ldif
|