]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/printers.c
The scheduler now validates ErrorPolicy values in config files (STR #4591)
[thirdparty/cups.git] / scheduler / printers.c
index 73e1fba0d71c699d6ac664e04f28805b3f2b5f9a..88391af83046a7545464b47b895b1948bacff284 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Printer routines for the CUPS scheduler.
  *
- * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
  * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  * These coded instructions, statements, and computer programs are the
@@ -180,54 +180,53 @@ cupsdCreateCommonData(void)
                };
   static const int     ops[] =         /* operations-supported values */
                {
-                 IPP_PRINT_JOB,
-                 IPP_VALIDATE_JOB,
-                 IPP_CREATE_JOB,
-                 IPP_SEND_DOCUMENT,
-                 IPP_CANCEL_JOB,
-                 IPP_GET_JOB_ATTRIBUTES,
-                 IPP_GET_JOBS,
-                 IPP_GET_PRINTER_ATTRIBUTES,
-                 IPP_HOLD_JOB,
-                 IPP_RELEASE_JOB,
-                 IPP_RESTART_JOB,
-                 IPP_PAUSE_PRINTER,
-                 IPP_RESUME_PRINTER,
-                 IPP_PURGE_JOBS,
-                 IPP_SET_PRINTER_ATTRIBUTES,
-                 IPP_SET_JOB_ATTRIBUTES,
-                 IPP_GET_PRINTER_SUPPORTED_VALUES,
-                 IPP_CREATE_PRINTER_SUBSCRIPTION,
-                 IPP_CREATE_JOB_SUBSCRIPTION,
-                 IPP_GET_SUBSCRIPTION_ATTRIBUTES,
-                 IPP_GET_SUBSCRIPTIONS,
-                 IPP_RENEW_SUBSCRIPTION,
-                 IPP_CANCEL_SUBSCRIPTION,
-                 IPP_GET_NOTIFICATIONS,
-                 IPP_ENABLE_PRINTER,
-                 IPP_DISABLE_PRINTER,
-                 IPP_HOLD_NEW_JOBS,
-                 IPP_RELEASE_HELD_NEW_JOBS,
-                 IPP_CANCEL_JOBS,
-                 IPP_CANCEL_MY_JOBS,
-                 IPP_CLOSE_JOB,
-                 CUPS_GET_DEFAULT,
-                 CUPS_GET_PRINTERS,
-                 CUPS_ADD_PRINTER,
-                 CUPS_DELETE_PRINTER,
-                 CUPS_GET_CLASSES,
-                 CUPS_ADD_CLASS,
-                 CUPS_DELETE_CLASS,
-                 CUPS_ACCEPT_JOBS,
-                 CUPS_REJECT_JOBS,
-                 CUPS_SET_DEFAULT,
-                 CUPS_GET_DEVICES,
-                 CUPS_GET_PPDS,
-                 CUPS_MOVE_JOB,
-                 CUPS_AUTHENTICATE_JOB,
-                 CUPS_GET_PPD,
-                 CUPS_GET_DOCUMENT,
-                 IPP_RESTART_JOB
+                 IPP_OP_PRINT_JOB,
+                 IPP_OP_VALIDATE_JOB,
+                 IPP_OP_CREATE_JOB,
+                 IPP_OP_SEND_DOCUMENT,
+                 IPP_OP_CANCEL_JOB,
+                 IPP_OP_GET_JOB_ATTRIBUTES,
+                 IPP_OP_GET_JOBS,
+                 IPP_OP_GET_PRINTER_ATTRIBUTES,
+                 IPP_OP_HOLD_JOB,
+                 IPP_OP_RELEASE_JOB,
+                 IPP_OP_PAUSE_PRINTER,
+                 IPP_OP_RESUME_PRINTER,
+                 IPP_OP_PURGE_JOBS,
+                 IPP_OP_SET_PRINTER_ATTRIBUTES,
+                 IPP_OP_SET_JOB_ATTRIBUTES,
+                 IPP_OP_GET_PRINTER_SUPPORTED_VALUES,
+                 IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
+                 IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
+                 IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,
+                 IPP_OP_GET_SUBSCRIPTIONS,
+                 IPP_OP_RENEW_SUBSCRIPTION,
+                 IPP_OP_CANCEL_SUBSCRIPTION,
+                 IPP_OP_GET_NOTIFICATIONS,
+                 IPP_OP_ENABLE_PRINTER,
+                 IPP_OP_DISABLE_PRINTER,
+                 IPP_OP_HOLD_NEW_JOBS,
+                 IPP_OP_RELEASE_HELD_NEW_JOBS,
+                 IPP_OP_CANCEL_JOBS,
+                 IPP_OP_CANCEL_MY_JOBS,
+                 IPP_OP_CLOSE_JOB,
+                 IPP_OP_CUPS_GET_DEFAULT,
+                 IPP_OP_CUPS_GET_PRINTERS,
+                 IPP_OP_CUPS_ADD_MODIFY_PRINTER,
+                 IPP_OP_CUPS_DELETE_PRINTER,
+                 IPP_OP_CUPS_GET_CLASSES,
+                 IPP_OP_CUPS_ADD_MODIFY_CLASS,
+                 IPP_OP_CUPS_DELETE_CLASS,
+                 IPP_OP_CUPS_ACCEPT_JOBS,
+                 IPP_OP_CUPS_REJECT_JOBS,
+                 IPP_OP_CUPS_SET_DEFAULT,
+                 IPP_OP_CUPS_GET_DEVICES,
+                 IPP_OP_CUPS_GET_PPDS,
+                 IPP_OP_CUPS_MOVE_JOB,
+                 IPP_OP_CUPS_AUTHENTICATE_JOB,
+                 IPP_OP_CUPS_GET_PPD,
+                 IPP_OP_CUPS_GET_DOCUMENT,
+                 IPP_OP_RESTART_JOB
                };
   static const char * const charsets[] =/* charset-supported values */
                {
@@ -885,7 +884,7 @@ cupsdLoadAllPrinters(void)
         cupsdLogMessage(CUPSD_LOG_ERROR,
                        "Syntax error on line %d of printers.conf.", linenum);
     }
-    else if (!_cups_strcasecmp(line, "</Printer>"))
+    else if (!_cups_strcasecmp(line, "</Printer>") || !_cups_strcasecmp(line, "</DefaultPrinter>"))
     {
       if (p != NULL)
       {
@@ -1215,10 +1214,17 @@ cupsdLoadAllPrinters(void)
     else if (!_cups_strcasecmp(line, "ErrorPolicy"))
     {
       if (value)
-        cupsdSetString(&p->error_policy, value);
+      {
+       if (strcmp(value, "retry-current-job") &&
+           strcmp(value, "abort-job") &&
+           strcmp(value, "retry-job") &&
+           strcmp(value, "stop-printer"))
+         cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\" on line %d or printers.conf.", ErrorPolicy, linenum);
+       else
+         cupsdSetString(&p->error_policy, value);
+      }
       else
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Syntax error on line %d of printers.conf.", linenum);
+       cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of printers.conf.", linenum);
     }
     else if (!_cups_strcasecmp(line, "Attribute") && value)
     {
@@ -1426,7 +1432,7 @@ cupsdSaveAllPrinters(void)
     {
       cupsFilePuts(fp, "State Stopped\n");
 
-      if (printer->state_message)
+      if (printer->state_message[0])
         cupsFilePutConf(fp, "StateMessage", printer->state_message);
     }
     else
@@ -1581,7 +1587,10 @@ cupsdSaveAllPrinters(void)
       cupsFilePrintf(fp, "Attribute marker-change-time %ld\n",
                      (long)printer->marker_time);
 
-    cupsFilePuts(fp, "</Printer>\n");
+    if (printer == DefaultPrinter)
+      cupsFilePuts(fp, "</DefaultPrinter>\n");
+    else
+      cupsFilePuts(fp, "</Printer>\n");
   }
 
   cupsdCloseCreatedConfFile(fp, filename);
@@ -2054,10 +2063,8 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
     if ((auth_type = auth->type) == CUPSD_AUTH_DEFAULT)
       auth_type = cupsdDefaultAuthType();
 
-    if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST)
+    if (auth_type == CUPSD_AUTH_BASIC)
       auth_supported = "basic";
-    else if (auth_type == CUPSD_AUTH_DIGEST)
-      auth_supported = "digest";
 #ifdef HAVE_GSSAPI
     else if (auth_type == CUPSD_AUTH_NEGOTIATE)
       auth_supported = "negotiate";
@@ -3485,8 +3492,7 @@ add_printer_formats(cupsd_printer_t *p)   /* I - Printer */
         filter;
         filter = (mime_filter_t *)cupsArrayNext(MimeDatabase->filters))
     {
-      if (filter->dst == p->filetype && filter->filter &&
-         strstr(filter->filter, "PrintJobMgr"))
+      if (filter->dst == p->filetype && strstr(filter->filter, "PrintJobMgr"))
        break;
     }
 
@@ -3685,8 +3691,6 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
   _ppdCacheDestroy(p->pc);
   p->pc = NULL;
 
-  cupsdClearString(&(p->make_model));
-
   if (cache_info.st_mtime >= ppd_info.st_mtime)
   {
     cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Loading %s...", cache_name);
@@ -3710,6 +3714,8 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
 
   cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Loading %s...", ppd_name);
 
+  cupsdClearString(&(p->make_model));
+
   p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS;
   p->type |= CUPS_PRINTER_BW;
 
@@ -4724,14 +4730,12 @@ load_ppd(cupsd_printer_t *p)            /* I - Printer */
 
     pstatus = ppdLastError(&pline);
 
-    cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded!",
-                   p->name);
+    cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded.", p->name);
 
     if (pstatus <= PPD_ALLOC_ERROR)
-      cupsdLogMessage(CUPSD_LOG_ERROR, "%s", strerror(errno));
+      cupsdLogMessage(CUPSD_LOG_ERROR, "%s: %s", ppd_name, strerror(errno));
     else
-      cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d.",
-                     ppdErrorString(pstatus), pline);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d of %s.", ppdErrorString(pstatus), pline, ppd_name);
 
     cupsdLogMessage(CUPSD_LOG_INFO,
                    "Hint: Run \"cupstestppd %s\" and fix any errors.",