ronald      99/09/19 14:28:37

  Modified:    src/modules/experimental mod_auth_digest.c
               src      CHANGES
  Log:
  - Use unix-io instead of stdio to read /dev/random (fixes problems
    on FreeBSD)
  - Correctly unescape all parts of the request uri and the uri
    attribute of the Authorization header before doing comparison
  - Fixes for MD5-sess
  - Don't send a domain attribute in Proxy-Authenticate
  
  PR: 4967
  Submitted by:  Joe Orton <[EMAIL PROTECTED]>, Kano <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.10      +36 -21    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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- mod_auth_digest.c 1999/09/13 13:53:54     1.9
  +++ mod_auth_digest.c 1999/09/19 21:28:34     1.10
  @@ -166,7 +166,7 @@
   
   
   #define NONCE_TIME_LEN       (((sizeof(time_t)+2)/3)*4)
  -#define NONCE_HASH_LEN       40
  +#define NONCE_HASH_LEN       (2*SHA_DIGESTSIZE)
   #define NONCE_LEN    (NONCE_TIME_LEN + NONCE_HASH_LEN)
   
   #define      SECRET_LEN      20
  @@ -178,7 +178,7 @@
       unsigned long      key;                  /* the key for this entry    */
       struct hash_entry *next;                 /* next entry in the bucket  */
       unsigned long      nonce_count;          /* for nonce-count checking  */
  -    char               ha1[17];                      /* for 
algorithm=MD5-sess    */
  +    char               ha1[2*MD5_DIGESTSIZE+1];      /* for 
algorithm=MD5-sess    */
       char               last_nonce[NONCE_LEN+1];      /* for one-time nonce's 
     */
   } client_entry;
   
  @@ -222,7 +222,7 @@
   
   typedef union time_union {
       time_t     time;
  -    unsigned char arr[sizeof(time_t)+1]; /* leave room for the NULL 
terminator */
  +    unsigned char arr[sizeof(time_t)];
   } time_rec;
   
   
  @@ -304,7 +304,7 @@
   static void initialize_secret(server_rec *s)
   {
   #ifdef       DEV_RANDOM
  -    FILE *rnd;
  +    int rnd;
       size_t got, tot;
   #else
       extern int randbyte(void);       /* from the truerand library */
  @@ -317,24 +317,19 @@
   #ifdef       DEV_RANDOM
   #define      XSTR(x) #x
   #define      STR(x)  XSTR(x)
  -    if ((rnd = fopen(STR(DEV_RANDOM), "rb")) == NULL) {
  +    if ((rnd = open(STR(DEV_RANDOM), O_RDONLY)) == NULL) {
        ap_log_error(APLOG_MARK, APLOG_CRIT, s,
                     "Digest: Couldn't open " STR(DEV_RANDOM));
        exit(EXIT_FAILURE);
       }
  -    if (setvbuf(rnd, NULL, _IONBF, 0) != 0) {
  -     ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_CRIT, s,
  -                  "Digest: Error trying to disable buffering for " 
STR(DEV_RANDOM));
  -     exit(EXIT_FAILURE);
  -    }
       for (tot=0; tot<sizeof(secret); tot += got) {
  -     if ((got = fread(secret+tot, 1, sizeof(secret)-tot, rnd)) < 1) {
  +     if ((got = read(rnd, secret+tot, sizeof(secret)-tot)) < 0) {
            ap_log_error(APLOG_MARK, APLOG_CRIT, s,
                         "Digest: Error reading " STR(DEV_RANDOM));
            exit(EXIT_FAILURE);
        }
       }
  -    fclose(rnd);
  +    close(rnd);
   #undef       STR
   #undef       XSTR
   #else        /* use truerand */
  @@ -1106,12 +1101,12 @@
       if (ha1 == NULL || ha1[0] == '\0') {
        urp = get_userpw_hash(r, resp, conf);
        ha1 = ap_md5(r->pool,
  -                  (unsigned char *) ap_pstrcat(r->pool, ha1, ":", 
resp->nonce,
  +                  (unsigned char *) ap_pstrcat(r->pool, urp, ":", 
resp->nonce,
                                                  ":", resp->cnonce, NULL));
        if (!resp->client)
            resp->client = gen_client(r);
        if (resp->client)
  -         memcpy(resp->client->ha1, ha1, 17);
  +         memcpy(resp->client->ha1, ha1, sizeof(resp->client->ha1));
       }
   
       return ha1;
  @@ -1272,14 +1267,16 @@
        * unneccessarily (it's usually > 200 bytes!).
        */
   
  -    if (conf->uri_list)
  +    if (r->proxyreq)
  +     domain = NULL;  /* don't send domain for proxy requests */
  +    else if (conf->uri_list)
        domain = conf->uri_list;
       else {
        /* They didn't specify any domain, so let's guess at it */
        domain = guess_domain(r->pool, resp->request_uri->path, r->filename,
                              conf->dir_name);
        if (domain[0] == '/' && domain[1] == '\0')
  -         domain = "";        /* "/" is the default, so no need to send it */
  +         domain = NULL;      /* "/" is the default, so no need to send it */
        else
            domain = ap_pstrcat(r->pool, ", domain=\"", domain, "\"", NULL);
       }
  @@ -1539,13 +1536,31 @@
   
       if (strcmp(resp->uri, resp->request_uri->path)) {
        uri_components *r_uri = resp->request_uri, d_uri;
  -     ap_parse_uri_components(r->pool, resp->uri, &d_uri);
  +     int port;
  +
  +     if (ap_parse_uri_components(r->pool, resp->uri, &d_uri) != HTTP_OK) {
  +         ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
  +                       "Digest: invalid uri <%s> in Authorization header",
  +                       resp->uri);
  +         return BAD_REQUEST;
  +     }
  +
  +     if (d_uri.hostname)
  +         ap_unescape_url(d_uri.hostname);
  +     if (d_uri.path)
  +         ap_unescape_url(d_uri.path);
  +     if (d_uri.query)
  +         ap_unescape_url(d_uri.query);
  +     if (r_uri->query)
  +         ap_unescape_url(r_uri->query);
  +     port = ap_get_server_port(r);
   
        if ((d_uri.hostname && d_uri.hostname[0] != '\0'
  -          && strcasecmp(d_uri.hostname, r->server->server_hostname))
  -         || (d_uri.port_str && d_uri.port != r->server->port)
  -         || (!d_uri.port_str && r->server->port != 80)
  -         || strcmp(d_uri.path, r_uri->path)
  +          && strcasecmp(d_uri.hostname, ap_get_server_name(r)))
  +         || (d_uri.port_str && d_uri.port != port)
  +         || (d_uri.hostname && d_uri.hostname[0] != '\0'
  +             && !d_uri.port_str && port != ap_default_port(r))
  +         || !d_uri.path || strcmp(d_uri.path, r_uri->path)
            || (d_uri.query != r_uri->query
                && (!d_uri.query || !r_uri->query
                    || strcmp(d_uri.query, r_uri->query)))
  
  
  
  1.1431    +12 -0     apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1430
  retrieving revision 1.1431
  diff -u -r1.1430 -r1.1431
  --- CHANGES   1999/09/11 07:58:27     1.1430
  +++ CHANGES   1999/09/19 21:28:35     1.1431
  @@ -1,5 +1,17 @@
   Changes with Apache 1.3.10
   
  +  *) mod_auth_digest fixes:
  +     - Use unix-io instead of stdio to read /dev/random (fixes problems
  +       on FreeBSD)
  +       [Kano <[EMAIL PROTECTED]>] PR#4967
  +     - Correctly unescape all parts of the request uri and the uri
  +       attribute of the Authorization header before doing comparison
  +       [Joe Orton <[EMAIL PROTECTED]>, Ronald Tschalär]
  +     - Fixes for MD5-sess
  +       [Joe Orton <[EMAIL PROTECTED]>]
  +     - Don't send a domain attribute in Proxy-Authenticate
  +       [Ronald Tschalär]
  +
     *) ap_base64decode_binary does not null-terminate the output anymore
        [Bill Stoddard, Ronald Tschalär]
   
  
  
  

Reply via email to