From 5462a3a9a200953c11f043704d713a96f3c75328 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Tue, 13 Oct 1998 00:57:07 +0000 Subject: [PATCH] import.c is now serv_upgrade.c, a module (unfinished) --- citadel/ChangeLog | 1 + citadel/serv_upgrade.c | 508 +++++++++++++++++++++++++++++++++++++++++ citadel/user_ops.c | 2 + 3 files changed, 511 insertions(+) create mode 100644 citadel/serv_upgrade.c diff --git a/citadel/ChangeLog b/citadel/ChangeLog index e0663d65b..2265f25fd 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,6 +1,7 @@ Mon Oct 12 15:27:21 EDT 1998 Art Cancro * 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 * 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 index 000000000..12606a3fa --- /dev/null +++ b/citadel/serv_upgrade.c @@ -0,0 +1,508 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "citadel.h" +#include "server.h" +#include +#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; + } diff --git a/citadel/user_ops.c b/citadel/user_ops.c index 41ce4a8c9..c01f080d9 100644 --- a/citadel/user_ops.c +++ b/citadel/user_ops.c @@ -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); -- 2.39.2