27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/active_ldap/operations.rb', line 27
def search(options={}, &block)
validate_search_options(options)
attr = options[:attribute]
value = options[:value] || '*'
filter = options[:filter]
prefix = options[:prefix]
classes = options[:classes]
value = value.first if value.is_a?(Array) and value.first.size == 1
if filter.nil? and !value.is_a?(String)
message = _("Search value must be a String: %s") % value.inspect
raise ArgumentError, message
end
_attr, value, _prefix = split_search_value(value)
attr ||= _attr || dn_attribute || "objectClass"
prefix ||= _prefix
filter ||= [attr, value]
filter = [:and, filter, *object_class_filters(classes)]
_base = [prefix, base].compact.reject{|x| x.empty?}.join(",")
if options.has_key?(:ldap_scope)
logger.warning do
_(":ldap_scope search option is deprecated. Use :scope instead.")
end
options[:scope] ||= options[:ldap_scope]
end
search_options = {
:base => _base,
:scope => options[:scope] || scope,
:filter => filter,
:limit => options[:limit],
:attributes => options[:attributes],
:sort_by => options[:sort_by],
:order => options[:order],
}
conn = options[:connection] || connection
conn.search(search_options) do |dn, attrs|
attributes = {}
attrs.each do |key, value|
normalized_attr, normalized_value =
normalize_attribute_options(key, value)
attributes[normalized_attr] ||= []
attributes[normalized_attr].concat(normalized_value)
end
value = [dn, attributes]
value = yield(value) if block_given?
value
end
end
|