Actually, my  "hack" and "non-hack" suggestions appear to be
implementation
dependent, e.g.:
 (Apache: The Definitive
Guide, 3rd Edition):
A different nonce is sent the next time, so that the Bad Guy can't use the
captured digest to gain access.
It looks like the ability to send a nonce-repeatedly allows for a potential
replay-attack;  this appears to be a "feature" of mod_auth_digest and
potentially exploited by tools like 
  As I observed with DAVExplorer, nonce is actually used
throughout a
 session.
 Upon login, the server generates a nonce value as bellow :
 
Regarding this, the Apache Definitive Guide says:
MD5 digest authentication is implemented in Apache, using mod_auth_digest,
for two reasons. First, it provides one of the two fully compliant reference
HTTP 1.1 implementations required for the standard to advance down the
standards track; second, it provides a test bed for browser implementations.
It should only be used for experimental purposes, particularly since it
makes no effort to check that the returned nonce is the same as the one it
chose in the first
*4.* It is unfortunate that the nonce must be returned as part of the
client's digest authentication header, but since HTTP is a stateless
protocol, there is little alternative. It is even more unfortunate that
Apache simply believes it! An obvious way to protect against this is to
include the time somewhere in the nonce and to refuse nonces older than some
threshold.
So anyways, this is a roundabout way of saying that both my "hack" and
"non-hack" versions using the nonce as a "session key" would be, um,
...
hacks. :-) But that can be seen by definition: because a nonce is a "number
used once" (per web request) and needs to change to prevent a replay-attack
of login information from a previously captured web-response.
Therefore, my last suggestion of using apache/mod_auth_digest (which is a
ref implementation of the spec) and a custom xwiki.authentication.authclass
still stands as the preferred approach
to get Digest Authentication working in Xwiki for the purpose of WebDAV
use/spec-compliance.
On Mon, Oct 27, 2008 at 5:59 PM, Niels Mayer <nielsmayer(a)gmail.com> wrote:
  Sergiu --
 I am in no way tied to my "hack" so no offense taken ... I just saw Asiri's
 message of being "stuck" and I thought I'd mention a potential  way of
 getting un-stuck. The second approach I suggested as "non-hack" and
 supersedes some of the limitations&stupidities of my first attempt. I was
 just throwing out an idea, not trying to challenge the world :-)
 However, since this would largely be a hack into the existing
 authentication system, why not just "plug-in"
 an authentication system that is more appropriate ... which brings me to
 the following:
 Is there any reason why you can't front Xwiki with Apache HTTPD running
 
http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html ?? Combine that
 with what Ludovic suggested in
http://n2.nabble.com/Using-Apache-Basic-Authentication-API-credentials-and-…
specify a custom authentication in Xwiki via:
xwiki.authentication.authclass=com.xpn.xwiki.user.xwiki.impl.AppServerTrustedAuthServiceImpl
 Then write your own AppServerTrustedAuthServiceImpl, which gets the
 user-name (and potentially other credentials) from the mod_digest_auth
 Apache plugin....
 For example, with Apache talking to Java via mod_proxy_ajp setting
 ProxyPass /davxwiki/    ajp://127.0.0.1:8009/xwiki/
  setup mod_digest_auth to "protect" the web-accessible space
'davxwiki/'
 via digest-authentication. This allows a special digest-auth supporting
 xwiki at URL http://.../davxwiki/... for use w/ DAV.
 Here's a brief summary of mod_auth_digest:
 This module implements HTTP Digest Authentication
(
RFC2617<http://www.faqs.org/rfcs/rfc2617.html>)l>),
 and provides a more secure alternative to
mod_auth_basic<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html&…
 .
 Using Digest Authentication
 Using MD5 Digest authentication is very simple. Simply set up
 authentication normally, using AuthType Digest and
AuthDigestProvider<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.…
of the normal AuthType
 Basic and
AuthBasicProvider<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.ht…er>.
 Then add a
AuthDigestDomain<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.ht…
containing at least the root URI(s) for this protection space.
 Appropriate user (text) files can be created using the
htdigest<http://httpd.apache.org/docs/2.2/programs/htdigest.html>toolt;tool.
 Example:
 <Location /private/>
  AuthType Digest
 AuthName "private area"
 AuthDigestDomain /private/ 
http://mirror.my.dom/private2/
 AuthDigestProvider file
 AuthUserFile /web/auth/.digest_pw
 Require valid-user
  </Location>
 ....
 Sergiu Dumitriu said:
 - We're trying hard to abstract the storage mechanism. There is no
 database, no table, no column. Currently there is no password column, it is
 just an xwiki property like any other. And as I said before, anything stored
 in the wiki is retrievable. 
 When i talk of "column" in the db .. I'm speaking generally and not of the
 specific implementation. The basic operation of adding another table of
 MD5passwords (session passwords) via the chosen abstraction mechanism
 shouldn't be an issue.
 - Changing the user's password is not acceptable. This means that he cannot
  use both the webdav and the browser at the same
time. And if he forgets to
 logout, he won't be able to access the wiki normally.
 
 This wouldn't happen in the "non-hack" version I spoke of subsequently.
 Unless a dav-login was used, xwiki would see the exact same code-path for
 all operations. If a dav-login occurred, then authentication would occur
 through the separare "table" of MD5passwords.
 And certainly this wouldn't be needed w/ a mod_auth_digest-based
 implementation suggested above.
 - Disabling the feature for "Admin" is not good. There is nothing special
  about the Admin account, it is just a name we
chose for a default account.
 It could be called anyway, what matters is the rights set in the wiki.
 
 This wouldn't be needed with the "non-hack" version suggested by my second
 email, nor with the mod_auth_digest-based implementation.
 ............
 On Sun, Oct 26, 2008 at 5:22 PM, Sergiu Dumitriu <sergiu(a)xwiki.com> wrote:
  Sergiu Dumitriu wrote:
  Niels Mayer wrote:
> On Sun, Oct 26, 2008 at 9:11 AM, Asiri Rathnayake <
> asiri.rathnayake(a)gmail.com> wrote:
>
>> As I observed with DAVExplorer, nonce is actually used throughout a
>> session. Upon login, the server generates a nonce value as bellow : 
 nonce
=
 >> MD5(client_ip,time_stamp,private_key); //
source : [Adding Digest 
 Access
 >> Authentication to a WebDAV Server<
>> 
http://www.cs.columbia.edu/%7Ehgs/teaching/ais/1998/projects/WebDAV/report.…
 >>> ]
>> and sends this to the client. The client in turn uses this nonce value 
when
 >> generating the RESPONSE hash in all
following requests.
>>
> ... Which is why you can have an external "HTTPS-accessible 
 shadow-login
 > program" invoked once per DAV session,
to change Xwiki's password to 
 the
 > MD5Password computed from the
nonce/session-key. In my previous email I
> called this DAV login service "davlogin" (e.g.
> https://.../davlogin?user=foo&md5pass=0x0123456789ABCDEF
> )
>
> Of course, this would have side-issues like making web-login to a user
> account in Xwiki  difficult since the password would be set to the last
> session's Md5Password. I guess you could have another program 
"davlogout" to
 > restore the normal Xwiki password. And
another table in the db to store 
 the
 > regular password.
>
> Yes it's a hack.
>
> The next question is there a way to accomplish the exact  same thing in 
 code
 > to achieve the same goal, but without the
hack.
>
> For example, by adding a new special parameter to any DAV-originated
> request, to enable authentication based on a new MD5Password column in 
 the
 > database. The MD5Password would be used for
authentication for any 
 requests
 > using the special-parameter (e.g.
'?dav=true). Basically the same code 
 used
 > currently that looks up the regular password
in Xwiki, should have a 
 switch
 > on if "?dav=true" to select lookup
using the MD5Password column or the
> regular password column. (a pretty simple and trivial/scopable change).
>
> Also needed, an external way of setting the user-associated entry in 
 the new
 > MD5Password column to the password for the
current DAV session. (akin 
 to
 > https://.../davlogin mentioned above).
>
> This new MD5Password db column represents the MD5Passwords for all 
 active
 > DAV sessions on a given wiki, while the rest
of xwiki continues to work 
 the
   same with
the old password mechanism, as long as you don't give the new
 parameter ?dav=true.
 
 This is getting totally out of control. I'm against this for many 
  reasons:
 - We're trying hard to abstract the storage mechanism. There is no
 database, no table, no column. Currently there is no password column, it
 is just an xwiki property like any other. And as I said before, anything
 stored in the wiki is retrievable.
 - Changing the user's password is not acceptable. This means that he
 cannot use both the webdav and the browser at the same time. And if he
 forgets to logout, he won't be able to access the wiki normally.
 - Disabling the feature for "Admin" is not good. There is nothing
 special about the Admin account, it is just a name we chose for a
 default account. It could be called anyway, what matters is the rights
 set in the wiki. There is nothing special in XWiki, everything is a
 document, and all documents are equal (except those with programming
 rights). We should not have special cases in our code.
 - This is not going to work anyway, since we still can't store HA1 and
 be able to read it back, and storing RESPONSE is not practicle, since it
 depends on the visited URL. What I'm saying is that the only thing that
 can be done with a hashed value is to obtain a cleartext value from the
 client, hash it and compare it with what is stored in the wiki. Without
 the full, unencrypted text, there's no way we can make use use of the
 stored value. And since RESPONSE depends on the visited URL (and in a
 more secure version on the whole request body), this makes impossible
 this external "login" service.
 - Although some implementations do use the same nonce for a full
 session, this is wrong. The specification clearly states that the nonce
 should be uniquely generated for each authentication request (see
 
http://tools.ietf.org/html/rfc2617#page-9 ), and by its name NONCE 
 means
  that it should be used only once. 
 To clarify things a bit, the specification says that the nonce is
 generated whenever a 401 response is sent. This does not mean after
 every client request, but there are no strict rules for this. It could
 expire after a certain amount of time, or after a number of uses, or who
 knows. By default, Apache httpd is configured so that nonces expire
 after 5 minutes. Since we're making the server, we can decide our own
 strategy for this expiration, so we could make it behave like a session.
  - The WebDAV component should be a component, and
components don't have
 strong bounds to other components. So, making special cases for WebDAV
 is wrong.
 - And the most important reason for me is that this is ugly. The right
 code should be clean, simple and elegant, not a complete hack messing
 around all the platform, just so that we comply with the flawed Digest
 authentication mechanism. Requiring that the password is plainly
 available on the server is crazy. If any MS product fails because of
 this, then it is just another sign of their stupid vendor lock-in
 attempts, and I will not succumb to them.
 I don't mean to offend anybody, I'm just speaking from a technical point
 of view. 
 
 --
 Niels
 
http://nielsmayer.com