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