[ https://issues.apache.org/jira/browse/MODPYTHON-169?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12503329 ]
Paul Jongsma commented on MODPYTHON-169: ---------------------------------------- Using this patch with the PythonPath option in the Apache configuration seems to give a problem. As soon as you add a PythonPath setting to the server config any request fails with: File "/usr/local/lib/python2.4/site-packages/mod_python/apache.py", line 331, in AuthBasicDispatch\n if pathstring != _path: NameError: global name '_path' is not defined Adding a global _path to apache.py resolves this issue; # Cache for values of PythonPath that have been seen already. _path = {} _path_cache = {} _path_cache_lock = threading.Lock() However I have not enough knowledge on mod_python to know if this is the correct way to resolve this issue. Platform info: Python 2.4.4 (#2, Mar 28 2007, 20:09:38) on FreeBSD 6.2-STABLE FreeBSD 6.2-STABLE #5 Server version: Apache/2.2.4 (Unix) > Add feature to allow mod_python to be an auth provider. > ------------------------------------------------------- > > Key: MODPYTHON-169 > URL: https://issues.apache.org/jira/browse/MODPYTHON-169 > Project: mod_python > Issue Type: New Feature > Components: core > Reporter: Graham Dumpleton > Assignee: Graham Dumpleton > Attachments: add-authenticator.patch > > > In Apache 2.2, the implementation of authentication has been split into two > parts. The first is that which handles the specifics of negotiating with a > client for a specific authentication mechanism type, for example, Basic or > Digest authentication. The second part is that which handles the specifics of > verifying the actual users credentials, for example, by looking the user up > in a dbm database, ldap or some other type of user database. > The second part of this is referred to as the auth provider and in Apache 2.2 > it is possible to hook in additional providers. This means that the any > builtin support in Apache for Basic and Digest authentication mechanism can > be used, but the verification could be done by some arbitrary user code. Such > verification could be done in Python, if mod_python allowed one to define the > necessary auth provider hooks. > To this end, proposed that mod_python be extended such that when using Apache > 2.2, that it is possible to say: > AuthType Basic > AuthName "Restricted Files" > AuthBasicProvider mod_python > PythonAuthBasicProvider somemodule > or: > AuthType Digest > AuthName "Restricted Files" > AuthDigestProvider mod_python > PythonAuthDigestProvider somemodule > That is, by specifying mod_python in conjunction with AuthBasicProvider or > AuthDigestProvider directives, it triggers mod_python to be given option of > satisfying need to perform verification of user credentials. The function to > be called for each being given by the PythonAuthBasicProvider and > PythonAuthDigestProvider respectively. > The argument to these directives would be a module name, in which case a > function of the name "authbasicprovider" or "authdigestprovider" will be > expected to exist. If wanting to specify a particular module, like in handler > directives, would also be possible to say: > PythonAuthBasicProvider somemodule::check_password > PythonAuthDigestProvider somemodule::get_realm_hash > Note that the prototype of the function for each would not be like existing > handlers and is different in each case. For the Basic auth mechanism, an > example function would be: > users = { ... } > def authbasicprovider(req, user, password): > # could consult req.auth_name() to get realm > if user not in users: > return apache.AUTH_USER_NOT_FOUND > # assuming passwords are stored in clear text > if users[user] != password: > return apache.AUTH_DENIED > return apache.AUTH_GRANTED > Exceptions would be translated into apache.AUTH_GENERAL_ERROR, or function > could explicitly return it. Could also allow explicit exception of type > apache.SERVER_RETURN like in handlers but where argument is auth values. > For Digest authentication, function would be: > def authdigestprovider(req, user, realm): > # could select database based on 'realm' > if user not in users: > return None > # assuming passwords are stored in clear text > return md5.new("%s:%s:%s" % (user, realm, users[user])).hexdigest() > In this later function, return None indicates apache.AUTH_USER_NOT_FOUND. An > apache.SERVER_RETURN exception could also be used with that value as > argument. Returning of an actual string would imply apache.AUTH_USER_FOUND. > Unexpected exceptions taken as apache.AUTH_GENERAL_ERROR, or could be raised > explicitly using apache.SERVER_RETURN exception. > What all this would mean is that you would never need to write an > authenhandler again using mod_python, as you could rely on any type of > authenhandler builtin to Apache or as as supported by some third party Apache > module. All you would need to do is supply the auth provider or Basic or > Digest authentication as necessary to support verification of the user. > -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.