Now I have a machine gun that can write ctdluser records. Ho-ho-ho.
authorArt Cancro <ajc@citadel.org>
Fri, 14 Jul 2023 20:22:19 +0000 (11:22 -0900)
committerArt Cancro <ajc@citadel.org>
Fri, 14 Jul 2023 20:22:19 +0000 (11:22 -0900)
citadel/Makefile
citadel/server/makeuserkey.h [new file with mode: 0644]
citadel/server/modules/upgrade/serv_upgrade.c
citadel/server/user_ops.c
citadel/server/user_ops.h
citadel/utils/ctdlload.c

index fca990be441065060e95faa40f1d8bec64c05d00..edd3d0282ee69a0d54a714cc4beb283549b2b1d6 100644 (file)
@@ -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 (file)
index 0000000..382276b
--- /dev/null
@@ -0,0 +1 @@
+void makeuserkey(char *key, const char *username);
index 2652cefcc34fa5bda91788a3402c34ecd4206f03..e08c65d17c859139469fb1a983542af59f4f9ff6 100644 (file)
@@ -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"
index fc87a03d96d6ba9198de7dff8210de45b7405727..31bd579d3ab15a884a698142c35c9272a5f550f8 100644 (file)
@@ -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
index 28c2429214ce8e7cd97d9b08e5c935b3fdd71b66..af8a8387933ef6957b4917958d950ed622041a61 100644 (file)
@@ -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);
 
index 4ee86c2f991dc10efe40b2ce73e860cfaec5dc5f..bf6c55f420f14804858a97ee5f6e3bdc42f96b52 100644 (file)
@@ -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);