* Cleaned up the rcs/cvs Id tags and leading comments at the top of some files
[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         output_headers(1, 1, 2, 0, 0, 0, 0);
84         wprintf("<div id=\"banner\">\n");
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         wprintf("</div>\n<div id=\"content\">\n");
89
90         serv_printf("CONF GETSYS|application/x-citadel-internet-config");
91         serv_gets(buf);
92         if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
93
94                 extract(ename, buf, 0);
95                 extract(etype, buf, 1);
96                 which = (-1);
97                 for (i=0; i<ic_max; ++i) {
98                         if (!strcasecmp(etype, ic_keyword[i])) {
99                                 which = i;
100                         }
101                 }
102
103                 if (which >= 0) {
104                         ic_spec[which] = realloc(ic_spec[which], strlen(ic_spec[which]) + strlen(ename) + 2);
105                         if (strlen(ic_spec[which]) > 0) strcat(ic_spec[which], "\n");
106                         strcat(ic_spec[which], ename);
107                 }
108                 else {
109                         ic_misc = realloc(ic_misc, strlen(ic_misc) + strlen(buf) + 2);
110                         if (strlen(ic_misc) > 0) strcat(ic_misc, "\n");
111                         strcat(ic_misc, buf);
112                 }
113
114         }
115
116         wprintf("<TABLE border=0 width=100%%><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>\n");
152
153         wDumpContent(1);
154
155         for (i=0; i<ic_max; ++i) {
156                 free(ic_spec[i]);
157         }
158         free(ic_misc);
159 }
160
161
162 void save_inetconf(void) {
163         char buf[SIZ];
164         char ename[SIZ];
165         char etype[SIZ];
166         char newconfig[65536];
167
168         strcpy(newconfig, "");
169         serv_printf("CONF GETSYS|application/x-citadel-internet-config");
170         serv_gets(buf);
171         if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
172                 extract(ename, buf, 0);
173                 extract(etype, buf, 1);
174                 if (strlen(buf) == 0) {
175                         /* skip blank lines */
176                 }
177                 else if ((!strcasecmp(ename, bstr("ename")))
178                    &&   (!strcasecmp(etype, bstr("etype")))
179                    &&   (!strcasecmp(bstr("oper"), "delete"))
180                 ) {
181                         sprintf(WC->ImportantMessage, "%s deleted.", ename);
182                 }
183                 else {
184                         if (strlen(newconfig) > 0) strcat(newconfig, "\n");
185                         strcat(newconfig, buf);
186                 }
187         }
188
189         serv_printf("CONF PUTSYS|application/x-citadel-internet-config");
190         serv_gets(buf);
191         if (buf[0] == '4') {
192                 serv_puts(newconfig);
193                 if (!strcasecmp(bstr("oper"), "add")) {
194                         serv_printf("%s|%s", bstr("ename"), bstr("etype") );
195                         sprintf(WC->ImportantMessage, "%s added.", bstr("ename"));
196                 }
197                 serv_puts("000");
198         }
199         
200         display_inetconf();
201 }