]> granicus.if.org Git - apache/commitdiff
cleaned up the file access checking
authorBrian Pane <brianp@apache.org>
Sat, 14 Sep 2002 06:53:40 +0000 (06:53 +0000)
committerBrian Pane <brianp@apache.org>
Sat, 14 Sep 2002 06:53:40 +0000 (06:53 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@96804 13f79535-47bb-0310-9956-ffa450edef68

support/htpasswd.c

index 03b066f91ade47fb4b2f4a7bf411be4a20c7e9b6..ca400dd3e1728e3b8b28f3ced1e734cac7759db3 100644 (file)
@@ -513,46 +513,36 @@ int main(int argc, const char * const argv[])
     }
 #endif
     if (!(mask & APHTP_NOFILE)) {
+        int file_exists = exists(pwfilename, pool);
         /*
          * 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 (!(mask & APHTP_NEWFILE) && !exists(pwfilename, pool)) {
+        if (!(mask & APHTP_NEWFILE) && !file_exists) {
             apr_file_printf(errfile,
                     "%s: cannot modify file %s; use '-c' to create it\n",
                     argv[0], pwfilename);
             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 the file exists, check that it's readable and writable.
+         * If it doesn't exist, verify that we can create it.
          */
-        if (!(mask & APHTP_NEWFILE) && !readable(pool, pwfilename)) {
-            apr_file_printf(errfile, "%s: cannot open file %s for read "
-                            "access\n", argv[0], pwfilename);
-            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 ((mask & APHTP_NEWFILE) && exists(pwfilename, pool)
-                && !readable(pool, pwfilename)) {
-            apr_file_printf(errfile, "%s: cannot open file %s for read access\n"
-                    "%s: existing auth data would be lost on "
-                    "password mismatch",
-                    argv[0], pwfilename, argv[0]);
-            exit(ERR_FILEPERM);
+        if (file_exists) {
+            if (!accessible(pool, pwfilename, APR_READ | APR_APPEND)) {
+                apr_file_printf(errfile, "%s: cannot open file %s for "
+                                "read/write access\n", argv[0], pwfilename);
+                exit(ERR_FILEPERM);
+            }
         }
-        /*
-         * Now verify that the file is writable!
-         */
-        if (!writable(pool, pwfilename)) {
-            apr_file_printf(errfile, "%s: cannot open file %s for write "
-                            "access\n", argv[0], pwfilename);
-            exit(ERR_FILEPERM);
+        else {
+            if (!accessible(pool, pwfilename, APR_CREATE | APR_WRITE)) {
+                apr_file_printf(errfile, "%s: cannot create file %s\n",
+                                argv[0], pwfilename);
+                exit(ERR_FILEPERM);
+            }
         }
     }