| Index: third_party/cherrypy/lib/auth_basic.py
|
| ===================================================================
|
| --- third_party/cherrypy/lib/auth_basic.py (revision 0)
|
| +++ third_party/cherrypy/lib/auth_basic.py (revision 0)
|
| @@ -0,0 +1,87 @@
|
| +# This file is part of CherryPy <http://www.cherrypy.org/>
|
| +# -*- coding: utf-8 -*-
|
| +# vim:ts=4:sw=4:expandtab:fileencoding=utf-8
|
| +
|
| +__doc__ = """This module provides a CherryPy 3.x tool which implements
|
| +the server-side of HTTP Basic Access Authentication, as described in :rfc:`2617`.
|
| +
|
| +Example usage, using the built-in checkpassword_dict function which uses a dict
|
| +as the credentials store::
|
| +
|
| + userpassdict = {'bird' : 'bebop', 'ornette' : 'wayout'}
|
| + checkpassword = cherrypy.lib.auth_basic.checkpassword_dict(userpassdict)
|
| + basic_auth = {'tools.auth_basic.on': True,
|
| + 'tools.auth_basic.realm': 'earth',
|
| + 'tools.auth_basic.checkpassword': checkpassword,
|
| + }
|
| + app_config = { '/' : basic_auth }
|
| +
|
| +"""
|
| +
|
| +__author__ = 'visteya'
|
| +__date__ = 'April 2009'
|
| +
|
| +import binascii
|
| +from cherrypy._cpcompat import base64_decode
|
| +import cherrypy
|
| +
|
| +
|
| +def checkpassword_dict(user_password_dict):
|
| + """Returns a checkpassword function which checks credentials
|
| + against a dictionary of the form: {username : password}.
|
| +
|
| + If you want a simple dictionary-based authentication scheme, use
|
| + checkpassword_dict(my_credentials_dict) as the value for the
|
| + checkpassword argument to basic_auth().
|
| + """
|
| + def checkpassword(realm, user, password):
|
| + p = user_password_dict.get(user)
|
| + return p and p == password or False
|
| +
|
| + return checkpassword
|
| +
|
| +
|
| +def basic_auth(realm, checkpassword, debug=False):
|
| + """A CherryPy tool which hooks at before_handler to perform
|
| + HTTP Basic Access Authentication, as specified in :rfc:`2617`.
|
| +
|
| + If the request has an 'authorization' header with a 'Basic' scheme, this
|
| + tool attempts to authenticate the credentials supplied in that header. If
|
| + the request has no 'authorization' header, or if it does but the scheme is
|
| + not 'Basic', or if authentication fails, the tool sends a 401 response with
|
| + a 'WWW-Authenticate' Basic header.
|
| +
|
| + realm
|
| + A string containing the authentication realm.
|
| +
|
| + checkpassword
|
| + A callable which checks the authentication credentials.
|
| + Its signature is checkpassword(realm, username, password). where
|
| + username and password are the values obtained from the request's
|
| + 'authorization' header. If authentication succeeds, checkpassword
|
| + returns True, else it returns False.
|
| +
|
| + """
|
| +
|
| + if '"' in realm:
|
| + raise ValueError('Realm cannot contain the " (quote) character.')
|
| + request = cherrypy.serving.request
|
| +
|
| + auth_header = request.headers.get('authorization')
|
| + if auth_header is not None:
|
| + try:
|
| + scheme, params = auth_header.split(' ', 1)
|
| + if scheme.lower() == 'basic':
|
| + username, password = base64_decode(params).split(':', 1)
|
| + if checkpassword(realm, username, password):
|
| + if debug:
|
| + cherrypy.log('Auth succeeded', 'TOOLS.AUTH_BASIC')
|
| + request.login = username
|
| + return # successful authentication
|
| + except (ValueError, binascii.Error): # split() error, base64.decodestring() error
|
| + raise cherrypy.HTTPError(400, 'Bad Request')
|
| +
|
| + # Respond with 401 status and a WWW-Authenticate header
|
| + cherrypy.serving.response.headers['www-authenticate'] = 'Basic realm="%s"' % realm
|
| + raise cherrypy.HTTPError(401, "You are not authorized to access that resource")
|
| +
|
|
|
| Property changes on: third_party/cherrypy/lib/auth_basic.py
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|