final touches on dkim test harness
[citadel.git] / webcit / inetconf.c
index c77b0a898a93001aa70dd7cb6481af08163e775a..3b7d82de50a5bf6517c9ac200ab88f1158cc9fe9 100644 (file)
 /* 
- * inetconf.c
- *
  * Functions which handle Internet domain configuration etc.
- *
- * $Id$
  */
 
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <limits.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <string.h>
-#include <pwd.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <pthread.h>
-#include <signal.h>
 #include "webcit.h"
 
 
 
-void display_inetconf(void)
+typedef enum _e_cfg {
+       ic_localhost,
+       ic_directory,
+       ic_smarthost,
+       ic_fallback,
+       ic_rbl,
+       ic_spamass,
+       ic_masq,
+       ic_clamav,
+       ic_notify,
+       ic_max
+} ECfg;
+
+
+  /* These are server config keywords; do not localize! */
+ConstStr CfgNames[] = {
+       { HKEY("localhost") },
+       { HKEY("directory") },
+       { HKEY("smarthost") },
+       { HKEY("fallbackhost") },
+       { HKEY("rbl") },
+       { HKEY("spamassassin") },
+       { HKEY("masqdomain") },
+       { HKEY("clamav") },
+       { HKEY("notify") }
+};
+
+       
+
+
+/*
+ * display the inet config dialog 
+ */
+void load_inetconf(void)
 {
-       char buf[SIZ];
-       char ename[SIZ];
-       char etype[SIZ];
-       int i;
-       int which;
-
-       enum {
-               ic_localhost,
-               ic_gwdom,
-               ic_directory,
-               ic_spamass,
-               ic_rbl,
-               ic_smarthost,
-               ic_max
-       };
-       char *ic_spec[ic_max];
-       char *ic_misc;
-
-       char *ic_keyword[] = {
-               "localhost",
-               "gatewaydomain",
-               "directory",
-               "spamassassin",
-               "rbl",
-               "smarthost"
-       };
-
-       char *ic_boxtitle[] = {
-               "Local host aliases",
-               "Gateway domains",
-               "Directory domains",
-               "SpamAssassin hosts",
-               "RBL hosts",
-               "Smart hosts"
-       };
-
-       char *ic_desc[] = {
-               "(domains for which this host receives mail)",
-               "(domains whose subdomains match Citadel hosts)",
-               "(domains mapped with the Global Address Book)",
-               "(hosts running the SpamAssassin service)",
-               "(hosts running a Realtime Blackhole List)",
-               "(if present, forward all outbound mail to one of these hosts)"
-       };
-
-       for (i=0; i<ic_max; ++i) {
-               ic_spec[i] = strdup("");
+       wcsession *WCC = WC;
+       StrBuf *Buf, *CfgToken, *Value;
+       void *vHash;
+       HashList *Hash;
+       char nnn[64];
+       int i, len, nUsed;
+       
+       WCC->InetCfg = NewHash(1, NULL);
+
+       for (i = 0; i < (sizeof(CfgNames) / sizeof(ConstStr)); i++) {
+               Hash = NewHash(1, NULL);
+               Put(WCC->InetCfg, CKEY(CfgNames[i]), Hash, HDeleteHash);
        }
-       ic_misc = strdup("");
-
-       output_headers(3);
-       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
-       wprintf("<SPAN CLASS=\"titlebar\">Internet configuration</SPAN>\n");
-       wprintf("</TD></TR></TABLE>\n");
 
        serv_printf("CONF GETSYS|application/x-citadel-internet-config");
-       serv_gets(buf);
-       if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
-
-               extract(ename, buf, 0);
-               extract(etype, buf, 1);
-               which = (-1);
-               for (i=0; i<ic_max; ++i) {
-                       if (!strcasecmp(etype, ic_keyword[i])) {
-                               which = i;
+       Buf = NewStrBuf();
+       StrBuf_ServGetln(Buf);
+               
+       if (GetServerStatus(Buf, NULL) == 1) {
+               CfgToken = NewStrBuf();
+               while ((len = StrBuf_ServGetln(Buf), ((len >= 0) && ((len != 3) || strcmp(ChrPtr(Buf), "000")))))
+               {
+                       Value = NewStrBuf();
+                       StrBufExtract_token(CfgToken, Buf, 1, '|');
+
+                       // VILE SLEAZY HACK: change obsolete "directory" domains to "localhost" domains
+                       if (!strcasecmp(ChrPtr(CfgToken), "directory")) {
+                               FreeStrBuf(&CfgToken);
+                               CfgToken = NewStrBufPlain(HKEY("localhost"));
                        }
+
+                       StrBufExtract_token(Value, Buf, 0, '|');
+                       GetHash(WCC->InetCfg, ChrPtr(CfgToken), StrLength(CfgToken), &vHash);
+                       Hash = (HashList*) vHash;
+                       if (Hash == NULL) {
+                               syslog(LOG_WARNING, "ERROR Loading inet config line: [%s]", ChrPtr(Buf));
+                               FreeStrBuf(&Value);
+                               continue;
+                       }
+                       nUsed = GetCount(Hash);
+                       nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1);
+                       Put(Hash, nnn, nUsed, Value, HFreeStrBuf); 
                }
+               FreeStrBuf(&CfgToken);
+       }
+       FreeStrBuf(&Buf);
+}
+
+
+/*
+ * save changes to the inet config
+ */
+void new_save_inetconf(void) {
+       wcsession *WCC = WC;
+       HashList *Hash;
+       StrBuf *Str;
+       StrBuf *Buf;
+       const StrBuf *eType, *eNum, *eName;
+       char nnn[64];
+       void *vHash, *vStr;
+       int i, nUsed;
+
+       load_inetconf();
+       eType = sbstr("etype");
+
+       GetHash(WCC->InetCfg, ChrPtr(eType), StrLength(eType), &vHash);
+       Hash = (HashList*) vHash;
+       if (Hash == NULL) {
+               AppendImportantMessage(_("Invalid Parameter"), -1);
+               url_do_template();
+               return;
+       }
 
-               if (which >= 0) {
-                       ic_spec[which] = realloc(ic_spec[which], strlen(ic_spec[which]) + strlen(ename) + 2);
-                       if (strlen(ic_spec[which]) > 0) strcat(ic_spec[which], "\n");
-                       strcat(ic_spec[which], ename);
+       if (strcasecmp(bstr("oper"), "delete") == 0) {
+               eNum = sbstr("ename");
+               if (!GetHash(Hash, ChrPtr(eNum), StrLength(eNum), &vStr) ||
+                   (vStr == NULL)) {
+                       AppendImportantMessage(_("Invalid Parameter"), -1);
+                       url_do_template();
+                       return;
                }
-               else {
-                       ic_misc = realloc(ic_misc, strlen(ic_misc) + strlen(buf) + 2);
-                       if (strlen(ic_misc) > 0) strcat(ic_misc, "\n");
-                       strcat(ic_misc, buf);
+
+               Str = (StrBuf*)vStr;
+               AppendImportantMessage(SKEY(Str));
+               AppendImportantMessage(_(" has been deleted."), -1);
+               FlushStrBuf(Str);       
+       }
+       else if (!strcasecmp(bstr("oper"), "add")) {
+               StrBuf *name;
+               eName = sbstr("ename");
+               if (eName == NULL) {
+                       AppendImportantMessage(_("Invalid Parameter"), -1);
+                       url_do_template();
+                       return;
                }
 
+               nUsed = GetCount(Hash);
+               nUsed = snprintf(nnn, sizeof(nnn), "%d", nUsed+1);
+               name = NewStrBufDup(eName);
+               StrBufTrim(name);
+               Put(Hash, nnn, nUsed, name, HFreeStrBuf); 
+               AppendImportantMessage(SKEY(eName));
+               AppendImportantMessage( /*<domain> added status message*/ _(" added."), -1); 
        }
 
-       wprintf("<TABLE border=0 width=100%%>\n");
-       for (which=0; which<ic_max; ++which) {
-               if (which % 2 == 0) {
-                       wprintf("<TR>");
-               }
-               wprintf("<TD>");
-               svprintf("BOXTITLE", WCS_STRING, ic_boxtitle[which]);
-               do_template("beginbox");
-               wprintf("<span class=\"menudesc\">");
-               escputs(ic_desc[which]);
-               wprintf("</span><br>");
-               wprintf("<TABLE border=0 cellspacing=0 cellpadding=0 width=100%%>\n");
-               if (strlen(ic_spec[which]) > 0) {
-                       for (i=0; i<num_tokens(ic_spec[which], '\n'); ++i) {
-                               wprintf("<TR><TD ALIGN=LEFT>");
-                               extract_token(buf, ic_spec[which], i, '\n');
-                               escputs(buf);
-                               wprintf("</TD><TD ALIGN=RIGHT>"
-                                       "<A HREF=\"/save_inetconf?oper=delete&ename=");
-                               escputs(buf);
-                               wprintf("&etype=%s\" ", ic_keyword[which]);
-                               wprintf("onClick=\"return confirm('Delete ");
-                               jsescputs(buf);
-                               wprintf("?');\">");
-                               wprintf("<font size=-1>(Delete)</font></a></TD></TR>\n");
+       Buf = NewStrBuf();
+       serv_printf("CONF PUTSYS|application/x-citadel-internet-config");
+       StrBuf_ServGetln(Buf);
+       if (GetServerStatus(Buf, NULL) == 4) {
+               for (i = 0; i < (sizeof(CfgNames) / sizeof(ConstStr)); i++) {
+                       HashPos *where;
+                       const char *Key;
+                       long KeyLen;
+
+                       GetHash(WCC->InetCfg, CKEY(CfgNames[i]), &vHash);
+                       Hash = (HashList*) vHash;
+                       if (Hash == NULL) {
+                               AppendImportantMessage(_("Invalid Parameter"), -1);
+                               url_do_template();
+                               return;
                        }
+                       if (GetCount(Hash) > 0) {
+                               where = GetNewHashPos(Hash, 0);
+                               while (GetNextHashPos(Hash, where, &KeyLen, &Key, &vStr)) {
+                                       Str = (StrBuf*) vStr;
+                                       if ((Str!= NULL) && (StrLength(Str) > 0))
+                                               serv_printf("%s|%s", ChrPtr(Str), CfgNames[i].Key); 
+                               }
+                               DeleteHashPos(&where);
+                       }                       
                }
-               wprintf("<TR><TD>&nbsp;</TD><TD ALIGN=RIGHT>(add)</TD></TR></TABLE>\n");
-               do_template("endbox");
-               wprintf("</TD>");
-               if (which % 2 != 0) {
-                       wprintf("</TR>");
-               }
+               serv_puts("000");
+               DeleteHash(&WCC->InetCfg);
        }
-       wprintf("</TABLE>\n");
+       FreeStrBuf(&Buf);
+       url_do_template();
+}
 
-       wDumpContent(1);
 
-       for (i=0; i<ic_max; ++i) {
-               free(ic_spec[i]);
-       }
-       free(ic_misc);
+void DeleteInetConfHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+
+       if (WCC->InetCfg != NULL)
+               DeleteHash(&WCC->InetCfg);
+
+}
+
+
+HashList *GetInetConfHash(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession *WCC = WC;
+       void *vHash;
+
+       if (WCC->InetCfg == NULL)
+               load_inetconf();
+       GetHash(WCC->InetCfg, TKEY(5), &vHash);
+       PutBstr(HKEY("__SERVCFG:INET:TYPE"), NewStrBufPlain(TKEY(5)));
+       return vHash;
 }
 
 
-void save_inetconf(void) {
+HashList *GetValidDomainNames(StrBuf *Target, WCTemplputParams *TP) 
+{
+       StrBuf *Line;
+       HashList *ValidDomainNames = NULL;
+       long State;
+       int gvdnlevel = 0;
+       
+       serv_printf("GVDN %d", gvdnlevel);
+       Line = NewStrBuf();
+       StrBuf_ServGetln(Line);
+       if (GetServerStatus(Line, &State) == 1) 
+       {
+               int Done = 0;
+               int n = 0;
+
+               ValidDomainNames = NewHash(1, NULL);
+               while(!Done && (StrBuf_ServGetln(Line) >= 0))
+                       if ( (StrLength(Line)==3) && 
+                            !strcmp(ChrPtr(Line), "000"))
+                       {
+                               Done = 1;
+                       }
+                       else
+                       {
+                               Put(ValidDomainNames, 
+                                   IKEY(n),
+                                   NewStrBufDup(Line), 
+                                   HFreeStrBuf);
+                               n++; /* #0 is the type... */
+                       }
+       }
+       else if (State == 550)
+               AppendImportantMessage(_("Higher access is required to access this function."), -1);
 
-       strcpy(WC->ImportantMessage, "FIXME did we do anything?");
+       FreeStrBuf(&Line);
 
-       display_inetconf();
+       return ValidDomainNames;
+}
+
+
+
+void 
+InitModule_INETCONF
+(void)
+{
+       WebcitAddUrlHandler(HKEY("save_inetconf"), "", 0, new_save_inetconf, 0);
+       RegisterIterator("SERVCFG:INET", 1, NULL, GetInetConfHash, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+       RegisterNamespace("SERVCFG:FLUSHINETCFG",0, 0, DeleteInetConfHash, NULL, CTX_NONE);
+       RegisterIterator("ITERATE:VALID:DOMAINNAMES", 1, NULL, GetValidDomainNames, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
 }