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