X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fcontrol.c;h=b79689b08e12d68a5c27dc3209fc977fbb8a14f1;hp=e14d4f29b4568c5079a310c2cde77562b61ee260;hb=e21b689461215d6012ff62d76c2da73d4ffeb33a;hpb=cc6ff1d17f37d670330001a9d4dd91eef7044c9b diff --git a/citadel/control.c b/citadel/control.c index e14d4f29b..b79689b08 100644 --- a/citadel/control.c +++ b/citadel/control.c @@ -1,7 +1,7 @@ /* * This module handles states which are global to the entire server. * - * Copyright (c) 1987-2015 by the citadel.org team + * Copyright (c) 1987-2017 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. @@ -24,7 +24,9 @@ long control_highest_user = 0; /* - * This is the control record for the message base... + * This is the legacy "control record" format for the message base. If found + * on disk, its contents will be migrated into the system configuration. Never + * change this. */ struct legacy_ctrl_format { long MMhighest; /* highest message number in file */ @@ -38,9 +40,8 @@ struct legacy_ctrl_format { }; - /* - * callback to get highest room number when rebuilding control file + * Callback to get highest room number when rebuilding message base metadata */ void control_find_highest(struct ctdlroom *qrbuf, void *data) { @@ -82,10 +83,10 @@ void control_find_highest(struct ctdlroom *qrbuf, void *data) } cdb_free(cdbfr); if (room_fixed) { - syslog(LOG_INFO, "Control record checking....Fixed room counter\n"); + syslog(LOG_INFO, "control: fixed room counter"); } if (message_fixed) { - syslog(LOG_INFO, "Control record checking....Fixed message count\n"); + syslog(LOG_INFO, "control: fixed message count"); } return; } @@ -105,7 +106,7 @@ void control_find_user (struct ctdluser *EachUser, void *out_data) user_fixed = 1; } if(user_fixed) - syslog(LOG_INFO, "Control record checking....Fixed user count\n"); + syslog(LOG_INFO, "control: fixed user count"); } @@ -120,7 +121,7 @@ void migrate_legacy_control_record(void) fp = fopen(file_citadel_control, "rb+"); if (fp != NULL) { - syslog(LOG_INFO, "Legacy format control record found -- importing to db"); + syslog(LOG_INFO, "control: legacy format record found -- importing to db"); fread(&c, sizeof(struct legacy_ctrl_format), 1, fp); CtdlSetConfigLong( "MMhighest", c.MMhighest); @@ -146,13 +147,12 @@ void migrate_legacy_control_record(void) */ void check_control(void) { - syslog(LOG_INFO, "Sanity checking the recorded highest message, user, and room numbers\n"); + syslog(LOG_INFO, "control: sanity checking the recorded highest message, user, and room numbers"); CtdlForEachRoom(control_find_highest, NULL); ForEachUser(control_find_user, NULL); } - /* * get_new_message_number() - Obtain a new, unique ID to be used for a message. */ @@ -197,7 +197,6 @@ long get_new_user_number(void) } - /* * get_new_room_number() - Obtain a new, unique ID to be used for a room. */ @@ -213,7 +212,6 @@ long get_new_room_number(void) } - /* * Helper function for cmd_conf() to handle boolean values */ @@ -245,7 +243,8 @@ void cmd_conf(char *argbuf) extract_token(cmd, argbuf, 0, '|', sizeof cmd); - // CONF GET - retrieve system configuration in legacy format (deprecated) + // CONF GET - retrieve system configuration in legacy format + // This is deprecated; please do not add fields or change their order. if (!strcasecmp(cmd, "GET")) { cprintf("%d Configuration...\n", LISTING_FOLLOWS); cprintf("%s\n", CtdlGetConfigStr("c_nodename")); @@ -309,10 +308,10 @@ void cmd_conf(char *argbuf) cprintf("%d\n", CtdlGetConfigInt("c_pftcpdict_port")); cprintf("%d\n", CtdlGetConfigInt("c_managesieve_port")); cprintf("%d\n", CtdlGetConfigInt("c_auth_mode")); - cprintf("%s\n", CtdlGetConfigStr("c_funambol_host")); - cprintf("%d\n", CtdlGetConfigInt("c_funambol_port")); - cprintf("%s\n", CtdlGetConfigStr("c_funambol_source")); - cprintf("%s\n", CtdlGetConfigStr("c_funambol_auth")); + cprintf("\n"); + cprintf("\n"); + cprintf("\n"); + cprintf("\n"); cprintf("%d\n", CtdlGetConfigInt("c_rbl_at_greeting")); cprintf("%s\n", CtdlGetConfigStr("c_master_user")); cprintf("%s\n", CtdlGetConfigStr("c_master_pass")); @@ -331,7 +330,8 @@ void cmd_conf(char *argbuf) cprintf("000\n"); } - // CONF SET - set system configuration in legacy format (really deprecated) + // CONF SET - set system configuration in legacy format + // This is deprecated; please do not add fields or change their order. else if (!strcasecmp(cmd, "SET")) { unbuffer_output(); cprintf("%d Send configuration...\n", SEND_LISTING); @@ -351,7 +351,7 @@ void cmd_conf(char *argbuf) /* placeholder -- field no longer in use */ break; case 4: - CtdlSetConfigInt("c_creataide", atoi(buf)); + CtdlSetConfigInt("c_creataide", confbool(buf)); break; case 5: CtdlSetConfigInt("c_sleeping", atoi(buf)); @@ -378,10 +378,10 @@ void cmd_conf(char *argbuf) CtdlSetConfigInt("c_restrict", confbool(buf)); break; case 12: - CtdlSetConfigInt("c_site_location", confbool(buf)); + CtdlSetConfigStr("c_site_location", buf); break; case 13: - CtdlSetConfigInt("c_sysadm", confbool(buf)); + CtdlSetConfigStr("c_sysadm", buf); break; case 14: i = atoi(buf); @@ -518,16 +518,16 @@ void cmd_conf(char *argbuf) CtdlSetConfigInt("c_auth_mode", atoi(buf)); break; case 53: - CtdlSetConfigStr("c_funambol_host", buf); + /* niu */ break; case 54: - CtdlSetConfigInt("c_funambol_port", atoi(buf)); + /* niu */ break; case 55: - CtdlSetConfigStr("c_funambol_source", buf); + /* niu */ break; case 56: - CtdlSetConfigStr("c_funambol_auth", buf); + /* niu */ break; case 57: CtdlSetConfigInt("c_rbl_at_greeting", confbool(buf)); @@ -581,7 +581,7 @@ void cmd_conf(char *argbuf) "The global system configuration has been edited by %s.\n", (CC->logged_in ? CC->curr_user : "an administrator") ); - CtdlAideMessage(buf,"Citadel Configuration Manager Message"); + CtdlAideMessage(buf, "Citadel Configuration Manager Message"); if (!IsEmptyStr(CtdlGetConfigStr("c_logpages"))) CtdlCreateRoom(CtdlGetConfigStr("c_logpages"), 3, "", 0, 1, 1, VIEW_BBS); @@ -619,22 +619,29 @@ void cmd_conf(char *argbuf) extract_token(confname, argbuf, 1, '|', sizeof confname); unbuffer_output(); cprintf("%d %s\n", SEND_LISTING, confname); - confptr = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0, 0); + confptr = CtdlReadMessageBody(HKEY("000"), CtdlGetConfigLong("c_maxmsglen"), NULL, 0); CtdlPutSysConfig(confname, confptr); free(confptr); } - else if (!strcasecmp(cmd, "GETVAL")) { + // CONF GETVAL - retrieve configuration variables from the database + // CONF LOADVAL - same thing but can handle variables bigger than 1 KB + else if ( (!strcasecmp(cmd, "GETVAL")) || (!strcasecmp(cmd, "LOADVAL")) ) { extract_token(confname, argbuf, 1, '|', sizeof confname); char *v = CtdlGetConfigStr(confname); - if (v) { + if ( (v) && (!strcasecmp(cmd, "GETVAL")) ) { cprintf("%d %s|\n", CIT_OK, v); } + else if ( (v) && (!strcasecmp(cmd, "LOADVAL")) ) { + cprintf("%d %d\n", BINARY_FOLLOWS, (int)strlen(v)); + client_write(v, strlen(v)); + } else { cprintf("%d |\n", ERROR); } } + // CONF PUTVAL - store configuration variables in the database else if (!strcasecmp(cmd, "PUTVAL")) { if (num_tokens(argbuf, '|') < 3) { cprintf("%d name and value required\n", ERROR); @@ -647,11 +654,50 @@ void cmd_conf(char *argbuf) } } + // CONF STOREVAL - store configuration variables in the database bigger than 1 KB + else if (!strcasecmp(cmd, "STOREVAL")) { + if (num_tokens(argbuf, '|') < 3) { + cprintf("%d name and length required\n", ERROR); + } + else { + extract_token(confname, argbuf, 1, '|', sizeof confname); + int bytes = extract_int(argbuf, 2); + char *valbuf = malloc(bytes + 1); + cprintf("%d %d\n", SEND_BINARY, bytes); + client_read(valbuf, bytes); + valbuf[bytes+1] = 0; + CtdlSetConfigStr(confname, valbuf); + free(valbuf); + } + } + + // CONF LISTVAL - list configuration variables in the database and their values + else if (!strcasecmp(cmd, "LISTVAL")) { + struct cdbdata *cdbcfg; + int keylen = 0; + char *key = NULL; + char *value = NULL; + + cprintf("%d all configuration variables\n", LISTING_FOLLOWS); + cdb_rewind(CDB_CONFIG); + while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg != NULL) { + if (cdbcfg->len < 1020) { + keylen = strlen(cdbcfg->ptr); + key = cdbcfg->ptr; + value = cdbcfg->ptr + keylen + 1; + cprintf("%s|%s\n", key, value); + } + cdb_free(cdbcfg); + } + cprintf("000\n"); + } + else { cprintf("%d Illegal option(s) specified.\n", ERROR + ILLEGAL_VALUE); } } + typedef struct __ConfType { ConstStr Name; long Type;