X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Finetconf.c;h=265f3f6bd1f61fc177eef28bd72c247fb0df1ca5;hb=HEAD;hp=cbdf3260077c8704e1ceeff4b3ee3dd94d2eb1d6;hpb=d159f2a1a8cf9efccb8f733d7e2452c5f7cfbf64;p=citadel.git diff --git a/webcit/inetconf.c b/webcit/inetconf.c index cbdf32600..3b7d82de5 100644 --- a/webcit/inetconf.c +++ b/webcit/inetconf.c @@ -1,211 +1,255 @@ /* - * $Id$ - * * Functions which handle Internet domain configuration etc. - * */ -#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]; - 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[] = { - "localhost", - "directory", - "gatewaydomain", - "smarthost", - "rbl", - "spamassassin", - }; - - char *ic_boxtitle[] = { - "Local host aliases", - "Directory domains", - "Gateway domains", - "Smart hosts", - "RBL hosts", - "SpamAssassin hosts", - }; - - char *ic_desc[] = { - "(domains for which this host receives mail)", - "(domains mapped with the Global Address Book)", - "(domains whose subdomains match Citadel hosts)", - "(if present, forward all outbound mail to one of these hosts)", - "(hosts running a Realtime Blackhole List)", - "(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_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= 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); +} + - 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); +/* + * 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; } - 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( /* added status message*/ _(" added."), -1); } - output_headers(1, 1, 2, 0, 0, 0, 0); - wprintf("
\n"); - wprintf("
"); - wprintf("Internet configuration\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"); + 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("\n" - "
"); - extract_token(buf, ic_spec[which], i, '\n'); - escputs(buf); - wprintf("" - ""); - wprintf("(Delete)
" - "" - "", ic_keyword[which]); - wprintf("" - "" - "
\n"); - do_template("endbox"); + serv_puts("000"); + DeleteHash(&WCC->InetCfg); } - wprintf("
\n"); - wDumpContent(1); + FreeStrBuf(&Buf); + url_do_template(); +} + + +void DeleteInetConfHash(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + if (WCC->InetCfg != NULL) + DeleteHash(&WCC->InetCfg); - for (i=0; iInetCfg == NULL) + load_inetconf(); + GetHash(WCC->InetCfg, TKEY(5), &vHash); + PutBstr(HKEY("__SERVCFG:INET:TYPE"), NewStrBufPlain(TKEY(5))); + return vHash; +} - buf = malloc(SIZ); - ename = malloc(SIZ); - etype = malloc(SIZ); - newconfig = malloc(65536); - strcpy(newconfig, ""); - 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); - if (strlen(buf) == 0) { - /* skip blank lines */ - } - else if ((!strcasecmp(ename, bstr("ename"))) - && (!strcasecmp(etype, bstr("etype"))) - && (!strcasecmp(bstr("oper"), "delete")) - ) { - sprintf(WC->ImportantMessage, "%s deleted.", ename); - } - else { - if (strlen(newconfig) > 0) strcat(newconfig, "\n"); - strcat(newconfig, buf); - } +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); - serv_printf("CONF PUTSYS|application/x-citadel-internet-config"); - serv_gets(buf); - 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")); - } - serv_puts("000"); - } - - display_inetconf(); + 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); }