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
77
78
|
# 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
_attr = nil
_prefix = nil
if attr.nil? or attr == dn_attribute
_attr, value, _prefix = split_search_value(value)
end
attr ||= _attr || ensure_search_attribute
prefix ||= _prefix
filter ||= [attr, value]
filter = [:and, filter, *object_class_filters(classes)]
_base = options[:base] ? [options[:base]] : [prefix, base]
_base = prepare_search_base(_base)
if options.has_key?(:ldap_scope)
message = _(":ldap_scope search option is deprecated. " \
"Use :scope instead.")
ActiveSupport::Deprecation.warn(message)
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] || sort_by,
:order => options[:order] || order,
}
options[:connection] ||= connection
values = []
options[:connection].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
values << [dn, attributes]
end
values = values.collect {|_value| yield(_value)} if block_given?
values
end
|