/*
* This module dumps and/or loads the Citadel database in XML format.
*
- * Copyright (c) 1987-2018 by the citadel.org team
+ * Copyright (c) 1987-2021 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.
#include <pwd.h>
#include <errno.h>
#include <sys/types.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 <time.h>
#include <sys/wait.h>
#include <string.h>
#include <ctype.h>
#include "euidindex.h"
#include "ctdl_module.h"
-#define END_OF_MESSAGE "---eom---dbd---"
-
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.
-
/******************************************************************************
* Code which implements the export appears in this section *
******************************************************************************/
/*
* 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("<user>\n"));
- cprintf("<u_version>%d</u_version>\n", buf->version);
- cprintf("<u_uid>%ld</u_uid>\n", (long)buf->uid);
- client_write(HKEY("<u_password>")); xml_strout(buf->password); client_write(HKEY("</u_password>\n"));
- cprintf("<u_flags>%u</u_flags>\n", buf->flags);
- cprintf("<u_timescalled>%ld</u_timescalled>\n", buf->timescalled);
- cprintf("<u_posted>%ld</u_posted>\n", buf->posted);
- cprintf("<u_axlevel>%d</u_axlevel>\n", buf->axlevel);
- cprintf("<u_usernum>%ld</u_usernum>\n", buf->usernum);
- cprintf("<u_lastcall>%ld</u_lastcall>\n", (long)buf->lastcall);
- cprintf("<u_USuserpurge>%d</u_USuserpurge>\n", buf->USuserpurge);
- client_write(HKEY("<u_fullname>")); xml_strout(buf->fullname); client_write(HKEY("</u_fullname>\n"));
- cprintf("<u_msgnum_bio>%ld</u_msgnum_bio>\n", buf->msgnum_bio);
- cprintf("<u_msgnum_pic>%ld</u_msgnum_pic>\n", buf->msgnum_pic);
+ cprintf("<u_version>%d</u_version>\n", u.version);
+ cprintf("<u_uid>%ld</u_uid>\n", (long)u.uid);
+ client_write(HKEY("<u_password>")); xml_strout(u.password); client_write(HKEY("</u_password>\n"));
+ cprintf("<u_flags>%u</u_flags>\n", u.flags);
+ cprintf("<u_timescalled>%ld</u_timescalled>\n", u.timescalled);
+ cprintf("<u_posted>%ld</u_posted>\n", u.posted);
+ cprintf("<u_axlevel>%d</u_axlevel>\n", u.axlevel);
+ cprintf("<u_usernum>%ld</u_usernum>\n", u.usernum);
+ cprintf("<u_lastcall>%ld</u_lastcall>\n", (long)u.lastcall);
+ cprintf("<u_USuserpurge>%d</u_USuserpurge>\n", u.USuserpurge);
+ client_write(HKEY("<u_fullname>")); xml_strout(u.fullname); client_write(HKEY("</u_fullname>\n"));
+ cprintf("<u_msgnum_bio>%ld</u_msgnum_bio>\n", u.msgnum_bio);
+ cprintf("<u_msgnum_pic>%ld</u_msgnum_pic>\n", u.msgnum_pic);
+ cprintf("<u_emailaddrs>%s</u_emailaddrs>\n", u.emailaddrs);
+ cprintf("<u_msgnum_inboxrules>%ld</u_msgnum_inboxrules>\n", u.msgnum_inboxrules);
+ cprintf("<u_lastproc_inboxrules>%ld</u_lastproc_inboxrules>\n", u.lastproc_inboxrules);
client_write(HKEY("</user>\n"));
}
/* Ok, here we go ... */
- msg = CtdlFetchMessage(msgnum, 1, 0);
+ msg = CtdlFetchMessage(msgnum, 1);
if (msg == NULL) return; /* fail silently */
client_write(HKEY("<message>\n"));
if (Ctx->kill_me == 0) migr_export_visits();
cprintf("<progress>%d</progress>\n", 25);
if (Ctx->kill_me == 0) migr_export_messages();
- client_write(HKEY("</citadel_migrate_data>\n"));
cprintf("<progress>%d</progress>\n", 100);
+ client_write(HKEY("</citadel_migrate_data>\n"));
client_write(HKEY("000\n"));
Ctx->dont_term = 0;
}
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 if (!strcasecmp(el, "u_emailaddrs")) safestrncpy(usbuf.emailaddrs, ChrPtr(migr_chardata), sizeof usbuf.emailaddrs);
+ else if (!strcasecmp(el, "u_msgnum_inboxrules")) usbuf.msgnum_inboxrules = atol(ChrPtr(migr_chardata));
+ else if (!strcasecmp(el, "u_lastproc_inboxrules")) usbuf.lastproc_inboxrules = atol(ChrPtr(migr_chardata));
else return 0;
return 1;
}
* Import begins here
*/
void migr_do_import(void) {
- StrBuf *Buf;
XML_Parser xp;
- int Finished = 0;
+ char buf[SIZ];
unbuffer_output();
migr_chardata = NewStrBufPlain(NULL, SIZ * 20);
migr_MsgData = NewStrBufPlain(NULL, SIZ * 20);
- Buf = NewStrBufPlain(NULL, SIZ);
xp = XML_ParserCreate(NULL);
if (!xp) {
cprintf("%d Failed to create XML parser instance\n", ERROR+INTERNAL_ERROR);
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")) {
- Finished = 1;
- StrBufCutAt(Buf, StrLength(Buf) - 4, NULL);
- }
+ while (client_getln(buf, sizeof buf) >= 0 && strcmp(buf, "000")) {
+ XML_Parse(xp, buf, strlen(buf), 0);
if (server_shutting_down)
break; // Should we break or return?
-
- if (StrLength(Buf) == 0)
- continue;
-
- XML_Parse(xp, ChrPtr(Buf), StrLength(Buf), 0);
- FlushStrBuf(Buf);
}
XML_Parse(xp, "", 0, 1);
XML_ParserFree(xp);
- FreeStrBuf(&Buf);
FreeStrBuf(&migr_chardata);
FreeStrBuf(&migr_MsgData);
rebuild_euid_index();
int migr_restore_message_metadata(long msgnum, int refcount)
{
- CitContext *CCC = MyContext();
struct MetaData smi;
struct CtdlMessage *msg;
char *mptr = NULL;
/* Ok, here we go ... */
- msg = CtdlFetchMessage(msgnum, 1, 0);
+ msg = CtdlFetchMessage(msgnum, 1);
if (msg == NULL) {
return 1;
}
}
}
- CCC->redirect_buffer = PlainMessageBuf;
+ CC->redirect_buffer = PlainMessageBuf;
CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1, QP_EADDR);
- smi.meta_rfc822_length = StrLength(CCC->redirect_buffer);
- CCC->redirect_buffer = NULL;
+ smi.meta_rfc822_length = StrLength(CC->redirect_buffer);
+ CC->redirect_buffer = NULL;
syslog(LOG_INFO,
"Setting message #%ld meta data to: refcount=%d, bodylength=%ld, content-type: %s",