httpauth.py, cmd-cgi.py, list.fhtml: Implement explicit logout action.
[chopwood] / httpauth.py
index e29686c..13ba0d1 100644 (file)
@@ -175,6 +175,7 @@ LOGIN_REASONS = {
   'EXPIRED': 'session timed out',
   'BADTAG': 'incorrect tag',
   'NOUSER': 'unknown user name',
+  'LOGOUT': 'explicitly logged out',
   None: None
 }
 
@@ -201,6 +202,9 @@ def check_auth(token, nonce = None):
 
   global NONCE
 
+  ## If the token has been explicitly clobbered, then we're logged out.
+  if token == 'logged-out': raise AuthenticationFailed, 'LOGOUT'
+
   ## Parse the token.
   bits = token.split('.', 3)
   if len(bits) != 4: raise AuthenticationFailed, 'BADTOKEN'
@@ -227,6 +231,16 @@ def check_auth(token, nonce = None):
   ## Done.
   return user
 
+def bake_cookie(value):
+  """
+  Return a properly baked authentication-token cookie with the given VALUE.
+  """
+  return CGI.cookie('chpwd-token', value,
+                    httponly = True,
+                    secure = CGI.SSLP,
+                    path = CFG.SCRIPT_NAME,
+                    max_age = (CFG.SECRETLIFE - CFG.SECRETFRESH))
+
 ###--------------------------------------------------------------------------
 ### Authentication commands.
 
@@ -258,11 +272,6 @@ def cmd_auth(u, pw):
   else:
     t = mint_token(u)
     CGI.redirect(CGI.action('list', u),
-                 set_cookie = CGI.cookie('chpwd-token', t,
-                                         httponly = True,
-                                         secure = CGI.SSLP,
-                                         path = CFG.SCRIPT_NAME,
-                                         max_age = (CFG.SECRETLIFE -
-                                                    CFG.SECRETFRESH)))
+                 set_cookie = bake_cookie(t))
 
 ###----- That's all, folks --------------------------------------------------