|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.