diff options
author | Ade Lovett <ade@FreeBSD.org> | 2007-10-05 04:53:50 +0000 |
---|---|---|
committer | Ade Lovett <ade@FreeBSD.org> | 2007-10-05 04:53:50 +0000 |
commit | 83507bba65efbc71f8ed2bdf20fa8a896f1f1b96 (patch) | |
tree | 3cd491d6094690b6ec6c5c6e5b0962913eddfa3d /x11/kdelibs3 | |
parent | a31b27122e948f987c4e34040ba606a2ee87db92 (diff) | |
download | ports-83507bba65efbc71f8ed2bdf20fa8a896f1f1b96.tar.gz ports-83507bba65efbc71f8ed2bdf20fa8a896f1f1b96.zip |
Notes
Diffstat (limited to 'x11/kdelibs3')
-rw-r--r-- | x11/kdelibs3/files/patch-kdeprint_cups_cupsdconf2_cups-util.c | 606 |
1 files changed, 606 insertions, 0 deletions
diff --git a/x11/kdelibs3/files/patch-kdeprint_cups_cupsdconf2_cups-util.c b/x11/kdelibs3/files/patch-kdeprint_cups_cupsdconf2_cups-util.c new file mode 100644 index 000000000000..4aaef3b9e766 --- /dev/null +++ b/x11/kdelibs3/files/patch-kdeprint_cups_cupsdconf2_cups-util.c @@ -0,0 +1,606 @@ + --- kdeprint/cups/cupsdconf2/cups-util.c-orig 2007-10-02 21:36:37.442645546 -0500 + +++ kdeprint/cups/cupsdconf2/cups-util.c 2007-10-02 21:42:08.991708625 -0500 + @@ -6,489 +6,118 @@ + #include <sys/stat.h> + #include <unistd.h> + + -#define CUPS_SERVERROOT "/etc/cups" + -static http_t *cups_server; + static ipp_status_t last_error; + -static char authstring[HTTP_MAX_VALUE]; + -static char pwdstring[33]; + -static int cups_local_auth(http_t *http); + + -const char * /* O - Filename for PPD file */ + +const char* cupsGetConf(void); + +int cupsPutConf(const char*); + + + +const char * /* O - Filename for PPD file */ + cupsGetConf(void) + { + - int fd; /* PPD file */ + - int bytes; /* Number of bytes read */ + - char buffer[8192]; /* Buffer for file */ + - char resource[HTTP_MAX_URI]; /* Resource name */ + - const char *password; /* Password string */ + - char realm[HTTP_MAX_VALUE], /* realm="xyz" string */ + - nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */ + - plain[255], /* Plaintext username:password */ + - encode[512]; /* Encoded username:password */ + - http_status_t status; /* HTTP status from server */ + - char prompt[1024]; /* Prompt string */ + - int digest_tries; /* Number of tries with Digest */ + - static char filename[HTTP_MAX_URI]; /* Local filename */ + - + - /* + - * Connect to the correct server as needed... + - */ + - + - if ((cups_server = httpConnectEncrypt(cupsServer(), ippPort(), + - cupsEncryption())) == NULL) + - { + - last_error = IPP_SERVICE_UNAVAILABLE; + - return (NULL); + - } + - + - /* + - * Get a temp file... + - */ + - + - if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) + - { + - /* + - * Can't open file; close the server connection and return NULL... + - */ + - + - httpFlush(cups_server); + - httpClose(cups_server); + - cups_server = NULL; + - return (NULL); + - } + - + - /* + - * And send a request to the HTTP server... + - */ + - + - snprintf(resource, sizeof(resource), "/admin/conf/cupsd.conf"); + - + - digest_tries = 0; + - + - do + - { + - httpClearFields(cups_server); + - httpSetField(cups_server, HTTP_FIELD_HOST, cupsServer()); + - httpSetField(cups_server, HTTP_FIELD_AUTHORIZATION, authstring); + - + - if (httpGet(cups_server, resource)) + - { + - if (httpReconnect(cups_server)) + - { + - status = HTTP_ERROR; + - break; + - } + - else + - { + - status = HTTP_UNAUTHORIZED; + - continue; + - } + - } + - + - while ((status = httpUpdate(cups_server)) == HTTP_CONTINUE); + - + - if (status == HTTP_UNAUTHORIZED) + - { + - fprintf(stderr,"cupsGetConf: unauthorized...\n"); + - + - /* + - * Flush any error message... + - */ + - + - httpFlush(cups_server); + - + - /* + - * See if we can do local authentication... + - */ + - + - if (cups_local_auth(cups_server)) + - continue; + - + - /* + - * See if we should retry the current digest password... + - */ + - + - if (strncmp(cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Basic", 5) == 0 || + - digest_tries > 1 || !pwdstring[0]) + - { + - /* + - * Nope - get a password from the user... + - */ + - + - snprintf(prompt, sizeof(prompt), "Password for %s on %s? ", cupsUser(), + - cups_server->hostname); + - + - if ((password = cupsGetPassword(prompt)) == NULL) + - break; + - if (!password[0]) + - break; + - + - strncpy(pwdstring, password, sizeof(pwdstring) - 1); + - pwdstring[sizeof(pwdstring) - 1] = '\0'; + - + - digest_tries = 0; + - } + - else + - digest_tries ++; + - + - /* + - * Got a password; encode it for the server... + - */ + - + - if (strncmp(cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Basic", 5) == 0) + - { + - /* + - * Basic authentication... + - */ + - + - snprintf(plain, sizeof(plain), "%s:%s", cupsUser(), pwdstring); + -#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2 + - httpEncode64_2(encode, sizeof(encode), plain, sizeof(plain)); + -#else + - httpEncode64(encode, plain); + -#endif + - snprintf(authstring, sizeof(authstring), "Basic %s", encode); + - } + - else + - { + - /* + - * Digest authentication... + - */ + - + - httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm); + - httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce); + - + - httpMD5(cupsUser(), realm, pwdstring, encode); + - httpMD5Final(nonce, "GET", resource, encode); + - snprintf(authstring, sizeof(authstring), + - "Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", " + - "response=\"%s\"", cupsUser(), realm, nonce, encode); + - } + - + - continue; + - } + -#ifdef HAVE_LIBSSL + - else if (status == HTTP_UPGRADE_REQUIRED) + - { + - /* + - * Flush any error message... + - */ + - + - httpFlush(cups_server); + - + - /* + - * Upgrade with encryption... + - */ + - + - httpEncryption(cups_server, HTTP_ENCRYPT_REQUIRED); + - + - /* + - * Try again, this time with encryption enabled... + - */ + - + - continue; + - } + -#endif /* HAVE_LIBSSL */ + - } + - while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED); + - + - /* + - * See if we actually got the file or an error... + - */ + + int fd; /* PPD file */ + + http_status_t status; /* HTTP status from server */ + + http_t *cups_server; + + static char filename[HTTP_MAX_URI]; /* Local filename */ + + char fqdn[ HTTP_MAX_URI ]; /* Server name buffer */ + + + + + + /* + + * Connect to the correct server as needed... + + */ + + + + cups_server = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + if (cups_server == NULL) { + + last_error = IPP_SERVICE_UNAVAILABLE; + + return (NULL); + + } + + + + /* + + * Get a temp file... + + */ + + + + fd = cupsTempFd(filename, sizeof(filename)); + + if (fd < 0) { + + /* + + * Can't open file; close the server connection and return NULL... + + */ + + + + httpFlush(cups_server); + + httpClose(cups_server); + + cups_server = NULL; + + return (NULL); + + } + + + + /* + + * And send a request to the HTTP server... + + */ + + status = cupsGetFd(cups_server, "/admin/conf/cupsd.conf", fd); + + - if (status != HTTP_OK) + - { + close(fd); + - unlink(filename); + httpFlush(cups_server); + httpClose(cups_server); + cups_server = NULL; + - return (NULL); + - } + - + - /* + - * OK, we need to copy the file... + - */ + + - while ((bytes = httpRead(cups_server, buffer, sizeof(buffer))) > 0) + - { + - write(fd, buffer, bytes); + - } + - + - close(fd); + - + - return (filename); + + if (status != HTTP_OK) { + + unlink(filename); + + return (NULL); + + } else { + + return (filename); + + } + } + + -int /* O - Status of operation */ + -cupsPutConf(const char *name) /* I - Name of the config file to send */ + +int /* O - Status of operation */ + +cupsPutConf(const char *name) /* I - Name of the config file to send */ + { + - int fd; /* PPD file */ + - int bytes; /* Number of bytes read */ + - char buffer[8192]; /* Buffer for file */ + - char resource[HTTP_MAX_URI]; /* Resource name */ + - const char *password; /* Password string */ + - char realm[HTTP_MAX_VALUE], /* realm="xyz" string */ + - nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */ + - plain[255], /* Plaintext username:password */ + - encode[512]; /* Encoded username:password */ + - http_status_t status; /* HTTP status from server */ + - char prompt[1024]; /* Prompt string */ + - int digest_tries; /* Number of tries with Digest */ + - + - if (name == NULL) + - return 0; + - + - /* + - * Connect to the correct server as needed... + - */ + - + - if ((cups_server = httpConnectEncrypt(cupsServer(), ippPort(), + - cupsEncryption())) == NULL) + - { + - last_error = IPP_SERVICE_UNAVAILABLE; + - return 0; + - } + + int fd; /* PPD file */ + + http_status_t status; /* HTTP status from server */ + + http_t *cups_server; + + - /* + - * Open the local config file... + - */ + - + - if ((fd = open(name, O_RDONLY)) < 0) + - { + - /* + - * Can't open file; close the server connection and return NULL... + - */ + + if (name == NULL) + + return 0; + + - httpFlush(cups_server); + - httpClose(cups_server); + - cups_server = NULL; + - return 0; + - } + + /* + + * Connect to the correct server as needed... + + */ + + - /* + - * And send a request to the HTTP server... + - */ + - + - strncpy(resource, "/admin/conf/cupsd.conf", sizeof(resource)); + - + - digest_tries = 0; + - + - do + - { + - httpClearFields(cups_server); + - httpSetField(cups_server, HTTP_FIELD_HOST, cupsServer()); + - httpSetField(cups_server, HTTP_FIELD_AUTHORIZATION, authstring); + - httpSetField(cups_server, HTTP_FIELD_TRANSFER_ENCODING, "chunked"); + - + - if (httpPut(cups_server, resource)) + - { + - if (httpReconnect(cups_server)) + - { + - status = HTTP_ERROR; + - break; + - } + - else + - { + - status = HTTP_UNAUTHORIZED; + - continue; + - } + + cups_server = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + if (cups_server == NULL) { + + last_error = IPP_SERVICE_UNAVAILABLE; + + return 0; + } + + - /* send the file now */ + - lseek(fd, 0, SEEK_SET); + - status = HTTP_CONTINUE; + - while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + - if (httpCheck(cups_server)) + - { + - if ((status = httpUpdate(cups_server)) != HTTP_CONTINUE) + - break; + - } + - else + - httpWrite(cups_server, buffer, bytes); + - + - if (status == HTTP_CONTINUE) + - { + - httpWrite(cups_server, buffer, 0); + - while ((status = httpUpdate(cups_server)) == HTTP_CONTINUE); + - } + + /* + + * Open the local config file... + + */ + + - if (status == HTTP_UNAUTHORIZED) + - { + - fprintf(stderr,"cupsPutConf: unauthorized..."); + - + - /* + - * Flush any error message... + - */ + - + - httpFlush(cups_server); + - + - /* + - * See if we can do local authentication... + - */ + - + - if (cups_local_auth(cups_server)) + - continue; + - + - /* + - * See if we should retry the current digest password... + - */ + - + - if (strncmp(cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Basic", 5) == 0 || + - digest_tries > 1 || !pwdstring[0]) + - { + - /* + - * Nope - get a password from the user... + - */ + - + - snprintf(prompt, sizeof(prompt), "Password for %s on %s? ", cupsUser(), + - cups_server->hostname); + - + - if ((password = cupsGetPassword(prompt)) == NULL) + - break; + - if (!password[0]) + - break; + - + - strncpy(pwdstring, password, sizeof(pwdstring) - 1); + - pwdstring[sizeof(pwdstring) - 1] = '\0'; + - + - digest_tries = 0; + - } + - else + - digest_tries ++; + - + - /* + - * Got a password; encode it for the server... + - */ + - + - if (strncmp(cups_server->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Basic", 5) == 0) + - { + - /* + - * Basic authentication... + - */ + - + - snprintf(plain, sizeof(plain), "%s:%s", cupsUser(), pwdstring); + -#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2 + - httpEncode64_2(encode, sizeof(encode), plain, sizeof(plain)); + -#else + - httpEncode64(encode, plain); + -#endif + - snprintf(authstring, sizeof(authstring), "Basic %s", encode); + - } + - else + - { + - /* + - * Digest authentication... + - */ + - + - httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm); + - httpGetSubField(cups_server, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce); + - + - httpMD5(cupsUser(), realm, pwdstring, encode); + - httpMD5Final(nonce, "GET", resource, encode); + - snprintf(authstring, sizeof(authstring), + - "Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", " + - "response=\"%s\"", cupsUser(), realm, nonce, encode); + - } + + fd = open(name, O_RDONLY); + + if (fd < 0) { + + /* + + * Can't open file; close the server connection and return NULL... + + */ + + - continue; + + httpFlush(cups_server); + + httpClose(cups_server); + + cups_server = NULL; + + return 0; + } + -#ifdef HAVE_LIBSSL + - else if (status == HTTP_UPGRADE_REQUIRED) + - { + - /* + - * Flush any error message... + - */ + - + - httpFlush(cups_server); + - + - /* + - * Upgrade with encryption... + - */ + - + - httpEncryption(cups_server, HTTP_ENCRYPT_REQUIRED); + - + - /* + - * Try again, this time with encryption enabled... + - */ + + - continue; + - } + -#endif /* HAVE_LIBSSL */ + - } + - while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED); + - + - /* + - * See if we actually got the file or an error... + - */ + + /* + + * And send a request to the HTTP server... + + */ + + + + status = cupsPutFd(cups_server, "/admin/conf/cupsd.conf", fd); + + - if (status != HTTP_CREATED) + - { + httpFlush(cups_server); + httpClose(cups_server); + cups_server = NULL; + close(fd); + - return 0; + - } + - + - close(fd); + - + - return 1; + -} + - + -static int /* O - 1 if available, 0 if not */ + -cups_local_auth(http_t *http) /* I - Connection */ + -{ + - int pid; /* Current process ID */ + - FILE *fp; /* Certificate file */ + - char filename[1024], /* Certificate filename */ + - certificate[33];/* Certificate string */ + - const char *root; /* Server root directory */ + - + - + - /* + - * See if we are accessing localhost... + - the struct has changed in newer versions - PiggZ (adam@piggz.co.uk) + - */ + -#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR >= 2 + - if (!httpAddrLocalhost(http)) + -#else + - if (ntohl(*(int*)&http->hostaddr.sin_addr) != 0x7f000001 && + - strcasecmp(http->hostname, "localhost") != 0) + -#endif + - return (0); + - + - /* + - * Try opening a certificate file for this PID. If that fails, + - * try the root certificate... + - */ + - + - if ((root = getenv("CUPS_SERVERROOT")) == NULL) + - root = CUPS_SERVERROOT; + - + - pid = getpid(); + - snprintf(filename, sizeof(filename), "%s/certs/%d", root, pid); + - if ((fp = fopen(filename, "r")) == NULL && pid > 0) + - { + - snprintf(filename, sizeof(filename), "%s/certs/0", root); + - fp = fopen(filename, "r"); + - } + - + - if (fp == NULL) + - return (0); + - + - /* + - * Read the certificate from the file... + - */ + - + - fgets(certificate, sizeof(certificate), fp); + - fclose(fp); + - + - /* + - * Set the authorization string and return... + - */ + - + - snprintf(authstring, sizeof(authstring), "Local %s", certificate); + + - return (1); + + /* + + * See if we actually got the file or an error... + + */ + + + + if (status != HTTP_CREATED) + + return 0; + + else + + return 1; + } + + --Boundary-00=_tTyAHs9qWLGFusu + Content-Type: text/x-c++src; + charset="us-ascii"; + name="patch-kdeprint_cups_ipprequest.cpp" + Content-Transfer-Encoding: 7bit + Content-Disposition: attachment; + filename="patch-kdeprint_cups_ipprequest.cpp" + + --- kdeprint/cups/ipprequest.cpp-orig 2007-01-15 05:34:19.000000000 -0600 + +++ kdeprint/cups/ipprequest.cpp 2007-10-02 22:21:52.359893129 -0500 + @@ -310,7 +310,7 @@ + } + + #ifdef HAVE_CUPS_NO_PWD_CACHE + - strncpy( HTTP->authstring, cups_authstring.data(), HTTP_MAX_VALUE ); + + httpSetAuthString( HTTP, NULL, cups_authstring.data() ); + #endif + + if (dump_ > 0) + @@ -320,7 +320,7 @@ + + request_ = cupsDoFileRequest(HTTP, request_, (res.isEmpty() ? "/" : res.latin1()), (filename.isEmpty() ? NULL : filename.latin1())); + #ifdef HAVE_CUPS_NO_PWD_CACHE + - cups_authstring = HTTP->authstring; + + cups_authstring = httpGetAuthString( HTTP ); + #endif + httpClose(HTTP); |