ronald 99/08/13 00:18:08
Modified: src/modules/experimental mod_auth_digest.c Log: - Print out pointer to Rule DEV_RANDOM when truerand lib not found - Fix test-compile check to check for randbyte instead of trand32 - use ap_base64encode_binary/decode instead of our own copy - Tweak to make Amaya happier Revision Changes Path 1.5 +14 -174 apache-1.3/src/modules/experimental/mod_auth_digest.c Index: mod_auth_digest.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/experimental/mod_auth_digest.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mod_auth_digest.c 1999/08/10 15:47:56 1.4 +++ mod_auth_digest.c 1999/08/13 07:18:05 1.5 @@ -95,13 +95,14 @@ RULE_DEV_RANDOM="/dev/urandom" else RULE_DEV_RANDOM="truerand" - if helpers/TestCompile func trand32; then + if helpers/TestCompile func randbyte; then : - elif helpers/TestCompile lib rand trand32; then + elif helpers/TestCompile lib rand randbyte; then : else echo " (mod_auth_digest) truerand library missing!" echo "** This will most probably defeat successful compilation." + echo "** See Rule DEV_RANDOM in src/Configuration.tmpl for more information." fi fi fi @@ -387,7 +388,7 @@ return; failed: - if (!client_mm || (client_list && client_list->table && !opaque_mm) + if (!client_mm || (client_list && client_list->table && !opaque_mm) || (opaque_cntr && !otn_count_mm)) ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, s, "Digest: failed to create shared memory segments; reason " @@ -605,169 +606,6 @@ }; -/* - * base-64 encoding helpers - */ - -/* this is copied from util.c, with toascii folded into the table for EBCDIC */ -static const unsigned char pr2six[256] = -{ -#ifndef CHARSET_EBCDIC - /* ASCII table */ - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 -#else /*CHARSET_EBCDIC*/ - /* EBCDIC table */ - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64, - 64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64, - 64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 64, 64, 64, 64, 64, 64, - 64, 9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64, - 64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, -#endif /*CHARSET_EBCDIC*/ -}; - -/* this is the same as ap_uudecode in util.c, but returns the length instead - * of a pointer to the decoded data and takes a pointer to the decoded buffer - * as a third parameter. Also, for EBCDIC machines the toebcdic[] on the ouput - * is left out because we want a binary result. - */ -static int base64decode(pool *p, const char *bufcoded, unsigned char **bufplain) -{ - int nbytesdecoded; - register const unsigned char *bufin; - register unsigned char *bufout; - register int nprbytes; - - /* Strip leading whitespace. */ - - while (*bufcoded == ' ' || *bufcoded == '\t') - bufcoded++; - - /* Figure out how many characters are in the input buffer. - * Allocate this many from the per-transaction pool for the result. - */ - bufin = (const unsigned char *) bufcoded; - while (pr2six[*(bufin++)] <= 63); - nprbytes = (bufin - (const unsigned char *) bufcoded) - 1; - nbytesdecoded = ((nprbytes + 3) / 4) * 3; - - if (*bufplain == NULL) - *bufplain = ap_palloc(p, nbytesdecoded + 1); - bufout = *bufplain; - - bufin = (const unsigned char *) bufcoded; - - while (nprbytes > 3) { - *(bufout++) = - (unsigned char) (pr2six[bufin[0]] << 2 | pr2six[bufin[1]] >> 4); - *(bufout++) = - (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); - *(bufout++) = - (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); - bufin += 4; - nprbytes -= 4; - } - - /* Note: (nprbytes == 1) would be an error, so just ingore that case */ - if (nprbytes > 1) { - *(bufout++) = - (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); - } - if (nprbytes > 2) { - *(bufout++) = - (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); - } - - nbytesdecoded -= (4 - nprbytes) & 3; - (*bufplain)[nbytesdecoded] = '\0'; - - return nbytesdecoded; -} - -static const char six2pr[64] = -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/* This is similar to ap_uuencode except that it takes a length parameter - * (so we can encode binary data) and fixes a bug. Also note that no - * toascii[] is done on the input for EBCDIC (six2pr is automatically - * right). - */ -static char *base64encode(pool *p, const unsigned char *bufplain, int buflen) -{ - int nbytescoded; - char *bufcoded; - register const unsigned char *bufin; - register char *bufout; - register int nsixbytes; - - /* Figure out how many characters are in the input buffer. - * Allocate this many from the per-transaction pool for the result. - */ - nsixbytes = ((buflen + 2) / 3) * 4; - - bufcoded = ap_palloc(p, nsixbytes + 1); - bufcoded[nsixbytes] = '\0'; - - bufin = bufplain; - bufout = bufcoded; - - nbytescoded = 0; - - while (nbytescoded < (buflen - 2)) { - *(bufout++) = six2pr[(bufin[0] >> 2) & 0x3F]; - *(bufout++) = - six2pr[((bufin[1] >> 4) & 0x0F) | ((bufin[0] << 4) & 0x3F)]; - *(bufout++) = - six2pr[((bufin[2] >> 6) & 0x03) | ((bufin[1] << 2) & 0x3F)]; - *(bufout++) = six2pr[bufin[2] & 0x3F]; - bufin += 3; - nbytescoded += 3; - } - - if (nbytescoded < buflen) { - *(bufout++) = six2pr[(bufin[0] >> 2) & 0x3F]; - if (nbytescoded < (buflen-1)) { - *(bufout++) = - six2pr[((bufin[1] >> 4) & 0x0F) | ((bufin[0] << 4) & 0x3F)]; - *(bufout++) = six2pr[(bufin[1] << 2) & 0x3F]; - } - else { - *(bufout++) = six2pr[(bufin[0] << 4) & 0x3F]; - } - } - - while (bufout < (bufcoded+nsixbytes)) - *(bufout++) = (unsigned char) '='; - - return bufcoded; -} - - #ifdef HAVE_SHMEM_MM /* * client list code @@ -1086,7 +924,7 @@ res = get_digest_rec(r, resp); resp->client = get_client(resp->opaque_num, r); - if (res == OK && resp->client) + if (res == OK && resp->client) resp->client->nonce_count++; return DECLINED; @@ -1149,7 +987,7 @@ #else /* HAVE_SHMEM_MM */ t.time = 42; #endif /* HAVE_SHMEM_MM */ - memcpy(nonce, base64encode(p, t.arr, sizeof(t.arr)), NONCE_TIME_LEN+1); + ap_base64encode_binary(nonce, t.arr, sizeof(t.arr)); gen_nonce_hash(nonce+NONCE_TIME_LEN, nonce, opaque, server, conf); return nonce; @@ -1284,7 +1122,11 @@ * space only covers a single uri. */ if (dir[0] != '/') + /* This doesn't work for Amaya (ok, it's of arguable validity in + * the first place), so just return the file name instead return "http://0.0.0.0/"; + */ + return dir; /* Next we find the largest common common suffix of the request-uri * and the final file name, ignoring any extensions; this gives us a @@ -1490,21 +1332,19 @@ { double dt; time_rec nonce_time; - unsigned char *t; char tmp, hash[NONCE_HASH_LEN+1]; if (strlen(resp->nonce) != NONCE_LEN) { ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "Digest: invalid nonce %s received - length is not %d", resp->nonce, NONCE_LEN); - note_digest_auth_failure(r, conf, resp, 0); + note_digest_auth_failure(r, conf, resp, 1); return AUTH_REQUIRED; } tmp = resp->nonce[NONCE_TIME_LEN]; resp->nonce[NONCE_TIME_LEN] = '\0'; - t = nonce_time.arr; - base64decode(r->pool, resp->nonce, &t); + ap_base64decode_binary(nonce_time.arr, resp->nonce); gen_nonce_hash(hash, resp->nonce, resp->opaque, r->server, conf); resp->nonce[NONCE_TIME_LEN] = tmp; resp->nonce_time = nonce_time.time; @@ -1513,7 +1353,7 @@ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "Digest: invalid nonce %s received - hash is not %s", resp->nonce, hash); - note_digest_auth_failure(r, conf, resp, 0); + note_digest_auth_failure(r, conf, resp, 1); return AUTH_REQUIRED; } @@ -1522,7 +1362,7 @@ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "Digest: invalid nonce %s received - user attempted " "time travel", resp->nonce); - note_digest_auth_failure(r, conf, resp, 0); + note_digest_auth_failure(r, conf, resp, 1); return AUTH_REQUIRED; }