geoff at ijane.com
geoff at ijane.com
Fri Jun 16 11:19:33 EST 2000
Sorry. I didn't realize that attachment didn't work. Here is the module (usertrack.py): """This module is a shameless rewrite of mod_usertrack in python. It should operate in most respects like mod_usertrack. The exception would be that it always sets a 4 digit year for an expire date. Logging This will be handled by mod_log_config, the custom log module. The cookie will be available by using the token, "%{session_cookie}n". For example: LogFormat "%t \"%r\" %>s \"%{session_cookie}n\"" session CustomLog /usr/local/apache/logs/session_log session PythonOptions There are three options that can be configured: CookieExpires, CookieName and CookieTracking. These basically work the same as mod_usertrack's directives of the same name. CookieExpires This option sets an expiration time for the cookie generated by this module. This time can be either a number of seconds or a string describing the amount of time. If this option does not exist the cookie will expire when the browser's session does. The time string must be quoted and is in the format of a space separeated list of "number label" pairs. Valid labels are: years, months, weeks, days, hours, minutes, seconds. CookieName If this option exists the default name of the cookie will be whatever the label specifies. CookieTracking This option is required if you will to use this module. It's value must be "on" for this module to operate. httpd.conf example: <Directory /> PythonPath "['/usr/lib/python1.5', '/usr/lib/python1.5/site-packages']" PythonDebug PythonOption CookieName k3WL_c00KI3_nAM3 PythonOption CookieTracking on PythonOption CookieExpires "10 years 4 months 2 weeks 3 days 2 hours 36 seconds" PythonFixupHandler usertrack </Directory> """ __version__ = "$Id: usertrack.py,v 1.1 2000/06/02 09:00:31 geoff Exp $" from mod_python import apache import re, string, time, os isDigit = re.compile("^\d+$") isSpace = re.compile("\s+") FACTOR = { 'years': 60 * 60 * 24 * 365, 'months': 60 * 60 * 24 * 30, 'weeks': 60 * 60 * 24 * 7, 'days': 60 * 60 * 24, 'hours': 60 * 60, 'minutes': 60, 'seconds': 1, } COOKIE_NAME = "Apache_Python" def fixuphandler(r): global COOKIE_NAME opt = r.get_options() if opt['CookieTracking'] != 'on': return apache.DECLINED else: if opt.has_key('CookieName'): COOKIE_NAME = opt['CookieName'] try: m = re.search("(?:^|\s+)%s=(?P<cookieValue>[^;]+)" % COOKIE_NAME, \ r.headers_in['Cookie']) r.notes['session_cookie'] = m.group('cookieValue') return apache.DECLINED except: expires = 0 if opt.has_key('CookieExpires'): expires = r.request_time + \ parseExpire(opt['CookieExpires']) make_cookie(r, COOKIE_NAME, expires) return apache.OK def make_cookie(r, name, expires): """Set a unique cookie for user tracking.""" cookieValue = "%s.%d%ld%ld" % (r.hostname, os.getpid(), r.request_time, \ time.clock()) if expires == 0: r.headers_out['Set-Cookie'] = "%s=%s; path=/" % (name, \ cookieValue) else: r.headers_out['Set-Cookie'] = "%s=%s; path=/; expires=%s GMT" % \ (name, cookieValue, time.strftime("%A, %d-%b-%Y %H:%M:%S", \ time.gmtime(expires))) r.notes['session_cookie'] = cookieValue return def parseExpire(expire): """Return number of seconds from a formated string.""" if isDigit.search(expire): return expire seconds = 0 t = isSpace.split(expire) tLen = len(t) i = 0 while i < tLen: if isDigit.search(t[i]): seconds = seconds + (FACTOR.get(string.lower(t[i + 1]), 0) * \ string.atoi(t[i])) i = i + 2 return seconds
|