the first (colon.diff) reintroduces a feature, that got lost somehow at the 
auth rewrite: the possibility to add groups and/or other data behind the 
password after a colon.

the second patch (dbmdigest.diff) uses the advantages of the auth rewrite 
and adds support for digest authentication to the authn_dbm module. The 
hash key is "$user:$realm" (perl speaking), the value is the hash, 
optionally followed by a colon and other garbage, if you want.
Currently there's no official tool to create such databases. So for now 
I've used a little perlscript, more or less stolen from the mod_rewrite 
docs, to convert a htdigest-created flatfile to sdbm (df2dd.pl)

Sorry for harassing you so often... ;-)

nd
-- 
If God intended people to be naked, they would be born that way.
  -- Oscar Wilde

Index: modules/aaa/mod_authn_dbm.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/aaa/mod_authn_dbm.c,v
retrieving revision 1.8
diff -u -r1.8 mod_authn_dbm.c
--- modules/aaa/mod_authn_dbm.c 30 Nov 2002 18:48:41 -0000      1.8
+++ modules/aaa/mod_authn_dbm.c 9 Dec 2002 20:46:50 -0000
@@ -156,6 +156,7 @@
     apr_datum_t dbm_pw;
     apr_status_t rv;
     char *dbm_password = NULL;
+    char *colon_pw;
 
     rv = fetch_dbm(conf->dbmtype, conf->pwfile, user, &dbm_pw, r->pool);
 
@@ -172,6 +173,11 @@
 
     if (!dbm_password) {
         return AUTH_USER_NOT_FOUND;
+    }
+
+    colon_pw = strchr(dbm_password, ':');
+    if (colon_pw) {
+        *colon_pw = '\0';
     }
 
     rv = apr_password_validate(password, dbm_password);
Index: modules/aaa/mod_authn_dbm.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/aaa/mod_authn_dbm.c,v
retrieving revision 1.8
diff -u -r1.8 mod_authn_dbm.c
--- modules/aaa/mod_authn_dbm.c 30 Nov 2002 18:48:41 -0000      1.8
+++ modules/aaa/mod_authn_dbm.c 9 Dec 2002 20:54:21 -0000
@@ -189,10 +195,49 @@
     return AUTH_GRANTED;
 }
 
+static authn_status get_dbm_realm_hash(request_rec *r, const char *user,
+                                       const char *realm, char **rethash)
+{
+    authn_dbm_config_rec *conf = ap_get_module_config(r->per_dir_config,
+                                                      &authn_dbm_module);
+    apr_datum_t dbm_hd;
+    apr_status_t rv;
+    char *dbm_hash = NULL;
+    char *colon_hash;
+
+    rv = fetch_dbm(conf->dbmtype, conf->pwfile,
+                   apr_pstrcat(r->pool, user, ":", realm, NULL),
+                   &dbm_hd, r->pool);
+
+    if (rv != APR_SUCCESS) {
+        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+                      "Could not open dbm (type %s) hash file: %s",
+                      conf->dbmtype, conf->pwfile);
+        return AUTH_GENERAL_ERROR;
+    }
+
+    if (dbm_hd.dptr) {
+        dbm_hash = apr_pstrmemdup(r->pool, dbm_hd.dptr, dbm_hd.dsize);
+    }
+
+    if (!dbm_hash) {
+        return AUTH_USER_NOT_FOUND;
+    }
+
+    colon_hash = strchr(dbm_hash, ':');
+    if (colon_hash) {
+        *colon_hash = '\0';
+    }
+
+    *rethash = dbm_hash;
+
+    return AUTH_USER_FOUND;
+}
+
 static const authn_provider authn_dbm_provider =
 {
     &check_dbm_pw,
-    NULL,               /* No realm support yet. */
+    &get_dbm_realm_hash
 };
 
 static void register_hooks(apr_pool_t *p)
#!/path/to/bin/perl
##
##  df2dd.pl -- convert txt digest file to dbm format
##

use SDBM_File;
use Fcntl;

my ($txtmap, $dbmmap) = @ARGV;
use vars '%DB';

open(TXT, "<$txtmap") or die "Couldn't open $txtmap!\n";
tie (%DB, 'SDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  or die "Couldn't create $dbmmap!\n";

while (<TXT>) {
  next if (/^\s*#/ or /^\s*$/);
  s/^\s+//; s/\s+\z//;

  my ($user, $realm, $hash) = split /:/;
  $DB{"$user:$realm"} = $hash
    if (defined $user and defined $realm and defined $hash);
}

untie %DB;
close(TXT);

__END__

Reply via email to