]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cgi-bin/admin.c
Merge changes from CUPS 1.4svn-r7994.
[thirdparty/cups.git] / cgi-bin / admin.c
index 3dea06dedf73a9b9abf82a262704234a82bf60eb..70a57dc5e0e0d7a35bb6fae7101b67b2e4abdb5f 100644 (file)
@@ -910,7 +910,7 @@ do_am_printer(http_t *http,         /* I - HTTP connection */
       */
 
       if (strncmp(attr->values[0].string.text, var, strlen(var)) == 0)
-       cgiSetVariable("DEVICE_URI", attr->values[0].string.text);
+       cgiSetVariable("CURRENT_DEVICE_URI", attr->values[0].string.text);
     }
 
    /*
@@ -957,7 +957,15 @@ do_am_printer(http_t *http,                /* I - HTTP connection */
       */
 
       if (oldinfo)
-       cgiSetIPPVars(oldinfo, NULL, NULL, NULL, 0);
+      {
+        if ((attr = ippFindAttribute(oldinfo, "printer-info",
+                                    IPP_TAG_TEXT)) != NULL)
+          cgiSetVariable("PRINTER_INFO", attr->values[0].string.text);
+
+        if ((attr = ippFindAttribute(oldinfo, "printer-location",
+                                    IPP_TAG_TEXT)) != NULL)
+          cgiSetVariable("PRINTER_LOCATION", attr->values[0].string.text);
+      }
 
       cgiCopyTemplateLang("modify-printer.tmpl");
     }
@@ -1417,9 +1425,9 @@ do_config_server(http_t *http)            /* I - HTTP connection */
                                        /* PreserveJobHistory value */
                        *preserve_job_files,
                                        /* PreserveJobFiles value */
+                       *max_clients,   /* MaxClients value */
                        *max_jobs,      /* MaxJobs value */
-                       *max_log_size,  /* MaxLogSize value */
-                       *val;           /* Value for other setting */
+                       *max_log_size;  /* MaxLogSize value */
     char               local_protocols[255],
                                        /* BrowseLocalProtocols */
                        remote_protocols[255];
@@ -1427,6 +1435,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
 #ifdef HAVE_GSSAPI
     char               default_auth_type[255];
                                        /* DefaultAuthType value */
+    const char         *val;           /* Setting value */ 
 #endif /* HAVE_GSSAPI */
 
 
@@ -1451,9 +1460,13 @@ do_config_server(http_t *http)           /* I - HTTP connection */
       browse_web_if        = cgiGetVariable("BROWSE_WEB_IF") ? "Yes" : "No";
       preserve_job_history = cgiGetVariable("PRESERVE_JOB_HISTORY") ? "Yes" : "No";
       preserve_job_files   = cgiGetVariable("PRESERVE_JOB_FILES") ? "Yes" : "No";
+      max_clients          = cgiGetVariable("MAX_CLIENTS");
       max_jobs             = cgiGetVariable("MAX_JOBS");
       max_log_size         = cgiGetVariable("MAX_LOG_SIZE");
 
+      if (!max_clients || atoi(max_clients) <= 0)
+       max_clients = "100";
+
       if (!max_jobs || atoi(max_jobs) <= 0)
        max_jobs = "500";
 
@@ -1547,7 +1560,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
     {
       val = cupsGetOption("DefaultAuthType", num_settings, settings);
 
-      if (val && !strcasecmp(val, "Negotiate"))
+      if (!val || !strcasecmp(val, "Negotiate"))
         strlcpy(default_auth_type, "Basic", sizeof(default_auth_type));
       else
         strlcpy(default_auth_type, val, sizeof(default_auth_type));
@@ -1592,6 +1605,8 @@ do_config_server(http_t *http)            /* I - HTTP connection */
                strcasecmp(preserve_job_history, "Yes") ||
                cupsGetOption("PreserveJobFiles", num_settings, settings) ||
                strcasecmp(preserve_job_files, "No") ||
+               cupsGetOption("MaxClients", num_settings, settings) ||
+               strcasecmp(max_clients, "100") ||
                cupsGetOption("MaxJobs", num_settings, settings) ||
                strcasecmp(max_jobs, "500") ||
                cupsGetOption("MaxLogSize", num_settings, settings) ||
@@ -1650,6 +1665,10 @@ do_config_server(http_t *http)           /* I - HTTP connection */
            strcasecmp(preserve_job_files, "No"))
          num_settings = cupsAddOption("PreserveJobFiles", preserve_job_files,
                                       num_settings, &settings);
+        if (cupsGetOption("MaxClients", num_settings, settings) ||
+           strcasecmp(max_clients, "100"))
+         num_settings = cupsAddOption("MaxClients", max_clients, num_settings,
+                                      &settings);
         if (cupsGetOption("MaxJobs", num_settings, settings) ||
            strcasecmp(max_jobs, "500"))
          num_settings = cupsAddOption("MaxJobs", max_jobs, num_settings,
@@ -2584,6 +2603,11 @@ do_menu(http_t *http)                    /* I - HTTP connection */
       cgiSetVariable("PRESERVE_JOB_FILES", "CHECKED");
   }
 
+  if ((val = cupsGetOption("MaxClients", num_settings, settings)) == NULL)
+    val = "100";
+
+  cgiSetVariable("MAX_CLIENTS", val);
+
   if ((val = cupsGetOption("MaxJobs", num_settings, settings)) == NULL)
     val = "500";
 
@@ -2860,6 +2884,9 @@ do_set_allowed_users(http_t *http)        /* I - HTTP connection */
       while (*ptr == ',' || isspace(*ptr & 255))
        ptr ++;
 
+      if (!*ptr)
+        break;
+
       if (*ptr == '\'' || *ptr == '\"')
       {
        /*
@@ -2925,6 +2952,9 @@ do_set_allowed_users(http_t *http)        /* I - HTTP connection */
         while (*ptr == ',' || isspace(*ptr & 255))
          ptr ++;
 
+        if (!*ptr)
+         break;
+
         if (*ptr == '\'' || *ptr == '\"')
        {
         /*
@@ -3041,7 +3071,7 @@ do_set_options(http_t *http,              /* I - HTTP connection */
   ppd_option_t *option;                /* Option */
   ppd_coption_t        *coption;               /* Custom option */
   ppd_cparam_t *cparam;                /* Custom parameter */
-  ppd_attr_t   *protocol;              /* cupsProtocol attribute */
+  ppd_attr_t   *ppdattr;               /* PPD attribute */
   const char   *title;                 /* Page title */
 
 
@@ -3069,6 +3099,67 @@ do_set_options(http_t *http,             /* I - HTTP connection */
 
   fprintf(stderr, "DEBUG: printer=\"%s\", uri=\"%s\"...\n", printer, uri);
 
+ /*
+  * If the user clicks on the Auto-Configure button, send an AutoConfigure
+  * command file to the printer...
+  */
+
+  if (cgiGetVariable("AUTOCONFIGURE"))
+  {
+    int                        job_id;         /* Command file job */
+    char               refresh[1024];  /* Refresh URL */
+    http_status_t      status;         /* Document status */
+    static const char  *autoconfigure =/* Command file */
+                       "#CUPS-COMMAND\n"
+                       "AutoConfigure\n";
+
+
+    if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, printer, "Auto-Configure",
+                                0, NULL)) < 1)
+    {
+      cgiSetVariable("ERROR", cgiText(_("Unable to send auto-configure command "
+                                        "to printer driver!")));
+      cgiStartHTML(title);
+      cgiCopyTemplateLang("error.tmpl");
+      cgiEndHTML();
+      return;
+    }
+
+    status = cupsStartDocument(CUPS_HTTP_DEFAULT, printer, job_id,
+                               "AutoConfigure.command", CUPS_FORMAT_COMMAND, 1);
+    if (status == HTTP_CONTINUE)
+      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, autoconfigure,
+                                    strlen(autoconfigure));
+    if (status == HTTP_CONTINUE)
+      cupsFinishDocument(CUPS_HTTP_DEFAULT, printer);
+
+    if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
+    {
+      cgiSetVariable("ERROR", cupsLastErrorString());
+      cgiStartHTML(title);
+      cgiCopyTemplateLang("error.tmpl");
+      cgiEndHTML();
+
+      cupsCancelJob(printer, job_id);
+      return;
+    }
+
+   /*
+    * Redirect successful updates back to the printer page...
+    */
+
+    cgiFormEncode(uri, printer, sizeof(uri));
+    snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=/%s/%s",
+            is_class ? "classes" : "printers", uri);
+    cgiSetVariable("refresh_page", refresh);
+
+    cgiStartHTML(title);
+
+    cgiCopyTemplateLang("printer-configured.tmpl");
+    cgiEndHTML();
+    return;
+  }
+
  /*
   * Get the PPD file...
   */
@@ -3126,6 +3217,23 @@ do_set_options(http_t *http,             /* I - HTTP connection */
 
     fputs("DEBUG: Showing options...\n", stderr);
 
+    if (ppd)
+    {
+      if (ppd->num_filters == 0 ||
+          ((ppdattr = ppdFindAttr(ppd, "cupsCommands", NULL)) != NULL &&
+           ppdattr->value && strstr(ppdattr->value, "AutoConfigure")))
+        cgiSetVariable("HAVE_AUTOCONFIGURE", "YES");
+      else 
+      {
+        for (i = 0; i < ppd->num_filters; i ++)
+         if (!strncmp(ppd->filters[i], "application/vnd.cups-postscript", 31))
+         {
+           cgiSetVariable("HAVE_AUTOCONFIGURE", "YES");
+           break;
+         }
+      }
+    }
+
     cgiStartHTML(cgiText(_("Set Printer Options")));
     cgiCopyTemplateLang("set-printer-options-header.tmpl");
 
@@ -3458,7 +3566,7 @@ do_set_options(http_t *http,              /* I - HTTP connection */
 
     if (ppd && ppd->protocols && strstr(ppd->protocols, "BCP"))
     {
-      protocol = ppdFindAttr(ppd, "cupsProtocol", NULL);
+      ppdattr = ppdFindAttr(ppd, "cupsProtocol", NULL);
 
       cgiSetVariable("GROUP", cgiText(_("PS Binary Protocol")));
       cgiCopyTemplateLang("option-header.tmpl");
@@ -3481,7 +3589,7 @@ do_set_options(http_t *http,              /* I - HTTP connection */
 
       cgiSetVariable("KEYWORD", "protocol");
       cgiSetVariable("KEYTEXT", cgiText(_("PS Binary Protocol")));
-      cgiSetVariable("DEFCHOICE", protocol ? protocol->value : "None");
+      cgiSetVariable("DEFCHOICE", ppdattr ? ppdattr->value : "None");
 
       cgiCopyTemplateLang("option-pickone.tmpl");