• Home
  • Raw
  • Download

Lines Matching +full:job +full:- +full:name

4  * Copyright © 2007-2021 by Apple Inc.
5 * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
19 #include <cups/ppd-private.h>
25 extern int mbr_user_name_to_uuid(const char* name, uuid_t uu);
26 extern int mbr_group_name_to_uuid(const char* name, uuid_t uu);
37 static int add_file(cupsd_client_t *con, cupsd_job_t *job,
41 static void add_job_subscriptions(cupsd_client_t *con, cupsd_job_t *job);
42 static void add_job_uuid(cupsd_job_t *job);
48 cupsd_job_t *job);
59 static int copy_banner(cupsd_client_t *con, cupsd_job_t *job,
60 const char *name);
65 cupsd_job_t *job,
107 static void save_auth_info(cupsd_client_t *con, cupsd_job_t *job,
123 static int validate_name(const char *name);
124 static int validate_user(cupsd_job_t *job, cupsd_client_t *con, const char *owner, char *username, …
128 * 'cupsdProcessIPPRequest()' - Process an incoming IPP request.
131 int /* O - 1 on success, 0 on failure */
133 cupsd_client_t *con) /* I - Client connection */ in cupsdProcessIPPRequest()
139 ipp_attribute_t *uri = NULL; /* Printer or job URI attribute */ in cupsdProcessIPPRequest()
140 ipp_attribute_t *username; /* requesting-user-name attr */ in cupsdProcessIPPRequest()
145 …[%d]): operation_id=%04x(%s)", con, con->number, con->request->request.op.operation_id, ippOpStrin… in cupsdProcessIPPRequest()
149 …r (group = IPP_TAG_ZERO, attr = ippFirstAttribute(con->request); attr; attr = ippNextAttribute(con in cupsdProcessIPPRequest()
151 const char *name; /* Attribute name */ in cupsdProcessIPPRequest() local
161 if ((name = ippGetName(attr)) == NULL) in cupsdProcessIPPRequest()
166 …cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdProcessIPPRequest: %s %s%s '%s'", name, ippGetCount(attr) … in cupsdProcessIPPRequest()
174 con->response = ippNew(); in cupsdProcessIPPRequest()
176 con->response->request.status.version[0] = con->request->request.op.version[0]; in cupsdProcessIPPRequest()
177 con->response->request.status.version[1] = con->request->request.op.version[1]; in cupsdProcessIPPRequest()
178 con->response->request.status.request_id = con->request->request.op.request_id; in cupsdProcessIPPRequest()
184 if (con->request->request.any.version[0] != 1 && con->request->request.any.version[0] != 2) in cupsdProcessIPPRequest()
190 …PP_STATUS_ERROR_VERSION_NOT_SUPPORTED, con->http->hostname, con->request->request.any.version[0], … in cupsdProcessIPPRequest()
192 …PPORTED, _("Bad request version number %d.%d."), con->request->request.any.version[0], con->reques… in cupsdProcessIPPRequest()
194 else if (con->request->request.any.request_id < 1) in cupsdProcessIPPRequest()
197 * Return an error, since request IDs must be between 1 and 2^31-1 in cupsdProcessIPPRequest()
200 …04X %s Bad request ID %d.", IPP_STATUS_ERROR_BAD_REQUEST, con->http->hostname, con->request->reque… in cupsdProcessIPPRequest()
202 …send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad request ID %d."), con->request->request.… in cupsdProcessIPPRequest()
204 else if (!con->request->attrs) in cupsdProcessIPPRequest()
206 …ULL, NULL, "%04X %s No attributes in request.", IPP_STATUS_ERROR_BAD_REQUEST, con->http->hostname); in cupsdProcessIPPRequest()
217 for (attr = con->request->attrs, group = attr->group_tag; in cupsdProcessIPPRequest()
219 attr = attr->next) in cupsdProcessIPPRequest()
220 if (attr->group_tag < group && attr->group_tag != IPP_TAG_ZERO) in cupsdProcessIPPRequest()
226 …L, "%04X %s Attribute groups are out of order", IPP_STATUS_ERROR_BAD_REQUEST, con->http->hostname); in cupsdProcessIPPRequest()
228 …ATUS_ERROR_BAD_REQUEST, _("Attribute groups are out of order (%x < %x)."), attr->group_tag, group); in cupsdProcessIPPRequest()
232 group = attr->group_tag; in cupsdProcessIPPRequest()
239 * attributes-charset in cupsdProcessIPPRequest()
240 * attributes-natural-language in cupsdProcessIPPRequest()
241 * printer-uri/job-uri in cupsdProcessIPPRequest()
244 attr = con->request->attrs; in cupsdProcessIPPRequest()
245 …if (attr && attr->name && !strcmp(attr->name, "attributes-charset") && (attr->value_tag & IPP_TAG_… in cupsdProcessIPPRequest()
251 attr = attr->next; in cupsdProcessIPPRequest()
253 … (attr && attr->name && !strcmp(attr->name, "attributes-natural-language") && (attr->value_tag & I… in cupsdProcessIPPRequest()
258 * Reset language for this request if different from Accept-Language. in cupsdProcessIPPRequest()
261 if (!con->language || in cupsdProcessIPPRequest()
262 strcmp(attr->values[0].string.text, con->language->language)) in cupsdProcessIPPRequest()
264 cupsLangFree(con->language); in cupsdProcessIPPRequest()
265 con->language = cupsLangGet(attr->values[0].string.text); in cupsdProcessIPPRequest()
271 …if ((attr = ippFindAttribute(con->request, "printer-uri", IPP_TAG_URI)) != NULL && attr->group_tag… in cupsdProcessIPPRequest()
273 …else if ((attr = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI)) != NULL && attr->group_ta… in cupsdProcessIPPRequest()
275 … if (con->request->request.op.operation_id == CUPS_GET_PPD && (attr = ippFindAttribute(con->reques… in cupsdProcessIPPRequest()
281 …ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, charse… in cupsdProcessIPPRequest()
283 …ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8… in cupsdProcessIPPRequest()
286 …ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NU… in cupsdProcessIPPRequest()
288 …ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NU… in cupsdProcessIPPRequest()
290 …t && _cups_strcasecmp(charset->values[0].string.text, "us-ascii") && _cups_strcasecmp(charset->val… in cupsdProcessIPPRequest()
297 charset->values[0].string.text); in cupsdProcessIPPRequest()
298 …ULL, "%04X %s Unsupported attributes-charset value \"%s\".", IPP_STATUS_ERROR_CHARSET, con->http->… in cupsdProcessIPPRequest()
299 …send_ipp_status(con, IPP_STATUS_ERROR_CHARSET, _("Unsupported character set \"%s\"."), charset->va… in cupsdProcessIPPRequest()
303 con->request->request.op.operation_id != CUPS_GET_DEFAULT && in cupsdProcessIPPRequest()
304 con->request->request.op.operation_id != CUPS_GET_PRINTERS && in cupsdProcessIPPRequest()
305 con->request->request.op.operation_id != CUPS_GET_CLASSES && in cupsdProcessIPPRequest()
306 con->request->request.op.operation_id != CUPS_GET_DEVICES && in cupsdProcessIPPRequest()
307 con->request->request.op.operation_id != CUPS_GET_PPDS)) in cupsdProcessIPPRequest()
310 * Return an error, since attributes-charset, in cupsdProcessIPPRequest()
311 * attributes-natural-language, and printer-uri/job-uri are required in cupsdProcessIPPRequest()
317 cupsdLogMessage(CUPSD_LOG_ERROR, "Missing attributes-charset attribute."); in cupsdProcessIPPRequest()
319 …UDIT, NULL, NULL, "%04X %s Missing attributes-charset attribute.", IPP_STATUS_ERROR_BAD_REQUEST, c… in cupsdProcessIPPRequest()
325 "Missing attributes-natural-language attribute."); in cupsdProcessIPPRequest()
327 …, NULL, NULL, "%04X %s Missing attributes-natural-language attribute.", IPP_STATUS_ERROR_BAD_REQUE… in cupsdProcessIPPRequest()
332 cupsdLogMessage(CUPSD_LOG_ERROR, "Missing printer-uri, job-uri, or ppd-name attribute."); in cupsdProcessIPPRequest()
334 …NULL, NULL, "%04X %s Missing printer-uri, job-uri, or ppd-name attribute.", IPP_STATUS_ERROR_BAD_R… in cupsdProcessIPPRequest()
339 for (attr = con->request->attrs; attr; attr = attr->next) in cupsdProcessIPPRequest()
342 attr->name ? attr->name : "(null)", attr->group_tag, in cupsdProcessIPPRequest()
343 attr->value_tag); in cupsdProcessIPPRequest()
353 * OK, all the checks pass so far; validate "requesting-user-name" in cupsdProcessIPPRequest()
357 … if ((username = ippFindAttribute(con->request, "requesting-user-name", IPP_TAG_ZERO)) != NULL) in cupsdProcessIPPRequest()
360 * Validate "requesting-user-name"... in cupsdProcessIPPRequest()
363 if (username->group_tag != IPP_TAG_OPERATION && StrictConformance) in cupsdProcessIPPRequest()
365 …T, NULL, NULL, "%04X %s \"requesting-user-name\" attribute in wrong group.", IPP_STATUS_ERROR_BAD_… in cupsdProcessIPPRequest()
366 …send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("\"requesting-user-name\" attribute in wrong … in cupsdProcessIPPRequest()
369 else if (username->value_tag != IPP_TAG_NAME && username->value_tag != IPP_TAG_NAMELANG) in cupsdProcessIPPRequest()
371 …L, NULL, "%04X %s \"requesting-user-name\" attribute with wrong syntax.", IPP_STATUS_ERROR_ATTRIBU… in cupsdProcessIPPRequest()
372 …send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("\"requesting-user-name\" attribute … in cupsdProcessIPPRequest()
373 if ((attr = ippCopyAttribute(con->response, username, 0)) != NULL) in cupsdProcessIPPRequest()
374 attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP; in cupsdProcessIPPRequest()
379 …LL, NULL, "%04X %s \"requesting-user-name\" attribute with bad value.", IPP_STATUS_ERROR_ATTRIBUTE… in cupsdProcessIPPRequest()
387 …send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("\"requesting-user-name\" attribute … in cupsdProcessIPPRequest()
388 if ((attr = ippCopyAttribute(con->response, username, 0)) != NULL) in cupsdProcessIPPRequest()
389 attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP; in cupsdProcessIPPRequest()
395 * Map bad "requesting-user-name" to 'anonymous'... in cupsdProcessIPPRequest()
398 ippSetString(con->request, &username, 0, "anonymous"); in cupsdProcessIPPRequest()
401 …else if (!strcmp(username->values[0].string.text, "root") && _cups_strcasecmp(con->http->hostname,… in cupsdProcessIPPRequest()
407 ippSetString(con->request, &username, 0, RemoteRoot); in cupsdProcessIPPRequest()
411 … if ((attr = ippFindAttribute(con->request, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL) in cupsdProcessIPPRequest()
412 sub_id = attr->values[0].integer; in cupsdProcessIPPRequest()
423 …upsdLogMessage(CUPSD_LOG_DEBUG, "%s %s", ippOpString(con->request->request.op.operation_id), uri->… in cupsdProcessIPPRequest()
425 cupsdLogMessage(CUPSD_LOG_DEBUG, "%s", ippOpString(con->request->request.op.operation_id)); in cupsdProcessIPPRequest()
427 switch (con->request->request.op.operation_id) in cupsdProcessIPPRequest()
607 …_ERROR_OPERATION_NOT_SUPPORTED, con->http->hostname, con->request->request.op.operation_id, ippOpS… in cupsdProcessIPPRequest()
609 …_ERROR_OPERATION_NOT_SUPPORTED, _("%s not supported."), ippOpString(con->request->request.op.opera… in cupsdProcessIPPRequest()
617 if (con->response) in cupsdProcessIPPRequest()
623->response->request.status.status_code >= IPP_STATUS_ERROR_BAD_REQUEST && con->response->request.s… in cupsdProcessIPPRequest()
625 httpClearFields(con->http); in cupsdProcessIPPRequest()
636 if (con->http->version == HTTP_1_1) in cupsdProcessIPPRequest()
638 cupsdLogClient(con, CUPSD_LOG_DEBUG, "Transfer-Encoding: chunked"); in cupsdProcessIPPRequest()
639 cupsdSetLength(con->http, 0); in cupsdProcessIPPRequest()
647 length = ippLength(con->response); in cupsdProcessIPPRequest()
649 if (con->file >= 0 && !con->pipe_pid) in cupsdProcessIPPRequest()
653 if (!fstat(con->file, &fileinfo)) in cupsdProcessIPPRequest()
657 cupsdLogClient(con, CUPSD_LOG_DEBUG, "Content-Length: " CUPS_LLFMT, CUPS_LLCAST length); in cupsdProcessIPPRequest()
658 httpSetLength(con->http, length); in cupsdProcessIPPRequest()
667 …cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, (cupsd_selfunc_t)cupsdWrite… in cupsdProcessIPPRequest()
683 * Sending data from a subprocess like cups-deviced; tell the caller in cupsdProcessIPPRequest()
684 * everything is A-OK so far... in cupsdProcessIPPRequest()
693 * 'cupsdTimeoutJob()' - Timeout a job waiting on job files.
696 int /* O - 0 on success, -1 on error */
697 cupsdTimeoutJob(cupsd_job_t *job) /* I - Job to timeout */ in cupsdTimeoutJob() argument
700 ipp_attribute_t *attr; /* job-sheets attribute */ in cupsdTimeoutJob()
704 job->pending_timeout = 0; in cupsdTimeoutJob()
710 if (!cupsdLoadJob(job)) in cupsdTimeoutJob()
711 return (-1); in cupsdTimeoutJob()
713 printer = cupsdFindDest(job->dest); in cupsdTimeoutJob()
714 attr = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); in cupsdTimeoutJob()
716 if (printer && !(printer->type & CUPS_PRINTER_REMOTE) && in cupsdTimeoutJob()
717 attr && attr->num_values > 1) in cupsdTimeoutJob()
723 cupsdLogJob(job, CUPSD_LOG_INFO, "Adding end banner page \"%s\".", in cupsdTimeoutJob()
724 attr->values[1].string.text); in cupsdTimeoutJob()
726 if ((kbytes = copy_banner(NULL, job, attr->values[1].string.text)) < 0) in cupsdTimeoutJob()
727 return (-1); in cupsdTimeoutJob()
729 cupsdUpdateQuota(printer, job->username, 0, kbytes); in cupsdTimeoutJob()
737 * 'accept_jobs()' - Accept print jobs to a printer.
741 accept_jobs(cupsd_client_t *con, /* I - Client connection */ in accept_jobs()
742 ipp_attribute_t *uri) /* I - Printer or class URI */ in accept_jobs()
750 con->number, uri->values[0].string.text); in accept_jobs()
756 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in accept_jobs()
771 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in accept_jobs()
781 printer->accepting = 1; in accept_jobs()
782 printer->state_message[0] = '\0'; in accept_jobs()
792 printer->name, get_username(con)); in accept_jobs()
800 printer->name, get_username(con)); in accept_jobs()
807 con->response->request.status.status_code = IPP_OK; in accept_jobs()
812 * 'add_class()' - Add a class to the system.
816 add_class(cupsd_client_t *con, /* I - Client connection */ in add_class()
817 ipp_attribute_t *uri) /* I - URI of class */ in add_class()
830 int modify; /* Non-zero if we just modified */ in add_class()
831 int need_restart_job; /* Need to restart job? */ in add_class()
835 con->number, uri->values[0].string.text); in add_class()
841 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in add_class()
853 _("The printer-uri must be of the form " in add_class()
859 * Do we have a valid printer name? in add_class()
869 _("The printer-uri \"%s\" contains invalid characters."), in add_class()
870 uri->values[0].string.text); in add_class()
881 * Class doesn't exist; see if we have a printer of the same name... in add_class()
909 pclass->printer_id = NextPrinterId ++; in add_class()
911 else if ((status = cupsdCheckPolicy(pclass->op_policy_ptr, con, in add_class()
926 if ((attr = ippFindAttribute(con->request, "printer-location", IPP_TAG_TEXT)) != NULL) in add_class()
927 cupsdSetString(&pclass->location, attr->values[0].string.text); in add_class()
929 …if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strnc… in add_class()
930 cupsdSetString(&pclass->geo_location, attr->values[0].string.text); in add_class()
932 if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL) in add_class()
933 cupsdSetString(&pclass->organization, attr->values[0].string.text); in add_class()
935 if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL) in add_class()
936 cupsdSetString(&pclass->organizational_unit, attr->values[0].string.text); in add_class()
938 if ((attr = ippFindAttribute(con->request, "printer-info", in add_class()
940 cupsdSetString(&pclass->info, attr->values[0].string.text); in add_class()
942 if ((attr = ippFindAttribute(con->request, "printer-is-accepting-jobs", in add_class()
944 attr->values[0].boolean != pclass->accepting) in add_class()
947 "Setting %s printer-is-accepting-jobs to %d (was %d.)", in add_class()
948 pclass->name, attr->values[0].boolean, pclass->accepting); in add_class()
950 pclass->accepting = attr->values[0].boolean; in add_class()
953 pclass->accepting ? "Now" : "No longer"); in add_class()
956 if ((attr = ippFindAttribute(con->request, "printer-is-shared", IPP_TAG_BOOLEAN)) != NULL) in add_class()
958 if (pclass->type & CUPS_PRINTER_REMOTE) in add_class()
961 * Cannot re-share remote printers. in add_class()
964 … send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues.")); in add_class()
971 if (pclass->shared && !ippGetBoolean(attr, 0)) in add_class()
975 "Setting %s printer-is-shared to %d (was %d.)", in add_class()
976 pclass->name, attr->values[0].boolean, pclass->shared); in add_class()
978 pclass->shared = ippGetBoolean(attr, 0); in add_class()
981 if ((attr = ippFindAttribute(con->request, "printer-state", in add_class()
984 if (attr->values[0].integer != IPP_PRINTER_IDLE && in add_class()
985 attr->values[0].integer != IPP_PRINTER_STOPPED) in add_class()
988 _("Attempt to set %s printer-state to bad value %d."), in add_class()
989 pclass->name, attr->values[0].integer); in add_class()
996 cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", in add_class()
997 pclass->name, attr->values[0].integer, pclass->state); in add_class()
999 if (attr->values[0].integer == IPP_PRINTER_STOPPED) in add_class()
1003 cupsdSetPrinterState(pclass, (ipp_pstate_t)(attr->values[0].integer), 0); in add_class()
1007 if ((attr = ippFindAttribute(con->request, "printer-state-message", in add_class()
1010 strlcpy(pclass->state_message, attr->values[0].string.text, in add_class()
1011 sizeof(pclass->state_message)); in add_class()
1014 pclass->state_message); in add_class()
1016 if ((attr = ippFindAttribute(con->request, "member-uris", in add_class()
1025 if (pclass->num_printers > 0) in add_class()
1027 free(pclass->printers); in add_class()
1028 pclass->num_printers = 0; in add_class()
1035 for (i = 0; i < attr->num_values; i ++) in add_class()
1041 if (!cupsdValidateDest(attr->values[i].string.text, &dtype, &member)) in add_class()
1080 if ((attr = ippFindAttribute(con->request, "auth-info-required", in add_class()
1084 pclass->config_time = time(NULL); in add_class()
1093 if (need_restart_job && pclass->job) in add_class()
1096 * Reset the current job to a "pending" status... in add_class()
1099 cupsdSetJobState(pclass->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, in add_class()
1100 "Job restarted because the class was modified."); in add_class()
1109 pclass->name, get_username(con)); in add_class()
1112 pclass->name, get_username(con)); in add_class()
1118 pclass->name, get_username(con)); in add_class()
1121 pclass->name, get_username(con)); in add_class()
1124 con->response->request.status.status_code = IPP_OK; in add_class()
1129 * 'add_file()' - Add a file to a job.
1132 static int /* O - 0 on success, -1 on error */
1133 add_file(cupsd_client_t *con, /* I - Connection to client */ in add_file()
1134 cupsd_job_t *job, /* I - Job to add to */ in add_file() argument
1135 mime_type_t *filetype, /* I - Type of file */ in add_file()
1136 int compression) /* I - Compression */ in add_file()
1143 "add_file(con=%p[%d], job=%d, filetype=%s/%s, " in add_file()
1144 "compression=%d)", con, con ? con->number : -1, job->id, in add_file()
1145 filetype->super, filetype->type, compression); in add_file()
1148 * Add the file to the job... in add_file()
1151 if (job->num_files == 0) in add_file()
1158 compressions = (int *)realloc(job->compressions, in add_file()
1159 (size_t)(job->num_files + 1) * sizeof(int)); in add_file()
1160 filetypes = (mime_type_t **)realloc(job->filetypes, in add_file()
1161 (size_t)(job->num_files + 1) * in add_file()
1166 job->compressions = compressions; in add_file()
1169 job->filetypes = filetypes; in add_file()
1173 cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, in add_file()
1174 "Job aborted because the scheduler ran out of memory."); in add_file()
1180 return (-1); in add_file()
1183 job->compressions[job->num_files] = compression; in add_file()
1184 job->filetypes[job->num_files] = filetype; in add_file()
1186 job->num_files ++; in add_file()
1188 job->dirty = 1; in add_file()
1196 * 'add_job()' - Add a job to a print queue.
1199 static cupsd_job_t * /* O - Job object */
1200 add_job(cupsd_client_t *con, /* I - Client connection */ in add_job()
1201 cupsd_printer_t *printer, /* I - Destination printer */ in add_job()
1202 mime_type_t *filetype) /* I - First print file type, if any */ in add_job()
1206 *auth_info; /* auth-info attribute */ in add_job()
1207 const char *mandatory; /* Current mandatory job attribute */ in add_job()
1209 int priority; /* Job priority */ in add_job()
1210 cupsd_job_t *job; /* Current job */ in add_job() local
1211 char job_uri[HTTP_MAX_URI]; /* Job URI */ in add_job()
1216 ipp_attribute_t *media_col, /* media-col attribute */ in add_job()
1217 *media_margin; /* media-*-margin attribute */ in add_job()
1218 ipp_t *unsup_col; /* media-col in unsupported response */ in add_job()
1219 static const char * const readonly[] =/* List of read-only attributes */ in add_job()
1221 "date-time-at-completed", in add_job()
1222 "date-time-at-creation", in add_job()
1223 "date-time-at-processing", in add_job()
1224 "job-detailed-status-messages", in add_job()
1225 "job-document-access-errors", in add_job()
1226 "job-id", in add_job()
1227 "job-impressions-completed", in add_job()
1228 "job-k-octets-completed", in add_job()
1229 "job-media-sheets-completed", in add_job()
1230 "job-pages-completed", in add_job()
1231 "job-printer-up-time", in add_job()
1232 "job-printer-uri", in add_job()
1233 "job-state", in add_job()
1234 "job-state-message", in add_job()
1235 "job-state-reasons", in add_job()
1236 "job-uri", in add_job()
1237 "number-of-documents", in add_job()
1238 "number-of-intervening-jobs", in add_job()
1239 "output-device-assigned", in add_job()
1240 "time-at-completed", in add_job()
1241 "time-at-creation", in add_job()
1242 "time-at-processing" in add_job()
1247 con, con->number, printer, printer->name, in add_job()
1248 filetype, filetype ? filetype->super : "none", in add_job()
1249 filetype ? filetype->type : "none"); in add_job()
1252 * Check remote printing to non-shared printer... in add_job()
1255 if (!printer->shared && in add_job()
1256 _cups_strcasecmp(con->http->hostname, "localhost") && in add_job()
1257 _cups_strcasecmp(con->http->hostname, ServerName)) in add_job()
1268 auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); in add_job()
1270 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in add_job()
1275 else if (printer->num_auth_info_required == 1 && in add_job()
1276 !strcmp(printer->auth_info_required[0], "negotiate") && in add_job()
1277 !con->username[0]) in add_job()
1283 else if (auth_info && !con->http->tls && in add_job()
1284 !httpAddrLocalhost(con->http->hostaddr)) in add_job()
1287 * Require encryption of auth-info over non-local connections... in add_job()
1299 if (!printer->accepting) in add_job()
1303 printer->name); in add_job()
1308 * Validate job template attributes; for now just document-format, in add_job()
1309 * copies, job-sheets, number-up, page-ranges, mandatory attributes, and in add_job()
1315 if ((attr = ippFindAttribute(con->request, readonly[i], IPP_TAG_ZERO)) != NULL) in add_job()
1317 ippDeleteAttribute(con->request, attr); in add_job()
1321 …send_ipp_status(con, IPP_BAD_REQUEST, _("The '%s' Job Status attribute cannot be supplied in a job in add_job()
1325 …cupsdLogMessage(CUPSD_LOG_INFO, "Unexpected '%s' Job Status attribute in a job creation request.",… in add_job()
1329 if (printer->pc) in add_job()
1331 for (mandatory = (char *)cupsArrayFirst(printer->pc->mandatory); in add_job()
1333 mandatory = (char *)cupsArrayNext(printer->pc->mandatory)) in add_job()
1335 if (!ippFindAttribute(con->request, mandatory, IPP_TAG_ZERO)) in add_job()
1349 if (filetype && printer->filetypes && in add_job()
1350 !cupsArrayFind(printer->filetypes, filetype)) in add_job()
1356 snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, in add_job()
1357 filetype->type); in add_job()
1362 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, in add_job()
1363 "document-format", NULL, mimetype); in add_job()
1368 if ((attr = ippFindAttribute(con->request, "copies", in add_job()
1371 if (attr->values[0].integer < 1 || attr->values[0].integer > MaxCopies) in add_job()
1374 attr->values[0].integer); in add_job()
1375 ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, in add_job()
1376 "copies", attr->values[0].integer); in add_job()
1381 if ((attr = ippFindAttribute(con->request, "job-sheets", in add_job()
1384 if (attr->value_tag != IPP_TAG_KEYWORD && in add_job()
1385 attr->value_tag != IPP_TAG_NAME) in add_job()
1387 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-sheets value type.")); in add_job()
1391 if (attr->num_values > 2) in add_job()
1394 _("Too many job-sheets values (%d > 2)."), in add_job()
1395 attr->num_values); in add_job()
1399 for (i = 0; i < attr->num_values; i ++) in add_job()
1400 if (strcmp(attr->values[i].string.text, "none") && in add_job()
1401 !cupsdFindBanner(attr->values[i].string.text)) in add_job()
1403 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-sheets value \"%s\"."), in add_job()
1404 attr->values[i].string.text); in add_job()
1409 if ((attr = ippFindAttribute(con->request, "number-up", in add_job()
1412 if (attr->values[0].integer != 1 && in add_job()
1413 attr->values[0].integer != 2 && in add_job()
1414 attr->values[0].integer != 4 && in add_job()
1415 attr->values[0].integer != 6 && in add_job()
1416 attr->values[0].integer != 9 && in add_job()
1417 attr->values[0].integer != 16) in add_job()
1419 send_ipp_status(con, IPP_ATTRIBUTES, _("Bad number-up value %d."), in add_job()
1420 attr->values[0].integer); in add_job()
1421 ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, in add_job()
1422 "number-up", attr->values[0].integer); in add_job()
1427 if ((attr = ippFindAttribute(con->request, "page-ranges", in add_job()
1430 for (i = 0, lowerpagerange = 1; i < attr->num_values; i ++) in add_job()
1432 if (attr->values[i].range.lower < lowerpagerange || in add_job()
1433 attr->values[i].range.lower > attr->values[i].range.upper) in add_job()
1436 _("Bad page-ranges values %d-%d."), in add_job()
1437 attr->values[i].range.lower, in add_job()
1438 attr->values[i].range.upper); in add_job()
1442 lowerpagerange = attr->values[i].range.upper + 1; in add_job()
1450 if (!ippFindAttribute(con->request, "PageRegion", IPP_TAG_ZERO) && in add_job()
1451 !ippFindAttribute(con->request, "PageSize", IPP_TAG_ZERO) && in add_job()
1452 _ppdCacheGetPageSize(printer->pc, con->request, NULL, &exact)) in add_job()
1455 (media_col = ippFindAttribute(con->request, "media-col", in add_job()
1461 if ((media_margin = ippFindAttribute(media_col->values[0].collection, in add_job()
1462 "media-bottom-margin", in add_job()
1465 "media-bottom-margin", media_margin->values[0].integer); in add_job()
1467 if ((media_margin = ippFindAttribute(media_col->values[0].collection, in add_job()
1468 "media-left-margin", in add_job()
1471 "media-left-margin", media_margin->values[0].integer); in add_job()
1473 if ((media_margin = ippFindAttribute(media_col->values[0].collection, in add_job()
1474 "media-right-margin", in add_job()
1477 "media-right-margin", media_margin->values[0].integer); in add_job()
1479 if ((media_margin = ippFindAttribute(media_col->values[0].collection, in add_job()
1480 "media-top-margin", in add_job()
1483 "media-top-margin", media_margin->values[0].integer); in add_job()
1485 ippAddCollection(con->response, IPP_TAG_UNSUPPORTED_GROUP, "media-col", in add_job()
1516 * Create the job and set things up... in add_job()
1519 if ((attr = ippFindAttribute(con->request, "job-priority", in add_job()
1521 priority = attr->values[0].integer; in add_job()
1524 if ((val = cupsGetOption("job-priority", printer->num_options, in add_job()
1525 printer->options)) != NULL) in add_job()
1530 ippAddInteger(con->request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority", in add_job()
1534 if ((attr = ippFindAttribute(con->request, "job-name", IPP_TAG_ZERO)) == NULL) in add_job()
1535 ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled"); in add_job()
1536 else if ((attr->value_tag != IPP_TAG_NAME && in add_job()
1537 attr->value_tag != IPP_TAG_NAMELANG) || in add_job()
1538 attr->num_values != 1) in add_job()
1541 _("Bad job-name value: Wrong type or count.")); in add_job()
1542 if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL) in add_job()
1543 attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP; in add_job()
1549 ippDeleteAttribute(con->request, attr); in add_job()
1551 ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled"); in add_job()
1555 send_ipp_status(con, IPP_ATTRIBUTES, _("Bad job-name value: %s"), in add_job()
1558 if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL) in add_job()
1559 attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP; in add_job()
1565 ippDeleteAttribute(con->request, attr); in add_job()
1567 ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled"); in add_job()
1570 attr = ippFindAttribute(con->request, "requesting-user-name", IPP_TAG_NAME); in add_job()
1572 if ((job = cupsdAddJob(priority, printer->name)) == NULL) in add_job()
1575 _("Unable to add job for destination \"%s\"."), in add_job()
1576 printer->name); in add_job()
1580 job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE); in add_job()
1581 job->attrs = con->request; in add_job()
1582 job->dirty = 1; in add_job()
1583 con->request = ippNewRequest(job->attrs->request.op.operation_id); in add_job()
1587 add_job_uuid(job); in add_job()
1588 apply_printer_defaults(printer, job); in add_job()
1590 if (con->username[0]) in add_job()
1592 cupsdSetString(&job->username, con->username); in add_job()
1595 ippSetString(job->attrs, &attr, 0, con->username); in add_job()
1600 "add_job: requesting-user-name=\"%s\"", in add_job()
1601 attr->values[0].string.text); in add_job()
1603 cupsdSetString(&job->username, attr->values[0].string.text); in add_job()
1606 cupsdSetString(&job->username, "anonymous"); in add_job()
1609 ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, in add_job()
1610 "job-originating-user-name", NULL, job->username); in add_job()
1613 ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB); in add_job()
1614 ippSetName(job->attrs, &attr, "job-originating-user-name"); in add_job()
1617 if (con->username[0] || auth_info) in add_job()
1619 save_auth_info(con, job, auth_info); in add_job()
1622 * Remove the auth-info attribute from the attribute data... in add_job()
1626 ippDeleteAttribute(job->attrs, auth_info); in add_job()
1629 if ((attr = ippFindAttribute(con->request, "job-name", IPP_TAG_NAME)) != NULL) in add_job()
1630 cupsdSetString(&(job->name), attr->values[0].string.text); in add_job()
1632 if ((attr = ippFindAttribute(job->attrs, "job-originating-host-name", in add_job()
1636 * Request contains a job-originating-host-name attribute; validate it... in add_job()
1639 if (attr->value_tag != IPP_TAG_NAME || in add_job()
1640 attr->num_values != 1 || in add_job()
1641 strcmp(con->http->hostname, "localhost")) in add_job()
1645 * Also, we can only have 1 value and it must be a name value. in add_job()
1648 ippDeleteAttribute(job->attrs, attr); in add_job()
1649 …ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-host-name", NULL, con->http->… in add_job()
1652 ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB); in add_job()
1657 * No job-originating-host-name attribute, so use the hostname from in add_job()
1661 ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, in add_job()
1662 "job-originating-host-name", NULL, con->http->hostname); in add_job()
1665 ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed"); in add_job()
1666 ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(NULL))); in add_job()
1667 ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing"); in add_job()
1668 ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "time-at-completed"); in add_job()
1669 ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", time(NULL)); in add_job()
1670 ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "time-at-processing"); in add_job()
1673 * Add remaining job attributes... in add_job()
1676 ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); in add_job()
1677 job->state = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_ENUM, in add_job()
1678 "job-state", IPP_JOB_STOPPED); in add_job()
1679 job->state_value = (ipp_jstate_t)job->state->values[0].integer; in add_job()
1680 job->reasons = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, in add_job()
1681 "job-state-reasons", NULL, "job-incoming"); in add_job()
1682job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-comple… in add_job()
1683 job->sheets = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, in add_job()
1684 "job-media-sheets-completed", 0); in add_job()
1685 ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, in add_job()
1686 printer->uri); in add_job()
1688 if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL) in add_job()
1689 attr->values[0].integer = 0; in add_job()
1691 ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", 0); in add_job()
1693 if ((attr = ippFindAttribute(job->attrs, "job-hold-until", in add_job()
1695 attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); in add_job()
1698 if ((val = cupsGetOption("job-hold-until", printer->num_options, in add_job()
1699 printer->options)) == NULL) in add_job()
1700 val = "no-hold"; in add_job()
1702 attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, in add_job()
1703 "job-hold-until", NULL, val); in add_job()
1706 if (printer->holding_new_jobs) in add_job()
1712 if (attr && strcmp(attr->values[0].string.text, "no-hold")) in add_job()
1713 cupsdSetJobHoldUntil(job, ippGetString(attr, 0, NULL), 0); in add_job()
1715 cupsdSetJobHoldUntil(job, "indefinite", 0); in add_job()
1717 job->state->values[0].integer = IPP_JOB_HELD; in add_job()
1718 job->state_value = IPP_JOB_HELD; in add_job()
1720 ippSetString(job->attrs, &job->reasons, 0, "job-held-on-create"); in add_job()
1722 else if (attr && strcmp(attr->values[0].string.text, "no-hold")) in add_job()
1725 * Hold job until specified time... in add_job()
1728 cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); in add_job()
1730 job->state->values[0].integer = IPP_JOB_HELD; in add_job()
1731 job->state_value = IPP_JOB_HELD; in add_job()
1733 ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified"); in add_job()
1735 else if (job->attrs->request.op.operation_id == IPP_CREATE_JOB) in add_job()
1737 job->hold_until = time(NULL) + MultipleOperationTimeout; in add_job()
1738 job->state->values[0].integer = IPP_JOB_HELD; in add_job()
1739 job->state_value = IPP_JOB_HELD; in add_job()
1743 job->state->values[0].integer = IPP_JOB_PENDING; in add_job()
1744 job->state_value = IPP_JOB_PENDING; in add_job()
1746 ippSetString(job->attrs, &job->reasons, 0, "none"); in add_job()
1749 if (!(printer->type & CUPS_PRINTER_REMOTE) || Classification) in add_job()
1752 * Add job sheets options... in add_job()
1755 if ((attr = ippFindAttribute(job->attrs, "job-sheets", in add_job()
1759 "Adding default job-sheets values \"%s,%s\"...", in add_job()
1760 printer->job_sheets[0], printer->job_sheets[1]); in add_job()
1762 attr = ippAddStrings(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-sheets", in add_job()
1764 ippSetString(job->attrs, &attr, 0, printer->job_sheets[0]); in add_job()
1765 ippSetString(job->attrs, &attr, 1, printer->job_sheets[1]); in add_job()
1768 job->job_sheets = attr; in add_job()
1783 if (!strcmp(attr->values[0].string.text, "none") && in add_job()
1784 (attr->num_values == 1 || in add_job()
1785 !strcmp(attr->values[1].string.text, "none"))) in add_job()
1791 ippSetString(job->attrs, &attr, 0, Classification); in add_job()
1793 cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED " in add_job()
1794 "job-sheets=\"%s,none\", " in add_job()
1795 "job-originating-user-name=\"%s\"", in add_job()
1796 Classification, job->username); in add_job()
1798 else if (attr->num_values == 2 && in add_job()
1799 strcmp(attr->values[0].string.text, in add_job()
1800 attr->values[1].string.text) && in add_job()
1801 strcmp(attr->values[0].string.text, "none") && in add_job()
1802 strcmp(attr->values[1].string.text, "none")) in add_job()
1808 ippSetString(job->attrs, &attr, 1, attr->values[0].string.text); in add_job()
1810 cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED " in add_job()
1811 "job-sheets=\"%s,%s\", " in add_job()
1812 "job-originating-user-name=\"%s\"", in add_job()
1813 attr->values[0].string.text, in add_job()
1814 attr->values[1].string.text, job->username); in add_job()
1816 else if (strcmp(attr->values[0].string.text, Classification) && in add_job()
1817 strcmp(attr->values[0].string.text, "none") && in add_job()
1818 (attr->num_values == 1 || in add_job()
1819 (strcmp(attr->values[1].string.text, Classification) && in add_job()
1820 strcmp(attr->values[1].string.text, "none")))) in add_job()
1822 if (attr->num_values == 1) in add_job()
1823 cupsdLogJob(job, CUPSD_LOG_NOTICE, in add_job()
1825 "job-sheets=\"%s\", " in add_job()
1826 "job-originating-user-name=\"%s\"", in add_job()
1827 attr->values[0].string.text, job->username); in add_job()
1829 cupsdLogJob(job, CUPSD_LOG_NOTICE, in add_job()
1831 "job-sheets=\"%s,%s\",fffff " in add_job()
1832 "job-originating-user-name=\"%s\"", in add_job()
1833 attr->values[0].string.text, in add_job()
1834 attr->values[1].string.text, job->username); in add_job()
1837 else if (strcmp(attr->values[0].string.text, Classification) && in add_job()
1838 (attr->num_values == 1 || in add_job()
1839 strcmp(attr->values[1].string.text, Classification))) in add_job()
1845 if (attr->num_values > 1 && in add_job()
1846 !strcmp(attr->values[0].string.text, attr->values[1].string.text)) in add_job()
1848 ippSetString(job->attrs, &attr, 0, Classification); in add_job()
1849 ippSetString(job->attrs, &attr, 1, Classification); in add_job()
1853 if (attr->num_values == 1 || in add_job()
1854 strcmp(attr->values[0].string.text, "none")) in add_job()
1855 ippSetString(job->attrs, &attr, 0, Classification); in add_job()
1857 if (attr->num_values > 1 && in add_job()
1858 strcmp(attr->values[1].string.text, "none")) in add_job()
1859 ippSetString(job->attrs, &attr, 1, Classification); in add_job()
1862 if (attr->num_values > 1) in add_job()
1863 cupsdLogJob(job, CUPSD_LOG_NOTICE, in add_job()
1865 "job-sheets=\"%s,%s\", " in add_job()
1866 "job-originating-user-name=\"%s\"", in add_job()
1867 attr->values[0].string.text, in add_job()
1868 attr->values[1].string.text, job->username); in add_job()
1870 cupsdLogJob(job, CUPSD_LOG_NOTICE, in add_job()
1872 "job-sheets=\"%s\", " in add_job()
1873 "job-originating-user-name=\"%s\"", in add_job()
1874 Classification, job->username); in add_job()
1882 if (!(printer->type & CUPS_PRINTER_REMOTE)) in add_job()
1884 cupsdLogJob(job, CUPSD_LOG_INFO, "Adding start banner page \"%s\".", in add_job()
1885 attr->values[0].string.text); in add_job()
1887 if ((kbytes = copy_banner(con, job, attr->values[0].string.text)) < 0) in add_job()
1889 cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, in add_job()
1890 "Aborting job because the start banner could not be " in add_job()
1895 cupsdUpdateQuota(printer, job->username, 0, kbytes); in add_job()
1898 else if ((attr = ippFindAttribute(job->attrs, "job-sheets", in add_job()
1900 job->job_sheets = attr; in add_job()
1906 …ODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, con->clientname, con->clientport, "/jobs/%d", jo… in add_job()
1907 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, job_uri); in add_job()
1909 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); in add_job()
1911 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value); in add_job()
1912 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, ""); in add_job()
1913 …ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, job->reasons- in add_job()
1915 con->response->request.status.status_code = IPP_OK; in add_job()
1918 * Add any job subscriptions... in add_job()
1921 add_job_subscriptions(con, job); in add_job()
1924 * Set all but the first two attributes to the job attributes group... in add_job()
1927 for (attr = job->attrs->attrs->next->next; attr; attr = attr->next) in add_job()
1928 attr->group_tag = IPP_TAG_JOB; in add_job()
1931 * Fire the "job created" event... in add_job()
1934 cupsdAddEvent(CUPSD_EVENT_JOB_CREATED, printer, job, "Job created."); in add_job()
1937 * Return the new job... in add_job()
1940 return (job); in add_job()
1945 * 'add_job_subscriptions()' - Add any subscriptions for a job.
1950 cupsd_client_t *con, /* I - Client connection */ in add_job_subscriptions()
1951 cupsd_job_t *job) /* I - Newly created job */ in add_job_subscriptions() argument
1958 const char *recipient, /* notify-recipient-uri */ in add_job_subscriptions()
1959 *pullmethod; /* notify-pull-method */ in add_job_subscriptions()
1960 ipp_attribute_t *user_data; /* notify-user-data */ in add_job_subscriptions()
1961 int interval; /* notify-time-interval */ in add_job_subscriptions()
1962 unsigned mask; /* notify-events */ in add_job_subscriptions()
1970 for (attr = job->attrs->attrs; attr; attr = attr->next) in add_job_subscriptions()
1971 if (attr->group_tag == IPP_TAG_SUBSCRIPTION) in add_job_subscriptions()
1989 while (attr && attr->group_tag != IPP_TAG_ZERO) in add_job_subscriptions()
1991 if (!strcmp(attr->name, "notify-recipient-uri") && in add_job_subscriptions()
1992 attr->value_tag == IPP_TAG_URI) in add_job_subscriptions()
2007 recipient = attr->values[0].string.text; in add_job_subscriptions()
2015 _("Bad notify-recipient-uri \"%s\"."), recipient); in add_job_subscriptions()
2016 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in add_job_subscriptions()
2017 "notify-status-code", IPP_URI_SCHEME); in add_job_subscriptions()
2025 _("notify-recipient-uri URI \"%s\" uses unknown " in add_job_subscriptions()
2027 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in add_job_subscriptions()
2028 "notify-status-code", IPP_URI_SCHEME); in add_job_subscriptions()
2035 _("notify-recipient-uri URI \"%s\" is already used."), in add_job_subscriptions()
2037 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in add_job_subscriptions()
2038 "notify-status-code", IPP_ATTRIBUTES); in add_job_subscriptions()
2042 else if (!strcmp(attr->name, "notify-pull-method") && in add_job_subscriptions()
2043 attr->value_tag == IPP_TAG_KEYWORD) in add_job_subscriptions()
2045 pullmethod = attr->values[0].string.text; in add_job_subscriptions()
2050 _("Bad notify-pull-method \"%s\"."), pullmethod); in add_job_subscriptions()
2051 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in add_job_subscriptions()
2052 "notify-status-code", IPP_ATTRIBUTES); in add_job_subscriptions()
2056 else if (!strcmp(attr->name, "notify-charset") && in add_job_subscriptions()
2057 attr->value_tag == IPP_TAG_CHARSET && in add_job_subscriptions()
2058 strcmp(attr->values[0].string.text, "us-ascii") && in add_job_subscriptions()
2059 strcmp(attr->values[0].string.text, "utf-8")) in add_job_subscriptions()
2063 attr->values[0].string.text); in add_job_subscriptions()
2066 else if (!strcmp(attr->name, "notify-natural-language") && in add_job_subscriptions()
2067 (attr->value_tag != IPP_TAG_LANGUAGE || in add_job_subscriptions()
2068 strcmp(attr->values[0].string.text, DefaultLanguage))) in add_job_subscriptions()
2072 attr->values[0].string.text); in add_job_subscriptions()
2075 else if (!strcmp(attr->name, "notify-user-data") && in add_job_subscriptions()
2076 attr->value_tag == IPP_TAG_STRING) in add_job_subscriptions()
2078 if (attr->num_values > 1 || attr->values[0].unknown.length > 63) in add_job_subscriptions()
2081 _("The notify-user-data value is too large " in add_job_subscriptions()
2083 attr->values[0].unknown.length); in add_job_subscriptions()
2089 else if (!strcmp(attr->name, "notify-events") && in add_job_subscriptions()
2090 attr->value_tag == IPP_TAG_KEYWORD) in add_job_subscriptions()
2092 for (i = 0; i < attr->num_values; i ++) in add_job_subscriptions()
2093 mask |= cupsdEventValue(attr->values[i].string.text); in add_job_subscriptions()
2095 else if (!strcmp(attr->name, "notify-lease-duration")) in add_job_subscriptions()
2098 _("The notify-lease-duration attribute cannot be " in add_job_subscriptions()
2099 "used with job subscriptions.")); in add_job_subscriptions()
2102 else if (!strcmp(attr->name, "notify-time-interval") && in add_job_subscriptions()
2103 attr->value_tag == IPP_TAG_INTEGER) in add_job_subscriptions()
2104 interval = attr->values[0].integer; in add_job_subscriptions()
2106 attr = attr->next; in add_job_subscriptions()
2115 if ((sub = cupsdAddSubscription(mask, cupsdFindDest(job->dest), job, in add_job_subscriptions()
2118 sub->interval = interval; in add_job_subscriptions()
2120 cupsdSetString(&sub->owner, job->username); in add_job_subscriptions()
2124 sub->user_data_len = user_data->values[0].unknown.length; in add_job_subscriptions()
2125 memcpy(sub->user_data, user_data->values[0].unknown.data, in add_job_subscriptions()
2126 (size_t)sub->user_data_len); in add_job_subscriptions()
2129 ippAddSeparator(con->response); in add_job_subscriptions()
2130 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in add_job_subscriptions()
2131 "notify-subscription-id", sub->id); in add_job_subscriptions()
2133 cupsdLogMessage(CUPSD_LOG_DEBUG, "Added subscription %d for job %d", in add_job_subscriptions()
2134 sub->id, job->id); in add_job_subscriptions()
2138 attr = attr->next; in add_job_subscriptions()
2144 * Remove all of the subscription attributes from the job request... in add_job_subscriptions()
2150 for (attr = job->attrs->attrs, prev = NULL; attr; attr = next) in add_job_subscriptions()
2152 next = attr->next; in add_job_subscriptions()
2154 if (attr->group_tag == IPP_TAG_SUBSCRIPTION || in add_job_subscriptions()
2155 attr->group_tag == IPP_TAG_ZERO) in add_job_subscriptions()
2164 prev->next = next; in add_job_subscriptions()
2166 job->attrs->attrs = next; in add_job_subscriptions()
2172 job->attrs->last = prev; in add_job_subscriptions()
2173 job->attrs->current = prev; in add_job_subscriptions()
2178 * 'add_job_uuid()' - Add job-uuid attribute to a job.
2184 add_job_uuid(cupsd_job_t *job) /* I - Job */ in add_job_uuid() argument
2186 char uuid[64]; /* job-uuid string */ in add_job_uuid()
2190 * Add a job-uuid attribute if none exists... in add_job_uuid()
2193 if (!ippFindAttribute(job->attrs, "job-uuid", IPP_TAG_URI)) in add_job_uuid()
2194 ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, in add_job_uuid()
2195 httpAssembleUUID(ServerName, RemotePort, job->dest, job->id, in add_job_uuid()
2201 * 'add_printer()' - Add a printer to the system.
2205 add_printer(cupsd_client_t *con, /* I - Client connection */ in add_printer()
2206 ipp_attribute_t *uri) /* I - URI of printer */ in add_printer()
2221 int modify; /* Non-zero if we are modifying */ in add_printer()
2223 need_restart_job, /* Need to restart job? */ in add_printer()
2229 con->number, uri->values[0].string.text); in add_printer()
2235 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in add_printer()
2246 _("The printer-uri must be of the form " in add_printer()
2252 * Do we have a valid printer name? in add_printer()
2262 _("The printer-uri \"%s\" contains invalid characters."), in add_printer()
2263 uri->values[0].string.text); in add_printer()
2274 * Printer doesn't exist; see if we have a class of the same name... in add_printer()
2302 printer->printer_id = NextPrinterId ++; in add_printer()
2304 else if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, in add_printer()
2320 if ((attr = ippFindAttribute(con->request, "printer-is-temporary", IPP_TAG_BOOLEAN)) != NULL) in add_printer()
2321 printer->temporary = ippGetBoolean(attr, 0); in add_printer()
2323 if ((attr = ippFindAttribute(con->request, "printer-location", in add_printer()
2325 cupsdSetString(&printer->location, attr->values[0].string.text); in add_printer()
2327 …if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strnc… in add_printer()
2328 cupsdSetString(&printer->geo_location, attr->values[0].string.text); in add_printer()
2330 if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL) in add_printer()
2331 cupsdSetString(&printer->organization, attr->values[0].string.text); in add_printer()
2333 if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL) in add_printer()
2334 cupsdSetString(&printer->organizational_unit, attr->values[0].string.text); in add_printer()
2336 if ((attr = ippFindAttribute(con->request, "printer-info", in add_printer()
2338 cupsdSetString(&printer->info, attr->values[0].string.text); in add_printer()
2342 if ((attr = ippFindAttribute(con->request, "device-uri", in add_printer()
2356 attr->values[0].string.text, in add_printer()
2362 …cupsdLogMessage(CUPSD_LOG_DEBUG, "%s device-uri: %s", printer->name, httpURIStatusString(uri_statu… in add_printer()
2366 send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad device-uri \"%s\"."), in add_printer()
2367 attr->values[0].string.text); in add_printer()
2389 "\"%s/cups-files.conf\"."), in add_printer()
2411 _("Bad device-uri scheme \"%s\"."), scheme); in add_printer()
2419 if (printer->sanitized_device_uri) in add_printer()
2420 strlcpy(old_device_uri, printer->sanitized_device_uri, in add_printer()
2425 cupsdSetDeviceURI(printer, attr->values[0].string.text); in add_printer()
2428 "Setting %s device-uri to \"%s\" (was \"%s\".)", in add_printer()
2429 printer->name, printer->sanitized_device_uri, in add_printer()
2437 if ((attr = ippFindAttribute(con->request, "port-monitor", in add_printer()
2440 ipp_attribute_t *supported; /* port-monitor-supported attribute */ in add_printer()
2445 supported = ippFindAttribute(printer->ppd_attrs, "port-monitor-supported", in add_printer()
2449 for (i = 0; i < supported->num_values; i ++) in add_printer()
2450 if (!strcmp(supported->values[i].string.text, in add_printer()
2451 attr->values[0].string.text)) in add_printer()
2455 if (!supported || i >= supported->num_values) in add_printer()
2457 send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad port-monitor \"%s\"."), in add_printer()
2458 attr->values[0].string.text); in add_printer()
2466 "Setting %s port-monitor to \"%s\" (was \"%s\".)", in add_printer()
2467 printer->name, attr->values[0].string.text, in add_printer()
2468 printer->port_monitor ? printer->port_monitor : "none"); in add_printer()
2470 if (strcmp(attr->values[0].string.text, "none")) in add_printer()
2471 cupsdSetString(&printer->port_monitor, attr->values[0].string.text); in add_printer()
2473 cupsdClearString(&printer->port_monitor); in add_printer()
2478 if ((attr = ippFindAttribute(con->request, "printer-is-accepting-jobs", in add_printer()
2480 attr->values[0].boolean != printer->accepting) in add_printer()
2483 "Setting %s printer-is-accepting-jobs to %d (was %d.)", in add_printer()
2484 printer->name, attr->values[0].boolean, printer->accepting); in add_printer()
2486 printer->accepting = attr->values[0].boolean; in add_printer()
2490 printer->accepting ? "Now" : "No longer"); in add_printer()
2493 if ((attr = ippFindAttribute(con->request, "printer-is-shared", IPP_TAG_BOOLEAN)) != NULL) in add_printer()
2496 printer->num_auth_info_required == 1 && in add_printer()
2497 !strcmp(printer->auth_info_required[0], "negotiate")) in add_printer()
2507 if (printer->type & CUPS_PRINTER_REMOTE) in add_printer()
2510 * Cannot re-share remote printers. in add_printer()
2513 … send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues.")); in add_printer()
2520 if (printer->shared && !ippGetBoolean(attr, 0)) in add_printer()
2524 "Setting %s printer-is-shared to %d (was %d.)", in add_printer()
2525 printer->name, attr->values[0].boolean, printer->shared); in add_printer()
2527 printer->shared = ippGetBoolean(attr, 0); in add_printer()
2528 if (printer->shared && printer->temporary) in add_printer()
2529 printer->temporary = 0; in add_printer()
2532 if ((attr = ippFindAttribute(con->request, "printer-state", in add_printer()
2535 if (attr->values[0].integer != IPP_PRINTER_IDLE && in add_printer()
2536 attr->values[0].integer != IPP_PRINTER_STOPPED) in add_printer()
2538 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad printer-state value %d."), in add_printer()
2539 attr->values[0].integer); in add_printer()
2546 cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", in add_printer()
2547 printer->name, attr->values[0].integer, printer->state); in add_printer()
2549 if (attr->values[0].integer == IPP_PRINTER_STOPPED) in add_printer()
2554 cupsdSetPrinterState(printer, (ipp_pstate_t)(attr->values[0].integer), 0); in add_printer()
2558 if ((attr = ippFindAttribute(con->request, "printer-state-message", in add_printer()
2561 strlcpy(printer->state_message, attr->values[0].string.text, in add_printer()
2562 sizeof(printer->state_message)); in add_printer()
2565 printer->state_message); in add_printer()
2568 if ((attr = ippFindAttribute(con->request, "printer-state-reasons", in add_printer()
2571 if (attr->num_values > in add_printer()
2572 (int)(sizeof(printer->reasons) / sizeof(printer->reasons[0]))) in add_printer()
2575 _("Too many printer-state-reasons values (%d > %d)."), in add_printer()
2576 attr->num_values, in add_printer()
2577 (int)(sizeof(printer->reasons) / in add_printer()
2578 sizeof(printer->reasons[0]))); in add_printer()
2585 for (i = 0; i < printer->num_reasons; i ++) in add_printer()
2586 _cupsStrFree(printer->reasons[i]); in add_printer()
2588 printer->num_reasons = 0; in add_printer()
2589 for (i = 0; i < attr->num_values; i ++) in add_printer()
2591 if (!strcmp(attr->values[i].string.text, "none")) in add_printer()
2594 printer->reasons[printer->num_reasons] = _cupsStrAlloc(attr->values[i].string.text); in add_printer()
2595 printer->num_reasons ++; in add_printer()
2597 if (!strcmp(attr->values[i].string.text, "paused") && in add_printer()
2598 printer->state != IPP_PRINTER_STOPPED) in add_printer()
2601 "Setting %s printer-state to %d (was %d.)", in add_printer()
2602 printer->name, IPP_PRINTER_STOPPED, printer->state); in add_printer()
2611 "Printer \"%s\" state changed.", printer->name); in add_printer()
2622 if ((attr = ippFindAttribute(con->request, "auth-info-required", in add_printer()
2630 if (!printer->device_uri) in add_printer()
2631 cupsdSetString(&printer->device_uri, "file:///dev/null"); in add_printer()
2637 if (con->filename) in add_printer()
2642 strlcpy(srcfile, con->filename, sizeof(srcfile)); in add_printer()
2658 if (strncmp(line, "*PPD-Adobe", 10)) in add_printer()
2668 printer->name); in add_printer()
2677 send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to copy PPD file - %s"), strerror(errno)); in add_printer()
2687 else if ((attr = ippFindAttribute(con->request, "ppd-name", IPP_TAG_NAME)) != NULL) in add_printer()
2690 /* ppd-name value */ in add_printer()
2698->device_uri || (strncmp(printer->device_uri, "dnssd://", 8) && strncmp(printer->device_uri, "ipp:… in add_printer()
2716 snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot, printer->name); in add_printer()
2721 send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Invalid ppd-name value.")); in add_printer()
2733 snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot, printer->name); in add_printer()
2752 * printer-state-reasons... in add_printer()
2757 snprintf(cache_name, sizeof(cache_name), "%s/%s.data", CacheDir, printer->name); in add_printer()
2780 httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, in add_printer()
2785 printer->name); in add_printer()
2791 if (!strcmp(scheme, ppdattr->spec)) in add_printer()
2794 "Setting %s port-monitor to \"%s\" (was \"%s\".)", in add_printer()
2795 printer->name, ppdattr->value, in add_printer()
2796 printer->port_monitor ? printer->port_monitor in add_printer()
2799 if (strcmp(ppdattr->value, "none")) in add_printer()
2800 cupsdSetString(&printer->port_monitor, ppdattr->value); in add_printer()
2802 cupsdClearString(&printer->port_monitor); in add_printer()
2811 printer->config_time = time(NULL); in add_printer()
2817 if (!printer->temporary) in add_printer()
2819 if (!printer->printer_id) in add_printer()
2820 printer->printer_id = NextPrinterId ++; in add_printer()
2827 if (need_restart_job && printer->job) in add_printer()
2830 * Restart the current job... in add_printer()
2833 cupsdSetJobState(printer->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, in add_printer()
2834 "Job restarted because the printer was modified."); in add_printer()
2843 printer->name, get_username(con)); in add_printer()
2846 printer->name, get_username(con)); in add_printer()
2852 printer->name, get_username(con)); in add_printer()
2855 printer->name, get_username(con)); in add_printer()
2858 con->response->request.status.status_code = IPP_OK; in add_printer()
2863 * 'add_printer_state_reasons()' - Add the "printer-state-reasons" attribute
2869 cupsd_client_t *con, /* I - Client connection */ in add_printer_state_reasons()
2870 cupsd_printer_t *p) /* I - Printer info */ in add_printer_state_reasons()
2874 con, con->number, p, p->name); in add_printer_state_reasons()
2876 if (p->num_reasons == 0) in add_printer_state_reasons()
2877 ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, in add_printer_state_reasons()
2878 "printer-state-reasons", NULL, "none"); in add_printer_state_reasons()
2880 ippAddStrings(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, in add_printer_state_reasons()
2881 "printer-state-reasons", p->num_reasons, NULL, in add_printer_state_reasons()
2882 (const char * const *)p->reasons); in add_printer_state_reasons()
2887 * 'add_queued_job_count()' - Add the "queued-job-count" attribute for
2893 cupsd_client_t *con, /* I - Client connection */ in add_queued_job_count()
2894 cupsd_printer_t *p) /* I - Printer or class */ in add_queued_job_count()
2900 con, con->number, p, p->name); in add_queued_job_count()
2902 count = cupsdGetPrinterJobCount(p->name); in add_queued_job_count()
2904 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, in add_queued_job_count()
2905 "queued-job-count", count); in add_queued_job_count()
2910 * 'apply_printer_defaults()' - Apply printer default options to a job.
2915 cupsd_printer_t *printer, /* I - Printer */ in apply_printer_defaults()
2916 cupsd_job_t *job) /* I - Job */ in apply_printer_defaults() argument
2924 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Applying default options..."); in apply_printer_defaults()
2928 * job object... in apply_printer_defaults()
2931 for (i = printer->num_options, num_options = 0, options = NULL, in apply_printer_defaults()
2932 option = printer->options; in apply_printer_defaults()
2934 i --, option ++) in apply_printer_defaults()
2935 if (!ippFindAttribute(job->attrs, option->name, IPP_TAG_ZERO)) in apply_printer_defaults()
2937 …if (!strcmp(option->name, "print-quality") && ippFindAttribute(job->attrs, "cupsPrintQuality", IPP… in apply_printer_defaults()
2940 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Adding default %s=%s", option->name, option->value); in apply_printer_defaults()
2942 num_options = cupsAddOption(option->name, option->value, num_options, &options); in apply_printer_defaults()
2946 * Encode these options as attributes in the job object... in apply_printer_defaults()
2949 cupsEncodeOptions2(job->attrs, num_options, options, IPP_TAG_JOB); in apply_printer_defaults()
2955 * 'authenticate_job()' - Set job authentication info.
2959 authenticate_job(cupsd_client_t *con, /* I - Client connection */ in authenticate_job()
2960 ipp_attribute_t *uri) /* I - Job URI */ in authenticate_job()
2962 ipp_attribute_t *attr, /* job-id attribute */ in authenticate_job()
2963 *auth_info; /* auth-info attribute */ in authenticate_job()
2964 int jobid; /* Job ID */ in authenticate_job()
2965 cupsd_job_t *job; /* Current job */ in authenticate_job() local
2978 con, con->number, uri->values[0].string.text); in authenticate_job()
2984 con->response->request.status.status_code = IPP_OK; in authenticate_job()
2987 * See if we have a job URI or a printer URI... in authenticate_job()
2990 if (!strcmp(uri->name, "printer-uri")) in authenticate_job()
2993 * Got a printer URI; see if we also have a job-id attribute... in authenticate_job()
2996 if ((attr = ippFindAttribute(con->request, "job-id", in authenticate_job()
3000 _("Got a printer-uri attribute but no job-id.")); in authenticate_job()
3004 jobid = attr->values[0].integer; in authenticate_job()
3009 * Got a job URI; parse it to get the job ID... in authenticate_job()
3012 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in authenticate_job()
3022 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in authenticate_job()
3023 uri->values[0].string.text); in authenticate_job()
3031 * See if the job exists... in authenticate_job()
3034 if ((job = cupsdFindJob(jobid)) == NULL) in authenticate_job()
3037 * Nope - return a "not found" error... in authenticate_job()
3040 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in authenticate_job()
3045 * See if the job has been completed... in authenticate_job()
3048 if (job->state_value != IPP_JOB_HELD) in authenticate_job()
3051 * Return a "not-possible" error... in authenticate_job()
3055 _("Job #%d is not held for authentication."), in authenticate_job()
3064 auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); in authenticate_job()
3066 if (!con->username[0] && !auth_info) in authenticate_job()
3068 cupsd_printer_t *printer; /* Job destination */ in authenticate_job()
3075 printer = cupsdFindDest(job->dest); in authenticate_job()
3077 if (printer && printer->num_auth_info_required > 0 && in authenticate_job()
3078 !strcmp(printer->auth_info_required[0], "negotiate")) in authenticate_job()
3087 * See if the job is owned by the requesting user... in authenticate_job()
3090 if (!validate_user(job, con, job->username, username, sizeof(username))) in authenticate_job()
3092 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in authenticate_job()
3093 cupsdFindDest(job->dest)); in authenticate_job()
3098 * Save the authentication information for this job... in authenticate_job()
3101 save_auth_info(con, job, auth_info); in authenticate_job()
3104 * Reset the job-hold-until value to "no-hold"... in authenticate_job()
3107 if ((attr = ippFindAttribute(job->attrs, "job-hold-until", in authenticate_job()
3109 attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); in authenticate_job()
3113 ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD); in authenticate_job()
3114 ippSetString(job->attrs, &attr, 0, "no-hold"); in authenticate_job()
3118 * Release the job and return... in authenticate_job()
3121 cupsdReleaseJob(job); in authenticate_job()
3123 cupsdAddEvent(CUPSD_EVENT_JOB_STATE, NULL, job, "Job authenticated by user"); in authenticate_job()
3125 cupsdLogJob(job, CUPSD_LOG_INFO, "Authenticated by \"%s\".", con->username); in authenticate_job()
3132 * 'cancel_all_jobs()' - Cancel all or selected print jobs.
3136 cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ in cancel_all_jobs()
3137 ipp_attribute_t *uri) /* I - Job or Printer URI */ in cancel_all_jobs()
3152 ipp_attribute_t *job_ids; /* job-ids attribute */ in cancel_all_jobs()
3153 cupsd_job_t *job; /* Job */ in cancel_all_jobs() local
3157 con->number, uri->values[0].string.text); in cancel_all_jobs()
3163 switch (con->request->request.op.operation_id) in cancel_all_jobs()
3168 * "my-jobs" is specified... in cancel_all_jobs()
3171 if ((attr = ippFindAttribute(con->request, "my-jobs", in cancel_all_jobs()
3173 attr->values[0].boolean) in cancel_all_jobs()
3175 if ((attr = ippFindAttribute(con->request, "requesting-user-name", in cancel_all_jobs()
3177 username = attr->values[0].string.text; in cancel_all_jobs()
3181 _("Missing requesting-user-name attribute.")); in cancel_all_jobs()
3187 * Look for the "purge-jobs" attribute... in cancel_all_jobs()
3190 if ((attr = ippFindAttribute(con->request, "purge-jobs", in cancel_all_jobs()
3192 purge = attr->values[0].boolean ? CUPSD_JOB_PURGE : CUPSD_JOB_DEFAULT; in cancel_all_jobs()
3198 if (con->username[0]) in cancel_all_jobs()
3199 username = con->username; in cancel_all_jobs()
3200 else if ((attr = ippFindAttribute(con->request, "requesting-user-name", in cancel_all_jobs()
3202 username = attr->values[0].string.text; in cancel_all_jobs()
3206 _("Missing requesting-user-name attribute.")); in cancel_all_jobs()
3214 job_ids = ippFindAttribute(con->request, "job-ids", IPP_TAG_INTEGER); in cancel_all_jobs()
3220 if (strcmp(uri->name, "printer-uri")) in cancel_all_jobs()
3223 _("The printer-uri attribute is required.")); in cancel_all_jobs()
3231 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in cancel_all_jobs()
3237 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, in cancel_all_jobs()
3262 for (i = 0; i < job_ids->num_values; i ++) in cancel_all_jobs()
3264 if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL) in cancel_all_jobs()
3267 if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS && in cancel_all_jobs()
3268 _cups_strcasecmp(job->username, username)) in cancel_all_jobs()
3272 if (i < job_ids->num_values) in cancel_all_jobs()
3274 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in cancel_all_jobs()
3275 job_ids->values[i].integer); in cancel_all_jobs()
3279 for (i = 0; i < job_ids->num_values; i ++) in cancel_all_jobs()
3281 job = cupsdFindJob(job_ids->values[i].integer); in cancel_all_jobs()
3283 cupsdSetJobState(job, IPP_JOB_CANCELED, purge, in cancel_all_jobs()
3284 purge == CUPSD_JOB_PURGE ? "Job purged by user." : in cancel_all_jobs()
3285 "Job canceled by user."); in cancel_all_jobs()
3311 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, in cancel_all_jobs()
3320 for (i = 0; i < job_ids->num_values; i ++) in cancel_all_jobs()
3322 if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL || in cancel_all_jobs()
3323 _cups_strcasecmp(job->dest, printer->name)) in cancel_all_jobs()
3326 if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS && in cancel_all_jobs()
3327 _cups_strcasecmp(job->username, username)) in cancel_all_jobs()
3331 if (i < job_ids->num_values) in cancel_all_jobs()
3333 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in cancel_all_jobs()
3334 job_ids->values[i].integer); in cancel_all_jobs()
3338 for (i = 0; i < job_ids->num_values; i ++) in cancel_all_jobs()
3340 job = cupsdFindJob(job_ids->values[i].integer); in cancel_all_jobs()
3342 cupsdSetJobState(job, IPP_JOB_CANCELED, purge, in cancel_all_jobs()
3343 purge == CUPSD_JOB_PURGE ? "Job purged by user." : in cancel_all_jobs()
3344 "Job canceled by user."); in cancel_all_jobs()
3357 cupsdCancelJobs(printer->name, username, purge != CUPSD_JOB_DEFAULT); in cancel_all_jobs()
3360 printer->name, in cancel_all_jobs()
3366 con->response->request.status.status_code = IPP_OK; in cancel_all_jobs()
3373 * 'cancel_job()' - Cancel a print job.
3377 cancel_job(cupsd_client_t *con, /* I - Client connection */ in cancel_job()
3378 ipp_attribute_t *uri) /* I - Job or Printer URI */ in cancel_job()
3381 int jobid; /* Job ID */ in cancel_job()
3387 cupsd_job_t *job; /* Job information */ in cancel_job() local
3390 cupsd_jobaction_t purge; /* Purge the job? */ in cancel_job()
3394 con->number, uri->values[0].string.text); in cancel_job()
3397 * See if we have a job URI or a printer URI... in cancel_job()
3400 if (!strcmp(uri->name, "printer-uri")) in cancel_job()
3403 * Got a printer URI; see if we also have a job-id attribute... in cancel_job()
3406 if ((attr = ippFindAttribute(con->request, "job-id", in cancel_job()
3410 _("Got a printer-uri attribute but no job-id.")); in cancel_job()
3414 if ((jobid = attr->values[0].integer) == 0) in cancel_job()
3417 * Find the current job on the specified printer... in cancel_job()
3420 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in cancel_job()
3435 for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); in cancel_job()
3436 job; in cancel_job()
3437 job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) in cancel_job()
3438 if (job->state_value <= IPP_JOB_PROCESSING && in cancel_job()
3439 !_cups_strcasecmp(job->dest, printer->name)) in cancel_job()
3442 if (job) in cancel_job()
3443 jobid = job->id; in cancel_job()
3450 for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); in cancel_job()
3451 job; in cancel_job()
3452 job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) in cancel_job()
3453 if (job->state_value == IPP_JOB_STOPPED && in cancel_job()
3454 !_cups_strcasecmp(job->dest, printer->name)) in cancel_job()
3457 if (job) in cancel_job()
3458 jobid = job->id; in cancel_job()
3462 printer->name); in cancel_job()
3471 * Got a job URI; parse it to get the job ID... in cancel_job()
3474 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in cancel_job()
3484 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in cancel_job()
3485 uri->values[0].string.text); in cancel_job()
3493 * Look for the "purge-job" attribute... in cancel_job()
3496 if ((attr = ippFindAttribute(con->request, "purge-job", in cancel_job()
3498 purge = attr->values[0].boolean ? CUPSD_JOB_PURGE : CUPSD_JOB_DEFAULT; in cancel_job()
3503 * See if the job exists... in cancel_job()
3506 if ((job = cupsdFindJob(jobid)) == NULL) in cancel_job()
3509 * Nope - return a "not found" error... in cancel_job()
3512 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in cancel_job()
3517 * See if the job is owned by the requesting user... in cancel_job()
3520 if (!validate_user(job, con, job->username, username, sizeof(username))) in cancel_job()
3522 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in cancel_job()
3523 cupsdFindDest(job->dest)); in cancel_job()
3528 * See if the job is already completed, canceled, or aborted; if so, in cancel_job()
3532 if (job->state_value >= IPP_JOB_CANCELED && purge != CUPSD_JOB_PURGE) in cancel_job()
3534 switch (job->state_value) in cancel_job()
3538 _("Job #%d is already canceled - can\'t cancel."), in cancel_job()
3544 _("Job #%d is already aborted - can\'t cancel."), in cancel_job()
3550 _("Job #%d is already completed - can\'t cancel."), in cancel_job()
3559 * Cancel the job and return... in cancel_job()
3562 cupsdSetJobState(job, IPP_JOB_CANCELED, purge, in cancel_job()
3563 purge == CUPSD_JOB_PURGE ? "Job purged by \"%s\"" : in cancel_job()
3564 "Job canceled by \"%s\"", in cancel_job()
3569 cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Purged by \"%s\".", jobid, in cancel_job()
3572 cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Canceled by \"%s\".", jobid, in cancel_job()
3575 con->response->request.status.status_code = IPP_OK; in cancel_job()
3580 * 'cancel_subscription()' - Cancel a subscription.
3585 cupsd_client_t *con, /* I - Client connection */ in cancel_subscription()
3586 int sub_id) /* I - Subscription ID */ in cancel_subscription()
3594 con, con->number, sub_id); in cancel_subscription()
3615 if ((status = cupsdCheckPolicy(sub->dest ? sub->dest->op_policy_ptr : in cancel_subscription()
3617 con, sub->owner)) != HTTP_OK) in cancel_subscription()
3619 send_http_error(con, status, sub->dest); in cancel_subscription()
3629 con->response->request.status.status_code = IPP_OK; in cancel_subscription()
3634 * 'check_rss_recipient()' - Check that we do not have a duplicate RSS feed URI.
3637 static int /* O - 1 if OK, 0 if not */
3639 const char *recipient) /* I - Recipient URI */ in check_rss_recipient()
3647 if (sub->recipient) in check_rss_recipient()
3655 for (r1 = recipient, r2 = sub->recipient; in check_rss_recipient()
3668 * 'check_quotas()' - Check quotas for a printer and user.
3671 static int /* O - 1 if OK, 0 if forbidden,
3672 -1 if limit reached */
3673 check_quotas(cupsd_client_t *con, /* I - Client connection */ in check_quotas()
3674 cupsd_printer_t *p) /* I - Printer or class */ in check_quotas()
3677 *name; /* Current user name */ in check_quotas() local
3685 uuid_t usr_uuid; /* UUID for job requesting user */ in check_quotas()
3686 uuid_t usr2_uuid; /* UUID for ACL user name entry */ in check_quotas()
3687 uuid_t grp_uuid; /* UUID for ACL group name entry */ in check_quotas()
3700 con, con->number, p, p->name); in check_quotas()
3708 if ((name = strchr(username, '@')) != NULL) in check_quotas()
3709 *name = '\0'; /* Strip @REALM */ in check_quotas()
3712 * Check global active job limits for printers and users... in check_quotas()
3721 if (cupsdGetPrinterJobCount(p->name) >= MaxJobsPerPrinter) in check_quotas()
3724 p->name); in check_quotas()
3725 return (-1); in check_quotas()
3739 return (-1); in check_quotas()
3747 if (cupsArrayCount(p->users) == 0 && p->k_limit == 0 && p->page_limit == 0) in check_quotas()
3750 if (cupsArrayCount(p->users)) in check_quotas()
3754 * Get UUID for job requesting user... in check_quotas()
3769 username, p->name); in check_quotas()
3781 for (name = (char *)cupsArrayFirst(p->users); in check_quotas()
3782 name; in check_quotas()
3783 name = (char *)cupsArrayNext(p->users)) in check_quotas()
3784 if (name[0] == '@') in check_quotas()
3791 if (name[1] == '#') in check_quotas()
3793 if (uuid_parse(name + 2, grp_uuid)) in check_quotas()
3796 else if ((mbr_err = mbr_group_name_to_uuid(name + 1, grp_uuid)) != 0) in check_quotas()
3805 "\"%s\" (err=%d)", name, mbr_err); in check_quotas()
3807 "Access control entry \"%s\" not a valid group name; " in check_quotas()
3808 "entry ignored", name); in check_quotas()
3820 "failed (err=%d)", name + 1, mbr_err); in check_quotas()
3832 if (cupsdCheckGroup(username, pw, name + 1)) in check_quotas()
3839 if (name[0] == '#') in check_quotas()
3841 if (uuid_parse(name + 1, usr2_uuid)) in check_quotas()
3844 else if ((mbr_err = mbr_user_name_to_uuid(name, usr2_uuid)) != 0) in check_quotas()
3853 "\"%s\" (err=%d)", name, mbr_err); in check_quotas()
3855 "Access control entry \"%s\" not a valid user name; " in check_quotas()
3856 "entry ignored", name); in check_quotas()
3863 else if (!_cups_strcasecmp(username, name)) in check_quotas()
3867 if ((name != NULL) == p->deny_users) in check_quotas()
3871 username, p->name); in check_quotas()
3880 if (p->k_limit || p->page_limit) in check_quotas()
3887 return (-1); in check_quotas()
3890 if ((q->k_count >= p->k_limit && p->k_limit) || in check_quotas()
3891 (q->page_count >= p->page_limit && p->page_limit)) in check_quotas()
3895 return (-1); in check_quotas()
3908 * 'close_job()' - Close a multi-file job.
3912 close_job(cupsd_client_t *con, /* I - Client connection */ in close_job()
3913 ipp_attribute_t *uri) /* I - Printer URI */ in close_job()
3915 cupsd_job_t *job; /* Job */ in close_job() local
3918 /* Job URI */ in close_job()
3919 username[256]; /* User name */ in close_job()
3923 con->number, uri->values[0].string.text); in close_job()
3926 * See if we have a job URI or a printer URI... in close_job()
3929 if (strcmp(uri->name, "printer-uri")) in close_job()
3932 * job-uri is not supported by Close-Job! in close_job()
3936 _("Close-Job doesn't support the job-uri attribute.")); in close_job()
3941 * Got a printer URI; see if we also have a job-id attribute... in close_job()
3944 if ((attr = ippFindAttribute(con->request, "job-id", in close_job()
3948 _("Got a printer-uri attribute but no job-id.")); in close_job()
3952 if ((job = cupsdFindJob(attr->values[0].integer)) == NULL) in close_job()
3955 * Nope - return a "not found" error... in close_job()
3958 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in close_job()
3959 attr->values[0].integer); in close_job()
3964 * See if the job is owned by the requesting user... in close_job()
3967 if (!validate_user(job, con, job->username, username, sizeof(username))) in close_job()
3969 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in close_job()
3970 cupsdFindDest(job->dest)); in close_job()
3978 if (cupsdTimeoutJob(job)) in close_job()
3981 if (job->state_value == IPP_JOB_STOPPED) in close_job()
3983 job->state->values[0].integer = IPP_JOB_PENDING; in close_job()
3984 job->state_value = IPP_JOB_PENDING; in close_job()
3986 else if (job->state_value == IPP_JOB_HELD) in close_job()
3988 if ((attr = ippFindAttribute(job->attrs, "job-hold-until", in close_job()
3990 attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); in close_job()
3992 if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) in close_job()
3994 job->state->values[0].integer = IPP_JOB_PENDING; in close_job()
3995 job->state_value = IPP_JOB_PENDING; in close_job()
3999 job->dirty = 1; in close_job()
4007 con->clientname, con->clientport, "/jobs/%d", job->id); in close_job()
4008 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, in close_job()
4011 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); in close_job()
4013 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value); in close_job()
4015 con->response->request.status.status_code = IPP_OK; in close_job()
4018 * Start the job if necessary... in close_job()
4026 * 'copy_attrs()' - Copy attributes from one request to another.
4030 copy_attrs(ipp_t *to, /* I - Destination request */ in copy_attrs()
4031 ipp_t *from, /* I - Source request */ in copy_attrs()
4032 cups_array_t *ra, /* I - Requested attributes */ in copy_attrs()
4033 ipp_tag_t group, /* I - Group to copy */ in copy_attrs()
4034 int quickcopy, /* I - Do a quick copy? */ in copy_attrs()
4035 cups_array_t *exclude) /* I - Attributes to exclude? */ in copy_attrs()
4047 for (fromattr = from->attrs; fromattr; fromattr = fromattr->next) in copy_attrs()
4053 if ((group != IPP_TAG_ZERO && fromattr->group_tag != group && in copy_attrs()
4054 fromattr->group_tag != IPP_TAG_ZERO) || !fromattr->name) in copy_attrs()
4057 if (!strcmp(fromattr->name, "document-password") || in copy_attrs()
4058 !strcmp(fromattr->name, "job-authorization-uri") || in copy_attrs()
4059 !strcmp(fromattr->name, "job-password") || in copy_attrs()
4060 !strcmp(fromattr->name, "job-password-encryption") || in copy_attrs()
4061 !strcmp(fromattr->name, "job-printer-uri")) in copy_attrs()
4065 (cupsArrayFind(exclude, fromattr->name) || in copy_attrs()
4070 * job-id attribute regardless of the security settings for IPP in copy_attrs()
4073 * The job-printer-uri attribute is handled by copy_job_attrs(). in copy_attrs()
4078 if (strcmp(fromattr->name, "job-id")) in copy_attrs()
4082 if (!ra || cupsArrayFind(ra, fromattr->name)) in copy_attrs()
4087 * media-col-database unless specifically requested by the client. in copy_attrs()
4090 if (fromattr->value_tag == IPP_TAG_BEGIN_COLLECTION && in copy_attrs()
4092 (to->request.status.version[0] == 1 || in copy_attrs()
4093 !strcmp(fromattr->name, "media-col-database"))) in copy_attrs()
4103 * 'copy_banner()' - Copy a banner file to the requests directory for the
4104 * specified job.
4107 static int /* O - Size of banner file in kbytes */
4108 copy_banner(cupsd_client_t *con, /* I - Client connection */ in copy_banner()
4109 cupsd_job_t *job, /* I - Job information */ in copy_banner() argument
4110 const char *name) /* I - Name of banner */ in copy_banner() argument
4114 char filename[1024]; /* Job filename */ in copy_banner()
4119 char attrname[255], /* Name of attribute */ in copy_banner()
4120 *s; /* Pointer into name */ in copy_banner()
4125 "copy_banner(con=%p[%d], job=%p[%d], name=\"%s\")", in copy_banner()
4126 con, con ? con->number : -1, job, job->id, in copy_banner()
4127 name ? name : "(null)"); in copy_banner()
4133 if (!name || !strcmp(name, "none") || in copy_banner()
4134 (banner = cupsdFindBanner(name)) == NULL) in copy_banner()
4138 * Open the banner and job files... in copy_banner()
4141 if (add_file(con, job, banner->filetype, 0)) in copy_banner()
4142 return (-1); in copy_banner()
4144 snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, in copy_banner()
4145 job->num_files); in copy_banner()
4149 "Unable to create banner job file %s - %s", in copy_banner()
4151 job->num_files --; in copy_banner()
4162 strlcpy(attrname, job->attrs->attrs->next->values[0].string.text, in copy_banner()
4164 if (strlen(attrname) > 2 && attrname[2] == '-') in copy_banner()
4167 * Convert ll-cc to ll_CC... in copy_banner()
4176 attrname, name); in copy_banner()
4181 * Wasn't able to find "ll_CC" locale file; try the non-national in copy_banner()
4188 attrname, name); in copy_banner()
4194 * Use the non-localized banner file. in copy_banner()
4197 snprintf(filename, sizeof(filename), "%s/banners/%s", DataDir, name); in copy_banner()
4205 "Unable to open banner template file %s - %s", in copy_banner()
4207 job->num_files --; in copy_banner()
4219 * Get an attribute name... in copy_banner()
4223 if (!isalpha(ch & 255) && ch != '-' && ch != '?') in copy_banner()
4225 else if (s < (attrname + sizeof(attrname) - 1)) in copy_banner()
4235 * Ignore { followed by stuff that is not an attribute name... in copy_banner()
4251 if (!strcmp(s, "printer-name")) in copy_banner()
4253 cupsFilePuts(out, job->dest); in copy_banner()
4256 else if ((attr = ippFindAttribute(job->attrs, s, IPP_TAG_ZERO)) == NULL) in copy_banner()
4265 * Nope, write to file as-is; probably a PostScript procedure... in copy_banner()
4278 for (i = 0; i < attr->num_values; i ++) in copy_banner()
4283 switch (attr->value_tag) in copy_banner()
4287 if (!strncmp(s, "time-at-", 8)) in copy_banner()
4291 tv.tv_sec = attr->values[i].integer; in copy_banner()
4297 cupsFilePrintf(out, "%d", attr->values[i].integer); in copy_banner()
4301 cupsFilePrintf(out, "%d", attr->values[i].boolean); in copy_banner()
4309 cupsFilePrintf(out, "%d-%d", attr->values[i].range.lower, in copy_banner()
4310 attr->values[i].range.upper); in copy_banner()
4314 cupsFilePrintf(out, "%dx%d%s", attr->values[i].resolution.xres, in copy_banner()
4315 attr->values[i].resolution.yres, in copy_banner()
4316 attr->values[i].resolution.units == IPP_RES_PER_INCH ? in copy_banner()
4327 if (!_cups_strcasecmp(banner->filetype->type, "postscript")) in copy_banner()
4335 for (p = attr->values[i].string.text; *p; p ++) in copy_banner()
4349 cupsFilePuts(out, attr->values[i].string.text); in copy_banner()
4353 break; /* anti-compiler-warning-code */ in copy_banner()
4373 job->koctets += kbytes; in copy_banner()
4375 if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL) in copy_banner()
4376 attr->values[0].integer += kbytes; in copy_banner()
4385 * 'copy_file()' - Copy a PPD file...
4388 static int /* O - 0 = success, -1 = error */
4389 copy_file(const char *from, /* I - Source file */ in copy_file()
4390 const char *to, /* I - Destination file */ in copy_file()
4391 mode_t mode) /* I - Permissions */ in copy_file()
4406 return (-1); in copy_file()
4411 return (-1); in copy_file()
4423 return (-1); in copy_file()
4437 * 'copy_model()' - Copy a PPD model file, substituting default values
4441 static int /* O - 0 = success, -1 = error */
4442 copy_model(cupsd_client_t *con, /* I - Client connection */ in copy_model()
4443 const char *from, /* I - Source file */ in copy_model()
4444 const char *to) /* I - Destination file */ in copy_model()
4451 int temppid; /* Process ID of cups-driverd */ in copy_model()
4453 char *argv[4], /* Command-line arguments */ in copy_model()
4462 char option[PPD_MAX_NAME], /* Option name */ in copy_model()
4463 choice[PPD_MAX_NAME]; /* Choice name */ in copy_model()
4474 * Run cups-driverd to get the PPD file... in copy_model()
4477 argv[0] = "cups-driverd"; in copy_model()
4484 snprintf(buffer, sizeof(buffer), "%s/daemon/cups-driverd", ServerBin); in copy_model()
4485 snprintf(tempfile, sizeof(tempfile), "%s/%d.ppd", TempDir, con->number); in copy_model()
4488 return (-1); in copy_model()
4491 "copy_model: Running \"cups-driverd cat %s\"...", from); in copy_model()
4493 if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1], in copy_model()
4494 -1, -1, 0, DefaultProfile, NULL, &temppid)) in copy_model()
4499 return (-1); in copy_model()
4571 * No data from cups-deviced... in copy_model()
4576 return (-1); in copy_model()
4586 return (-1); in copy_model()
4597 return (-1); in copy_model()
4650 num_defaults = cupsAddOption("PageSize", size->name, in copy_model()
4652 num_defaults = cupsAddOption("PageRegion", size->name, in copy_model()
4654 num_defaults = cupsAddOption("PaperDimension", size->name, in copy_model()
4656 num_defaults = cupsAddOption("ImageableArea", size->name, in copy_model()
4671 return (-1); in copy_model()
4726 * 'copy_job_attrs()' - Copy job attributes.
4730 copy_job_attrs(cupsd_client_t *con, /* I - Client connection */ in copy_job_attrs()
4731 cupsd_job_t *job, /* I - Job */ in copy_job_attrs() argument
4732 cups_array_t *ra, /* I - Requested attributes array */ in copy_job_attrs()
4733 cups_array_t *exclude) /* I - Private attributes array */ in copy_job_attrs()
4735 char job_uri[HTTP_MAX_URI]; /* Job URI */ in copy_job_attrs()
4739 * Send the requested attributes for each job... in copy_job_attrs()
4744 if ((!exclude || !cupsArrayFind(exclude, "number-of-documents")) && in copy_job_attrs()
4745 (!ra || cupsArrayFind(ra, "number-of-documents"))) in copy_job_attrs()
4746 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, in copy_job_attrs()
4747 "number-of-documents", job->num_files); in copy_job_attrs()
4749 if ((!exclude || !cupsArrayFind(exclude, "job-media-progress")) && in copy_job_attrs()
4750 (!ra || cupsArrayFind(ra, "job-media-progress"))) in copy_job_attrs()
4751 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, in copy_job_attrs()
4752 "job-media-progress", job->progress); in copy_job_attrs()
4754 if ((!exclude || !cupsArrayFind(exclude, "job-more-info")) && in copy_job_attrs()
4755 (!ra || cupsArrayFind(ra, "job-more-info"))) in copy_job_attrs()
4758 NULL, con->clientname, con->clientport, "/jobs/%d", in copy_job_attrs()
4759 job->id); in copy_job_attrs()
4760 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, in copy_job_attrs()
4761 "job-more-info", NULL, job_uri); in copy_job_attrs()
4764 if (job->state_value > IPP_JOB_PROCESSING && in copy_job_attrs()
4765 (!exclude || !cupsArrayFind(exclude, "job-preserved")) && in copy_job_attrs()
4766 (!ra || cupsArrayFind(ra, "job-preserved"))) in copy_job_attrs()
4767 ippAddBoolean(con->response, IPP_TAG_JOB, "job-preserved", in copy_job_attrs()
4768 job->num_files > 0); in copy_job_attrs()
4770 if ((!exclude || !cupsArrayFind(exclude, "job-printer-up-time")) && in copy_job_attrs()
4771 (!ra || cupsArrayFind(ra, "job-printer-up-time"))) in copy_job_attrs()
4772 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, in copy_job_attrs()
4773 "job-printer-up-time", time(NULL)); in copy_job_attrs()
4776 if (!ra || cupsArrayFind(ra, "job-printer-uri")) in copy_job_attrs()
4779 con->clientname, con->clientport, in copy_job_attrs()
4780 (job->dtype & CUPS_PRINTER_CLASS) ? "/classes/%s" : in copy_job_attrs()
4782 job->dest); in copy_job_attrs()
4783 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, in copy_job_attrs()
4784 "job-printer-uri", NULL, job_uri); in copy_job_attrs()
4787 if (!ra || cupsArrayFind(ra, "job-uri")) in copy_job_attrs()
4790 con->clientname, con->clientport, "/jobs/%d", in copy_job_attrs()
4791 job->id); in copy_job_attrs()
4792 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, in copy_job_attrs()
4793 "job-uri", NULL, job_uri); in copy_job_attrs()
4796 if (job->attrs) in copy_job_attrs()
4798 copy_attrs(con->response, job->attrs, ra, IPP_TAG_JOB, 0, exclude); in copy_job_attrs()
4803 * Generate attributes from the job structure... in copy_job_attrs()
4806 if (job->completed_time && (!ra || cupsArrayFind(ra, "date-time-at-completed"))) in copy_job_attrs()
4807 …ippAddDate(con->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed_time… in copy_job_attrs()
4809 if (job->creation_time && (!ra || cupsArrayFind(ra, "date-time-at-creation"))) in copy_job_attrs()
4810 …ippAddDate(con->response, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(job->creation_time)); in copy_job_attrs()
4812 if (!ra || cupsArrayFind(ra, "job-id")) in copy_job_attrs()
4813 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); in copy_job_attrs()
4815 if (!ra || cupsArrayFind(ra, "job-k-octets")) in copy_job_attrs()
4816 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", job->koctets); in copy_job_attrs()
4818 if (job->name && (!ra || cupsArrayFind(ra, "job-name"))) in copy_job_attrs()
4819 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, job->name); in copy_job_attrs()
4821 if (job->username && (!ra || cupsArrayFind(ra, "job-originating-user-name"))) in copy_job_attrs()
4822 …ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-user-name", NULL, job->use… in copy_job_attrs()
4824 if (!ra || cupsArrayFind(ra, "job-state")) in copy_job_attrs()
4825 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value); in copy_job_attrs()
4827 if (!ra || cupsArrayFind(ra, "job-state-reasons")) in copy_job_attrs()
4829 switch (job->state_value) in copy_job_attrs()
4834 …ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-aborted- in copy_job_attrs()
4837 …ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-canceled in copy_job_attrs()
4840 …ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-complete… in copy_job_attrs()
4845 if (job->completed_time && (!ra || cupsArrayFind(ra, "time-at-completed"))) in copy_job_attrs()
4846 …ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-completed", (int)job->complete… in copy_job_attrs()
4848 if (job->creation_time && (!ra || cupsArrayFind(ra, "time-at-creation"))) in copy_job_attrs()
4849 …ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)job->creation_… in copy_job_attrs()
4855 * 'copy_printer_attrs()' - Copy printer attributes.
4860 cupsd_client_t *con, /* I - Client connection */ in copy_printer_attrs()
4861 cupsd_printer_t *printer, /* I - Printer */ in copy_printer_attrs()
4862 cups_array_t *ra) /* I - Requested attributes array */ in copy_printer_attrs()
4867 int is_encrypted = httpIsEncrypted(con->http); in copy_printer_attrs()
4872 * Copy the printer attributes to the response using requested-attributes in copy_printer_attrs()
4873 * and document-format attributes that may be provided by the client. in copy_printer_attrs()
4876 _cupsRWLockRead(&printer->lock); in copy_printer_attrs()
4880 if (!ra || cupsArrayFind(ra, "marker-change-time")) in copy_printer_attrs()
4881 …ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "marker-change-time", printer->mark… in copy_printer_attrs()
4883 if (printer->num_printers > 0 && (!ra || cupsArrayFind(ra, "member-uris"))) in copy_printer_attrs()
4885 ipp_attribute_t *member_uris; /* member-uris attribute */ in copy_printer_attrs()
4887 ipp_attribute_t *p2_uri; /* printer-uri-supported for class printer */ in copy_printer_attrs()
4890 …if ((member_uris = ippAddStrings(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", print… in copy_printer_attrs()
4892 for (i = 0; i < printer->num_printers; i ++) in copy_printer_attrs()
4894 p2 = printer->printers[i]; in copy_printer_attrs()
4896 if ((p2_uri = ippFindAttribute(p2->attrs, "printer-uri-supported", IPP_TAG_URI)) != NULL) in copy_printer_attrs()
4898 member_uris->values[i].string.text = _cupsStrAlloc(p2_uri->values[0].string.text); in copy_printer_attrs()
4902 …ipps" : "ipp", NULL, con->clientname, con->clientport, (p2->type & CUPS_PRINTER_CLASS) ? "/classes… in copy_printer_attrs()
4903 member_uris->values[i].string.text = _cupsStrAlloc(uri); in copy_printer_attrs()
4909 if (printer->alert && (!ra || cupsArrayFind(ra, "printer-alert"))) in copy_printer_attrs()
4910 …ippAddOctetString(con->response, IPP_TAG_PRINTER, "printer-alert", printer->alert, (int)strlen(pri… in copy_printer_attrs()
4912 if (printer->alert_description && (!ra || cupsArrayFind(ra, "printer-alert-description"))) in copy_printer_attrs()
4913 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-alert-description", NULL, prin… in copy_printer_attrs()
4915 if (!ra || cupsArrayFind(ra, "printer-config-change-date-time")) in copy_printer_attrs()
4916 …ippAddDate(con->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printe… in copy_printer_attrs()
4918 if (!ra || cupsArrayFind(ra, "printer-config-change-time")) in copy_printer_attrs()
4919 …ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-config-change-time", print… in copy_printer_attrs()
4921 if (!ra || cupsArrayFind(ra, "printer-current-time")) in copy_printer_attrs()
4922 ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(curtime)); in copy_printer_attrs()
4925 if (!ra || cupsArrayFind(ra, "printer-dns-sd-name")) in copy_printer_attrs()
4927 if (printer->reg_name) in copy_printer_attrs()
4928 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-dns-sd-name", NULL, printer->r… in copy_printer_attrs()
4930 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "printer-dns-sd-name", 0); in copy_printer_attrs()
4934 if (!ra || cupsArrayFind(ra, "printer-error-policy")) in copy_printer_attrs()
4935 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-error-policy", NULL, printer->… in copy_printer_attrs()
4937 if (!ra || cupsArrayFind(ra, "printer-error-policy-supported")) in copy_printer_attrs()
4939 static const char * const errors[] =/* printer-error-policy-supported values */ in copy_printer_attrs()
4941 "abort-job", in copy_printer_attrs()
4942 "retry-current-job", in copy_printer_attrs()
4943 "retry-job", in copy_printer_attrs()
4944 "stop-printer" in copy_printer_attrs()
4947 if (printer->type & CUPS_PRINTER_CLASS) in copy_printer_attrs()
4948 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "printer-error-policy-su… in copy_printer_attrs()
4950 …ippAddStrings(con->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "printer-error-policy-s… in copy_printer_attrs()
4953 if (!ra || cupsArrayFind(ra, "printer-icons")) in copy_printer_attrs()
4955 …i), is_encrypted ? "https" : "http", NULL, con->clientname, con->clientport, "/icons/%s.png", prin… in copy_printer_attrs()
4956 ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", NULL, uri); in copy_printer_attrs()
4957 cupsdLogMessage(CUPSD_LOG_DEBUG2, "printer-icons=\"%s\"", uri); in copy_printer_attrs()
4960 if (!ra || cupsArrayFind(ra, "printer-is-accepting-jobs")) in copy_printer_attrs()
4961 …ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", (char)printer->acceptin… in copy_printer_attrs()
4963 if (!ra || cupsArrayFind(ra, "printer-is-shared")) in copy_printer_attrs()
4964 ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-shared", (char)printer->shared); in copy_printer_attrs()
4966 if (!ra || cupsArrayFind(ra, "printer-is-temporary")) in copy_printer_attrs()
4967 ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-temporary", (char)printer->temporary); in copy_printer_attrs()
4969 if (!ra || cupsArrayFind(ra, "printer-more-info")) in copy_printer_attrs()
4971 …: "http", NULL, con->clientname, con->clientport, (printer->type & CUPS_PRINTER_CLASS) ? "/classes… in copy_printer_attrs()
4972 ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, uri); in copy_printer_attrs()
4975 if (!ra || cupsArrayFind(ra, "printer-op-policy")) in copy_printer_attrs()
4976 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-op-policy", NULL, printer->op_… in copy_printer_attrs()
4978 if (!ra || cupsArrayFind(ra, "printer-state")) in copy_printer_attrs()
4979 … ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state); in copy_printer_attrs()
4981 if (!ra || cupsArrayFind(ra, "printer-state-change-date-time")) in copy_printer_attrs()
4982 …ippAddDate(con->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer in copy_printer_attrs()
4984 if (!ra || cupsArrayFind(ra, "printer-state-change-time")) in copy_printer_attrs()
4985 …ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-state-change-time", printe… in copy_printer_attrs()
4987 if (!ra || cupsArrayFind(ra, "printer-state-message")) in copy_printer_attrs()
4988 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-state-message", NULL, printer- in copy_printer_attrs()
4990 if (!ra || cupsArrayFind(ra, "printer-state-reasons")) in copy_printer_attrs()
4993 if (!ra || cupsArrayFind(ra, "printer-strings-uri")) in copy_printer_attrs()
4995 … is_encrypted ? "https" : "http", NULL, con->clientname, con->clientport, "/strings/%s.strings", p… in copy_printer_attrs()
4996 ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-strings-uri", NULL, uri); in copy_printer_attrs()
4997 cupsdLogMessage(CUPSD_LOG_DEBUG2, "printer-strings-uri=\"%s\"", uri); in copy_printer_attrs()
5000 if (!ra || cupsArrayFind(ra, "printer-type")) in copy_printer_attrs()
5002 cups_ptype_t type; /* printer-type value */ in copy_printer_attrs()
5005 * Add the CUPS-specific printer-type attribute... in copy_printer_attrs()
5008 type = printer->type; in copy_printer_attrs()
5013 if (!printer->accepting) in copy_printer_attrs()
5016 if (!printer->shared) in copy_printer_attrs()
5019 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-type", (int)type); in copy_printer_attrs()
5022 if (!ra || cupsArrayFind(ra, "printer-up-time")) in copy_printer_attrs()
5023 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", curtime); in copy_printer_attrs()
5025 if (!ra || cupsArrayFind(ra, "printer-uri-supported")) in copy_printer_attrs()
5027 … : "ipp", NULL, con->clientname, con->clientport, (printer->type & CUPS_PRINTER_CLASS) ? "/classes… in copy_printer_attrs()
5028 ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri); in copy_printer_attrs()
5029 cupsdLogMessage(CUPSD_LOG_DEBUG2, "printer-uri-supported=\"%s\"", uri); in copy_printer_attrs()
5032 if (!ra || cupsArrayFind(ra, "queued-job-count")) in copy_printer_attrs()
5035 if (!ra || cupsArrayFind(ra, "uri-security-supported")) in copy_printer_attrs()
5036 …ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "uri-security-supported", NULL, is_e… in copy_printer_attrs()
5038 copy_attrs(con->response, printer->attrs, ra, IPP_TAG_ZERO, 0, NULL); in copy_printer_attrs()
5039 if (printer->ppd_attrs) in copy_printer_attrs()
5040 copy_attrs(con->response, printer->ppd_attrs, ra, IPP_TAG_ZERO, 0, NULL); in copy_printer_attrs()
5041 copy_attrs(con->response, CommonData, ra, IPP_TAG_ZERO, IPP_TAG_COPY, NULL); in copy_printer_attrs()
5043 _cupsRWUnlock(&printer->lock); in copy_printer_attrs()
5048 * 'copy_subscription_attrs()' - Copy subscription attributes.
5053 cupsd_client_t *con, /* I - Client connection */ in copy_subscription_attrs()
5054 cupsd_subscription_t *sub, /* I - Subscription */ in copy_subscription_attrs()
5055 cups_array_t *ra, /* I - Requested attributes array */ in copy_subscription_attrs()
5056 cups_array_t *exclude) /* I - Private attributes array */ in copy_subscription_attrs()
5063 const char *name; /* Current event name */ in copy_subscription_attrs() local
5072 * requested-attributes attribute that may be provided by the client. in copy_subscription_attrs()
5077 if ((!exclude || !cupsArrayFind(exclude, "notify-events")) && in copy_subscription_attrs()
5078 (!ra || cupsArrayFind(ra, "notify-events"))) in copy_subscription_attrs()
5080 cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_subscription_attrs: notify-events"); in copy_subscription_attrs()
5082 if ((name = cupsdEventName((cupsd_eventmask_t)sub->mask)) != NULL) in copy_subscription_attrs()
5088 …ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events",… in copy_subscription_attrs()
5097 if (sub->mask & mask) in copy_subscription_attrs()
5100 …attr = ippAddStrings(con->response, IPP_TAG_SUBSCRIPTION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify- in copy_subscription_attrs()
5103 if (sub->mask & mask) in copy_subscription_attrs()
5105 attr->values[count].string.text = (char *)cupsdEventName((cupsd_eventmask_t)mask); in copy_subscription_attrs()
5112 if ((!exclude || !cupsArrayFind(exclude, "notify-lease-duration")) && in copy_subscription_attrs()
5113 (!sub->job && (!ra || cupsArrayFind(ra, "notify-lease-duration")))) in copy_subscription_attrs()
5114 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in copy_subscription_attrs()
5115 "notify-lease-duration", sub->lease); in copy_subscription_attrs()
5117 if ((!exclude || !cupsArrayFind(exclude, "notify-recipient-uri")) && in copy_subscription_attrs()
5118 (sub->recipient && (!ra || cupsArrayFind(ra, "notify-recipient-uri")))) in copy_subscription_attrs()
5119 ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, in copy_subscription_attrs()
5120 "notify-recipient-uri", NULL, sub->recipient); in copy_subscription_attrs()
5121 else if ((!exclude || !cupsArrayFind(exclude, "notify-pull-method")) && in copy_subscription_attrs()
5122 (!ra || cupsArrayFind(ra, "notify-pull-method"))) in copy_subscription_attrs()
5123 ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, in copy_subscription_attrs()
5124 "notify-pull-method", NULL, "ippget"); in copy_subscription_attrs()
5126 if ((!exclude || !cupsArrayFind(exclude, "notify-subscriber-user-name")) && in copy_subscription_attrs()
5127 (!ra || cupsArrayFind(ra, "notify-subscriber-user-name"))) in copy_subscription_attrs()
5128 ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_NAME, in copy_subscription_attrs()
5129 "notify-subscriber-user-name", NULL, sub->owner); in copy_subscription_attrs()
5131 if ((!exclude || !cupsArrayFind(exclude, "notify-time-interval")) && in copy_subscription_attrs()
5132 (!ra || cupsArrayFind(ra, "notify-time-interval"))) in copy_subscription_attrs()
5133 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in copy_subscription_attrs()
5134 "notify-time-interval", sub->interval); in copy_subscription_attrs()
5136 if (sub->user_data_len > 0 && in copy_subscription_attrs()
5137 (!exclude || !cupsArrayFind(exclude, "notify-user-data")) && in copy_subscription_attrs()
5138 (!ra || cupsArrayFind(ra, "notify-user-data"))) in copy_subscription_attrs()
5139 ippAddOctetString(con->response, IPP_TAG_SUBSCRIPTION, "notify-user-data", in copy_subscription_attrs()
5140 sub->user_data, sub->user_data_len); in copy_subscription_attrs()
5143 if (sub->job && (!ra || cupsArrayFind(ra, "notify-job-id"))) in copy_subscription_attrs()
5144 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in copy_subscription_attrs()
5145 "notify-job-id", sub->job->id); in copy_subscription_attrs()
5147 if (sub->dest && (!ra || cupsArrayFind(ra, "notify-printer-uri"))) in copy_subscription_attrs()
5150 "ipp", NULL, con->clientname, con->clientport, in copy_subscription_attrs()
5151 "/printers/%s", sub->dest->name); in copy_subscription_attrs()
5152 ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, in copy_subscription_attrs()
5153 "notify-printer-uri", NULL, printer_uri); in copy_subscription_attrs()
5156 if (!ra || cupsArrayFind(ra, "notify-subscription-id")) in copy_subscription_attrs()
5157 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in copy_subscription_attrs()
5158 "notify-subscription-id", sub->id); in copy_subscription_attrs()
5163 * 'create_job()' - Print a file to a printer or class.
5167 create_job(cupsd_client_t *con, /* I - Client connection */ in create_job()
5168 ipp_attribute_t *uri) /* I - Printer URI */ in create_job()
5172 cupsd_job_t *job; /* New job */ in create_job() local
5176 "document-format", in create_job()
5177 "document-name", in create_job()
5178 "document-natural-language" in create_job()
5183 con->number, uri->values[0].string.text); in create_job()
5189 if (!cupsdValidateDest(uri->values[0].string.text, NULL, &printer)) in create_job()
5201 * Check for invalid Create-Job attributes and log a warning or error depending in create_job()
5208 if (ippFindAttribute(con->request, forbidden_attrs[i], IPP_TAG_ZERO)) in create_job()
5214 "Create-Job request."), forbidden_attrs[i]); in create_job()
5219 "Unexpected '%s' operation attribute in a Create-Job " in create_job()
5224 * Create the job object... in create_job()
5227 if ((job = add_job(con, printer, NULL)) == NULL) in create_job()
5230 job->pending_timeout = 1; in create_job()
5233 * Save and log the job... in create_job()
5236 cupsdLogJob(job, CUPSD_LOG_INFO, "Queued on \"%s\" by \"%s\".", in create_job()
5237 job->dest, job->username); in create_job()
5242 * 'create_local_bg_thread()' - Background thread for creating a local print queue.
5245 static void * /* O - Exit status */
5247 cupsd_printer_t *printer) /* I - Printer */ in create_local_bg_thread()
5268 "media-col-database" in create_local_bg_thread()
5276 …age(CUPSD_LOG_DEBUG, "%s: Generating PPD file from \"%s\"...", printer->name, printer->device_uri); in create_local_bg_thread()
5278 …if (httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, sizeof(scheme), userpass, si… in create_local_bg_thread()
5280 …cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Bad device URI \"%s\".", printer->name, printer->device_uri); in create_local_bg_thread()
5291 …cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Unable to connect to %s:%d: %s", printer->name, host, port, … in create_local_bg_thread()
5299 …CUPSD_LOG_DEBUG, "%s: Connected to %s:%d, sending Get-Printer-Attributes request...", printer->nam… in create_local_bg_thread()
5303 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, printer->device_uri); in create_local_bg_thread()
5304 …ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pa… in create_local_bg_thread()
5309 …cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: Get-Printer-Attributes returned %s (%s)", printer->name, ipp… in create_local_bg_thread()
5320 …cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: Re-sending Get-Printer-Attributes request using IPP/1.1...",… in create_local_bg_thread()
5324 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, printer->device_uri); in create_local_bg_thread()
5325 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "all"); in create_local_bg_thread()
5329 …cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: IPP/1.1 Get-Printer-Attributes returned %s (%s)", printer->n… in create_local_bg_thread()
5341 _cupsRWLockWrite(&printer->lock); in create_local_bg_thread()
5343 …if ((!printer->info || !*(printer->info)) && (attr = ippFindAttribute(response, "printer-info", IP… in create_local_bg_thread()
5344 cupsdSetString(&printer->info, ippGetString(attr, 0, NULL)); in create_local_bg_thread()
5346 …if ((!printer->location || !*(printer->location)) && (attr = ippFindAttribute(response, "printer-l… in create_local_bg_thread()
5347 cupsdSetString(&printer->location, ippGetString(attr, 0, NULL)); in create_local_bg_thread()
5349 …if ((!printer->geo_location || !*(printer->geo_location)) && (attr = ippFindAttribute(response, "p… in create_local_bg_thread()
5350 cupsdSetString(&printer->geo_location, ippGetString(attr, 0, NULL)); in create_local_bg_thread()
5352 _cupsRWUnlock(&printer->lock); in create_local_bg_thread()
5356 …cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Unable to read generated PPD: %s", printer->name, strerror(e… in create_local_bg_thread()
5360 snprintf(toppd, sizeof(toppd), "%s/ppd/%s.ppd", ServerRoot, printer->name); in create_local_bg_thread()
5363 …cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Unable to create PPD for printer: %s", printer->name, strerr… in create_local_bg_thread()
5374 printer->config_time = time(NULL); in create_local_bg_thread()
5375 printer->state = IPP_PSTATE_IDLE; in create_local_bg_thread()
5376 printer->accepting = 1; in create_local_bg_thread()
5380 …vent(CUPSD_EVENT_PRINTER_CONFIG, printer, NULL, "Printer \"%s\" is now available.", printer->name); in create_local_bg_thread()
5381 cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" is now available.", printer->name); in create_local_bg_thread()
5385 …cupsdLogMessage(CUPSD_LOG_ERROR, "%s: PPD creation failed: %s", printer->name, cupsLastErrorString… in create_local_bg_thread()
5392 * 'create_local_printer()' - Create a local (temporary) print queue.
5397 cupsd_client_t *con) /* I - Client connection */ in create_local_printer()
5399 ipp_attribute_t *device_uri, /* device-uri attribute */ in create_local_printer()
5400 *printer_geo_location, /* printer-geo-location attribute */ in create_local_printer()
5401 *printer_info, /* printer-info attribute */ in create_local_printer()
5402 *printer_location, /* printer-location attribute */ in create_local_printer()
5403 *printer_name; /* printer-name attribute */ in create_local_printer()
5406 char name[128], /* Sanitized printer name */ in create_local_printer() local
5407 *nameptr, /* Pointer into name */ in create_local_printer()
5408 uri[1024]; /* printer-uri-supported value */ in create_local_printer()
5416 if (!httpAddrLocalhost(httpGetAddress(con->http))) in create_local_printer()
5436 …if ((printer_name = ippFindAttribute(con->request, "printer-name", IPP_TAG_ZERO)) == NULL || ippGe… in create_local_printer()
5439 …status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing required attribute \"%s\"."), "printer-name"); in create_local_printer()
5441 …s(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attribute \"%s\" is in the wrong group."), "printer-name"); in create_local_printer()
5443 …con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attribute \"%s\" is the wrong value type."), "printer-name"); in create_local_printer()
5448 …for (nameptr = name, ptr = ippGetString(printer_name, 0, NULL); *ptr && nameptr < (name + sizeof(n… in create_local_printer()
5451 * Sanitize the printer name... in create_local_printer()
5456 else if (nameptr == name || nameptr[-1] != '_') in create_local_printer()
5462 …if ((device_uri = ippFindAttribute(con->request, "device-uri", IPP_TAG_ZERO)) == NULL || ippGetGro… in create_local_printer()
5465 …p_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing required attribute \"%s\"."), "device-uri"); in create_local_printer()
5467 …tus(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attribute \"%s\" is in the wrong group."), "device-uri"); in create_local_printer()
5469 …s(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attribute \"%s\" is the wrong value type."), "device-uri"); in create_local_printer()
5474 printer_geo_location = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI); in create_local_printer()
5475 printer_info = ippFindAttribute(con->request, "printer-info", IPP_TAG_TEXT); in create_local_printer()
5476 printer_location = ippFindAttribute(con->request, "printer-location", IPP_TAG_TEXT); in create_local_printer()
5482 if ((printer = cupsdFindDest(name)) != NULL) in create_local_printer()
5484 send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Printer \"%s\" already exists."), name); in create_local_printer()
5492 if ((printer = cupsdAddPrinter(name)) == NULL) in create_local_printer()
5498 printer->shared = 0; in create_local_printer()
5499 printer->temporary = 1; in create_local_printer()
5504 cupsdSetString(&printer->geo_location, ippGetString(printer_geo_location, 0, NULL)); in create_local_printer()
5506 cupsdSetString(&printer->info, ippGetString(printer_info, 0, NULL)); in create_local_printer()
5508 cupsdSetString(&printer->location, ippGetString(printer_location, 0, NULL)); in create_local_printer()
5526 …ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", (char)printer->acceptin… in create_local_printer()
5527 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state); in create_local_printer()
5530 …eof(uri), httpIsEncrypted(con->http) ? "ipps" : "ipp", NULL, con->clientname, con->clientport, "/p… in create_local_printer()
5531 ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri); in create_local_printer()
5536 * 'create_requested_array()' - Create an array for the requested-attributes.
5539 static cups_array_t * /* O - Array of attributes or NULL */
5540 create_requested_array(ipp_t *request) /* I - IPP request */ in create_requested_array()
5555 if (cupsArrayFind(ra, "printer-defaults")) in create_requested_array()
5558 * Include user-set defaults... in create_requested_array()
5561 char *name; /* Option name */ in create_requested_array() local
5563 cupsArrayRemove(ra, "printer-defaults"); in create_requested_array()
5565 for (name = (char *)cupsArrayFirst(CommonDefaults); in create_requested_array()
5566 name; in create_requested_array()
5567 name = (char *)cupsArrayNext(CommonDefaults)) in create_requested_array()
5568 if (!cupsArrayFind(ra, name)) in create_requested_array()
5569 cupsArrayAdd(ra, name); in create_requested_array()
5577 * 'create_subscriptions()' - Create one or more notification subscriptions.
5582 cupsd_client_t *con, /* I - Client connection */ in create_subscriptions()
5583 ipp_attribute_t *uri) /* I - Printer URI */ in create_subscriptions()
5599 cupsd_job_t *job; /* Job */ in create_subscriptions() local
5600 int jobid; /* Job ID */ in create_subscriptions()
5602 const char *username, /* requesting-user-name or in create_subscriptions()
5604 *recipient, /* notify-recipient-uri */ in create_subscriptions()
5605 *pullmethod; /* notify-pull-method */ in create_subscriptions()
5606 ipp_attribute_t *user_data; /* notify-user-data */ in create_subscriptions()
5607 int interval, /* notify-time-interval */ in create_subscriptions()
5608 lease; /* notify-lease-duration */ in create_subscriptions()
5609 unsigned mask; /* notify-events */ in create_subscriptions()
5610 ipp_attribute_t *notify_events,/* notify-events(-default) */ in create_subscriptions()
5611 *notify_lease; /* notify-lease-duration(-default) */ in create_subscriptions()
5615 for (attr = con->request->attrs; attr; attr = attr->next) in create_subscriptions()
5617 if (attr->group_tag != IPP_TAG_ZERO) in create_subscriptions()
5618 cupsdLogMessage(CUPSD_LOG_DEBUG2, "g%04x v%04x %s", attr->group_tag, in create_subscriptions()
5619 attr->value_tag, attr->name); in create_subscriptions()
5621 cupsdLogMessage(CUPSD_LOG_DEBUG2, "----SEP----"); in create_subscriptions()
5629 …D_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", con, con->number, uri->values[0].stri… in create_subscriptions()
5631 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in create_subscriptions()
5650 else if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in create_subscriptions()
5667 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, in create_subscriptions()
5691 for (attr = con->request->attrs; attr; attr = attr->next) in create_subscriptions()
5692 if (attr->group_tag == IPP_TAG_SUBSCRIPTION) in create_subscriptions()
5706 con->response->request.status.status_code = IPP_BAD_REQUEST; in create_subscriptions()
5720 notify_events = ippFindAttribute(printer->attrs, "notify-events-default", in create_subscriptions()
5722 notify_lease = ippFindAttribute(printer->attrs, in create_subscriptions()
5723 "notify-lease-duration-default", in create_subscriptions()
5727 lease = notify_lease->values[0].integer; in create_subscriptions()
5735 while (attr && attr->group_tag != IPP_TAG_ZERO) in create_subscriptions()
5737 if (!strcmp(attr->name, "notify-recipient-uri") && in create_subscriptions()
5738 attr->value_tag == IPP_TAG_URI) in create_subscriptions()
5748 recipient = attr->values[0].string.text; in create_subscriptions()
5756 _("Bad notify-recipient-uri \"%s\"."), recipient); in create_subscriptions()
5757 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in create_subscriptions()
5758 "notify-status-code", IPP_URI_SCHEME); in create_subscriptions()
5767 _("notify-recipient-uri URI \"%s\" uses unknown " in create_subscriptions()
5769 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in create_subscriptions()
5770 "notify-status-code", IPP_URI_SCHEME); in create_subscriptions()
5777 _("notify-recipient-uri URI \"%s\" is already used."), in create_subscriptions()
5779 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in create_subscriptions()
5780 "notify-status-code", IPP_ATTRIBUTES); in create_subscriptions()
5784 else if (!strcmp(attr->name, "notify-pull-method") && in create_subscriptions()
5785 attr->value_tag == IPP_TAG_KEYWORD) in create_subscriptions()
5787 pullmethod = attr->values[0].string.text; in create_subscriptions()
5792 _("Bad notify-pull-method \"%s\"."), pullmethod); in create_subscriptions()
5793 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, in create_subscriptions()
5794 "notify-status-code", IPP_ATTRIBUTES); in create_subscriptions()
5798 else if (!strcmp(attr->name, "notify-charset") && in create_subscriptions()
5799 attr->value_tag == IPP_TAG_CHARSET && in create_subscriptions()
5800 strcmp(attr->values[0].string.text, "us-ascii") && in create_subscriptions()
5801 strcmp(attr->values[0].string.text, "utf-8")) in create_subscriptions()
5805 attr->values[0].string.text); in create_subscriptions()
5808 else if (!strcmp(attr->name, "notify-natural-language") && in create_subscriptions()
5809 (attr->value_tag != IPP_TAG_LANGUAGE || in create_subscriptions()
5810 strcmp(attr->values[0].string.text, DefaultLanguage))) in create_subscriptions()
5814 attr->values[0].string.text); in create_subscriptions()
5817 else if (!strcmp(attr->name, "notify-user-data") && in create_subscriptions()
5818 attr->value_tag == IPP_TAG_STRING) in create_subscriptions()
5820 if (attr->num_values > 1 || attr->values[0].unknown.length > 63) in create_subscriptions()
5823 _("The notify-user-data value is too large " in create_subscriptions()
5825 attr->values[0].unknown.length); in create_subscriptions()
5831 else if (!strcmp(attr->name, "notify-events") && in create_subscriptions()
5832 attr->value_tag == IPP_TAG_KEYWORD) in create_subscriptions()
5834 else if (!strcmp(attr->name, "notify-lease-duration") && in create_subscriptions()
5835 attr->value_tag == IPP_TAG_INTEGER) in create_subscriptions()
5836 lease = attr->values[0].integer; in create_subscriptions()
5837 else if (!strcmp(attr->name, "notify-time-interval") && in create_subscriptions()
5838 attr->value_tag == IPP_TAG_INTEGER) in create_subscriptions()
5839 interval = attr->values[0].integer; in create_subscriptions()
5840 else if (!strcmp(attr->name, "notify-job-id") && in create_subscriptions()
5841 attr->value_tag == IPP_TAG_INTEGER) in create_subscriptions()
5842 jobid = attr->values[0].integer; in create_subscriptions()
5844 attr = attr->next; in create_subscriptions()
5849 for (i = 0; i < notify_events->num_values; i ++) in create_subscriptions()
5850 mask |= cupsdEventValue(notify_events->values[i].string.text); in create_subscriptions()
5862 memcpy(temp, user_data->values[0].unknown.data, (size_t)user_data->values[0].unknown.length); in create_subscriptions()
5863 temp[user_data->values[0].unknown.length] = '\0'; in create_subscriptions()
5867 send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad notify-user-data \"%s\"."), temp); in create_subscriptions()
5868 …ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", IPP_STATUS_… in create_subscriptions()
5876 cupsdLogMessage(CUPSD_LOG_DEBUG, "notify-lease-duration=%d", lease); in create_subscriptions()
5877 cupsdLogMessage(CUPSD_LOG_DEBUG, "notify-time-interval=%d", interval); in create_subscriptions()
5891 _("notify-events not specified.")); in create_subscriptions()
5899 "create_subscriptions: Limiting notify-lease-duration to " in create_subscriptions()
5907 if ((job = cupsdFindJob(jobid)) == NULL) in create_subscriptions()
5909 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in create_subscriptions()
5915 job = NULL; in create_subscriptions()
5917 if ((sub = cupsdAddSubscription(mask, printer, job, recipient, 0)) == NULL) in create_subscriptions()
5924 if (job) in create_subscriptions()
5925 cupsdLogMessage(CUPSD_LOG_DEBUG, "Added subscription #%d for job %d.", in create_subscriptions()
5926 sub->id, job->id); in create_subscriptions()
5930 sub->id, printer->name); in create_subscriptions()
5933 sub->id); in create_subscriptions()
5935 sub->interval = interval; in create_subscriptions()
5936 sub->lease = lease; in create_subscriptions()
5937 sub->expire = lease ? time(NULL) + lease : 0; in create_subscriptions()
5939 cupsdSetString(&sub->owner, username); in create_subscriptions()
5943 sub->user_data_len = user_data->values[0].unknown.length; in create_subscriptions()
5944 memcpy(sub->user_data, user_data->values[0].unknown.data, in create_subscriptions()
5945 (size_t)sub->user_data_len); in create_subscriptions()
5948 ippAddSeparator(con->response); in create_subscriptions()
5949 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in create_subscriptions()
5950 "notify-subscription-id", sub->id); in create_subscriptions()
5952 con->response->request.status.status_code = IPP_OK; in create_subscriptions()
5955 attr = attr->next; in create_subscriptions()
5963 * 'delete_printer()' - Remove a printer or class from the system.
5967 delete_printer(cupsd_client_t *con, /* I - Client connection */ in delete_printer()
5968 ipp_attribute_t *uri) /* I - URI of printer or class */ in delete_printer()
5978 con->number, uri->values[0].string.text); in delete_printer()
5984 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in delete_printer()
6009 cupsdCancelJobs(printer->name, NULL, 1); in delete_printer()
6018 printer->name, get_username(con)); in delete_printer()
6027 printer->name); in delete_printer()
6030 printer->name); in delete_printer()
6033 snprintf(filename, sizeof(filename), "%s/%s.png", CacheDir, printer->name); in delete_printer()
6036 snprintf(filename, sizeof(filename), "%s/%s.data", CacheDir, printer->name); in delete_printer()
6045 temporary = printer->temporary; in delete_printer()
6050 printer->name, get_username(con)); in delete_printer()
6059 printer->name, get_username(con)); in delete_printer()
6075 con->response->request.status.status_code = IPP_OK; in delete_printer()
6080 * 'get_default()' - Get the default destination.
6084 get_default(cupsd_client_t *con) /* I - Client connection */ in get_default()
6090 cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->number); in get_default()
6104 ra = create_requested_array(con->request); in get_default()
6110 con->response->request.status.status_code = IPP_OK; in get_default()
6118 * 'get_devices()' - Get the list of available devices on the local system.
6122 get_devices(cupsd_client_t *con) /* I - Client connection */ in get_devices()
6127 *requested, /* requested-attributes attribute */ in get_devices()
6128 *exclude, /* exclude-schemes attribute */ in get_devices()
6129 *include; /* include-schemes attribute */ in get_devices()
6130 char command[1024], /* cups-deviced command */ in get_devices()
6140 cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->number); in get_devices()
6153 * Run cups-deviced command with the given options... in get_devices()
6156 limit = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER); in get_devices()
6157 timeout = ippFindAttribute(con->request, "timeout", IPP_TAG_INTEGER); in get_devices()
6158 requested = ippFindAttribute(con->request, "requested-attributes", in get_devices()
6160 exclude = ippFindAttribute(con->request, "exclude-schemes", IPP_TAG_NAME); in get_devices()
6161 include = ippFindAttribute(con->request, "include-schemes", IPP_TAG_NAME); in get_devices()
6166 strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str)); in get_devices()
6178 snprintf(command, sizeof(command), "%s/daemon/cups-deviced", ServerBin); in get_devices()
6181 con->request->request.op.request_id, in get_devices()
6182 limit ? limit->values[0].integer : 0, in get_devices()
6183 timeout ? timeout->values[0].integer : 15, in get_devices()
6195 ippDelete(con->response); in get_devices()
6196 con->response = NULL; in get_devices()
6206 _("cups-deviced failed to execute.")); in get_devices()
6212 * 'get_document()' - Get a copy of a job file.
6216 get_document(cupsd_client_t *con, /* I - Client connection */ in get_document()
6217 ipp_attribute_t *uri) /* I - Job URI */ in get_document()
6221 int jobid; /* Job ID */ in get_document()
6223 cupsd_job_t *job; /* Current job */ in get_document() local
6234 con->number, uri->values[0].string.text); in get_document()
6237 * See if we have a job URI or a printer URI... in get_document()
6240 if (!strcmp(uri->name, "printer-uri")) in get_document()
6243 * Got a printer URI; see if we also have a job-id attribute... in get_document()
6246 if ((attr = ippFindAttribute(con->request, "job-id", in get_document()
6250 _("Got a printer-uri attribute but no job-id.")); in get_document()
6254 jobid = attr->values[0].integer; in get_document()
6259 * Got a job URI; parse it to get the job ID... in get_document()
6262 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in get_document()
6272 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in get_document()
6273 uri->values[0].string.text); in get_document()
6281 * See if the job exists... in get_document()
6284 if ((job = cupsdFindJob(jobid)) == NULL) in get_document()
6287 * Nope - return a "not found" error... in get_document()
6290 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in get_document()
6299 job->username)) != HTTP_OK) in get_document()
6309 if ((attr = ippFindAttribute(con->request, "document-number", in get_document()
6313 _("Missing document-number attribute.")); in get_document()
6317 if ((docnum = attr->values[0].integer) < 1 || docnum > job->num_files || in get_document()
6318 attr->num_values > 1) in get_document()
6321 _("Document #%d does not exist in job #%d."), docnum, in get_document()
6326 snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, jobid, in get_document()
6328 if ((con->file = open(filename, O_RDONLY)) == -1) in get_document()
6331 "Unable to open document %d in job %d - %s", docnum, jobid, in get_document()
6334 _("Unable to open document #%d in job #%d."), docnum, in get_document()
6339 fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); in get_document()
6341 cupsdLoadJob(job); in get_document()
6343 snprintf(format, sizeof(format), "%s/%s", job->filetypes[docnum - 1]->super, in get_document()
6344 job->filetypes[docnum - 1]->type); in get_document()
6346 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format", in get_document()
6348 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "document-number", in get_document()
6350 if ((attr = ippFindAttribute(job->attrs, "document-name", in get_document()
6352 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_NAME, "document-name", in get_document()
6353 NULL, attr->values[0].string.text); in get_document()
6358 * 'get_job_attrs()' - Get job attributes.
6362 get_job_attrs(cupsd_client_t *con, /* I - Client connection */ in get_job_attrs()
6363 ipp_attribute_t *uri) /* I - Job URI */ in get_job_attrs()
6367 int jobid; /* Job ID */ in get_job_attrs()
6368 cupsd_job_t *job; /* Current job */ in get_job_attrs() local
6381 con->number, uri->values[0].string.text); in get_job_attrs()
6384 * See if we have a job URI or a printer URI... in get_job_attrs()
6387 if (!strcmp(uri->name, "printer-uri")) in get_job_attrs()
6390 * Got a printer URI; see if we also have a job-id attribute... in get_job_attrs()
6393 if ((attr = ippFindAttribute(con->request, "job-id", in get_job_attrs()
6397 _("Got a printer-uri attribute but no job-id.")); in get_job_attrs()
6401 jobid = attr->values[0].integer; in get_job_attrs()
6406 * Got a job URI; parse it to get the job ID... in get_job_attrs()
6409 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in get_job_attrs()
6419 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in get_job_attrs()
6420 uri->values[0].string.text); in get_job_attrs()
6428 * See if the job exists... in get_job_attrs()
6431 if ((job = cupsdFindJob(jobid)) == NULL) in get_job_attrs()
6434 * Nope - return a "not found" error... in get_job_attrs()
6437 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in get_job_attrs()
6445 if ((printer = job->printer) == NULL) in get_job_attrs()
6446 printer = cupsdFindDest(job->dest); in get_job_attrs()
6449 policy = printer->op_policy_ptr; in get_job_attrs()
6453 if ((status = cupsdCheckPolicy(policy, con, job->username)) != HTTP_OK) in get_job_attrs()
6459 exclude = cupsdGetPrivateAttrs(policy, con, printer, job->username); in get_job_attrs()
6465 cupsdLoadJob(job); in get_job_attrs()
6467 ra = create_requested_array(con->request); in get_job_attrs()
6468 copy_job_attrs(con, job, ra, exclude); in get_job_attrs()
6471 con->response->request.status.status_code = IPP_OK; in get_job_attrs()
6476 * 'get_jobs()' - Get a list of jobs for the specified printer.
6480 get_jobs(cupsd_client_t *con, /* I - Client connection */ in get_jobs()
6481 ipp_attribute_t *uri) /* I - Printer URI */ in get_jobs()
6493 int job_comparison; /* Job comparison */ in get_jobs()
6494 ipp_jstate_t job_state; /* job-state value */ in get_jobs()
6495 int first_job_id = 1, /* First job ID */ in get_jobs()
6499 need_load_job = 0; /* Do we need to load the job? */ in get_jobs()
6500 const char *job_attr; /* Job attribute requested */ in get_jobs()
6501 ipp_attribute_t *job_ids; /* job-ids attribute */ in get_jobs()
6502 cupsd_job_t *job; /* Current job pointer */ in get_jobs() local
6504 cups_array_t *list; /* Which job list... */ in get_jobs()
6511 cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->number, in get_jobs()
6512 uri->values[0].string.text); in get_jobs()
6518 if (strcmp(uri->name, "printer-uri")) in get_jobs()
6520 send_ipp_status(con, IPP_BAD_REQUEST, _("No printer-uri in request.")); in get_jobs()
6524 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in get_jobs()
6549 else if ((dest = cupsdValidateDest(uri->values[0].string.text, &dtype, in get_jobs()
6571 policy = printer->op_policy_ptr; in get_jobs()
6581 job_ids = ippFindAttribute(con->request, "job-ids", IPP_TAG_INTEGER); in get_jobs()
6584 * See if the "which-jobs" attribute have been specified... in get_jobs()
6587 if ((attr = ippFindAttribute(con->request, "which-jobs", in get_jobs()
6591 _("The %s attribute cannot be provided with job-ids."), in get_jobs()
6592 "which-jobs"); in get_jobs()
6595 else if (!attr || !strcmp(attr->values[0].string.text, "not-completed")) in get_jobs()
6597 job_comparison = -1; in get_jobs()
6601 else if (!strcmp(attr->values[0].string.text, "completed")) in get_jobs()
6608 else if (!strcmp(attr->values[0].string.text, "aborted")) in get_jobs()
6615 else if (!strcmp(attr->values[0].string.text, "all")) in get_jobs()
6621 else if (!strcmp(attr->values[0].string.text, "canceled")) in get_jobs()
6628 else if (!strcmp(attr->values[0].string.text, "pending")) in get_jobs()
6634 else if (!strcmp(attr->values[0].string.text, "pending-held")) in get_jobs()
6640 else if (!strcmp(attr->values[0].string.text, "processing")) in get_jobs()
6646 else if (!strcmp(attr->values[0].string.text, "processing-stopped")) in get_jobs()
6655 _("The which-jobs value \"%s\" is not supported."), in get_jobs()
6656 attr->values[0].string.text); in get_jobs()
6657 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, in get_jobs()
6658 "which-jobs", NULL, attr->values[0].string.text); in get_jobs()
6666 if ((attr = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER)) != NULL) in get_jobs()
6671 _("The %s attribute cannot be provided with job-ids."), in get_jobs()
6676 limit = attr->values[0].integer; in get_jobs()
6679 if ((attr = ippFindAttribute(con->request, "first-index", IPP_TAG_INTEGER)) != NULL) in get_jobs()
6684 _("The %s attribute cannot be provided with job-ids."), in get_jobs()
6685 "first-index"); in get_jobs()
6689 first_index = attr->values[0].integer; in get_jobs()
6691 else if ((attr = ippFindAttribute(con->request, "first-job-id", IPP_TAG_INTEGER)) != NULL) in get_jobs()
6696 _("The %s attribute cannot be provided with job-ids."), in get_jobs()
6697 "first-job-id"); in get_jobs()
6701 first_job_id = attr->values[0].integer; in get_jobs()
6708 if ((attr = ippFindAttribute(con->request, "my-jobs", IPP_TAG_BOOLEAN)) != NULL && job_ids) in get_jobs()
6711 _("The %s attribute cannot be provided with job-ids."), in get_jobs()
6712 "my-jobs"); in get_jobs()
6715 else if (attr && attr->values[0].boolean) in get_jobs()
6720 ra = create_requested_array(con->request); in get_jobs()
6722 if (strcmp(job_attr, "job-id") && in get_jobs()
6723 strcmp(job_attr, "job-k-octets") && in get_jobs()
6724 strcmp(job_attr, "job-media-progress") && in get_jobs()
6725 strcmp(job_attr, "job-more-info") && in get_jobs()
6726 strcmp(job_attr, "job-name") && in get_jobs()
6727 strcmp(job_attr, "job-originating-user-name") && in get_jobs()
6728 strcmp(job_attr, "job-preserved") && in get_jobs()
6729 strcmp(job_attr, "job-printer-up-time") && in get_jobs()
6730 strcmp(job_attr, "job-printer-uri") && in get_jobs()
6731 strcmp(job_attr, "job-state") && in get_jobs()
6732 strcmp(job_attr, "job-state-reasons") && in get_jobs()
6733 strcmp(job_attr, "job-uri") && in get_jobs()
6734 strcmp(job_attr, "time-at-completed") && in get_jobs()
6735 strcmp(job_attr, "time-at-creation") && in get_jobs()
6736 strcmp(job_attr, "number-of-documents")) in get_jobs()
6745 * Limit expensive Get-Jobs for job history to 500 jobs... in get_jobs()
6748 ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "limit", 500); in get_jobs()
6751 ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "limit", limit); in get_jobs()
6755 cupsdLogClient(con, CUPSD_LOG_INFO, "Limiting Get-Jobs response to %d jobs.", limit); in get_jobs()
6766 for (i = 0; i < job_ids->num_values; i ++) in get_jobs()
6768 if (!cupsdFindJob(job_ids->values[i].integer)) in get_jobs()
6772 if (i < job_ids->num_values) in get_jobs()
6774 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in get_jobs()
6775 job_ids->values[i].integer); in get_jobs()
6779 for (i = 0; i < job_ids->num_values; i ++) in get_jobs()
6781 job = cupsdFindJob(job_ids->values[i].integer); in get_jobs()
6783 if (need_load_job && !job->attrs) in get_jobs()
6785 cupsdLoadJob(job); in get_jobs()
6787 if (!job->attrs) in get_jobs()
6789 cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", job->id); in get_jobs()
6795 ippAddSeparator(con->response); in get_jobs()
6797 exclude = cupsdGetPrivateAttrs(job->printer ? in get_jobs()
6798 job->printer->op_policy_ptr : in get_jobs()
6799 policy, con, job->printer, in get_jobs()
6800 job->username); in get_jobs()
6802 copy_job_attrs(con, job, ra, exclude); in get_jobs()
6808 job = (cupsd_job_t *)cupsArrayIndex(list, first_index - 1); in get_jobs()
6810 job = (cupsd_job_t *)cupsArrayFirst(list); in get_jobs()
6812 for (count = 0; (limit <= 0 || count < limit) && job; job = (cupsd_job_t *)cupsArrayNext(list)) in get_jobs()
6819 "get_jobs: job->id=%d, dest=\"%s\", username=\"%s\", " in get_jobs()
6820 "state_value=%d, attrs=%p", job->id, job->dest, in get_jobs()
6821 job->username, job->state_value, job->attrs); in get_jobs()
6823 if (!job->dest || !job->username) in get_jobs()
6824 cupsdLoadJob(job); in get_jobs()
6826 if (!job->dest || !job->username) in get_jobs()
6829 if ((dest && strcmp(job->dest, dest)) && in get_jobs()
6830 (!job->printer || !dest || strcmp(job->printer->name, dest))) in get_jobs()
6832 if ((job->dtype & dmask) != dtype && in get_jobs()
6833 (!job->printer || (job->printer->type & dmask) != dtype)) in get_jobs()
6836 if ((job_comparison < 0 && job->state_value > job_state) || in get_jobs()
6837 (job_comparison == 0 && job->state_value != job_state) || in get_jobs()
6838 (job_comparison > 0 && job->state_value < job_state)) in get_jobs()
6841 if (job->id < first_job_id) in get_jobs()
6844 if (need_load_job && !job->attrs) in get_jobs()
6846 cupsdLoadJob(job); in get_jobs()
6848 if (!job->attrs) in get_jobs()
6850 cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", job->id); in get_jobs()
6855 if (username[0] && _cups_strcasecmp(username, job->username)) in get_jobs()
6859 ippAddSeparator(con->response); in get_jobs()
6863 exclude = cupsdGetPrivateAttrs(job->printer ? in get_jobs()
6864 job->printer->op_policy_ptr : in get_jobs()
6865 policy, con, job->printer, in get_jobs()
6866 job->username); in get_jobs()
6868 copy_job_attrs(con, job, ra, exclude); in get_jobs()
6879 con->response->request.status.status_code = IPP_OK; in get_jobs()
6884 * 'get_notifications()' - Get events for a subscription.
6888 get_notifications(cupsd_client_t *con) /* I - Client connection */ in get_notifications()
6893 ipp_attribute_t *ids, /* notify-subscription-ids */ in get_notifications()
6894 *sequences; /* notify-sequence-numbers */ in get_notifications()
6900 con, con->number); in get_notifications()
6906 ids = ippFindAttribute(con->request, "notify-subscription-ids", in get_notifications()
6908 sequences = ippFindAttribute(con->request, "notify-sequence-numbers", in get_notifications()
6914 _("Missing notify-subscription-ids attribute.")); in get_notifications()
6922 for (i = 0, interval = 60; i < ids->num_values; i ++) in get_notifications()
6924 if ((sub = cupsdFindSubscription(ids->values[i].integer)) == NULL) in get_notifications()
6931 ids->values[i].integer); in get_notifications()
6939 if ((status = cupsdCheckPolicy(sub->dest ? sub->dest->op_policy_ptr : in get_notifications()
6941 con, sub->owner)) != HTTP_OK) in get_notifications()
6943 send_http_error(con, status, sub->dest); in get_notifications()
6951 if (sub->job && sub->job->state_value == IPP_JOB_PROCESSING && in get_notifications()
6954 else if (sub->job && sub->job->state_value >= IPP_JOB_STOPPED) in get_notifications()
6956 else if (sub->dest && sub->dest->state == IPP_PRINTER_PROCESSING && in get_notifications()
6966 ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, in get_notifications()
6967 "notify-get-interval", interval); in get_notifications()
6969 ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, in get_notifications()
6970 "printer-up-time", time(NULL)); in get_notifications()
6976 con->response->request.status.status_code = in get_notifications()
6979 for (i = 0; i < ids->num_values; i ++) in get_notifications()
6985 sub = cupsdFindSubscription(ids->values[i].integer); in get_notifications()
6987 if (sequences && i < sequences->num_values) in get_notifications()
6988 min_seq = sequences->values[i].integer; in get_notifications()
6996 if (min_seq > (sub->first_event_id + cupsArrayCount(sub->events))) in get_notifications()
7003 if (sub->first_event_id > min_seq) in get_notifications()
7006 j = min_seq - sub->first_event_id; in get_notifications()
7008 for (; j < cupsArrayCount(sub->events); j ++) in get_notifications()
7010 ippAddSeparator(con->response); in get_notifications()
7012 copy_attrs(con->response, in get_notifications()
7013 ((cupsd_event_t *)cupsArrayIndex(sub->events, j))->attrs, NULL, in get_notifications()
7021 * 'get_ppd()' - Get a named PPD from the local system.
7025 get_ppd(cupsd_client_t *con, /* I - Client connection */ in get_ppd()
7026 ipp_attribute_t *uri) /* I - Printer URI or PPD name */ in get_ppd()
7034 con->number, uri, uri->name, uri->values[0].string.text); in get_ppd()
7036 if (!strcmp(ippGetName(uri), "ppd-name")) in get_ppd()
7039 * Return a PPD file from cups-driverd... in get_ppd()
7043 /* ppd-name value */ in get_ppd()
7044 char command[1024], /* cups-driverd command */ in get_ppd()
7046 oppd_name[1024]; /* Escaped ppd-name */ in get_ppd()
7059 * Check ppd-name value... in get_ppd()
7064 send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Invalid ppd-name value.")); in get_ppd()
7069 * Run cups-driverd command with the given options... in get_ppd()
7072 snprintf(command, sizeof(command), "%s/daemon/cups-driverd", ServerBin); in get_ppd()
7074 snprintf(options, sizeof(options), "get+%d+%s", ippGetRequestId(con->request), oppd_name); in get_ppd()
7082 ippDelete(con->response); in get_ppd()
7083 con->response = NULL; in get_ppd()
7092 send_ipp_status(con, IPP_INTERNAL_ERROR, _("cups-driverd failed to execute.")); in get_ppd()
7095 …else if (!strcmp(ippGetName(uri), "printer-uri") && cupsdValidateDest(ippGetString(uri, 0, NULL), … in get_ppd()
7104 if ((status = cupsdCheckPolicy(dest->op_policy_ptr, con, NULL)) != HTTP_OK) in get_ppd()
7114 snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot, dest->name); in get_ppd()
7119 ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, dest->uri); in get_ppd()
7124 for (i = 0; i < dest->num_printers; i ++) in get_ppd()
7125 if (!(dest->printers[i]->type & CUPS_PRINTER_CLASS)) in get_ppd()
7127 snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot, dest->printers[i]->name); in get_ppd()
7133 if (i < dest->num_printers) in get_ppd()
7134 dest = dest->printers[i]; in get_ppd()
7138 …ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, dest->printers[0] in get_ppd()
7147 if ((con->file = open(filename, O_RDONLY)) < 0) in get_ppd()
7153 fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); in get_ppd()
7155 con->pipe_pid = 0; in get_ppd()
7157 ippSetStatusCode(con->response, IPP_STATUS_OK); in get_ppd()
7165 * 'get_ppds()' - Get the list of PPD files on the local system.
7169 get_ppds(cupsd_client_t *con) /* I - Client connection */ in get_ppds()
7173 *device, /* ppd-device-id attribute */ in get_ppds()
7174 *language, /* ppd-natural-language attribute */ in get_ppds()
7175 *make, /* ppd-make attribute */ in get_ppds()
7176 *model, /* ppd-make-and-model attribute */ in get_ppds()
7177 *model_number, /* ppd-model-number attribute */ in get_ppds()
7178 *product, /* ppd-product attribute */ in get_ppds()
7179 *psversion, /* ppd-psverion attribute */ in get_ppds()
7180 *type, /* ppd-type attribute */ in get_ppds()
7181 *requested, /* requested-attributes attribute */ in get_ppds()
7182 *exclude, /* exclude-schemes attribute */ in get_ppds()
7183 *include; /* include-schemes attribute */ in get_ppds()
7184 char command[1024], /* cups-driverd command */ in get_ppds()
7186 device_str[256],/* Escaped ppd-device-id string */ in get_ppds()
7188 /* Escaped ppd-natural-language */ in get_ppds()
7189 make_str[256], /* Escaped ppd-make string */ in get_ppds()
7190 model_str[256], /* Escaped ppd-make-and-model string */ in get_ppds()
7192 /* ppd-model-number string */ in get_ppds()
7194 /* Escaped ppd-product string */ in get_ppds()
7196 /* Escaped ppd-psversion string */ in get_ppds()
7197 type_str[256], /* Escaped ppd-type string */ in get_ppds()
7206 cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->number); in get_ppds()
7219 * Run cups-driverd command with the given options... in get_ppds()
7222 limit = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER); in get_ppds()
7223 device = ippFindAttribute(con->request, "ppd-device-id", IPP_TAG_TEXT); in get_ppds()
7224 language = ippFindAttribute(con->request, "ppd-natural-language", in get_ppds()
7226 make = ippFindAttribute(con->request, "ppd-make", IPP_TAG_TEXT); in get_ppds()
7227 model = ippFindAttribute(con->request, "ppd-make-and-model", in get_ppds()
7229 model_number = ippFindAttribute(con->request, "ppd-model-number", in get_ppds()
7231 product = ippFindAttribute(con->request, "ppd-product", IPP_TAG_TEXT); in get_ppds()
7232 psversion = ippFindAttribute(con->request, "ppd-psversion", IPP_TAG_TEXT); in get_ppds()
7233 type = ippFindAttribute(con->request, "ppd-type", IPP_TAG_KEYWORD); in get_ppds()
7234 requested = ippFindAttribute(con->request, "requested-attributes", in get_ppds()
7236 exclude = ippFindAttribute(con->request, "exclude-schemes", in get_ppds()
7238 include = ippFindAttribute(con->request, "include-schemes", in get_ppds()
7244 strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str)); in get_ppds()
7267 snprintf(model_number_str, sizeof(model_number_str), "ppd-model-number=%d", in get_ppds()
7268 model_number->values[0].integer); in get_ppds()
7297 snprintf(command, sizeof(command), "%s/daemon/cups-driverd", ServerBin); in get_ppds()
7300 con->request->request.op.request_id, in get_ppds()
7301 limit ? limit->values[0].integer : 0, in get_ppds()
7320 ippDelete(con->response); in get_ppds()
7321 con->response = NULL; in get_ppds()
7331 _("cups-driverd failed to execute.")); in get_ppds()
7337 * 'get_printer_attrs()' - Get printer attributes.
7341 get_printer_attrs(cupsd_client_t *con, /* I - Client connection */ in get_printer_attrs()
7342 ipp_attribute_t *uri) /* I - Printer URI */ in get_printer_attrs()
7351 con->number, uri->values[0].string.text); in get_printer_attrs()
7357 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in get_printer_attrs()
7372 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in get_printer_attrs()
7382 ra = create_requested_array(con->request); in get_printer_attrs()
7388 con->response->request.status.status_code = IPP_OK; in get_printer_attrs()
7393 * 'get_printer_supported()' - Get printer supported values.
7398 cupsd_client_t *con, /* I - Client connection */ in get_printer_supported()
7399 ipp_attribute_t *uri) /* I - Printer URI */ in get_printer_supported()
7407 con->number, uri->values[0].string.text); in get_printer_supported()
7413 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in get_printer_supported()
7428 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in get_printer_supported()
7435 * Return a list of attributes that can be set via Set-Printer-Attributes. in get_printer_supported()
7438 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, in get_printer_supported()
7439 "printer-geo-location", 0); in get_printer_supported()
7440 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, in get_printer_supported()
7441 "printer-info", 0); in get_printer_supported()
7442 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, in get_printer_supported()
7443 "printer-location", 0); in get_printer_supported()
7444 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, in get_printer_supported()
7445 "printer-organization", 0); in get_printer_supported()
7446 ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, in get_printer_supported()
7447 "printer-organizational-unit", 0); in get_printer_supported()
7449 con->response->request.status.status_code = IPP_OK; in get_printer_supported()
7454 * 'get_printers()' - Get a list of printers or classes.
7458 get_printers(cupsd_client_t *con, /* I - Client connection */ in get_printers()
7459 int type) /* I - 0 or CUPS_PRINTER_CLASS */ in get_printers()
7467 cups_ptype_t printer_type, /* printer-type attribute */ in get_printers()
7468 printer_mask; /* printer-type-mask attribute */ in get_printers()
7471 char *first_printer_name; /* first-printer-name attribute */ in get_printers()
7477 con->number, type); in get_printers()
7503 if ((attr = ippFindAttribute(con->request, "limit", in get_printers()
7505 limit = attr->values[0].integer; in get_printers()
7509 if ((attr = ippFindAttribute(con->request, "first-printer-name", in get_printers()
7511 first_printer_name = attr->values[0].string.text; in get_printers()
7519 if ((attr = ippFindAttribute(con->request, "printer-id", IPP_TAG_INTEGER)) != NULL) in get_printers()
7523 …send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Bad \"printer-id\" value %d."), pri… in get_printers()
7530 if ((attr = ippFindAttribute(con->request, "printer-type", in get_printers()
7532 printer_type = (cups_ptype_t)attr->values[0].integer; in get_printers()
7536 if ((attr = ippFindAttribute(con->request, "printer-type-mask", in get_printers()
7538 printer_mask = (cups_ptype_t)attr->values[0].integer; in get_printers()
7542 local = httpAddrLocalhost(&(con->clientaddr)); in get_printers()
7544 if ((attr = ippFindAttribute(con->request, "printer-location", in get_printers()
7546 location = attr->values[0].string.text; in get_printers()
7550 if (con->username[0]) in get_printers()
7551 username = con->username; in get_printers()
7552 else if ((attr = ippFindAttribute(con->request, "requesting-user-name", in get_printers()
7554 username = attr->values[0].string.text; in get_printers()
7558 ra = create_requested_array(con->request); in get_printers()
7576 if (!local && !printer->shared) in get_printers()
7579 if (printer_id && printer->printer_id != printer_id) in get_printers()
7582 if ((!type || (printer->type & CUPS_PRINTER_CLASS) == type) && in get_printers()
7583 (printer->type & printer_mask) == printer_type && in get_printers()
7585 (printer->location && !_cups_strcasecmp(printer->location, location)))) in get_printers()
7592 if (cupsArrayCount(printer->users) && username && in get_printers()
7601 ippAddSeparator(con->response); in get_printers()
7615 con->response->request.status.status_code = IPP_OK; in get_printers()
7620 * 'get_subscription_attrs()' - Get subscription attributes.
7625 cupsd_client_t *con, /* I - Client connection */ in get_subscription_attrs()
7626 int sub_id) /* I - Subscription ID */ in get_subscription_attrs()
7637 con, con->number, sub_id); in get_subscription_attrs()
7664 if (sub->dest) in get_subscription_attrs()
7665 policy = sub->dest->op_policy_ptr; in get_subscription_attrs()
7669 if ((status = cupsdCheckPolicy(policy, con, sub->owner)) != HTTP_OK) in get_subscription_attrs()
7671 send_http_error(con, status, sub->dest); in get_subscription_attrs()
7675 exclude = cupsdGetPrivateAttrs(policy, con, sub->dest, sub->owner); in get_subscription_attrs()
7679 * requested-attributes attribute that may be provided by the client. in get_subscription_attrs()
7682 ra = create_requested_array(con->request); in get_subscription_attrs()
7688 con->response->request.status.status_code = IPP_OK; in get_subscription_attrs()
7693 * 'get_subscriptions()' - Get subscriptions.
7697 get_subscriptions(cupsd_client_t *con, /* I - Client connection */ in get_subscriptions()
7698 ipp_attribute_t *uri) /* I - Printer/job URI */ in get_subscriptions()
7716 cupsd_job_t *job; /* Job pointer */ in get_subscriptions() local
7724 con, con->number, uri->values[0].string.text); in get_subscriptions()
7730 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in get_subscriptions()
7740 job = NULL; in get_subscriptions()
7745 job = cupsdFindJob(atoi(resource + 6)); in get_subscriptions()
7747 if (!job) in get_subscriptions()
7749 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in get_subscriptions()
7754 else if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in get_subscriptions()
7764 else if ((attr = ippFindAttribute(con->request, "notify-job-id", in get_subscriptions()
7767 job = cupsdFindJob(attr->values[0].integer); in get_subscriptions()
7769 if (!job) in get_subscriptions()
7771 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), in get_subscriptions()
7772 attr->values[0].integer); in get_subscriptions()
7777 job = NULL; in get_subscriptions()
7784 policy = printer->op_policy_ptr; in get_subscriptions()
7802 * requested-attributes attribute that may be provided by the client. in get_subscriptions()
7805 ra = create_requested_array(con->request); in get_subscriptions()
7807 if ((attr = ippFindAttribute(con->request, "limit", in get_subscriptions()
7809 limit = attr->values[0].integer; in get_subscriptions()
7817 if ((attr = ippFindAttribute(con->request, "my-subscriptions", in get_subscriptions()
7819 attr->values[0].boolean) in get_subscriptions()
7827 if ((!printer || sub->dest == printer) && (!job || sub->job == job) && in get_subscriptions()
7828 (!username[0] || !_cups_strcasecmp(username, sub->owner))) in get_subscriptions()
7830 ippAddSeparator(con->response); in get_subscriptions()
7832 exclude = cupsdGetPrivateAttrs(sub->dest ? sub->dest->op_policy_ptr : in get_subscriptions()
7833 policy, con, sub->dest, in get_subscriptions()
7834 sub->owner); in get_subscriptions()
7846 con->response->request.status.status_code = IPP_OK; in get_subscriptions()
7853 * 'get_username()' - Get the username associated with a request.
7856 static const char * /* O - Username */
7857 get_username(cupsd_client_t *con) /* I - Connection */ in get_username()
7862 if (con->username[0]) in get_username()
7863 return (con->username); in get_username()
7864 else if ((attr = ippFindAttribute(con->request, "requesting-user-name", in get_username()
7866 return (attr->values[0].string.text); in get_username()
7873 * 'hold_job()' - Hold a print job.
7877 hold_job(cupsd_client_t *con, /* I - Client connection */ in hold_job()
7878 ipp_attribute_t *uri) /* I - Job or Printer URI */ in hold_job()
7880 ipp_attribute_t *attr; /* Current job-hold-until */ in hold_job()
7882 int jobid; /* Job ID */ in hold_job()
7888 cupsd_job_t *job; /* Job information */ in hold_job() local
7891 cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->number, in hold_job()
7892 uri->values[0].string.text); in hold_job()
7895 * See if we have a job URI or a printer URI... in hold_job()
7898 if (!strcmp(uri->name, "printer-uri")) in hold_job()
7901 * Got a printer URI; see if we also have a job-id attribute... in hold_job()
7904 if ((attr = ippFindAttribute(con->request, "job-id", in hold_job()
7908 _("Got a printer-uri attribute but no job-id.")); in hold_job()
7912 jobid = attr->values[0].integer; in hold_job()
7917 * Got a job URI; parse it to get the job ID... in hold_job()
7920 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in hold_job()
7931 _("Bad job-uri \"%s\"."), in hold_job()
7932 uri->values[0].string.text); in hold_job()
7940 * See if the job exists... in hold_job()
7943 if ((job = cupsdFindJob(jobid)) == NULL) in hold_job()
7946 * Nope - return a "not found" error... in hold_job()
7949 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in hold_job()
7954 * See if the job is owned by the requesting user... in hold_job()
7957 if (!validate_user(job, con, job->username, username, sizeof(username))) in hold_job()
7959 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in hold_job()
7960 cupsdFindDest(job->dest)); in hold_job()
7965 * See if the job is in a state that allows holding... in hold_job()
7968 if (job->state_value > IPP_JOB_STOPPED) in hold_job()
7971 * Return a "not-possible" error... in hold_job()
7975 _("Job #%d is finished and cannot be altered."), in hold_job()
7976 job->id); in hold_job()
7981 * Hold the job and return... in hold_job()
7984 if ((attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_ZERO)) != NULL) in hold_job()
7988 …send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported 'job-hold-until' value.… in hold_job()
7989 ippCopyAttribute(con->response, attr, 0); in hold_job()
7995 cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, in hold_job()
7996 "Job job-hold-until value changed by user."); in hold_job()
8001 cupsdSetJobHoldUntil(job, when, 1); in hold_job()
8002 cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", in hold_job()
8005 con->response->request.status.status_code = IPP_OK; in hold_job()
8010 * 'hold_new_jobs()' - Hold pending/new jobs on a printer or class.
8014 hold_new_jobs(cupsd_client_t *con, /* I - Connection */ in hold_new_jobs()
8015 ipp_attribute_t *uri) /* I - Printer URI */ in hold_new_jobs()
8023 con->number, uri->values[0].string.text); in hold_new_jobs()
8029 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in hold_new_jobs()
8044 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in hold_new_jobs()
8054 printer->holding_new_jobs = 1; in hold_new_jobs()
8056 cupsdSetPrinterReasons(printer, "+hold-new-jobs"); in hold_new_jobs()
8061 printer->name, get_username(con)); in hold_new_jobs()
8065 printer->name, get_username(con)); in hold_new_jobs()
8071 con->response->request.status.status_code = IPP_OK; in hold_new_jobs()
8076 * 'move_job()' - Move a job to a new destination.
8080 move_job(cupsd_client_t *con, /* I - Client connection */ in move_job()
8081 ipp_attribute_t *uri) /* I - Job URI */ in move_job()
8085 int jobid; /* Job ID */ in move_job()
8086 cupsd_job_t *job; /* Current job */ in move_job() local
8099 cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->number, in move_job()
8100 uri->values[0].string.text); in move_job()
8106 if ((attr = ippFindAttribute(con->request, "job-printer-uri", in move_job()
8110 * Need job-printer-uri... in move_job()
8114 _("job-printer-uri attribute missing.")); in move_job()
8118 if (!cupsdValidateDest(attr->values[0].string.text, &dtype, &dprinter)) in move_job()
8130 * See if we have a job URI or a printer URI... in move_job()
8133 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in move_job()
8137 if (!strcmp(uri->name, "printer-uri")) in move_job()
8140 * Got a printer URI; see if we also have a job-id attribute... in move_job()
8143 if ((attr = ippFindAttribute(con->request, "job-id", in move_job()
8150 if ((src = cupsdValidateDest(uri->values[0].string.text, &stype, in move_job()
8162 job = NULL; in move_job()
8167 * Otherwise, just move a single job... in move_job()
8170 if ((job = cupsdFindJob(attr->values[0].integer)) == NULL) in move_job()
8173 * Nope - return a "not found" error... in move_job()
8177 _("Job #%d does not exist."), attr->values[0].integer); in move_job()
8183 * Job found, initialize source pointers... in move_job()
8194 * Got a job URI; parse it to get the job ID... in move_job()
8203 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in move_job()
8204 uri->values[0].string.text); in move_job()
8209 * See if the job exists... in move_job()
8214 if ((job = cupsdFindJob(jobid)) == NULL) in move_job()
8217 * Nope - return a "not found" error... in move_job()
8220 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in move_job()
8226 * Job found, initialize source pointers... in move_job()
8238 if ((status = cupsdCheckPolicy(dprinter->op_policy_ptr, con, in move_job()
8239 job ? job->username : NULL)) != HTTP_OK) in move_job()
8246 * Now move the job or jobs... in move_job()
8249 if (job) in move_job()
8252 * See if the job has been completed... in move_job()
8255 if (job->state_value > IPP_JOB_STOPPED) in move_job()
8258 * Return a "not-possible" error... in move_job()
8262 _("Job #%d is finished and cannot be altered."), in move_job()
8263 job->id); in move_job()
8268 * See if the job is owned by the requesting user... in move_job()
8271 if (!validate_user(job, con, job->username, username, sizeof(username))) in move_job()
8273 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in move_job()
8274 cupsdFindDest(job->dest)); in move_job()
8279 * Move the job to a different printer or class... in move_job()
8282 cupsdMoveJob(job, dprinter); in move_job()
8290 for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); in move_job()
8291 job; in move_job()
8292 job = (cupsd_job_t *)cupsArrayNext(Jobs)) in move_job()
8295 * See if the job is pointing at the source printer or has not been in move_job()
8299 if (_cups_strcasecmp(job->dest, src) || in move_job()
8300 job->state_value > IPP_JOB_STOPPED) in move_job()
8304 * See if the job can be moved by the requesting user... in move_job()
8307 if (!validate_user(job, con, job->username, username, sizeof(username))) in move_job()
8311 * Move the job to a different printer or class... in move_job()
8314 cupsdMoveJob(job, dprinter); in move_job()
8328 con->response->request.status.status_code = IPP_OK; in move_job()
8333 * 'ppd_parse_line()' - Parse a PPD default line.
8336 static int /* O - 0 on success, -1 on failure */
8337 ppd_parse_line(const char *line, /* I - Line */ in ppd_parse_line()
8338 char *option, /* O - Option name */ in ppd_parse_line()
8339 int olen, /* I - Size of option name */ in ppd_parse_line()
8340 char *choice, /* O - Choice name */ in ppd_parse_line()
8341 int clen) /* I - Size of choice name */ in ppd_parse_line()
8348 return (-1); in ppd_parse_line()
8351 * Read the option name... in ppd_parse_line()
8354 for (line += 8, olen --; in ppd_parse_line()
8360 olen --; in ppd_parse_line()
8373 return (-1); in ppd_parse_line()
8384 for (clen --; in ppd_parse_line()
8390 clen --; in ppd_parse_line()
8404 * 'print_job()' - Print a file to a printer or class.
8408 print_job(cupsd_client_t *con, /* I - Client connection */ in print_job()
8409 ipp_attribute_t *uri) /* I - Printer URI */ in print_job()
8412 ipp_attribute_t *doc_name; /* document-name attribute */ in print_job()
8413 ipp_attribute_t *format; /* Document-format attribute */ in print_job()
8414 const char *default_format; /* document-format-default value */ in print_job()
8415 cupsd_job_t *job; /* New job */ in print_job() local
8416 char filename[1024]; /* Job filename */ in print_job()
8421 /* Textual name of mime type */ in print_job()
8428 cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->number, in print_job()
8429 uri->values[0].string.text); in print_job()
8432 * Validate print file attributes, for now just document-format and in print_job()
8438 if ((attr = ippFindAttribute(con->request, "compression", in print_job()
8441 if (strcmp(attr->values[0].string.text, "none") in print_job()
8443 && strcmp(attr->values[0].string.text, "gzip") in print_job()
8449 attr->values[0].string.text); in print_job()
8450 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, in print_job()
8451 "compression", NULL, attr->values[0].string.text); in print_job()
8456 if (!strcmp(attr->values[0].string.text, "gzip")) in print_job()
8465 if (!con->filename) in print_job()
8475 if (!cupsdValidateDest(uri->values[0].string.text, NULL, &printer)) in print_job()
8490 doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME); in print_job()
8492 ippSetName(con->request, &doc_name, "document-name-supplied"); in print_job()
8494 if ((format = ippFindAttribute(con->request, "document-format", in print_job()
8501 if (sscanf(format->values[0].string.text, "%15[^/]/%255[^;]", super, in print_job()
8505 _("Bad document-format \"%s\"."), in print_job()
8506 format->values[0].string.text); in print_job()
8510 …ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, ippGet… in print_job()
8512 else if ((default_format = cupsGetOption("document-format", in print_job()
8513 printer->num_options, in print_job()
8514 printer->options)) != NULL) in print_job()
8523 _("Bad document-format \"%s\"."), in print_job()
8531 * Auto-type it! in print_job()
8535 strlcpy(type, "octet-stream", sizeof(type)); in print_job()
8538 if (!strcmp(super, "application") && !strcmp(type, "octet-stream")) in print_job()
8541 * Auto-type the file... in print_job()
8544 cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job ???] Auto-typing file..."); in print_job()
8547 filetype = mimeFileType(MimeDatabase, con->filename, in print_job()
8548 doc_name ? doc_name->values[0].string.text : NULL, in print_job()
8554 cupsdLogMessage(CUPSD_LOG_INFO, "[Job ???] Request file type is %s/%s.", in print_job()
8555 filetype->super, filetype->type); in print_job()
8557 snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type); in print_job()
8558 …ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, mimety… in print_job()
8565 (!strcmp(super, "application") && !strcmp(type, "octet-stream")))) in print_job()
8568 * Replace the document-format attribute value with the auto-typed or in print_job()
8572 snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, in print_job()
8573 filetype->type); in print_job()
8576 ippSetString(con->request, &format, 0, mimetype); in print_job()
8578 ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, in print_job()
8579 "document-format", NULL, mimetype); in print_job()
8584 _("Unsupported document-format \"%s\"."), in print_job()
8585 format ? format->values[0].string.text : in print_job()
8586 "application/octet-stream"); in print_job()
8591 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, in print_job()
8592 "document-format", NULL, format->values[0].string.text); in print_job()
8598 * Read any embedded job ticket info from PS files... in print_job()
8601 if (!_cups_strcasecmp(filetype->super, "application") && in print_job()
8602 (!_cups_strcasecmp(filetype->type, "postscript") || in print_job()
8603 !_cups_strcasecmp(filetype->type, "pdf"))) in print_job()
8607 * Create the job object... in print_job()
8610 if ((job = add_job(con, printer, filetype)) == NULL) in print_job()
8617 if (stat(con->filename, &fileinfo)) in print_job()
8622 cupsdUpdateQuota(printer, job->username, 0, kbytes); in print_job()
8624 job->koctets += kbytes; in print_job()
8626 if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL) in print_job()
8627 attr->values[0].integer += kbytes; in print_job()
8630 * Add the job file... in print_job()
8633 if (add_file(con, job, filetype, compression)) in print_job()
8636 snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, job->num_files); in print_job()
8637 if (rename(con->filename, filename)) in print_job()
8639 …cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strer… in print_job()
8641 send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file.")); in print_job()
8645 cupsdClearString(&con->filename); in print_job()
8651 if (cupsdTimeoutJob(job)) in print_job()
8655 * Log and save the job... in print_job()
8658 cupsdLogJob(job, CUPSD_LOG_INFO, in print_job()
8660 filetype->super, filetype->type, job->username); in print_job()
8661 cupsdLogJob(job, CUPSD_LOG_DEBUG, "hold_until=%d", (int)job->hold_until); in print_job()
8662 cupsdLogJob(job, CUPSD_LOG_INFO, "Queued on \"%s\" by \"%s\".", in print_job()
8663 job->dest, job->username); in print_job()
8666 * Start the job if possible... in print_job()
8674 * 'read_job_ticket()' - Read a job ticket embedded in a print file.
8677 * file using the Print-Job operation. It doesn't work for Create-Job +
8678 * Send-File, since the job attributes need to be set at job creation
8679 * time for banners to work. The embedded job ticket stuff is here
8683 * The format of a job ticket is simple:
8692 * Job ticket lines must appear immediately after the first line that
8693 * specifies PostScript (%!PS-Adobe-3.0) or PDF (%PDF) format, and CUPS
8694 * stops looking for job ticket info when it finds a line that does not begin
8697 * The maximum length of a job ticket line, including the prefix, is
8700 * Read-only attributes are rejected with a notice to the error log in
8701 * case a malicious user tries anything. Since the job ticket is read
8702 * prior to attribute validation in print_job(), job ticket attributes
8707 read_job_ticket(cupsd_client_t *con) /* I - Client connection */ in read_job_ticket()
8715 *attr2, /* Job attribute */ in read_job_ticket()
8716 *prev2; /* Previous job attribute */ in read_job_ticket()
8723 if ((fp = cupsFileOpen(con->filename, "rb")) == NULL) in read_job_ticket()
8726 "Unable to open print file for job ticket - %s", in read_job_ticket()
8738 "Unable to read from print file for job ticket - %s", in read_job_ticket()
8744 if (strncmp(line, "%!PS-Adobe-", 11) && strncmp(line, "%PDF-", 5)) in read_job_ticket()
8747 * Not a DSC-compliant file, so no job ticket info will be available... in read_job_ticket()
8755 * Read job ticket info from the file... in read_job_ticket()
8764 * Stop at the first non-ticket line... in read_job_ticket()
8798 for (attr = ticket->attrs; attr; attr = attr->next) in read_job_ticket()
8800 if (attr->group_tag != IPP_TAG_JOB || !attr->name) in read_job_ticket()
8803 if (!strncmp(attr->name, "date-time-at-", 13) || in read_job_ticket()
8804 !strcmp(attr->name, "job-impressions-completed") || in read_job_ticket()
8805 !strcmp(attr->name, "job-media-sheets-completed") || in read_job_ticket()
8806 !strncmp(attr->name, "job-k-octets", 12) || in read_job_ticket()
8807 !strcmp(attr->name, "job-id") || in read_job_ticket()
8808 !strcmp(attr->name, "job-originating-host-name") || in read_job_ticket()
8809 !strcmp(attr->name, "job-originating-user-name") || in read_job_ticket()
8810 !strcmp(attr->name, "job-pages-completed") || in read_job_ticket()
8811 !strcmp(attr->name, "job-printer-uri") || in read_job_ticket()
8812 !strncmp(attr->name, "job-state", 9) || in read_job_ticket()
8813 !strcmp(attr->name, "job-uri") || in read_job_ticket()
8814 !strncmp(attr->name, "time-at-", 8)) in read_job_ticket()
8815 continue; /* Read-only attrs */ in read_job_ticket()
8817 if ((attr2 = ippFindAttribute(con->request, attr->name, in read_job_ticket()
8824 if (con->request->attrs == attr2) in read_job_ticket()
8826 con->request->attrs = attr2->next; in read_job_ticket()
8831 for (prev2 = con->request->attrs; prev2; prev2 = prev2->next) in read_job_ticket()
8832 if (prev2->next == attr2) in read_job_ticket()
8834 prev2->next = attr2->next; in read_job_ticket()
8839 if (con->request->last == attr2) in read_job_ticket()
8840 con->request->last = prev2; in read_job_ticket()
8849 ippCopyAttribute(con->request, attr, 0); in read_job_ticket()
8862 * 'reject_jobs()' - Reject print jobs to a printer.
8866 reject_jobs(cupsd_client_t *con, /* I - Client connection */ in reject_jobs()
8867 ipp_attribute_t *uri) /* I - Printer or class URI */ in reject_jobs()
8872 ipp_attribute_t *attr; /* printer-state-message text */ in reject_jobs()
8876 con->number, uri->values[0].string.text); in reject_jobs()
8882 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in reject_jobs()
8897 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in reject_jobs()
8907 printer->accepting = 0; in reject_jobs()
8909 if ((attr = ippFindAttribute(con->request, "printer-state-message", in reject_jobs()
8911 strlcpy(printer->state_message, "Rejecting Jobs", in reject_jobs()
8912 sizeof(printer->state_message)); in reject_jobs()
8914 strlcpy(printer->state_message, attr->values[0].string.text, in reject_jobs()
8915 sizeof(printer->state_message)); in reject_jobs()
8925 printer->name, get_username(con)); in reject_jobs()
8932 printer->name, get_username(con)); in reject_jobs()
8939 con->response->request.status.status_code = IPP_OK; in reject_jobs()
8944 * 'release_held_new_jobs()' - Release pending/new jobs on a printer or class.
8949 cupsd_client_t *con, /* I - Connection */ in release_held_new_jobs()
8950 ipp_attribute_t *uri) /* I - Printer URI */ in release_held_new_jobs()
8958 con->number, uri->values[0].string.text); in release_held_new_jobs()
8964 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in release_held_new_jobs()
8979 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in release_held_new_jobs()
8989 printer->holding_new_jobs = 0; in release_held_new_jobs()
8991 cupsdSetPrinterReasons(printer, "-hold-new-jobs"); in release_held_new_jobs()
8996 printer->name, get_username(con)); in release_held_new_jobs()
9000 printer->name, get_username(con)); in release_held_new_jobs()
9008 con->response->request.status.status_code = IPP_OK; in release_held_new_jobs()
9013 * 'release_job()' - Release a held print job.
9017 release_job(cupsd_client_t *con, /* I - Client connection */ in release_job()
9018 ipp_attribute_t *uri) /* I - Job or Printer URI */ in release_job()
9021 int jobid; /* Job ID */ in release_job()
9027 cupsd_job_t *job; /* Job information */ in release_job() local
9031 con->number, uri->values[0].string.text); in release_job()
9034 * See if we have a job URI or a printer URI... in release_job()
9037 if (!strcmp(uri->name, "printer-uri")) in release_job()
9040 * Got a printer URI; see if we also have a job-id attribute... in release_job()
9043 if ((attr = ippFindAttribute(con->request, "job-id", in release_job()
9047 _("Got a printer-uri attribute but no job-id.")); in release_job()
9051 jobid = attr->values[0].integer; in release_job()
9056 * Got a job URI; parse it to get the job ID... in release_job()
9059 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in release_job()
9069 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in release_job()
9070 uri->values[0].string.text); in release_job()
9078 * See if the job exists... in release_job()
9081 if ((job = cupsdFindJob(jobid)) == NULL) in release_job()
9084 * Nope - return a "not found" error... in release_job()
9087 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in release_job()
9092 * See if job is "held"... in release_job()
9095 if (job->state_value != IPP_JOB_HELD) in release_job()
9098 * Nope - return a "not possible" error... in release_job()
9101 send_ipp_status(con, IPP_NOT_POSSIBLE, _("Job #%d is not held."), jobid); in release_job()
9106 * See if the job is owned by the requesting user... in release_job()
9109 if (!validate_user(job, con, job->username, username, sizeof(username))) in release_job()
9111 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in release_job()
9112 cupsdFindDest(job->dest)); in release_job()
9117 * Reset the job-hold-until value to "no-hold"... in release_job()
9120 if ((attr = ippFindAttribute(job->attrs, "job-hold-until", in release_job()
9122 attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); in release_job()
9126 ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD); in release_job()
9127 ippSetString(job->attrs, &attr, 0, "no-hold"); in release_job()
9129 cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, in release_job()
9130 "Job job-hold-until value changed by user."); in release_job()
9131 ippSetString(job->attrs, &job->reasons, 0, "none"); in release_job()
9135 * Release the job and return... in release_job()
9138 cupsdReleaseJob(job); in release_job()
9140 cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job, in release_job()
9141 "Job released by user."); in release_job()
9143 cupsdLogJob(job, CUPSD_LOG_INFO, "Released by \"%s\".", username); in release_job()
9145 con->response->request.status.status_code = IPP_OK; in release_job()
9152 * 'renew_subscription()' - Renew an existing subscription...
9157 cupsd_client_t *con, /* I - Client connection */ in renew_subscription()
9158 int sub_id) /* I - Subscription ID */ in renew_subscription()
9162 ipp_attribute_t *lease; /* notify-lease-duration */ in renew_subscription()
9167 con, con->number, sub_id); in renew_subscription()
9184 if (sub->job) in renew_subscription()
9187 * Job subscriptions cannot be renewed... in renew_subscription()
9191 _("Job subscriptions cannot be renewed.")); in renew_subscription()
9199 if ((status = cupsdCheckPolicy(sub->dest ? sub->dest->op_policy_ptr : in renew_subscription()
9201 con, sub->owner)) != HTTP_OK) in renew_subscription()
9203 send_http_error(con, status, sub->dest); in renew_subscription()
9211 lease = ippFindAttribute(con->request, "notify-lease-duration", in renew_subscription()
9214 sub->lease = lease ? lease->values[0].integer : DefaultLeaseDuration; in renew_subscription()
9216 if (MaxLeaseDuration && (sub->lease == 0 || sub->lease > MaxLeaseDuration)) in renew_subscription()
9219 "renew_subscription: Limiting notify-lease-duration to " in renew_subscription()
9222 sub->lease = MaxLeaseDuration; in renew_subscription()
9225 sub->expire = sub->lease ? time(NULL) + sub->lease : 0; in renew_subscription()
9229 con->response->request.status.status_code = IPP_OK; in renew_subscription()
9231 ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, in renew_subscription()
9232 "notify-lease-duration", sub->lease); in renew_subscription()
9237 * 'restart_job()' - Restart an old print job.
9241 restart_job(cupsd_client_t *con, /* I - Client connection */ in restart_job()
9242 ipp_attribute_t *uri) /* I - Job or Printer URI */ in restart_job()
9245 int jobid; /* Job ID */ in restart_job()
9246 cupsd_job_t *job; /* Job information */ in restart_job() local
9255 con->number, uri->values[0].string.text); in restart_job()
9258 * See if we have a job URI or a printer URI... in restart_job()
9261 if (!strcmp(uri->name, "printer-uri")) in restart_job()
9264 * Got a printer URI; see if we also have a job-id attribute... in restart_job()
9267 if ((attr = ippFindAttribute(con->request, "job-id", in restart_job()
9271 _("Got a printer-uri attribute but no job-id.")); in restart_job()
9275 jobid = attr->values[0].integer; in restart_job()
9280 * Got a job URI; parse it to get the job ID... in restart_job()
9283 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in restart_job()
9293 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in restart_job()
9294 uri->values[0].string.text); in restart_job()
9302 * See if the job exists... in restart_job()
9305 if ((job = cupsdFindJob(jobid)) == NULL) in restart_job()
9308 * Nope - return a "not found" error... in restart_job()
9311 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in restart_job()
9316 * See if job is in any of the "completed" states... in restart_job()
9319 if (job->state_value <= IPP_JOB_PROCESSING) in restart_job()
9322 * Nope - return a "not possible" error... in restart_job()
9325 send_ipp_status(con, IPP_NOT_POSSIBLE, _("Job #%d is not complete."), in restart_job()
9331 * See if we have retained the job files... in restart_job()
9334 cupsdLoadJob(job); in restart_job()
9336 if (!job->attrs || job->num_files == 0) in restart_job()
9339 * Nope - return a "not possible" error... in restart_job()
9343 _("Job #%d cannot be restarted - no files."), jobid); in restart_job()
9348 * See if the job is owned by the requesting user... in restart_job()
9351 if (!validate_user(job, con, job->username, username, sizeof(username))) in restart_job()
9353 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in restart_job()
9354 cupsdFindDest(job->dest)); in restart_job()
9359 * See if the job-hold-until attribute is specified... in restart_job()
9362 if ((attr = ippFindAttribute(con->request, "job-hold-until", in restart_job()
9364 attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME); in restart_job()
9366 if (attr && strcmp(attr->values[0].string.text, "no-hold")) in restart_job()
9369 * Return the job to a held state... in restart_job()
9372 cupsdLogJob(job, CUPSD_LOG_DEBUG, in restart_job()
9373 "Restarted by \"%s\" with job-hold-until=%s.", in restart_job()
9374 username, attr->values[0].string.text); in restart_job()
9375 cupsdSetJobHoldUntil(job, attr->values[0].string.text, 1); in restart_job()
9376 cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, in restart_job()
9377 "Job restarted by user with job-hold-until=%s", in restart_job()
9378 attr->values[0].string.text); in restart_job()
9383 * Restart the job... in restart_job()
9386 cupsdRestartJob(job); in restart_job()
9390 cupsdLogJob(job, CUPSD_LOG_INFO, "Restarted by \"%s\".", username); in restart_job()
9392 con->response->request.status.status_code = IPP_OK; in restart_job()
9397 * 'save_auth_info()' - Save authentication information for a job.
9402 cupsd_client_t *con, /* I - Client connection */ in save_auth_info()
9403 cupsd_job_t *job, /* I - Job */ in save_auth_info() argument
9404 ipp_attribute_t *auth_info) /* I - auth-info attribute, if any */ in save_auth_info()
9407 char filename[1024]; /* Job authentication filename */ in save_auth_info()
9408 cups_file_t *fp; /* Job authentication file */ in save_auth_info()
9414 * This function saves the in-memory authentication information for in save_auth_info()
9415 * a job so that it can be used to authenticate with a remote host. in save_auth_info()
9417 * root user. The fields are Base-64 encoded, each on a separate line, in save_auth_info()
9429 * Print-Job, Create-Job, or CUPS-Authenticate-Job operation is in save_auth_info()
9432 * This information is deleted after a job is completed or canceled, in save_auth_info()
9433 * so reprints may require subsequent re-authentication. in save_auth_info()
9439 if ((dest = cupsdFindDest(job->dest)) == NULL) in save_auth_info()
9446 snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id); in save_auth_info()
9450 "Unable to save authentication info to \"%s\" - %s", in save_auth_info()
9458 cupsFilePuts(fp, "CUPSD-AUTH-V3\n"); in save_auth_info()
9461 i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); in save_auth_info()
9463 cupsdClearString(job->auth_env + i); in save_auth_info()
9465 if (auth_info && auth_info->num_values == dest->num_auth_info_required) in save_auth_info()
9472 i < auth_info->num_values && in save_auth_info()
9473 i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); in save_auth_info()
9476 if (strcmp(dest->auth_info_required[i], "negotiate")) in save_auth_info()
9478 …httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text, (int)strlen(auth_info->values… in save_auth_info()
9479 cupsFilePutConf(fp, dest->auth_info_required[i], line); in save_auth_info()
9482 cupsFilePutConf(fp, dest->auth_info_required[i], in save_auth_info()
9483 auth_info->values[i].string.text); in save_auth_info()
9485 if (!strcmp(dest->auth_info_required[i], "username")) in save_auth_info()
9486 cupsdSetStringf(job->auth_env + i, "AUTH_USERNAME=%s", in save_auth_info()
9487 auth_info->values[i].string.text); in save_auth_info()
9488 else if (!strcmp(dest->auth_info_required[i], "domain")) in save_auth_info()
9489 cupsdSetStringf(job->auth_env + i, "AUTH_DOMAIN=%s", in save_auth_info()
9490 auth_info->values[i].string.text); in save_auth_info()
9491 else if (!strcmp(dest->auth_info_required[i], "password")) in save_auth_info()
9492 cupsdSetStringf(job->auth_env + i, "AUTH_PASSWORD=%s", in save_auth_info()
9493 auth_info->values[i].string.text); in save_auth_info()
9494 else if (!strcmp(dest->auth_info_required[i], "negotiate")) in save_auth_info()
9495 cupsdSetStringf(job->auth_env + i, "AUTH_NEGOTIATE=%s", in save_auth_info()
9496 auth_info->values[i].string.text); in save_auth_info()
9498 i --; in save_auth_info()
9501 else if (auth_info && auth_info->num_values == 2 && in save_auth_info()
9502 dest->num_auth_info_required == 1 && in save_auth_info()
9503 !strcmp(dest->auth_info_required[0], "negotiate")) in save_auth_info()
9509 …httpEncode64_2(line, sizeof(line), auth_info->values[0].string.text, (int)strlen(auth_info->values… in save_auth_info()
9512 cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s", in save_auth_info()
9513 auth_info->values[0].string.text); in save_auth_info()
9515 …httpEncode64_2(line, sizeof(line), auth_info->values[1].string.text, (int)strlen(auth_info->values… in save_auth_info()
9518 cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s", in save_auth_info()
9519 auth_info->values[1].string.text); in save_auth_info()
9521 else if (con->username[0]) in save_auth_info()
9527 httpEncode64_2(line, sizeof(line), con->username, (int)strlen(con->username)); in save_auth_info()
9530 cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s", con->username); in save_auth_info()
9536 httpEncode64_2(line, sizeof(line), con->password, (int)strlen(con->password)); in save_auth_info()
9539 cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s", con->password); in save_auth_info()
9543 if (con->gss_uid > 0) in save_auth_info()
9545 cupsFilePrintf(fp, "uid %d\n", (int)con->gss_uid); in save_auth_info()
9546 cupsdSetStringf(&job->auth_uid, "AUTH_UID=%d", (int)con->gss_uid); in save_auth_info()
9554 for (i = (CUPS_RAND() % 1024); i >= 0; i --) in save_auth_info()
9566 * 'send_document()' - Send a file to a printer or class.
9570 send_document(cupsd_client_t *con, /* I - Client connection */ in send_document()
9571 ipp_attribute_t *uri) /* I - Printer URI */ in send_document()
9574 ipp_attribute_t *format; /* Request's document-format attribute */ in send_document()
9575 ipp_attribute_t *jformat; /* Job's document-format attribute */ in send_document()
9576 const char *default_format;/* document-format-default value */ in send_document()
9577 int jobid; /* Job ID number */ in send_document()
9578 cupsd_job_t *job; /* Current job */ in send_document() local
9580 /* Job URI */ in send_document()
9596 /* Textual name of mime type */ in send_document()
9597 char filename[1024]; /* Job filename */ in send_document()
9602 int start_job; /* Start the job? */ in send_document()
9606 con->number, uri->values[0].string.text); in send_document()
9609 * See if we have a job URI or a printer URI... in send_document()
9612 if (!strcmp(uri->name, "printer-uri")) in send_document()
9615 * Got a printer URI; see if we also have a job-id attribute... in send_document()
9618 if ((attr = ippFindAttribute(con->request, "job-id", in send_document()
9622 _("Got a printer-uri attribute but no job-id.")); in send_document()
9626 jobid = attr->values[0].integer; in send_document()
9631 * Got a job URI; parse it to get the job ID... in send_document()
9634 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in send_document()
9644 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in send_document()
9645 uri->values[0].string.text); in send_document()
9653 * See if the job exists... in send_document()
9656 if ((job = cupsdFindJob(jobid)) == NULL) in send_document()
9659 * Nope - return a "not found" error... in send_document()
9662 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in send_document()
9666 printer = cupsdFindDest(job->dest); in send_document()
9669 * See if the job is owned by the requesting user... in send_document()
9672 if (!validate_user(job, con, job->username, username, sizeof(username))) in send_document()
9674 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in send_document()
9675 cupsdFindDest(job->dest)); in send_document()
9680 * OK, see if the client is sending the document compressed - CUPS in send_document()
9686 if ((attr = ippFindAttribute(con->request, "compression", in send_document()
9689 if (strcmp(attr->values[0].string.text, "none") in send_document()
9691 && strcmp(attr->values[0].string.text, "gzip") in send_document()
9696 attr->values[0].string.text); in send_document()
9697 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, in send_document()
9698 "compression", NULL, attr->values[0].string.text); in send_document()
9703 if (!strcmp(attr->values[0].string.text, "gzip")) in send_document()
9712 if ((attr = ippFindAttribute(con->request, "last-document", in send_document()
9716 _("Missing last-document attribute in request.")); in send_document()
9720 if (!con->filename) in send_document()
9723 * Check for an empty request with "last-document" set to true, which is in send_document()
9724 * used to close an "open" job by RFC 2911, section 3.3.2. in send_document()
9727 if (job->num_files > 0 && attr->values[0].boolean) in send_document()
9738 cupsdLoadJob(job); in send_document()
9740 if ((format = ippFindAttribute(con->request, "document-format", in send_document()
9747 if (sscanf(format->values[0].string.text, "%15[^/]/%255[^;]", in send_document()
9750 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad document-format \"%s\"."), in send_document()
9751 format->values[0].string.text); in send_document()
9755 …ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, ippGetSt… in send_document()
9757 else if ((default_format = cupsGetOption("document-format", in send_document()
9758 printer->num_options, in send_document()
9759 printer->options)) != NULL) in send_document()
9768 _("Bad document-format-default \"%s\"."), default_format); in send_document()
9775 * No document format attribute? Auto-type it! in send_document()
9779 strlcpy(type, "octet-stream", sizeof(type)); in send_document()
9782 if (!strcmp(super, "application") && !strcmp(type, "octet-stream")) in send_document()
9785 * Auto-type the file... in send_document()
9788 ipp_attribute_t *doc_name; /* document-name attribute */ in send_document()
9791 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Auto-typing file..."); in send_document()
9793 doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME); in send_document()
9794 filetype = mimeFileType(MimeDatabase, con->filename, in send_document()
9795 doc_name ? doc_name->values[0].string.text : NULL, in send_document()
9802 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Request file type is %s/%s.", in send_document()
9803 filetype->super, filetype->type); in send_document()
9805 snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type); in send_document()
9806 …ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, mimetype… in send_document()
9814 * Replace the document-format attribute value with the auto-typed or in send_document()
9818 snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, in send_document()
9819 filetype->type); in send_document()
9821 if ((jformat = ippFindAttribute(job->attrs, "document-format", in send_document()
9823 ippSetString(job->attrs, &jformat, 0, mimetype); in send_document()
9825 ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, in send_document()
9826 "document-format", NULL, mimetype); in send_document()
9831 _("Unsupported document-format \"%s/%s\"."), super, type); in send_document()
9836 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, in send_document()
9837 "document-format", NULL, format->values[0].string.text); in send_document()
9842 if (printer->filetypes && !cupsArrayFind(printer->filetypes, filetype)) in send_document()
9844 snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, in send_document()
9845 filetype->type); in send_document()
9848 _("Unsupported document-format \"%s\"."), mimetype); in send_document()
9850 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, in send_document()
9851 "document-format", NULL, mimetype); in send_document()
9857 * Add the file to the job... in send_document()
9860 if (add_file(con, job, filetype, compression)) in send_document()
9863 if ((attr = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME)) != NULL) in send_document()
9864 …ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(a… in send_document()
9866 if (stat(con->filename, &fileinfo)) in send_document()
9871 cupsdUpdateQuota(printer, job->username, 0, kbytes); in send_document()
9873 job->koctets += kbytes; in send_document()
9875 if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL) in send_document()
9876 attr->values[0].integer += kbytes; in send_document()
9878 snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, job->num_files); in send_document()
9879 if (rename(con->filename, filename)) in send_document()
9881 …cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strer… in send_document()
9883 send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file.")); in send_document()
9887 cupsdClearString(&con->filename); in send_document()
9889 cupsdLogJob(job, CUPSD_LOG_INFO, "File of type %s/%s queued by \"%s\".", in send_document()
9890 filetype->super, filetype->type, job->username); in send_document()
9893 * Start the job if this is the last document... in send_document()
9898 if ((attr = ippFindAttribute(con->request, "last-document", in send_document()
9900 attr->values[0].boolean) in send_document()
9906 if (cupsdTimeoutJob(job)) in send_document()
9909 if (job->state_value == IPP_JOB_STOPPED) in send_document()
9911 job->state->values[0].integer = IPP_JOB_PENDING; in send_document()
9912 job->state_value = IPP_JOB_PENDING; in send_document()
9914 ippSetString(job->attrs, &job->reasons, 0, "none"); in send_document()
9916 else if (job->state_value == IPP_JOB_HELD) in send_document()
9918 if ((attr = ippFindAttribute(job->attrs, "job-hold-until", in send_document()
9920 attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); in send_document()
9922 if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) in send_document()
9924 job->state->values[0].integer = IPP_JOB_PENDING; in send_document()
9925 job->state_value = IPP_JOB_PENDING; in send_document()
9927 ippSetString(job->attrs, &job->reasons, 0, "none"); in send_document()
9930 ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified"); in send_document()
9933 job->dirty = 1; in send_document()
9940 if ((attr = ippFindAttribute(job->attrs, "job-hold-until", in send_document()
9942 attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); in send_document()
9944 if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) in send_document()
9946 job->state->values[0].integer = IPP_JOB_HELD; in send_document()
9947 job->state_value = IPP_JOB_HELD; in send_document()
9948 job->hold_until = time(NULL) + MultipleOperationTimeout; in send_document()
9950 ippSetString(job->attrs, &job->reasons, 0, "job-incoming"); in send_document()
9952 job->dirty = 1; in send_document()
9963 …RIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, con->clientname, con->clientport, … in send_document()
9964 ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, job_uri); in send_document()
9966 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", jobid); in send_document()
9968 ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value); in send_document()
9969 …ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, job->reasons- in send_document()
9971 con->response->request.status.status_code = IPP_OK; in send_document()
9974 * Start the job if necessary... in send_document()
9983 * 'send_http_error()' - Send a HTTP error back to the IPP client.
9988 cupsd_client_t *con, /* I - Client connection */ in send_http_error()
9989 http_status_t status, /* I - HTTP status code */ in send_http_error()
9990 cupsd_printer_t *printer) /* I - Printer, if any */ in send_http_error()
9995 if ((uri = ippFindAttribute(con->request, "printer-uri", in send_http_error()
9997 uri = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI); in send_http_error()
10001 con->number, httpStatus(status), in send_http_error()
10002 con->request ? in send_http_error()
10003 ippOpString(con->request->request.op.operation_id) : in send_http_error()
10004 "no operation-id", in send_http_error()
10005 uri ? uri->values[0].string.text : "no URI", in send_http_error()
10006 con->http->hostname); in send_http_error()
10016 printer->num_auth_info_required > 0 && in send_http_error()
10017 !strcmp(printer->auth_info_required[0], "negotiate") && in send_http_error()
10018 con->request && in send_http_error()
10019 (con->request->request.op.operation_id == IPP_PRINT_JOB || in send_http_error()
10020 con->request->request.op.operation_id == IPP_CREATE_JOB || in send_http_error()
10021 con->request->request.op.operation_id == CUPS_AUTHENTICATE_JOB)) in send_http_error()
10032 * Use policy/location-defined authentication requirements... in send_http_error()
10039 if (printer->type & CUPS_PRINTER_CLASS) in send_http_error()
10040 snprintf(resource, sizeof(resource), "/classes/%s", printer->name); in send_http_error()
10042 snprintf(resource, sizeof(resource), "/printers/%s", printer->name); in send_http_error()
10045 auth->type == CUPSD_AUTH_NONE) in send_http_error()
10046 auth = cupsdFindPolicyOp(printer->op_policy_ptr, in send_http_error()
10047 con->request ? in send_http_error()
10048 con->request->request.op.operation_id : in send_http_error()
10053 if (auth->type == CUPSD_AUTH_DEFAULT) in send_http_error()
10056 auth_type = auth->type; in send_http_error()
10065 ippDelete(con->response); in send_http_error()
10066 con->response = NULL; in send_http_error()
10073 * 'send_ipp_status()' - Send a status back to the IPP client.
10077 send_ipp_status(cupsd_client_t *con, /* I - Client connection */ in send_ipp_status()
10078 ipp_status_t status, /* I - IPP status code */ in send_ipp_status()
10079 const char *message,/* I - Status message */ in send_ipp_status()
10080 ...) /* I - Additional args as needed */ in send_ipp_status()
10088 _cupsLangString(con->language, message), ap); in send_ipp_status()
10092 ippOpString(con->request->request.op.operation_id), in send_ipp_status()
10095 con->response->request.status.status_code = status; in send_ipp_status()
10097 if (ippFindAttribute(con->response, "attributes-charset", in send_ipp_status()
10099 ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, in send_ipp_status()
10100 "attributes-charset", NULL, "utf-8"); in send_ipp_status()
10102 if (ippFindAttribute(con->response, "attributes-natural-language", in send_ipp_status()
10104 ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, in send_ipp_status()
10105 "attributes-natural-language", NULL, DefaultLanguage); in send_ipp_status()
10107 ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_TEXT, in send_ipp_status()
10108 "status-message", NULL, formatted); in send_ipp_status()
10113 * 'set_default()' - Set the default destination...
10117 set_default(cupsd_client_t *con, /* I - Client connection */ in set_default()
10118 ipp_attribute_t *uri) /* I - Printer URI */ in set_default()
10127 con->number, uri->values[0].string.text); in set_default()
10133 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in set_default()
10163 "%s is no longer the default printer.", oldprinter->name); in set_default()
10166 "%s is now the default printer.", printer->name); in set_default()
10173 printer->name, get_username(con)); in set_default()
10179 con->response->request.status.status_code = IPP_OK; in set_default()
10184 * 'set_job_attrs()' - Set job attributes.
10188 set_job_attrs(cupsd_client_t *con, /* I - Client connection */ in set_job_attrs()
10189 ipp_attribute_t *uri) /* I - Job URI */ in set_job_attrs()
10192 *attr2; /* Job attribute */ in set_job_attrs()
10193 int jobid; /* Job ID */ in set_job_attrs()
10194 cupsd_job_t *job; /* Current job */ in set_job_attrs() local
10209 con->number, uri->values[0].string.text); in set_job_attrs()
10215 con->response->request.status.status_code = IPP_OK; in set_job_attrs()
10218 * See if we have a job URI or a printer URI... in set_job_attrs()
10221 if (!strcmp(uri->name, "printer-uri")) in set_job_attrs()
10224 * Got a printer URI; see if we also have a job-id attribute... in set_job_attrs()
10227 if ((attr = ippFindAttribute(con->request, "job-id", in set_job_attrs()
10231 _("Got a printer-uri attribute but no job-id.")); in set_job_attrs()
10235 jobid = attr->values[0].integer; in set_job_attrs()
10240 * Got a job URI; parse it to get the job ID... in set_job_attrs()
10243 httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, in set_job_attrs()
10253 send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), in set_job_attrs()
10254 uri->values[0].string.text); in set_job_attrs()
10262 * See if the job exists... in set_job_attrs()
10265 if ((job = cupsdFindJob(jobid)) == NULL) in set_job_attrs()
10268 * Nope - return a "not found" error... in set_job_attrs()
10271 send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); in set_job_attrs()
10276 * See if the job has been completed... in set_job_attrs()
10279 if (job->state_value > IPP_JOB_STOPPED) in set_job_attrs()
10282 * Return a "not-possible" error... in set_job_attrs()
10286 _("Job #%d is finished and cannot be altered."), jobid); in set_job_attrs()
10291 * See if the job is owned by the requesting user... in set_job_attrs()
10294 if (!validate_user(job, con, job->username, username, sizeof(username))) in set_job_attrs()
10296 send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, in set_job_attrs()
10297 cupsdFindDest(job->dest)); in set_job_attrs()
10305 cupsdLoadJob(job); in set_job_attrs()
10310 for (attr = con->request->attrs; attr; attr = attr->next) in set_job_attrs()
10312 if (attr->group_tag != IPP_TAG_JOB || !attr->name) in set_job_attrs()
10315 if (!strcmp(attr->name, "attributes-charset") || in set_job_attrs()
10316 !strcmp(attr->name, "attributes-natural-language") || in set_job_attrs()
10317 !strncmp(attr->name, "date-time-at-", 13) || in set_job_attrs()
10318 !strncmp(attr->name, "document-compression", 20) || in set_job_attrs()
10319 !strncmp(attr->name, "document-format", 15) || in set_job_attrs()
10320 !strcmp(attr->name, "job-detailed-status-messages") || in set_job_attrs()
10321 !strcmp(attr->name, "job-document-access-errors") || in set_job_attrs()
10322 !strcmp(attr->name, "job-id") || in set_job_attrs()
10323 !strcmp(attr->name, "job-impressions-completed") || in set_job_attrs()
10324 !strcmp(attr->name, "job-k-octets-completed") || in set_job_attrs()
10325 !strcmp(attr->name, "job-media-sheets-completed") || in set_job_attrs()
10326 !strcmp(attr->name, "job-originating-host-name") || in set_job_attrs()
10327 !strcmp(attr->name, "job-originating-user-name") || in set_job_attrs()
10328 !strcmp(attr->name, "job-pages-completed") || in set_job_attrs()
10329 !strcmp(attr->name, "job-printer-up-time") || in set_job_attrs()
10330 !strcmp(attr->name, "job-printer-uri") || in set_job_attrs()
10331 !strcmp(attr->name, "job-sheets") || in set_job_attrs()
10332 !strcmp(attr->name, "job-state-message") || in set_job_attrs()
10333 !strcmp(attr->name, "job-state-reasons") || in set_job_attrs()
10334 !strcmp(attr->name, "job-uri") || in set_job_attrs()
10335 !strcmp(attr->name, "number-of-documents") || in set_job_attrs()
10336 !strcmp(attr->name, "number-of-intervening-jobs") || in set_job_attrs()
10337 !strcmp(attr->name, "output-device-assigned") || in set_job_attrs()
10338 !strncmp(attr->name, "time-at-", 8)) in set_job_attrs()
10341 * Read-only attrs! in set_job_attrs()
10345 _("%s cannot be changed."), attr->name); in set_job_attrs()
10347 attr2 = ippCopyAttribute(con->response, attr, 0); in set_job_attrs()
10348 ippSetGroupTag(con->response, &attr2, IPP_TAG_UNSUPPORTED_GROUP); in set_job_attrs()
10354 send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Bad '%s' value."), attr->name); in set_job_attrs()
10355 ippCopyAttribute(con->response, attr, 0); in set_job_attrs()
10359 if (!strcmp(attr->name, "job-hold-until")) in set_job_attrs()
10362 /* job-hold-until value */ in set_job_attrs()
10366 …send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported 'job-hold-until' value.… in set_job_attrs()
10367 ippCopyAttribute(con->response, attr, 0); in set_job_attrs()
10371 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-hold-until to %s", when); in set_job_attrs()
10372 cupsdSetJobHoldUntil(job, when, 0); in set_job_attrs()
10374 if (!strcmp(when, "no-hold")) in set_job_attrs()
10376 cupsdReleaseJob(job); in set_job_attrs()
10380 cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", username); in set_job_attrs()
10384 else if (!strcmp(attr->name, "job-priority")) in set_job_attrs()
10387 * Change the job priority... in set_job_attrs()
10390 if (attr->value_tag != IPP_TAG_INTEGER) in set_job_attrs()
10392 send_ipp_status(con, IPP_REQUEST_VALUE, _("Bad job-priority value.")); in set_job_attrs()
10394 attr2 = ippCopyAttribute(con->response, attr, 0); in set_job_attrs()
10395 ippSetGroupTag(con->response, &attr2, IPP_TAG_UNSUPPORTED_GROUP); in set_job_attrs()
10397 else if (job->state_value >= IPP_JOB_PROCESSING) in set_job_attrs()
10400 _("Job is completed and cannot be changed.")); in set_job_attrs()
10403 else if (con->response->request.status.status_code == IPP_OK) in set_job_attrs()
10405 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-priority to %d", in set_job_attrs()
10406 attr->values[0].integer); in set_job_attrs()
10407 cupsdSetJobPriority(job, attr->values[0].integer); in set_job_attrs()
10414 else if (!strcmp(attr->name, "job-state")) in set_job_attrs()
10417 * Change the job state... in set_job_attrs()
10420 if (attr->value_tag != IPP_TAG_ENUM) in set_job_attrs()
10422 send_ipp_status(con, IPP_REQUEST_VALUE, _("Bad job-state value.")); in set_job_attrs()
10424 attr2 = ippCopyAttribute(con->response, attr, 0); in set_job_attrs()
10425 ippSetGroupTag(con->response, &attr2, IPP_TAG_UNSUPPORTED_GROUP); in set_job_attrs()
10429 switch (attr->values[0].integer) in set_job_attrs()
10433 if (job->state_value > IPP_JOB_HELD) in set_job_attrs()
10436 _("Job state cannot be changed.")); in set_job_attrs()
10439 else if (con->response->request.status.status_code == IPP_OK) in set_job_attrs()
10441 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", in set_job_attrs()
10442 attr->values[0].integer); in set_job_attrs()
10443 …cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer, CUPSD_JOB_DEFAULT, "Job state changed… in set_job_attrs()
10450 if (job->state_value != (ipp_jstate_t)attr->values[0].integer) in set_job_attrs()
10453 _("Job state cannot be changed.")); in set_job_attrs()
10461 if (job->state_value > IPP_JOB_PROCESSING) in set_job_attrs()
10464 _("Job state cannot be changed.")); in set_job_attrs()
10467 else if (con->response->request.status.status_code == IPP_OK) in set_job_attrs()
10469 cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", in set_job_attrs()
10470 attr->values[0].integer); in set_job_attrs()
10471 cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer, in set_job_attrs()
10473 "Job state changed by \"%s\"", username); in set_job_attrs()
10480 else if (con->response->request.status.status_code != IPP_OK) in set_job_attrs()
10482 else if ((attr2 = ippFindAttribute(job->attrs, attr->name, in set_job_attrs()
10489 if (job->attrs->prev) in set_job_attrs()
10490 job->attrs->prev->next = attr2->next; in set_job_attrs()
10492 job->attrs->attrs = attr2->next; in set_job_attrs()
10494 if (job->attrs->last == attr2) in set_job_attrs()
10495 job->attrs->last = job->attrs->prev; in set_job_attrs()
10503 ippCopyAttribute(job->attrs, attr, 0); in set_job_attrs()
10505 else if (attr->value_tag == IPP_TAG_DELETEATTR) in set_job_attrs()
10511 if ((attr2 = ippFindAttribute(job->attrs, attr->name, in set_job_attrs()
10514 if (job->attrs->prev) in set_job_attrs()
10515 job->attrs->prev->next = attr2->next; in set_job_attrs()
10517 job->attrs->attrs = attr2->next; in set_job_attrs()
10519 if (attr2 == job->attrs->last) in set_job_attrs()
10520 job->attrs->last = job->attrs->prev; in set_job_attrs()
10533 ippCopyAttribute(job->attrs, attr, 0); in set_job_attrs()
10540 * Save the job... in set_job_attrs()
10543 job->dirty = 1; in set_job_attrs()
10552 cupsdFindDest(job->dest), job, in set_job_attrs()
10553 "Job priority changed by user."); in set_job_attrs()
10556 cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job, in set_job_attrs()
10557 job->state_value == IPP_JOB_HELD ? in set_job_attrs()
10558 "Job held by user." : "Job restarted by user."); in set_job_attrs()
10561 cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, in set_job_attrs()
10562 "Job options changed by user."); in set_job_attrs()
10574 * 'set_printer_attrs()' - Set printer attributes.
10578 set_printer_attrs(cupsd_client_t *con, /* I - Client connection */ in set_printer_attrs()
10579 ipp_attribute_t *uri) /* I - Printer */ in set_printer_attrs()
10589 con->number, uri->values[0].string.text); in set_printer_attrs()
10595 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in set_printer_attrs()
10610 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in set_printer_attrs()
10617 * Return a list of attributes that can be set via Set-Printer-Attributes. in set_printer_attrs()
10620 if ((attr = ippFindAttribute(con->request, "printer-location", in set_printer_attrs()
10623 cupsdSetString(&printer->location, attr->values[0].string.text); in set_printer_attrs()
10627 …if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strnc… in set_printer_attrs()
10629 cupsdSetString(&printer->geo_location, attr->values[0].string.text); in set_printer_attrs()
10633 if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL) in set_printer_attrs()
10635 cupsdSetString(&printer->organization, attr->values[0].string.text); in set_printer_attrs()
10639 if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL) in set_printer_attrs()
10641 cupsdSetString(&printer->organizational_unit, attr->values[0].string.text); in set_printer_attrs()
10645 if ((attr = ippFindAttribute(con->request, "printer-info", in set_printer_attrs()
10648 cupsdSetString(&printer->info, attr->values[0].string.text); in set_printer_attrs()
10658 printer->config_time = time(NULL); in set_printer_attrs()
10665 printer->name, get_username(con)); in set_printer_attrs()
10669 printer->name, get_username(con)); in set_printer_attrs()
10672 con->response->request.status.status_code = IPP_OK; in set_printer_attrs()
10677 * 'set_printer_defaults()' - Set printer default options from a request.
10680 static int /* O - 1 on success, 0 on failure */
10682 cupsd_client_t *con, /* I - Client connection */ in set_printer_defaults()
10683 cupsd_printer_t *printer) /* I - Printer */ in set_printer_defaults()
10687 size_t namelen; /* Length of attribute name */ in set_printer_defaults()
10688 char name[256], /* New attribute name */ in set_printer_defaults() local
10692 for (attr = con->request->attrs; attr; attr = attr->next) in set_printer_defaults()
10695 * Skip non-printer attributes... in set_printer_defaults()
10698 if (attr->group_tag != IPP_TAG_PRINTER || !attr->name) in set_printer_defaults()
10701 cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_defaults: %s", attr->name); in set_printer_defaults()
10703 if (!strcmp(attr->name, "job-sheets-default")) in set_printer_defaults()
10709 if (attr->value_tag != IPP_TAG_NAME && attr->value_tag != IPP_TAG_KEYWORD) in set_printer_defaults()
10713 * Only allow job-sheets-default to be set when running without a in set_printer_defaults()
10720 cupsdSetString(&printer->job_sheets[0], attr->values[0].string.text); in set_printer_defaults()
10722 if (attr->num_values > 1) in set_printer_defaults()
10723 cupsdSetString(&printer->job_sheets[1], attr->values[1].string.text); in set_printer_defaults()
10725 cupsdSetString(&printer->job_sheets[1], "none"); in set_printer_defaults()
10727 else if (!strcmp(attr->name, "requesting-user-name-allowed")) in set_printer_defaults()
10729 cupsdFreeStrings(&(printer->users)); in set_printer_defaults()
10731 printer->deny_users = 0; in set_printer_defaults()
10733 if (attr->value_tag == IPP_TAG_NAME && in set_printer_defaults()
10734 (attr->num_values > 1 || in set_printer_defaults()
10735 strcmp(attr->values[0].string.text, "all"))) in set_printer_defaults()
10737 for (i = 0; i < attr->num_values; i ++) in set_printer_defaults()
10738 cupsdAddString(&(printer->users), attr->values[i].string.text); in set_printer_defaults()
10741 else if (!strcmp(attr->name, "requesting-user-name-denied")) in set_printer_defaults()
10743 cupsdFreeStrings(&(printer->users)); in set_printer_defaults()
10745 printer->deny_users = 1; in set_printer_defaults()
10747 if (attr->value_tag == IPP_TAG_NAME && in set_printer_defaults()
10748 (attr->num_values > 1 || in set_printer_defaults()
10749 strcmp(attr->values[0].string.text, "none"))) in set_printer_defaults()
10751 for (i = 0; i < attr->num_values; i ++) in set_printer_defaults()
10752 cupsdAddString(&(printer->users), attr->values[i].string.text); in set_printer_defaults()
10755 else if (!strcmp(attr->name, "job-quota-period")) in set_printer_defaults()
10757 if (attr->value_tag != IPP_TAG_INTEGER) in set_printer_defaults()
10760 cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting job-quota-period to %d...", in set_printer_defaults()
10761 attr->values[0].integer); in set_printer_defaults()
10764 printer->quota_period = attr->values[0].integer; in set_printer_defaults()
10766 else if (!strcmp(attr->name, "job-k-limit")) in set_printer_defaults()
10768 if (attr->value_tag != IPP_TAG_INTEGER) in set_printer_defaults()
10771 cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting job-k-limit to %d...", in set_printer_defaults()
10772 attr->values[0].integer); in set_printer_defaults()
10775 printer->k_limit = attr->values[0].integer; in set_printer_defaults()
10777 else if (!strcmp(attr->name, "job-page-limit")) in set_printer_defaults()
10779 if (attr->value_tag != IPP_TAG_INTEGER) in set_printer_defaults()
10782 cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting job-page-limit to %d...", in set_printer_defaults()
10783 attr->values[0].integer); in set_printer_defaults()
10786 printer->page_limit = attr->values[0].integer; in set_printer_defaults()
10788 else if (!strcmp(attr->name, "printer-op-policy")) in set_printer_defaults()
10793 if (attr->value_tag != IPP_TAG_NAME) in set_printer_defaults()
10796 if ((p = cupsdFindPolicy(attr->values[0].string.text)) != NULL) in set_printer_defaults()
10799 "Setting printer-op-policy to \"%s\"...", in set_printer_defaults()
10800 attr->values[0].string.text); in set_printer_defaults()
10801 cupsdSetString(&printer->op_policy, attr->values[0].string.text); in set_printer_defaults()
10802 printer->op_policy_ptr = p; in set_printer_defaults()
10807 _("Unknown printer-op-policy \"%s\"."), in set_printer_defaults()
10808 attr->values[0].string.text); in set_printer_defaults()
10812 else if (!strcmp(attr->name, "printer-error-policy")) in set_printer_defaults()
10814 if (attr->value_tag != IPP_TAG_NAME && attr->value_tag != IPP_TAG_KEYWORD) in set_printer_defaults()
10817 if (strcmp(attr->values[0].string.text, "retry-current-job") && in set_printer_defaults()
10818 ((printer->type & CUPS_PRINTER_CLASS) || in set_printer_defaults()
10819 (strcmp(attr->values[0].string.text, "abort-job") && in set_printer_defaults()
10820 strcmp(attr->values[0].string.text, "retry-job") && in set_printer_defaults()
10821 strcmp(attr->values[0].string.text, "stop-printer")))) in set_printer_defaults()
10824 _("Unknown printer-error-policy \"%s\"."), in set_printer_defaults()
10825 attr->values[0].string.text); in set_printer_defaults()
10830 "Setting printer-error-policy to \"%s\"...", in set_printer_defaults()
10831 attr->values[0].string.text); in set_printer_defaults()
10832 cupsdSetString(&printer->error_policy, attr->values[0].string.text); in set_printer_defaults()
10836 * Skip any other non-default attributes... in set_printer_defaults()
10839 namelen = strlen(attr->name); in set_printer_defaults()
10840 if (namelen < 9 || strcmp(attr->name + namelen - 8, "-default") || in set_printer_defaults()
10841 namelen > (sizeof(name) - 1) || attr->num_values != 1) in set_printer_defaults()
10845 * OK, anything else must be a user-defined default... in set_printer_defaults()
10848 strlcpy(name, attr->name, sizeof(name)); in set_printer_defaults()
10849 name[namelen - 8] = '\0'; /* Strip "-default" */ in set_printer_defaults()
10851 switch (attr->value_tag) in set_printer_defaults()
10854 printer->num_options = cupsRemoveOption(name, in set_printer_defaults()
10855 printer->num_options, in set_printer_defaults()
10856 &(printer->options)); in set_printer_defaults()
10858 "Deleting %s", attr->name); in set_printer_defaults()
10865 printer->num_options = cupsAddOption(name, in set_printer_defaults()
10866 attr->values[0].string.text, in set_printer_defaults()
10867 printer->num_options, in set_printer_defaults()
10868 &(printer->options)); in set_printer_defaults()
10870 "Setting %s to \"%s\"...", attr->name, in set_printer_defaults()
10871 attr->values[0].string.text); in set_printer_defaults()
10875 printer->num_options = cupsAddOption(name, in set_printer_defaults()
10876 attr->values[0].boolean ? in set_printer_defaults()
10878 printer->num_options, in set_printer_defaults()
10879 &(printer->options)); in set_printer_defaults()
10881 "Setting %s to %s...", attr->name, in set_printer_defaults()
10882 attr->values[0].boolean ? "true" : "false"); in set_printer_defaults()
10887 …printer->num_options = cupsAddIntegerOption(name, attr->values[0].integer, printer->num_options, &… in set_printer_defaults()
10889 "Setting %s to %s...", attr->name, value); in set_printer_defaults()
10893 … snprintf(value, sizeof(value), "%d-%d", attr->values[0].range.lower, attr->values[0].range.upper); in set_printer_defaults()
10894 printer->num_options = cupsAddOption(name, value, in set_printer_defaults()
10895 printer->num_options, in set_printer_defaults()
10896 &(printer->options)); in set_printer_defaults()
10898 "Setting %s to %s...", attr->name, value); in set_printer_defaults()
10902 …rintf(value, sizeof(value), "%dx%d%s", attr->values[0].resolution.xres, attr->values[0].resolution… in set_printer_defaults()
10903 printer->num_options = cupsAddOption(name, value, in set_printer_defaults()
10904 printer->num_options, in set_printer_defaults()
10905 &(printer->options)); in set_printer_defaults()
10907 "Setting %s to %s...", attr->name, value); in set_printer_defaults()
10921 * 'start_printer()' - Start a printer.
10925 start_printer(cupsd_client_t *con, /* I - Client connection */ in start_printer()
10926 ipp_attribute_t *uri) /* I - Printer URI */ in start_printer()
10935 con->number, uri->values[0].string.text); in start_printer()
10941 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in start_printer()
10956 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in start_printer()
10966 printer->state_message[0] = '\0'; in start_printer()
10972 printer->name, get_username(con)); in start_printer()
10975 printer->name, get_username(con)); in start_printer()
10998 con->response->request.status.status_code = IPP_OK; in start_printer()
11003 * 'stop_printer()' - Stop a printer.
11007 stop_printer(cupsd_client_t *con, /* I - Client connection */ in stop_printer()
11008 ipp_attribute_t *uri) /* I - Printer URI */ in stop_printer()
11013 ipp_attribute_t *attr; /* printer-state-message attribute */ in stop_printer()
11017 con->number, uri->values[0].string.text); in stop_printer()
11023 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in stop_printer()
11038 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in stop_printer()
11048 if ((attr = ippFindAttribute(con->request, "printer-state-message", in stop_printer()
11050 strlcpy(printer->state_message, "Paused", sizeof(printer->state_message)); in stop_printer()
11053 strlcpy(printer->state_message, attr->values[0].string.text, in stop_printer()
11054 sizeof(printer->state_message)); in stop_printer()
11061 printer->name, get_username(con)); in stop_printer()
11064 printer->name, get_username(con)); in stop_printer()
11070 con->response->request.status.status_code = IPP_OK; in stop_printer()
11075 * 'url_encode_attr()' - URL-encode a string attribute.
11079 url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */ in url_encode_attr()
11080 char *buffer,/* I - String buffer */ in url_encode_attr()
11081 size_t bufsize)/* I - Size of buffer */ in url_encode_attr()
11088 strlcpy(buffer, attr->name, bufsize); in url_encode_attr()
11090 bufend = buffer + bufsize - 1; in url_encode_attr()
11092 for (i = 0; i < attr->num_values; i ++) in url_encode_attr()
11107 bufptr = url_encode_string(attr->values[i].string.text, bufptr, (size_t)(bufend - bufptr + 1)); in url_encode_attr()
11120 * 'url_encode_string()' - URL-encode a string.
11123 static char * /* O - End of string */
11124 url_encode_string(const char *s, /* I - String */ in url_encode_string()
11125 char *buffer, /* I - String buffer */ in url_encode_string()
11126 size_t bufsize) /* I - Size of buffer */ in url_encode_string()
11135 bufend = buffer + bufsize - 1; in url_encode_string()
11141 if (bufptr >= (bufend - 2)) in url_encode_string()
11152 if (bufptr >= (bufend - 1)) in url_encode_string()
11169 * 'user_allowed()' - See if a user is allowed to print to a queue.
11172 static int /* O - 0 if not allowed, 1 if allowed */
11173 user_allowed(cupsd_printer_t *p, /* I - Printer or class */ in user_allowed()
11174 const char *username) /* I - Username */ in user_allowed()
11179 *name; /* Current user name */ in user_allowed() local
11182 if (cupsArrayCount(p->users) == 0) in user_allowed()
11205 for (name = (char *)cupsArrayFirst(p->users); in user_allowed()
11206 name; in user_allowed()
11207 name = (char *)cupsArrayNext(p->users)) in user_allowed()
11209 if (name[0] == '@') in user_allowed()
11215 if (cupsdCheckGroup(username, pw, name + 1)) in user_allowed()
11218 else if (name[0] == '#') in user_allowed()
11224 if (cupsdCheckGroup(username, pw, name)) in user_allowed()
11227 else if (!_cups_strcasecmp(username, name)) in user_allowed()
11231 return ((name != NULL) != p->deny_users); in user_allowed()
11236 * 'validate_job()' - Validate printer options and destination.
11240 validate_job(cupsd_client_t *con, /* I - Client connection */ in validate_job()
11241 ipp_attribute_t *uri) /* I - Printer URI */ in validate_job()
11246 ipp_attribute_t *auth_info; /* auth-info attribute */ in validate_job()
11248 ipp_attribute_t *format, /* Document-format attribute */ in validate_job()
11249 *name; /* Job-name attribute */ in validate_job() local
11259 con->number, uri->values[0].string.text); in validate_job()
11262 * OK, see if the client is sending the document compressed - CUPS in validate_job()
11266 if ((attr = ippFindAttribute(con->request, "compression", in validate_job()
11269 if (strcmp(attr->values[0].string.text, "none") in validate_job()
11271 && strcmp(attr->values[0].string.text, "gzip") in validate_job()
11277 attr->values[0].string.text); in validate_job()
11278 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, in validate_job()
11279 "compression", NULL, attr->values[0].string.text); in validate_job()
11288 if ((format = ippFindAttribute(con->request, "document-format", in validate_job()
11291 if (sscanf(format->values[0].string.text, "%15[^/]/%255[^;]", in validate_job()
11295 _("Bad 'document-format' value \"%s\"."), in validate_job()
11296 format->values[0].string.text); in validate_job()
11300 if ((strcmp(super, "application") || strcmp(type, "octet-stream")) && in validate_job()
11306 _("Unsupported 'document-format' value \"%s\"."), in validate_job()
11307 format->values[0].string.text); in validate_job()
11308 ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, in validate_job()
11309 "document-format", NULL, format->values[0].string.text); in validate_job()
11315 * Is the job-hold-until value valid? in validate_job()
11318 …if ((attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_ZERO)) != NULL && ((ippGetVal… in validate_job()
11320 …send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported 'job-hold-until' value.… in validate_job()
11321 ippCopyAttribute(con->response, attr, 0); in validate_job()
11326 * Is the job-name valid? in validate_job()
11329 if ((name = ippFindAttribute(con->request, "job-name", IPP_TAG_ZERO)) != NULL) in validate_job()
11331 if ((name->value_tag != IPP_TAG_NAME && name->value_tag != IPP_TAG_NAMELANG) || in validate_job()
11332 name->num_values != 1 || !ippValidateAttribute(name)) in validate_job()
11336 send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported 'job-name' value.")); in validate_job()
11337 ippCopyAttribute(con->response, name, 0); in validate_job()
11342 cupsdLogMessage(CUPSD_LOG_WARN, "Unsupported 'job-name' value, deleting from request."); in validate_job()
11343 ippDeleteAttribute(con->request, name); in validate_job()
11352 if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) in validate_job()
11368 auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); in validate_job()
11371 if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) in validate_job()
11376 else if (printer->num_auth_info_required == 1 && in validate_job()
11377 !strcmp(printer->auth_info_required[0], "negotiate") && in validate_job()
11378 !con->username[0]) in validate_job()
11384 else if (auth_info && !con->http->tls && in validate_job()
11385 !httpAddrLocalhost(con->http->hostaddr)) in validate_job()
11388 * Require encryption of auth-info over non-local connections... in validate_job()
11400 con->response->request.status.status_code = IPP_OK; in validate_job()
11405 * 'validate_name()' - Make sure the printer name only contains valid chars.
11408 static int /* O - 0 if name is no good, 1 if good */
11409 validate_name(const char *name) /* I - Name to check */ in validate_name() argument
11411 const char *ptr; /* Pointer into name */ in validate_name()
11415 * Scan the whole name... in validate_name()
11418 for (ptr = name; *ptr; ptr ++) in validate_name()
11426 return ((ptr - name) < 128); in validate_name()
11431 * 'validate_user()' - Validate the user for the request.
11434 static int /* O - 1 if permitted, 0 otherwise */
11435 validate_user(cupsd_job_t *job, /* I - Job */ in validate_user() argument
11436 cupsd_client_t *con, /* I - Client connection */ in validate_user()
11437 const char *owner, /* I - Owner of job/resource */ in validate_user()
11438 char *username, /* O - Authenticated username */ in validate_user()
11439 size_t userlen) /* I - Length of username */ in validate_user()
11441 cupsd_printer_t *printer; /* Printer for job */ in validate_user()
11444 …UPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")… in validate_user()
11463 printer = cupsdFindDest(job->dest); in validate_user()
11465 return (cupsdCheckPolicy(printer ? printer->op_policy_ptr : DefaultPolicyPtr, in validate_user()