ruby-activeldap 0.7.4 → 0.8.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.
- data/CHANGES +375 -0
- data/COPYING +340 -0
- data/LICENSE +58 -0
- data/Manifest.txt +33 -0
- data/README +63 -0
- data/Rakefile +37 -0
- data/TODO +31 -0
- data/benchmark/bench-al.rb +152 -0
- data/lib/{activeldap.rb → active_ldap.rb} +280 -263
- data/lib/active_ldap/adaptor/base.rb +29 -0
- data/lib/active_ldap/adaptor/ldap.rb +466 -0
- data/lib/active_ldap/association/belongs_to.rb +38 -0
- data/lib/active_ldap/association/belongs_to_many.rb +40 -0
- data/lib/active_ldap/association/collection.rb +80 -0
- data/lib/active_ldap/association/has_many.rb +48 -0
- data/lib/active_ldap/association/has_many_wrap.rb +56 -0
- data/lib/active_ldap/association/proxy.rb +89 -0
- data/lib/active_ldap/associations.rb +162 -0
- data/lib/active_ldap/attributes.rb +199 -0
- data/lib/active_ldap/base.rb +1343 -0
- data/lib/active_ldap/callbacks.rb +19 -0
- data/lib/active_ldap/command.rb +46 -0
- data/lib/active_ldap/configuration.rb +96 -0
- data/lib/active_ldap/connection.rb +137 -0
- data/lib/{activeldap → active_ldap}/ldap.rb +1 -1
- data/lib/active_ldap/object_class.rb +70 -0
- data/lib/active_ldap/schema.rb +258 -0
- data/lib/{activeldap → active_ldap}/timeout.rb +0 -0
- data/lib/{activeldap → active_ldap}/timeout_stub.rb +0 -0
- data/lib/active_ldap/user_password.rb +92 -0
- data/lib/active_ldap/validations.rb +78 -0
- data/rails/plugin/active_ldap/README +54 -0
- data/rails/plugin/active_ldap/init.rb +6 -0
- data/test/TODO +2 -0
- data/test/al-test-utils.rb +337 -0
- data/test/command.rb +62 -0
- data/test/config.yaml +8 -0
- data/test/config.yaml.sample +6 -0
- data/test/run-test.rb +17 -0
- data/test/test-unit-ext.rb +2 -0
- data/test/test_associations.rb +334 -0
- data/test/test_attributes.rb +71 -0
- data/test/test_base.rb +345 -0
- data/test/test_base_per_instance.rb +32 -0
- data/test/test_bind.rb +53 -0
- data/test/test_callback.rb +35 -0
- data/test/test_connection.rb +38 -0
- data/test/test_connection_per_class.rb +50 -0
- data/test/test_find.rb +36 -0
- data/test/test_groupadd.rb +50 -0
- data/test/test_groupdel.rb +46 -0
- data/test/test_groupls.rb +107 -0
- data/test/test_groupmod.rb +51 -0
- data/test/test_lpasswd.rb +75 -0
- data/test/test_object_class.rb +32 -0
- data/test/test_reflection.rb +173 -0
- data/test/test_schema.rb +166 -0
- data/test/test_user.rb +209 -0
- data/test/test_user_password.rb +93 -0
- data/test/test_useradd-binary.rb +59 -0
- data/test/test_useradd.rb +55 -0
- data/test/test_userdel.rb +48 -0
- data/test/test_userls.rb +86 -0
- data/test/test_usermod-binary-add-time.rb +62 -0
- data/test/test_usermod-binary-add.rb +61 -0
- data/test/test_usermod-binary-del.rb +64 -0
- data/test/test_usermod-lang-add.rb +57 -0
- data/test/test_usermod.rb +56 -0
- data/test/test_validation.rb +38 -0
- metadata +94 -21
- data/lib/activeldap/associations.rb +0 -170
- data/lib/activeldap/base.rb +0 -1456
- data/lib/activeldap/configuration.rb +0 -59
- data/lib/activeldap/schema2.rb +0 -217
@@ -1,59 +0,0 @@
|
|
1
|
-
|
2
|
-
module ActiveLDAP
|
3
|
-
# Configuration
|
4
|
-
#
|
5
|
-
# Configuration provides the default settings required for
|
6
|
-
# ActiveLDAP to work with your LDAP server. All of these
|
7
|
-
# settings can be passed in at initialization time.
|
8
|
-
module Configuration
|
9
|
-
DEFAULT_CONFIG = {}
|
10
|
-
DEFAULT_CONFIG[:host] = '127.0.0.1'
|
11
|
-
DEFAULT_CONFIG[:port] = 389
|
12
|
-
DEFAULT_CONFIG[:method] = :plain # :ssl, :tls, :plain allowed
|
13
|
-
|
14
|
-
DEFAULT_CONFIG[:bind_format] = "cn=%s,dc=localdomain"
|
15
|
-
DEFAULT_CONFIG[:user] = ENV['USER']
|
16
|
-
DEFAULT_CONFIG[:password_block] = nil
|
17
|
-
DEFAULT_CONFIG[:password] = nil
|
18
|
-
DEFAULT_CONFIG[:store_password] = true
|
19
|
-
DEFAULT_CONFIG[:allow_anonymous] = true
|
20
|
-
DEFAULT_CONFIG[:sasl_quiet] = false
|
21
|
-
DEFAULT_CONFIG[:try_sasl] = false
|
22
|
-
|
23
|
-
DEFAULT_CONFIG[:retries] = 3
|
24
|
-
DEFAULT_CONFIG[:retry_wait] = 3
|
25
|
-
DEFAULT_CONFIG[:timeout] = 0 # in seconds; 0 <= Never timeout
|
26
|
-
# Whether or not to retry on timeouts
|
27
|
-
DEFAULT_CONFIG[:retry_on_timeout] = true
|
28
|
-
|
29
|
-
# Whether to return objects by default from find/find_all
|
30
|
-
DEFAULT_CONFIG[:return_objects] = false
|
31
|
-
|
32
|
-
DEFAULT_CONFIG[:logger] = nil
|
33
|
-
|
34
|
-
# On connect, this is overriden by the :base argument
|
35
|
-
#
|
36
|
-
# Set this to LDAP_SCOPE_SUBTREE if you have a LDAP tree where all
|
37
|
-
# objects of the same class living in different parts of the same subtree, but
|
38
|
-
# not. LDAP_SCOPE_ONELEVEL is for use when all the objects in your classes live
|
39
|
-
# under one shared level (e.g. ou=People,dc=localdomain)
|
40
|
-
#
|
41
|
-
# This can be overriden on a per class basis in ldap_mapping :scope
|
42
|
-
def Base.ldap_scope
|
43
|
-
LDAP::LDAP_SCOPE_ONELEVEL
|
44
|
-
end
|
45
|
-
|
46
|
-
# On connect, this is overriden by the :base argument
|
47
|
-
# Make the return value the string that is your LDAP base
|
48
|
-
def Base.base
|
49
|
-
'dc=localdomain'
|
50
|
-
end
|
51
|
-
|
52
|
-
# This is optionally set to the array of objectClass names
|
53
|
-
# that are minimally required for EVERY object on your LDAP server.
|
54
|
-
# If you don't want one, set this to [].
|
55
|
-
def Base.required_classes
|
56
|
-
['top']
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/activeldap/schema2.rb
DELETED
@@ -1,217 +0,0 @@
|
|
1
|
-
require 'ldap'
|
2
|
-
require 'ldap/schema'
|
3
|
-
|
4
|
-
module LDAP
|
5
|
-
class Schema2 < Schema
|
6
|
-
@@attr_cache = {}
|
7
|
-
@@class_cache = {}
|
8
|
-
|
9
|
-
# attr
|
10
|
-
#
|
11
|
-
# This is just like LDAP::Schema#attr except that it allows
|
12
|
-
# look up in any of the given keys.
|
13
|
-
# e.g.
|
14
|
-
# attr('attributeTypes', 'cn', 'DESC')
|
15
|
-
# attr('ldapSyntaxes', '1.3.6.1.4.1.1466.115.121.1.5', 'DESC')
|
16
|
-
def attr(sub, type, at)
|
17
|
-
return [] if sub.empty?
|
18
|
-
return [] if type.empty?
|
19
|
-
return [] if at.empty?
|
20
|
-
|
21
|
-
type = type.downcase # We're going case insensitive.
|
22
|
-
|
23
|
-
# Check already parsed options first
|
24
|
-
if @@attr_cache.has_key? sub \
|
25
|
-
and @@attr_cache[sub].has_key? type \
|
26
|
-
and @@attr_cache[sub][type].has_key? at
|
27
|
-
return @@attr_cache[sub][type][at].dup
|
28
|
-
end
|
29
|
-
|
30
|
-
# Initialize anything that is required
|
31
|
-
unless @@attr_cache.has_key? sub
|
32
|
-
@@attr_cache[sub] = {}
|
33
|
-
end
|
34
|
-
|
35
|
-
unless @@attr_cache[sub].has_key? type
|
36
|
-
@@attr_cache[sub][type] = {}
|
37
|
-
end
|
38
|
-
|
39
|
-
at = at.upcase
|
40
|
-
self[sub].each do |s|
|
41
|
-
line = ''
|
42
|
-
if type[0..0] =~ /[0-9]/
|
43
|
-
if s =~ /\(\s+(?i:#{type})\s+(?:[A-Z]|\))/
|
44
|
-
line = s
|
45
|
-
end
|
46
|
-
else
|
47
|
-
if s =~ /NAME\s+\(?.*'(?i:#{type})'.*\)?\s+(?:[A-Z]|\))/
|
48
|
-
line = s
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# I need to check, but I think some of these matchs
|
53
|
-
# overlap. I'll need to check these when I'm less sleepy.
|
54
|
-
multi = ''
|
55
|
-
case line
|
56
|
-
when /#{at}\s+[\)A-Z]/
|
57
|
-
@@attr_cache[sub][type][at] = ['TRUE']
|
58
|
-
return ['TRUE']
|
59
|
-
when /#{at}\s+'(.+?)'/
|
60
|
-
@@attr_cache[sub][type][at] = [$1]
|
61
|
-
return [$1]
|
62
|
-
when /#{at}\s+\((.+?)\)/
|
63
|
-
multi = $1
|
64
|
-
when /#{at}\s+\(([\w\d\s\.]+)\)/
|
65
|
-
multi = $1
|
66
|
-
when /#{at}\s+([\w\d\.]+)/
|
67
|
-
@@attr_cache[sub][type][at] = [$1]
|
68
|
-
return [$1]
|
69
|
-
end
|
70
|
-
# Split up multiple matches
|
71
|
-
# if oc then it is sep'd by $
|
72
|
-
# if attr then bu spaces
|
73
|
-
if multi.match(/\$/)
|
74
|
-
@@attr_cache[sub][type][at] = multi.split("$").collect{|attr| attr.strip}
|
75
|
-
return @@attr_cache[sub][type][at].dup
|
76
|
-
elsif not multi.empty?
|
77
|
-
@@attr_cache[sub][type][at] = multi.gsub(/'/, '').split(' ').collect{|attr| attr.strip}
|
78
|
-
return @@attr_cache[sub][type][at].dup
|
79
|
-
end
|
80
|
-
end
|
81
|
-
@@attr_cache[sub][type][at] = []
|
82
|
-
return []
|
83
|
-
end
|
84
|
-
|
85
|
-
# attribute_aliases
|
86
|
-
#
|
87
|
-
# Returns all names from the LDAP schema for the
|
88
|
-
# attribute given.
|
89
|
-
def attribute_aliases(attr)
|
90
|
-
attr('attributeTypes', attr, 'NAME')
|
91
|
-
end # attribute aliases
|
92
|
-
|
93
|
-
# read_only?
|
94
|
-
#
|
95
|
-
# Returns true if an attribute is read-only
|
96
|
-
# NO-USER-MODIFICATION
|
97
|
-
def read_only?(attr)
|
98
|
-
result = attr('attributeTypes', attr, 'NO-USER-MODIFICATION')
|
99
|
-
return true if result[0] == 'TRUE'
|
100
|
-
return false
|
101
|
-
end
|
102
|
-
|
103
|
-
# single_value?
|
104
|
-
#
|
105
|
-
# Returns true if an attribute can only have one
|
106
|
-
# value defined
|
107
|
-
# SINGLE-VALUE
|
108
|
-
def single_value?(attr)
|
109
|
-
result = attr('attributeTypes', attr, 'SINGLE-VALUE')
|
110
|
-
return true if result[0] == 'TRUE'
|
111
|
-
return false
|
112
|
-
end
|
113
|
-
|
114
|
-
# binary?
|
115
|
-
#
|
116
|
-
# Returns true if the given attribute's syntax
|
117
|
-
# is X-NOT-HUMAN-READABLE or X-BINARY-TRANSFER-REQUIRED
|
118
|
-
def binary?(attr)
|
119
|
-
# Get syntax OID
|
120
|
-
syntax = attr('attributeTypes', attr, 'SYNTAX')
|
121
|
-
return false if syntax.empty?
|
122
|
-
|
123
|
-
# This seems to indicate binary
|
124
|
-
result = attr('ldapSyntaxes', syntax[0], 'X-NOT-HUMAN-READABLE')
|
125
|
-
return true if result[0] == "TRUE"
|
126
|
-
|
127
|
-
# Get if binary transfer is required (non-binary types)
|
128
|
-
# Usually these have the above tag
|
129
|
-
result = attr('ldapSyntaxes', syntax[0], 'X-BINARY-TRANSFER-REQUIRED')
|
130
|
-
return true if result[0] == "TRUE"
|
131
|
-
|
132
|
-
return false
|
133
|
-
end # binary?
|
134
|
-
|
135
|
-
# binary_required?
|
136
|
-
#
|
137
|
-
# Returns true if the value MUST be transferred in binary
|
138
|
-
def binary_required?(attr)
|
139
|
-
# Get syntax OID
|
140
|
-
syntax = attr('attributeTypes', attr, 'SYNTAX')
|
141
|
-
return false if syntax.empty?
|
142
|
-
|
143
|
-
# Get if binary transfer is required (non-binary types)
|
144
|
-
# Usually these have the above tag
|
145
|
-
result = attr('ldapSyntaxes', syntax[0], 'X-BINARY-TRANSFER-REQUIRED')
|
146
|
-
return true if result[0] == "TRUE"
|
147
|
-
|
148
|
-
return false
|
149
|
-
end # binary_required?
|
150
|
-
|
151
|
-
# class_attributes
|
152
|
-
#
|
153
|
-
# Returns an Array of all the valid attributes (but not with full aliases)
|
154
|
-
# for the given objectClass
|
155
|
-
def class_attributes(objc)
|
156
|
-
if @@class_cache.has_key? objc
|
157
|
-
return @@class_cache[objc]
|
158
|
-
end
|
159
|
-
|
160
|
-
# Setup the cache
|
161
|
-
@@class_cache[objc] = {}
|
162
|
-
|
163
|
-
# First get all the current level attributes
|
164
|
-
@@class_cache[objc] = {:must => attr('objectClasses', objc, 'MUST'),
|
165
|
-
:may => attr('objectClasses', objc, 'MAY')}
|
166
|
-
|
167
|
-
# Now add all attributes from the parent object (SUPerclasses)
|
168
|
-
# Hopefully an iterative approach will be pretty speedy
|
169
|
-
# 1. build complete list of SUPs
|
170
|
-
# 2. Add attributes from each
|
171
|
-
sups = attr('objectClasses', objc, 'SUP')
|
172
|
-
loop do
|
173
|
-
start_size = sups.size
|
174
|
-
new_sups = []
|
175
|
-
sups.each do |sup|
|
176
|
-
new_sups += attr('objectClasses', sup, 'SUP')
|
177
|
-
end
|
178
|
-
|
179
|
-
sups += new_sups
|
180
|
-
sups.uniq!
|
181
|
-
break if sups.size == start_size
|
182
|
-
end
|
183
|
-
sups.each do |sup|
|
184
|
-
@@class_cache[objc][:must] += attr('objectClasses', sup, 'MUST')
|
185
|
-
@@class_cache[objc][:may] += attr('objectClasses', sup, 'MAY')
|
186
|
-
end
|
187
|
-
|
188
|
-
# Clean out the dupes.
|
189
|
-
@@class_cache[objc][:must].uniq!
|
190
|
-
@@class_cache[objc][:may].uniq!
|
191
|
-
|
192
|
-
# Return the cached value
|
193
|
-
return @@class_cache[objc].dup
|
194
|
-
end
|
195
|
-
|
196
|
-
end # Schema2
|
197
|
-
|
198
|
-
class Conn
|
199
|
-
def schema2(base = nil, attrs = nil, sec = 0, usec = 0)
|
200
|
-
attrs ||= [
|
201
|
-
'objectClasses',
|
202
|
-
'attributeTypes',
|
203
|
-
'matchingRules',
|
204
|
-
'matchingRuleUse',
|
205
|
-
'dITStructureRules',
|
206
|
-
'dITContentRules',
|
207
|
-
'nameForms',
|
208
|
-
'ldapSyntaxes',
|
209
|
-
]
|
210
|
-
base ||= root_dse(['subschemaSubentry'], sec, usec)[0]['subschemaSubentry'][0]
|
211
|
-
base ||= 'cn=schema'
|
212
|
-
ent = search2(base, LDAP_SCOPE_BASE, '(objectClass=subschema)',
|
213
|
-
attrs, false, sec, usec)
|
214
|
-
return Schema2.new(ent[0])
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end # end LDAP
|