active_directory 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.1
1
+ 1.4.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{active_directory}
8
- s.version = "1.3.1"
8
+ s.version = "1.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Adam T Kerr"]
12
- s.date = %q{2011-02-28}
12
+ s.date = %q{2011-03-02}
13
13
  s.description = %q{ActiveDirectory uses Net::LDAP to provide a means of accessing and modifying an Active Directory data store. This is a fork of the activedirectory gem.}
14
14
  s.email = %q{ajrkerr@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -32,6 +32,9 @@ module ActiveDirectory
32
32
  NIL_FILTER = Net::LDAP::Filter.pres('cn')
33
33
 
34
34
  @@ldap = nil
35
+ @@ldap_connected = false
36
+ @@caching = false
37
+ @@cache = {}
35
38
 
36
39
  #
37
40
  # Configures the connection for the Ruby/ActiveDirectory library.
@@ -88,12 +91,39 @@ module ActiveDirectory
88
91
  # This method will try to connect, if we haven't already
89
92
  def self.connected?
90
93
  begin
91
- @@ldap.nil? ? false : @@ldap.bind
94
+ @@ldap_connected ||= @@ldap.bind unless @@ldap.nil?
95
+ @@ldap_connected
92
96
  rescue Net::LDAP::LdapError => e
93
97
  false
94
98
  end
95
99
  end
96
100
 
101
+ ##
102
+ # Check to see if result caching is enabled
103
+ def self.cache?
104
+ @@caching
105
+ end
106
+
107
+ ##
108
+ # Clears the cache
109
+ def self.clear_cache
110
+ @@cache = {}
111
+ end
112
+
113
+ ##
114
+ # Enable caching for queries against the DN only
115
+ # This is to prevent membership lookups from hitting the
116
+ # AD unnecessarilly
117
+ def self.enable_cache
118
+ @@caching = true
119
+ end
120
+
121
+ ##
122
+ # Disable caching
123
+ def self.disable_cache
124
+ @@caching = false
125
+ end
126
+
97
127
  def self.filter # :nodoc:
98
128
  NIL_FILTER
99
129
  end
@@ -208,7 +238,9 @@ module ActiveDirectory
208
238
  :in => ''
209
239
  }
210
240
 
211
- #
241
+ cached_results = find_cached_results(args[1])
242
+ return cached_results unless cached_results.nil?
243
+
212
244
  options[:in] = [ options[:in].to_s, @@settings[:base] ].delete_if { |part| part.empty? }.join(",")
213
245
 
214
246
  if options[:filter].is_a? Hash
@@ -216,7 +248,7 @@ module ActiveDirectory
216
248
  end
217
249
 
218
250
  options[:filter] = options[:filter] & filter unless self.filter == NIL_FILTER
219
-
251
+
220
252
  if (args.first == :all)
221
253
  find_all(options)
222
254
  elsif (args.first == :first)
@@ -226,17 +258,54 @@ module ActiveDirectory
226
258
  end
227
259
  end
228
260
 
261
+ ##
262
+ # Filters the cache result by the object type we're looking for
263
+ #
264
+ def self.filter_cache_result(result)
265
+ result.delete_if { |entry| !entry.kind_of? self }
266
+ end
267
+
268
+ ##
269
+ # Searches the cache and returns the result
270
+ #
271
+ def self.find_cached_results(filters)
272
+ return nil unless cache?
273
+
274
+ #Check to see if we're only looking for :distinguishedname
275
+ if filters.is_a? Hash and filters.keys == [:distinguishedname]
276
+ #Find keys we're looking up, convert to array
277
+ dns = filters[:distinguishedname]
278
+
279
+ if dns.kind_of? Array
280
+ #Check to see if all of the results are in teh cache
281
+ return nil unless (dns & @@cache.keys == dns)
282
+
283
+ result = []
284
+
285
+ dns.each { |dn| result << @@cache[dn] }
286
+
287
+ return filter_cache_result(result) if result.size == dns.size
288
+ else
289
+ return @@cache[dns] if @@cache.key? dns and @@cache[dns].is_a? self.class
290
+ end
291
+ end
292
+ end
293
+
229
294
  def self.find_all(options)
230
295
  results = []
231
296
  @@ldap.search(:filter => options[:filter], :base => options[:in], :return_result => false) do |entry|
232
- results << new(entry)
297
+ ad_entry = new(entry)
298
+ @@cache[ad_entry.dn] = ad_entry
299
+ results << ad_entry
233
300
  end
234
301
  results
235
302
  end
236
303
 
237
304
  def self.find_first(options)
238
305
  @@ldap.search(:filter => options[:filter], :base => options[:in], :return_result => false) do |entry|
239
- return new(entry)
306
+ ad_entry = new(entry)
307
+ @@cache[ad_entry.dn] = ad_entry
308
+ return ad_entry
240
309
  end
241
310
  end
242
311
 
@@ -32,8 +32,11 @@ module ActiveDirectory
32
32
  # Decodes a list of DNs into the objects that they are
33
33
  #
34
34
  def self.decode(dn_array)
35
- # How to do user or group?
36
- User.find( :all, :distinguishedname => dn_array) + Group.find(:all, :distinguishedname => dn_array)
35
+ # Ensures that the objects are cast correctly
36
+ users = [User.find( :all, :distinguishedname => dn_array)].flatten
37
+ groups = [Group.find(:all, :distinguishedname => dn_array)].flatten
38
+
39
+ users + groups
37
40
  end
38
41
  end
39
42
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_directory
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 3
9
- - 1
10
- version: 1.3.1
8
+ - 4
9
+ - 0
10
+ version: 1.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Adam T Kerr
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-28 00:00:00 -05:00
18
+ date: 2011-03-02 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency