treequel 1.0.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +130 -1
- data/Rakefile +8 -3
- data/Rakefile.local +2 -0
- data/bin/treeirb +6 -2
- data/bin/treequel +5 -4
- data/lib/treequel/branch.rb +133 -72
- data/lib/treequel/branchcollection.rb +16 -5
- data/lib/treequel/branchset.rb +37 -6
- data/lib/treequel/constants.rb +12 -0
- data/lib/treequel/directory.rb +96 -41
- data/lib/treequel/filter.rb +42 -1
- data/lib/treequel/model/objectclass.rb +111 -0
- data/lib/treequel/model.rb +363 -0
- data/lib/treequel/monkeypatches.rb +65 -0
- data/lib/treequel/schema/attributetype.rb +108 -18
- data/lib/treequel/schema/ldapsyntax.rb +15 -0
- data/lib/treequel/schema/matchingrule.rb +24 -0
- data/lib/treequel/schema/matchingruleuse.rb +24 -0
- data/lib/treequel/schema/objectclass.rb +70 -5
- data/lib/treequel/schema/table.rb +5 -15
- data/lib/treequel/schema.rb +64 -1
- data/lib/treequel.rb +5 -5
- data/rake/documentation.rb +27 -0
- data/rake/hg.rb +14 -2
- data/rake/manual.rb +1 -1
- data/spec/lib/constants.rb +9 -7
- data/spec/lib/control_behavior.rb +1 -0
- data/spec/lib/matchers.rb +1 -0
- data/spec/treequel/branch_spec.rb +229 -20
- data/spec/treequel/branchcollection_spec.rb +73 -39
- data/spec/treequel/branchset_spec.rb +59 -8
- data/spec/treequel/control_spec.rb +1 -0
- data/spec/treequel/controls/contentsync_spec.rb +1 -0
- data/spec/treequel/controls/pagedresults_spec.rb +1 -0
- data/spec/treequel/controls/sortedresults_spec.rb +1 -0
- data/spec/treequel/directory_spec.rb +46 -10
- data/spec/treequel/filter_spec.rb +28 -5
- data/spec/treequel/mixins_spec.rb +7 -14
- data/spec/treequel/model/objectclass_spec.rb +330 -0
- data/spec/treequel/model_spec.rb +433 -0
- data/spec/treequel/monkeypatches_spec.rb +118 -0
- data/spec/treequel/schema/attributetype_spec.rb +116 -0
- data/spec/treequel/schema/ldapsyntax_spec.rb +8 -0
- data/spec/treequel/schema/matchingrule_spec.rb +6 -1
- data/spec/treequel/schema/matchingruleuse_spec.rb +5 -0
- data/spec/treequel/schema/objectclass_spec.rb +41 -3
- data/spec/treequel/schema/table_spec.rb +31 -18
- data/spec/treequel/schema_spec.rb +13 -16
- data/spec/treequel_spec.rb +22 -0
- data.tar.gz.sig +1 -0
- metadata +40 -7
- metadata.gz.sig +0 -0
- data/spec/treequel/utils_spec.rb +0 -49
@@ -92,7 +92,7 @@ class Treequel::Schema
|
|
92
92
|
@names = names
|
93
93
|
@desc = desc
|
94
94
|
@obsolete = obsolete ? true : false
|
95
|
-
@
|
95
|
+
@sup_oid = sup
|
96
96
|
@must_oids = must_oids
|
97
97
|
@may_oids = may_oids
|
98
98
|
@extensions = extensions
|
@@ -120,8 +120,8 @@ class Treequel::Schema
|
|
120
120
|
# Is the objectClass obsolete?
|
121
121
|
predicate_attr :obsolete
|
122
122
|
|
123
|
-
# The
|
124
|
-
attr_accessor :
|
123
|
+
# The OID of the objectClass's superior class (if specified)
|
124
|
+
attr_accessor :sup_oid
|
125
125
|
|
126
126
|
# The objectClass's extensions (as a String)
|
127
127
|
attr_accessor :extensions
|
@@ -194,6 +194,48 @@ class Treequel::Schema
|
|
194
194
|
end
|
195
195
|
|
196
196
|
|
197
|
+
### Returns the objectClass as a String, which is the RFC4512-style schema
|
198
|
+
### description.
|
199
|
+
def to_s
|
200
|
+
# ObjectClassDescription = LPAREN WSP
|
201
|
+
# numericoid ; object identifier
|
202
|
+
# [ SP "NAME" SP qdescrs ] ; short names (descriptors)
|
203
|
+
# [ SP "DESC" SP qdstring ] ; description
|
204
|
+
# [ SP "OBSOLETE" ] ; not active
|
205
|
+
# [ SP "SUP" SP oids ] ; superior object classes
|
206
|
+
# [ SP kind ] ; kind of class
|
207
|
+
# [ SP "MUST" SP oids ] ; attribute types
|
208
|
+
# [ SP "MAY" SP oids ] ; attribute types
|
209
|
+
# extensions WSP RPAREN
|
210
|
+
#
|
211
|
+
# kind = "ABSTRACT" / "STRUCTURAL" / "AUXILIARY"
|
212
|
+
|
213
|
+
parts = [ self.oid ]
|
214
|
+
|
215
|
+
parts << "NAME %s" % Treequel::Schema.qdescrs( self.names ) unless self.names.empty?
|
216
|
+
parts << "DESC %s" % [ Treequel::Schema.qdstring(self.desc) ] if self.desc
|
217
|
+
parts << "OBSOLETE" if self.obsolete?
|
218
|
+
parts << "SUP %s" % [ Treequel::Schema.oids(self.sup_oid) ] if self.sup_oid
|
219
|
+
parts << self.kind
|
220
|
+
parts << "MUST %s" % [ Treequel::Schema.oids(self.must_oids(false)) ] unless
|
221
|
+
self.must_oids(false).empty?
|
222
|
+
parts << "MAY %s" % [ Treequel::Schema.oids(self.may_oids(false)) ] unless
|
223
|
+
self.may_oids(false).empty?
|
224
|
+
parts << self.extensions.strip unless self.extensions.empty?
|
225
|
+
|
226
|
+
return "( %s )" % [ parts.join(' ') ]
|
227
|
+
end
|
228
|
+
|
229
|
+
# @oid = oid
|
230
|
+
# @names = names
|
231
|
+
# @desc = desc
|
232
|
+
# @obsolete = obsolete ? true : false
|
233
|
+
# @sup_oid = sup
|
234
|
+
# @must_oids = must_oids
|
235
|
+
# @may_oids = may_oids
|
236
|
+
# @extensions = extensions
|
237
|
+
|
238
|
+
|
197
239
|
### Return a human-readable representation of the object suitable for debugging
|
198
240
|
def inspect
|
199
241
|
return %{#<%s:0x%0x %s(%s) < %s "%s" MUST: %p, MAY: %p>} % [
|
@@ -201,7 +243,7 @@ class Treequel::Schema
|
|
201
243
|
self.object_id / 2,
|
202
244
|
self.name,
|
203
245
|
self.oid,
|
204
|
-
self.
|
246
|
+
self.sup_oid,
|
205
247
|
self.desc,
|
206
248
|
self.must_oids,
|
207
249
|
self.may_oids,
|
@@ -212,13 +254,36 @@ class Treequel::Schema
|
|
212
254
|
### Return the ObjectClass for the receiver's SUP. If this is called on
|
213
255
|
### 'top', returns nil.
|
214
256
|
def sup
|
215
|
-
unless name = self.
|
257
|
+
unless name = self.sup_oid
|
216
258
|
return nil if self.oid == Treequel::Constants::OIDS::TOP_OBJECTCLASS
|
217
259
|
return self.schema.object_classes[ :top ]
|
218
260
|
end
|
219
261
|
return self.schema.object_classes[ name.to_sym ]
|
220
262
|
end
|
221
263
|
|
264
|
+
|
265
|
+
### Return the SUP chain for the receiver up to 'top', including the receiver
|
266
|
+
### itself.
|
267
|
+
### @return [Array<Treequel::Schema::ObjectClass>] the array of ObjectClass objects
|
268
|
+
### the receiver inherits from.
|
269
|
+
def ancestors
|
270
|
+
rval = [ self ]
|
271
|
+
|
272
|
+
if parent = self.sup
|
273
|
+
rval += parent.ancestors
|
274
|
+
end
|
275
|
+
|
276
|
+
return rval
|
277
|
+
end
|
278
|
+
|
279
|
+
|
280
|
+
### Return the string that represents the kind of objectClass
|
281
|
+
### the receiver represents.
|
282
|
+
### @return [String] one of: 'ABSTRACT', 'STRUCTURAL', 'AUXILIARY'
|
283
|
+
def kind
|
284
|
+
return Treequel::Schema::OBJECTCLASS_TYPES.invert[ self.class ]
|
285
|
+
end
|
286
|
+
|
222
287
|
end # class ObjectClass
|
223
288
|
|
224
289
|
|
@@ -11,27 +11,16 @@ require 'treequel/mixins'
|
|
11
11
|
|
12
12
|
# This is an object that is used to store LDAP schema information in a
|
13
13
|
# case-insensitive table.
|
14
|
-
#
|
15
|
-
# == Authors
|
16
|
-
#
|
17
|
-
# * Michael Granger <ged@FaerieMUD.org>
|
18
|
-
# * Mahlon E. Smith <mahlon@martini.nu>
|
19
|
-
#
|
20
|
-
# :include: LICENSE
|
21
|
-
#
|
22
|
-
#--
|
23
|
-
#
|
24
|
-
# Please see the file LICENSE in the base directory for licensing details.
|
25
|
-
#
|
26
14
|
class Treequel::Schema::Table
|
27
15
|
extend Forwardable
|
28
|
-
include
|
16
|
+
include Enumerable,
|
17
|
+
Treequel::Loggable,
|
29
18
|
Treequel::Normalization,
|
30
19
|
Treequel::Constants::Patterns
|
31
20
|
|
32
21
|
# The list of methods that should be delegated through the key-normalization
|
33
22
|
# method.
|
34
|
-
KEYED_METHODS = [ :"[]", :"[]=", :delete, :fetch, :key?, :has_key?, :include?,
|
23
|
+
KEYED_METHODS = [ :"[]", :"[]=", :delete, :fetch, :key?, :has_key?, :include?,
|
35
24
|
:member?, :store ]
|
36
25
|
|
37
26
|
|
@@ -73,7 +62,8 @@ class Treequel::Schema::Table
|
|
73
62
|
|
74
63
|
# Delegate some methods to the underlying Hash
|
75
64
|
begin
|
76
|
-
unoverridden_methods = Hash.
|
65
|
+
unoverridden_methods = Hash.
|
66
|
+
instance_methods(false).collect {|mname| mname.to_sym }
|
77
67
|
def_delegators :@hash, *( unoverridden_methods - KEYED_METHODS )
|
78
68
|
end
|
79
69
|
|
data/lib/treequel/schema.rb
CHANGED
@@ -105,6 +105,54 @@ class Treequel::Schema
|
|
105
105
|
end
|
106
106
|
|
107
107
|
|
108
|
+
### Return a description of the given +descriptors+ suitable for inclusion in
|
109
|
+
### an RFC4512-style schema description entry.
|
110
|
+
### @param [Array<String>] descriptors an Array of descriptors
|
111
|
+
### @return [String] the 'qdescrs' text
|
112
|
+
def self::qdescrs( *descriptors )
|
113
|
+
descriptors.flatten!
|
114
|
+
if descriptors.length > 1
|
115
|
+
return "( %s )" % [ descriptors.collect {|str| self.qdstring(str) }.join(" ") ]
|
116
|
+
else
|
117
|
+
return self.qdstring( descriptors.first )
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
# qdstring = SQUOTE dstring SQUOTE
|
123
|
+
# dstring = 1*( QS / QQ / QUTF8 ) ; escaped UTF-8 string
|
124
|
+
#
|
125
|
+
# QQ = ESC %x32 %x37 ; "\27"
|
126
|
+
# QS = ESC %x35 ( %x43 / %x63 ) ; "\5C" / "\5c"
|
127
|
+
#
|
128
|
+
# ; Any UTF-8 encoded Unicode character
|
129
|
+
# ; except %x27 ("\'") and %x5C ("\")
|
130
|
+
# QUTF8 = QUTF1 / UTFMB
|
131
|
+
|
132
|
+
### Escape and quote the specified +string+ according to the rules in
|
133
|
+
### RFC4512/2252.
|
134
|
+
### @param [String] string the unescaped UTF8 string
|
135
|
+
### @return [String] the string after quoting and escaping
|
136
|
+
def self::qdstring( string )
|
137
|
+
return "'%s'" % [ string.to_s.gsub(/\\/, '\\\\5c').gsub(/'/, '\\\\27') ]
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
### Return a description of the given +oids+ suitable for inclusion in
|
142
|
+
### an RFC4512-style schema description entry.
|
143
|
+
### @param [Array<String>] oids an Array of numeric or symbolic OIDs
|
144
|
+
### @return [String] the oid list text
|
145
|
+
def self::oids( *oids )
|
146
|
+
oids.flatten!
|
147
|
+
if oids.length > 1
|
148
|
+
return "( %s )" % [ oids.join(" $ ") ]
|
149
|
+
else
|
150
|
+
return oids.first
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
|
108
156
|
#################################################################
|
109
157
|
### I N S T A N C E M E T H O D S
|
110
158
|
#################################################################
|
@@ -126,28 +174,43 @@ class Treequel::Schema
|
|
126
174
|
public
|
127
175
|
######
|
128
176
|
|
129
|
-
# The
|
177
|
+
# The table of Treequel::Schema::ObjectClass objects, keyed by OID and any associated NAME
|
130
178
|
# attributes (as Symbols), that describes the objectClasses in the directory's schema.
|
179
|
+
# @return [Treequel::Schema::Table]
|
131
180
|
attr_reader :object_classes
|
132
181
|
|
133
182
|
# The hash of Treequel::Schema::AttributeType objects, keyed by OID and any associated NAME
|
134
183
|
# attributes (as Symbols), that describe the attributeTypes in the directory's schema.
|
184
|
+
# @return [Treequel::Schema::Table]
|
135
185
|
attr_reader :attribute_types
|
136
186
|
|
137
187
|
# The hash of Treequel::Schema::LDAPSyntax objects, keyed by OID, that describe the
|
138
188
|
# syntaxes in the directory's schema.
|
189
|
+
# @return [Treequel::Schema::Table]
|
139
190
|
attr_reader :ldap_syntaxes
|
140
191
|
|
141
192
|
# The hash of Treequel::Schema::MatchingRule objects, keyed by OID and any associated NAME
|
142
193
|
# attributes (as Symbols), that describe the matchingRules int he directory's schema.
|
194
|
+
# @return [Treequel::Schema::Table]
|
143
195
|
attr_reader :matching_rules
|
144
196
|
|
145
197
|
# The hash of Treequel::Schema::MatchingRuleUse objects, keyed by OID and any associated NAME
|
146
198
|
# attributes (as Symbols), that describe the attributes to which a matchingRule can be applied.
|
199
|
+
# @return [Treequel::Schema::Table]
|
147
200
|
attr_reader :matching_rule_uses
|
201
|
+
alias_method :matching_rule_use, :matching_rule_uses
|
202
|
+
|
203
|
+
|
204
|
+
### Return the Treequel::Schema::AttributeType objects that correspond to the
|
205
|
+
### operational attributes that are supported by the directory.
|
206
|
+
### @return [Array<Treequel::Schema::AttributeType>] the operational attributes
|
207
|
+
def operational_attribute_types
|
208
|
+
return self.attribute_types.values.find_all {|attrtype| attrtype.operational? }.uniq
|
209
|
+
end
|
148
210
|
|
149
211
|
|
150
212
|
### Return a human-readable representation of the object suitable for debugging.
|
213
|
+
### @return [String]
|
151
214
|
def inspect
|
152
215
|
ivar_descs = self.instance_variables.sort.collect do |ivar|
|
153
216
|
len = self.instance_variable_get( ivar ).length
|
data/lib/treequel.rb
CHANGED
@@ -25,7 +25,7 @@ end
|
|
25
25
|
|
26
26
|
# A library for interacting with LDAP modelled after Sequel.
|
27
27
|
#
|
28
|
-
# @version 1.0
|
28
|
+
# @version 1.1.0
|
29
29
|
#
|
30
30
|
# @example
|
31
31
|
# # Connect to the directory at the specified URL
|
@@ -53,10 +53,10 @@ end
|
|
53
53
|
module Treequel
|
54
54
|
|
55
55
|
# Library version
|
56
|
-
VERSION = '1.0
|
56
|
+
VERSION = '1.1.0'
|
57
57
|
|
58
58
|
# VCS revision
|
59
|
-
REVISION = %q$Revision:
|
59
|
+
REVISION = %q$Revision: 2e2b035d3721 $
|
60
60
|
|
61
61
|
# Common paths for ldap.conf
|
62
62
|
COMMON_LDAP_CONF_PATHS = %w[
|
@@ -250,7 +250,7 @@ module Treequel
|
|
250
250
|
### @return [Hash] The hash of configuration values read from the file, in a form suitable for
|
251
251
|
### passing to {Treequel::Directory#initialize}.
|
252
252
|
def self::read_opts_from_config( configfile )
|
253
|
-
Treequel.log.
|
253
|
+
Treequel.log.info "Reading config options from %s..." % [ configfile ]
|
254
254
|
opts = {}
|
255
255
|
|
256
256
|
linecount = 0
|
@@ -292,7 +292,7 @@ module Treequel
|
|
292
292
|
opts[:port] = $1.to_i
|
293
293
|
|
294
294
|
# SSL <on|off|start_tls>
|
295
|
-
when /^\s*SSL\s+(
|
295
|
+
when /^\s*SSL\s+(\S+)/i
|
296
296
|
mode = $1.downcase
|
297
297
|
case mode
|
298
298
|
when 'on'
|
data/rake/documentation.rb
CHANGED
@@ -44,6 +44,7 @@ begin
|
|
44
44
|
end
|
45
45
|
|
46
46
|
class YARD::CLI::Base; include YardGlobals; end
|
47
|
+
class YARD::CLI::Command; include YardGlobals; end
|
47
48
|
class YARD::Parser::SourceParser; extend YardGlobals; include YardGlobals; end
|
48
49
|
class YARD::Parser::CParser; include YardGlobals; end
|
49
50
|
class YARD::CodeObjects::Base; include YardGlobals; end
|
@@ -53,6 +54,32 @@ begin
|
|
53
54
|
class YARD::RegistryStore; include YardGlobals; end
|
54
55
|
class YARD::Docstring; include YardGlobals; end
|
55
56
|
module YARD::Templates::Helpers::ModuleHelper; include YardGlobals; end
|
57
|
+
module YARD::Tags::RefTaglist; include YardGlobals; end
|
58
|
+
|
59
|
+
if vvec(RUBY_VERSION) >= vvec("1.9.1")
|
60
|
+
# Monkeypatched to allow more than two '#' characters at the beginning
|
61
|
+
# of the comment line.
|
62
|
+
# Patched from yard-0.5.8
|
63
|
+
require 'yard/parser/ruby/ruby_parser'
|
64
|
+
class YARD::Parser::Ruby::RipperParser < Ripper
|
65
|
+
def on_comment(comment)
|
66
|
+
$stderr.puts "Adding comment: %p" % [ comment ]
|
67
|
+
visit_ns_token(:comment, comment)
|
68
|
+
|
69
|
+
comment = comment.gsub(/^\#+\s{0,1}/, '').chomp
|
70
|
+
append_comment = @comments[lineno - 1]
|
71
|
+
|
72
|
+
if append_comment && @comments_last_column == column
|
73
|
+
@comments.delete(lineno - 1)
|
74
|
+
comment = append_comment + "\n" + comment
|
75
|
+
end
|
76
|
+
|
77
|
+
@comments[lineno] = comment
|
78
|
+
@comments_last_column = column
|
79
|
+
end
|
80
|
+
end # class YARD::Parser::Ruby::RipperParser
|
81
|
+
end
|
82
|
+
|
56
83
|
# </metamonkeypatch>
|
57
84
|
|
58
85
|
YARD_OPTIONS = [] unless defined?( YARD_OPTIONS )
|
data/rake/hg.rb
CHANGED
@@ -215,13 +215,20 @@ unless defined?( HG_DOTDIR )
|
|
215
215
|
paths = get_repo_paths()
|
216
216
|
if origin_url = paths['default']
|
217
217
|
ask_for_confirmation( "Pull and update from '#{origin_url}'?", false ) do
|
218
|
-
|
218
|
+
Rake::Task['hg:pull_without_confirmation'].invoke
|
219
219
|
end
|
220
220
|
else
|
221
221
|
trace "Skipping pull: No 'default' path."
|
222
222
|
end
|
223
223
|
end
|
224
224
|
|
225
|
+
|
226
|
+
desc "Pull and update without confirmation"
|
227
|
+
task :pull_without_confirmation do
|
228
|
+
run 'hg', 'pull', '-u'
|
229
|
+
end
|
230
|
+
|
231
|
+
|
225
232
|
desc "Check the current code in if tests pass"
|
226
233
|
task :checkin => ['hg:pull', 'hg:newfiles', 'test', COMMIT_MSG_FILE] do
|
227
234
|
targets = get_target_args()
|
@@ -242,13 +249,18 @@ unless defined?( HG_DOTDIR )
|
|
242
249
|
paths = get_repo_paths()
|
243
250
|
if origin_url = paths['default']
|
244
251
|
ask_for_confirmation( "Push to '#{origin_url}'?", false ) do
|
245
|
-
|
252
|
+
Rake::Task['hg:push_without_confirmation'].invoke
|
246
253
|
end
|
247
254
|
else
|
248
255
|
trace "Skipping push: No 'default' path."
|
249
256
|
end
|
250
257
|
end
|
251
258
|
|
259
|
+
desc "Push to the default repo without confirmation"
|
260
|
+
task :push_without_confirmation do
|
261
|
+
run 'hg', 'push'
|
262
|
+
end
|
263
|
+
|
252
264
|
end
|
253
265
|
|
254
266
|
if HG_DOTDIR.exist?
|
data/rake/manual.rb
CHANGED
@@ -269,7 +269,7 @@ module Manual
|
|
269
269
|
|
270
270
|
### Create a new PageCatalog that will load Manual::Page objects for .page files
|
271
271
|
### in the specified +sourcedir+.
|
272
|
-
def initialize( sourcedir, layoutsdir )
|
272
|
+
def initialize( sourcedir, layoutsdir )
|
273
273
|
@sourcedir = sourcedir
|
274
274
|
@layoutsdir = layoutsdir
|
275
275
|
|
data/spec/lib/constants.rb
CHANGED
@@ -21,32 +21,34 @@ module Treequel::TestConstants # :nodoc:all
|
|
21
21
|
|
22
22
|
TEST_DSE = [{
|
23
23
|
"supportedSASLMechanisms" => [
|
24
|
-
"SRP", "SRP", "SRP", "PLAIN", "PLAIN",
|
25
|
-
"PLAIN", "OTP", "OTP", "OTP", "NTLM", "NTLM", "NTLM", "LOGIN",
|
26
|
-
"LOGIN", "LOGIN", "GSSAPI", "GSSAPI", "GSSAPI", "DIGEST-MD5",
|
24
|
+
"SRP", "SRP", "SRP", "PLAIN", "PLAIN",
|
25
|
+
"PLAIN", "OTP", "OTP", "OTP", "NTLM", "NTLM", "NTLM", "LOGIN",
|
26
|
+
"LOGIN", "LOGIN", "GSSAPI", "GSSAPI", "GSSAPI", "DIGEST-MD5",
|
27
27
|
"DIGEST-MD5", "DIGEST-MD5", "CRAM-MD5", "CRAM-MD5", "CRAM-MD5"
|
28
28
|
],
|
29
29
|
"supportedFeatures" => [
|
30
30
|
"1.3.6.1.1.14", "1.3.6.1.4.1.4203.1.5.1", "1.3.6.1.4.1.4203.1.5.2",
|
31
|
-
"1.3.6.1.4.1.4203.1.5.3", "1.3.6.1.4.1.4203.1.5.4",
|
31
|
+
"1.3.6.1.4.1.4203.1.5.3", "1.3.6.1.4.1.4203.1.5.4",
|
32
32
|
"1.3.6.1.4.1.4203.1.5.5"
|
33
33
|
],
|
34
34
|
"namingContexts" => [TEST_BASE_DN],
|
35
35
|
"supportedLDAPVersion" => ["3"],
|
36
36
|
"subschemaSubentry" => ["cn=Subschema"],
|
37
37
|
"supportedControl" => [
|
38
|
-
"1.3.6.1.4.1.4203.1.9.1.1", "2.16.840.1.113730.3.4.18",
|
38
|
+
"1.3.6.1.4.1.4203.1.9.1.1", "2.16.840.1.113730.3.4.18",
|
39
39
|
"2.16.840.1.113730.3.4.2", "1.3.6.1.4.1.4203.1.10.1",
|
40
|
-
"1.2.840.113556.1.4.319", "1.2.826.0.1.334810.2.3",
|
40
|
+
"1.2.840.113556.1.4.319", "1.2.826.0.1.334810.2.3",
|
41
41
|
"1.2.826.0.1.3344810.2.3", "1.3.6.1.1.13.2",
|
42
42
|
"1.3.6.1.1.13.1", "1.3.6.1.1.12"
|
43
43
|
],
|
44
44
|
"supportedExtension" => [
|
45
|
-
"1.3.6.1.4.1.1466.20037", "1.3.6.1.4.1.4203.1.11.1",
|
45
|
+
"1.3.6.1.4.1.1466.20037", "1.3.6.1.4.1.4203.1.11.1",
|
46
46
|
"1.3.6.1.4.1.4203.1.11.3"
|
47
47
|
],
|
48
48
|
"dn"=>[""]
|
49
49
|
}]
|
50
|
+
TEST_DSE.first.keys.each {|key| TEST_DSE.first[key].freeze }
|
51
|
+
|
50
52
|
|
51
53
|
TEST_HOSTS_DN_ATTR = 'ou'
|
52
54
|
TEST_HOSTS_DN_VALUE = 'Hosts'
|