You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by nd...@apache.org on 2003/03/05 17:37:00 UTC

cvs commit: httpd-2.0/support htdigest.c

nd          2003/03/05 08:37:00

  Modified:    .        CHANGES
               support  htdigest.c
  Log:
  Restore the ability of htdigest.exe to create files that contain
  more than one user. On win32 we cannot system("copy") a file, while
  it's open.
  
  PR: PR 12910
  
  Revision  Changes    Path
  1.1104    +4 -1      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.1103
  retrieving revision 1.1104
  diff -u -r1.1103 -r1.1104
  --- CHANGES	4 Mar 2003 22:15:50 -0000	1.1103
  +++ CHANGES	5 Mar 2003 16:36:59 -0000	1.1104
  @@ -2,7 +2,10 @@
   
     [Remove entries to the current 2.0 section below, when backported]
   
  -  *) Added the WindowsSocketsWorkaroud directive for Windows NT/2000/XP
  +  *) Restore the ability of htdigest.exe to create files that contain
  +     more than one user. PR 12910.  [Andr� Malo]
  +
  +  *) Added the WindowsSocketsWorkaround directive for Windows NT/2000/XP
        to work around problems with certain VPN and Firewall products that 
        have buggy AcceptEx implementations.
        [Allan Edwards w/ suggestions from Bill Stoddard & Bill Rowe]
  
  
  
  1.35      +53 -11    httpd-2.0/support/htdigest.c
  
  Index: htdigest.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/support/htdigest.c,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- htdigest.c	3 Feb 2003 17:53:27 -0000	1.34
  +++ htdigest.c	5 Mar 2003 16:37:00 -0000	1.35
  @@ -70,6 +70,7 @@
   #include "apr_lib.h"            /* for apr_getpass() */
   #include "apr_general.h"
   #include "apr_signal.h"
  +#include "apr_strings.h"        /* for apr_pstrdup() */
   
   #define APR_WANT_STDIO
   #define APR_WANT_STRFUNC
  @@ -97,12 +98,45 @@
   
   #define MAX_STRING_LEN 256
   
  +/* DELONCLOSE is quite cool, but:
  + * we need to close the file before we can copy it.
  + * otherwise it's locked by the system ;-(
  + *
  + * XXX: Other systems affected? (Netware?, OS2?)
  + */
  +#if (defined(WIN32))
  +#define OMIT_DELONCLOSE 1
  +#endif
  +
   apr_file_t *tfp = NULL;
   apr_pool_t *cntxt;
   #if APR_CHARSET_EBCDIC
   apr_xlate_t *to_ascii;
   #endif
   
  +static void cleanup_tempfile_and_exit(int rc)
  +{
  +    if (tfp) {
  +#ifdef OMIT_DELONCLOSE
  +        const char *cfilename;
  +        char *filename = NULL;
  +
  +        if (apr_file_name_get(&cfilename, tfp) == APR_SUCCESS) {
  +            filename = apr_pstrdup(cntxt, cfilename);
  +        }
  +#endif
  +	apr_file_close(tfp);
  +
  +#ifdef OMIT_DELONCLOSE
  +        if (filename) {
  +            apr_file_remove(filename, cntxt);
  +        }
  +#endif
  +    }
  +
  +    exit(rc);
  +}
  +
   static void getword(char *word, char *line, char stop)
   {
       int x = 0, y;
  @@ -160,16 +194,13 @@
   
       if (apr_password_get("New password: ", pwin, &len) != APR_SUCCESS) {
   	fprintf(stderr, "password too long");
  -	exit(5);
  +	cleanup_tempfile_and_exit(5);
       }
       len = sizeof(pwin);
       apr_password_get("Re-type new password: ", pwv, &len);
       if (strcmp(pwin, pwv) != 0) {
   	fprintf(stderr, "They don't match, sorry.\n");
  -	if (tfp) {
  -	    apr_file_close(tfp);
  -	}
  -	exit(1);
  +        cleanup_tempfile_and_exit(1);
       }
       pw = pwin;
       apr_file_printf(f, "%s:%s:", user, realm);
  @@ -200,10 +231,7 @@
   static void interrupted(void)
   {
       fprintf(stderr, "Interrupted.\n");
  -    if (tfp) {
  -        apr_file_close(tfp);
  -    }
  -    exit(1);
  +    cleanup_tempfile_and_exit(1);
   }
   
   static void terminate(void)
  @@ -262,7 +290,13 @@
       else if (argc != 4)
   	usage();
   
  -    if (apr_file_mktemp(&tfp, tn, 0, cntxt) != APR_SUCCESS) {
  +    if (apr_file_mktemp(&tfp, tn,
  +#ifdef OMIT_DELONCLOSE
  +    APR_CREATE | APR_READ | APR_WRITE | APR_EXCL
  +#else
  +    0
  +#endif
  +    , cntxt) != APR_SUCCESS) {
   	fprintf(stderr, "Could not open temp file.\n");
   	exit(1);
       }
  @@ -271,7 +305,7 @@
   	fprintf(stderr,
   		"Could not open passwd file %s for reading.\n", argv[1]);
   	fprintf(stderr, "Use -c option to create new one.\n");
  -	exit(1);
  +	cleanup_tempfile_and_exit(1);
       }
       strcpy(user, argv[3]);
       strcpy(realm, argv[2]);
  @@ -305,7 +339,15 @@
   #else
       sprintf(command, "cp %s %s", tn, argv[1]);
   #endif
  +
  +#ifdef OMIT_DELONCLOSE
  +    apr_file_close(tfp);
  +    system(command);
  +    apr_file_remove(tn, cntxt);
  +#else
       system(command);
       apr_file_close(tfp);
  +#endif
  +
       return 0;
   }