Hi, Couple of months ago I've posted a patch that enables WIN32 to deal with crypt() encrypted passwords.
Here is a patch that uses dso to load a libeay32.dll from openssl an enables apr to validate a password using des_fcrypt. It would be much easier to implent that enhancement if apr_password_validate function will has the apr_pool_t as a parameter. Index: apr_md5.c =================================================================== RCS file: /home/cvspublic/apr/passwd/apr_md5.c,v retrieving revision 1.15 diff -u -r1.15 apr_md5.c --- apr_md5.c 2001/08/06 15:46:04 1.15 +++ apr_md5.c 2001/09/22 17:29:07 @@ -101,6 +101,7 @@ #include "apr_strings.h" #include "apr_md5.h" #include "apr_lib.h" +#include "apr_dso.h" #if APR_HAVE_STRING_H #include <string.h> @@ -669,6 +670,12 @@ return APR_SUCCESS; } +#if defined(WIN32) || defined(BEOS) || defined(NETWARE) +typedef char* (*fp_des_fcrypt)(const char *,const char *, char *); +static int passwd_pool_initialized = 0; +static apr_pool_t *passwd_apr_pool; +#define LIBEAY_DSO_NAME "libeay32" +#endif /* * Validate a plaintext password against a smashed one. Use either * crypt() (if available) or apr_md5_encode(), depending upon the format @@ -680,7 +687,10 @@ const char *hash) { char sample[120]; -#if !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) +#if defined(WIN32) || defined(BEOS) || defined(NETWARE) + static apr_dso_handle_t *libeay; + static fp_des_fcrypt des_fcrypt = NULL; +#else char *crypt_pw; #endif if (!strncmp(hash, apr1_id, strlen(apr1_id))) { @@ -694,7 +704,20 @@ * It's not our algorithm, so feed it to crypt() if possible. */ #if defined(WIN32) || defined(BEOS) || defined(NETWARE) - apr_cpystrn(sample, passwd, sizeof(sample) - 1); + /* It would be better to get the pool from the function call */ + if (!passwd_pool_initialized) { + if (apr_pool_create(&passwd_apr_pool, NULL) != APR_SUCCESS) { + return APR_ENOPOOL; + } + ++passwd_pool_initialized; + if (apr_dso_load(&libeay, LIBEAY_DSO_NAME, passwd_apr_pool) == APR_SUCCESS) + if (apr_dso_sym((void **)&des_fcrypt, libeay, "des_fcrypt") != APR_SUCCESS) + des_fcrypt = NULL; + } + if (des_fcrypt) + apr_cpystrn(sample, (des_fcrypt)(passwd, hash, sample), sizeof(sample) - 1); + else + apr_cpystrn(sample, passwd, sizeof(sample) - 1); #else crypt_pw = crypt(passwd, hash); apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1); MT.