X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Finetconf.c;h=265f3f6bd1f61fc177eef28bd72c247fb0df1ca5;hb=HEAD;hp=30125d39a92bb704e313e6cc019a05ffe471dde0;hpb=8fa15271b5cdc6722aad2d0b4c9fe12e48472878;p=citadel.git diff --git a/webcit/inetconf.c b/webcit/inetconf.c index 30125d39a..3b7d82de5 100644 --- a/webcit/inetconf.c +++ b/webcit/inetconf.c @@ -1,108 +1,255 @@ /* - * inetconf.c - * * Functions which handle Internet domain configuration etc. - * - * $Id$ */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #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]; - - char *ic_localhost; - char *ic_gwdom; - char *ic_directory; - char *ic_spamass; - char *ic_rbl; - char *ic_smarthost; - char *ic_misc; - - char *which = NULL; - - ic_localhost = strdup(""); - ic_gwdom = strdup(""); - ic_directory = strdup(""); - ic_spamass = strdup(""); - ic_rbl = strdup(""); - ic_smarthost = strdup(""); - ic_misc = strdup(""); - - output_headers(3); - wprintf("
"); - wprintf("Internet configuration\n"); - wprintf("
\n"); + 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); + } 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, 0); - which = NULL; - if (!strcasecmp(etype, "localhost")) which = ic_localhost; - else if (!strcasecmp(etype, "gatewaydomain")) which = ic_gwdom; - else if (!strcasecmp(etype, "directory")) which = ic_directory; - else if (!strcasecmp(etype, "spamassassin")) which = ic_directory; - else if (!strcasecmp(etype, "rbl")) which = ic_rbl; - else if (!strcasecmp(etype, "smarthost")) which = ic_smarthost; - - if (which != NULL) { - which = realloc(which, strlen(which) + strlen(ename) + 2); - if (strlen(which) > 0) strcat(which, "\n"); - strcat(which, ename); + 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); } - else { - ic_misc = realloc(ic_misc, strlen(ic_misc) + strlen(buf) + 2); - if (strlen(ic_misc) > 0) strcat(ic_misc, "\n"); - strcat(which, buf); + 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 (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; } - /* FIXME finish this */ - escputs(buf); - wprintf("
\n"); + 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; + } - wDumpContent(1); + 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( /* added status message*/ _(" added."), -1); + } - free(ic_localhost); - free(ic_gwdom); - free(ic_directory); - free(ic_spamass); - free(ic_rbl); - free(ic_smarthost); - free(ic_misc); + 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); + } + } + serv_puts("000"); + DeleteHash(&WCC->InetCfg); + } + FreeStrBuf(&Buf); + url_do_template(); } -void save_inetconf(void) { +void DeleteInetConfHash(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + if (WCC->InetCfg != NULL) + DeleteHash(&WCC->InetCfg); - strcpy(WC->ImportantMessage, "FIXME did we do anything?"); +} - display_inetconf(); + +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; +} + + +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); + + FreeStrBuf(&Line); + + 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); }