treequel 1.0.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/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
|
+
|