* Clicking "Enter Message" in a room with an Address Book view opens
[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 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         inetemail[0] = 0;
77         extrafields[0] = 0;
78
79         output_headers(3);
80
81         strcpy(whatuser, "");
82
83         if (msgnum >= 0) {
84                 sprintf(buf, "MSG0 %ld|1", msgnum);
85                 serv_puts(buf);
86                 serv_gets(buf);
87                 if (buf[0] != '1') {
88                         wDumpContent(1);
89                         return;
90                 }
91                 while (serv_gets(buf), strcmp(buf, "000")) {
92                         if (!strncasecmp(buf, "from=", 5)) {
93                                 strcpy(whatuser, &buf[5]);
94                         }
95                         else if (!strncasecmp(buf, "node=", 5)) {
96                                 strcat(whatuser, " @ ");
97                                 strcat(whatuser, &buf[5]);
98                         }
99                 }
100         
101                 sprintf(buf, "OPNA %ld|%s", msgnum, partnum);
102                 serv_puts(buf);
103                 serv_gets(buf);
104                 if (buf[0] != '2') {
105                         wDumpContent(1);
106                         return;
107                 }
108         
109                 total_len = atoi(&buf[4]);
110                 serialized_vcard = malloc(total_len + 1);
111         
112                 read_server_binary(serialized_vcard, total_len);
113         
114                 serv_puts("CLOS");
115                 serv_gets(buf);
116                 serialized_vcard[total_len + 1] = 0;
117         
118                 v = vcard_load(serialized_vcard);
119                 free(serialized_vcard);
120         
121                 /* Populate the variables for our form */
122                 i = 0;
123                 while (key = vcard_get_prop(v, "", 0, i, 1), key != NULL) {
124                         value = vcard_get_prop(v, "", 0, i++, 0);
125         
126                         if (!strcasecmp(key, "n")) {
127                                 extract_token(lastname, value, 0, ';');
128                                 extract_token(firstname, value, 1, ';');
129                                 extract_token(middlename, value, 2, ';');
130                                 extract_token(prefix, value, 3, ';');
131                                 extract_token(suffix, value, 4, ';');
132                         }
133         
134                         else if (!strcasecmp(key, "adr")) {
135                                 extract_token(pobox, value, 0, ';');
136                                 extract_token(extadr, value, 1, ';');
137                                 extract_token(street, value, 2, ';');
138                                 extract_token(city, value, 3, ';');
139                                 extract_token(state, value, 4, ';');
140                                 extract_token(zipcode, value, 5, ';');
141                                 extract_token(country, value, 6, ';');
142                         }
143         
144                         else if (!strcasecmp(key, "tel;home")) {
145                                 extract_token(hometel, value, 0, ';');
146                         }
147         
148                         else if (!strcasecmp(key, "tel;work")) {
149                                 extract_token(worktel, value, 0, ';');
150                         }
151         
152                         else if (!strcasecmp(key, "email;internet")) {
153                                 if (inetemail[0] != 0) {
154                                         strcat(inetemail, "\n");
155                                 }
156                                 strcat(inetemail, value);
157                         }
158         
159                         else {
160                                 strcat(extrafields, key);
161                                 strcat(extrafields, ":");
162                                 strcat(extrafields, value);
163                                 strcat(extrafields, "\n");
164                         }
165         
166                 }
167         
168                 vcard_free(v);
169         }
170
171         /* Display the form */
172         do_template("beginbox_nt");
173         wprintf("<FORM METHOD=\"POST\" ACTION=\"/submit_vcard\">\n");
174         wprintf("<H2><IMG ALIGN=CENTER SRC=\"/static/vcard.gif\">"
175                 "Contact information for ");
176         escputs(whatuser);
177         wprintf("</H2>\n");
178
179         wprintf("<TABLE border=0><TR>"
180                 "<TD>Prefix</TD>"
181                 "<TD>First</TD>"
182                 "<TD>Middle</TD>"
183                 "<TD>Last</TD>"
184                 "<TD>Suffix</TD></TR>\n");
185         wprintf("<TR><TD><INPUT TYPE=\"text\" NAME=\"prefix\" "
186                 "VALUE=\"%s\" MAXLENGTH=\"5\"></TD>",
187                 prefix);
188         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"firstname\" "
189                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
190                 firstname);
191         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"middlename\" "
192                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
193                 middlename);
194         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"lastname\" "
195                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
196                 lastname);
197         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"suffix\" "
198                 "VALUE=\"%s\" MAXLENGTH=\"10\"></TD></TR></TABLE>\n",
199                 suffix);
200
201         wprintf("<TABLE border=0><TR><TD>PO box (optional):</TD>"
202                 "<TD><INPUT TYPE=\"text\" NAME=\"pobox\" "
203                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
204                 pobox);
205         wprintf("<TR><TD>Address line 1:</TD>"
206                 "<TD><INPUT TYPE=\"text\" NAME=\"extadr\" "
207                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
208                 extadr);
209         wprintf("<TR><TD>Address line 2:</TD>"
210                 "<TD><INPUT TYPE=\"text\" NAME=\"street\" "
211                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
212                 street);
213         wprintf("<TR><TD>City:</TD>"
214                 "<TD><INPUT TYPE=\"text\" NAME=\"city\" "
215                 "VALUE=\"%s\" MAXLENGTH=\"29\">\n",
216                 city);
217         wprintf(" State: "
218                 "<INPUT TYPE=\"text\" NAME=\"state\" "
219                 "VALUE=\"%s\" MAXLENGTH=\"2\">\n",
220                 state);
221         wprintf(" ZIP code: "
222                 "<INPUT TYPE=\"text\" NAME=\"zipcode\" "
223                 "VALUE=\"%s\" MAXLENGTH=\"10\"></TD></TR>\n",
224                 zipcode);
225         wprintf("<TR><TD>Country:</TD>"
226                 "<TD><INPUT TYPE=\"text\" NAME=\"country\" "
227                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
228                 country);
229
230         wprintf("<TABLE BORDER=0><TR><TD>Home telephone:</TD>"
231                 "<TD><INPUT TYPE=\"text\" NAME=\"hometel\" "
232                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
233                 hometel);
234         wprintf("<TR><TD>Work telephone:</TD>"
235                 "<TD><INPUT TYPE=\"text\" NAME=\"worktel\" "
236                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
237                 worktel);
238
239         wprintf("<TABLE border=0><TR><TD>Internet e-mail addresses:<BR>"
240                 "<FONT size=-2>For addresses in the Citadel directory, "
241                 "the topmost address will be used in outgoing mail."
242                 "</FONT></TD><TD>"
243                 "<TEXTAREA NAME=\"inetemail\" ROWS=5 COLS=40 WIDTH=40>");
244         escputs(inetemail);
245         wprintf("</TEXTAREA></TD></TR></TABLE><BR>\n");
246
247         wprintf("<INPUT TYPE=\"hidden\" NAME=\"extrafields\" VALUE=\"");
248         escputs(extrafields);
249         wprintf("\">\n");
250
251         wprintf("<INPUT TYPE=\"hidden\" NAME=\"return_to\" VALUE=\"");
252         urlescputs(return_to);
253         wprintf("\">\n");
254
255         wprintf("<CENTER>\n"
256                 "<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">"
257                 "&nbsp;"
258                 "<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">"
259                 "</CENTER></FORM>\n"
260         );
261         
262         do_template("endbox");
263         wDumpContent(1);
264 }
265
266
267
268 void edit_vcard(void) {
269         long msgnum;
270         char *partnum;
271
272         msgnum = atol(bstr("msgnum"));
273         partnum = bstr("partnum");
274         do_edit_vcard(msgnum, partnum, "");
275 }
276
277
278
279
280 void submit_vcard(void) {
281         char buf[SIZ];
282         int i;
283
284         if (strcmp(bstr("sc"), "OK")) { 
285                 readloop("readnew");
286                 return;
287         }
288
289         sprintf(buf, "ENT0 1|||4||");
290         serv_puts(buf);
291         serv_gets(buf);
292         if (buf[0] != '4') {
293                 edit_vcard();
294                 return;
295         }
296
297         serv_puts("Content-type: text/x-vcard");
298         serv_puts("");
299         serv_puts("begin:vcard");
300         serv_printf("n:%s;%s;%s;%s;%s",
301                 bstr("lastname"),
302                 bstr("firstname"),
303                 bstr("middlename"),
304                 bstr("prefix"),
305                 bstr("suffix") );
306         serv_printf("adr:%s;%s;%s;%s;%s;%s;%s",
307                 bstr("pobox"),
308                 bstr("extadr"),
309                 bstr("street"),
310                 bstr("city"),
311                 bstr("state"),
312                 bstr("zipcode"),
313                 bstr("country") );
314         serv_printf("tel;home:%s", bstr("hometel") );
315         serv_printf("tel;work:%s", bstr("worktel") );
316         
317         for (i=0; i<num_tokens(bstr("inetemail"), '\n'); ++i) {
318                 extract_token(buf, bstr("inetemail"), i, '\n');
319                 if (strlen(buf) > 0) {
320                         serv_printf("email;internet:%s", buf);
321                 }
322         }
323
324         serv_printf("%s", bstr("extrafields") );
325         serv_puts("end:vcard");
326         serv_puts("000");
327
328         if (!strcmp(bstr("return_to"), "/select_user_to_edit")) {
329                 select_user_to_edit(NULL, NULL);
330         }
331         else if (!strcmp(bstr("return_to"), "/do_welcome")) {
332                 do_welcome();
333         }
334         else {
335                 readloop("readnew");
336         }
337 }