diff plugins/cherrypy/_cpdefaults.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/cherrypy/_cpdefaults.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,207 @@
+"""
+Copyright (c) 2004, CherryPy Team (team@cherrypy.org)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice, 
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice, 
+      this list of conditions and the following disclaimer in the documentation 
+      and/or other materials provided with the distribution.
+    * Neither the name of the CherryPy Team nor the names of its contributors 
+      may be used to endorse or promote products derived from this software 
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+
+"""
+A module containing a few utility classes/functions used by CherryPy
+"""
+
+import time, thread, os, cpg
+import cPickle as pickle
+
+def _cpLogMessage(msg, context = '', severity = 0):
+    """ Default method for logging messages """
+
+    nowTuple = time.localtime(time.time())
+    nowStr = '%04d/%02d/%02d %02d:%02d:%02d' % (nowTuple[:6])
+    if severity == 0:
+        level = "INFO"
+    elif severity == 1:
+        level = "WARNING"
+    elif severity == 2:
+        level = "ERROR"
+    else:
+        lebel = "UNKNOWN"
+    try:
+        logToScreen = int(cpg.configOption.logToScreen)
+    except:
+        logToScreen = True
+    s = nowStr + ' ' + context + ' ' + level + ' ' + msg
+    if logToScreen:
+        print s
+    if cpg.configOption.logFile:
+        f = open(cpg.configOption.logFile, 'ab')
+        f.write(s + '\n')
+        f.close()
+
+def _cpOnError():
+    """ Default _cpOnError method """
+
+    import traceback, StringIO
+    bodyFile = StringIO.StringIO()
+    traceback.print_exc(file = bodyFile)
+    cpg.response.body = [bodyFile.getvalue()]
+    cpg.response.headerMap['Content-Type'] = 'text/plain'
+
+def _cpSaveSessionData(sessionId, sessionData, expirationTime,
+        threadPool = None, sessionStorageType = None,
+        sessionStorageFileDir = None):
+    """ Save session data if needed """
+
+    if threadPool is None:
+        threadPool = cpg.configOption.threadPool
+    if sessionStorageType is None:
+        sessionStorageType =  cpg.configOption.sessionStorageType
+    if sessionStorageFileDir is None:
+        sessionStorageFileDir = cpg.configOption.sessionStorageFileDir
+
+    t = time.localtime(expirationTime)
+    if sessionStorageType == 'file':
+        fname=os.path.join(sessionStorageFileDir,sessionId)
+        if threadPool > 1:
+            cpg._sessionFileLock.acquire()
+        f = open(fname,"wb")
+        pickle.dump((sessionData, expirationTime), f)
+        f.close()
+        if threadPool > 1:
+            cpg._sessionFileLock.release()
+
+    elif sessionStorageType=="ram":
+        # Update expiration time
+        cpg._sessionMap[sessionId] = (sessionData, expirationTime)
+
+    """ TODO: implement cookie storage type
+    elif sessionStorageType == "cookie":
+        
+         TODO: set siteKey in _cpConfig
+            # Get site key from config file or compute it
+            try: cpg._SITE_KEY_ = configFile.get('server','siteKey')
+            except:
+                _SITE_KEY_ = ''
+                for i in range(30):
+                    _SITE_KEY_ += random.choice(string.letters)
+
+        # Update expiration time
+        sessionData = (sessionData, expirationTime)
+        dumpStr = pickle.dumps(_sessionData)
+        try: dumpStr = zlib.compress(dumpStr)
+        except: pass # zlib is not available in all python distros
+        dumpStr = binascii.hexlify(dumpStr) # Need to hexlify it because it will be stored in a cookie
+        cpg.response.simpleCookie['CSession'] = dumpStr
+        cpg.response.simpleCookie['CSession-sig'] = md5.md5(dumpStr + cpg.configOption.siteKey).hexdigest()
+        cpg.response.simpleCookie['CSession']['path'] = '/'
+        cpg.response.simpleCookie['CSession']['max-age'] = sessionTimeout * 60
+        cpg.response.simpleCookie['CSession-sig']['path'] = '/'
+        cpg.response.simpleCookie['CSession-sig']['max-age'] = sessionTimeout * 60
+    """
+
+def _cpLoadSessionData(sessionId, threadPool = None, sessionStorageType = None,
+        sessionStorageFileDir = None):
+    """ Return the session data for a given sessionId.
+        The _expirationTime will be checked by the caller of this function
+    """
+
+    if threadPool is None:
+        threadPool = cpg.configOption.threadPool
+    if sessionStorageType is None:
+        sessionStorageType =  cpg.configOption.sessionStorageType
+    if sessionStorageFileDir is None:
+        sessionStorageFileDir = cpg.configOption.sessionStorageFileDir
+
+    if sessionStorageType == "ram":
+        if cpg._sessionMap.has_key(sessionId):
+            return cpg._sessionMap[sessionId]
+        else: return None
+
+    elif sessionStorageType == "file":
+        fname = os.path.join(sessionStorageFileDir, sessionId)
+        if os.path.exists(fname):
+            if threadPool > 1:
+                cpg._sessionFileLock.acquire()
+            f = open(fname, "rb")
+            sessionData = pickle.load(f)
+            f.close()
+            if threadPool > 1:
+                cpg._sessionFileLock.release()
+            return sessionData
+        else: return None
+
+    """ TODO: implement cookie storage type
+    elif _sessionStorageType == "cookie":
+        if request.simpleCookie.has_key('CSession') and request.simpleCookie.has_key('CSession-sig'):
+            data = request.simpleCookie['CSession'].value
+            sig  = request.simpleCookie['CSession-sig'].value
+            if md5.md5(data + cpg.configOption.siteKey).hexdigest() == sig:
+                try:
+                    dumpStr = binascii.unhexlify(data)
+                    try: dumpStr = zlib.decompress(dumpStr)
+                    except: pass # zlib is not available in all python distros
+                    dumpStr = pickle.loads(dumpStr)
+                    return dumpStr
+                except: pass
+        return None
+    """
+
+def _cpCleanUpOldSessions(threadPool = None, sessionStorageType = None,
+        sessionStorageFileDir = None):
+    """ Clean up old sessions """
+
+    if threadPool is None:
+        threadPool = cpg.configOption.threadPool
+    if sessionStorageType is None:
+        sessionStorageType =  cpg.configOption.sessionStorageType
+    if sessionStorageFileDir is None:
+        sessionStorageFileDir = cpg.configOption.sessionStorageFileDir
+
+    # Clean up old session data
+    now = time.time()
+    if sessionStorageType == "ram":
+        sessionIdToDeleteList = []
+        for sessionId, (dummy, expirationTime) in cpg._sessionMap.items():
+            if expirationTime < now:
+                sessionIdToDeleteList.append(sessionId)
+        for sessionId in sessionIdToDeleteList:
+            del cpg._sessionMap[sessionId]
+
+    elif sessionStorageType=="file":
+        # This process is very expensive because we go through all files, parse them and then delete them if the session is expired
+        # One optimization would be to just store a list of (sessionId, expirationTime) in *one* file
+        sessionFileList = os.listdir(sessionStorageFileDir)
+        for sessionId in sessionFileList:
+            try:
+                dummy, expirationTime = _cpLoadSessionData(sessionId)
+                if expirationTime < now:
+                    os.remove(os.path.join(sessionStorageFileDir, sessionId))
+            except:
+                pass
+
+    elif sessionStorageType == "cookie":
+        # Nothing to do in this case: the session data is stored on the client
+        pass
+
+_cpFilterList = []