import.c is now serv_upgrade.c, a module (unfinished)
authorArt Cancro <ajc@citadel.org>
Tue, 13 Oct 1998 00:57:07 +0000 (00:57 +0000)
committerArt Cancro <ajc@citadel.org>
Tue, 13 Oct 1998 00:57:07 +0000 (00:57 +0000)
citadel/ChangeLog
citadel/serv_upgrade.c [new file with mode: 0644]
citadel/user_ops.c

index e0663d65bd2d2bf6cc3701110883abc498c0a5d6..2265f25fdbed96f284685668563bac913e54b556 100644 (file)
@@ -1,6 +1,7 @@
 Mon Oct 12 15:27:21 EDT 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
        * Killed the "rooms" subdirectory (it isn't used anymore)
        * dynloader.c: Made dynamically added server commands case-insensitive
+       * import.c is now serv_upgrade.c, a module (unfinished)
 
 1998-10-12 Nathan Bryant <bryant@cs.usm.maine.edu>
        * Makefile.in: simplified to use pattern rules; files compiled with
diff --git a/citadel/serv_upgrade.c b/citadel/serv_upgrade.c
new file mode 100644 (file)
index 0000000..12606a3
--- /dev/null
@@ -0,0 +1,508 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <pwd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <string.h>
+#include <limits.h>
+#include <pthread.h>
+#include "citadel.h"
+#include "server.h"
+#include <syslog.h>
+#include "sysdep_decls.h"
+#include "citserver.h"
+#include "support.h"
+#include "config.h"
+#include "dynloader.h"
+#include "room_ops.h"
+#include "user_ops.h"
+#include "database.h"
+#include "control.h"
+
+extern struct CitContext *ContextList;
+FILE *imfp;
+
+#define MODULE_NAME    "Import an unpacked system"
+#define MODULE_AUTHOR  "Art Cancro"
+#define MODULE_EMAIL   "ajc@uncnsrd.mt-kisco.ny.us"
+#define MAJOR_VERSION  0
+#define MINOR_VERSION  1
+
+static struct DLModule_Info info = {
+  MODULE_NAME,
+  MODULE_AUTHOR,
+  MODULE_EMAIL,
+  MAJOR_VERSION,
+  MINOR_VERSION
+};
+
+
+
+
+void fpgetfield(fp,string)
+FILE *fp;
+char string[];
+{
+       int a,b;
+       strcpy(string,"");
+       a=0;
+       do {
+               b=getc(fp);
+               if (b<1) {
+                       string[a]=0;
+                       return;
+                       }
+               string[a]=b;
+               ++a;
+               } while (b!=0);
+       }
+
+
+void import_message(long msgnum, long msglen) {
+       char *msgtext;
+
+       msgtext = malloc(msglen);
+       if (msgtext == NULL) {
+               lprintf(3, "ERROR: cannot allocate memory\n");
+               lprintf(3, "Your data files are now corrupt.\n");
+               fclose(imfp);
+               exit(1);
+               }
+
+       fread(msgtext, msglen, 1, imfp);
+       cdb_store(CDB_MSGMAIN, &msgnum, sizeof(long), msgtext, msglen);
+       free(msgtext);
+       }
+
+void imp_floors() {
+       char key[256], tag[256], tval[256];
+       struct floor fl;
+       int floornum = 0;
+
+
+       while(fpgetfield(imfp, key), strcasecmp(key, "endsection")) {
+
+               if (!strcasecmp(key, "floor")) {
+                       bzero(&fl, sizeof(struct floor));
+
+                       while(fpgetfield(imfp, tag),
+                            strcasecmp(tag, "endfloor")) {
+                               fpgetfield(imfp, tval);
+
+                               if (!strcasecmp(tag, "f_flags")) 
+                                       fl.f_flags = atoi(tval);
+                               if (!strcasecmp(tag, "f_name")) {
+                                       lprintf(9, "Floor <%s>\n", tval);
+                                       strcpy(fl.f_name, tval);        
+                                       }
+                               if (!strcasecmp(tag, "f_ref_count")) 
+                                       fl.f_ref_count = atoi(tval);
+                               }
+
+                       putfloor(&fl, floornum);
+                       ++floornum;
+                       }
+               else {
+                       lprintf(3, "ERROR: invalid floor section.\n");
+                       lprintf(3, "Your data files are now corrupt.\n");
+                       fclose(imfp);
+                       return;
+                       }
+               }
+       }
+
+
+
+void imp_rooms() {
+       char key[256];
+       char tag[256], tval[256];
+       int roomnum = 0;
+       struct quickroom qr;
+       long *msglist;
+       int num_msgs = 0;
+       long msgnum, msglen;
+       
+       while(fpgetfield(imfp, key), strcasecmp(key, "endsection")) {
+               if (!strcasecmp(key, "room")) {
+                       bzero(&qr, sizeof(struct quickroom));
+                       msglist = NULL;
+                       num_msgs = 0;
+                       lprintf(9, "Room ");
+
+                       while(fpgetfield(imfp, tag),
+                            strcasecmp(tag, "endroom")) {
+                               if (strcasecmp(tag, "message")) {
+                                       fpgetfield(imfp, tval);
+                                       }
+                               else {
+                                       strcpy(tval, "");
+                                       }
+
+                               if (!strcasecmp(tag, "qrname")) {
+                                       strcpy(qr.QRname, tval);
+                                       lprintf(9, "<%s>", qr.QRname);
+                                       }
+                               if (!strcasecmp(tag, "qrpasswd"))
+                                       strcpy(qr.QRpasswd, tval);
+                               if (!strcasecmp(tag, "qrroomaide"))
+                                       qr.QRroomaide = atol(tval);
+                               if (!strcasecmp(tag, "qrhighest"))
+                                       qr.QRhighest = atol(tval);
+                               if (!strcasecmp(tag, "qrgen"))
+                                       qr.QRgen = atol(tval);
+                               if (!strcasecmp(tag, "qrflags"))
+                                       qr.QRflags = atoi(tval);
+                               if (!strcasecmp(tag, "qrdirname"))
+                                       strcpy(qr.QRdirname, tval);
+                               if (!strcasecmp(tag, "qrinfo"))
+                                       qr.QRinfo = atol(tval);
+                               if (!strcasecmp(tag, "qrfloor"))
+                                       qr.QRfloor = atoi(tval);
+                               if (!strcasecmp(tag, "message")) {
+                                       lprintf(9, ".");
+                                       fpgetfield(imfp, tval);
+                                       msgnum = atol(tval);
+                                       fpgetfield(imfp, tval);
+                                       msglen = atol(tval);
+                                       import_message(msgnum, msglen);
+                                       ++num_msgs;
+                                       msglist = realloc(msglist,
+                                               (sizeof(long)*num_msgs) );
+                                       msglist[num_msgs - 1] = msgnum;
+                                       }
+
+                               }
+
+                       lprintf(9, "\n");
+                       if ((roomnum!=1)&&(qr.QRflags&QR_INUSE)) {
+                               putroom(&qr, qr.QRname);
+                               }
+
+                       if (num_msgs > 0) {
+                               if ((roomnum!=1)&&(qr.QRflags&QR_INUSE)) {
+                                       CC->msglist = msglist;
+                                       CC->num_msgs = num_msgs;
+                                       put_msglist(&qr);
+                                       }
+                               free(msglist);
+                               }
+
+                       ++roomnum;
+
+                       }
+               else {
+                       lprintf(3, "ERROR: invalid room section.\n");
+                       lprintf(3, "Your data files are now corrupt.\n");
+                       fclose(imfp);
+                       return;
+                       }
+               }
+       }
+
+
+
+
+
+void import_a_user() {
+       char key[256], value[256], list[256];
+       char vkey[256], vvalue[256];
+       struct usersupp us;
+       struct quickroom qr;
+       struct visit vbuf;
+       long *mbox = NULL;
+       int mbox_size = 0;
+       long msgnum;
+       long msglen;
+
+       bzero(&us, sizeof(struct usersupp));    
+       while(fpgetfield(imfp, key), strcasecmp(key, "enduser")) {
+               if ((strcasecmp(key, "mail"))
+                  &&(strcasecmp(key, "lastseen"))
+                  &&(strcasecmp(key, "generation"))
+                  &&(strcasecmp(key, "forget")) ) {
+                       fpgetfield(imfp, value);
+                       }
+               else {
+                       strcpy(value, "");
+                       }
+
+               if (!strcasecmp(key, "usuid"))
+                       us.USuid = atoi(value);
+               if (!strcasecmp(key, "password")) {
+                       strcpy(us.password, value);
+                       }
+
+               if (!strcasecmp(key, "flags"))
+                       us.flags = atoi(value);
+               if (!strcasecmp(key, "timescalled"))
+                       us.timescalled = atoi(value);
+               if (!strcasecmp(key, "posted"))
+                       us.posted = atoi(value);
+               if (!strcasecmp(key, "fullname")) {
+                       strcpy(us.fullname, value);
+                       lprintf(9, "User <%s>", us.fullname);
+                       }
+               if (!strcasecmp(key, "axlevel"))
+                       us.axlevel = atoi(value);
+               if (!strcasecmp(key, "usscreenwidth"))
+                       us.USscreenwidth = atoi(value);
+               if (!strcasecmp(key, "usscreenheight"))
+                       us.USscreenheight = atoi(value);
+               if (!strcasecmp(key, "usernum"))
+                       us.usernum = atol(value);
+               if (!strcasecmp(key, "lastcall"))
+                       us.lastcall = atol(value);
+               if (!strcasecmp(key, "usname"))
+                       strcpy(us.USname, value);
+               if (!strcasecmp(key, "usaddr"))
+                       strcpy(us.USaddr, value);
+               if (!strcasecmp(key, "uscity"))
+                       strcpy(us.UScity, value);
+               if (!strcasecmp(key, "usstate"))
+                       strcpy(us.USstate, value);
+               if (!strcasecmp(key, "uszip"))
+                       strcpy(us.USzip, value);
+               if (!strcasecmp(key, "usphone"))
+                       strcpy(us.USphone, value);
+               if (!strcasecmp(key, "usemail"))
+                       strcpy(us.USemail, value);
+               if (!strcasecmp(key, "mail")) {
+                       lprintf(9, ".");
+                       fpgetfield(imfp, list);
+                       msgnum = atol(list);
+                       fpgetfield(imfp, list);
+                       msglen = atol(list);
+                       import_message(msgnum, msglen);
+                       ++mbox_size;
+                       mbox = realloc(mbox, (sizeof(long)*mbox_size) );
+                       mbox[mbox_size - 1] = msgnum;
+                       }
+               if (!strcasecmp(key, "visit")) {
+                       bzero(&vbuf, sizeof(struct visit));
+                       bzero(&qr, sizeof(struct quickroom));
+                       while(fpgetfield(imfp, vkey),
+                         strcasecmp(vkey, "endvisit")) {
+                               fpgetfield(imfp, value);
+                               if (!strcasecmp(vkey, "vname")) 
+                                       strcpy(qr.QRname, vvalue);
+                               if (!strcasecmp(vkey, "vgen"))  {
+                                       qr.QRgen = atol(vvalue);
+                                       CtdlGetRelationship(&vbuf, &us, &qr);
+                                       }
+                               if (!strcasecmp(vkey, "lastseen"))      
+                                       vbuf.v_lastseen = atol(vvalue);
+                               if (!strcasecmp(vkey, "flags"))
+                                       vbuf.v_flags = atoi(vvalue);
+                               }
+                       CtdlSetRelationship(&vbuf, &us, &qr);
+                       }
+               }
+       
+       putuser(&us, us.fullname);
+
+       /* create a mailbox room */
+       bzero(&qr, sizeof(struct quickroom));
+       MailboxName(qr.QRname, &us, MAILROOM);
+       qr.QRflags = QR_INUSE | QR_MAILBOX;
+       time(&qr.QRgen);
+       if (mbox_size > 0) qr.QRhighest = mbox[mbox_size - 1];
+       putroom(&qr, qr.QRname);
+
+       CC->msglist = mbox;
+       CC->num_msgs = mbox_size;
+       put_msglist(&qr);
+
+       free(mbox);
+       lprintf(9, "\n");
+       }
+
+
+void imp_usersupp() {
+       char key[256], value[256];
+       
+       while(fpgetfield(imfp, key), strcasecmp(key, "endsection")) {
+               if (strcasecmp(key, "user")) {
+                       fpgetfield(imfp, value);
+                       }
+               else {
+                       strcpy(value, "");
+                       }
+               lprintf(9, " %s = %s\n", key, value);
+
+               if (!strcasecmp(key, "user")) {
+                       import_a_user();
+                       }
+               }               
+       }
+
+
+
+
+
+void imp_globals() {
+       char key[256], value[256];
+
+       get_control();
+       while(fpgetfield(imfp, key), strcasecmp(key, "endsection")) {
+               fpgetfield(imfp, value);
+               lprintf(9, " %s = %s\n", key, value);
+
+               if (!strcasecmp(key, "mmhighest"))
+                       CitControl.MMhighest = atol(value);
+               if (!strcasecmp(key, "mmnextuser"))
+                       CitControl.MMnextuser = atol(value);
+
+               }
+       put_control();
+       }
+
+
+
+void imp_config() { 
+       char key[256], value[256];
+       FILE *fp;
+
+       while(fpgetfield(imfp, key), strcasecmp(key, "endsection")) {
+               fpgetfield(imfp, value);
+               lprintf(9, " %s = %s\n", key, value);
+
+               if (!strcasecmp(key, "c_nodename"))
+                       strcpy(config.c_nodename, value);
+               if (!strcasecmp(key, "c_fqdn"))
+                       strcpy(config.c_fqdn, value);
+               if (!strcasecmp(key, "c_humannode"))
+                       strcpy(config.c_humannode, value);
+               if (!strcasecmp(key, "c_phonenum"))
+                       strcpy(config.c_phonenum, value);
+               if (!strcasecmp(key, "c_phonenum"))
+                       strcpy(config.c_phonenum, value);
+               if (!strcasecmp(key, "c_bbsuid"))
+                       config.c_bbsuid = atoi(value);
+               if (!strcasecmp(key, "c_creataide"))
+                       config.c_creataide = atoi(value);
+               if (!strcasecmp(key, "c_sleeping"))
+                       config.c_sleeping = atoi(value);
+               if (!strcasecmp(key, "c_initax"))
+                       config.c_initax = atoi(value);
+               if (!strcasecmp(key, "c_regiscall"))
+                       config.c_regiscall = atoi(value);
+               if (!strcasecmp(key, "c_twitdetect"))
+                       config.c_twitdetect = atoi(value);
+               if (!strcasecmp(key, "c_twitroom"))
+                       strcpy(config.c_twitroom, value);
+               if (!strcasecmp(key, "c_defent"))
+                       config.c_defent = atoi(value);
+               if (!strcasecmp(key, "c_moreprompt"))
+                       strcpy(config.c_moreprompt, value);
+               if (!strcasecmp(key, "c_restrict"))
+                       config.c_restrict = atoi(value);
+               if (!strcasecmp(key, "c_bbs_city"))
+                       strcpy(config.c_bbs_city, value);
+               if (!strcasecmp(key, "c_sysadm"))
+                       strcpy(config.c_sysadm, value);
+               if (!strcasecmp(key, "c_bucket_dir"))
+                       strcpy(config.c_bucket_dir, value);
+               if (!strcasecmp(key, "c_setup_level"))
+                       config.c_setup_level = atoi(value);
+               if (!strcasecmp(key, "c_maxsessions"))
+                       config.c_maxsessions = atoi(value);
+               if (!strcasecmp(key, "c_net_password"))
+                       strcpy(config.c_net_password, value);
+               if (!strcasecmp(key, "c_port_number"))
+                       config.c_port_number = atoi(value);
+               }
+
+       fp = fopen("citadel.config", "wb");
+       fwrite(&config, sizeof(struct config), 1, fp);
+       fclose(fp);
+       }
+               
+               
+
+
+
+void imp_ssv() {
+       char key[256], value[256];
+       int ssv_maxfloors = MAXFLOORS;
+       
+       while(fpgetfield(imfp, key), strcasecmp(key, "endsection")) {
+               fpgetfield(imfp, value);
+               lprintf(9, " %s = %s\n", key, value);
+               
+               if (!strcasecmp(key, "maxfloors")) {
+                       ssv_maxfloors = atol(value);
+                       if (ssv_maxfloors > MAXFLOORS) {
+                               lprintf(3, "ERROR: maxfloors is %d, need %d\n",
+                                       ssv_maxfloors, MAXFLOORS);
+                               fclose(imfp);
+                               return;
+                               }
+                       }
+               }
+       }
+
+
+
+
+
+
+
+void import_databases() {
+       char section[256];
+
+       lprintf(9, " ** IMPORTING ** \n");
+       while (fpgetfield(imfp, section), strcasecmp(section, "endfile")) {
+               lprintf(9, "Section: <%s>\n", section);
+
+               if (!strcasecmp(section, "ssv"))                imp_ssv();
+               else if (!strcasecmp(section, "config"))        imp_config();
+               else if (!strcasecmp(section, "globals"))       imp_globals();
+               else if (!strcasecmp(section, "usersupp"))      imp_usersupp();
+               else if (!strcasecmp(section, "rooms"))         imp_rooms();
+               else if (!strcasecmp(section, "floors"))        imp_floors();
+               else {
+                       lprintf(3, "ERROR: invalid import section.\n");
+                       lprintf(3, "Your data files are now corrupt.\n");
+                       fclose(imfp);
+                       return;
+                       }
+
+               }
+
+       }
+
+
+
+void do_import(char *argbuf) {
+       char import_filename[PATH_MAX];
+       
+
+       if (num_parms(argbuf) != 1) {
+               cprintf("%d usage: IMPO unpacked_filename\n", ERROR);
+               return;
+               }
+       extract(import_filename, argbuf, 0);
+       imfp = fopen(import_filename, "rb");
+       if (imfp == NULL) {
+               lprintf(9, "Cannot open %s: %s\n",
+                       import_filename, strerror(errno));
+               cprintf("%d Cannot open file\n", ERROR);
+               return;
+               }
+
+       import_databases();
+       cprintf("%d ok\n", OK);
+       }
+
+
+struct DLModule_Info *Dynamic_Module_Init(void) {
+       CtdlRegisterProtoHook(do_import,
+                               "IMPO",
+                               "Import an unpacked system");
+       return &info;
+       }
index 41ce4a8c9fea3591ab1ae78a93607de04ba9b402..c01f080d96c46f4e7007633f427a80ad0fba4bd2 100644 (file)
@@ -432,6 +432,8 @@ void cmd_pass(char *buf)
                strproc(password);
                strproc(CC->usersupp.password);
                code = strcasecmp(CC->usersupp.password,password);
+               lprintf(9, "Got <%s>, looking for <%s>\n",
+                       password, CC->usersupp.password);
                }
        else {
                p = (struct passwd *)getpwuid(CC->usersupp.USuid);