* Replaced all the "centered 99% tables" with 100% width tables wrapped
[citadel.git] / webcit / vcard_edit.c
1 /*
2  * $Id$
3  *
4  * Handles editing of vCard objects.
5  *
6  */
7
8 #include <ctype.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <stdio.h>
12 #include <fcntl.h>
13 #include <signal.h>
14 #include <sys/types.h>
15 #include <sys/wait.h>
16 #include <sys/socket.h>
17 #include <sys/time.h>
18 #include <limits.h>
19 #include <netinet/in.h>
20 #include <netdb.h>
21 #include <string.h>
22 #include <pwd.h>
23 #include <errno.h>
24 #include <stdarg.h>
25 #include <pthread.h>
26 #include <signal.h>
27 #include "webcit.h"
28 #include "vcard.h"
29
30
31 /* Edit the vCard component of a MIME message.  Supply the message number
32  * and MIME part number to fetch.  Or, specify -1 for the message number
33  * to start with a blank card.
34  */
35 void do_edit_vcard(long msgnum, char *partnum, char *return_to) {
36         char buf[SIZ];
37         char *serialized_vcard = NULL;
38         size_t total_len = 0;
39         struct vCard *v;
40         int i;
41         char *key, *value;
42         char whatuser[SIZ];
43
44         char lastname[SIZ];
45         char firstname[SIZ];
46         char middlename[SIZ];
47         char prefix[SIZ];
48         char suffix[SIZ];
49         char pobox[SIZ];
50         char extadr[SIZ];
51         char street[SIZ];
52         char city[SIZ];
53         char state[SIZ];
54         char zipcode[SIZ];
55         char country[SIZ];
56         char hometel[SIZ];
57         char worktel[SIZ];
58         char primary_inetemail[SIZ];
59         char other_inetemail[SIZ];
60         char extrafields[SIZ];
61
62         lastname[0] = 0;
63         firstname[0] = 0;
64         middlename[0] = 0;
65         prefix[0] = 0;
66         suffix[0] = 0;
67         pobox[0] = 0;
68         extadr[0] = 0;
69         street[0] = 0;
70         city[0] = 0;
71         state[0] = 0;
72         zipcode[0] = 0;
73         country[0] = 0;
74         hometel[0] = 0;
75         worktel[0] = 0;
76         primary_inetemail[0] = 0;
77         other_inetemail[0] = 0;
78         extrafields[0] = 0;
79
80         strcpy(whatuser, "");
81
82         if (msgnum >= 0) {
83                 sprintf(buf, "MSG0 %ld|1", msgnum);
84                 serv_puts(buf);
85                 serv_gets(buf);
86                 if (buf[0] != '1') {
87                         convenience_page("770000", "Error", &buf[4]);
88                         return;
89                 }
90                 while (serv_gets(buf), strcmp(buf, "000")) {
91                         if (!strncasecmp(buf, "from=", 5)) {
92                                 strcpy(whatuser, &buf[5]);
93                         }
94                         else if (!strncasecmp(buf, "node=", 5)) {
95                                 strcat(whatuser, " @ ");
96                                 strcat(whatuser, &buf[5]);
97                         }
98                 }
99         
100                 sprintf(buf, "OPNA %ld|%s", msgnum, partnum);
101                 serv_puts(buf);
102                 serv_gets(buf);
103                 if (buf[0] != '2') {
104                         convenience_page("770000", "Error", &buf[4]);
105                         return;
106                 }
107         
108                 total_len = atoi(&buf[4]);
109                 serialized_vcard = malloc(total_len + 1);
110         
111                 read_server_binary(serialized_vcard, total_len);
112         
113                 serv_puts("CLOS");
114                 serv_gets(buf);
115                 serialized_vcard[total_len + 1] = 0;
116         
117                 v = vcard_load(serialized_vcard);
118                 free(serialized_vcard);
119         
120                 /* Populate the variables for our form */
121                 i = 0;
122                 while (key = vcard_get_prop(v, "", 0, i, 1), key != NULL) {
123                         value = vcard_get_prop(v, "", 0, i++, 0);
124         
125                         if (!strcasecmp(key, "n")) {
126                                 extract_token(lastname, value, 0, ';');
127                                 extract_token(firstname, value, 1, ';');
128                                 extract_token(middlename, value, 2, ';');
129                                 extract_token(prefix, value, 3, ';');
130                                 extract_token(suffix, value, 4, ';');
131                         }
132         
133                         else if (!strcasecmp(key, "adr")) {
134                                 extract_token(pobox, value, 0, ';');
135                                 extract_token(extadr, value, 1, ';');
136                                 extract_token(street, value, 2, ';');
137                                 extract_token(city, value, 3, ';');
138                                 extract_token(state, value, 4, ';');
139                                 extract_token(zipcode, value, 5, ';');
140                                 extract_token(country, value, 6, ';');
141                         }
142         
143                         else if (!strcasecmp(key, "tel;home")) {
144                                 extract_token(hometel, value, 0, ';');
145                         }
146         
147                         else if (!strcasecmp(key, "tel;work")) {
148                                 extract_token(worktel, value, 0, ';');
149                         }
150         
151                         else if (!strcasecmp(key, "email;internet")) {
152                                 if (primary_inetemail[0] == 0) {
153                                         strcpy(primary_inetemail, value);
154                                 }
155                                 else {
156                                         if (other_inetemail[0] != 0) {
157                                                 strcat(other_inetemail, "\n");
158                                         }
159                                         strcat(other_inetemail, value);
160                                 }
161                         }
162         
163                         else {
164                                 strcat(extrafields, key);
165                                 strcat(extrafields, ":");
166                                 strcat(extrafields, value);
167                                 strcat(extrafields, "\n");
168                         }
169         
170                 }
171         
172                 vcard_free(v);
173         }
174
175         /* Display the form */
176         output_headers(1, 1, 2, 0, 0, 0, 0);
177         wprintf("<div id=\"banner\">\n"
178                 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
179                 "<SPAN CLASS=\"titlebar\">"
180                 "<img src=\"/static/vcard.gif\">"
181                 "Contact information for "
182         );
183         escputs(whatuser);
184         wprintf("</SPAN>"
185                 "</TD></TR></TABLE>\n"
186                 "</div>\n<div id=\"content\">\n"
187         );
188
189         wprintf("<FORM METHOD=\"POST\" ACTION=\"/submit_vcard\">\n");
190         wprintf("<div style=\"margin-right:1px\">"
191                 "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
192
193         wprintf("<TABLE border=0><TR>"
194                 "<TD>Prefix</TD>"
195                 "<TD>First</TD>"
196                 "<TD>Middle</TD>"
197                 "<TD>Last</TD>"
198                 "<TD>Suffix</TD></TR>\n");
199         wprintf("<TR><TD><INPUT TYPE=\"text\" NAME=\"prefix\" "
200                 "VALUE=\"%s\" MAXLENGTH=\"5\"></TD>",
201                 prefix);
202         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"firstname\" "
203                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
204                 firstname);
205         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"middlename\" "
206                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
207                 middlename);
208         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"lastname\" "
209                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
210                 lastname);
211         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"suffix\" "
212                 "VALUE=\"%s\" MAXLENGTH=\"10\"></TD></TR></TABLE>\n",
213                 suffix);
214
215         wprintf("<TABLE border=0><TR><TD>PO box (optional):</TD>"
216                 "<TD><INPUT TYPE=\"text\" NAME=\"pobox\" "
217                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
218                 pobox);
219         wprintf("<TR><TD>Address line 1:</TD>"
220                 "<TD><INPUT TYPE=\"text\" NAME=\"extadr\" "
221                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
222                 extadr);
223         wprintf("<TR><TD>Address line 2:</TD>"
224                 "<TD><INPUT TYPE=\"text\" NAME=\"street\" "
225                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
226                 street);
227         wprintf("<TR><TD>City:</TD>"
228                 "<TD><INPUT TYPE=\"text\" NAME=\"city\" "
229                 "VALUE=\"%s\" MAXLENGTH=\"29\">\n",
230                 city);
231         wprintf(" State: "
232                 "<INPUT TYPE=\"text\" NAME=\"state\" "
233                 "VALUE=\"%s\" MAXLENGTH=\"2\">\n",
234                 state);
235         wprintf(" ZIP code: "
236                 "<INPUT TYPE=\"text\" NAME=\"zipcode\" "
237                 "VALUE=\"%s\" MAXLENGTH=\"10\"></TD></TR>\n",
238                 zipcode);
239         wprintf("<TR><TD>Country:</TD>"
240                 "<TD><INPUT TYPE=\"text\" NAME=\"country\" "
241                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
242                 country);
243
244         wprintf("<TABLE BORDER=0><TR><TD>Home telephone:</TD>"
245                 "<TD><INPUT TYPE=\"text\" NAME=\"hometel\" "
246                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
247                 hometel);
248         wprintf("<TR><TD>Work telephone:</TD>"
249                 "<TD><INPUT TYPE=\"text\" NAME=\"worktel\" "
250                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
251                 worktel);
252
253         wprintf("<br /><TABLE border=0><TR>"
254                 "<TD VALIGN=TOP>Primary Internet e-mail address<br />"
255                 "<INPUT TYPE=\"text\" NAME=\"primary_inetemail\" "
256                 "SIZE=40 MAXLENGTH=40 VALUE=\"");
257         escputs(primary_inetemail);
258         wprintf("\"><br />"
259                 "</TD><TD VALIGN=TOP>"
260                 "Internet e-mail aliases<br />"
261                 "<TEXTAREA NAME=\"other_inetemail\" ROWS=5 COLS=40 WIDTH=40>");
262         escputs(other_inetemail);
263         wprintf("</TEXTAREA></TD></TR></TABLE><br />\n");
264
265         wprintf("<INPUT TYPE=\"hidden\" NAME=\"extrafields\" VALUE=\"");
266         escputs(extrafields);
267         wprintf("\">\n");
268
269         wprintf("<INPUT TYPE=\"hidden\" NAME=\"return_to\" VALUE=\"");
270         urlescputs(return_to);
271         wprintf("\">\n");
272
273         wprintf("<CENTER>\n"
274                 "<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">"
275                 "&nbsp;"
276                 "<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">"
277                 "</CENTER></FORM>\n"
278         );
279         
280         wprintf("</td></tr></table></div>\n");
281         wDumpContent(1);
282 }
283
284
285
286 void edit_vcard(void) {
287         long msgnum;
288         char *partnum;
289
290         msgnum = atol(bstr("msgnum"));
291         partnum = bstr("partnum");
292         do_edit_vcard(msgnum, partnum, "");
293 }
294
295
296
297
298 void submit_vcard(void) {
299         char buf[SIZ];
300         int i;
301
302         if (strcmp(bstr("sc"), "OK")) { 
303                 readloop("readnew");
304                 return;
305         }
306
307         sprintf(buf, "ENT0 1|||4||");
308         serv_puts(buf);
309         serv_gets(buf);
310         if (buf[0] != '4') {
311                 edit_vcard();
312                 return;
313         }
314
315         serv_puts("Content-type: text/x-vcard");
316         serv_puts("");
317         serv_puts("begin:vcard");
318         serv_printf("n:%s;%s;%s;%s;%s",
319                 bstr("lastname"),
320                 bstr("firstname"),
321                 bstr("middlename"),
322                 bstr("prefix"),
323                 bstr("suffix") );
324         serv_printf("adr:%s;%s;%s;%s;%s;%s;%s",
325                 bstr("pobox"),
326                 bstr("extadr"),
327                 bstr("street"),
328                 bstr("city"),
329                 bstr("state"),
330                 bstr("zipcode"),
331                 bstr("country") );
332         serv_printf("tel;home:%s", bstr("hometel") );
333         serv_printf("tel;work:%s", bstr("worktel") );
334
335         serv_printf("email;internet:%s\n", bstr("primary_inetemail"));  
336         for (i=0; i<num_tokens(bstr("other_inetemail"), '\n'); ++i) {
337                 extract_token(buf, bstr("other_inetemail"), i, '\n');
338                 if (strlen(buf) > 0) {
339                         serv_printf("email;internet:%s", buf);
340                 }
341         }
342
343         serv_printf("%s", bstr("extrafields") );
344         serv_puts("end:vcard");
345         serv_puts("000");
346
347         if (!strcmp(bstr("return_to"), "/select_user_to_edit")) {
348                 select_user_to_edit(NULL, NULL);
349         }
350         else if (!strcmp(bstr("return_to"), "/do_welcome")) {
351                 do_welcome();
352         }
353         else {
354                 readloop("readnew");
355         }
356 }