* GNU General Public License for more details.
*/
-#include "sysdep.h"
-#include <stdlib.h>
-#include <unistd.h>
#include <stdio.h>
-#include <fcntl.h>
-#include <signal.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/types.h>
#include <sys/file.h>
-#include <sys/stat.h>
#include <libcitadel.h>
-#include "citadel.h"
-#include "server.h"
-#include "control.h"
-#include "sysdep_decls.h"
-#include "support.h"
+
+#include "ctdl_module.h"
#include "config.h"
-#include "msgbase.h"
#include "citserver.h"
-#include "room_ops.h"
#include "user_ops.h"
-#include "database.h"
-#include "threads.h"
-#include "ctdl_module.h"
struct CitControl CitControl;
extern struct config config;
cprintf("%d\n", config.c_smtps_port);
cprintf("%d\n", config.c_enable_fulltext);
cprintf("%d\n", config.c_auto_cull);
- cprintf("%d\n", config.c_instant_expunge);
+ cprintf("1\n");
cprintf("%d\n", config.c_allow_spoofing);
cprintf("%d\n", config.c_journal_email);
cprintf("%d\n", config.c_journal_pubmsgs);
while (client_getln(buf, sizeof buf) >= 0 && strcmp(buf, "000")) {
switch (a) {
case 0:
- safestrncpy(config.c_nodename, buf,
- sizeof config.c_nodename);
+ configlen.c_nodename = safestrncpy(config.c_nodename, buf,
+ sizeof config.c_nodename);
break;
case 1:
- safestrncpy(config.c_fqdn, buf,
- sizeof config.c_fqdn);
+ configlen.c_fqdn = safestrncpy(config.c_fqdn, buf,
+ sizeof config.c_fqdn);
break;
case 2:
- safestrncpy(config.c_humannode, buf,
- sizeof config.c_humannode);
+ configlen.c_humannode = safestrncpy(config.c_humannode, buf,
+ sizeof config.c_humannode);
break;
case 3:
- safestrncpy(config.c_phonenum, buf,
- sizeof config.c_phonenum);
+ configlen.c_phonenum = safestrncpy(config.c_phonenum, buf,
+ sizeof config.c_phonenum);
break;
case 4:
config.c_creataide = atoi(buf);
config.c_twitdetect = 1;
break;
case 9:
- safestrncpy(config.c_twitroom, buf,
- sizeof config.c_twitroom);
+ configlen.c_twitroom = safestrncpy(config.c_twitroom, buf,
+ sizeof config.c_twitroom);
break;
case 10:
- safestrncpy(config.c_moreprompt, buf,
- sizeof config.c_moreprompt);
+ configlen.c_moreprompt = safestrncpy(config.c_moreprompt, buf,
+ sizeof config.c_moreprompt);
break;
case 11:
config.c_restrict = atoi(buf);
config.c_restrict = 1;
break;
case 12:
- safestrncpy(config.c_site_location, buf,
- sizeof config.c_site_location);
+ configlen.c_site_location = safestrncpy(
+ config.c_site_location, buf,
+ sizeof config.c_site_location);
break;
case 13:
- safestrncpy(config.c_sysadm, buf,
- sizeof config.c_sysadm);
+ configlen.c_sysadm = safestrncpy(config.c_sysadm, buf,
+ sizeof config.c_sysadm);
break;
case 14:
config.c_maxsessions = atoi(buf);
config.c_roompurge = atoi(buf);
break;
case 18:
- safestrncpy(config.c_logpages, buf,
- sizeof config.c_logpages);
+ configlen.c_logpages = safestrncpy(config.c_logpages, buf,
+ sizeof config.c_logpages);
break;
case 19:
config.c_createax = atoi(buf);
break;
case 31:
if ((config.c_purge_hour >= 0)
- && (config.c_purge_hour <= 23)) {
+ && (config.c_purge_hour <= 23)) {
config.c_purge_hour = atoi(buf);
}
break;
#ifdef HAVE_LDAP
case 32:
- safestrncpy(config.c_ldap_host, buf,
- sizeof config.c_ldap_host);
+ configlen.c_ldap_host = safestrncpy(config.c_ldap_host, buf,
+ sizeof config.c_ldap_host);
break;
case 33:
config.c_ldap_port = atoi(buf);
break;
case 34:
- safestrncpy(config.c_ldap_base_dn, buf,
- sizeof config.c_ldap_base_dn);
+ configlen.c_ldap_base_dn = safestrncpy(config.c_ldap_base_dn, buf,
+ sizeof config.c_ldap_base_dn);
break;
case 35:
- safestrncpy(config.c_ldap_bind_dn, buf,
- sizeof config.c_ldap_bind_dn);
+ configlen.c_ldap_bind_dn = safestrncpy(config.c_ldap_bind_dn, buf,
+ sizeof config.c_ldap_bind_dn);
break;
case 36:
- safestrncpy(config.c_ldap_bind_pw, buf,
- sizeof config.c_ldap_bind_pw);
+ configlen.c_ldap_bind_pw = safestrncpy(config.c_ldap_bind_pw, buf,
+ sizeof config.c_ldap_bind_pw);
break;
#endif
case 37:
- safestrncpy(config.c_ip_addr, buf,
- sizeof config.c_ip_addr);
+ configlen.c_ip_addr = safestrncpy(config.c_ip_addr, buf,
+ sizeof config.c_ip_addr);
case 38:
config.c_msa_port = atoi(buf);
break;
config.c_auto_cull = atoi(buf);
break;
case 44:
- config.c_instant_expunge = atoi(buf);
+ /* niu */
break;
case 45:
config.c_allow_spoofing = atoi(buf);
config.c_journal_pubmsgs = atoi(buf);
break;
case 48:
- safestrncpy(config.c_journal_dest, buf,
- sizeof config.c_journal_dest);
+ configlen.c_journal_dest = safestrncpy(config.c_journal_dest, buf,
+ sizeof config.c_journal_dest);
case 49:
- safestrncpy(config.c_default_cal_zone, buf,
- sizeof config.c_default_cal_zone);
+ configlen.c_default_cal_zone = safestrncpy(
+ config.c_default_cal_zone, buf,
+ sizeof config.c_default_cal_zone);
break;
case 50:
config.c_pftcpdict_port = atoi(buf);
case 52:
config.c_auth_mode = atoi(buf);
case 53:
- safestrncpy(config.c_funambol_host, buf,
+ configlen.c_funambol_host = safestrncpy(
+ config.c_funambol_host, buf,
sizeof config.c_funambol_host);
break;
case 54:
config.c_funambol_port = atoi(buf);
break;
case 55:
- safestrncpy(config.c_funambol_source,
- buf,
+ configlen.c_funambol_source = safestrncpy(
+ config.c_funambol_source, buf,
sizeof config.c_funambol_source);
break;
case 56:
- safestrncpy(config.c_funambol_auth,
- buf,
+ configlen.c_funambol_auth = safestrncpy(
+ config.c_funambol_auth, buf,
sizeof config.c_funambol_auth);
break;
case 57:
config.c_rbl_at_greeting = atoi(buf);
break;
case 58:
- safestrncpy(config.c_master_user, buf, sizeof config.c_master_user);
+ configlen.c_master_user = safestrncpy(
+ config.c_master_user,
+ buf, sizeof config.c_master_user);
break;
case 59:
- safestrncpy(config.c_master_pass, buf, sizeof config.c_master_pass);
+ configlen.c_master_pass = safestrncpy(
+ config.c_master_pass, buf, sizeof config.c_master_pass);
break;
case 60:
- safestrncpy(config.c_pager_program,
- buf,
- sizeof config.c_pager_program);
+ configlen.c_pager_program = safestrncpy(
+ config.c_pager_program, buf, sizeof config.c_pager_program);
break;
case 61:
config.c_imap_keep_from = atoi(buf);
}
}
+typedef struct __ConfType {
+ ConstStr Name;
+ long Type;
+}ConfType;
+
+ConfType CfgNames[] = {
+ { {HKEY("localhost") }, 0},
+ { {HKEY("directory") }, 0},
+ { {HKEY("smarthost") }, 2},
+ { {HKEY("fallbackhost") }, 2},
+ { {HKEY("rbl") }, 3},
+ { {HKEY("spamassassin") }, 3},
+ { {HKEY("masqdomain") }, 1},
+ { {HKEY("clamav") }, 3},
+ { {HKEY("notify") }, 3},
+ { {NULL, 0}, 0}
+};
+
+HashList *CfgNameHash = NULL;
+void cmd_gvdn(char *argbuf)
+{
+ const ConfType *pCfg;
+ char *confptr;
+ long min = atol(argbuf);
+ const char *Pos = NULL;
+ const char *PPos = NULL;
+ const char *HKey;
+ long HKLen;
+ StrBuf *Line;
+ StrBuf *Config;
+ StrBuf *Cfg;
+ StrBuf *CfgToken;
+ HashList *List;
+ HashPos *It;
+ void *vptr;
+
+ List = NewHash(1, NULL);
+ Cfg = NewStrBufPlain(config.c_fqdn, -1);
+ Put(List, SKEY(Cfg), Cfg, HFreeStrBuf);
+ Cfg = NULL;
+
+ confptr = CtdlGetSysConfig(INTERNETCFG);
+ Config = NewStrBufPlain(confptr, -1);
+ free(confptr);
+
+ Line = NewStrBufPlain(NULL, StrLength(Config));
+ CfgToken = NewStrBufPlain(NULL, StrLength(Config));
+ while (StrBufSipLine(Line, Config, &Pos))
+ {
+ if (Cfg == NULL)
+ Cfg = NewStrBufPlain(NULL, StrLength(Line));
+ PPos = NULL;
+ StrBufExtract_NextToken(Cfg, Line, &PPos, '|');
+ StrBufExtract_NextToken(CfgToken, Line, &PPos, '|');
+ if (GetHash(CfgNameHash, SKEY(CfgToken), &vptr) &&
+ (vptr != NULL))
+ {
+ pCfg = (ConfType *) vptr;
+ if (pCfg->Type <= min)
+ {
+ Put(List, SKEY(Cfg), Cfg, HFreeStrBuf);
+ Cfg = NULL;
+ }
+ }
+ }
+
+ cprintf("%d Valid Domains\n", LISTING_FOLLOWS);
+ It = GetNewHashPos(List, 1);
+ while (GetNextHashPos(List, It, &HKLen, &HKey, &vptr))
+ {
+ cputbuf(vptr);
+ cprintf("\n");
+ }
+ cprintf("000\n");
+
+ DeleteHashPos(&It);
+ DeleteHash(&List);
+ FreeStrBuf(&Cfg);
+ FreeStrBuf(&Line);
+ FreeStrBuf(&CfgToken);
+ FreeStrBuf(&Config);
+}
/*****************************************************************************/
/* MODULE INITIALIZATION STUFF */
/*****************************************************************************/
-
+void control_cleanup(void)
+{
+ DeleteHash(&CfgNameHash);
+}
CTDL_MODULE_INIT(control)
{
if (!threading) {
+ int i;
+
+ CfgNameHash = NewHash(1, NULL);
+ for (i = 0; CfgNames[i].Name.Key != NULL; i++)
+ Put(CfgNameHash, CKEY(CfgNames[i].Name), &CfgNames[i], reference_free_handler);
+
+ CtdlRegisterProtoHook(cmd_gvdn, "GVDN", "get valid domain names");
CtdlRegisterProtoHook(cmd_conf, "CONF", "get/set system configuration");
+ CtdlRegisterCleanupHook(control_cleanup);
+
}
/* return our id for the Log */
return "control";