|
|
1.1 ! root 1: #line 1 "USEREDIT.C" ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /*******************************************************************/ ! 6: /* The function useredit(), and functions that are closely related */ ! 7: /*******************************************************************/ ! 8: ! 9: #include "sbbs.h" ! 10: ! 11: #define SEARCH_TXT 0 ! 12: #define SEARCH_ARS 1 ! 13: ! 14: int searchup(char *search,int usernum); ! 15: int searchdn(char *search,int usernum); ! 16: ! 17: /****************************************************************************/ ! 18: /* Edits user data. Can only edit users with a Main Security Level less */ ! 19: /* than or equal to the current user's Main Security Level */ ! 20: /* Called from functions waitforcall, main_sec, xfer_sec and inkey */ ! 21: /****************************************************************************/ ! 22: void useredit(int usernumber, int local) ! 23: { ! 24: uchar str[256],tmp2[256],tmp3[256],c,stype=SEARCH_TXT; ! 25: uchar search[256]={""},artxt[128]={""},*ar=NULL; ! 26: int i,j,k; ! 27: long l; ! 28: user_t user; ! 29: ! 30: if(online==ON_REMOTE && console&(CON_R_ECHO|CON_R_INPUT) && !chksyspass(local)) ! 31: return; ! 32: if(online==ON_LOCAL) { ! 33: if(!(sys_misc&SM_L_SYSOP)) ! 34: return; ! 35: if(node_misc&NM_SYSPW && !chksyspass(local)) ! 36: return; } ! 37: if(usernumber) ! 38: user.number=usernumber; ! 39: else ! 40: user.number=useron.number; ! 41: action=NODE_SYSP; ! 42: if(sys_status&SS_INUEDIT) ! 43: return; ! 44: sys_status|=SS_INUEDIT; ! 45: while(online) { ! 46: CLS; ! 47: attr(LIGHTGRAY); ! 48: getuserdat(&user); ! 49: if(!user.number) { ! 50: user.number=1; ! 51: getuserdat(&user); ! 52: if(!user.number) { ! 53: bputs(text[NoUserData]); ! 54: getkey(0); ! 55: sys_status&=~SS_INUEDIT; ! 56: return; } } ! 57: unixtodstr(time(NULL),str); ! 58: unixtodstr(user.laston,tmp); ! 59: if(strcmp(str,tmp) && user.ltoday) { ! 60: user.ltoday=user.ttoday=user.ptoday=user.etoday=user.textra=0; ! 61: user.freecdt=level_freecdtperday[user.level]; ! 62: putuserdat(user); } /* Leave alone */ ! 63: if(user.misc&DELETED) ! 64: bputs(text[Deleted]); ! 65: else if(user.misc&INACTIVE) ! 66: bputs(text[Inactive]); ! 67: bprintf(text[UeditAliasPassword] ! 68: ,user.alias, (user.level>useron.level && console&CON_R_ECHO) ! 69: || !(sys_misc&SM_ECHO_PW) ? "XXXXXXXX" : user.pass ! 70: , unixtodstr(user.pwmod,tmp)); ! 71: bprintf(text[UeditRealNamePhone] ! 72: ,user.level>useron.level && console&CON_R_ECHO ! 73: ? "XXXXXXXX" : user.name ! 74: ,user.level>useron.level && console&CON_R_ECHO ! 75: ? "XXX-XXX-XXXX" : user.phone); ! 76: bprintf(text[UeditAddressBirthday] ! 77: ,user.address,getage(user.birth),user.sex,user.birth); ! 78: bprintf(text[UeditLocationZipcode],user.location,user.zipcode); ! 79: bprintf(text[UeditNoteHandle],user.note,user.handle); ! 80: bprintf(text[UeditComputerModem],user.comp,user.modem); ! 81: sprintf(str,"%sUSER\\%4.4u.MSG",data_dir,user.number); ! 82: i=fexist(str); ! 83: if(user.comment[0] || i) ! 84: bprintf(text[UeditCommentLine],i ? '+' : SP ! 85: ,user.comment); ! 86: else ! 87: CRLF; ! 88: unixtodos(user.laston,&date,&curtime); ! 89: bprintf(text[UserDates] ! 90: ,unixtodstr(user.firston,str),unixtodstr(user.expire,tmp) ! 91: ,unixtodstr(user.laston,tmp2),curtime.ti_hour,curtime.ti_min); ! 92: bprintf(text[UserTimes] ! 93: ,user.timeon,user.ttoday,level_timeperday[user.level] ! 94: ,user.tlast,level_timepercall[user.level],user.textra); ! 95: if(user.posts) ! 96: i=user.logons/user.posts; ! 97: else ! 98: i=0; ! 99: bprintf(text[UserLogons] ! 100: ,user.logons,user.ltoday,level_callsperday[user.level],user.posts ! 101: ,i ? 100/i : user.posts>user.logons ? 100 : 0 ! 102: ,user.ptoday); ! 103: bprintf(text[UserEmails] ! 104: ,user.emails,user.fbacks,getmail(user.number,0),user.etoday); ! 105: if(user.misc&NETMAIL) ! 106: bprintf(text[UserNetMail],user.netmail); ! 107: else ! 108: CRLF; ! 109: bprintf(text[UserUploads],ultoac(user.ulb,tmp),user.uls); ! 110: if(user.leech) ! 111: sprintf(str,text[UserLeech],user.leech); ! 112: else ! 113: str[0]=0; ! 114: bprintf(text[UserDownloads],ultoac(user.dlb,tmp),user.dls,str); ! 115: bprintf(text[UserCredits],ultoac(user.cdt,tmp) ! 116: ,ultoac(user.freecdt,tmp2),ultoac(level_freecdtperday[user.level],str)); ! 117: bprintf(text[UserMinutes],ultoac(user.min,tmp)); ! 118: bprintf(text[UeditSecLevel],user.level); ! 119: bprintf(text[UeditFlags],ltoaf(user.flags1,tmp),ltoaf(user.flags3,tmp2) ! 120: ,ltoaf(user.flags2,tmp3),ltoaf(user.flags4,str)); ! 121: bprintf(text[UeditExempts],ltoaf(user.exempt,tmp),ltoaf(user.rest,tmp2)); ! 122: l=lastuser(); ! 123: ASYNC; ! 124: if(lncntr>=rows-2) ! 125: lncntr=0; ! 126: bprintf(text[UeditPrompt],user.number,l); ! 127: if(user.level>useron.level && console&CON_R_INPUT) ! 128: strcpy(str,"QG[]?/{},"); ! 129: else ! 130: strcpy(str,"ABCDEFGHIJKLMNOPQRSTUVWXYZ+[]?/{}~*$#"); ! 131: l=getkeys(str,l); ! 132: if(l&0x80000000L) { ! 133: user.number=l&~0x80000000L; ! 134: continue; } ! 135: switch(l) { ! 136: case 'A': ! 137: bputs(text[EnterYourAlias]); ! 138: getstr(user.alias,LEN_ALIAS,K_LINE|K_EDIT|K_AUTODEL); ! 139: putuserrec(user.number,U_ALIAS,LEN_ALIAS,user.alias); ! 140: if(!(user.misc&DELETED)) ! 141: putusername(user.number,user.alias); ! 142: bputs(text[EnterYourHandle]); ! 143: getstr(user.handle,LEN_HANDLE,K_LINE|K_EDIT|K_AUTODEL); ! 144: putuserrec(user.number,U_HANDLE,LEN_HANDLE,user.handle); ! 145: break; ! 146: case 'B': ! 147: bputs(text[EnterYourBirthday]); ! 148: gettmplt(user.birth,"nn/nn/nn",K_LINE|K_EDIT|K_AUTODEL); ! 149: putuserrec(user.number,U_BIRTH,LEN_BIRTH,user.birth); ! 150: break; ! 151: case 'C': ! 152: bputs(text[EnterYourComputer]); ! 153: getstr(user.comp,LEN_COMP,K_LINE|K_EDIT|K_AUTODEL); ! 154: putuserrec(user.number,U_COMP,LEN_COMP,user.comp); ! 155: break; ! 156: case 'D': ! 157: if(user.misc&DELETED) { ! 158: if(!noyes(text[UeditRestoreQ])) { ! 159: putuserrec(user.number,U_MISC,8 ! 160: ,ultoa(user.misc&~DELETED,str,16)); ! 161: putusername(user.number,user.alias); } ! 162: break; } ! 163: if(user.misc&INACTIVE) { ! 164: if(!noyes(text[UeditActivateQ])) ! 165: putuserrec(user.number,U_MISC,8 ! 166: ,ultoa(user.misc&~INACTIVE,str,16)); ! 167: break; } ! 168: if(!noyes(text[UeditDeleteQ])) { ! 169: getsmsg(user.number); ! 170: if(getmail(user.number,0)) { ! 171: if(yesno(text[UeditReadUserMailWQ])) ! 172: readmail(user.number,MAIL_YOUR); } ! 173: if(getmail(user.number,1)) { ! 174: if(yesno(text[UeditReadUserMailSQ])) ! 175: readmail(user.number,MAIL_SENT); } ! 176: putuserrec(user.number,U_MISC,8 ! 177: ,ultoa(user.misc|DELETED,str,16)); ! 178: putusername(user.number,nulstr); ! 179: break; } ! 180: if(!noyes(text[UeditDeactivateUserQ])) { ! 181: if(getmail(user.number,0)) { ! 182: if(yesno(text[UeditReadUserMailWQ])) ! 183: readmail(user.number,MAIL_YOUR); } ! 184: if(getmail(user.number,1)) { ! 185: if(yesno(text[UeditReadUserMailSQ])) ! 186: readmail(user.number,MAIL_SENT); } ! 187: putuserrec(user.number,U_MISC,8 ! 188: ,ultoa(user.misc|INACTIVE,str,16)); ! 189: break; } ! 190: break; ! 191: case 'E': ! 192: if(!yesno(text[ChangeExemptionQ])) ! 193: break; ! 194: while(online) { ! 195: bprintf(text[FlagEditing],ltoaf(user.exempt,tmp)); ! 196: c=getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?\r",0); ! 197: if(sys_status&SS_ABORT) ! 198: break; ! 199: if(c==CR) break; ! 200: if(c=='?') { ! 201: menu("EXEMPT"); ! 202: continue; } ! 203: if(!(useron.exempt&FLAG(c)) && console&CON_R_INPUT) ! 204: continue; ! 205: user.exempt^=FLAG(c); ! 206: putuserrec(user.number,U_EXEMPT,8,ultoa(user.exempt,tmp,16)); } ! 207: break; ! 208: case 'F': ! 209: i=1; ! 210: while(online) { ! 211: bprintf("\r\nFlag Set #%d\r\n",i); ! 212: switch(i) { ! 213: case 1: ! 214: bprintf(text[FlagEditing],ltoaf(user.flags1,tmp)); ! 215: break; ! 216: case 2: ! 217: bprintf(text[FlagEditing],ltoaf(user.flags2,tmp)); ! 218: break; ! 219: case 3: ! 220: bprintf(text[FlagEditing],ltoaf(user.flags3,tmp)); ! 221: break; ! 222: case 4: ! 223: bprintf(text[FlagEditing],ltoaf(user.flags4,tmp)); ! 224: break; } ! 225: c=getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?1234\r",0); ! 226: if(sys_status&SS_ABORT) ! 227: break; ! 228: if(c==CR) break; ! 229: if(c=='?') { ! 230: sprintf(str,"FLAGS%d",i); ! 231: menu(str); ! 232: continue; } ! 233: if(isdigit(c)) { ! 234: i=c&0xf; ! 235: continue; } ! 236: if(console & CON_R_INPUT) ! 237: switch(i) { ! 238: case 1: ! 239: if(!(useron.flags1&FLAG(c))) ! 240: continue; ! 241: break; ! 242: case 2: ! 243: if(!(useron.flags2&FLAG(c))) ! 244: continue; ! 245: break; ! 246: case 3: ! 247: if(!(useron.flags3&FLAG(c))) ! 248: continue; ! 249: break; ! 250: case 4: ! 251: if(!(useron.flags4&FLAG(c))) ! 252: continue; ! 253: break; } ! 254: switch(i) { ! 255: case 1: ! 256: user.flags1^=FLAG(c); ! 257: putuserrec(user.number,U_FLAGS1,8 ! 258: ,ultoa(user.flags1,tmp,16)); ! 259: break; ! 260: case 2: ! 261: user.flags2^=FLAG(c); ! 262: putuserrec(user.number,U_FLAGS2,8 ! 263: ,ultoa(user.flags2,tmp,16)); ! 264: break; ! 265: case 3: ! 266: user.flags3^=FLAG(c); ! 267: putuserrec(user.number,U_FLAGS3,8 ! 268: ,ultoa(user.flags3,tmp,16)); ! 269: break; ! 270: case 4: ! 271: user.flags4^=FLAG(c); ! 272: putuserrec(user.number,U_FLAGS4,8 ! 273: ,ultoa(user.flags4,tmp,16)); ! 274: break; } } ! 275: break; ! 276: case 'G': ! 277: bputs(text[GoToUser]); ! 278: if(getstr(str,LEN_ALIAS,K_UPPER|K_LINE)) { ! 279: if(isdigit(str[0])) { ! 280: i=atoi(str); ! 281: if(i>lastuser()) ! 282: break; ! 283: if(i) user.number=i; } ! 284: else { ! 285: i=finduser(str); ! 286: if(i) user.number=i; } } ! 287: break; ! 288: case 'H': /* edit user's information file */ ! 289: attr(LIGHTGRAY); ! 290: sprintf(str,"%sUSER\\%4.4u.MSG",data_dir,user.number); ! 291: editfile(str); ! 292: break; ! 293: case 'I': ! 294: maindflts(user); ! 295: break; ! 296: case 'J': /* Edit Minutes */ ! 297: bputs(text[UeditMinutes]); ! 298: ultoa(user.min,str,10); ! 299: if(getstr(str,10,K_NUMBER|K_LINE)) ! 300: putuserrec(user.number,U_MIN,10,str); ! 301: break; ! 302: case 'K': /* date changes */ ! 303: bputs(text[UeditLastOn]); ! 304: unixtodstr(user.laston,str); ! 305: gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); ! 306: if(sys_status&SS_ABORT) ! 307: break; ! 308: user.laston=dstrtounix(str); ! 309: putuserrec(user.number,U_LASTON,8,ultoa(user.laston,tmp,16)); ! 310: bputs(text[UeditFirstOn]); ! 311: unixtodstr(user.firston,str); ! 312: gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); ! 313: if(sys_status&SS_ABORT) ! 314: break; ! 315: user.firston=dstrtounix(str); ! 316: putuserrec(user.number,U_FIRSTON,8,ultoa(user.firston,tmp,16)); ! 317: bputs(text[UeditExpire]); ! 318: unixtodstr(user.expire,str); ! 319: gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); ! 320: if(sys_status&SS_ABORT) ! 321: break; ! 322: user.expire=dstrtounix(str); ! 323: putuserrec(user.number,U_EXPIRE,8,ultoa(user.expire,tmp,16)); ! 324: bputs(text[UeditPwModDate]); ! 325: unixtodstr(user.pwmod,str); ! 326: gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); ! 327: if(sys_status&SS_ABORT) ! 328: break; ! 329: user.pwmod=dstrtounix(str); ! 330: putuserrec(user.number,U_PWMOD,8,ultoa(user.pwmod,tmp,16)); ! 331: break; ! 332: case 'L': ! 333: bputs(text[EnterYourAddress]); ! 334: getstr(user.address,LEN_ADDRESS,K_LINE|K_EDIT|K_AUTODEL); ! 335: if(sys_status&SS_ABORT) ! 336: break; ! 337: putuserrec(user.number,U_ADDRESS,LEN_ADDRESS,user.address); ! 338: bputs(text[EnterYourCityState]); ! 339: getstr(user.location,LEN_LOCATION,K_LINE|K_EDIT|K_AUTODEL); ! 340: if(sys_status&SS_ABORT) ! 341: break; ! 342: putuserrec(user.number,U_LOCATION,LEN_LOCATION,user.location); ! 343: bputs(text[EnterYourZipCode]); ! 344: getstr(user.zipcode,LEN_ZIPCODE,K_LINE|K_EDIT|K_AUTODEL|K_UPPER); ! 345: if(sys_status&SS_ABORT) ! 346: break; ! 347: putuserrec(user.number,U_ZIPCODE,LEN_ZIPCODE,user.zipcode); ! 348: break; ! 349: case 'M': ! 350: bputs(text[UeditML]); ! 351: itoa(user.level,str,10); ! 352: if(getstr(str,2,K_NUMBER|K_LINE)) ! 353: if(!(atoi(str)>useron.level && console&CON_R_INPUT)) ! 354: putuserrec(user.number,U_LEVEL,2,str); ! 355: break; ! 356: case 'N': ! 357: bputs(text[UeditNote]); ! 358: getstr(user.note,LEN_NOTE,K_LINE|K_EDIT|K_AUTODEL); ! 359: putuserrec(user.number,U_NOTE,LEN_NOTE,user.note); ! 360: break; ! 361: case 'O': ! 362: bputs(text[UeditComment]); ! 363: getstr(user.comment,60,K_LINE|K_EDIT|K_AUTODEL); ! 364: putuserrec(user.number,U_COMMENT,60,user.comment); ! 365: break; ! 366: case 'P': ! 367: bputs(text[EnterYourPhoneNumber]); ! 368: getstr(user.phone,LEN_PHONE,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); ! 369: putuserrec(user.number,U_PHONE,LEN_PHONE,user.phone); ! 370: break; ! 371: case 'Q': ! 372: CLS; ! 373: sys_status&=~SS_INUEDIT; ! 374: if(ar) ! 375: FREE(ar); ! 376: return; ! 377: case 'R': ! 378: bputs(text[EnterYourRealName]); ! 379: getstr(user.name,LEN_NAME,K_LINE|K_EDIT|K_AUTODEL); ! 380: putuserrec(user.number,U_NAME,LEN_NAME,user.name); ! 381: break; ! 382: case 'S': ! 383: bputs(text[EnterYourSex]); ! 384: if(getstr(str,1,K_UPPER|K_LINE)) ! 385: putuserrec(user.number,U_SEX,1,str); ! 386: break; ! 387: case 'T': /* Text Search */ ! 388: bputs(text[SearchStringPrompt]); ! 389: if(getstr(search,30,K_UPPER|K_LINE)) ! 390: stype=SEARCH_TXT; ! 391: break; ! 392: case 'U': ! 393: bputs(text[UeditUlBytes]); ! 394: ultoa(user.ulb,str,10); ! 395: if(getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) ! 396: putuserrec(user.number,U_ULB,10,str); ! 397: if(sys_status&SS_ABORT) ! 398: break; ! 399: bputs(text[UeditUploads]); ! 400: sprintf(str,"%u",user.uls); ! 401: if(getstr(str,5,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) ! 402: putuserrec(user.number,U_ULS,5,str); ! 403: if(sys_status&SS_ABORT) ! 404: break; ! 405: bputs(text[UeditDlBytes]); ! 406: ultoa(user.dlb,str,10); ! 407: if(getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) ! 408: putuserrec(user.number,U_DLB,10,str); ! 409: if(sys_status&SS_ABORT) ! 410: break; ! 411: bputs(text[UeditDownloads]); ! 412: sprintf(str,"%u",user.dls); ! 413: if(getstr(str,5,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) ! 414: putuserrec(user.number,U_DLS,5,str); ! 415: break; ! 416: case 'V': ! 417: CLS; ! 418: attr(LIGHTGRAY); ! 419: for(i=0;i<10;i++) { ! 420: bprintf(text[QuickValidateFmt] ! 421: ,i,val_level[i],ltoaf(val_flags1[i],str) ! 422: ,ltoaf(val_exempt[i],tmp) ! 423: ,ltoaf(val_rest[i],tmp3)); } ! 424: ASYNC; ! 425: bputs(text[QuickValidatePrompt]); ! 426: c=getkey(0); ! 427: if(!isdigit(c)) ! 428: break; ! 429: i=c&0xf; ! 430: user.level=val_level[i]; ! 431: user.flags1=val_flags1[i]; ! 432: user.flags2=val_flags2[i]; ! 433: user.flags3=val_flags3[i]; ! 434: user.flags4=val_flags4[i]; ! 435: user.exempt=val_exempt[i]; ! 436: user.rest=val_rest[i]; ! 437: user.cdt+=val_cdt[i]; ! 438: now=time(NULL); ! 439: if(val_expire[i]) { ! 440: if(user.expire<now) ! 441: user.expire=now+((long)val_expire[i]*24L*60L*60L); ! 442: else ! 443: user.expire+=((long)val_expire[i]*24L*60L*60L); } ! 444: putuserdat(user); ! 445: break; ! 446: case 'W': ! 447: bputs(text[UeditPassword]); ! 448: getstr(user.pass,LEN_PASS,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); ! 449: putuserrec(user.number,U_PASS,LEN_PASS,user.pass); ! 450: break; ! 451: case 'X': ! 452: attr(LIGHTGRAY); ! 453: sprintf(str,"%sUSER\\%4.4u.MSG",data_dir,user.number); ! 454: printfile(str,0); ! 455: pause(); ! 456: break; ! 457: case 'Y': ! 458: if(!noyes(text[UeditCopyUserQ])) { ! 459: bputs(text[UeditCopyUserToSlot]); ! 460: i=getnum(lastuser()); ! 461: if(i>0) { ! 462: user.number=i; ! 463: putusername(user.number,user.alias); ! 464: putuserdat(user); } } ! 465: break; ! 466: case 'Z': ! 467: if(!yesno(text[ChangeRestrictsQ])) ! 468: break; ! 469: while(online) { ! 470: bprintf(text[FlagEditing],ltoaf(user.rest,tmp)); ! 471: c=getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?\r",0); ! 472: if(sys_status&SS_ABORT) ! 473: break; ! 474: if(c==CR) break; ! 475: if(c=='?') { ! 476: menu("RESTRICT"); ! 477: continue; } ! 478: user.rest^=FLAG(c); ! 479: putuserrec(user.number,U_REST,8,ultoa(user.rest,tmp,16)); } ! 480: break; ! 481: case '?': ! 482: CLS; ! 483: menu("UEDIT"); /* Sysop Uedit Edit Menu */ ! 484: pause(); ! 485: break; ! 486: case '~': ! 487: bputs(text[UeditLeech]); ! 488: if(getstr(str,2,K_NUMBER|K_LINE)) ! 489: putuserrec(user.number,U_LEECH,2,itoa(atoi(str),tmp,16)); ! 490: break; ! 491: case '+': ! 492: bputs(text[ModifyCredits]); ! 493: getstr(str,10,K_UPPER|K_LINE); ! 494: l=atol(str); ! 495: if(strstr(str,"M")) ! 496: l*=0x100000L; ! 497: else if(strstr(str,"K")) ! 498: l*=1024; ! 499: else if(strstr(str,"$")) ! 500: l*=cdt_per_dollar; ! 501: if(l<0L && l*-1 > user.cdt) ! 502: user.cdt=0L; ! 503: else ! 504: user.cdt+=l; ! 505: putuserrec(user.number,U_CDT,10,ultoa(user.cdt,tmp,10)); ! 506: break; ! 507: case '*': ! 508: bputs(text[ModifyMinutes]); ! 509: getstr(str,10,K_UPPER|K_LINE); ! 510: l=atol(str); ! 511: if(strstr(str,"H")) ! 512: l*=60L; ! 513: if(l<0L && l*-1 > user.min) ! 514: user.min=0L; ! 515: else ! 516: user.min+=l; ! 517: putuserrec(user.number,U_MIN,10,ultoa(user.min,tmp,10)); ! 518: break; ! 519: case '#': /* read new user questionaire */ ! 520: sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,user.number); ! 521: if(!new_sof[0] || !fexist(str)) ! 522: break; ! 523: read_sif_dat(new_sof,str); ! 524: if(!noyes(text[DeleteQuestionaireQ])) ! 525: remove(str); ! 526: break; ! 527: case '$': ! 528: bputs(text[UeditCredits]); ! 529: ultoa(user.cdt,str,10); ! 530: if(getstr(str,10,K_NUMBER|K_LINE)) ! 531: putuserrec(user.number,U_CDT,10,str); ! 532: break; ! 533: case '/': ! 534: bputs(text[SearchStringPrompt]); ! 535: if(getstr(artxt,40,K_UPPER|K_LINE)) ! 536: stype=SEARCH_ARS; ! 537: if(ar && ar[0]) ! 538: FREE(ar); ! 539: ar=arstr(0,artxt); ! 540: break; ! 541: case '{': ! 542: if(stype==SEARCH_TXT) ! 543: user.number=searchdn(search,user.number); ! 544: else { ! 545: if(!ar) ! 546: break; ! 547: k=user.number; ! 548: for(i=k-1;i;i--) { ! 549: user.number=i; ! 550: getuserdat(&user); ! 551: if(chk_ar(ar,user)) { ! 552: outchar(7); ! 553: break; } } ! 554: if(!i) ! 555: user.number=k; } ! 556: break; ! 557: case '}': ! 558: if(stype==SEARCH_TXT) ! 559: user.number=searchup(search,user.number); ! 560: else { ! 561: if(!ar) ! 562: break; ! 563: j=lastuser(); ! 564: k=user.number; ! 565: for(i=k+1;i<=j;i++) { ! 566: user.number=i; ! 567: getuserdat(&user); ! 568: if(chk_ar(ar,user)) { ! 569: outchar(7); ! 570: break; } } ! 571: if(i>j) ! 572: user.number=k; } ! 573: break; ! 574: case ']': ! 575: if(user.number==lastuser()) ! 576: user.number=1; ! 577: else user.number++; ! 578: break; ! 579: case '[': ! 580: if(user.number==1) ! 581: user.number=lastuser(); ! 582: else user.number--; ! 583: break; } } ! 584: sys_status&=~SS_INUEDIT; ! 585: } ! 586: ! 587: /****************************************************************************/ ! 588: /* Seaches forward through the USER.DAT file for the ocurrance of 'search' */ ! 589: /* starting at the offset for usernum+1 and returning the usernumber of the */ ! 590: /* record where the string was found or the original usernumber if the */ ! 591: /* string wasn't found */ ! 592: /* Called from the function useredit */ ! 593: /****************************************************************************/ ! 594: int searchup(char *search,int usernum) ! 595: { ! 596: char userdat[U_LEN+1]; ! 597: int file,count; ! 598: uint i=usernum+1; ! 599: ! 600: if(!search[0]) ! 601: return(usernum); ! 602: sprintf(userdat,"%sUSER\\USER.DAT",data_dir); ! 603: if((file=nopen(userdat,O_RDONLY|O_DENYNONE))==-1) ! 604: return(usernum); ! 605: lseek(file,(long)((long)usernum*U_LEN),0); ! 606: ! 607: while(!eof(file)) { ! 608: count=0; ! 609: while(count<LOOP_NODEDAB ! 610: && lock(file,(long)((long)(i-1)*U_LEN),U_LEN)==-1) { ! 611: if(count>10) ! 612: mswait(55); ! 613: count++; } ! 614: ! 615: if(count>=LOOP_NODEDAB) { ! 616: close(file); ! 617: errormsg(WHERE,ERR_LOCK,"USER.DAT",i); ! 618: return(usernum); } ! 619: ! 620: if(read(file,userdat,U_LEN)!=U_LEN) { ! 621: unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); ! 622: close(file); ! 623: errormsg(WHERE,ERR_READ,"USER.DAT",U_LEN); ! 624: return(usernum); } ! 625: ! 626: unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); ! 627: userdat[U_LEN]=0; ! 628: strupr(userdat); ! 629: if(strstr(userdat,search)) { ! 630: outchar(7); ! 631: close(file); ! 632: return(i); } ! 633: i++; } ! 634: close(file); ! 635: return(usernum); ! 636: } ! 637: ! 638: /****************************************************************************/ ! 639: /* Seaches backward through the USER.DAT file for the ocurrance of 'search' */ ! 640: /* starting at the offset for usernum-1 and returning the usernumber of the */ ! 641: /* record where the string was found or the original usernumber if the */ ! 642: /* string wasn't found */ ! 643: /* Called from the function useredit */ ! 644: /****************************************************************************/ ! 645: int searchdn(char *search,int usernum) ! 646: { ! 647: char userdat[U_LEN+1]; ! 648: int file,count; ! 649: uint i=usernum-1; ! 650: ! 651: if(!search[0]) ! 652: return(usernum); ! 653: sprintf(userdat,"%sUSER\\USER.DAT",data_dir); ! 654: if((file=nopen(userdat,O_RDONLY))==-1) ! 655: return(usernum); ! 656: while(i) { ! 657: lseek(file,(long)((long)(i-1)*U_LEN),0); ! 658: count=0; ! 659: while(count<LOOP_NODEDAB ! 660: && lock(file,(long)((long)(i-1)*U_LEN),U_LEN)==-1) { ! 661: if(count>10) ! 662: mswait(55); ! 663: count++; } ! 664: ! 665: if(count>=LOOP_NODEDAB) { ! 666: close(file); ! 667: errormsg(WHERE,ERR_LOCK,"USER.DAT",i); ! 668: return(usernum); } ! 669: ! 670: if(read(file,userdat,U_LEN)==-1) { ! 671: unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); ! 672: close(file); ! 673: errormsg(WHERE,ERR_READ,"USER.DAT",U_LEN); ! 674: return(usernum); } ! 675: unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); ! 676: userdat[U_LEN]=0; ! 677: strupr(userdat); ! 678: if(strstr(userdat,search)) { ! 679: outchar(7); ! 680: close(file); ! 681: return(i); } ! 682: i--; } ! 683: close(file); ! 684: return(usernum); ! 685: } ! 686: ! 687: /****************************************************************************/ ! 688: /* This function view/edits the users main default settings. */ ! 689: /****************************************************************************/ ! 690: void maindflts(user_t user) ! 691: { ! 692: char str[256],ch; ! 693: int i; ! 694: ! 695: action=NODE_DFLT; ! 696: while(online) { ! 697: CLS; ! 698: /* ! 699: if(user.number==useron.number && useron.rest&FLAG('G')) /* Guest */ ! 700: user=useron; ! 701: else ! 702: */ ! 703: getuserdat(&user); ! 704: if(user.rows) ! 705: rows=user.rows; ! 706: bprintf(text[UserDefaultsHdr],user.alias,user.number); ! 707: sprintf(str,"%s%s%s%s%s" ! 708: ,user.misc&AUTOTERM ? "Auto Detect ":nulstr ! 709: ,user.misc&ANSI ? "ANSI ":"TTY " ! 710: ,user.misc&COLOR ? "(Color) ":"(Mono) " ! 711: ,user.misc&WIP ? "WIP" : user.misc&RIP ? "RIP " ! 712: :nulstr ! 713: ,user.misc&NO_EXASCII ? "ASCII Only":nulstr); ! 714: bprintf(text[UserDefaultsTerminal],str); ! 715: if(total_xedits) ! 716: bprintf(text[UserDefaultsXeditor] ! 717: ,user.xedit ? xedit[user.xedit-1]->name : "None"); ! 718: if(user.rows) ! 719: itoa(user.rows,tmp,10); ! 720: else ! 721: sprintf(tmp,"Auto Detect (%d)",rows); ! 722: bprintf(text[UserDefaultsRows],tmp); ! 723: if(total_shells>1) ! 724: bprintf(text[UserDefaultsCommandSet] ! 725: ,shell[user.shell]->name); ! 726: bprintf(text[UserDefaultsArcType] ! 727: ,user.tmpext); ! 728: bprintf(text[UserDefaultsMenuMode] ! 729: ,user.misc&EXPERT ? text[On] : text[Off]); ! 730: bprintf(text[UserDefaultsPause] ! 731: ,user.misc&UPAUSE ? text[On] : text[Off]); ! 732: bprintf(text[UserDefaultsHotKey] ! 733: ,user.misc&COLDKEYS ? text[Off] : text[On]); ! 734: bprintf(text[UserDefaultsCursor] ! 735: ,user.misc&SPIN ? text[On] : text[Off]); ! 736: bprintf(text[UserDefaultsCLS] ! 737: ,user.misc&CLRSCRN ? text[On] : text[Off]); ! 738: bprintf(text[UserDefaultsAskNScan] ! 739: ,user.misc&ASK_NSCAN ? text[On] : text[Off]); ! 740: bprintf(text[UserDefaultsAskSScan] ! 741: ,user.misc&ASK_SSCAN ? text[On] : text[Off]); ! 742: bprintf(text[UserDefaultsANFS] ! 743: ,user.misc&ANFSCAN ? text[On] : text[Off]); ! 744: bprintf(text[UserDefaultsRemember] ! 745: ,user.misc&CURSUB ? text[On] : text[Off]); ! 746: bprintf(text[UserDefaultsBatFlag] ! 747: ,user.misc&BATCHFLAG ? text[On] : text[Off]); ! 748: if(sys_misc&SM_FWDTONET) ! 749: bprintf(text[UserDefaultsNetMail] ! 750: ,user.misc&NETMAIL ? text[On] : text[Off]); ! 751: if(useron.exempt&FLAG('Q') || user.misc&QUIET) ! 752: bprintf(text[UserDefaultsQuiet] ! 753: ,user.misc&QUIET ? text[On] : text[Off]); ! 754: if(user.prot!=SP) ! 755: sprintf(str,"%c",user.prot); ! 756: else ! 757: strcpy(str,"None"); ! 758: bprintf(text[UserDefaultsProtocol],str ! 759: ,user.misc&AUTOHANG ? "(Hang-up After Xfer)":nulstr); ! 760: if(sys_misc&SM_PWEDIT && !(user.rest&FLAG('G'))) ! 761: bputs(text[UserDefaultsPassword]); ! 762: ! 763: ASYNC; ! 764: bputs(text[UserDefaultsWhich]); ! 765: strcpy(str,"HTBALPRSYFNCQXZ\r"); ! 766: if(sys_misc&SM_PWEDIT && !(user.rest&FLAG('G'))) ! 767: strcat(str,"W"); ! 768: if(useron.exempt&FLAG('Q') || user.misc&QUIET) ! 769: strcat(str,"D"); ! 770: if(total_xedits) ! 771: strcat(str,"E"); ! 772: if(sys_misc&SM_FWDTONET) ! 773: strcat(str,"M"); ! 774: if(total_shells>1) ! 775: strcat(str,"K"); ! 776: ch=getkeys(str,0); ! 777: switch(ch) { ! 778: case 'T': ! 779: if(yesno(text[AutoTerminalQ])) { ! 780: user.misc|=AUTOTERM; ! 781: user.misc&=~(ANSI|RIP|WIP); ! 782: user.misc|=autoterm; } ! 783: else ! 784: user.misc&=~AUTOTERM; ! 785: if(!(user.misc&AUTOTERM)) { ! 786: if(yesno(text[AnsiTerminalQ])) ! 787: user.misc|=ANSI; ! 788: else ! 789: user.misc&=~(ANSI|COLOR); } ! 790: if(user.misc&ANSI) { ! 791: if(yesno(text[ColorTerminalQ])) ! 792: user.misc|=COLOR; ! 793: else ! 794: user.misc&=~COLOR; } ! 795: if(!yesno(text[ExAsciiTerminalQ])) ! 796: user.misc|=NO_EXASCII; ! 797: else ! 798: user.misc&=~NO_EXASCII; ! 799: if(!(user.misc&AUTOTERM)) { ! 800: if(!noyes(text[RipTerminalQ])) ! 801: user.misc|=RIP; ! 802: else ! 803: user.misc&=~RIP; } ! 804: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 805: break; ! 806: case 'B': ! 807: user.misc^=BATCHFLAG; ! 808: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 809: break; ! 810: case 'E': ! 811: if(noyes("Use an external editor")) { ! 812: putuserrec(user.number,U_XEDIT,8,nulstr); ! 813: break; } ! 814: if(user.xedit) ! 815: user.xedit--; ! 816: for(i=0;i<total_xedits;i++) ! 817: uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar); ! 818: if((i=uselect(0,user.xedit,0,0,0))>=0) ! 819: putuserrec(user.number,U_XEDIT,8,xedit[i]->code); ! 820: break; ! 821: case 'K': /* Command shell */ ! 822: for(i=0;i<total_shells;i++) ! 823: uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar); ! 824: if((i=uselect(0,user.shell,0,0,0))>=0) ! 825: putuserrec(user.number,U_SHELL,8,shell[i]->code); ! 826: break; ! 827: case 'A': ! 828: for(i=0;i<total_fcomps;i++) ! 829: uselect(1,i,"Archive Type",fcomp[i]->ext,fcomp[i]->ar); ! 830: if((i=uselect(0,0,0,0,0))>=0) ! 831: putuserrec(user.number,U_TMPEXT,3,fcomp[i]->ext); ! 832: break; ! 833: case 'L': ! 834: bputs(text[HowManyRows]); ! 835: if((ch=getnum(99))!=-1) ! 836: putuserrec(user.number,U_ROWS,2,itoa(ch,tmp,10)); ! 837: break; ! 838: case 'P': ! 839: user.misc^=UPAUSE; ! 840: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 841: break; ! 842: case 'H': ! 843: user.misc^=COLDKEYS; ! 844: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 845: break; ! 846: case 'S': ! 847: user.misc^=SPIN; ! 848: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 849: break; ! 850: case 'F': ! 851: user.misc^=ANFSCAN; ! 852: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 853: break; ! 854: case 'X': ! 855: user.misc^=EXPERT; ! 856: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 857: break; ! 858: case 'R': /* Remember current sub/dir */ ! 859: user.misc^=CURSUB; ! 860: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 861: break; ! 862: case 'Y': /* Prompt for scanning message to you */ ! 863: user.misc^=ASK_SSCAN; ! 864: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 865: break; ! 866: case 'N': /* Prompt for new message/files scanning */ ! 867: user.misc^=ASK_NSCAN; ! 868: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 869: break; ! 870: case 'M': /* NetMail address */ ! 871: if(noyes(text[ForwardMailQ])) ! 872: user.misc&=~NETMAIL; ! 873: else { ! 874: user.misc|=NETMAIL; ! 875: bputs(text[EnterNetMailAddress]); ! 876: if(!getstr(user.netmail,LEN_NETMAIL,K_EDIT|K_AUTODEL|K_LINE)) ! 877: break; ! 878: putuserrec(user.number,U_NETMAIL,LEN_NETMAIL,user.netmail); } ! 879: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 880: break; ! 881: case 'C': ! 882: user.misc^=CLRSCRN; ! 883: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 884: break; ! 885: case 'D': ! 886: user.misc^=QUIET; ! 887: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 888: break; ! 889: case 'W': ! 890: if(noyes(text[NewPasswordQ])) ! 891: break; ! 892: bputs(text[CurrentPassword]); ! 893: console|=CON_R_ECHOX; ! 894: if(!(sys_misc&SM_ECHO_PW)) ! 895: console|=CON_L_ECHOX; ! 896: ch=getstr(str,LEN_PASS,K_UPPER); ! 897: console&=~(CON_R_ECHOX|CON_L_ECHOX); ! 898: if(strcmp(str,user.pass)) { ! 899: bputs(text[WrongPassword]); ! 900: pause(); ! 901: break; } ! 902: bputs(text[NewPassword]); ! 903: if(!getstr(str,LEN_PASS,K_UPPER|K_LINE)) ! 904: break; ! 905: truncsp(str); ! 906: if(!chkpass(str,user)) { ! 907: CRLF; ! 908: pause(); ! 909: break; } ! 910: bputs(text[VerifyPassword]); ! 911: console|=CON_R_ECHOX; ! 912: if(!(sys_misc&SM_ECHO_PW)) ! 913: console|=CON_L_ECHOX; ! 914: getstr(tmp,LEN_PASS,K_UPPER); ! 915: console&=~(CON_R_ECHOX|CON_L_ECHOX); ! 916: if(strcmp(str,tmp)) { ! 917: bputs(text[WrongPassword]); ! 918: pause(); ! 919: break; } ! 920: if(!online) ! 921: break; ! 922: putuserrec(user.number,U_PASS,LEN_PASS,str); ! 923: now=time(NULL); ! 924: putuserrec(user.number,U_PWMOD,8,ultoa(now,tmp,16)); ! 925: bputs(text[PasswordChanged]); ! 926: logline(nulstr,"Changed password"); ! 927: pause(); ! 928: break; ! 929: case 'Z': ! 930: menu("DLPROT"); ! 931: SYNC; ! 932: mnemonics(text[ProtocolOrQuit]); ! 933: strcpy(str,"Q"); ! 934: for(i=0;i<total_prots;i++) ! 935: if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) { ! 936: sprintf(tmp,"%c",prot[i]->mnemonic); ! 937: strcat(str,tmp); } ! 938: ch=getkeys(str,0); ! 939: if(ch=='Q' || sys_status&SS_ABORT) { ! 940: ch=SP; ! 941: putuserrec(user.number,U_PROT,1,&ch); } ! 942: else ! 943: putuserrec(user.number,U_PROT,1,&ch); ! 944: if(yesno(text[HangUpAfterXferQ])) ! 945: user.misc|=AUTOHANG; ! 946: else ! 947: user.misc&=~AUTOHANG; ! 948: putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); ! 949: break; ! 950: default: ! 951: return; } } ! 952: } ! 953: ! 954: void purgeuser(int usernumber) ! 955: { ! 956: uchar str[128]; ! 957: user_t user; ! 958: ! 959: user.number=usernumber; ! 960: getuserdat(&user); ! 961: sprintf(str,"Purged %s #%u",user.alias,usernumber); ! 962: logentry("!*",str); ! 963: delallmail(usernumber); ! 964: putusername(usernumber,nulstr); ! 965: putuserrec(usernumber,U_MISC,8,ultoa(user.misc|DELETED,str,16)); ! 966: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.