| /* | |
| * HTML support functions for CUPS. | |
| * | |
| * Copyright 2007-2011 by Apple Inc. | |
| * Copyright 1997-2006 by Easy Software Products. | |
| * | |
| * Licensed under Apache License v2.0. See the file "LICENSE" for more information. | |
| */ | |
| /* | |
| * Include necessary headers... | |
| */ | |
| #include "cgi-private.h" | |
| /* | |
| * Local globals... | |
| */ | |
| static const char *cgi_multipart = NULL; | |
| /* Multipart separator, if any */ | |
| /* | |
| * Local functions... | |
| */ | |
| static const char *cgi_null_passwd(const char *prompt); | |
| /* | |
| * 'cgiEndHTML()' - End a HTML page. | |
| */ | |
| void | |
| cgiEndHTML(void) | |
| { | |
| /* | |
| * Send the standard trailer... | |
| */ | |
| cgiCopyTemplateLang("trailer.tmpl"); | |
| } | |
| /* | |
| * 'cgiEndMultipart()' - End the delivery of a multipart web page. | |
| */ | |
| void | |
| cgiEndMultipart(void) | |
| { | |
| if (cgi_multipart) | |
| { | |
| printf("\n%s--\n", cgi_multipart); | |
| fflush(stdout); | |
| } | |
| } | |
| /* | |
| * 'cgiFormEncode()' - Encode a string as a form variable. | |
| */ | |
| char * /* O - Destination string */ | |
| cgiFormEncode(char *dst, /* I - Destination string */ | |
| const char *src, /* I - Source string */ | |
| size_t dstsize) /* I - Size of destination string */ | |
| { | |
| char *dstptr, /* Pointer into destination */ | |
| *dstend; /* End of destination */ | |
| static const char *hex = /* Hexadecimal characters */ | |
| "0123456789ABCDEF"; | |
| /* | |
| * Mark the end of the string... | |
| */ | |
| dstend = dst + dstsize - 1; | |
| /* | |
| * Loop through the source string and copy... | |
| */ | |
| for (dstptr = dst; *src && dstptr < dstend;) | |
| { | |
| switch (*src) | |
| { | |
| case ' ' : | |
| /* | |
| * Encode spaces with a "+"... | |
| */ | |
| *dstptr++ = '+'; | |
| src ++; | |
| break; | |
| case '&' : | |
| case '%' : | |
| case '+' : | |
| /* | |
| * Encode special characters with %XX escape... | |
| */ | |
| if (dstptr < (dstend - 2)) | |
| { | |
| *dstptr++ = '%'; | |
| *dstptr++ = hex[(*src & 255) >> 4]; | |
| *dstptr++ = hex[*src & 15]; | |
| src ++; | |
| } | |
| break; | |
| default : | |
| /* | |
| * Copy other characters literally... | |
| */ | |
| *dstptr++ = *src++; | |
| break; | |
| } | |
| } | |
| /* | |
| * Nul-terminate the destination string... | |
| */ | |
| *dstptr = '\0'; | |
| /* | |
| * Return the encoded string... | |
| */ | |
| return (dst); | |
| } | |
| /* | |
| * 'cgiStartHTML()' - Start a HTML page. | |
| */ | |
| void | |
| cgiStartHTML(const char *title) /* I - Title of page */ | |
| { | |
| /* | |
| * Disable any further authentication attempts... | |
| */ | |
| cupsSetPasswordCB(cgi_null_passwd); | |
| /* | |
| * Tell the client to expect UTF-8 encoded HTML... | |
| */ | |
| if (cgi_multipart) | |
| puts(cgi_multipart); | |
| puts("Content-Type: text/html;charset=utf-8\n"); | |
| /* | |
| * Send a standard header... | |
| */ | |
| cgiSetVariable("TITLE", title); | |
| cgiSetServerVersion(); | |
| cgiCopyTemplateLang("header.tmpl"); | |
| } | |
| /* | |
| * 'cgiStartMultipart()' - Start a multipart delivery of a web page. | |
| */ | |
| void | |
| cgiStartMultipart(void) | |
| { | |
| puts("MIME-Version: 1.0\n" | |
| "Content-Type: multipart/x-mixed-replace; boundary=\"CUPS-MULTIPART\"\n"); | |
| fflush(stdout); | |
| cgi_multipart = "--CUPS-MULTIPART"; | |
| } | |
| /* | |
| * 'cgiSupportsMultipart()' - Does the browser support multi-part documents? | |
| */ | |
| int /* O - 1 if multi-part supported, 0 otherwise */ | |
| cgiSupportsMultipart(void) | |
| { | |
| /* | |
| * Too many bug reports for browsers that don't support it, and too much pain | |
| * to whitelist known-good browsers, so for now we just punt on multi-part | |
| * support... :( | |
| */ | |
| return (0); | |
| } | |
| /* | |
| * 'cgi_null_passwd()' - Return a NULL password for authentication. | |
| */ | |
| static const char * /* O - NULL */ | |
| cgi_null_passwd(const char *prompt) /* I - Prompt string (unused) */ | |
| { | |
| (void)prompt; | |
| fprintf(stderr, "DEBUG: cgi_null_passwd(prompt=\"%s\") called!\n", | |
| prompt ? prompt : "(null)"); | |
| return (NULL); | |
| } |