Annotation of sbbs/sbbs2/newuser.c, revision 1.1

1.1     ! root        1: #line 1 "NEWUSER.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "sbbs.h"
        !             6: #include "cmdshell.h"
        !             7: 
        !             8: extern char qwklogon;
        !             9: 
        !            10: /****************************************************************************/
        !            11: /* This function is invoked when a user enters "NEW" at the NN: prompt         */
        !            12: /* Prompts user for personal information and then sends feedback to sysop.  */
        !            13: /* Called from function waitforcall                                                                                    */
        !            14: /****************************************************************************/
        !            15: void newuser()
        !            16: {
        !            17:        char    c,str[512],usa;
        !            18:        int     file;
        !            19:        uint    i,j;
        !            20:        long    misc;
        !            21:        FILE    *stream;
        !            22: 
        !            23: if(cur_rate<node_minbps) {
        !            24:        bprintf(text[MinimumModemSpeed],node_minbps);
        !            25:        sprintf(str,"%sTOOSLOW.MSG",text_dir);
        !            26:        if(fexist(str))
        !            27:                printfile(str,0);
        !            28:        sprintf(str,"New user modem speed: %lu<%u"
        !            29:                ,cur_rate,node_minbps);
        !            30:        logline("N!",str);
        !            31:        hangup();
        !            32:        return; }
        !            33: 
        !            34: getnodedat(node_num,&thisnode,0);
        !            35: if(thisnode.misc&NODE_LOCK) {
        !            36:        bputs(text[NodeLocked]);
        !            37:        logline("N!","New user locked node logon attempt");
        !            38:        hangup();
        !            39:        return; }
        !            40: 
        !            41: if(sys_misc&SM_CLOSED) {
        !            42:        bputs(text[NoNewUsers]);
        !            43:        hangup();
        !            44:        return; }
        !            45: getnodedat(node_num,&thisnode,1);
        !            46: thisnode.status=NODE_NEWUSER;
        !            47: if(online==ON_LOCAL)
        !            48:        thisnode.connection=0;
        !            49: else
        !            50:        thisnode.connection=cur_rate;
        !            51: putnodedat(node_num,thisnode);
        !            52: memset(&useron,0,sizeof(user_t));        /* Initialize user info to null */
        !            53: if(new_pass[0] && online==ON_REMOTE) {
        !            54:        c=0;
        !            55:        while(++c<4) {
        !            56:                bputs(text[NewUserPasswordPrompt]);
        !            57:                getstr(str,40,K_UPPER);
        !            58:                if(!strcmp(str,new_pass))
        !            59:                        break;
        !            60:                sprintf(tmp,"NUP Attempted: '%s'",str);
        !            61:                logline("N!",tmp); }
        !            62:        if(c==4) {
        !            63:                sprintf(str,"%sNUPGUESS.MSG",text_dir);
        !            64:                if(fexist(str))
        !            65:                        printfile(str,P_NOABORT);
        !            66:                hangup();
        !            67:                return; } }
        !            68: 
        !            69: if(autoterm || yesno(text[AutoTerminalQ])) {
        !            70:        useron.misc|=AUTOTERM;
        !            71:        useron.misc|=autoterm; }
        !            72: 
        !            73: if(!(useron.misc&AUTOTERM)) {
        !            74:        if(yesno(text[AnsiTerminalQ]))
        !            75:                useron.misc|=ANSI; }
        !            76: 
        !            77: if(useron.misc&ANSI) {
        !            78:        useron.rows=0;  /* Auto-rows */
        !            79:        if(useron.misc&(RIP|WIP) || yesno(text[ColorTerminalQ]))
        !            80:                useron.misc|=COLOR; }
        !            81: else
        !            82:        useron.rows=24;
        !            83: if(!yesno(text[ExAsciiTerminalQ]))
        !            84:        useron.misc|=NO_EXASCII;
        !            85: 
        !            86: /* Sets defaults per sysop config */
        !            87: useron.misc|=(new_misc&~(DELETED|INACTIVE|QUIET|NETMAIL));
        !            88: useron.qwk=(QWK_FILES|QWK_ATTACH|QWK_EMAIL|QWK_DELMAIL);
        !            89: strcpy(useron.modem,connection);
        !            90: useron.firston=useron.laston=useron.pwmod=time(NULL);
        !            91: if(new_expire) {
        !            92:        now=time(NULL);
        !            93:        useron.expire=now+((long)new_expire*24L*60L*60L); }
        !            94: else
        !            95:        useron.expire=0;
        !            96: useron.sex=SP;
        !            97: useron.prot=new_prot;
        !            98: strcpy(useron.note,cid);               /* Caller ID if supported, NULL otherwise */
        !            99: strcpy(useron.alias,"New");     /* just for status line */
        !           100: strcpy(useron.modem,connection);
        !           101: if(!lastuser()) {      /* Automatic sysop access for first user */
        !           102:        useron.level=99;
        !           103:        useron.exempt=useron.flags1=useron.flags2=0xffffffffUL;
        !           104:        useron.flags3=useron.flags4=0xffffffffUL;
        !           105:        useron.rest=0L; }
        !           106: else {
        !           107:        useron.level=new_level;
        !           108:        useron.flags1=new_flags1;
        !           109:        useron.flags2=new_flags2;
        !           110:        useron.flags3=new_flags3;
        !           111:        useron.flags4=new_flags4;
        !           112:        useron.rest=new_rest;
        !           113:        useron.exempt=new_exempt; }
        !           114: 
        !           115: useron.cdt=new_cdt;
        !           116: useron.min=new_min;
        !           117: useron.freecdt=level_freecdtperday[useron.level];
        !           118: 
        !           119: if(total_fcomps)
        !           120:        strcpy(useron.tmpext,fcomp[0]->ext);
        !           121: else
        !           122:        strcpy(useron.tmpext,"ZIP");
        !           123: for(i=0;i<total_xedits;i++)
        !           124:        if(!stricmp(xedit[i]->code,new_xedit) && chk_ar(xedit[i]->ar,useron))
        !           125:                break;
        !           126: if(i<total_xedits)
        !           127:        useron.xedit=i+1;
        !           128: 
        !           129: 
        !           130: useron.shell=new_shell;
        !           131: 
        !           132: statline=sys_def_stat;
        !           133: statusline();
        !           134: useron.alias[0]=0;
        !           135: while(online) {
        !           136:        while(online) {
        !           137:                if(uq&UQ_ALIASES)
        !           138:                        bputs(text[EnterYourAlias]);
        !           139:                else
        !           140:                        bputs(text[EnterYourRealName]);
        !           141:                getstr(useron.alias,LEN_ALIAS
        !           142:                        ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL);
        !           143:                truncsp(useron.alias);
        !           144:                if(useron.alias[0]<=SP || !isalpha(useron.alias[0])
        !           145:                        || strchr(useron.alias,0xff)
        !           146:                        || matchuser(useron.alias) || trashcan(useron.alias,"NAME")
        !           147:                        || (!(uq&UQ_ALIASES) && !strchr(useron.alias,SP))) {
        !           148:                        bputs(text[YouCantUseThatName]);
        !           149:                        continue; }
        !           150:                break; }
        !           151:        statusline();
        !           152:        if(!online) return;
        !           153:        if(uq&UQ_ALIASES && uq&UQ_REALNAME) {
        !           154:                while(online) {
        !           155:                        bputs(text[EnterYourRealName]);
        !           156:                        if(!getstr(useron.name,LEN_NAME
        !           157:                                ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)
        !           158:                                || trashcan(useron.name,"NAME")
        !           159:                                || strchr(useron.name,0xff)
        !           160:                                || !strchr(useron.name,SP)
        !           161:                                || (uq&UQ_DUPREAL
        !           162:                                        && userdatdupe(useron.number,U_NAME,LEN_NAME
        !           163:                                                ,useron.name,0)))
        !           164:                                bputs(text[YouCantUseThatName]);
        !           165:                        else
        !           166:                                break; } }
        !           167:        else if(uq&UQ_COMPANY) {
        !           168:                        bputs(text[EnterYourCompany]);
        !           169:                        getstr(useron.name,LEN_NAME,(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL); }
        !           170:        if(!useron.name[0])
        !           171:         strcpy(useron.name,useron.alias);
        !           172:     if(!online) return;
        !           173:        if(!useron.handle[0])
        !           174:                sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias);
        !           175:        while(uq&UQ_HANDLE && online) {
        !           176:                bputs(text[EnterYourHandle]);
        !           177:                if(!getstr(useron.handle,LEN_HANDLE
        !           178:                        ,K_LINE|K_EDIT|K_AUTODEL|(uq&UQ_NOEXASC))
        !           179:                        || strchr(useron.handle,0xff)
        !           180:                        || (uq&UQ_DUPHAND
        !           181:                                && userdatdupe(0,U_HANDLE,LEN_HANDLE,useron.handle,0))
        !           182:                        || trashcan(useron.handle,"NAME"))
        !           183:                        bputs(text[YouCantUseThatName]);
        !           184:                else
        !           185:                        break; }
        !           186:        if(!online) return;
        !           187:        if(uq&UQ_ADDRESS)
        !           188:                while(online) {            /* Get address and zip code */
        !           189:                        bputs(text[EnterYourAddress]);
        !           190:                        if(getstr(useron.address,LEN_ADDRESS
        !           191:                                ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL))
        !           192:                                break; }
        !           193:        if(!online) return;
        !           194:        while(uq&UQ_LOCATION && online) {
        !           195:                bputs(text[EnterYourCityState]);
        !           196:                if(getstr(useron.location,LEN_LOCATION
        !           197:                        ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)
        !           198:                        && (uq&UQ_NOCOMMAS || strchr(useron.location,',')))
        !           199:                        break;
        !           200:                bputs("\r\nYou must include a comma between the city and state.\r\n");
        !           201:                useron.location[0]=0; }
        !           202:        if(uq&UQ_ADDRESS)
        !           203:                while(online) {
        !           204:                        bputs(text[EnterYourZipCode]);
        !           205:                        if(getstr(useron.zipcode,LEN_ZIPCODE
        !           206:                                ,K_UPPER|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL))
        !           207:                                break; }
        !           208:        if(!online) return;
        !           209:        if(uq&UQ_PHONE) {
        !           210:                usa=yesno(text[CallingFromNorthAmericaQ]);
        !           211:                while(online) {
        !           212:                        bputs(text[EnterYourPhoneNumber]);
        !           213:                        if(!usa) {
        !           214:                                if(getstr(useron.phone,LEN_PHONE
        !           215:                                        ,K_UPPER|K_LINE|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)<5)
        !           216:                                        continue; }
        !           217:                        else {
        !           218:                                if(gettmplt(useron.phone,sys_phonefmt
        !           219:                                        ,K_LINE|(uq&UQ_NOEXASC)|K_EDIT)<strlen(sys_phonefmt))
        !           220:                                        continue; }
        !           221:                        if(!trashcan(useron.phone,"PHONE"))
        !           222:                                break; } }
        !           223:        if(!online) return;
        !           224:        if(uq&UQ_SEX) {
        !           225:                bputs(text[EnterYourSex]);
        !           226:                useron.sex=getkeys("MF",0); }
        !           227:        while(uq&UQ_BIRTH && online) {
        !           228:                bputs(text[EnterYourBirthday]);
        !           229:                if(gettmplt(useron.birth,"nn/nn/nn",K_EDIT)==8 && getage(useron.birth))
        !           230:                        break; }
        !           231:        if(yesno(text[UserInfoCorrectQ]))
        !           232:                break; }
        !           233: sprintf(str,"New user: %s",useron.alias);
        !           234: logline("N",str);
        !           235: if(!online) return;
        !           236: if(uq&UQ_COMP)
        !           237:        getcomputer(useron.comp);
        !           238: CLS;
        !           239: sprintf(str,"%sSBBS.MSG",text_dir);
        !           240: printfile(str,P_NOABORT);
        !           241: if(lncntr)
        !           242:        pause();
        !           243: CLS;
        !           244: sprintf(str,"%sSYSTEM.MSG",text_dir);
        !           245: printfile(str,P_NOABORT);
        !           246: if(lncntr)
        !           247:        pause();
        !           248: CLS;
        !           249: sprintf(str,"%sNEWUSER.MSG",text_dir);
        !           250: printfile(str,P_NOABORT);
        !           251: if(lncntr)
        !           252:        pause();
        !           253: CLS;
        !           254: answertime=time(NULL);         /* could take 10 minutes to get this far */
        !           255: 
        !           256: if(total_xedits && uq&UQ_XEDIT && !noyes("Use an external editor")) {
        !           257:        if(useron.xedit) useron.xedit--;
        !           258:     for(i=0;i<total_xedits;i++)
        !           259:                uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar);
        !           260:        if((int)(i=uselect(0,useron.xedit,0,0,0))>=0)
        !           261:                useron.xedit=i+1; }
        !           262: 
        !           263: if(total_shells>1 && uq&UQ_CMDSHELL) {
        !           264:     for(i=0;i<total_shells;i++)
        !           265:                uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar);
        !           266:        if((int)(i=uselect(0,useron.shell,0,0,0))>=0)
        !           267:                useron.shell=i; }
        !           268: 
        !           269: c=0;
        !           270: while(c<LEN_PASS) {                            /* Create random password */
        !           271:        useron.pass[c]=random(43)+48;
        !           272:        if(isalnum(useron.pass[c]))
        !           273:                c++; }
        !           274: useron.pass[c]=0;
        !           275: bprintf(text[YourPasswordIs],useron.pass);
        !           276: 
        !           277: if(sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ]))
        !           278:        while(online) {
        !           279:                bputs(text[NewPassword]);
        !           280:                getstr(str,LEN_PASS,K_UPPER|K_LINE);
        !           281:                truncsp(str);
        !           282:                if(chkpass(str,useron)) {
        !           283:                        strcpy(useron.pass,str);
        !           284:                        CRLF;
        !           285:                        bprintf(text[YourPasswordIs],useron.pass);
        !           286:                        break; }
        !           287:                CRLF; }
        !           288: 
        !           289: c=0;
        !           290: while(online) {
        !           291:        bprintf(text[NewUserPasswordVerify]);
        !           292:        console|=CON_R_ECHOX;
        !           293:        if(!(sys_misc&SM_ECHO_PW))
        !           294:                console|=CON_L_ECHOX;
        !           295:        str[0]=0;
        !           296:        getstr(str,LEN_PASS,K_UPPER);
        !           297:        console&=~(CON_R_ECHOX|CON_L_ECHOX);
        !           298:        if(!strcmp(str,useron.pass)) break;
        !           299:        sprintf(tmp,"Failed PW verification: '%s' instead of '%s'",str
        !           300:                ,useron.pass);
        !           301:        logline(nulstr,tmp);
        !           302:        if(++c==4) {
        !           303:                logline("N!","Couldn't figure out password.");
        !           304:                hangup(); }
        !           305:        bputs(text[IncorrectPassword]);
        !           306:        bprintf(text[YourPasswordIs],useron.pass); }
        !           307: if(!online) return;
        !           308: if(new_magic[0]) {
        !           309:        bputs(text[MagicWordPrompt]);
        !           310:        str[0]=0;
        !           311:        getstr(str,50,K_UPPER);
        !           312:        if(strcmp(str,new_magic)) {
        !           313:                bputs(text[FailedMagicWord]);
        !           314:                sprintf(tmp,"Failed magic word: '%s'",str);
        !           315:                logline("N!",tmp);
        !           316:                hangup(); }
        !           317:        if(!online) return; }
        !           318: 
        !           319: i=1;
        !           320: bputs(text[CheckingSlots]);
        !           321: sprintf(str,"%s\\USER\\NAME.DAT",data_dir);
        !           322: if(fexist(str)) {
        !           323:        if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
        !           324:                errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
        !           325:                hangup();
        !           326:                return; }
        !           327:        j=filelength(file)/(LEN_ALIAS+2);          /* total users */
        !           328:        while(i<=j) {
        !           329:                fread(str,LEN_ALIAS+2,1,stream);
        !           330:                for(c=0;c<LEN_ALIAS;c++)
        !           331:                        if(str[c]==ETX) break;
        !           332:                str[c]=0;
        !           333:                if(!c) {         /* should be a deleted user */
        !           334:                        getuserrec(i,U_MISC,8,str);
        !           335:                        misc=ahtoul(str);
        !           336:                        if(misc&DELETED) {       /* deleted bit set too */
        !           337:                                getuserrec(i,U_LASTON,8,str);
        !           338:                                now=ahtoul(str);                                /* delete long enough ? */
        !           339:                                if((time(NULL)-now)/86400>=sys_deldays) break; } }
        !           340:                i++; }
        !           341:        fclose(stream); }
        !           342: 
        !           343: j=lastuser();          /* Check against data file */
        !           344: if(i<=j) {                     /* Overwriting existing user */
        !           345:        getuserrec(i,U_MISC,8,str);
        !           346:        misc=ahtoul(str);
        !           347:        if(!(misc&DELETED)) /* Not deleted? Set usernumber to end+1 */
        !           348:                i=j+1; }
        !           349: 
        !           350: useron.number=i;
        !           351: putuserdat(useron);
        !           352: putusername(useron.number,useron.alias);
        !           353: logline(nulstr,"Wrote user data");
        !           354: if(new_sif[0]) {
        !           355:        sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,useron.number);
        !           356:        create_sif_dat(new_sif,str); }
        !           357: if(!(uq&UQ_NODEF))
        !           358:        maindflts(useron);
        !           359: 
        !           360: delallmail(useron.number);
        !           361: 
        !           362: if(useron.number!=1 && node_valuser) {
        !           363:        sprintf(str,"%sFEEDBACK.MSG",text_dir);
        !           364:        CLS;
        !           365:        printfile(str,P_NOABORT);
        !           366:        sprintf(str,text[NewUserFeedbackHdr]
        !           367:                ,nulstr,getage(useron.birth),useron.sex,useron.birth
        !           368:                ,useron.name,useron.phone,useron.comp,useron.modem);
        !           369:        email(node_valuser,str,"New User Validation",WM_EMAIL);
        !           370:        if(!useron.fbacks && !useron.emails) {
        !           371:                if(online) {                                            /* didn't hang up */
        !           372:                        bprintf(text[NoFeedbackWarning],username(node_valuser,tmp));
        !           373:                        email(node_valuser,str,"New User Validation",WM_EMAIL);
        !           374:                        } /* give 'em a 2nd try */
        !           375:                if(!useron.fbacks && !useron.emails) {
        !           376:                bprintf(text[NoFeedbackWarning],username(node_valuser,tmp));
        !           377:                        logline("N!","Aborted feedback");
        !           378:                        hangup();
        !           379:                        putuserrec(useron.number,U_COMMENT,60,"Didn't leave feedback");
        !           380:                        putuserrec(useron.number,U_MISC,8
        !           381:                                ,ultoa(useron.misc|DELETED,tmp,16));
        !           382:                        putusername(useron.number,nulstr);
        !           383:                        return; } } }
        !           384: 
        !           385: sprintf(str,"%sFILE\\%04u.IN",data_dir,useron.number);  /* delete any files */
        !           386: delfiles(str,"*.*");                                    /* waiting for user */
        !           387: rmdir(str);
        !           388: sprintf(tmp,"%04u.*",useron.number);
        !           389: sprintf(str,"%sFILE",data_dir);
        !           390: delfiles(str,tmp);
        !           391: 
        !           392: answertime=starttime=time(NULL);         /* set answertime to now */
        !           393: sprintf(str,"%sUSER\\PTRS\\%04u.IXB",data_dir,useron.number); /* msg ptrs */
        !           394: remove(str);
        !           395: sprintf(str,"%sMSGS\\%04u.MSG",data_dir,useron.number); /* delete short msg */
        !           396: remove(str);
        !           397: sprintf(str,"%sUSER\\%04u.MSG",data_dir,useron.number); /* delete ex-comment */
        !           398: remove(str);
        !           399: if(newuser_mod[0])
        !           400:        exec_bin(newuser_mod,&main_csi);
        !           401: user_event(EVENT_NEWUSER);
        !           402: logline("N+","Successful new user logon");
        !           403: sys_status|=SS_NEWUSER;
        !           404: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.