From d3d3ae30c552f49d60565170f9d65b924683fdd1 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 14 Jul 2023 11:22:19 -0900 Subject: [PATCH] Now I have a machine gun that can write ctdluser records. Ho-ho-ho. --- citadel/Makefile | 4 +- citadel/server/makeuserkey.h | 1 + citadel/server/modules/upgrade/serv_upgrade.c | 1 + citadel/server/user_ops.c | 1 + citadel/server/user_ops.h | 1 - citadel/utils/ctdlload.c | 70 ++++++++++++++++++- 6 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 citadel/server/makeuserkey.h diff --git a/citadel/Makefile b/citadel/Makefile index fca990be4..edd3d0282 100644 --- a/citadel/Makefile +++ b/citadel/Makefile @@ -52,8 +52,8 @@ chkpwd: utils/chkpwd.c utils/auth.c utils/*.h server/*.h ctdldump: utils/ctdldump.c utils/*.h server/*.h cc ${CFLAGS} ${LDFLAGS} utils/ctdldump.c -lcitadel -lz -ldb -o ctdldump -ctdlload: utils/ctdlload.c utils/*.h server/*.h - cc ${CFLAGS} ${LDFLAGS} utils/ctdlload.c -lcitadel -lz -ldb -o ctdlload +ctdlload: utils/ctdlload.c server/makeuserkey.c utils/*.h server/*.h + cc ${CFLAGS} ${LDFLAGS} utils/ctdlload.c server/makeuserkey.c -lcitadel -lz -ldb -o ctdlload config.mk: configure ./configure diff --git a/citadel/server/makeuserkey.h b/citadel/server/makeuserkey.h new file mode 100644 index 000000000..382276b92 --- /dev/null +++ b/citadel/server/makeuserkey.h @@ -0,0 +1 @@ +void makeuserkey(char *key, const char *username); diff --git a/citadel/server/modules/upgrade/serv_upgrade.c b/citadel/server/modules/upgrade/serv_upgrade.c index 2652cefcc..e08c65d17 100644 --- a/citadel/server/modules/upgrade/serv_upgrade.c +++ b/citadel/server/modules/upgrade/serv_upgrade.c @@ -35,6 +35,7 @@ #include "../../control.h" #include "../../database.h" #include "../../user_ops.h" +#include "../../makeuserkey.h" #include "../../msgbase.h" #include "serv_upgrade.h" #include "../../euidindex.h" diff --git a/citadel/server/user_ops.c b/citadel/server/user_ops.c index fc87a03d9..31bd579d3 100644 --- a/citadel/server/user_ops.c +++ b/citadel/server/user_ops.c @@ -18,6 +18,7 @@ #include "citadel_ldap.h" #include "ctdl_module.h" #include "user_ops.h" +#include "makeuserkey.h" #include "internet_addressing.h" // These pipes are used to talk to the chkpwd daemon, which is forked during startup diff --git a/citadel/server/user_ops.h b/citadel/server/user_ops.h index 28c242921..af8a83879 100644 --- a/citadel/server/user_ops.h +++ b/citadel/server/user_ops.h @@ -58,7 +58,6 @@ void start_chkpwd_daemon(void); int rename_user(char *oldname, char *newname); void reindex_user_928(char *username, void *out_data); -void makeuserkey(char *key, const char *username); int CtdlUserCmp(char *s1, char *s2); int internal_create_user(char *username, struct ctdluser *usbuf, uid_t uid); diff --git a/citadel/utils/ctdlload.c b/citadel/utils/ctdlload.c index 4ee86c2f9..bf6c55f42 100644 --- a/citadel/utils/ctdlload.c +++ b/citadel/utils/ctdlload.c @@ -25,6 +25,7 @@ #include "../server/sysdep.h" #include "../server/citadel_defs.h" #include "../server/server.h" +#include "../server/makeuserkey.h" #include "../server/citadel_dirs.h" @@ -171,6 +172,71 @@ int convert_msgmeta(char *line, DBT *out_key, DBT *out_data) { } +// Convert a "user" record to a record on disk. NOT THREADSAFE +int convert_user(char *line, DBT *out_key, DBT *out_data) { + char userkey[USERNAME_SIZE]; + char *token; + struct ctdluser *u = malloc(sizeof(struct ctdluser)); + + memset(u, 0, sizeof(struct ctdluser)); + char *p = line; + + for (int i=0; (token = strsep(&p, "|")); ++i) { + switch(i) { + case 1: + u->version = atoi(token); + break; + case 2: + u->uid = atoi(token); + break; + case 3: + strncpy(u->password, token, sizeof(u->password)); + break; + case 4: + u->flags = atoi(token); + break; + case 5: + u->axlevel = atoi(token); + break; + case 6: + u->usernum = atol(token); + break; + case 7: + u->lastcall = atol(token); + break; + case 8: + u->USuserpurge = atoi(token); + break; + case 9: + strncpy(u->fullname, token, sizeof(u->fullname)); + break; + case 10: + u->msgnum_bio = atol(token); + break; + case 11: + u->msgnum_pic = atol(token); + break; + case 12: + CtdlDecodeBase64(u->emailaddrs, token, strlen(token)); + break; + case 13: + u->msgnum_inboxrules = atol(token); + break; + case 14: + u->lastproc_inboxrules = atol(token); + break; + } + } + + makeuserkey(userkey, u->fullname); + out_key->size = strlen(userkey); + out_key->data = strdup(userkey); + out_data->size = sizeof(struct ctdluser); + out_data->data = u; + return(1); +} + + // Ingest one line of dump data. NOT REENTRANT void ingest_one(char *line, DB_ENV *dst_dbenv) { @@ -205,7 +271,6 @@ void ingest_one(char *line, DB_ENV *dst_dbenv) { if (current_cdb != previous_cdb) { if (previous_cdb >= 0) { - fprintf(stderr, "Close %d\n", previous_cdb); ret = dst_dbp->close(dst_dbp, 0); if (ret) { fprintf(stderr, "db: db_close: %s\n", db_strerror(ret)); @@ -213,7 +278,6 @@ void ingest_one(char *line, DB_ENV *dst_dbenv) { } if (current_cdb >= 0) { - fprintf(stderr, " Open %d\n", current_cdb); snprintf(dbfilename, sizeof dbfilename, "cdb.%02x", current_cdb); // create a database handle for the destination table @@ -242,7 +306,7 @@ void ingest_one(char *line, DB_ENV *dst_dbenv) { row_was_good = 0; if (!strcasecmp(record_type, "msgtext")) row_was_good = convert_msgtext(line, &out_key, &out_data); else if (!strcasecmp(record_type, "msgmeta")) row_was_good = convert_msgmeta(line, &out_key, &out_data); - else if (!strcasecmp(record_type, "user")) row_was_good = convert_foo(line, &out_key, &out_data); + else if (!strcasecmp(record_type, "user")) row_was_good = convert_user(line, &out_key, &out_data); else if (!strcasecmp(record_type, "room")) row_was_good = convert_foo(line, &out_key, &out_data); else if (!strcasecmp(record_type, "floor")) row_was_good = convert_foo(line, &out_key, &out_data); else if (!strcasecmp(record_type, "msglist")) row_was_good = convert_foo(line, &out_key, &out_data); -- 2.39.2