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