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