def external_cookie(request, **kw):
""" authenticate via external cookie """
import md5
import Cookie
user = None
try_next = True # if True, moin tries the next auth method
cookiename = "moinmoin" # XXX external cookie name you want to use
my_salt = settings.WIKI_USER_SALT # define a salt for your cookie
try:
cookie = Cookie.SimpleCookie(request.saved_cookie)
except Cookie.CookieError:
# ignore invalid cookies
cookie = None
if cookie and cookie.has_key(cookiename):
import urllib
cookievalue = cookie[cookiename].value
# XXX now we decode and parse the cookie value - edit this to fit your needs.
# the minimum we need to get is auth_username. aliasname and email is optional.
cookievalue = urllib.unquote(cookievalue) # cookie value is urlencoded, decode it
#cookievalue = cookievalue.decode('iso-8859-1') # decode cookie charset to unicode
cookievalue = cookievalue.split('#') # cookie has format loginname#hash#firstname#lastname#email
auth_username = cookievalue[0] # having this cookie means user auth has already been done!
auth_hash = cookievalue[1] # this is our digest!
#aliasname = email = ''
try:
aliasname = "%s %s" % (cookievalue[2], cookievalue[3]) # aliasname is for cosmetical stuff only
#email = cookievalue[4]
except IndexError: # XXX this is for debugging it, in case it does not work
if 0:
f = open("cookie.log", "w")
f.write(repr(cookie))
f.write(repr(cookievalue))
f.close()
pass
# we just authenticate the user, if the hash is valid
if auth_hash == md5.new(auth_username + my_salt).hexdigest():
from MoinMoin.user import User
# giving auth_username to User constructor means that authentication has already been done.
user = User(request, name=auth_username, auth_username=auth_username)
changed = False
#if aliasname != user.aliasname: # was the aliasname externally updated?
#user.aliasname = aliasname ; changed = True # yes -> update user profile
#if email != user.email: # was the email addr externally updated?
#user.email = email ; changed = True # yes -> update user profile
if user:
user.create_or_update(changed)
if user and user.valid: # did we succeed making up a valid user?
try_next = False # stop processing auth method list
return user, try_next
from MoinMoin.auth import moin_cookie, http
# first try the external_cookie, then http basic auth, then the usual moin_cookie
auth = [external_cookie,]