summaryrefslogtreecommitdiffstats
path: root/lib/puppet/indirector/indirection.rb
diff options
context:
space:
mode:
authorMarkus Roberts <Markus@reality.com>2009-12-16 16:26:05 -0800
committerJames Turnbull <james@lovedthanlost.net>2009-12-19 00:38:14 +1100
commit0dc2dbafe65b59bfbb3ab66e26f595260bdde356 (patch)
tree0747398fbfd6bf2da8bee74dc444845b11a18063 /lib/puppet/indirector/indirection.rb
parent03f37acaeb4c90d0256059fdc96f717077240811 (diff)
downloadpuppet-0dc2dbafe65b59bfbb3ab66e26f595260bdde356.tar.gz
puppet-0dc2dbafe65b59bfbb3ab66e26f595260bdde356.tar.xz
puppet-0dc2dbafe65b59bfbb3ab66e26f595260bdde356.zip
Fix for #2890 (the cached certificates that would not die)
This patch implements the two-part suggestion from the ticket; 1) a client that receives a certificate that doesn't match its current private key does not accept, store or use the certificate--instead it removes any locally cached copies and acts as if the certificate had never been found. 2) a puppetmaster that receives a csr from a client for whom it already has a signed certificate now honors the request and considers it to supercede any previously signed certificates. In order to make the cache expiration work as expected, I changed a few assumptions in the caching system: * The expiration of a cached certificate is the earlier of the envelope expiration and the certificate's expiration, as opposed to just overriding the cache value * Telling the cache to expire an item now removes it from the cache if possible, rather than just setting an expiration date in the past and hoping that somebody notices. Signed-off-by: Markus Roberts <Markus@reality.com>
Diffstat (limited to 'lib/puppet/indirector/indirection.rb')
-rw-r--r--lib/puppet/indirector/indirection.rb29
1 files changed, 13 insertions, 16 deletions
diff --git a/lib/puppet/indirector/indirection.rb b/lib/puppet/indirector/indirection.rb
index dc7e58f36..d762701f5 100644
--- a/lib/puppet/indirector/indirection.rb
+++ b/lib/puppet/indirector/indirection.rb
@@ -161,22 +161,19 @@ class Puppet::Indirector::Indirection
end
end
- # Expire a cached object, if one is cached. Note that we don't actually
- # remove it, we expire it and write it back out to disk. This way people
- # can still use the expired object if they want.
+ # Expire a cached object, if one is cached. Note that we now actually
+ # remove it if possible, and only mark it as expired if destroy isn't
+ # supported.
def expire(key, *args)
- request = request(:expire, key, *args)
-
- return nil unless cache?
-
- return nil unless instance = cache.find(request(:find, key, *args))
-
- Puppet.info "Expiring the %s cache of %s" % [self.name, instance.name]
-
- # Set an expiration date in the past
- instance.expiration = Time.now - 60
-
- cache.save(request(:save, instance, *args))
+ if cache? and instance = cache.find(request(:find, key, *args))
+ Puppet.info "Expiring the #{name} cache of #{instance.name}"
+ if cache.respond_to? :destroy
+ cache.destroy(request(:destroy, instance, *args))
+ else
+ instance.expiration = Time.now - 1
+ cache.save(request(:save,instance,*args))
+ end
+ end
end
# Search for an instance in the appropriate terminus, caching the
@@ -216,7 +213,7 @@ class Puppet::Indirector::Indirection
return nil
end
- Puppet.debug "Using cached %s for %s" % [self.name, request.key]
+ Puppet.debug "Using cached #{name} for #{request.key}, good until #{cached.expiration}"
return cached
end