]> granicus.if.org Git - apache/commitdiff
Add '-n' option to make htpasswd send user:pw result to
authorKen Coar <coar@apache.org>
Thu, 25 May 2000 16:45:53 +0000 (16:45 +0000)
committerKen Coar <coar@apache.org>
Thu, 25 May 2000 16:45:53 +0000 (16:45 +0000)
stdout instead of fiddling with a text file.

Reviewed by: Greg Stein

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@85294 13f79535-47bb-0310-9956-ffa450edef68

STATUS
docs/man/htpasswd.1
support/htpasswd.c

diff --git a/STATUS b/STATUS
index 9e11171573287631d812f1478d5b6aefb9bd47dc..88bb339d2b3c7c929b01101aca4c79227dd67ea2 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -1,5 +1,5 @@
 Apache 2.0 STATUS:
-Last modified at [$Date: 2000/05/24 19:18:57 $]
+Last modified at [$Date: 2000/05/25 16:45:28 $]
 
 Release:
 
@@ -172,10 +172,6 @@ Documentation that needs writing:
 
 Available Patches:
 
-    * Ken's patch to make htpasswd a usable tool for other databases.
-       Message-ID: <392AFA06.716E8374@Golux.Com>
-       Status: 
-
    * Mike Abbott's <mja@trudge.engr.sgi.com> patches to improve
      performance
        Status: These were written for 1.3, and are awaiting a port to
index c8e88919516ffb81f84c5960f051e4c14ab5757a..9497c75b9e814517ff8ccf7cb8806e5adbca8617 100644 (file)
@@ -1,4 +1,4 @@
-.TH htpasswd 1 "February 1997"
+.TH htpasswd 1 "May 2000"
 .\" The Apache Software License, Version 1.1
 .\"
 .\" Copyright (c) 2000 The Apache Software Foundation.  All rights
@@ -70,13 +70,43 @@ htpasswd \- Create and update user authentication files
 ] 
 [
 .B \-m
+|
 .B \-d
+|
 .B \-p
+|
 .B \-s
 ] 
 .I passwdfile
 .I username
 .I password
+.br
+.B htpasswd 
+.B \-n
+[
+.B \-m
+|
+.B \-d
+|
+.B \-s
+|
+.B \-p
+] 
+.I username
+.br
+.B htpasswd
+.B \-nb
+[
+.B \-m
+|
+.B \-d
+|
+.B \-s
+|
+.B \-p
+] 
+.I username
+.I password
 .SH DESCRIPTION
 .B htpasswd
 is used to create and update the flat-files used to store
@@ -92,8 +122,9 @@ Resources available from the
 Apache web server can be restricted to just the users listed
 in the files created by 
 .B htpasswd.
-This program can only be used
-when the usernames are stored in a flat-file. To use a
+This program can only manage usernames and passwords
+stored in a flat-file. It can encrypt and display password information
+for use in other types of data stores, though.  To use a
 DBM database see 
 \fBdbmmanage\fP.
 .PP
@@ -119,14 +150,22 @@ extreme care, since the password is clearly visible on the command
 line.\fP
 .IP \-c 
 Create the \fIpasswdfile\fP. If \fIpasswdfile\fP already exists, it
-is rewritten and truncated.
+is rewritten and truncated.  This option cannot be combined with
+the \fB-n\fP option.
+.IP \-n
+Display the results on standard output rather than updating a file.
+This is useful for generating password records acceptable to Apache
+for inclusion in non-text data stores.  This option changes the
+syntax of the command line, since the \fIpasswdfile\fP argument
+(usually the first one) is omitted.  It cannot be combined with
+the \fB-c\fP option.
 .IP \-m 
 Use MD5 encryption for passwords. On Windows and TPF, this is the default.
 .IP \-d
 Use crypt() encryption for passwords. The default on all platforms but
 Windows and TPF. Though possibly supported by
 .B htpasswd
-onm all platforms, it is not supported by the
+on all platforms, it is not supported by the
 .B httpd
 server on Windows and TPF.
 .IP \-s
index d1603370b9d10a3e82a00a31a4958888cf280459..a31f6fa154c649cbd1e75174eb976f2f1d364bd0 100644 (file)
@@ -261,7 +261,10 @@ static int usage(void)
     fprintf(stderr, "Usage:\n");
     fprintf(stderr, "\thtpasswd [-cmdps] passwordfile username\n");
     fprintf(stderr, "\thtpasswd -b[cmdps] passwordfile username password\n\n");
+    fprintf(stderr, "\thtpasswd -n[mdps] username\n");
+    fprintf(stderr, "\thtpasswd -nb[mdps] username password\n");
     fprintf(stderr, " -c  Create a new file.\n");
+    fprintf(stderr, " -n  Don't update file; display results on stdout.\n");
     fprintf(stderr, " -m  Force MD5 encryption of the password"
 #if defined(WIN32) || defined(TPF)
        " (default)"
@@ -374,6 +377,7 @@ int main(int argc, char *argv[])
     int found = 0;
     int alg = ALG_CRYPT;
     int newfile = 0;
+    int nofile = 0;
     int noninteractive = 0;
     int i;
     int args_left = 2;
@@ -428,6 +432,10 @@ int main(int argc, char *argv[])
            if (*arg == 'c') {
                newfile++;
            }
+           else if (*arg == 'n') {
+               nofile++;
+               args_left--;
+           }
            else if (*arg == 'm') {
                alg = ALG_APMD5;
            }
@@ -458,15 +466,24 @@ int main(int argc, char *argv[])
     if ((argc - i) != args_left) {
        return usage();
     }
-    if (strlen(argv[i]) > (sizeof(pwfilename) - 1)) {
-       fprintf(stderr, "%s: filename too long\n", argv[0]);
-       return ERR_OVERFLOW;
+    if (newfile && nofile) {
+       fprintf(stderr, "%s: -c and -n options conflict\n", argv[0]);
+       return ERR_SYNTAX;
     }
-    strcpy(pwfilename, argv[i]);
-    if (strlen(argv[i + 1]) > (sizeof(user) - 1)) {
-       fprintf(stderr, "%s: username too long (>%d)\n", argv[0],
-               sizeof(user) - 1);
-       return ERR_OVERFLOW;
+    if (nofile) {
+       i--;
+    }
+    else {
+       if (strlen(argv[i]) > (sizeof(pwfilename) - 1)) {
+           fprintf(stderr, "%s: filename too long\n", argv[0]);
+           return ERR_OVERFLOW;
+       }
+       strcpy(pwfilename, argv[i]);
+       if (strlen(argv[i + 1]) > (sizeof(user) - 1)) {
+           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) {
@@ -496,49 +513,55 @@ int main(int argc, char *argv[])
                "just not work on this platform.\n");
     }
 #endif
-    /*
-     * Verify that the file exists if -c was omitted.  We give a special
-     * message if it doesn't.
-     */
-    if ((! newfile) && (! exists(pwfilename))) {
-       fprintf(stderr, "%s: cannot modify file %s; use '-c' to create it\n",
-               argv[0], pwfilename);
-       perror("fopen");
-       exit(ERR_FILEPERM);
-    }
-    /*
-     * Verify that we can read the existing file in the case of an update
-     * to it (rather than creation of a new one).
-     */
-    if ((! newfile) && (! readable(pwfilename))) {
-       fprintf(stderr, "%s: cannot open file %s for read access\n",
-               argv[0], pwfilename);
-       perror("fopen");
-       exit(ERR_FILEPERM);
-    }
-    /*
-     * Now check to see if we can preserve an existing file in case
-     * of password verification errors on a -c operation.
-     */
-    if (newfile && exists(pwfilename) && (! readable(pwfilename))) {
-       fprintf(stderr, "%s: cannot open file %s for read access\n"
-               "%s: existing auth data would be lost on password mismatch",
-               argv[0], pwfilename, argv[0]);
-       perror("fopen");
-       exit(ERR_FILEPERM);
-    }
-    /*
-     * Now verify that the file is writable!
-     */
-    if (! writable(pwfilename)) {
-       fprintf(stderr, "%s: cannot open file %s for write access\n",
-               argv[0], pwfilename);
-       perror("fopen");
-       exit(ERR_FILEPERM);
+    if (! nofile) {
+       /*
+        * Only do the file checks if we're supposed to frob it.
+        *
+        * Verify that the file exists if -c was omitted.  We give a special
+        * message if it doesn't.
+        */
+       if ((! newfile) && (! exists(pwfilename))) {
+           fprintf(stderr,
+                   "%s: cannot modify file %s; use '-c' to create it\n",
+                   argv[0], pwfilename);
+           perror("fopen");
+           exit(ERR_FILEPERM);
+       }
+       /*
+        * Verify that we can read the existing file in the case of an update
+        * to it (rather than creation of a new one).
+        */
+       if ((! newfile) && (! readable(pwfilename))) {
+           fprintf(stderr, "%s: cannot open file %s for read access\n",
+                   argv[0], pwfilename);
+           perror("fopen");
+           exit(ERR_FILEPERM);
+       }
+       /*
+        * Now check to see if we can preserve an existing file in case
+        * of password verification errors on a -c operation.
+        */
+       if (newfile && exists(pwfilename) && (! readable(pwfilename))) {
+           fprintf(stderr, "%s: cannot open file %s for read access\n"
+                   "%s: existing auth data would be lost on "
+                   "password mismatch",
+                   argv[0], pwfilename, argv[0]);
+           perror("fopen");
+           exit(ERR_FILEPERM);
+       }
+       /*
+        * Now verify that the file is writable!
+        */
+       if (! writable(pwfilename)) {
+           fprintf(stderr, "%s: cannot open file %s for write access\n",
+                   argv[0], pwfilename);
+           perror("fopen");
+           exit(ERR_FILEPERM);
+       }
     }
 
     /*
-     * All the file access checks have been made.  Time to go to work;
+     * All the file access checks (if any) have been made.  Time to go to work;
      * try to create the record for the username in question.  If that
      * fails, there's no need to waste any time on file manipulations.
      * Any error message text is returned in the record buffer, since
@@ -551,6 +574,10 @@ int main(int argc, char *argv[])
        fprintf(stderr, "%s: %s\n", argv[0], record);
        exit(i);
     }
+    if (nofile) {
+       printf("%s\n", record);
+       exit(0);
+    }
 
     /*
      * We can access the files the right way, and we have a record