+#include "ctdl_module.h"
+
+long config_msgnum = 0;
+HashList *ctdlconfig = NULL; // new configuration
+
+
+void config_warn_if_port_unset(char *key, int default_port)
+{
+ int p = CtdlGetConfigInt(key);
+ if ((p < -1) || (p == 0) || (p > UINT16_MAX))
+ {
+ syslog(LOG_ERR, "config: setting %s is not -1 (disabled) or a valid TCP port - setting to default %d", key, default_port);
+ CtdlSetConfigInt(key, default_port);
+ }
+}
+
+
+void config_warn_if_empty(char *key)
+{
+ if (IsEmptyStr(CtdlGetConfigStr(key)))
+ {
+ syslog(LOG_ERR, "config: setting %s is empty, but must not - check your config!", key);
+ }
+}
+
+
+void validate_config(void) {
+
+ /*
+ * these shouldn't be empty
+ */
+ config_warn_if_empty("c_fqdn");
+ config_warn_if_empty("c_baseroom");
+ config_warn_if_empty("c_aideroom");
+ config_warn_if_empty("c_twitroom");
+ config_warn_if_empty("c_nodename");
+
+ /*
+ * Sanity check for port bindings
+ */
+ config_warn_if_port_unset("c_smtp_port", 25);
+ config_warn_if_port_unset("c_pop3_port", 110);
+ config_warn_if_port_unset("c_imap_port", 143);
+ config_warn_if_port_unset("c_msa_port", 587);
+ config_warn_if_port_unset("c_port_number", 504);
+ config_warn_if_port_unset("c_smtps_port", 465);
+ config_warn_if_port_unset("c_pop3s_port", 995);
+ config_warn_if_port_unset("c_imaps_port", 993);
+ config_warn_if_port_unset("c_pftcpdict_port", -1);
+ config_warn_if_port_unset("c_managesieve_port", 2020);
+ config_warn_if_port_unset("c_xmpp_c2s_port", 5222);
+ config_warn_if_port_unset("c_xmpp_s2s_port", 5269);
+ config_warn_if_port_unset("c_nntp_port", 119);
+ config_warn_if_port_unset("c_nntps_port", 563);
+
+ if (getpwuid(ctdluid) == NULL) {
+ syslog(LOG_ERR, "config: uid (%d) does not exist ... citserver will run as root", ctdluid);
+ }
+}
+
+
+/*
+ * Put some sane default values into our configuration. Some will be overridden when we run setup.
+ */
+void brand_new_installation_set_defaults(void) {
+
+ struct utsname my_utsname;
+ struct hostent *he;
+ char detected_hostname[256];
+
+ /* Determine our host name, in case we need to use it as a default */
+ uname(&my_utsname);
+
+ /* set some sample/default values in place of blanks... */
+ extract_token(detected_hostname, my_utsname.nodename, 0, '.', sizeof detected_hostname);
+ CtdlSetConfigStr("c_nodename", detected_hostname);
+
+ if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
+ CtdlSetConfigStr("c_fqdn", he->h_name);
+ }
+ else {
+ CtdlSetConfigStr("c_fqdn", my_utsname.nodename);
+ }
+
+ CtdlSetConfigStr("c_humannode", "Citadel Server");
+ CtdlSetConfigInt("c_initax", 4);
+ CtdlSetConfigStr("c_moreprompt", "<more>");
+ CtdlSetConfigStr("c_twitroom", "Trashcan");
+ CtdlSetConfigStr("c_baseroom", BASEROOM);
+ CtdlSetConfigStr("c_aideroom", "Aide");
+ CtdlSetConfigInt("c_sleeping", 900);
+
+ if (CtdlGetConfigInt("c_createax") == 0) {
+ CtdlSetConfigInt("c_createax", 3);
+ }
+
+ /*
+ * Default port numbers for various services
+ */
+ CtdlSetConfigInt("c_port_number", 504);
+ CtdlSetConfigInt("c_smtp_port", 25);
+ CtdlSetConfigInt("c_pop3_port", 110);
+ CtdlSetConfigInt("c_imap_port", 143);
+ CtdlSetConfigInt("c_msa_port", 587);
+ CtdlSetConfigInt("c_smtps_port", 465);
+ CtdlSetConfigInt("c_pop3s_port", 995);
+ CtdlSetConfigInt("c_imaps_port", 993);
+ CtdlSetConfigInt("c_pftcpdict_port", -1);
+ CtdlSetConfigInt("c_managesieve_port", 2020);
+ CtdlSetConfigInt("c_xmpp_c2s_port", 5222);
+ CtdlSetConfigInt("c_xmpp_s2s_port", 5269);
+ CtdlSetConfigInt("c_nntp_port", 119);
+ CtdlSetConfigInt("c_nntps_port", 563);
+
+ /*
+ * Prevent the "new installation, set defaults" behavior from occurring again
+ */
+ CtdlSetConfigLong("c_config_created_or_migrated", (long)time(NULL));
+}
+
+
+/*
+ * Migrate a supplied legacy configuration to the new in-db format.
+ * No individual site should ever have to do this more than once.
+ */
+void migrate_legacy_config(struct legacy_config *lconfig)
+{
+ CtdlSetConfigStr( "c_nodename" , lconfig->c_nodename );
+ CtdlSetConfigStr( "c_fqdn" , lconfig->c_fqdn );
+ CtdlSetConfigStr( "c_humannode" , lconfig->c_humannode );
+ CtdlSetConfigInt( "c_creataide" , lconfig->c_creataide );
+ CtdlSetConfigInt( "c_sleeping" , lconfig->c_sleeping );
+ CtdlSetConfigInt( "c_initax" , lconfig->c_initax );
+ CtdlSetConfigInt( "c_regiscall" , lconfig->c_regiscall );
+ CtdlSetConfigInt( "c_twitdetect" , lconfig->c_twitdetect );
+ CtdlSetConfigStr( "c_twitroom" , lconfig->c_twitroom );
+ CtdlSetConfigStr( "c_moreprompt" , lconfig->c_moreprompt );
+ CtdlSetConfigInt( "c_restrict" , lconfig->c_restrict );
+ CtdlSetConfigStr( "c_site_location" , lconfig->c_site_location );
+ CtdlSetConfigStr( "c_sysadm" , lconfig->c_sysadm );
+ CtdlSetConfigInt( "c_maxsessions" , lconfig->c_maxsessions );
+ CtdlSetConfigStr( "c_ip_addr" , lconfig->c_ip_addr );
+ CtdlSetConfigInt( "c_port_number" , lconfig->c_port_number );
+ CtdlSetConfigInt( "c_ep_mode" , lconfig->c_ep.expire_mode );
+ CtdlSetConfigInt( "c_ep_value" , lconfig->c_ep.expire_value );
+ CtdlSetConfigInt( "c_userpurge" , lconfig->c_userpurge );
+ CtdlSetConfigInt( "c_roompurge" , lconfig->c_roompurge );
+ CtdlSetConfigStr( "c_logpages" , lconfig->c_logpages );
+ CtdlSetConfigInt( "c_createax" , lconfig->c_createax );
+ CtdlSetConfigLong( "c_maxmsglen" , lconfig->c_maxmsglen );
+ CtdlSetConfigInt( "c_min_workers" , lconfig->c_min_workers );
+ CtdlSetConfigInt( "c_max_workers" , lconfig->c_max_workers );
+ CtdlSetConfigInt( "c_pop3_port" , lconfig->c_pop3_port );
+ CtdlSetConfigInt( "c_smtp_port" , lconfig->c_smtp_port );
+ CtdlSetConfigInt( "c_rfc822_strict_from" , lconfig->c_rfc822_strict_from );
+ CtdlSetConfigInt( "c_aide_zap" , lconfig->c_aide_zap );
+ CtdlSetConfigInt( "c_imap_port" , lconfig->c_imap_port );
+ CtdlSetConfigLong( "c_net_freq" , lconfig->c_net_freq );
+ CtdlSetConfigInt( "c_disable_newu" , lconfig->c_disable_newu );
+ CtdlSetConfigInt( "c_enable_fulltext" , lconfig->c_enable_fulltext );
+ CtdlSetConfigStr( "c_baseroom" , lconfig->c_baseroom );
+ CtdlSetConfigStr( "c_aideroom" , lconfig->c_aideroom );
+ CtdlSetConfigInt( "c_purge_hour" , lconfig->c_purge_hour );
+ CtdlSetConfigInt( "c_mbxep_mode" , lconfig->c_mbxep.expire_mode );
+ CtdlSetConfigInt( "c_mbxep_value" , lconfig->c_mbxep.expire_value );
+ CtdlSetConfigStr( "c_ldap_host" , lconfig->c_ldap_host );
+ CtdlSetConfigInt( "c_ldap_port" , lconfig->c_ldap_port );
+ CtdlSetConfigStr( "c_ldap_base_dn" , lconfig->c_ldap_base_dn );
+ CtdlSetConfigStr( "c_ldap_bind_dn" , lconfig->c_ldap_bind_dn );
+ CtdlSetConfigStr( "c_ldap_bind_pw" , lconfig->c_ldap_bind_pw );
+ CtdlSetConfigInt( "c_msa_port" , lconfig->c_msa_port );
+ CtdlSetConfigInt( "c_imaps_port" , lconfig->c_imaps_port );
+ CtdlSetConfigInt( "c_pop3s_port" , lconfig->c_pop3s_port );
+ CtdlSetConfigInt( "c_smtps_port" , lconfig->c_smtps_port );
+ CtdlSetConfigInt( "c_auto_cull" , lconfig->c_auto_cull );
+ CtdlSetConfigInt( "c_allow_spoofing" , lconfig->c_allow_spoofing );
+ CtdlSetConfigInt( "c_journal_email" , lconfig->c_journal_email );
+ CtdlSetConfigInt( "c_journal_pubmsgs" , lconfig->c_journal_pubmsgs );
+ CtdlSetConfigStr( "c_journal_dest" , lconfig->c_journal_dest );
+ CtdlSetConfigStr( "c_default_cal_zone" , lconfig->c_default_cal_zone );
+ CtdlSetConfigInt( "c_pftcpdict_port" , lconfig->c_pftcpdict_port );
+ CtdlSetConfigInt( "c_managesieve_port" , lconfig->c_managesieve_port );
+ CtdlSetConfigInt( "c_auth_mode" , lconfig->c_auth_mode );
+ CtdlSetConfigInt( "c_rbl_at_greeting" , lconfig->c_rbl_at_greeting );
+ CtdlSetConfigStr( "c_master_user" , lconfig->c_master_user );
+ CtdlSetConfigStr( "c_master_pass" , lconfig->c_master_pass );
+ CtdlSetConfigStr( "c_pager_program" , lconfig->c_pager_program );
+ CtdlSetConfigInt( "c_imap_keep_from" , lconfig->c_imap_keep_from );
+ CtdlSetConfigInt( "c_xmpp_c2s_port" , lconfig->c_xmpp_c2s_port );
+ CtdlSetConfigInt( "c_xmpp_s2s_port" , lconfig->c_xmpp_s2s_port );
+ CtdlSetConfigLong( "c_pop3_fetch" , lconfig->c_pop3_fetch );
+ CtdlSetConfigLong( "c_pop3_fastest" , lconfig->c_pop3_fastest );
+ CtdlSetConfigInt( "c_spam_flag_only" , lconfig->c_spam_flag_only );
+ CtdlSetConfigInt( "c_guest_logins" , lconfig->c_guest_logins );
+ CtdlSetConfigInt( "c_nntp_port" , lconfig->c_nntp_port );
+ CtdlSetConfigInt( "c_nntps_port" , lconfig->c_nntps_port );
+}