From CUPS 1.6.x on using a remote CUPS server via client.conf stopped working #4231

Closed
michaelrsweet opened this Issue Nov 19, 2012 · 22 comments

Comments

Projects
None yet
1 participant
Collaborator

michaelrsweet commented Nov 19, 2012

Version: 1.6.1
CUPS.org User: till.kamppeter

Original Ubuntu bug report:

https://bugs.launchpad.net/ubuntu/+source/cups/+bug/1069671

User has updated his Ubuntu from 12.04 to 12.10 which includes an upgrade of CUPS from 1.5.x to 1.6.1.

Since then he cannot redirect all printing to a remote server via client.conf any more. He uses

ServerName

but now not the print queues of the server are listed in the application's print dialogs but the queues of the local CUPS daemon instead.

Collaborator

michaelrsweet commented Nov 20, 2012

CUPS.org User: mike

Please attach strace and ltrace output for a GNOME application from the affected system. We disabled ServerName on OS X but it should still be working on Linux.

Also, please attach the output of "lpstat -h servername -p".

Collaborator

michaelrsweet commented Nov 20, 2012

CUPS.org User: till.kamppeter

One update: The original poster of the Ubuntu bug report sees neither the queues on the remote server nor the queues of his local CUPS setup when he has the client.conf in place. Without client.conf he sees his local queues.

Collaborator

michaelrsweet commented Nov 21, 2012

CUPS.org User: jamesm

Mike - I'm not sure what you want exactly (what counts as a GNOME application?). I have attached the output of

strace -o strace-lpq.txt lpq
and
strace -o strace-lpr.txt lpr -P
and (for what it's worth)
ltrace -o ltrace-lpq.txt lpq.
all of which I typed in a terminal window. Is that ok?

lpstat also didn't give me much:

lpstat -h 130.88.16.xxx -p
WARNING: gnome-keyring:: couldn't connect to: /run/user/james/keyring-Ii2RXp/pkcs11: No such file or directory
lpstat: Bad Request

(Note I replaced the final 3 digits of our printer server's IP address with xxx throughout)

Hope that helps

James

Collaborator

michaelrsweet commented Nov 29, 2012

CUPS.org User: sst

Ubuntu OP here. I have added strace and ltrace output for evince (which I guess counts as a GNOME app?). I opened evince, loaded a PDF and opened the print dialog, then closing it again.

Also:

$ lpstat -h xanadu01 -p
lpstat: Bad Request

Collaborator

michaelrsweet commented Nov 30, 2012

CUPS.org User: jsmeix.suse

Regarding "$ lpstat -h xanadu01 -p => lpstat: Bad Request":

I got the same with CUPS 1.6.1 when I access a CUPS server
that runs an older CUPS version (e.g. 1.3.9 on a SUSE Linux
Enterprise Server 11 system).

I also noticed that the initial comment in
https://bugs.launchpad.net/ubuntu/+source/cups/+bug/1069671
reads "the server ... runs CUPS 1.2.7"

As far as I understand it this is caused by STR3929
https://www.cups.org/str.php?L3929
"Make default IPP version 2.0"

For my current test-version of CUPS 1.6.1, see
https://bugzilla.novell.com/show_bug.cgi?id=735404#c26
I apply cups-1.6.1-revertSTR3929_to_default_IPP_1.1_again.patch
that reverts the changes in STR3929
https://www.cups.org/strfiles/3929/str3929.patch

I used this patch because I didn't find a setting in cupsd.conf
to specify the default IPP version for outgoing IPP requests.

When using IPP version 1.1 by default CUPS 1.6 clients
can again talk to older CUPS servers.

In contrast when using IPP version 2.0 by default
CUPS 1.6 on clients cannot talk to older CUPS
servers in particular not to CUPS 1.3.9 on SLE11.
E.g. on a CUPS 1.6 client "lpstat -h sle11.cups.server -p"
would fail on the client with "lpstat: Bad Request" and
the CUPS 1.3.9 server logs in /var/log/cups/error_log the
lines "E ... cupsdReadClient: ... IPP Read Error!"
and "D ... cupsdSendError: ... code=400 (Bad Request)".

Collaborator

michaelrsweet commented Nov 30, 2012

CUPS.org User: jsmeix.suse

At least for me
"ServerName sle11.cups.server" in /etc/cups/client.conf
works well on a CUPS 1.6.1 client with the above mentioned
cups-1.6.1-revertSTR3929_to_default_IPP_1.1_again.patch

Collaborator

michaelrsweet commented Nov 30, 2012

CUPS.org User: mike

Johannes,

Dropping the default version number to 1.1 and getting rid of the unique request IDs is not something we are prepared to do for CUPS. Doing so causes side-effects for 2.0-specific behavior, and we added the unique request ID code as an aid to debugging.

What needs to happen is for the libcups code to see the "version not supported" and retry with version 1.1.

Collaborator

michaelrsweet commented Dec 3, 2012

CUPS.org User: mike

Changes applied to trunk and 1.6 branch and are attached below. Basically, we now track the server version and use it for the various convenience functions in libcups. The program doing the connection needs to use cupsGetDests or getGetNamedDests at some point to force the version detection (which should be sufficient to make this work).

Please test and report any deficiencies...

Collaborator

michaelrsweet commented Dec 5, 2012

CUPS.org User: jsmeix.suse

Regarding the comment "mike: 11:04 Nov 30, 2012":

I am sorry, my comment and patch caused confusion.

My cups-1.6.1-revertSTR3929_to_default_IPP_1.1_again.patch
was neither meant as solution nor as proper fix.
It is only a quick and dirty band-aid to make my CUPS 1.6.1
testing package again talk to my older CUPS servers.
I only liked to show the basic reason of the issue.

Of course the right solution is to "retry with version 1.1"
(e.g. like the IPP backend already implements at
"Switch to IPP/1.1 or IPP/1.0..." in backend/ipp.c).

Collaborator

michaelrsweet commented Dec 5, 2012

CUPS.org User: jsmeix.suse

The patch "mike: 05:33 Dec 03, 2012 str4231.patch (9k)"
does not work for my CUPS 1.6.1 (the released version).

I think the code is not executed because I added debug messages

in cups/dest.c via

  • /*
  • * Do the request and get back a response...
  • */
  • DEBUG_puts("Do the request and get back a response...");
  • response = cupsDoRequest(http, request, "/");
  • if (cg->server_version != 20 || !response ||
  •    cupsLastError() != IPP_BAD_REQUEST)
    
  •  { DEBUG_puts("Got response and break out.");
    
  •    break; }
    
  • /*
  • * Retry as an IPP/1.1 request...
  • */
  • DEBUG_puts("Retry as an IPP/1.1 request...");
  • cg->server_version = 11;

+ ippDelete(response);

and then started cupsd with

export CUPS_DEBUG_LOG="/tmp/cups.debug"

export CUPS_DEBUG_LEVEL="9"

I got again on my CUPS 1.6.1 client

lpstat -h cups-1.3.9_server -p

lpstat: Bad Request

But in /tmp/cups.debug on my CUPS 1.6.1 system
I do not find any of those above debug messages.

Collaborator

michaelrsweet commented Dec 6, 2012

CUPS.org User: der-vegi

As for jsmeix.suse, the patch "str4231.patch" doesn't work for me, either. Still the same, I don't see any queues. 'lpstat -h cupsservername -p' still gives me 'lpstat: Bad Request'.

Collaborator

michaelrsweet commented Jan 14, 2013

CUPS.org User: mike

OK, after a lot of internal discussion I think our best approach for this issue is to simply add support for a version number to client.conf that controls the default IPP version number that is assigned by ippNew(). Thus, a newer client just needs to do:

Server servername[:port]/version=1.1

This will also allow users to do:

lpstat -h servername/version=1.1 -p

Unfortunately, there are just too many entry points where we would need to patch around support, so the automatic approach won't cut it.

Collaborator

michaelrsweet commented Jan 14, 2013

CUPS.org User: mike

Attached is an alternate patch that adds support for "/version=1.1" at the end of a hostname/port, either in the client.conf file as part of the ServerName value, the CUPS_SERVER environment variable value, or the "-h" value specified on the command-line.

Collaborator

michaelrsweet commented Jan 18, 2013

CUPS.org User: mike

Fixed in Subversion repository.

Collaborator

michaelrsweet commented Mar 11, 2013

CUPS.org User: iskunk

Mike, could you put out a 1.6.2 release with this fix? Debian/Ubuntu integrated a patch that supposedly implements the IPP-version directive, but it only works in some circumstances:

https://bugs.launchpad.net/ubuntu/+source/cups/+bug/1069671/comments/35

The fact that the fix is a modification to the current release version of CUPS (1.6.1) makes it confusing to tell whether or not the fix is present, and whether or not it actually works. A new upstream release that is known to work correctly will help clear the air.

Collaborator

michaelrsweet commented Mar 12, 2013

CUPS.org User: mike

The fix is in 1.6.2, which will hopefully (finally!) be released soon...

Collaborator

michaelrsweet commented Mar 12, 2013

CUPS.org User: till.kamppeter

iskunk tells in his Ubuntu bug report:


I traced through the code a bit, and found that in the latter two cases, CUPS is actually doing a DNS lookup on "cups-server.example.com/version=1.1". It never calls cupsSetServer().

Mike, I have not checked but assume that the patch attached to this bug (or r10813/r10814 taken from SVN) got applied to the Ubuntu package. Are you sure that they contain the complete fix?

Collaborator

michaelrsweet commented Mar 12, 2013

CUPS.org User: mike

Sure enough, the options aren't getting stripped when read from client.conf, just when pulled from the CUPS_SERVER environment variable and -h command-line option.

Collaborator

michaelrsweet commented Mar 12, 2013

CUPS.org User: mike

Created STR #4291 to track the fix for this...

Collaborator

michaelrsweet commented Mar 12, 2013

"cups-1.6.1-revertSTR3929_to_default_IPP_1.1_again.patch":

--- cups/ipp.c.orig 2012-11-28 13:59:53.000000000 +0100
+++ cups/ipp.c 2012-11-28 14:04:17.000000000 +0100
@@ -2335,11 +2335,11 @@ ippNew(void)
if ((temp = (ipp_t )calloc(1, sizeof(ipp_t))) != NULL)
{
/

  • * Default to IPP 2.0...
    • Default to IPP 1.1...
      */
  • temp->request.any.version[0] = 2;
  • temp->request.any.version[1] = 0;
  • temp->request.any.version[0] = 1;
  • temp->request.any.version[1] = 1;
    temp->use = 1;
    }

@@ -2364,7 +2364,7 @@ ippNewRequest(ipp_op_t op) /* I - Opera
{
ipp_t request; / IPP request message /
cups_lang_t *language; /
Current language localization */

  • static int request_id = 0; /* Current request ID */
  • static int request_id = 1; /* Current request ID _/
    static _cups_mutex_t request_mutex = CUPS_MUTEX_INITIALIZER;
    /
    Mutex for request ID */

@@ -2385,7 +2385,7 @@ ippNewRequest(ipp_op_t op) /* I - Opera
_cupsMutexLock(&request_mutex);

request->request.op.operation_id = op;

  • request->request.op.request_id = ++request_id;
  • request->request.op.request_id = 1;

_cupsMutexUnlock(&request_mutex);

Collaborator

michaelrsweet commented Mar 12, 2013

"str4231.patch":

Index: cups/util.c

--- cups/util.c (revision 10716)
+++ cups/util.c (working copy)
@@ -117,6 +117,7 @@
{
char uri[HTTP_MAX_URI]; /* Job/printer URI /
ipp_t *request; /
IPP request */

  • _cups_globals_t _cg = cupsGlobals(); / Thread global data */

/*
@@ -150,6 +151,8 @@

request = ippNewRequest(job_id < 0 ? IPP_PURGE_JOBS : IPP_CANCEL_JOB);

  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);

if (name)
{
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
@@ -211,6 +214,7 @@
response; / Create-Job response /
ipp_attribute_t *attr; /
job-id attribute /
int job_id = 0; /
job-id value */

  • _cups_globals_t _cg = cupsGlobals(); / Thread global data */

DEBUG_printf(("cupsCreateJob(http=%p, name="%s", title="%s", "
@@ -237,6 +241,8 @@
return (0);
}

  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);

httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp",
NULL, "localhost", ippPort(), "/printers/%s", name);
snprintf(resource, sizeof(resource), "/printers/%s", name);
@@ -363,6 +369,8 @@

request = ippNewRequest(CUPS_GET_CLASSES);

  • ippSetVersion(request, 1, 1);

ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", NULL, "printer-name");

@@ -482,6 +490,8 @@

request = ippNewRequest(CUPS_GET_DEFAULT);

  • ippSetVersion(request, 1, 1);

/*

  • Do the request and get back a response...
    */
    @@ -627,6 +637,8 @@

request = ippNewRequest(IPP_GET_JOBS);

  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);

ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);

@@ -1209,6 +1221,8 @@

request = ippNewRequest(CUPS_GET_PRINTERS);

  • ippSetVersion(request, 1, 1);

ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", NULL, "printer-name");

@@ -1325,6 +1339,8 @@
*/

request = ippNewRequest(CUPS_GET_PPD);

  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);

ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", NULL,
name);

@@ -1566,6 +1582,7 @@
printer_uri[1024]; /* Printer URI /
ipp_t *request; /
Send-Document request /
http_status_t status; /
HTTP status */

  • _cups_globals_t _cg = cupsGlobals(); / Thread global data */

/*
@@ -1578,6 +1595,8 @@
return (HTTP_ERROR);
}

  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);

httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp",
NULL, "localhost", ippPort(), "/printers/%s", name);
snprintf(resource, sizeof(resource), "/printers/%s", name);
@@ -1635,6 +1654,7 @@
classname[255], /* Temporary class name /
http_hostname[HTTP_MAX_HOST];
/
Hostname associated with connection */

  • _cups_globals_t _cg = cupsGlobals(); / Thread global data /
    static const char * const requested_attrs[] =
    { /
    Requested attributes */
    "device-uri",
    @@ -1684,6 +1704,8 @@

request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);

  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);

ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);

Index: cups/dest.c

--- cups/dest.c (revision 10716)
+++ cups/dest.c (working copy)
@@ -1388,6 +1388,7 @@
char optname[1024], /* Option name /
value[2048], /
Option value /
*ptr; /
Pointer into name/value */

  • _cups_globals_t _cg = cupsGlobals(); / Thread global data /
    static const char * const pattrs[] = /
    Attributes we're interested in /
    {
    "auth-info-required",
    @@ -1429,45 +1430,62 @@
    appleGetPaperSize(media_default, sizeof(media_default));
    #endif /
    APPLE */
  • /*
  • * Build a CUPS_GET_PRINTERS or IPP_GET_PRINTER_ATTRIBUTES request, which
  • * require the following attributes:
  • * attributes-charset
  • * attributes-natural-language
  • * requesting-user-name
  • * printer-uri [for IPP_GET_PRINTER_ATTRIBUTES]
  • */
  • for (;;)
  • {
  • /*
  • * Build a CUPS_GET_PRINTERS or IPP_GET_PRINTER_ATTRIBUTES request, which
  • * require the following attributes:
  • * attributes-charset
  • * attributes-natural-language
  • * requesting-user-name
  • * printer-uri [for IPP_GET_PRINTER_ATTRIBUTES]
  • */
  • request = ippNewRequest(op);
  • request = ippNewRequest(op);
  • ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
  •            "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
    
  •   NULL, pattrs);
    
  • ippSetVersion(request, cg->server_version / 10, cg->server_version % 10);
  • ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
  •           "requesting-user-name", NULL, cupsUser());
    
  • ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
  •     "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
    
  •     NULL, pattrs);
    
  • if (name && op != CUPS_GET_DEFAULT)
  • {
  • httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
  •                 "localhost", ippPort(), "/printers/%s", name);
    
  • ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
  •             uri);
    
  • ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
  •    "requesting-user-name", NULL, cupsUser());
    
  • if (name && op != CUPS_GET_DEFAULT)
  • {
  •  httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
    
  •          "localhost", ippPort(), "/printers/%s", name);
    
  •  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
    
  •      uri);
    
  • }
  • else if (mask)
  • {
  •  ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
    
  •       type);
    
  •  ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
    
  •       mask);
    
  • }
  • /*
  • * Do the request and get back a response...
  • */
  • response = cupsDoRequest(http, request, "/");
  • if (cg->server_version != 20 || !response ||
  •    cupsLastError() != IPP_BAD_REQUEST)
    
  •  break;
    
  • /*
  • * Retry as an IPP/1.1 request...
  • */
  • cg->server_version = 11;
  • ippDelete(response);
    }
  • else if (mask)
  • {
  • ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
  •              type);
    
  • ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
  •              mask);
    
  • }
  • /*
  • * Do the request and get back a response...

- */

  • if ((response = cupsDoRequest(http, request, "/")) != NULL)
  • if (response)
    {
    for (attr = response->attrs; attr != NULL; attr = attr->next)
    {

Index: cups/globals.c

--- cups/globals.c (revision 10716)
+++ cups/globals.c (working copy)
@@ -214,11 +214,12 @@
*/

memset(cg, 0, sizeof(_cups_globals_t));

  • cg->encryption = (http_encryption_t)-1;
  • cg->password_cb = (cups_password_cb2_t)_cupsGetPassword;
  • cg->any_root = 1;
  • cg->expired_certs = 1;
  • cg->expired_root = 1;
  • cg->encryption = (http_encryption_t)-1;
  • cg->password_cb = (cups_password_cb2_t)_cupsGetPassword;
  • cg->any_root = 1;
  • cg->expired_certs = 1;
  • cg->expired_root = 1;
  • cg->server_version = 20;

#ifdef DEBUG
/*

Index: cups/cups-private.h

--- cups/cups-private.h (revision 10716)
+++ cups/cups-private.h (working copy)
@@ -92,6 +92,9 @@
int thread_id; /* Friendly thread ID */

endif /* DEBUG */

  • /* dest.c, util.c */
  • int server_version; /* Server IPP version _/

/_ file.c /
cups_file_t *stdio_files[3];/
stdin, stdout, stderr */

Collaborator

michaelrsweet commented Mar 12, 2013

"str4231v2.patch":

Index: cups/ipp.c

--- cups/ipp.c (revision 10811)
+++ cups/ipp.c (working copy)
@@ -3,7 +3,7 @@
*

  • Internet Printing Protocol functions for CUPS.
  • * Copyright 2007-2012 by Apple Inc.
  • * Copyright 2007-2013 by Apple Inc.
  • Copyright 1997-2007 by Easy Software Products, all rights reserved.
  • These coded instructions, statements, and computer programs are the
    @@ -2687,7 +2687,9 @@
    ipp_t * /* O - New IPP message */
    ippNew(void)
    {
  • ipp_t temp; / New IPP message */
  • ipp_t temp; / New IPP message */
  • _cups_globals_t *cg = _cupsGlobals();
  •               /\* Global data */
    

DEBUG_puts("ippNew()");
@@ -2695,11 +2697,11 @@
if ((temp = (ipp_t )calloc(1, sizeof(ipp_t))) != NULL)
{
/

  • * Default to IPP 2.0...
  • * Set default version - usually 2.0...
    */
  • temp->request.any.version[0] = 2;
  • temp->request.any.version[1] = 0;
  • temp->request.any.version[0] = cg->server_version / 10;
  • temp->request.any.version[1] = cg->server_version % 10;
    temp->use = 1;
    }

Index: cups/usersys.c

--- cups/usersys.c (revision 10811)
+++ cups/usersys.c (working copy)
@@ -341,7 +341,8 @@
void
cupsSetServer(const char server) / I - Server name */
{

  • char port; / Pointer to port */
  • char options, / Options */
  •   _port;          /_ Pointer to port _/
    
    _cups_globals_t *cg = cupsGlobals(); / Pointer to library globals */

@@ -349,6 +350,22 @@
{
strlcpy(cg->server, server, sizeof(cg->server));

  • if (cg->server[0] != '/' && (options = strrchr(cg->server, '/')) != NULL)
  • {
  •  *options++ = '\0';
    
  •  if (!strcmp(options, "version=1.0"))
    
  •    cg->server_version = 10;
    
  •  else if (!strcmp(options, "version=1.1"))
    
  •    cg->server_version = 11;
    
  •  else if (!strcmp(options, "version=2.0"))
    
  •    cg->server_version = 20;
    
  •  else if (!strcmp(options, "version=2.1"))
    
  •    cg->server_version = 21;
    
  •  else if (!strcmp(options, "version=2.2"))
    
  •    cg->server_version = 22;
    
  • }

if (cg->server[0] != '/' && (port = strrchr(cg->server, ':')) != NULL &&
!strchr(port, ']') && isdigit(port[1] & 255))
{
@@ -364,8 +381,9 @@
}
else
{

  • cg->server[0] = '\0';
  • cg->servername[0] = '\0';
  • cg->server[0] = '\0';
  • cg->servername[0] = '\0';
  • cg->server_version = 20;
    }

if (cg->http)

Index: cups/globals.c

--- cups/globals.c (revision 10812)
+++ cups/globals.c (working copy)
@@ -3,7 +3,7 @@
*

  • Global variable access routines for CUPS.
  • * Copyright 2007-2012 by Apple Inc.

    • Copyright 2007-2013 by Apple Inc.
    • Copyright 1997-2007 by Easy Software Products, all rights reserved.
    • These coded instructions, statements, and computer programs are the
      @@ -214,11 +214,12 @@
      */

    memset(cg, 0, sizeof(_cups_globals_t));

  • cg->encryption = (http_encryption_t)-1;

  • cg->password_cb = (cups_password_cb2_t)_cupsGetPassword;

  • cg->any_root = 1;

  • cg->expired_certs = 1;

  • cg->expired_root = 1;

  • cg->encryption = (http_encryption_t)-1;

  • cg->password_cb = (cups_password_cb2_t)_cupsGetPassword;

  • cg->any_root = 1;

  • cg->expired_certs = 1;

  • cg->expired_root = 1;

  • cg->server_version = 20;

#ifdef DEBUG
/*

Index: cups/cups-private.h

--- cups/cups-private.h (revision 10812)
+++ cups/cups-private.h (working copy)
@@ -3,7 +3,7 @@
*

  • Private definitions for CUPS.
  • * Copyright 2007-2012 by Apple Inc.
  • * Copyright 2007-2013 by Apple Inc.
    • Copyright 1997-2007 by Easy Software Products, all rights reserved.
    • These coded instructions, statements, and computer programs are the
      @@ -164,7 +164,8 @@
      cups_server_cert_cb_t server_cert_cb; /* Server certificate callback /
      void *server_cert_data;
      /
      Server certificate user data */
  • int any_root, /* Allow any root */
  • int server_version, /* Server IPP version */
  •       any_root,   /\* Allow any root _/
        expired_certs,  /_ Allow expired certs _/
        expired_root;   /_ Allow expired root */
    

michaelrsweet added this to the Stable milestone Mar 17, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment