summaryrefslogtreecommitdiffstats
path: root/src/lib/tlslite/SessionCache.py
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2009-05-06 01:26:53 +0000
committerNarayan Desai <desai@mcs.anl.gov>2009-05-06 01:26:53 +0000
commit9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b (patch)
tree768763aa48be1a5a2c8dae7cba81859510f1146e /src/lib/tlslite/SessionCache.py
parent13f6d1554dd24d08d44662906fa9f3f008a23058 (diff)
downloadbcfg2-9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b.tar.gz
bcfg2-9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b.tar.bz2
bcfg2-9590d0bb421cb7fdf7dd04d4b1d0d77e3f06f13b.zip
more to python 2.6 ssl
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5187 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/tlslite/SessionCache.py')
-rwxr-xr-xsrc/lib/tlslite/SessionCache.py103
1 files changed, 0 insertions, 103 deletions
diff --git a/src/lib/tlslite/SessionCache.py b/src/lib/tlslite/SessionCache.py
deleted file mode 100755
index 34cf0b0ec..000000000
--- a/src/lib/tlslite/SessionCache.py
+++ /dev/null
@@ -1,103 +0,0 @@
-"""Class for caching TLS sessions."""
-
-import thread
-import time
-
-class SessionCache:
- """This class is used by the server to cache TLS sessions.
-
- Caching sessions allows the client to use TLS session resumption
- and avoid the expense of a full handshake. To use this class,
- simply pass a SessionCache instance into the server handshake
- function.
-
- This class is thread-safe.
- """
-
- #References to these instances
- #are also held by the caller, who may change the 'resumable'
- #flag, so the SessionCache must return the same instances
- #it was passed in.
-
- def __init__(self, maxEntries=10000, maxAge=14400):
- """Create a new SessionCache.
-
- @type maxEntries: int
- @param maxEntries: The maximum size of the cache. When this
- limit is reached, the oldest sessions will be deleted as
- necessary to make room for new ones. The default is 10000.
-
- @type maxAge: int
- @param maxAge: The number of seconds before a session expires
- from the cache. The default is 14400 (i.e. 4 hours)."""
-
- self.lock = thread.allocate_lock()
-
- # Maps sessionIDs to sessions
- self.entriesDict = {}
-
- #Circular list of (sessionID, timestamp) pairs
- self.entriesList = [(None,None)] * maxEntries
-
- self.firstIndex = 0
- self.lastIndex = 0
- self.maxAge = maxAge
-
- def __getitem__(self, sessionID):
- self.lock.acquire()
- try:
- self._purge() #Delete old items, so we're assured of a new one
- session = self.entriesDict[sessionID]
-
- #When we add sessions they're resumable, but it's possible
- #for the session to be invalidated later on (if a fatal alert
- #is returned), so we have to check for resumability before
- #returning the session.
-
- if session.valid():
- return session
- else:
- raise KeyError()
- finally:
- self.lock.release()
-
-
- def __setitem__(self, sessionID, session):
- self.lock.acquire()
- try:
- #Add the new element
- self.entriesDict[sessionID] = session
- self.entriesList[self.lastIndex] = (sessionID, time.time())
- self.lastIndex = (self.lastIndex+1) % len(self.entriesList)
-
- #If the cache is full, we delete the oldest element to make an
- #empty space
- if self.lastIndex == self.firstIndex:
- del(self.entriesDict[self.entriesList[self.firstIndex][0]])
- self.firstIndex = (self.firstIndex+1) % len(self.entriesList)
- finally:
- self.lock.release()
-
- #Delete expired items
- def _purge(self):
- currentTime = time.time()
-
- #Search through the circular list, deleting expired elements until
- #we reach a non-expired element. Since elements in list are
- #ordered in time, we can break once we reach the first non-expired
- #element
- index = self.firstIndex
- while index != self.lastIndex:
- if currentTime - self.entriesList[index][1] > self.maxAge:
- del(self.entriesDict[self.entriesList[index][0]])
- index = (index+1) % len(self.entriesList)
- else:
- break
- self.firstIndex = index
-
-def _test():
- import doctest, SessionCache
- return doctest.testmod(SessionCache)
-
-if __name__ == "__main__":
- _test()