| Class | ActiveLdap::Schema |
| In: |
lib/active_ldap/schema/syntaxes.rb
lib/active_ldap/schema.rb |
| Parent: | Object |
| NUMERIC_OID_RE | = | "\\d[\\d\\.]+" |
| DESCRIPTION_RE | = | "[a-zA-Z][a-zA-Z\\d\\-]*" |
| OID_RE | = | "(?:#{NUMERIC_OID_RE}|#{DESCRIPTION_RE}-oid)" |
| RESERVED_NAMES_RE | = | /(?:#{reserved_names.join('|')})/ |
# File lib/active_ldap/schema.rb, line 3 3: def initialize(entries) 4: @entries = default_entries.merge(entries || {}) 5: @schema_info = {} 6: @class_attributes_info = {} 7: @cache = {} 8: end
# File lib/active_ldap/schema.rb, line 86
86: def attribute(name)
87: cache([:attribute, name]) do
88: Attribute.new(name, self)
89: end
90: end
# File lib/active_ldap/schema.rb, line 100
100: def attribute_type(name, attribute_name)
101: cache([:attribute_type, name, attribute_name]) do
102: fetch("attributeTypes", name, attribute_name)
103: end
104: end
# File lib/active_ldap/schema.rb, line 92
92: def attributes
93: cache([:attributes]) do
94: names("attributeTypes").collect do |name|
95: attribute(name)
96: end
97: end
98: end
# File lib/active_ldap/schema.rb, line 46
46: def entry(group, id_or_name)
47: return {} if group.empty? or id_or_name.empty?
48:
49: unless @entries.has_key?(group)
50: raise ArgumentError, _("Unknown schema group: %s") % group
51: end
52:
53: # Initialize anything that is required
54: info, ids, aliases = ensure_schema_info(group)
55: id, name = determine_id_or_name(id_or_name, aliases)
56:
57: # Check already parsed options first
58: return ids[id] if ids.has_key?(id)
59:
60: schemata = @entries[group] || []
61: while schema = schemata.shift
62: next unless /\A\s*\(\s*(#{OID_RE})\s*(.*)\s*\)\s*\z/ =~ schema
63: schema_id = $1
64: rest = $2
65:
66: if ids.has_key?(schema_id)
67: attributes = ids[schema_id]
68: else
69: attributes = {}
70: ids[schema_id] = attributes
71: end
72:
73: parse_attributes(rest, attributes)
74: (attributes["NAME"] || []).each do |v|
75: normalized_name = normalize_schema_name(v)
76: aliases[normalized_name] = schema_id
77: id = schema_id if id.nil? and name == normalized_name
78: end
79:
80: break if id == schema_id
81: end
82:
83: ids[id || aliases[name]] || {}
84: end
# File lib/active_ldap/schema.rb, line 20
20: def exist_name?(group, name)
21: alias_map(group).has_key?(normalize_schema_name(name))
22: end
This is just like LDAP::Schema#attribute except that it allows look up in any of the given keys. e.g.
fetch('attributeTypes', 'cn', 'DESC')
fetch('ldapSyntaxes', '1.3.6.1.4.1.1466.115.121.1.5', 'DESC')
# File lib/active_ldap/schema.rb, line 35
35: def fetch(group, id_or_name, attribute_name)
36: return [] if attribute_name.empty?
37: attribute_name = normalize_attribute_name(attribute_name)
38: value = entry(group, id_or_name)[attribute_name]
39: value ? value.dup : []
40: end
# File lib/active_ldap/schema.rb, line 10
10: def ids(group)
11: ensure_parse(group)
12: info, ids, aliases = ensure_schema_info(group)
13: ids.keys
14: end
# File lib/active_ldap/schema.rb, line 126
126: def ldap_syntax(name)
127: cache([:ldap_syntax, name]) do
128: Syntax.new(name, self)
129: end
130: end
# File lib/active_ldap/schema.rb, line 140
140: def ldap_syntax_attribute(name, attribute_name)
141: cache([:ldap_syntax_attribute, name, attribute_name]) do
142: fetch("ldapSyntaxes", name, attribute_name)
143: end
144: end
# File lib/active_ldap/schema.rb, line 132
132: def ldap_syntaxes
133: cache([:ldap_syntaxes]) do
134: ids("ldapSyntaxes").collect do |id|
135: ldap_syntax(id)
136: end
137: end
138: end
# File lib/active_ldap/schema.rb, line 106
106: def object_class(name)
107: cache([:object_class, name]) do
108: ObjectClass.new(name, self)
109: end
110: end
# File lib/active_ldap/schema.rb, line 120
120: def object_class_attribute(name, attribute_name)
121: cache([:object_class_attribute, name, attribute_name]) do
122: fetch("objectClasses", name, attribute_name)
123: end
124: end
# File lib/active_ldap/schema.rb, line 112
112: def object_classes
113: cache([:object_classes]) do
114: names("objectClasses").collect do |name|
115: object_class(name)
116: end
117: end
118: end
# File lib/active_ldap/schema.rb, line 24
24: def resolve_name(group, name)
25: alias_map(group)[normalize_schema_name(name)]
26: end
# File lib/active_ldap/schema.rb, line 219
219: def alias_map(group)
220: ensure_parse(group)
221: return {} if @schema_info[group].nil?
222: @schema_info[group][:aliases] || {}
223: end
# File lib/active_ldap/schema.rb, line 147
147: def cache(key)
148: (@cache[key] ||= [yield])[0]
149: end
# File lib/active_ldap/schema.rb, line 240
240: def default_entries
241: {
242: "objectClasses" => [],
243: "attributeTypes" => [],
244: "ldapSyntaxes" => [],
245: }
246: end
# File lib/active_ldap/schema.rb, line 157
157: def determine_id_or_name(id_or_name, aliases)
158: if /\A[\d\.]+\z/ =~ id_or_name
159: id = id_or_name
160: name = nil
161: else
162: name = normalize_schema_name(id_or_name)
163: id = aliases[name]
164: end
165: [id, name]
166: end
# File lib/active_ldap/schema.rb, line 225
225: def ensure_parse(group)
226: return if @entries[group].nil?
227: unless @entries[group].empty?
228: fetch(group, 'nonexistent', 'nonexistent')
229: end
230: end
# File lib/active_ldap/schema.rb, line 151
151: def ensure_schema_info(group)
152: @schema_info[group] ||= {:ids => {}, :aliases => {}}
153: info = @schema_info[group]
154: [info, info[:ids], info[:aliases]]
155: end
# File lib/active_ldap/schema.rb, line 236
236: def normalize_attribute_name(name)
237: name.upcase.gsub(/_/, "-")
238: end
# File lib/active_ldap/schema.rb, line 232
232: def normalize_schema_name(name)
233: name.downcase.sub(/;.*$/, '')
234: end
# File lib/active_ldap/schema.rb, line 190
190: def parse_attributes(str, attributes)
191: str.scan(/([A-Z\-_]+)\s+
192: (?:\(\s*([\w\-]+(?:\s+\$\s+[\w\-]+)+)\s*\)|
193: \(\s*([^\)]*)\s*\)|
194: '([^\']*)'|
195: ((?!#{RESERVED_NAMES_RE})[a-zA-Z][a-zA-Z\d\-;]*)|
196: (\d[\d\.\{\}]+)|
197: ()
198: )/x
199: ) do |name, multi_amp, multi, string, literal, syntax, no_value|
200: case
201: when multi_amp
202: values = multi_amp.rstrip.split(/\s*\$\s*/)
203: when multi
204: values = multi.scan(/\s*'([^\']*)'\s*/).collect {|value| value[0]}
205: when string
206: values = [string]
207: when literal
208: values = [literal]
209: when syntax
210: values = [syntax]
211: when no_value
212: values = ["TRUE"]
213: end
214: attributes[normalize_attribute_name(name)] ||= []
215: attributes[normalize_attribute_name(name)].concat(values)
216: end
217: end