treequel 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +354 -0
- data/LICENSE +27 -0
- data/README +66 -0
- data/Rakefile +345 -0
- data/Rakefile.local +43 -0
- data/bin/treeirb +14 -0
- data/bin/treequel +229 -0
- data/examples/company-directory.rb +112 -0
- data/examples/ldap-monitor.rb +143 -0
- data/examples/ldap-monitor/public/css/master.css +328 -0
- data/examples/ldap-monitor/public/images/card_small.png +0 -0
- data/examples/ldap-monitor/public/images/chain_small.png +0 -0
- data/examples/ldap-monitor/public/images/globe_small.png +0 -0
- data/examples/ldap-monitor/public/images/globe_small_green.png +0 -0
- data/examples/ldap-monitor/public/images/plug.png +0 -0
- data/examples/ldap-monitor/public/images/shadows/large-30-down.png +0 -0
- data/examples/ldap-monitor/public/images/tick.png +0 -0
- data/examples/ldap-monitor/public/images/tick_circle.png +0 -0
- data/examples/ldap-monitor/public/images/treequel-favicon.png +0 -0
- data/examples/ldap-monitor/views/backends.erb +41 -0
- data/examples/ldap-monitor/views/connections.erb +74 -0
- data/examples/ldap-monitor/views/databases.erb +39 -0
- data/examples/ldap-monitor/views/dump_subsystem.erb +14 -0
- data/examples/ldap-monitor/views/index.erb +14 -0
- data/examples/ldap-monitor/views/layout.erb +35 -0
- data/examples/ldap-monitor/views/listeners.erb +30 -0
- data/examples/ldap_state.rb +62 -0
- data/lib/treequel.rb +145 -0
- data/lib/treequel/branch.rb +589 -0
- data/lib/treequel/branchcollection.rb +204 -0
- data/lib/treequel/branchset.rb +360 -0
- data/lib/treequel/constants.rb +604 -0
- data/lib/treequel/directory.rb +541 -0
- data/lib/treequel/exceptions.rb +32 -0
- data/lib/treequel/filter.rb +704 -0
- data/lib/treequel/mixins.rb +325 -0
- data/lib/treequel/schema.rb +245 -0
- data/lib/treequel/schema/attributetype.rb +252 -0
- data/lib/treequel/schema/ldapsyntax.rb +96 -0
- data/lib/treequel/schema/matchingrule.rb +124 -0
- data/lib/treequel/schema/matchingruleuse.rb +124 -0
- data/lib/treequel/schema/objectclass.rb +289 -0
- data/lib/treequel/sequel_integration.rb +26 -0
- data/lib/treequel/utils.rb +169 -0
- data/rake/191_compat.rb +26 -0
- data/rake/dependencies.rb +76 -0
- data/rake/helpers.rb +434 -0
- data/rake/hg.rb +261 -0
- data/rake/manual.rb +782 -0
- data/rake/packaging.rb +135 -0
- data/rake/publishing.rb +318 -0
- data/rake/rdoc.rb +30 -0
- data/rake/style.rb +62 -0
- data/rake/svn.rb +668 -0
- data/rake/testing.rb +187 -0
- data/rake/verifytask.rb +64 -0
- data/rake/win32.rb +190 -0
- data/spec/lib/constants.rb +93 -0
- data/spec/lib/helpers.rb +100 -0
- data/spec/treequel/branch_spec.rb +569 -0
- data/spec/treequel/branchcollection_spec.rb +213 -0
- data/spec/treequel/branchset_spec.rb +376 -0
- data/spec/treequel/directory_spec.rb +487 -0
- data/spec/treequel/filter_spec.rb +482 -0
- data/spec/treequel/mixins_spec.rb +330 -0
- data/spec/treequel/schema/attributetype_spec.rb +237 -0
- data/spec/treequel/schema/ldapsyntax_spec.rb +83 -0
- data/spec/treequel/schema/matchingrule_spec.rb +158 -0
- data/spec/treequel/schema/matchingruleuse_spec.rb +137 -0
- data/spec/treequel/schema/objectclass_spec.rb +262 -0
- data/spec/treequel/schema_spec.rb +118 -0
- data/spec/treequel/utils_spec.rb +49 -0
- data/spec/treequel_spec.rb +179 -0
- metadata +169 -0
@@ -0,0 +1,252 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
|
5
|
+
require 'treequel'
|
6
|
+
require 'treequel/mixins'
|
7
|
+
require 'treequel/schema'
|
8
|
+
require 'treequel/exceptions'
|
9
|
+
|
10
|
+
|
11
|
+
# This is a class for representing attributeType declarations in a Treequel::Schema.
|
12
|
+
#
|
13
|
+
# == Authors
|
14
|
+
#
|
15
|
+
# * Michael Granger <ged@FaerieMUD.org>
|
16
|
+
# * Mahlon E. Smith <mahlon@martini.nu>
|
17
|
+
#
|
18
|
+
# :include: LICENSE
|
19
|
+
#
|
20
|
+
#--
|
21
|
+
#
|
22
|
+
# Please see the file LICENSE in the base directory for licensing details.
|
23
|
+
#
|
24
|
+
class Treequel::Schema::AttributeType
|
25
|
+
include Treequel::Loggable,
|
26
|
+
Treequel::Constants::Patterns
|
27
|
+
|
28
|
+
extend Treequel::AttributeDeclarations
|
29
|
+
|
30
|
+
|
31
|
+
#############################################################
|
32
|
+
### C L A S S M E T H O D S
|
33
|
+
#############################################################
|
34
|
+
|
35
|
+
### Parse an AttributeType entry from a attributeType description from a schema.
|
36
|
+
def self::parse( schema, description )
|
37
|
+
unless match = ( LDAP_ATTRIBUTE_TYPE_DESCRIPTION.match(description) )
|
38
|
+
raise Treequel::ParseError, "failed to parse attributeType from %p" % [ description ]
|
39
|
+
end
|
40
|
+
|
41
|
+
oid, names, desc, obsolete, sup_oid, eqmatch_oid, ordmatch_oid, submatch_oid, syntax_oid,
|
42
|
+
single, collective, nousermod, usagetype, extensions = match.captures
|
43
|
+
|
44
|
+
# Normalize the attributes
|
45
|
+
names = Treequel::Schema.parse_names( names )
|
46
|
+
desc = Treequel::Schema.unquote_desc( desc )
|
47
|
+
|
48
|
+
sup_oid = Treequel::Schema.parse_oid( sup_oid ) if sup_oid
|
49
|
+
eqmatch_oid = Treequel::Schema.parse_oid( eqmatch_oid ) if eqmatch_oid
|
50
|
+
ordmatch_oid = Treequel::Schema.parse_oid( ordmatch_oid ) if ordmatch_oid
|
51
|
+
submatch_oid = Treequel::Schema.parse_oid( submatch_oid ) if submatch_oid
|
52
|
+
|
53
|
+
return self.new( schema, oid,
|
54
|
+
:names => names,
|
55
|
+
:desc => desc,
|
56
|
+
:obsolete => obsolete,
|
57
|
+
:sup_oid => sup_oid,
|
58
|
+
:eqmatch_oid => eqmatch_oid,
|
59
|
+
:ordmatch_oid => ordmatch_oid,
|
60
|
+
:submatch_oid => submatch_oid,
|
61
|
+
:syntax_oid => syntax_oid,
|
62
|
+
:single => single,
|
63
|
+
:collective => collective,
|
64
|
+
:user_modifiable => nousermod ? false : true,
|
65
|
+
:usagetype => usagetype,
|
66
|
+
:extensions => extensions
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
#############################################################
|
72
|
+
### I N S T A N C E M E T H O D S
|
73
|
+
#############################################################
|
74
|
+
|
75
|
+
### Create a new AttributeType
|
76
|
+
def initialize( schema, oid, attributes )
|
77
|
+
|
78
|
+
@schema = schema
|
79
|
+
|
80
|
+
@oid = oid
|
81
|
+
@names = attributes[:names]
|
82
|
+
@desc = attributes[:desc]
|
83
|
+
@obsolete = attributes[:obsolete] ? true : false
|
84
|
+
@sup_oid = attributes[:sup_oid]
|
85
|
+
@eqmatch_oid = attributes[:eqmatch_oid]
|
86
|
+
@ordmatch_oid = attributes[:ordmatch_oid]
|
87
|
+
@submatch_oid = attributes[:submatch_oid]
|
88
|
+
@single = attributes[:single] ? true : false
|
89
|
+
@collective = attributes[:collective] ? true : false
|
90
|
+
@user_modifiable = attributes[:user_modifiable] ? true : false
|
91
|
+
@usagetype = attributes[:usagetype]
|
92
|
+
@extensions = attributes[:extensions]
|
93
|
+
|
94
|
+
@syntax_oid, @syntax_len = self.split_syntax_oid( attributes[:syntax_oid] ) if
|
95
|
+
attributes[:syntax_oid]
|
96
|
+
|
97
|
+
super()
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
######
|
102
|
+
public
|
103
|
+
######
|
104
|
+
|
105
|
+
# The schema the attributeType belongs to
|
106
|
+
attr_reader :schema
|
107
|
+
|
108
|
+
# The attributeType's oid
|
109
|
+
attr_reader :oid
|
110
|
+
|
111
|
+
# The Array of the attributeType's names
|
112
|
+
attr_reader :names
|
113
|
+
|
114
|
+
# The attributeType's description
|
115
|
+
attr_accessor :desc
|
116
|
+
|
117
|
+
# Is the attributeType obsolete?
|
118
|
+
predicate_attr :obsolete
|
119
|
+
|
120
|
+
# The attributeType's superior class's OID
|
121
|
+
attr_accessor :sup_oid
|
122
|
+
|
123
|
+
# The oid of the attributeType's equality matching rule
|
124
|
+
attr_accessor :eqmatch_oid
|
125
|
+
|
126
|
+
# The oid of the attributeType's order matching rule
|
127
|
+
attr_accessor :ordmatch_oid
|
128
|
+
|
129
|
+
# The oid of the attributeType's substring matching rule
|
130
|
+
attr_accessor :submatch_oid
|
131
|
+
|
132
|
+
# The oid of the attributeType's value syntax
|
133
|
+
attr_accessor :syntax_oid
|
134
|
+
|
135
|
+
# The (optional) syntax length qualifier (nil if not present)
|
136
|
+
attr_accessor :syntax_len
|
137
|
+
|
138
|
+
# Are attributes of this type restricted to a single value?
|
139
|
+
predicate_attr :single
|
140
|
+
|
141
|
+
# Are attributes of this type collective?
|
142
|
+
predicate_attr :collective
|
143
|
+
|
144
|
+
# Are attributes of this type user-modifiable?
|
145
|
+
predicate_attr :user_modifiable
|
146
|
+
|
147
|
+
# The application of this attributeType
|
148
|
+
attr_accessor :usagetype
|
149
|
+
|
150
|
+
# The attributeType's extensions (as a String)
|
151
|
+
attr_accessor :extensions
|
152
|
+
|
153
|
+
|
154
|
+
### Return the first of the attributeType's names, if it has any, or +nil+.
|
155
|
+
def name
|
156
|
+
return self.names.first
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
### Return the Treequel::Schema::AttributeType instance that corresponds to
|
161
|
+
### the receiver's superior type. If the attributeType doesn't have a SUP
|
162
|
+
### attribute, this method returns +nil+.
|
163
|
+
def sup
|
164
|
+
return nil unless oid = self.sup_oid
|
165
|
+
return self.schema.attribute_types[ oid ]
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
### Return a human-readable representation of the object suitable for debugging
|
170
|
+
def inspect
|
171
|
+
return "#<%s:0x%0x %s(%s) %p %sSYNTAX: %p (length: %s)>" % [
|
172
|
+
self.class.name,
|
173
|
+
self.object_id / 2,
|
174
|
+
self.name,
|
175
|
+
self.oid,
|
176
|
+
self.desc,
|
177
|
+
self.is_single? ? '(SINGLE) ' : '',
|
178
|
+
self.syntax_oid,
|
179
|
+
self.syntax_len ? self.syntax_len : 'unlimited',
|
180
|
+
]
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
### Return the Treequel::Schema::MatchingRule that corresponds to the EQUALITY
|
185
|
+
### matchingRule of the receiving attributeType.
|
186
|
+
def equality_matching_rule
|
187
|
+
if oid = self.eqmatch_oid
|
188
|
+
return self.schema.matching_rules[ oid ]
|
189
|
+
elsif self.sup
|
190
|
+
return self.sup.equality_matching_rule
|
191
|
+
else
|
192
|
+
return nil
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
### Return the Treequel::Schema::MatchingRule that corresponds to the ORDERING
|
198
|
+
### matchingRule of the receiving attributeType.
|
199
|
+
def ordering_matching_rule
|
200
|
+
if oid = self.ordmatch_oid
|
201
|
+
return self.schema.matching_rules[ oid ]
|
202
|
+
elsif self.sup
|
203
|
+
return self.sup.ordering_matching_rule
|
204
|
+
else
|
205
|
+
return nil
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
### Return the Treequel::Schema::MatchingRule that corresponds to the SUBSTR
|
211
|
+
### matchingRule of the receiving attributeType.
|
212
|
+
def substr_matching_rule
|
213
|
+
if oid = self.submatch_oid
|
214
|
+
return self.schema.matching_rules[ oid ]
|
215
|
+
elsif self.sup
|
216
|
+
return self.sup.substr_matching_rule
|
217
|
+
else
|
218
|
+
return nil
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
### Return the Treequel::Schema::LDAPSyntax that corresponds to the receiver's SYNTAX attribute.
|
224
|
+
def syntax
|
225
|
+
if oid = self.syntax_oid
|
226
|
+
return self.schema.ldap_syntaxes[ oid ]
|
227
|
+
elsif self.sup
|
228
|
+
return self.sup.syntax
|
229
|
+
else
|
230
|
+
return nil
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
|
235
|
+
#########
|
236
|
+
protected
|
237
|
+
#########
|
238
|
+
|
239
|
+
### Split a numeric OID with an optional length qualifier into a numeric OID and length. If
|
240
|
+
### no length qualifier is present, it will be nil.
|
241
|
+
def split_syntax_oid( noidlen )
|
242
|
+
unless noidlen =~ /^(#{NUMERICOID}) (?:#{LCURLY} (#{LEN}) #{RCURLY})?$/x
|
243
|
+
raise Treequel::ParseError, "invalid numeric syntax OID with length: %p" % [ noidlen ]
|
244
|
+
end
|
245
|
+
|
246
|
+
oid, len = $1, $2
|
247
|
+
|
248
|
+
return oid, len ? Integer(len) : nil
|
249
|
+
end
|
250
|
+
|
251
|
+
end # class Treequel::Schema::AttributeType
|
252
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
|
5
|
+
require 'treequel'
|
6
|
+
require 'treequel/mixins'
|
7
|
+
require 'treequel/schema'
|
8
|
+
require 'treequel/exceptions'
|
9
|
+
|
10
|
+
|
11
|
+
# This is a class for representing ldapSyntax declarations in a Treequel::Schema.
|
12
|
+
#
|
13
|
+
# == Authors
|
14
|
+
#
|
15
|
+
# * Michael Granger <ged@FaerieMUD.org>
|
16
|
+
#
|
17
|
+
# :include: LICENSE
|
18
|
+
#
|
19
|
+
#--
|
20
|
+
#
|
21
|
+
# Please see the file LICENSE in the base directory for licensing details.
|
22
|
+
#
|
23
|
+
class Treequel::Schema::LDAPSyntax
|
24
|
+
include Treequel::Loggable,
|
25
|
+
Treequel::Constants::Patterns
|
26
|
+
|
27
|
+
extend Treequel::AttributeDeclarations
|
28
|
+
|
29
|
+
|
30
|
+
#############################################################
|
31
|
+
### C L A S S M E T H O D S
|
32
|
+
#############################################################
|
33
|
+
|
34
|
+
### Parse an LDAPSyntax entry from an ldapSyntax description from a schema.
|
35
|
+
def self::parse( schema, description )
|
36
|
+
unless match = ( LDAP_SYNTAX_DESCRIPTION.match(description) )
|
37
|
+
raise Treequel::ParseError, "failed to parse syntax from %p" % [ description ]
|
38
|
+
end
|
39
|
+
|
40
|
+
oid, desc, extensions = match.captures
|
41
|
+
# Treequel.logger.debug " parsed syntax: %p" % [ match.captures ]
|
42
|
+
|
43
|
+
# Normalize the attributes
|
44
|
+
desc = Treequel::Schema.unquote_desc( desc )
|
45
|
+
|
46
|
+
return self.new( schema, oid, desc, extensions )
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
#############################################################
|
51
|
+
### I N S T A N C E M E T H O D S
|
52
|
+
#############################################################
|
53
|
+
|
54
|
+
### Create a new LDAPSyntax
|
55
|
+
def initialize( schema, oid, desc=nil, extensions=nil )
|
56
|
+
|
57
|
+
@schema = schema
|
58
|
+
|
59
|
+
@oid = oid
|
60
|
+
@desc = desc
|
61
|
+
@extensions = extensions
|
62
|
+
|
63
|
+
super()
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
######
|
68
|
+
public
|
69
|
+
######
|
70
|
+
|
71
|
+
# The schema the syntax belongs to
|
72
|
+
attr_reader :schema
|
73
|
+
|
74
|
+
# The syntax's oid
|
75
|
+
attr_reader :oid
|
76
|
+
|
77
|
+
# The syntax's description
|
78
|
+
attr_accessor :desc
|
79
|
+
|
80
|
+
# The syntax's extensions (as a String)
|
81
|
+
attr_accessor :extensions
|
82
|
+
|
83
|
+
|
84
|
+
### Return a human-readable representation of the object suitable for debugging
|
85
|
+
def inspect
|
86
|
+
return "#<%s:0x%0x %s(%s)>" % [
|
87
|
+
self.class.name,
|
88
|
+
self.object_id / 2,
|
89
|
+
self.oid,
|
90
|
+
self.desc,
|
91
|
+
]
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
end # class Treequel::Schema::LDAPSyntax
|
96
|
+
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
|
5
|
+
require 'treequel'
|
6
|
+
require 'treequel/mixins'
|
7
|
+
require 'treequel/schema'
|
8
|
+
require 'treequel/exceptions'
|
9
|
+
|
10
|
+
|
11
|
+
# This is a class for representing matchingRule declarations in a Treequel::Schema.
|
12
|
+
#
|
13
|
+
# == Authors
|
14
|
+
#
|
15
|
+
# * Michael Granger <ged@FaerieMUD.org>
|
16
|
+
#
|
17
|
+
# :include: LICENSE
|
18
|
+
#
|
19
|
+
#--
|
20
|
+
#
|
21
|
+
# Please see the file LICENSE in the base directory for licensing details.
|
22
|
+
#
|
23
|
+
class Treequel::Schema::MatchingRule
|
24
|
+
include Treequel::Loggable,
|
25
|
+
Treequel::Constants::Patterns
|
26
|
+
|
27
|
+
extend Treequel::AttributeDeclarations
|
28
|
+
|
29
|
+
|
30
|
+
#############################################################
|
31
|
+
### C L A S S M E T H O D S
|
32
|
+
#############################################################
|
33
|
+
|
34
|
+
### Parse an MatchingRule entry from a matchingRule description from a schema.
|
35
|
+
def self::parse( schema, description )
|
36
|
+
unless match = ( LDAP_MATCHING_RULE_DESCRIPTION.match(description) )
|
37
|
+
raise Treequel::ParseError, "failed to parse matchingRule from %p" % [ description ]
|
38
|
+
end
|
39
|
+
|
40
|
+
oid, names, desc, obsolete, syntax_oid, extensions = match.captures
|
41
|
+
# Treequel.logger.debug " parsed matchingRule: %p" % [ match.captures ]
|
42
|
+
|
43
|
+
# Normalize the attributes
|
44
|
+
names = Treequel::Schema.parse_names( names )
|
45
|
+
desc = Treequel::Schema.unquote_desc( desc )
|
46
|
+
|
47
|
+
return self.new( schema, oid, syntax_oid, names, desc, obsolete, extensions )
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
#############################################################
|
52
|
+
### I N S T A N C E M E T H O D S
|
53
|
+
#############################################################
|
54
|
+
|
55
|
+
### Create a new MatchingRule
|
56
|
+
def initialize( schema, oid, syntax_oid, names=nil, desc=nil, obsolete=false, extensions=nil )
|
57
|
+
|
58
|
+
@schema = schema
|
59
|
+
|
60
|
+
@oid = oid
|
61
|
+
@syntax_oid = syntax_oid
|
62
|
+
@names = names
|
63
|
+
@desc = desc
|
64
|
+
@obsolete = obsolete ? true : false
|
65
|
+
@extensions = extensions
|
66
|
+
|
67
|
+
super()
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
######
|
72
|
+
public
|
73
|
+
######
|
74
|
+
|
75
|
+
# The schema the matchingRule belongs to
|
76
|
+
attr_reader :schema
|
77
|
+
|
78
|
+
# The matchingRule's oid
|
79
|
+
attr_reader :oid
|
80
|
+
|
81
|
+
# The oid of the matchingRule's SYNTAX
|
82
|
+
attr_accessor :syntax_oid
|
83
|
+
|
84
|
+
# The Array of the matchingRule's names
|
85
|
+
attr_reader :names
|
86
|
+
|
87
|
+
# The matchingRule's description
|
88
|
+
attr_accessor :desc
|
89
|
+
|
90
|
+
# Is the matchingRule obsolete?
|
91
|
+
predicate_attr :obsolete
|
92
|
+
|
93
|
+
# The matchingRule's extensions (as a String)
|
94
|
+
attr_accessor :extensions
|
95
|
+
|
96
|
+
|
97
|
+
### Return the first of the matchingRule's names, if it has any, or +nil+.
|
98
|
+
def name
|
99
|
+
return self.names.first
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
### Return a human-readable representation of the object suitable for debugging
|
104
|
+
def inspect
|
105
|
+
return "#<%s:0x%0x %s(%s) %s %sSYNTAX: %p>" % [
|
106
|
+
self.class.name,
|
107
|
+
self.object_id / 2,
|
108
|
+
self.name,
|
109
|
+
self.oid,
|
110
|
+
self.desc,
|
111
|
+
self.obsolete? ? "(OBSOLETE)" : '',
|
112
|
+
self.syntax,
|
113
|
+
]
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
### Return the Treequel::Schema::LDAPSyntax object that corresponds to the matchingRule's
|
118
|
+
### SYNTAX attribute.
|
119
|
+
def syntax
|
120
|
+
return self.schema.ldap_syntaxes[ self.syntax_oid ]
|
121
|
+
end
|
122
|
+
|
123
|
+
end # class Treequel::Schema::MatchingRule
|
124
|
+
|