From: msweet Date: Mon, 25 Aug 2014 13:28:04 +0000 (+0000) Subject: Allow access to cupsd-created files with non-world-readable permissions via the X-Git-Tag: v2.2b1~512 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=112fc3c0bd4a3e90cd1bd1cb447d4563a50d6a46;p=thirdparty%2Fcups.git Allow access to cupsd-created files with non-world-readable permissions via the web interface (STR #4461). Use cupsdCreateConfFile API to create PPD files, and use the ConfigFilePerm for PPD files. git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@12113 a1ca3aef-8c08-0410-bb20-df032aa958be --- diff --git a/CHANGES.txt b/CHANGES.txt index 463cb39013..f80614bd40 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,4 @@ -CHANGES.txt - 2.0rc1 - 2014-08-20 +CHANGES.txt - 2.0rc1 - 2014-08-25 --------------------------------- CHANGES IN CUPS V2.0rc1 @@ -13,6 +13,8 @@ CHANGES IN CUPS V2.0rc1 - Dropped the old Epson Stylus Color/Photo sample drivers since they don't work with any current printers and there are free alternatives that produce much better output () + - Log and configuration files that are read-only are again accessible + via the web interface (STR #4461) CHANGES IN CUPS V2.0b1 diff --git a/scheduler/client.c b/scheduler/client.c index d00d9fb70e..36dd3ad0b5 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -2912,6 +2912,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ char *ptr; /* Pointer info filename */ size_t plen; /* Remaining length after pointer */ char language[7]; /* Language subdirectory, if any */ + int perm_check = 1; /* Do permissions check? */ /* @@ -2921,17 +2922,27 @@ get_file(cupsd_client_t *con, /* I - Client connection */ language[0] = '\0'; if (!strncmp(con->uri, "/ppd/", 5) && !strchr(con->uri + 5, '/')) + { snprintf(filename, len, "%s%s", ServerRoot, con->uri); + + perm_check = 0; + } else if (!strncmp(con->uri, "/icons/", 7) && !strchr(con->uri + 7, '/')) { snprintf(filename, len, "%s/%s", CacheDir, con->uri + 7); if (access(filename, F_OK) < 0) snprintf(filename, len, "%s/images/generic.png", DocumentRoot); + + perm_check = 0; } else if (!strncmp(con->uri, "/rss/", 5) && !strchr(con->uri + 5, '/')) snprintf(filename, len, "%s/rss/%s", CacheDir, con->uri + 5); - else if (!strncmp(con->uri, "/admin/conf/", 12)) - snprintf(filename, len, "%s%s", ServerRoot, con->uri + 11); + else if (!strcmp(con->uri, "/admin/conf/cupsd.conf")) + { + strlcpy(filename, ConfigurationFile, len); + + perm_check = 0; + } else if (!strncmp(con->uri, "/admin/log/", 11)) { if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/') @@ -2942,6 +2953,8 @@ get_file(cupsd_client_t *con, /* I - Client connection */ strlcpy(filename, PageLog, len); else return (NULL); + + perm_check = 0; } else if (con->language) { @@ -3007,7 +3020,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ * not allow access... */ - if (!status && !(filestats->st_mode & S_IROTH)) + if (!status && perm_check && !(filestats->st_mode & S_IROTH)) { cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename); return (NULL); @@ -3115,7 +3128,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ * not allow access... */ - if (!status && !(filestats->st_mode & S_IROTH)) + if (!status && perm_check && !(filestats->st_mode & S_IROTH)) { cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename); return (NULL); diff --git a/scheduler/ipp.c b/scheduler/ipp.c index 1f6fe5a39d..0e682ee8c2 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -2715,7 +2715,6 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG, "Copied PPD file successfully"); - chmod(dstfile, 0644); } } @@ -4623,7 +4622,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ * Open the destination file for a copy... */ - if ((dst = cupsFileOpen(to, "wb")) == NULL) + if ((dst = cupsdCreateConfFile(to, ConfigFilePerm)) == NULL) { cupsFreeOptions(num_defaults, defaults); cupsFileClose(src); @@ -4678,7 +4677,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ unlink(tempfile); - return (cupsFileClose(dst)); + return (cupsdCloseCreatedConfFile(dst, to)); }