Annotation of sbbs/sbbs2/newuser.c, revision 1.1.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.