Details

      Description

      I have extended Jackrabbit to allow HTTP digest authentication through WebDAV, as Windows 7 can't connect to a WebDAV repository using basic authentication.
      The implementation is based on Tomcat's source code (I have used it as a reference to implement the same authentication handling in Jackrabbit). I hope that's not a problem.

      In order to enable the digest authentication, you need to:

      • Change the WebDAV servlet from 'org.apache.jackrabbit.j2ee.SimpleWebdavServlet' to 'org.apache.jackrabbit.j2ee.DigestWebdavServlet' in the web.xml file;
      • Change the LoginModule to 'org.apache.jackrabbit.core.security.simple.DigestLoginModule' in the repository.xml file
      • Add the parameter 'passwordsFile' to the DigestLoginModule with the path of the passwords file.
      • Add to the passwords file created above the user id and the password digest. The utility DigestPasswordUtil in the jackrabbit-jcr-commons project can be used to generate the entry to be appended to the passwords file.

      java -cp target/jackrabbit-jcr-commons-2.2-SNAPSHOT.jar org.apache.jackrabbit.util.DigestPasswordUtil user realm password

      The DigestLoginModule configuration is optional, I believe the DigestWebdavServlet should work normally with the SimpleLoginModule which accepts any credentials.

      1. http-digest.patch
        25 kB
        Douglas Jose
      2. JCR-2773.patch
        23 kB
        Douglas Jose

        Activity

        Hide
        Douglas Jose added a comment -

        Implementation of the suggested refactorings.

        Show
        Douglas Jose added a comment - Implementation of the suggested refactorings.
        Hide
        Douglas Jose added a comment -

        I'm going to do implement the first three enhancements suggested in the list. Thanks for the hints.

        Regarding the UserManager interface, I believe it cannot be used as one of the limitations of the digest authentication is that it must be aware of the user's password (or the concatenation of user, realm and password, as currently implemented). As far as I know, the existing user management mechanism doesn't store the user's clear text password (or any data from which such password could be derived).

        The simultaneous support to basic and digest authentication, as far as I know, cannot be implemented. The protocol says that the server informs the client which method is being used (via header parameters); they don't negotiate on which on to use. However, I'm not an expert in such subject, so please let me know if I'm wrong; the conclusions I'm taking here are based on the Tomcat code I used as a reference to understand the protocol.

        Show
        Douglas Jose added a comment - I'm going to do implement the first three enhancements suggested in the list. Thanks for the hints. Regarding the UserManager interface, I believe it cannot be used as one of the limitations of the digest authentication is that it must be aware of the user's password (or the concatenation of user, realm and password, as currently implemented). As far as I know, the existing user management mechanism doesn't store the user's clear text password (or any data from which such password could be derived). The simultaneous support to basic and digest authentication, as far as I know, cannot be implemented. The protocol says that the server informs the client which method is being used (via header parameters); they don't negotiate on which on to use. However, I'm not an expert in such subject, so please let me know if I'm wrong; the conclusions I'm taking here are based on the Tomcat code I used as a reference to understand the protocol.
        Hide
        Jukka Zitting added a comment -

        Looks good, thanks! Some comments:

        • The DigestCredentials class is probably best placed in jackrabbit-api. Alternatively it might be better to avoid the DigestCredentials class entirely and instead use the attributes feature of the SimpleCredentials class to pass around the digest fields.
        • It would be good if the code from Tomcat is labelled with a pointer to the original classes.
        • I'd rather avoid putting the digest utility code in jackrabbit-jcr-commons, as it's not directly related to JCR. It would be better to simply place the utility code in jackrabbit-core along with the DigestLoginModule class.
        • It would be nice if the UserManager interface was used to access the digest password information instead of an explicit password file.

        Additionally, would it be possible to simultaneously support both Basic and Digest authentication, so that you wouldn't need to modify server configuration based on the kinds of clients you have accessing the server?

        Show
        Jukka Zitting added a comment - Looks good, thanks! Some comments: The DigestCredentials class is probably best placed in jackrabbit-api. Alternatively it might be better to avoid the DigestCredentials class entirely and instead use the attributes feature of the SimpleCredentials class to pass around the digest fields. It would be good if the code from Tomcat is labelled with a pointer to the original classes. I'd rather avoid putting the digest utility code in jackrabbit-jcr-commons, as it's not directly related to JCR. It would be better to simply place the utility code in jackrabbit-core along with the DigestLoginModule class. It would be nice if the UserManager interface was used to access the digest password information instead of an explicit password file. Additionally, would it be possible to simultaneously support both Basic and Digest authentication, so that you wouldn't need to modify server configuration based on the kinds of clients you have accessing the server?
        Hide
        Douglas Jose added a comment -

        I haven't chose the components in this issue as the code is spread through several components (namely jackrabbit-core, jackrabbit-jcr-server, jackrabbit-jcr-commons and jackrabbit-webapp). I am not sure if I chose the best components and packages for the new classes in the attached patch.

        Show
        Douglas Jose added a comment - I haven't chose the components in this issue as the code is spread through several components (namely jackrabbit-core, jackrabbit-jcr-server, jackrabbit-jcr-commons and jackrabbit-webapp). I am not sure if I chose the best components and packages for the new classes in the attached patch.
        Hide
        Douglas Jose added a comment -

        Implementation of HTTP digest authentication

        Show
        Douglas Jose added a comment - Implementation of HTTP digest authentication

          People

          • Assignee:
            Unassigned
            Reporter:
            Douglas Jose
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:

              Development