X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Finetconf.c;h=265f3f6bd1f61fc177eef28bd72c247fb0df1ca5;hb=HEAD;hp=85f98153bd195058e17e9d97b3aae7e86f5b4714;hpb=26a4a07bdacdaa7013bf45cc235df207708acfde;p=citadel.git diff --git a/webcit/inetconf.c b/webcit/inetconf.c index 85f98153b..3b7d82de5 100644 --- a/webcit/inetconf.c +++ b/webcit/inetconf.c @@ -1,202 +1,255 @@ /* - * $Id$ + * Functions which handle Internet domain configuration etc. */ -/** - * \defgroup InetCfg Functions which handle Internet domain configuration etc. - * \ingroup CitadelConfig - */ -/*@{*/ + #include "webcit.h" -/** - * \brief display the inet config dialog + +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 display_inetconf(void) +void load_inetconf(void) { - char buf[SIZ]; - char ename[SIZ]; - char etype[SIZ]; - int i; - int which; - - enum { - ic_localhost, - ic_directory, - ic_gwdom, - ic_smarthost, - ic_rbl, - ic_spamass, - ic_max - }; - char *ic_spec[ic_max]; - char *ic_misc; - char *ic_keyword[ic_max]; - char *ic_boxtitle[ic_max]; - char *ic_desc[ic_max]; - - ic_keyword[0] = _("localhost"); - ic_keyword[1] = _("directory"); - ic_keyword[2] = _("gatewaydomain"); - ic_keyword[3] = _("smarthost"); - ic_keyword[4] = _("rbl"); - ic_keyword[5] = _("spamassassin"); - - ic_boxtitle[0] = _("Local host aliases"); - ic_boxtitle[1] = _("Directory domains"); - ic_boxtitle[2] = _("Gateway domains"); - ic_boxtitle[3] = _("Smart hosts"); - ic_boxtitle[4] = _("RBL hosts"); - ic_boxtitle[5] = _("SpamAssassin hosts"); - - ic_desc[0] = _("(domains for which this host receives mail)"); - ic_desc[1] = _("(domains mapped with the Global Address Book)"); - ic_desc[2] = _("(domains whose subdomains match Citadel hosts)"); - ic_desc[3] = _("(if present, forward all outbound mail to one of these hosts)"); - ic_desc[4] = _("(hosts running a Realtime Blackhole List)"); - ic_desc[5] = _("(hosts running the SpamAssassin service)"); - - for (i=0; iInetCfg = 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(""); serv_printf("CONF GETSYS|application/x-citadel-internet-config"); - serv_getln(buf, sizeof buf); - if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - - extract_token(ename, buf, 0, '|', sizeof ename); - extract_token(etype, buf, 1, '|', sizeof etype); - which = (-1); - for (i=0; i= 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")); } - } - 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); - } - 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); - } - - } - - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
\n"); - wprintf("
"); - wprintf(""); - wprintf(_("Internet configuration")); - wprintf("\n"); - wprintf("
\n"); - wprintf("
\n
\n"); - - wprintf("
" - "
\n"); - for (which=0; which"); - } - svprintf("BOXTITLE", WCS_STRING, ic_boxtitle[which]); - do_template("beginbox"); - wprintf(""); - escputs(ic_desc[which]); - wprintf("
"); - wprintf("\n"); - if (strlen(ic_spec[which]) > 0) { - for (i=0; i\n"); + 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); } - wprintf("\n" - "
"); - extract_token(buf, ic_spec[which], i, '\n', sizeof buf); - escputs(buf); - wprintf("" - "", - _("Delete this entry?")); - wprintf(""); - wprintf(_("(Delete)")); - wprintf("
" - "" - "", ic_keyword[which]); - wprintf("" - "" - "
\n"); - do_template("endbox"); - } - wprintf("
\n"); - wDumpContent(1); - - for (i=0; iImportantMessage, _("%s has been deleted."), ename); +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; } - else { - if (strlen(newconfig) > 0) strcat(newconfig, "\n"); - strcat(newconfig, 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( /* added status message*/ _(" added."), -1); } + Buf = NewStrBuf(); serv_printf("CONF PUTSYS|application/x-citadel-internet-config"); - serv_getln(buf, SIZ); - if (buf[0] == '4') { - serv_puts(newconfig); - if (!strcasecmp(bstr("oper"), "add")) { - serv_printf("%s|%s", bstr("ename"), bstr("etype") ); - sprintf(WC->ImportantMessage, "%s added.", bstr("ename")); + 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 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; +} + + +HashList *GetValidDomainNames(StrBuf *Target, WCTemplputParams *TP) +{ + StrBuf *Line; + HashList *ValidDomainNames = NULL; + long State; + int gvdnlevel = 0; - display_inetconf(); + 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); - free(buf); - free(ename); - free(etype); - free(newconfig); + 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); +}