activeldap 4.0.1 → 4.0.2
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 +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
|