X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fmigrate%2Fserv_migrate.c;h=7c62d34652754747a03a03ab6e433f6e67965d1e;hb=9ffea7c3315046ddcea2589656c13da5f5e0c076;hp=6dc342ff77f04f9b7c7f8e3afb064c334047381b;hpb=8e51bf12d66d11dc51ee5597983623d6d71a0fda;p=citadel.git diff --git a/citadel/modules/migrate/serv_migrate.c b/citadel/modules/migrate/serv_migrate.c index 6dc342ff7..7c62d3465 100644 --- a/citadel/modules/migrate/serv_migrate.c +++ b/citadel/modules/migrate/serv_migrate.c @@ -1,7 +1,7 @@ /* * This module dumps and/or loads the Citadel database in XML format. * - * Copyright (c) 1987-2014 by the citadel.org team + * Copyright (c) 1987-2019 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. @@ -16,8 +16,7 @@ * Explanation of tags: * * 0% nothing - * 1% finished exporting config - * 2% finished exporting control + * 2% finished exporting configuration * 7% finished exporting users * 12% finished exporting openids * 17% finished exporting rooms @@ -61,7 +60,6 @@ #include "database.h" #include "msgbase.h" #include "user_ops.h" -#include "control.h" #include "euidindex.h" #include "ctdl_module.h" @@ -71,6 +69,7 @@ char migr_tempfilename1[PATH_MAX]; char migr_tempfilename2[PATH_MAX]; FILE *migr_global_message_list; int total_msgs = 0; +char *ikey = NULL; // If we're importing a config key we store it here. /****************************************************************************** @@ -78,7 +77,7 @@ int total_msgs = 0; ******************************************************************************/ /* - * Output a string to the client with these characters escaped: & < > + * Output a string to the client with these characters escaped: & < > " ' */ void xml_strout(char *str) { @@ -115,19 +114,27 @@ void xml_strout(char *str) { /* * Export a user record as XML */ -void migr_export_users_backend(struct ctdluser *buf, void *data) { +void migr_export_users_backend(char *username, void *data) { + + struct ctdluser u; + if (CtdlGetUser(&u, username) != 0) { + return; + } + client_write(HKEY("\n")); - cprintf("%d\n", buf->version); - cprintf("%ld\n", (long)buf->uid); - client_write(HKEY("")); xml_strout(buf->password); client_write(HKEY("\n")); - cprintf("%u\n", buf->flags); - cprintf("%ld\n", buf->timescalled); - cprintf("%ld\n", buf->posted); - cprintf("%d\n", buf->axlevel); - cprintf("%ld\n", buf->usernum); - cprintf("%ld\n", (long)buf->lastcall); - cprintf("%d\n", buf->USuserpurge); - client_write(HKEY("")); xml_strout(buf->fullname); client_write(HKEY("\n")); + cprintf("%d\n", u.version); + cprintf("%ld\n", (long)u.uid); + client_write(HKEY("")); xml_strout(u.password); client_write(HKEY("\n")); + cprintf("%u\n", u.flags); + cprintf("%ld\n", u.timescalled); + cprintf("%ld\n", u.posted); + cprintf("%d\n", u.axlevel); + cprintf("%ld\n", u.usernum); + cprintf("%ld\n", (long)u.lastcall); + cprintf("%d\n", u.USuserpurge); + client_write(HKEY("")); xml_strout(u.fullname); client_write(HKEY("\n")); + cprintf("%ld\n", u.msgnum_bio); + cprintf("%ld\n", u.msgnum_pic); client_write(HKEY("\n")); } @@ -156,7 +163,6 @@ void migr_export_rooms_backend(struct ctdlroom *buf, void *data) { xml_strout(buf->QRdirname); client_write(HKEY("\n")); } - cprintf("%ld\n", buf->QRinfo); cprintf("%d\n", buf->QRfloor); cprintf("%ld\n", (long)buf->QRmtime); cprintf("%d\n", buf->QRep.expire_mode); @@ -165,6 +171,8 @@ void migr_export_rooms_backend(struct ctdlroom *buf, void *data) { cprintf("%d\n", buf->QRorder); cprintf("%u\n", buf->QRflags2); cprintf("%d\n", buf->QRdefaultview); + cprintf("%ld\n", buf->msgnum_info); + cprintf("%ld\n", buf->msgnum_pic); client_write(HKEY("\n")); /* message list goes inside this tag */ @@ -196,9 +204,9 @@ void migr_export_rooms(void) { * exporting the message multiple times.) */ snprintf(cmd, sizeof cmd, "sort -n <%s >%s", migr_tempfilename1, migr_tempfilename2); - if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d", errno); snprintf(cmd, sizeof cmd, "uniq <%s >%s", migr_tempfilename2, migr_tempfilename1); - if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d", errno); snprintf(cmd, sizeof cmd, "wc -l %s", migr_tempfilename1); @@ -251,7 +259,6 @@ int is_sequence_set(char *s) { } - /* * Traverse the visits file... */ @@ -328,7 +335,6 @@ void migr_export_message(long msgnum) { cprintf("%d\n", smi.meta_refcount); cprintf("%ld\n", smi.meta_rfc822_length); client_write(HKEY("")); xml_strout(smi.meta_content_type); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(smi.mimetype); client_write(HKEY("\n")); client_write(HKEY("")); CtdlSerializeMessage(&smr, msg); @@ -358,14 +364,13 @@ void migr_export_message(long msgnum) { } - void migr_export_openids(void) { struct cdbdata *cdboi; long usernum; char url[512]; - cdb_rewind(CDB_OPENID); - while (cdboi = cdb_next_item(CDB_OPENID), cdboi != NULL) { + cdb_rewind(CDB_EXTAUTH); + while (cdboi = cdb_next_item(CDB_EXTAUTH), cdboi != NULL) { if (cdboi->len > sizeof(long)) { client_write(HKEY("\n")); memcpy(&usernum, cdboi->ptr, sizeof(long)); @@ -381,6 +386,27 @@ void migr_export_openids(void) { } +void migr_export_configs(void) { + struct cdbdata *cdbcfg; + int keylen = 0; + char *key = NULL; + char *value = NULL; + + cdb_rewind(CDB_CONFIG); + while (cdbcfg = cdb_next_item(CDB_CONFIG), cdbcfg != NULL) { + + keylen = strlen(cdbcfg->ptr); + key = cdbcfg->ptr; + value = cdbcfg->ptr + keylen + 1; + + client_write("", 2); + xml_strout(value); + client_write("\n", 10); + cdb_free(cdbcfg); + } +} void migr_export_messages(void) { @@ -394,7 +420,7 @@ void migr_export_messages(void) { Ctx = CC; migr_global_message_list = fopen(migr_tempfilename1, "r"); if (migr_global_message_list != NULL) { - syslog(LOG_INFO, "Opened %s\n", migr_tempfilename1); + syslog(LOG_INFO, "Opened %s", migr_tempfilename1); while ((Ctx->kill_me == 0) && (fgets(buf, sizeof(buf), migr_global_message_list) != NULL)) { msgnum = atol(buf); @@ -410,16 +436,17 @@ void migr_export_messages(void) { } fclose(migr_global_message_list); } - if (Ctx->kill_me == 0) - syslog(LOG_INFO, "Exported %d messages.\n", count); - else - syslog(LOG_ERR, "Export aborted due to client disconnect! \n"); + if (Ctx->kill_me == 0) { + syslog(LOG_INFO, "Exported %d messages.", count); + } + else { + syslog(LOG_ERR, "Export aborted due to client disconnect!"); + } migr_export_message(-1L); /* This frees the encoding buffer */ } - void migr_do_export(void) { CitContext *Ctx; @@ -432,96 +459,10 @@ void migr_do_export(void) { cprintf("%d\n", REV_LEVEL); cprintf("%d\n", 0); - /* export the config file (this is done using x-macros) */ - client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_nodename); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_fqdn); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_humannode); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_phonenum); client_write(HKEY("\n")); - cprintf("%d\n", config.c_ctdluid); - cprintf("%d\n", config.c_creataide); - cprintf("%d\n", config.c_sleeping); - cprintf("%d\n", config.c_initax); - cprintf("%d\n", config.c_regiscall); - cprintf("%d\n", config.c_twitdetect); - client_write(HKEY("")); xml_strout(config.c_twitroom); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_moreprompt); client_write(HKEY("\n")); - cprintf("%d\n", config.c_restrict); - client_write(HKEY("")); xml_strout(config.c_site_location); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_sysadm); client_write(HKEY("\n")); - cprintf("%d\n", config.c_maxsessions); - client_write(HKEY("")); xml_strout(config.c_ip_addr); client_write(HKEY("\n")); - cprintf("%d\n", config.c_port_number); - cprintf("%d\n", config.c_ep.expire_mode); - cprintf("%d\n", config.c_ep.expire_value); - cprintf("%d\n", config.c_userpurge); - cprintf("%d\n", config.c_roompurge); - client_write(HKEY("")); xml_strout(config.c_logpages); client_write(HKEY("\n")); - cprintf("%d\n", config.c_createax); - cprintf("%ld\n", config.c_maxmsglen); - cprintf("%d\n", config.c_min_workers); - cprintf("%d\n", config.c_max_workers); - cprintf("%d\n", config.c_pop3_port); - cprintf("%d\n", config.c_smtp_port); - cprintf("%d\n", config.c_rfc822_strict_from); - cprintf("%d\n", config.c_aide_zap); - cprintf("%d\n", config.c_imap_port); - cprintf("%ld\n", config.c_net_freq); - cprintf("%d\n", config.c_disable_newu); - cprintf("%d\n", config.c_enable_fulltext); - client_write(HKEY("")); xml_strout(config.c_baseroom); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_aideroom); client_write(HKEY("\n")); - cprintf("%d\n", config.c_purge_hour); - cprintf("%d\n", config.c_mbxep.expire_mode); - cprintf("%d\n", config.c_mbxep.expire_value); - client_write(HKEY("")); xml_strout(config.c_ldap_host); client_write(HKEY("\n")); - cprintf("%d\n", config.c_ldap_port); - client_write(HKEY("")); xml_strout(config.c_ldap_base_dn); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_ldap_bind_dn); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_ldap_bind_pw); client_write(HKEY("\n")); - cprintf("%d\n", config.c_msa_port); - cprintf("%d\n", config.c_imaps_port); - cprintf("%d\n", config.c_pop3s_port); - cprintf("%d\n", config.c_smtps_port); - cprintf("%d\n", config.c_auto_cull); - cprintf("%d\n", config.c_allow_spoofing); - cprintf("%d\n", config.c_journal_email); - cprintf("%d\n", config.c_journal_pubmsgs); - client_write(HKEY("")); xml_strout(config.c_journal_dest); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_default_cal_zone); client_write(HKEY("\n")); - cprintf("%d\n", config.c_pftcpdict_port); - cprintf("%d\n", config.c_managesieve_port); - cprintf("%d\n", config.c_auth_mode); - client_write(HKEY("")); xml_strout(config.c_funambol_host); client_write(HKEY("\n")); - cprintf("%d\n", config.c_funambol_port); - client_write(HKEY("")); xml_strout(config.c_funambol_source); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_funambol_auth); client_write(HKEY("\n")); - cprintf("%d\n", config.c_rbl_at_greeting); - client_write(HKEY("")); xml_strout(config.c_master_user); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_master_pass); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(config.c_pager_program); client_write(HKEY("\n")); - cprintf("%d\n", config.c_imap_keep_from); - cprintf("%d\n", config.c_xmpp_c2s_port); - cprintf("%d\n", config.c_xmpp_s2s_port); - cprintf("%ld\n", config.c_pop3_fetch); - cprintf("%ld\n", config.c_pop3_fastest); - cprintf("%d\n", config.c_spam_flag_only); - cprintf("%d\n", config.c_nntp_port); - cprintf("%d\n", config.c_nntps_port); - client_write(HKEY("\n")); - cprintf("%d\n", 1); - - /* Export the control file */ - get_control(); - client_write(HKEY("\n")); - cprintf("%ld\n", CitControl.MMhighest); - cprintf("%u\n", CitControl.MMflags); - cprintf("%ld\n", CitControl.MMnextuser); - cprintf("%ld\n", CitControl.MMnextroom); - cprintf("%d\n", CitControl.version); - client_write(HKEY("\n")); + /* export the configuration database */ + migr_export_configs(); cprintf("%d\n", 2); - + if (Ctx->kill_me == 0) migr_export_users(); cprintf("%d\n", 7); if (Ctx->kill_me == 0) migr_export_openids(); @@ -540,8 +481,6 @@ void migr_do_export(void) { } - - /****************************************************************************** * Import code * * Here's the code that implements the import side. It's going to end up * @@ -598,7 +537,7 @@ void migr_xml_start(void *data, const char *el, const char **attr) { } if (citadel_migrate_data != 1) { - syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n", el); + syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!", el); return; } @@ -616,105 +555,18 @@ void migr_xml_start(void *data, const char *el, const char **attr) { memset(&smi, 0, sizeof (struct MetaData)); import_msgnum = 0; } - -} - - -int migr_config(void *data, const char *el) -{ - if (!strcasecmp(el, "c_nodename")) SET_CFGSTRBUF(c_nodename, migr_chardata); - else if (!strcasecmp(el, "c_fqdn")) SET_CFGSTRBUF(c_fqdn, migr_chardata); - else if (!strcasecmp(el, "c_humannode")) SET_CFGSTRBUF(c_humannode, migr_chardata); - else if (!strcasecmp(el, "c_phonenum")) SET_CFGSTRBUF(c_phonenum, migr_chardata); - else if (!strcasecmp(el, "c_ctdluid")) config.c_ctdluid = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_creataide")) config.c_creataide = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_sleeping")) config.c_sleeping = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_initax")) config.c_initax = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_regiscall")) config.c_regiscall = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_twitdetect")) config.c_twitdetect = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_twitroom")) SET_CFGSTRBUF(c_twitroom, migr_chardata); - else if (!strcasecmp(el, "c_moreprompt")) SET_CFGSTRBUF(c_moreprompt, migr_chardata); - else if (!strcasecmp(el, "c_restrict")) config.c_restrict = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_site_location")) SET_CFGSTRBUF(c_site_location, migr_chardata); - else if (!strcasecmp(el, "c_sysadm")) SET_CFGSTRBUF(c_sysadm, migr_chardata); - else if (!strcasecmp(el, "c_maxsessions")) config.c_maxsessions = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_ip_addr")) SET_CFGSTRBUF(c_ip_addr, migr_chardata); - else if (!strcasecmp(el, "c_port_number")) config.c_port_number = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_ep_expire_mode")) config.c_ep.expire_mode = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_ep_expire_value")) config.c_ep.expire_value = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_userpurge")) config.c_userpurge = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_roompurge")) config.c_roompurge = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_logpages")) SET_CFGSTRBUF(c_logpages, migr_chardata); - else if (!strcasecmp(el, "c_createax")) config.c_createax = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_maxmsglen")) config.c_maxmsglen = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_min_workers")) config.c_min_workers = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_max_workers")) config.c_max_workers = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_pop3_port")) config.c_pop3_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_smtp_port")) config.c_smtp_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_rfc822_strict_from")) config.c_rfc822_strict_from = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_aide_zap")) config.c_aide_zap = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_imap_port")) config.c_imap_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_net_freq")) config.c_net_freq = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_disable_newu")) config.c_disable_newu = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_enable_fulltext")) config.c_enable_fulltext = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_baseroom")) SET_CFGSTRBUF(c_baseroom, migr_chardata); - else if (!strcasecmp(el, "c_aideroom")) SET_CFGSTRBUF(c_aideroom, migr_chardata); - else if (!strcasecmp(el, "c_purge_hour")) config.c_purge_hour = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_mbxep_expire_mode")) config.c_mbxep.expire_mode = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_mbxep_expire_value")) config.c_mbxep.expire_value = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_ldap_host")) SET_CFGSTRBUF(c_ldap_host, migr_chardata); - else if (!strcasecmp(el, "c_ldap_port")) config.c_ldap_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_ldap_base_dn")) SET_CFGSTRBUF(c_ldap_base_dn, migr_chardata); - else if (!strcasecmp(el, "c_ldap_bind_dn")) SET_CFGSTRBUF(c_ldap_bind_dn, migr_chardata); - else if (!strcasecmp(el, "c_ldap_bind_pw")) SET_CFGSTRBUF(c_ldap_bind_pw, migr_chardata); - else if (!strcasecmp(el, "c_msa_port")) config.c_msa_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_imaps_port")) config.c_imaps_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_pop3s_port")) config.c_pop3s_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_smtps_port")) config.c_smtps_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_auto_cull")) config.c_auto_cull = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_allow_spoofing")) config.c_allow_spoofing = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_journal_email")) config.c_journal_email = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_journal_pubmsgs")) config.c_journal_pubmsgs = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_journal_dest")) SET_CFGSTRBUF(c_journal_dest, migr_chardata); - else if (!strcasecmp(el, "c_default_cal_zone")) SET_CFGSTRBUF(c_default_cal_zone, migr_chardata); - else if (!strcasecmp(el, "c_pftcpdict_port")) config.c_pftcpdict_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_managesieve_port")) config.c_managesieve_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_auth_mode")) config.c_auth_mode = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_funambol_host")) SET_CFGSTRBUF(c_funambol_host, migr_chardata); - else if (!strcasecmp(el, "c_funambol_port")) config.c_funambol_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_funambol_source")) SET_CFGSTRBUF(c_funambol_source, migr_chardata); - else if (!strcasecmp(el, "c_funambol_auth")) SET_CFGSTRBUF(c_funambol_auth, migr_chardata); - else if (!strcasecmp(el, "c_rbl_at_greeting")) config.c_rbl_at_greeting = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_master_user")) SET_CFGSTRBUF(c_master_user, migr_chardata); - else if (!strcasecmp(el, "c_master_pass")) SET_CFGSTRBUF(c_master_pass, migr_chardata); - else if (!strcasecmp(el, "c_pager_program")) SET_CFGSTRBUF(c_pager_program, migr_chardata); - else if (!strcasecmp(el, "c_imap_keep_from")) config.c_imap_keep_from = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_xmpp_c2s_port")) config.c_xmpp_c2s_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_xmpp_s2s_port")) config.c_xmpp_s2s_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_pop3_fetch")) config.c_pop3_fetch = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_pop3_fastest")) config.c_pop3_fastest = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_spam_flag_only")) config.c_spam_flag_only = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_nntp_port")) config.c_nntp_port = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "c_nntps_port")) config.c_nntps_port = atoi(ChrPtr(migr_chardata)); - else return 0; - return 1; /* Found above...*/ -} - -int migr_controlrecord(void *data, const char *el) -{ - if (!strcasecmp(el, "control_highest")) CitControl.MMhighest = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "control_flags")) CitControl.MMflags = atoi(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "control_nextuser")) CitControl.MMnextuser = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "control_nextroom")) CitControl.MMnextroom = atol(ChrPtr(migr_chardata)); - else if (!strcasecmp(el, "control_version")) CitControl.version = atoi(ChrPtr(migr_chardata)); - - else if (!strcasecmp(el, "control")) { - CitControl.MMfulltext = (-1L); /* always flush */ - put_control(); - syslog(LOG_INFO, "Completed import of control record\n"); + else if (!strcasecmp(el, "config")) { + if (ikey != NULL) { + free(ikey); + ikey = NULL; + } + while (*attr) { + if (!strcasecmp(attr[0], "key")) { + ikey = strdup(attr[1]); + } + attr += 2; + } } - else return 0; - return 1; } @@ -732,20 +584,22 @@ int migr_userrecord(void *data, const char *el) else if (!strcasecmp(el, "u_lastcall")) usbuf.lastcall = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "u_USuserpurge")) usbuf.USuserpurge = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "u_fullname")) safestrncpy(usbuf.fullname, ChrPtr(migr_chardata), sizeof usbuf.fullname); + else if (!strcasecmp(el, "u_msgnum_bio")) usbuf.msgnum_bio = atol(ChrPtr(migr_chardata)); + else if (!strcasecmp(el, "u_msgnum_pic")) usbuf.msgnum_pic = atol(ChrPtr(migr_chardata)); else return 0; return 1; } + int migr_roomrecord(void *data, const char *el) { - if (!strcasecmp(el, "QRname")) safestrncpy(qrbuf.QRname, ChrPtr(migr_chardata), sizeof qrbuf.QRname); + if (!strcasecmp(el, "QRname")) safestrncpy(qrbuf.QRname, ChrPtr(migr_chardata), sizeof qrbuf.QRname); else if (!strcasecmp(el, "QRpasswd")) safestrncpy(qrbuf.QRpasswd, ChrPtr(migr_chardata), sizeof qrbuf.QRpasswd); else if (!strcasecmp(el, "QRroomaide")) qrbuf.QRroomaide = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRhighest")) qrbuf.QRhighest = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRgen")) qrbuf.QRgen = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRflags")) qrbuf.QRflags = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRdirname")) safestrncpy(qrbuf.QRdirname, ChrPtr(migr_chardata), sizeof qrbuf.QRdirname); - else if (!strcasecmp(el, "QRinfo")) qrbuf.QRinfo = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRfloor")) qrbuf.QRfloor = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRmtime")) qrbuf.QRmtime = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRexpire_mode")) qrbuf.QRep.expire_mode = atoi(ChrPtr(migr_chardata)); @@ -754,13 +608,16 @@ int migr_roomrecord(void *data, const char *el) else if (!strcasecmp(el, "QRorder")) qrbuf.QRorder = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRflags2")) qrbuf.QRflags2 = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRdefaultview")) qrbuf.QRdefaultview = atoi(ChrPtr(migr_chardata)); + else if (!strcasecmp(el, "msgnum_info")) qrbuf.msgnum_info = atol(ChrPtr(migr_chardata)); + else if (!strcasecmp(el, "msgnum_pic")) qrbuf.msgnum_pic = atol(ChrPtr(migr_chardata)); else return 0; return 1; } + int migr_floorrecord(void *data, const char *el) { - if (!strcasecmp(el, "f_num")) floornum = atoi(ChrPtr(migr_chardata)); + if (!strcasecmp(el, "f_num")) floornum = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "f_flags")) flbuf.f_flags = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "f_name")) safestrncpy(flbuf.f_name, ChrPtr(migr_chardata), sizeof flbuf.f_name); else if (!strcasecmp(el, "f_ref_count")) flbuf.f_ref_count = atoi(ChrPtr(migr_chardata)); @@ -770,6 +627,7 @@ int migr_floorrecord(void *data, const char *el) return 1; } + int migr_visitrecord(void *data, const char *el) { if (!strcasecmp(el, "v_roomnum")) vbuf.v_roomnum = atol(ChrPtr(migr_chardata)); @@ -796,6 +654,8 @@ int migr_visitrecord(void *data, const char *el) else return 0; return 1; } + + void migr_xml_end(void *data, const char *el) { const char *ptr; @@ -811,7 +671,7 @@ void migr_xml_end(void *data, const char *el) } if (citadel_migrate_data != 1) { - syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n", el); + syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!", el); return; } @@ -819,27 +679,27 @@ void migr_xml_end(void *data, const char *el) /*** CONFIG ***/ - if (!strcasecmp(el, "config")) { - config.c_enable_fulltext = 0; /* always disable */ - put_config(); - syslog(LOG_INFO, "Completed import of server configuration\n"); + if (!strcasecmp(el, "config")) + { + syslog(LOG_DEBUG, "Imported config key=%s", ikey); + + if (ikey != NULL) { + CtdlSetConfigStr(ikey, (char *)ChrPtr(migr_chardata)); + free(ikey); + ikey = NULL; + } + else { + syslog(LOG_INFO, "Closed a tag but no key name was supplied."); + } } - else if ((!strncasecmp(el, HKEY("c_"))) && - migr_config(data, el)) - ; /* Nothing to do anymore */ - - /*** CONTROL ***/ - else if ((!strncasecmp(el, HKEY("control"))) && - migr_controlrecord(data, el)) - ; /* Nothing to do anymore */ /*** USER ***/ else if ((!strncasecmp(el, HKEY("u_"))) && migr_userrecord(data, el)) ; /* Nothing to do anymore */ else if (!strcasecmp(el, "user")) { CtdlPutUser(&usbuf); - syslog(LOG_INFO, "Imported user: %s\n", usbuf.fullname); + syslog(LOG_INFO, "Imported user: %s", usbuf.fullname); } /*** OPENID ***/ @@ -854,9 +714,9 @@ void migr_xml_end(void *data, const char *el) oid_data = malloc(oid_data_len); memcpy(oid_data, &openid_usernum, sizeof(long)); memcpy(&oid_data[sizeof(long)], openid_url, strlen(openid_url) + 1); - cdb_store(CDB_OPENID, openid_url, strlen(openid_url), oid_data, oid_data_len); + cdb_store(CDB_EXTAUTH, openid_url, strlen(openid_url), oid_data, oid_data_len); free(oid_data); - syslog(LOG_INFO, "Imported OpenID: %s (%ld)\n", openid_url, openid_usernum); + syslog(LOG_INFO, "Imported OpenID: %s (%ld)", openid_url, openid_usernum); } /*** ROOM ***/ @@ -865,7 +725,7 @@ void migr_xml_end(void *data, const char *el) ; /* Nothing to do anymore */ else if (!strcasecmp(el, "room")) { CtdlPutRoom(&qrbuf); - syslog(LOG_INFO, "Imported room: %s\n", qrbuf.QRname); + syslog(LOG_INFO, "Imported room: %s", qrbuf.QRname); } /*** ROOM MESSAGE POINTERS ***/ @@ -878,7 +738,7 @@ void migr_xml_end(void *data, const char *el) msglist_alloc = 1000; msglist = malloc(sizeof(long) * msglist_alloc); - syslog(LOG_DEBUG, "Message list for: %s\n", FRname); + syslog(LOG_DEBUG, "Message list for: %s", FRname); ptr = ChrPtr(migr_chardata); while (*ptr != 0) { @@ -906,7 +766,7 @@ void migr_xml_end(void *data, const char *el) free(msglist); msglist = NULL; msglist_alloc = 0; - syslog(LOG_DEBUG, "Imported %d messages.\n", msgcount); + syslog(LOG_DEBUG, "Imported %d messages.", msgcount); if (server_shutting_down) { return; } @@ -919,16 +779,16 @@ void migr_xml_end(void *data, const char *el) else if (!strcasecmp(el, "floor")) { CtdlPutFloor(&flbuf, floornum); - syslog(LOG_INFO, "Imported floor #%d (%s)\n", floornum, flbuf.f_name); + syslog(LOG_INFO, "Imported floor #%d (%s)", floornum, flbuf.f_name); } /*** VISITS ***/ - else if ((!strncasecmp(el, HKEY("v_"))) && - migr_visitrecord(data, el)) + else if ((!strncasecmp(el, HKEY("v_"))) && migr_visitrecord(data, el)) { ; /* Nothing to do anymore */ + } else if (!strcasecmp(el, "visit")) { put_visit(&vbuf); - syslog(LOG_INFO, "Imported visit: %ld/%ld/%ld\n", vbuf.v_roomnum, vbuf.v_roomgen, vbuf.v_usernum); + syslog(LOG_INFO, "Imported visit: %ld/%ld/%ld", vbuf.v_roomnum, vbuf.v_roomgen, vbuf.v_usernum); } /*** MESSAGES ***/ @@ -937,7 +797,6 @@ void migr_xml_end(void *data, const char *el) else if (!strcasecmp(el, "msg_meta_refcount")) smi.meta_refcount = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "msg_meta_rfc822_length")) smi.meta_rfc822_length = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "msg_meta_content_type")) safestrncpy(smi.meta_content_type, ChrPtr(migr_chardata), sizeof smi.meta_content_type); - else if (!strcasecmp(el, "msg_mimetype")) safestrncpy(smi.mimetype, ChrPtr(migr_chardata), sizeof smi.mimetype); else if (!strcasecmp(el, "msg_text")) { @@ -962,14 +821,14 @@ void migr_xml_end(void *data, const char *el) } syslog(LOG_INFO, - "%s message #%ld, size=%d, refcount=%d, bodylength=%ld, content-type: %s / %s \n", + "%s message #%ld, size=%d, refcount=%d, bodylength=%ld, content-type: %s", (rc!= 0)?"failed to import ":"Imported ", import_msgnum, StrLength(migr_MsgData), smi.meta_refcount, smi.meta_rfc822_length, - smi.meta_content_type, - smi.mimetype); + smi.meta_content_type + ); memset(&smi, 0, sizeof(smi)); } @@ -979,8 +838,6 @@ void migr_xml_end(void *data, const char *el) } - - /* * Import begins here */ @@ -1009,9 +866,7 @@ void migr_do_import(void) { client_set_inbound_buf(SIZ * 10); while (!Finished && client_read_random_blob(Buf, -1) >= 0) { - if ((StrLength(Buf) > 4) && - !strcmp(ChrPtr(Buf) + StrLength(Buf) - 4, "000\n")) - { + if ((StrLength(Buf) > 4) && !strcmp(ChrPtr(Buf) + StrLength(Buf) - 4, "000\n")) { Finished = 1; StrBufCutAt(Buf, StrLength(Buf) - 4, NULL); } @@ -1032,11 +887,11 @@ void migr_do_import(void) { FreeStrBuf(&migr_MsgData); rebuild_euid_index(); rebuild_usersbynumber(); + CtdlSetConfigInt("MM_fulltext_wordbreaker", -1); // Set an invalid wordbreaker to force re-indexing CC->dont_term = 0; } - /****************************************************************************** * Dispatcher, Common code * ******************************************************************************/ @@ -1045,17 +900,13 @@ void migr_do_import(void) { */ void migr_do_listdirs(void) { cprintf("%d Don't forget these:\n", LISTING_FOLLOWS); - cprintf("bio|%s\n", ctdl_bio_dir); cprintf("files|%s\n", ctdl_file_dir); - cprintf("userpics|%s\n", ctdl_usrpic_dir); cprintf("messages|%s\n", ctdl_message_dir); - cprintf("netconfigs|%s\n", ctdl_netcfg_dir); cprintf("keys|%s\n", ctdl_key_dir); - cprintf("images|%s\n", ctdl_image_dir); - cprintf("info|%s\n", ctdl_info_dir); cprintf("000\n"); } + /****************************************************************************** * Repair database integrity * ******************************************************************************/ @@ -1126,14 +977,13 @@ int migr_restore_message_metadata(long msgnum, int refcount) smi.meta_rfc822_length = StrLength(CCC->redirect_buffer); CCC->redirect_buffer = NULL; - syslog(LOG_INFO, - "Setting message #%ld meta data to: refcount=%d, bodylength=%ld, content-type: %s / %s \n", + "Setting message #%ld meta data to: refcount=%d, bodylength=%ld, content-type: %s", smi.meta_msgnum, smi.meta_refcount, smi.meta_rfc822_length, - smi.meta_content_type, - smi.mimetype); + smi.meta_content_type + ); PutMetaData(&smi); @@ -1142,6 +992,7 @@ int migr_restore_message_metadata(long msgnum, int refcount) return 0; } + void migr_check_room_msg(long msgnum, void *userdata) { fprintf(migr_global_message_list, "%ld %s\n", msgnum, CC->room.QRname); } @@ -1155,6 +1006,7 @@ void migr_check_rooms_backend(struct ctdlroom *buf, void *data) { CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL, migr_check_room_msg, NULL); } + void RemoveMessagesFromRooms(StrBuf *RoomNameVec, long msgnum) { struct MetaData smi; const char *Pos = NULL; @@ -1167,13 +1019,14 @@ void RemoveMessagesFromRooms(StrBuf *RoomNameVec, long msgnum) { CtdlDeleteMessages(ChrPtr(oneRoom), &msgnum, 1, ""); }; GetMetaData(&smi, msgnum); - TDAP_AdjRefCount(msgnum, -smi.meta_refcount); + AdjRefCount(msgnum, -smi.meta_refcount); } + void migr_do_restore_meta(void) { char buf[SIZ]; int failGetMessage; - long msgnum; + long msgnum = 0; int lastnum = 0; int refcount = 0; CitContext *Ctx; @@ -1194,13 +1047,13 @@ void migr_do_restore_meta(void) { * exporting the message multiple times.) */ snprintf(cmd, sizeof cmd, "sort -n <%s >%s", migr_tempfilename1, migr_tempfilename2); - if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d", errno); RoomNames = NewStrBuf(); Ctx = CC; migr_global_message_list = fopen(migr_tempfilename2, "r"); if (migr_global_message_list != NULL) { - syslog(LOG_INFO, "Opened %s\n", migr_tempfilename1); + syslog(LOG_INFO, "Opened %s", migr_tempfilename1); while ((Ctx->kill_me == 0) && (fgets(buf, sizeof(buf), migr_global_message_list) != NULL)) { msgnum = atol(buf); @@ -1217,14 +1070,16 @@ void migr_do_restore_meta(void) { } refcount = 1; lastnum = msgnum; - if (prn != NULL) + if (prn != NULL) { StrBufPlain(RoomNames, prn + 1, -1); + } StrBufTrim(RoomNames); } else { if (prn != NULL) { - if (StrLength(RoomNames) > 0) + if (StrLength(RoomNames) > 0) { StrBufAppendBufPlain(RoomNames, HKEY("|"), 0); + } StrBufAppendBufPlain(RoomNames, prn, -1, 1); StrBufTrim(RoomNames); } @@ -1245,8 +1100,6 @@ void migr_do_restore_meta(void) { } - - /****************************************************************************** * Dispatcher, Common code * ******************************************************************************/ @@ -1255,8 +1108,7 @@ void cmd_migr(char *cmdbuf) { if (CtdlAccessCheck(ac_internal)) return; - if (CtdlTrySingleUser()) - { + if (CtdlTrySingleUser()) { CtdlDisableHouseKeeping(); CtdlMakeTempFileName(migr_tempfilename1, sizeof migr_tempfilename1); CtdlMakeTempFileName(migr_tempfilename2, sizeof migr_tempfilename2); @@ -1284,12 +1136,12 @@ void cmd_migr(char *cmdbuf) { CtdlEnableHouseKeeping(); CtdlEndSingleUser(); } - else - { + else { cprintf("%d The migrator is already running.\n", ERROR + RESOURCE_BUSY); } } + /****************************************************************************** * Module Hook * ******************************************************************************/