/* * 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); }