coar 99/06/03 08:42:39
Modified: src CHANGES src/support htpasswd.1 htpasswd.c Log: Document the length restrictions on the username and password for src/support/htpasswd. Also gritch about illegal characters in the username (':' is the field separator). Revision Changes Path 1.1367 +5 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1366 retrieving revision 1.1367 diff -u -r1.1366 -r1.1367 --- CHANGES 1999/06/02 20:11:16 1.1366 +++ CHANGES 1999/06/03 15:42:33 1.1367 @@ -1,5 +1,10 @@ Changes with Apache 1.3.7 + *) When the username or password fed to htpasswd is too long, include the + size limit in the error message. Also report illegal characters + (currently only ':') in the username. Add the size restrictions + to the man page. [Ken Coar] + *) Fixed the configure --without-support option so it doesn't result in an infinite loop. [Marc Slemko] 1.11 +7 -4 apache-1.3/src/support/htpasswd.1 Index: htpasswd.1 =================================================================== RCS file: /home/cvs/apache-1.3/src/support/htpasswd.1,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- htpasswd.1 1999/04/10 15:08:45 1.10 +++ htpasswd.1 1999/06/03 15:42:38 1.11 @@ -141,8 +141,9 @@ returns 1 if it encounters some problem accessing files, 2 if there was a syntax problem with the command line, 3 if the password was entered interactively and the verification entry didn't match, 4 if -its operation was interrupted, and 5 if a value is too long (username, -filename, password, or final computed record). +its operation was interrupted, 5 if a value is too long (username, +filename, password, or final computed record), and 6 if the username +contains illegal characters (see the \fBRESTRICTIONS\fP section). .SH EXAMPLES \fBhtpasswd /usr/local/etc/apache/.htpasswd-users jsmith\fP .IP @@ -180,12 +181,14 @@ .SH RESTRICTIONS On the Windows and MPE platforms, passwords encrypted with .B htpasswd -are limited to no more than 80 characters in length. Longer -passwords will be truncated to 80 characters. +are limited to no more than 255 characters in length. Longer +passwords will be truncated to 255 characters. .PP The MD5 algorithm used by .B htpasswd is specific to the Apache software; passwords encrypted using it will not be usable with other Web servers. +.PP +Usernames are limited to 255 bytes and may not include the character ':'. .SH SEE ALSO .BR httpd(8) 1.31 +15 -62 apache-1.3/src/support/htpasswd.c Index: htpasswd.c =================================================================== RCS file: /home/cvs/apache-1.3/src/support/htpasswd.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- htpasswd.c 1999/05/31 19:44:30 1.30 +++ htpasswd.c 1999/06/03 15:42:38 1.31 @@ -75,6 +75,7 @@ * 4: Failure; operation interrupted (such as with CTRL/C) * 5: Failure; buffer would overflow (username, filename, or computed * record too long) + * 6: Failure; username contains illegal or reserved characters */ #include "ap_config.h" @@ -107,6 +108,7 @@ #define ERR_PWMISMATCH 3 #define ERR_INTERRUPTED 4 #define ERR_OVERFLOW 5 +#define ERR_BADUSER 6 /* * This needs to be declared statically so the signal handler can @@ -160,64 +162,7 @@ } } -#ifdef MPE /* - * MPE lacks getpass() and a way to suppress stdin echo. So for now, just - * issue the prompt and read the results with echo. (Ugh). - */ - -static char *getpass(const char *prompt) -{ - static char password[81]; - - fputs(prompt, stderr); - gets((char *) &password); - - if (strlen((char *) &password) > 80) { - password[80] = '\0'; - } - - return (char *) &password; -} - -#endif - -#ifdef WIN32 -/* - * Windows lacks getpass(). So we'll re-implement it here. - */ - -static char *getpass(const char *prompt) -{ - static char password[81]; - int n = 0; - - fputs(prompt, stderr); - - while ((password[n] = _getch()) != '\r') { - if (password[n] >= ' ' && password[n] <= '~') { - n++; - printf("*"); - } - else { - printf("\n"); - fputs(prompt, stderr); - n = 0; - } - } - - password[n] = '\0'; - printf("\n"); - - if (n > 80) { - password[80] = '\0'; - } - - return (char *) &password; -} -#endif - -/* * Make a password record from the given information. A zero return * indicates success; failure means that the output buffer contains an * error message instead. @@ -228,15 +173,16 @@ char *pw; char cpw[120]; char salt[9]; - char pwin[129]; - char pwv[129]; + char pwin[MAX_STRING_LEN]; + char pwv[MAX_STRING_LEN]; if (passwd != NULL) { pw = passwd; } else { if (ap_getpass("New password: ", pwin, sizeof(pwin)) != 0) { - ap_cpystrn(record, "password too long", (rlen -1)); + ap_snprintf(record, (rlen - 1), "password too long (>%d)", + sizeof(pwin) - 1); return ERR_OVERFLOW; } ap_getpass("Re-type new password: ", pwv, sizeof(pwv)); @@ -434,13 +380,20 @@ } strcpy(pwfilename, argv[i]); if (strlen(argv[i + 1]) > (sizeof(user) - 1)) { - fprintf(stderr, "%s: username too long\n", argv[0]); + fprintf(stderr, "%s: username too long (>%d)\n", argv[0], + sizeof(user) - 1); return ERR_OVERFLOW; } strcpy(user, argv[i + 1]); + if ((arg = strchr(user, ':')) != NULL) { + fprintf(stderr, "%s: username contains illegal character '%c'\n", + argv[0], *arg); + return ERR_BADUSER; + } if (noninteractive) { if (strlen(argv[i + 2]) > (sizeof(password) - 1)) { - fprintf(stderr, "%s: password too long\n", argv[0]); + fprintf(stderr, "%s: password too long (>%d)\n", argv[0], + sizeof(password) - 1); return ERR_OVERFLOW; } strcpy(password, argv[i + 2]);