Blame cgi-bin/jobs.c

Packit 2fc92b
/*
Packit 2fc92b
 * Job status CGI for CUPS.
Packit 2fc92b
 *
Packit 2fc92b
 * Copyright 2007-2014 by Apple Inc.
Packit 2fc92b
 * Copyright 1997-2006 by Easy Software Products.
Packit 2fc92b
 *
Packit 2fc92b
 * These coded instructions, statements, and computer programs are the
Packit 2fc92b
 * property of Apple Inc. and are protected by Federal copyright
Packit 2fc92b
 * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
Packit 2fc92b
 * which should have been included with this file.  If this file is
Packit 2fc92b
 * missing or damaged, see the license at "http://www.cups.org/".
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * Include necessary headers...
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
#include "cgi-private.h"
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * Local functions...
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void	do_job_op(http_t *http, int job_id, ipp_op_t op);
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'main()' - Main entry for CGI.
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
int					/* O - Exit status */
Packit 2fc92b
main(void)
Packit 2fc92b
{
Packit 2fc92b
  http_t	*http;			/* Connection to the server */
Packit 2fc92b
  const char	*op;			/* Operation name */
Packit 2fc92b
  const char	*job_id_var;		/* Job ID form variable */
Packit 2fc92b
  int		job_id;			/* Job ID */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Get any form variables...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  cgiInitialize();
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Set the web interface section...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  cgiSetVariable("SECTION", "jobs");
Packit 2fc92b
  cgiSetVariable("REFRESH_PAGE", "");
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Connect to the HTTP server...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Get the job ID, if any...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  if ((job_id_var = cgiGetVariable("JOB_ID")) != NULL)
Packit 2fc92b
    job_id = atoi(job_id_var);
Packit 2fc92b
  else
Packit 2fc92b
    job_id = 0;
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Do the operation...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  if ((op = cgiGetVariable("OP")) != NULL && job_id > 0 && cgiIsPOST())
Packit 2fc92b
  {
Packit 2fc92b
   /*
Packit 2fc92b
    * Do the operation...
Packit 2fc92b
    */
Packit 2fc92b
Packit 2fc92b
    if (!strcmp(op, "cancel-job"))
Packit 2fc92b
      do_job_op(http, job_id, IPP_CANCEL_JOB);
Packit 2fc92b
    else if (!strcmp(op, "hold-job"))
Packit 2fc92b
      do_job_op(http, job_id, IPP_HOLD_JOB);
Packit 2fc92b
    else if (!strcmp(op, "move-job"))
Packit 2fc92b
      cgiMoveJobs(http, NULL, job_id);
Packit 2fc92b
    else if (!strcmp(op, "release-job"))
Packit 2fc92b
      do_job_op(http, job_id, IPP_RELEASE_JOB);
Packit 2fc92b
    else if (!strcmp(op, "restart-job"))
Packit 2fc92b
      do_job_op(http, job_id, IPP_RESTART_JOB);
Packit 2fc92b
    else
Packit 2fc92b
    {
Packit 2fc92b
     /*
Packit 2fc92b
      * Bad operation code...  Display an error...
Packit 2fc92b
      */
Packit 2fc92b
Packit 2fc92b
      cgiStartHTML(cgiText(_("Jobs")));
Packit 2fc92b
      cgiCopyTemplateLang("error-op.tmpl");
Packit 2fc92b
      cgiEndHTML();
Packit 2fc92b
    }
Packit 2fc92b
  }
Packit 2fc92b
  else
Packit 2fc92b
  {
Packit 2fc92b
   /*
Packit 2fc92b
    * Show a list of jobs...
Packit 2fc92b
    */
Packit 2fc92b
Packit 2fc92b
    cgiStartHTML(cgiText(_("Jobs")));
Packit 2fc92b
    cgiShowJobs(http, NULL);
Packit 2fc92b
    cgiEndHTML();
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Close the HTTP server connection...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  httpClose(http);
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Return with no errors...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  return (0);
Packit 2fc92b
}
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'do_job_op()' - Do a job operation.
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void
Packit 2fc92b
do_job_op(http_t      *http,		/* I - HTTP connection */
Packit 2fc92b
          int         job_id,		/* I - Job ID */
Packit 2fc92b
	  ipp_op_t    op)		/* I - Operation to perform */
Packit 2fc92b
{
Packit 2fc92b
  ipp_t		*request;		/* IPP request */
Packit 2fc92b
  char		uri[HTTP_MAX_URI];	/* Job URI */
Packit 2fc92b
  const char	*user;			/* Username */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Build a job request, which requires the following
Packit 2fc92b
  * attributes:
Packit 2fc92b
  *
Packit 2fc92b
  *    attributes-charset
Packit 2fc92b
  *    attributes-natural-language
Packit 2fc92b
  *    job-uri or printer-uri (purge-jobs)
Packit 2fc92b
  *    requesting-user-name
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  request = ippNewRequest(op);
Packit 2fc92b
Packit 2fc92b
  snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
Packit 2fc92b
Packit 2fc92b
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
Packit 2fc92b
               NULL, uri);
Packit 2fc92b
Packit 2fc92b
  if ((user = getenv("REMOTE_USER")) == NULL)
Packit 2fc92b
    user = "guest";
Packit 2fc92b
Packit 2fc92b
  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
Packit 2fc92b
               "requesting-user-name", NULL, user);
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Do the request and get back a response...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  ippDelete(cupsDoRequest(http, request, "/jobs"));
Packit 2fc92b
Packit 2fc92b
  if (cupsLastError() <= IPP_OK_CONFLICT && getenv("HTTP_REFERER"))
Packit 2fc92b
  {
Packit 2fc92b
   /*
Packit 2fc92b
    * Redirect successful updates back to the parent page...
Packit 2fc92b
    */
Packit 2fc92b
Packit 2fc92b
    char	url[1024];		/* Encoded URL */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
    strlcpy(url, "5;URL=", sizeof(url));
Packit 2fc92b
    cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6);
Packit 2fc92b
    cgiSetVariable("refresh_page", url);
Packit 2fc92b
  }
Packit 2fc92b
  else if (cupsLastError() == IPP_NOT_AUTHORIZED)
Packit 2fc92b
  {
Packit 2fc92b
    puts("Status: 401\n");
Packit 2fc92b
    exit(0);
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
  cgiStartHTML(cgiText(_("Jobs")));
Packit 2fc92b
Packit 2fc92b
  if (cupsLastError() > IPP_OK_CONFLICT)
Packit 2fc92b
    cgiShowIPPError(_("Job operation failed"));
Packit 2fc92b
  else if (op == IPP_CANCEL_JOB)
Packit 2fc92b
    cgiCopyTemplateLang("job-cancel.tmpl");
Packit 2fc92b
  else if (op == IPP_HOLD_JOB)
Packit 2fc92b
    cgiCopyTemplateLang("job-hold.tmpl");
Packit 2fc92b
  else if (op == IPP_RELEASE_JOB)
Packit 2fc92b
    cgiCopyTemplateLang("job-release.tmpl");
Packit 2fc92b
  else if (op == IPP_RESTART_JOB)
Packit 2fc92b
    cgiCopyTemplateLang("job-restart.tmpl");
Packit 2fc92b
Packit 2fc92b
  cgiEndHTML();
Packit 2fc92b
}