X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcontrol.c;h=22d7097ca556797f66e79bbef21a7cf0fbc97030;hb=e8123a34d5c13c89443de540f8d3ef10f53225a6;hp=b81526cf1dc855078349afb8ed70a4803bb0388d;hpb=dba8d7a9fb79dd7a776478781736c2425b19bd17;p=citadel.git diff --git a/citadel/control.c b/citadel/control.c index b81526cf1..22d7097ca 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -1,61 +1,25 @@ /* * This module handles states which are global to the entire server. * - * Copyright (c) 1987-2012 by the citadel.org team + * Copyright (c) 1987-2015 by the citadel.org team * - * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ -#include "sysdep.h" -#include -#include #include -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - -#include -#include -#include -#include -#include #include -#include #include -#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" - -#ifndef HAVE_SNPRINTF -#include "snprintf.h" -#endif - -#include "ctdl_module.h" struct CitControl CitControl; extern struct config config; @@ -169,7 +133,7 @@ void get_control(void) control_fp = fopen(file_citadel_control, "rb+"); if (control_fp != NULL) { lock_control(); - rv = fchown(fileno(control_fp), config.c_ctdluid, -1); + rv = fchown(fileno(control_fp), ctdluid, -1); if (rv == -1) syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n", file_citadel_control, strerror(errno)); @@ -185,7 +149,7 @@ void get_control(void) lock_control(); memset(&CitControl, 0, sizeof(struct CitControl)); - rv = fchown(fileno(control_fp), config.c_ctdluid, -1); + rv = fchown(fileno(control_fp), ctdluid, -1); if (rv == -1) syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n", file_citadel_control, strerror(errno)); @@ -212,7 +176,7 @@ void get_control(void) syslog(LOG_EMERG, "Failed to read Controlfile: %s [%s]\n", file_citadel_control, strerror(errno)); already_have_control = 1; - rv = chown(file_citadel_control, config.c_ctdluid, (-1)); + rv = chown(file_citadel_control, ctdluid, (-1)); if (rv == -1) syslog(LOG_EMERG, "Failed to adjust ownership of: %s [%s]\n", file_citadel_control, strerror(errno)); @@ -397,7 +361,7 @@ void cmd_conf(char *argbuf) 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); @@ -422,7 +386,9 @@ void cmd_conf(char *argbuf) cprintf("%d\n", config.c_spam_flag_only); cprintf("%d\n", config.c_guest_logins); cprintf("%d\n", config.c_port_number); - cprintf("%d\n", config.c_ctdluid); + cprintf("%d\n", ctdluid); + cprintf("%d\n", config.c_nntp_port); + cprintf("%d\n", config.c_nntps_port); cprintf("000\n"); } @@ -433,20 +399,16 @@ void cmd_conf(char *argbuf) while (client_getln(buf, sizeof buf) >= 0 && strcmp(buf, "000")) { switch (a) { case 0: - safestrncpy(config.c_nodename, buf, - sizeof config.c_nodename); + safestrncpy(config.c_nodename, buf, sizeof config.c_nodename); break; case 1: - safestrncpy(config.c_fqdn, buf, - sizeof config.c_fqdn); + safestrncpy(config.c_fqdn, buf, sizeof config.c_fqdn); break; case 2: - safestrncpy(config.c_humannode, buf, - sizeof config.c_humannode); + safestrncpy(config.c_humannode, buf, sizeof config.c_humannode); break; case 3: - safestrncpy(config.c_phonenum, buf, - sizeof config.c_phonenum); + safestrncpy(config.c_phonenum, buf, sizeof config.c_phonenum); break; case 4: config.c_creataide = atoi(buf); @@ -472,12 +434,10 @@ void cmd_conf(char *argbuf) config.c_twitdetect = 1; break; case 9: - safestrncpy(config.c_twitroom, buf, - sizeof config.c_twitroom); + safestrncpy(config.c_twitroom, buf, sizeof config.c_twitroom); break; case 10: - safestrncpy(config.c_moreprompt, buf, - sizeof config.c_moreprompt); + safestrncpy(config.c_moreprompt, buf, sizeof config.c_moreprompt); break; case 11: config.c_restrict = atoi(buf); @@ -485,12 +445,10 @@ void cmd_conf(char *argbuf) config.c_restrict = 1; break; case 12: - safestrncpy(config.c_site_location, buf, - sizeof config.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); + safestrncpy(config.c_sysadm, buf, sizeof config.c_sysadm); break; case 14: config.c_maxsessions = atoi(buf); @@ -507,8 +465,7 @@ void cmd_conf(char *argbuf) config.c_roompurge = atoi(buf); break; case 18: - safestrncpy(config.c_logpages, buf, - sizeof config.c_logpages); + safestrncpy(config.c_logpages, buf, sizeof config.c_logpages); break; case 19: config.c_createax = atoi(buf); @@ -557,34 +514,29 @@ void cmd_conf(char *argbuf) 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); + 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); + 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); + 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); + 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); + safestrncpy(config.c_ip_addr, buf, sizeof config.c_ip_addr); case 38: config.c_msa_port = atoi(buf); break; @@ -604,7 +556,7 @@ void cmd_conf(char *argbuf) 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); @@ -616,11 +568,9 @@ void cmd_conf(char *argbuf) config.c_journal_pubmsgs = atoi(buf); break; case 48: - safestrncpy(config.c_journal_dest, buf, - sizeof config.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); + safestrncpy(config.c_default_cal_zone, buf, sizeof config.c_default_cal_zone); break; case 50: config.c_pftcpdict_port = atoi(buf); @@ -631,21 +581,16 @@ void cmd_conf(char *argbuf) case 52: config.c_auth_mode = atoi(buf); case 53: - safestrncpy(config.c_funambol_host, buf, - sizeof config.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, - sizeof config.c_funambol_source); + safestrncpy(config.c_funambol_source, buf, sizeof config.c_funambol_source); break; case 56: - safestrncpy(config.c_funambol_auth, - buf, - sizeof config.c_funambol_auth); + safestrncpy(config.c_funambol_auth, buf, sizeof config.c_funambol_auth); break; case 57: config.c_rbl_at_greeting = atoi(buf); @@ -657,9 +602,7 @@ void cmd_conf(char *argbuf) 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); + safestrncpy(config.c_pager_program, buf, sizeof config.c_pager_program); break; case 61: config.c_imap_keep_from = atoi(buf); @@ -686,7 +629,13 @@ void cmd_conf(char *argbuf) config.c_port_number = atoi(buf); break; case 69: - config.c_ctdluid = atoi(buf); + /* niu */ + break; + case 70: + config.c_nntp_port = atoi(buf); + break; + case 71: + config.c_nntps_port = atoi(buf); break; } ++a; @@ -705,7 +654,7 @@ void cmd_conf(char *argbuf) * index so it doesn't try to use it later. */ if (config.c_enable_fulltext == 0) { - CitControl.fulltext_wordbreaker = 0; + CitControl.MM_fulltext_wordbreaker = 0; put_control(); } } @@ -744,16 +693,110 @@ void cmd_conf(char *argbuf) } } +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";