xref: /aosp_15_r20/external/libcups/cgi-bin/html.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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