| Class | ActiveLdap::Adapter::Ldap |
| In: |
lib/active_ldap/adapter/ldap.rb
|
| Parent: | Base |
# File lib/active_ldap/adapter/ldap.rb, line 125
125: def add(dn, entries, options={})
126: super do |_dn, _entries|
127: controls = options[:controls]
128: attributes = parse_entries(_entries)
129: info = {:dn => _dn, :attributes => _entries}
130: if controls
131: info.merge!(:name => :add, :controls => controls)
132: execute(:add_ext, info, _dn, attributes, controls, [])
133: else
134: execute(:add, info, _dn, attributes)
135: end
136: end
137: end
# File lib/active_ldap/adapter/ldap.rb, line 69
69: def bind(options={})
70: super do
71: @connection.error_message
72: end
73: end
# File lib/active_ldap/adapter/ldap.rb, line 75
75: def bind_as_anonymous(options={})
76: super do
77: execute(:bind, :name => "bind: anonymous")
78: true
79: end
80: end
# File lib/active_ldap/adapter/ldap.rb, line 53
53: def connect(options={})
54: super do |host, port, method|
55: uri = construct_uri(host, port, method.ssl?)
56: with_start_tls = method.start_tls?
57: info = {:uri => uri, :with_start_tls => with_start_tls}
58: [log("connect", info) {method.connect(host, port)},
59: uri, with_start_tls]
60: end
61: end
# File lib/active_ldap/adapter/ldap.rb, line 111
111: def delete(targets, options={})
112: super do |target|
113: controls = options[:controls]
114: info = {:dn => target}
115: if controls
116: info.merge!(:name => :delete, :controls => controls)
117: execute(:delete_ext, info,
118: target, controls, [])
119: else
120: execute(:delete, info, target)
121: end
122: end
123: end
# File lib/active_ldap/adapter/ldap.rb, line 139
139: def modify(dn, entries, options={})
140: super do |_dn, _entries|
141: controls = options[:controls]
142: attributes = parse_entries(_entries)
143: info = {:dn => _dn, :attributes => _entries}
144: if controls
145: info.merge!(:name => :modify, :controls => controls)
146: execute(:modify_ext, info, _dn, attributes, controls, [])
147: else
148: execute(:modify, info, _dn, attributes)
149: end
150: end
151: end
# File lib/active_ldap/adapter/ldap.rb, line 153
153: def modify_rdn(dn, new_rdn, delete_old_rdn, new_superior, options={})
154: super do |_dn, _new_rdn, _delete_old_rdn, _new_superior|
155: if _new_superior
156: raise NotImplemented.new(_("modify RDN with new superior"))
157: end
158: info = {
159: :name => "modify: RDN",
160: :dn => _dn,
161: :new_rdn => _new_rdn,
162: :new_superior => _new_superior,
163: :delete_old_rdn => _delete_old_rdn
164: }
165: execute(:modrdn, info, _dn, _new_rdn, _delete_old_rdn)
166: end
167: end
# File lib/active_ldap/adapter/ldap.rb, line 82
82: def search(options={})
83: super(options) do |base, scope, filter, attrs, limit|
84: begin
85: info = {
86: :base => base, :scope => scope_name(scope),
87: :filter => filter, :attributes => attrs, :limit => limit,
88: }
89: execute(:search_with_limit,
90: info, base, scope, filter, attrs, limit) do |entry|
91: attributes = {}
92: entry.attrs.each do |attr|
93: value = entry.vals(attr)
94: attributes[attr] = value if value
95: end
96: yield([entry.dn, attributes])
97: end
98: rescue RuntimeError
99: if $!.message == "no result returned by search"
100: @logger.debug do
101: args = [filter, attrs.inspect]
102: _("No matches: filter: %s: attributes: %s") % args
103: end
104: else
105: raise
106: end
107: end
108: end
109: end
# File lib/active_ldap/adapter/ldap.rb, line 63
63: def unbind(options={})
64: super do
65: execute(:unbind)
66: end
67: end
# File lib/active_ldap/adapter/ldap.rb, line 186
186: def do_in_timeout(timeout, &block)
187: Timeout.timeout(timeout, &block)
188: end
# File lib/active_ldap/adapter/ldap.rb, line 190
190: def ensure_method(method)
191: normalized_method = method.to_s.downcase
192: Method.constants.each do |name|
193: if normalized_method == name.to_s.downcase
194: return Method.const_get(name).new
195: end
196: end
197:
198: available_methods = Method.constants.collect do |name|
199: name.downcase.to_sym.inspect
200: end.join(", ")
201: format = _("%s is not one of the available connect methods: %s")
202: raise ConfigurationError, format % [method.inspect, available_methods]
203: end
# File lib/active_ldap/adapter/ldap.rb, line 280
280: def ensure_mod_type(type)
281: case type
282: when :replace, :add, :delete
283: LDAP.const_get("LDAP_MOD_#{type.to_s.upcase}")
284: else
285: raise ArgumentError, _("unknown type: %s") % type
286: end
287: end
# File lib/active_ldap/adapter/ldap.rb, line 205
205: def ensure_scope(scope)
206: scope_map = {
207: :base => LDAP::LDAP_SCOPE_BASE,
208: :sub => LDAP::LDAP_SCOPE_SUBTREE,
209: :one => LDAP::LDAP_SCOPE_ONELEVEL,
210: }
211: value = scope_map[scope || :sub]
212: if value.nil?
213: available_scopes = scope_map.keys.inspect
214: format = _("%s is not one of the available LDAP scope: %s")
215: raise ArgumentError, format % [scope.inspect, available_scopes]
216: end
217: value
218: end
# File lib/active_ldap/adapter/ldap.rb, line 176
176: def execute(method, info=nil, *args, &block)
177: begin
178: name = (info || {}).delete(:name) || method
179: log(name, info) {@connection.send(method, *args, &block)}
180: rescue LDAP::ResultError
181: @connection.assert_error_code
182: raise $!.message
183: end
184: end
# File lib/active_ldap/adapter/ldap.rb, line 263
263: def parse_entries(entries)
264: result = []
265: entries.each do |type, key, attributes|
266: mod_type = ensure_mod_type(type)
267: binary = schema.attribute(key).binary?
268: mod_type |= LDAP::LDAP_MOD_BVALUES if binary
269: attributes.each do |name, values|
270: additional_mod_type = 0
271: if values.any? {|value| Ldif::Attribute.binary_value?(value)}
272: additional_mod_type |= LDAP::LDAP_MOD_BVALUES
273: end
274: result << LDAP.mod(mod_type | additional_mod_type, name, values)
275: end
276: end
277: result
278: end
# File lib/active_ldap/adapter/ldap.rb, line 170
170: def prepare_connection(options={})
171: operation(options) do
172: @connection.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
173: end
174: end
# File lib/active_ldap/adapter/ldap.rb, line 228
228: def sasl_bind(bind_dn, options={})
229: super do |_bind_dn, mechanism, quiet|
230: begin
231: _bind_dn ||= ''
232: sasl_quiet = @connection.sasl_quiet
233: @connection.sasl_quiet = quiet unless quiet.nil?
234: args = [_bind_dn, mechanism]
235: credential = nil
236: if need_credential_sasl_mechanism?(mechanism)
237: credential = password(_bind_dn, options)
238: end
239: if @sasl_options
240: credential ||= ""
241: args.concat([credential, nil, nil, @sasl_options])
242: else
243: args << credential if credential
244: end
245: info = {
246: :name => "bind: SASL", :dn => _bind_dn, :mechanism => mechanism
247: }
248: execute(:sasl_bind, info, *args)
249: true
250: ensure
251: @connection.sasl_quiet = sasl_quiet
252: end
253: end
254: end
# File lib/active_ldap/adapter/ldap.rb, line 220
220: def scope_name(scope)
221: {
222: LDAP::LDAP_SCOPE_BASE => :base,
223: LDAP::LDAP_SCOPE_SUBTREE => :sub,
224: LDAP::LDAP_SCOPE_ONELEVEL => :one,
225: }[scope]
226: end