Improvements associated with the req.ap_auth_type attribute.
------------------------------------------------------------

         Key: MODPYTHON-124
         URL: http://issues.apache.org/jira/browse/MODPYTHON-124
     Project: mod_python
        Type: Improvement
  Components: core  
    Versions: 3.3    
    Reporter: Graham Dumpleton


The "req.ap_auth_type" attribute is set to the authentication type 
corresponding to the type of authentication processing successfully carried out 
in respect of a request. For example,  if one has Apache configuration:

  AuthType Basic
  AuthName "Restricted Files"
  AuthUserFile /usr/local/apache/passwd/passwords
  Require valid-user

it is expected that the request uses basic authentication header as 
appropriate. These headers will be dealt with by inbuilt Apache core module. 
Upon successful authentication, the Apache core module will set 
"req.ap_auth_type" attribute to be "Basic" and set "req.user" to the user ID of 
the logged in user.

If instead Apache support for digest authentication was used, eg:

  AuthType Digest
  ...

then "req.ap_auth_type" attribute will be set to "Digest".

If authentication was not requested, ie., no AuthType directive, the 
"req.ap_auth_type" is set to Python None.

The intent is that you should be able to implement authentication handlers in 
mod_python using PythonAuthenHandler, but you can't actually do this correctly 
at the moment as there are a few things missing.

Firstly, in order to trigger the PythonAuthenHandler, you must still define the 
AuthType/AuthName/Require directives. In order to ensure that our 
authentication handler is triggered and not the builtin ones or some other one, 
the AuthType directive should specify a string other than "Basic" or "Digest". 
This would be a name we choose and can basically be anything. For example, you 
might choose a descriptive name like "Python-Basic-DBM" to denote basic 
authentication is used against a DBM database but using the Python 
authentication handler.

  AuthType Python-Basic-DBM
  AuthName "Web Application"
  Require valid-user

  PythonAuthenHandler basicdbmauth
  PythonOption basicdbmauth.UserDatabase /.../users.dbm

When the authentication handler in "basicdbmauth" is called, the 
"req.ap_auth_type" field is still None. This is because authentication hasn't 
succeed yet.

In terms of being able to implement the authentication handler correctly, the 
first problem is that there is no way to access the actual value associated 
with the AuthType directive. This needs to be consulted to determine if the 
authentication handler should actually do anything. Second is that the value 
associated with the AuthName directive can't be determined either, something 
which may influence against which database authentication should be done.

Thus first lot of changes that need to be made are that "req" object needs to 
have two new methods called "get_auth_type()" and "get_auth_name()". These will 
map to the Apache API functions called "ap_auth_type()" and "ap_auth_name()". 
Note that "ap_auth_type()" is returning a different value to "req.ap_auth_type".

With those two functions, authentication handler can then be written as:

  def authenhandler(req):
    if req.get_auth_type() != "Python-Basic-DBM":
      return apache.DECLINED

    realm = req.get_auth_name()

    # Do all the processing of Authorization header and
    # validate user etc. If not okay, return appropriate error
    # status. If okay, keep going.

    req.user = ... from header
    req.ap_auth_type = "Python-Basic-DBM"

    return apache.OK

As well as returning apache.OK, convention is to set "req.user" and 
"req.ap_auth_type".

This is where the final problem occurs. That is that "req.ap_auth_type" is read 
only and cannot actually be set as necessary.

Thus in addition to "req.get_auth_type()", "req.get_auth_name()", need to make 
"req.ap_auth_type" writable.

Having made these changes it would then actually be possible to write 
authentication handlers correctly, ie., whereby they correctly look at AuthType 
etc to see whether they should be applied.



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to