1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * HTML support functions for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2011 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 1997-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker */
9*5e7646d2SAndroid Build Coastguard Worker
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker */
13*5e7646d2SAndroid Build Coastguard Worker
14*5e7646d2SAndroid Build Coastguard Worker #include "cgi-private.h"
15*5e7646d2SAndroid Build Coastguard Worker
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker * Local globals...
19*5e7646d2SAndroid Build Coastguard Worker */
20*5e7646d2SAndroid Build Coastguard Worker
21*5e7646d2SAndroid Build Coastguard Worker static const char *cgi_multipart = NULL;
22*5e7646d2SAndroid Build Coastguard Worker /* Multipart separator, if any */
23*5e7646d2SAndroid Build Coastguard Worker
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker /*
26*5e7646d2SAndroid Build Coastguard Worker * Local functions...
27*5e7646d2SAndroid Build Coastguard Worker */
28*5e7646d2SAndroid Build Coastguard Worker
29*5e7646d2SAndroid Build Coastguard Worker static const char *cgi_null_passwd(const char *prompt);
30*5e7646d2SAndroid Build Coastguard Worker
31*5e7646d2SAndroid Build Coastguard Worker
32*5e7646d2SAndroid Build Coastguard Worker /*
33*5e7646d2SAndroid Build Coastguard Worker * 'cgiEndHTML()' - End a HTML page.
34*5e7646d2SAndroid Build Coastguard Worker */
35*5e7646d2SAndroid Build Coastguard Worker
36*5e7646d2SAndroid Build Coastguard Worker void
cgiEndHTML(void)37*5e7646d2SAndroid Build Coastguard Worker cgiEndHTML(void)
38*5e7646d2SAndroid Build Coastguard Worker {
39*5e7646d2SAndroid Build Coastguard Worker /*
40*5e7646d2SAndroid Build Coastguard Worker * Send the standard trailer...
41*5e7646d2SAndroid Build Coastguard Worker */
42*5e7646d2SAndroid Build Coastguard Worker
43*5e7646d2SAndroid Build Coastguard Worker cgiCopyTemplateLang("trailer.tmpl");
44*5e7646d2SAndroid Build Coastguard Worker }
45*5e7646d2SAndroid Build Coastguard Worker
46*5e7646d2SAndroid Build Coastguard Worker
47*5e7646d2SAndroid Build Coastguard Worker /*
48*5e7646d2SAndroid Build Coastguard Worker * 'cgiEndMultipart()' - End the delivery of a multipart web page.
49*5e7646d2SAndroid Build Coastguard Worker */
50*5e7646d2SAndroid Build Coastguard Worker
51*5e7646d2SAndroid Build Coastguard Worker void
cgiEndMultipart(void)52*5e7646d2SAndroid Build Coastguard Worker cgiEndMultipart(void)
53*5e7646d2SAndroid Build Coastguard Worker {
54*5e7646d2SAndroid Build Coastguard Worker if (cgi_multipart)
55*5e7646d2SAndroid Build Coastguard Worker {
56*5e7646d2SAndroid Build Coastguard Worker printf("\n%s--\n", cgi_multipart);
57*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
58*5e7646d2SAndroid Build Coastguard Worker }
59*5e7646d2SAndroid Build Coastguard Worker }
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker
62*5e7646d2SAndroid Build Coastguard Worker /*
63*5e7646d2SAndroid Build Coastguard Worker * 'cgiFormEncode()' - Encode a string as a form variable.
64*5e7646d2SAndroid Build Coastguard Worker */
65*5e7646d2SAndroid Build Coastguard Worker
66*5e7646d2SAndroid Build Coastguard Worker char * /* O - Destination string */
cgiFormEncode(char * dst,const char * src,size_t dstsize)67*5e7646d2SAndroid Build Coastguard Worker cgiFormEncode(char *dst, /* I - Destination string */
68*5e7646d2SAndroid Build Coastguard Worker const char *src, /* I - Source string */
69*5e7646d2SAndroid Build Coastguard Worker size_t dstsize) /* I - Size of destination string */
70*5e7646d2SAndroid Build Coastguard Worker {
71*5e7646d2SAndroid Build Coastguard Worker char *dstptr, /* Pointer into destination */
72*5e7646d2SAndroid Build Coastguard Worker *dstend; /* End of destination */
73*5e7646d2SAndroid Build Coastguard Worker static const char *hex = /* Hexadecimal characters */
74*5e7646d2SAndroid Build Coastguard Worker "0123456789ABCDEF";
75*5e7646d2SAndroid Build Coastguard Worker
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker /*
78*5e7646d2SAndroid Build Coastguard Worker * Mark the end of the string...
79*5e7646d2SAndroid Build Coastguard Worker */
80*5e7646d2SAndroid Build Coastguard Worker
81*5e7646d2SAndroid Build Coastguard Worker dstend = dst + dstsize - 1;
82*5e7646d2SAndroid Build Coastguard Worker
83*5e7646d2SAndroid Build Coastguard Worker /*
84*5e7646d2SAndroid Build Coastguard Worker * Loop through the source string and copy...
85*5e7646d2SAndroid Build Coastguard Worker */
86*5e7646d2SAndroid Build Coastguard Worker
87*5e7646d2SAndroid Build Coastguard Worker for (dstptr = dst; *src && dstptr < dstend;)
88*5e7646d2SAndroid Build Coastguard Worker {
89*5e7646d2SAndroid Build Coastguard Worker switch (*src)
90*5e7646d2SAndroid Build Coastguard Worker {
91*5e7646d2SAndroid Build Coastguard Worker case ' ' :
92*5e7646d2SAndroid Build Coastguard Worker /*
93*5e7646d2SAndroid Build Coastguard Worker * Encode spaces with a "+"...
94*5e7646d2SAndroid Build Coastguard Worker */
95*5e7646d2SAndroid Build Coastguard Worker
96*5e7646d2SAndroid Build Coastguard Worker *dstptr++ = '+';
97*5e7646d2SAndroid Build Coastguard Worker src ++;
98*5e7646d2SAndroid Build Coastguard Worker break;
99*5e7646d2SAndroid Build Coastguard Worker
100*5e7646d2SAndroid Build Coastguard Worker case '&' :
101*5e7646d2SAndroid Build Coastguard Worker case '%' :
102*5e7646d2SAndroid Build Coastguard Worker case '+' :
103*5e7646d2SAndroid Build Coastguard Worker /*
104*5e7646d2SAndroid Build Coastguard Worker * Encode special characters with %XX escape...
105*5e7646d2SAndroid Build Coastguard Worker */
106*5e7646d2SAndroid Build Coastguard Worker
107*5e7646d2SAndroid Build Coastguard Worker if (dstptr < (dstend - 2))
108*5e7646d2SAndroid Build Coastguard Worker {
109*5e7646d2SAndroid Build Coastguard Worker *dstptr++ = '%';
110*5e7646d2SAndroid Build Coastguard Worker *dstptr++ = hex[(*src & 255) >> 4];
111*5e7646d2SAndroid Build Coastguard Worker *dstptr++ = hex[*src & 15];
112*5e7646d2SAndroid Build Coastguard Worker src ++;
113*5e7646d2SAndroid Build Coastguard Worker }
114*5e7646d2SAndroid Build Coastguard Worker break;
115*5e7646d2SAndroid Build Coastguard Worker
116*5e7646d2SAndroid Build Coastguard Worker default :
117*5e7646d2SAndroid Build Coastguard Worker /*
118*5e7646d2SAndroid Build Coastguard Worker * Copy other characters literally...
119*5e7646d2SAndroid Build Coastguard Worker */
120*5e7646d2SAndroid Build Coastguard Worker
121*5e7646d2SAndroid Build Coastguard Worker *dstptr++ = *src++;
122*5e7646d2SAndroid Build Coastguard Worker break;
123*5e7646d2SAndroid Build Coastguard Worker }
124*5e7646d2SAndroid Build Coastguard Worker }
125*5e7646d2SAndroid Build Coastguard Worker
126*5e7646d2SAndroid Build Coastguard Worker /*
127*5e7646d2SAndroid Build Coastguard Worker * Nul-terminate the destination string...
128*5e7646d2SAndroid Build Coastguard Worker */
129*5e7646d2SAndroid Build Coastguard Worker
130*5e7646d2SAndroid Build Coastguard Worker *dstptr = '\0';
131*5e7646d2SAndroid Build Coastguard Worker
132*5e7646d2SAndroid Build Coastguard Worker /*
133*5e7646d2SAndroid Build Coastguard Worker * Return the encoded string...
134*5e7646d2SAndroid Build Coastguard Worker */
135*5e7646d2SAndroid Build Coastguard Worker
136*5e7646d2SAndroid Build Coastguard Worker return (dst);
137*5e7646d2SAndroid Build Coastguard Worker }
138*5e7646d2SAndroid Build Coastguard Worker
139*5e7646d2SAndroid Build Coastguard Worker
140*5e7646d2SAndroid Build Coastguard Worker /*
141*5e7646d2SAndroid Build Coastguard Worker * 'cgiStartHTML()' - Start a HTML page.
142*5e7646d2SAndroid Build Coastguard Worker */
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker void
cgiStartHTML(const char * title)145*5e7646d2SAndroid Build Coastguard Worker cgiStartHTML(const char *title) /* I - Title of page */
146*5e7646d2SAndroid Build Coastguard Worker {
147*5e7646d2SAndroid Build Coastguard Worker /*
148*5e7646d2SAndroid Build Coastguard Worker * Disable any further authentication attempts...
149*5e7646d2SAndroid Build Coastguard Worker */
150*5e7646d2SAndroid Build Coastguard Worker
151*5e7646d2SAndroid Build Coastguard Worker cupsSetPasswordCB(cgi_null_passwd);
152*5e7646d2SAndroid Build Coastguard Worker
153*5e7646d2SAndroid Build Coastguard Worker /*
154*5e7646d2SAndroid Build Coastguard Worker * Tell the client to expect UTF-8 encoded HTML...
155*5e7646d2SAndroid Build Coastguard Worker */
156*5e7646d2SAndroid Build Coastguard Worker
157*5e7646d2SAndroid Build Coastguard Worker if (cgi_multipart)
158*5e7646d2SAndroid Build Coastguard Worker puts(cgi_multipart);
159*5e7646d2SAndroid Build Coastguard Worker
160*5e7646d2SAndroid Build Coastguard Worker puts("Content-Type: text/html;charset=utf-8\n");
161*5e7646d2SAndroid Build Coastguard Worker
162*5e7646d2SAndroid Build Coastguard Worker /*
163*5e7646d2SAndroid Build Coastguard Worker * Send a standard header...
164*5e7646d2SAndroid Build Coastguard Worker */
165*5e7646d2SAndroid Build Coastguard Worker
166*5e7646d2SAndroid Build Coastguard Worker cgiSetVariable("TITLE", title);
167*5e7646d2SAndroid Build Coastguard Worker cgiSetServerVersion();
168*5e7646d2SAndroid Build Coastguard Worker
169*5e7646d2SAndroid Build Coastguard Worker cgiCopyTemplateLang("header.tmpl");
170*5e7646d2SAndroid Build Coastguard Worker }
171*5e7646d2SAndroid Build Coastguard Worker
172*5e7646d2SAndroid Build Coastguard Worker
173*5e7646d2SAndroid Build Coastguard Worker /*
174*5e7646d2SAndroid Build Coastguard Worker * 'cgiStartMultipart()' - Start a multipart delivery of a web page.
175*5e7646d2SAndroid Build Coastguard Worker */
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker void
cgiStartMultipart(void)178*5e7646d2SAndroid Build Coastguard Worker cgiStartMultipart(void)
179*5e7646d2SAndroid Build Coastguard Worker {
180*5e7646d2SAndroid Build Coastguard Worker puts("MIME-Version: 1.0\n"
181*5e7646d2SAndroid Build Coastguard Worker "Content-Type: multipart/x-mixed-replace; boundary=\"CUPS-MULTIPART\"\n");
182*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
183*5e7646d2SAndroid Build Coastguard Worker
184*5e7646d2SAndroid Build Coastguard Worker cgi_multipart = "--CUPS-MULTIPART";
185*5e7646d2SAndroid Build Coastguard Worker }
186*5e7646d2SAndroid Build Coastguard Worker
187*5e7646d2SAndroid Build Coastguard Worker
188*5e7646d2SAndroid Build Coastguard Worker /*
189*5e7646d2SAndroid Build Coastguard Worker * 'cgiSupportsMultipart()' - Does the browser support multi-part documents?
190*5e7646d2SAndroid Build Coastguard Worker */
191*5e7646d2SAndroid Build Coastguard Worker
192*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 if multi-part supported, 0 otherwise */
cgiSupportsMultipart(void)193*5e7646d2SAndroid Build Coastguard Worker cgiSupportsMultipart(void)
194*5e7646d2SAndroid Build Coastguard Worker {
195*5e7646d2SAndroid Build Coastguard Worker /*
196*5e7646d2SAndroid Build Coastguard Worker * Too many bug reports for browsers that don't support it, and too much pain
197*5e7646d2SAndroid Build Coastguard Worker * to whitelist known-good browsers, so for now we just punt on multi-part
198*5e7646d2SAndroid Build Coastguard Worker * support... :(
199*5e7646d2SAndroid Build Coastguard Worker */
200*5e7646d2SAndroid Build Coastguard Worker
201*5e7646d2SAndroid Build Coastguard Worker return (0);
202*5e7646d2SAndroid Build Coastguard Worker }
203*5e7646d2SAndroid Build Coastguard Worker
204*5e7646d2SAndroid Build Coastguard Worker
205*5e7646d2SAndroid Build Coastguard Worker /*
206*5e7646d2SAndroid Build Coastguard Worker * 'cgi_null_passwd()' - Return a NULL password for authentication.
207*5e7646d2SAndroid Build Coastguard Worker */
208*5e7646d2SAndroid Build Coastguard Worker
209*5e7646d2SAndroid Build Coastguard Worker static const char * /* O - NULL */
cgi_null_passwd(const char * prompt)210*5e7646d2SAndroid Build Coastguard Worker cgi_null_passwd(const char *prompt) /* I - Prompt string (unused) */
211*5e7646d2SAndroid Build Coastguard Worker {
212*5e7646d2SAndroid Build Coastguard Worker (void)prompt;
213*5e7646d2SAndroid Build Coastguard Worker
214*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "DEBUG: cgi_null_passwd(prompt=\"%s\") called!\n",
215*5e7646d2SAndroid Build Coastguard Worker prompt ? prompt : "(null)");
216*5e7646d2SAndroid Build Coastguard Worker
217*5e7646d2SAndroid Build Coastguard Worker return (NULL);
218*5e7646d2SAndroid Build Coastguard Worker }
219