* inetconf.c: fixed memory management problem that was causing all
[citadel.git] / webcit / inetconf.c
1 /* 
2  * $Id$
3  *
4  * Functions which handle Internet domain configuration etc.
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
29
30
31 void display_inetconf(void)
32 {
33         char buf[SIZ];
34         char ename[SIZ];
35         char etype[SIZ];
36         int i;
37         int which;
38
39         enum {
40                 ic_localhost,
41                 ic_directory,
42                 ic_gwdom,
43                 ic_smarthost,
44                 ic_rbl,
45                 ic_spamass,
46                 ic_max
47         };
48         char *ic_spec[ic_max];
49         char *ic_misc;
50
51         char *ic_keyword[] = {
52                 "localhost",
53                 "directory",
54                 "gatewaydomain",
55                 "smarthost",
56                 "rbl",
57                 "spamassassin",
58         };
59
60         char *ic_boxtitle[] = {
61                 "Local host aliases",
62                 "Directory domains",
63                 "Gateway domains",
64                 "Smart hosts",
65                 "RBL hosts",
66                 "SpamAssassin hosts",
67         };
68
69         char *ic_desc[] = {
70                 "(domains for which this host receives mail)",
71                 "(domains mapped with the Global Address Book)",
72                 "(domains whose subdomains match Citadel hosts)",
73                 "(if present, forward all outbound mail to one of these hosts)",
74                 "(hosts running a Realtime Blackhole List)",
75                 "(hosts running the SpamAssassin service)",
76         };
77
78         for (i=0; i<ic_max; ++i) {
79                 ic_spec[i] = strdup("");
80         }
81         ic_misc = strdup("");
82
83         serv_printf("CONF GETSYS|application/x-citadel-internet-config");
84         serv_gets(buf);
85         if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
86
87                 extract(ename, buf, 0);
88                 extract(etype, buf, 1);
89                 which = (-1);
90                 for (i=0; i<ic_max; ++i) {
91                         if (!strcasecmp(etype, ic_keyword[i])) {
92                                 which = i;
93                         }
94                 }
95
96                 if (which >= 0) {
97                         ic_spec[which] = realloc(ic_spec[which], strlen(ic_spec[which]) + strlen(ename) + 2);
98                         if (strlen(ic_spec[which]) > 0) strcat(ic_spec[which], "\n");
99                         strcat(ic_spec[which], ename);
100                 }
101                 else {
102                         ic_misc = realloc(ic_misc, strlen(ic_misc) + strlen(buf) + 2);
103                         if (strlen(ic_misc) > 0) strcat(ic_misc, "\n");
104                         strcat(ic_misc, buf);
105                 }
106
107         }
108
109         output_headers(1, 1, 2, 0, 0, 0, 0);
110         wprintf("<div id=\"banner\">\n");
111         wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
112         wprintf("<SPAN CLASS=\"titlebar\">Internet configuration</SPAN>\n");
113         wprintf("</TD></TR></TABLE>\n");
114         wprintf("</div>\n<div id=\"content\">\n");
115
116         wprintf("<center><table border=0 width=99%%><tr><td valign=top>\n");
117         for (which=0; which<ic_max; ++which) {
118                 if (which == (ic_max / 2)) {
119                         wprintf("</TD><TD VALIGN=TOP>");
120                 }
121                 svprintf("BOXTITLE", WCS_STRING, ic_boxtitle[which]);
122                 do_template("beginbox");
123                 wprintf("<span class=\"menudesc\">");
124                 escputs(ic_desc[which]);
125                 wprintf("</span><br />");
126                 wprintf("<TABLE border=0 cellspacing=0 cellpadding=0 width=100%%>\n");
127                 if (strlen(ic_spec[which]) > 0) {
128                         for (i=0; i<num_tokens(ic_spec[which], '\n'); ++i) {
129                                 wprintf("<TR><TD ALIGN=LEFT>");
130                                 extract_token(buf, ic_spec[which], i, '\n');
131                                 escputs(buf);
132                                 wprintf("</TD><TD ALIGN=RIGHT>"
133                                         "<A HREF=\"/save_inetconf?oper=delete&ename=");
134                                 escputs(buf);
135                                 wprintf("&etype=%s\" ", ic_keyword[which]);
136                                 wprintf("onClick=\"return confirm('Delete ");
137                                 jsescputs(buf);
138                                 wprintf("?');\">");
139                                 wprintf("<font size=-1>(Delete)</font></a></TD></TR>\n");
140                         }
141                 }
142                 wprintf("<FORM METHOD=\"POST\" ACTION=\"/save_inetconf\">\n"
143                         "<TR><TD>"
144                         "<INPUT TYPE=\"text\" NAME=\"ename\" MAXLENGTH=\"64\">"
145                         "<INPUT TYPE=\"hidden\" NAME=\"etype\" VALUE=\"%s\">", ic_keyword[which]);
146                 wprintf("</TD><TD ALIGN=RIGHT>"
147                         "<INPUT TYPE=\"submit\" NAME=\"oper\" VALUE=\"Add\">"
148                         "</TD></TR></TABLE></FORM>\n");
149                 do_template("endbox");
150         }
151         wprintf("</td></tr></table></center>\n");
152         wDumpContent(1);
153
154         for (i=0; i<ic_max; ++i) {
155                 free(ic_spec[i]);
156         }
157         free(ic_misc);
158 }
159
160
161 void save_inetconf(void) {
162         char *buf;
163         char *ename;
164         char *etype;
165         char *newconfig;
166
167         buf = malloc(SIZ);
168         ename = malloc(SIZ);
169         etype = malloc(SIZ);
170         newconfig = malloc(65536);
171
172         strcpy(newconfig, "");
173         serv_printf("CONF GETSYS|application/x-citadel-internet-config");
174         serv_gets(buf);
175         if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
176                 extract(ename, buf, 0);
177                 extract(etype, buf, 1);
178                 if (strlen(buf) == 0) {
179                         /* skip blank lines */
180                 }
181                 else if ((!strcasecmp(ename, bstr("ename")))
182                    &&   (!strcasecmp(etype, bstr("etype")))
183                    &&   (!strcasecmp(bstr("oper"), "delete"))
184                 ) {
185                         sprintf(WC->ImportantMessage, "%s deleted.", ename);
186                 }
187                 else {
188                         if (strlen(newconfig) > 0) strcat(newconfig, "\n");
189                         strcat(newconfig, buf);
190                 }
191         }
192
193         serv_printf("CONF PUTSYS|application/x-citadel-internet-config");
194         serv_gets(buf);
195         if (buf[0] == '4') {
196                 serv_puts(newconfig);
197                 if (!strcasecmp(bstr("oper"), "add")) {
198                         serv_printf("%s|%s", bstr("ename"), bstr("etype") );
199                         sprintf(WC->ImportantMessage, "%s added.", bstr("ename"));
200                 }
201                 serv_puts("000");
202         }
203         
204         display_inetconf();
205
206         free(buf);
207         free(ename);
208         free(etype);
209         free(newconfig);
210 }