|
|
1.1 ! root 1: /* chk_ar.cpp */ ! 2: ! 3: /* Synchronet ARS checking routine */ ! 4: ! 5: /* $Id: chk_ar.cpp,v 1.16 2006/12/29 09:00:59 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 2006 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: #include "sbbs.h" ! 39: ! 40: bool sbbs_t::ar_exp(uchar **ptrptr, user_t* user) ! 41: { ! 42: bool result,_not,_or,equal; ! 43: uint i,n,artype,age; ! 44: ulong l; ! 45: struct tm tm; ! 46: ! 47: result = true; ! 48: ! 49: for(;(**ptrptr);(*ptrptr)++) { ! 50: ! 51: if((**ptrptr)==AR_ENDNEST) ! 52: break; ! 53: ! 54: _not=_or=equal = false; ! 55: ! 56: if((**ptrptr)==AR_OR) { ! 57: _or=true; ! 58: (*ptrptr)++; } ! 59: ! 60: if((**ptrptr)==AR_NOT) { ! 61: _not=true; ! 62: (*ptrptr)++; } ! 63: ! 64: if((**ptrptr)==AR_EQUAL) { ! 65: equal=true; ! 66: (*ptrptr)++; } ! 67: ! 68: if((result && _or) || (!result && !_or)) ! 69: break; ! 70: ! 71: if((**ptrptr)==AR_BEGNEST) { ! 72: (*ptrptr)++; ! 73: if(ar_exp(ptrptr,user)) ! 74: result=!_not; ! 75: else ! 76: result=_not; ! 77: while((**ptrptr)!=AR_ENDNEST && (**ptrptr)) /* in case of early exit */ ! 78: (*ptrptr)++; ! 79: if(!(**ptrptr)) ! 80: break; ! 81: continue; } ! 82: ! 83: artype=(**ptrptr); ! 84: switch(artype) { ! 85: case AR_ANSI: /* No arguments */ ! 86: case AR_RIP: ! 87: case AR_WIP: ! 88: case AR_LOCAL: ! 89: case AR_EXPERT: ! 90: case AR_SYSOP: ! 91: case AR_GUEST: ! 92: case AR_QNODE: ! 93: case AR_QUIET: ! 94: case AR_OS2: ! 95: case AR_DOS: ! 96: case AR_WIN32: ! 97: case AR_UNIX: ! 98: case AR_LINUX: ! 99: break; ! 100: default: ! 101: (*ptrptr)++; ! 102: break; } ! 103: ! 104: n=(**ptrptr); ! 105: i=(*(short *)*ptrptr); ! 106: switch(artype) { ! 107: case AR_LEVEL: ! 108: if((equal && user->level!=n) || (!equal && user->level<n)) ! 109: result=_not; ! 110: else ! 111: result=!_not; ! 112: if(!result) { ! 113: noaccess_str=text[NoAccessLevel]; ! 114: noaccess_val=n; } ! 115: break; ! 116: case AR_AGE: ! 117: age=getage(&cfg,user->birth); ! 118: if((equal && age!=n) || (!equal && age<n)) ! 119: result=_not; ! 120: else ! 121: result=!_not; ! 122: if(!result) { ! 123: noaccess_str=text[NoAccessAge]; ! 124: noaccess_val=n; } ! 125: break; ! 126: case AR_BPS: ! 127: if((equal && cur_rate!=i) || (!equal && cur_rate<i)) ! 128: result=_not; ! 129: else ! 130: result=!_not; ! 131: (*ptrptr)++; ! 132: if(!result) { ! 133: noaccess_str=text[NoAccessBPS]; ! 134: noaccess_val=i; } ! 135: break; ! 136: case AR_ANSI: ! 137: if(!(user->misc&ANSI)) ! 138: result=_not; ! 139: else result=!_not; ! 140: break; ! 141: case AR_RIP: ! 142: if(!(user->misc&RIP)) ! 143: result=_not; ! 144: else result=!_not; ! 145: break; ! 146: case AR_WIP: ! 147: if(!(user->misc&WIP)) ! 148: result=_not; ! 149: else result=!_not; ! 150: break; ! 151: case AR_OS2: ! 152: #ifndef __OS2__ ! 153: result=_not; ! 154: #else ! 155: result=!_not; ! 156: #endif ! 157: break; ! 158: case AR_DOS: ! 159: result=_not; ! 160: break; ! 161: case AR_WIN32: ! 162: #ifndef _WIN32 ! 163: result=_not; ! 164: #else ! 165: result=!_not; ! 166: #endif ! 167: break; ! 168: case AR_UNIX: ! 169: #ifndef __unix__ ! 170: result=_not; ! 171: #else ! 172: result=!_not; ! 173: #endif ! 174: break; ! 175: case AR_LINUX: ! 176: #ifndef __linux__ ! 177: result=_not; ! 178: #else ! 179: result=!_not; ! 180: #endif ! 181: break; ! 182: case AR_ACTIVE: ! 183: if(user->misc&(DELETED|INACTIVE)) ! 184: result=_not; ! 185: else result=!_not; ! 186: break; ! 187: case AR_INACTIVE: ! 188: if(!(user->misc&INACTIVE)) ! 189: result=_not; ! 190: else result=!_not; ! 191: break; ! 192: case AR_DELETED: ! 193: if(!(user->misc&DELETED)) ! 194: result=_not; ! 195: else result=!_not; ! 196: break; ! 197: case AR_EXPERT: ! 198: if(!(user->misc&EXPERT)) ! 199: result=_not; ! 200: else result=!_not; ! 201: break; ! 202: case AR_SYSOP: ! 203: if(!SYSOP) ! 204: result=_not; ! 205: else result=!_not; ! 206: break; ! 207: case AR_GUEST: ! 208: if(!(user->rest&FLAG('G'))) ! 209: result=_not; ! 210: else result=!_not; ! 211: break; ! 212: case AR_QNODE: ! 213: if(!(user->rest&FLAG('Q'))) ! 214: result=_not; ! 215: else result=!_not; ! 216: break; ! 217: case AR_QUIET: ! 218: if(thisnode.status!=NODE_QUIET) ! 219: result=_not; ! 220: else result=!_not; ! 221: break; ! 222: case AR_LOCAL: ! 223: if(online!=ON_LOCAL) ! 224: result=_not; ! 225: else result=!_not; ! 226: break; ! 227: case AR_DAY: ! 228: now=time(NULL); ! 229: localtime_r(&now,&tm); ! 230: if((equal && tm.tm_wday!=(int)n) ! 231: || (!equal && tm.tm_wday<(int)n)) ! 232: result=_not; ! 233: else ! 234: result=!_not; ! 235: if(!result) { ! 236: noaccess_str=text[NoAccessDay]; ! 237: noaccess_val=n; } ! 238: break; ! 239: case AR_CREDIT: ! 240: l=(ulong)i*1024UL; ! 241: if((equal && user->cdt+user->freecdt!=l) ! 242: || (!equal && user->cdt+user->freecdt<l)) ! 243: result=_not; ! 244: else ! 245: result=!_not; ! 246: (*ptrptr)++; ! 247: if(!result) { ! 248: noaccess_str=text[NoAccessCredit]; ! 249: noaccess_val=l; } ! 250: break; ! 251: case AR_NODE: ! 252: if((equal && cfg.node_num!=n) || (!equal && cfg.node_num<n)) ! 253: result=_not; ! 254: else ! 255: result=!_not; ! 256: if(!result) { ! 257: noaccess_str=text[NoAccessNode]; ! 258: noaccess_val=n; } ! 259: break; ! 260: case AR_USER: ! 261: if((equal && user->number!=i) || (!equal && user->number<i)) ! 262: result=_not; ! 263: else ! 264: result=!_not; ! 265: (*ptrptr)++; ! 266: if(!result) { ! 267: noaccess_str=text[NoAccessUser]; ! 268: noaccess_val=i; } ! 269: break; ! 270: case AR_GROUP: ! 271: if((equal ! 272: && (cursubnum>=cfg.total_subs ! 273: || cfg.sub[cursubnum]->grp!=i)) ! 274: || (!equal && cursubnum<cfg.total_subs ! 275: && cfg.sub[cursubnum]->grp<i)) ! 276: result=_not; ! 277: else ! 278: result=!_not; ! 279: (*ptrptr)++; ! 280: if(!result) { ! 281: noaccess_str=text[NoAccessGroup]; ! 282: noaccess_val=i+1; } ! 283: break; ! 284: case AR_SUB: ! 285: if((equal && cursubnum!=i) || (!equal && cursubnum<i)) ! 286: result=_not; ! 287: else ! 288: result=!_not; ! 289: (*ptrptr)++; ! 290: if(!result) { ! 291: noaccess_str=text[NoAccessSub]; ! 292: noaccess_val=i+1; } ! 293: break; ! 294: case AR_SUBCODE: ! 295: if(cursubnum>=cfg.total_subs ! 296: || stricmp(cfg.sub[cursubnum]->code,(char*)*ptrptr)) ! 297: result=_not; ! 298: else ! 299: result=!_not; ! 300: while(*(*ptrptr)) ! 301: (*ptrptr)++; ! 302: if(!result) ! 303: noaccess_str=text[NoAccessSub]; ! 304: break; ! 305: case AR_LIB: ! 306: if((equal ! 307: && (curdirnum>=cfg.total_dirs ! 308: || cfg.dir[curdirnum]->lib!=i)) ! 309: || (!equal && curdirnum<cfg.total_dirs ! 310: && cfg.dir[curdirnum]->lib<i)) ! 311: result=_not; ! 312: else ! 313: result=!_not; ! 314: (*ptrptr)++; ! 315: if(!result) { ! 316: noaccess_str=text[NoAccessLib]; ! 317: noaccess_val=i+1; } ! 318: break; ! 319: case AR_DIR: ! 320: if((equal && curdirnum!=i) || (!equal && curdirnum<i)) ! 321: result=_not; ! 322: else ! 323: result=!_not; ! 324: (*ptrptr)++; ! 325: if(!result) { ! 326: noaccess_str=text[NoAccessDir]; ! 327: noaccess_val=i+1; } ! 328: break; ! 329: case AR_DIRCODE: ! 330: if(curdirnum>=cfg.total_dirs ! 331: || stricmp(cfg.dir[curdirnum]->code,(char *)*ptrptr)) ! 332: result=_not; ! 333: else ! 334: result=!_not; ! 335: while(*(*ptrptr)) ! 336: (*ptrptr)++; ! 337: if(!result) ! 338: noaccess_str=text[NoAccessSub]; ! 339: break; ! 340: case AR_EXPIRE: ! 341: now=time(NULL); ! 342: if(!user->expire || now+((long)i*24L*60L*60L)>user->expire) ! 343: result=_not; ! 344: else ! 345: result=!_not; ! 346: (*ptrptr)++; ! 347: if(!result) { ! 348: noaccess_str=text[NoAccessExpire]; ! 349: noaccess_val=i; } ! 350: break; ! 351: case AR_RANDOM: ! 352: n=sbbs_random(i+1); ! 353: if((equal && n!=i) || (!equal && n<i)) ! 354: result=_not; ! 355: else ! 356: result=!_not; ! 357: (*ptrptr)++; ! 358: break; ! 359: case AR_LASTON: ! 360: now=time(NULL); ! 361: if((now-user->laston)/(24L*60L*60L)<(long)i) ! 362: result=_not; ! 363: else ! 364: result=!_not; ! 365: (*ptrptr)++; ! 366: break; ! 367: case AR_LOGONS: ! 368: if((equal && user->logons!=i) || (!equal && user->logons<i)) ! 369: result=_not; ! 370: else ! 371: result=!_not; ! 372: (*ptrptr)++; ! 373: break; ! 374: case AR_MAIN_CMDS: ! 375: if((equal && main_cmds!=i) || (!equal && main_cmds<i)) ! 376: result=_not; ! 377: else ! 378: result=!_not; ! 379: (*ptrptr)++; ! 380: break; ! 381: case AR_FILE_CMDS: ! 382: if((equal && xfer_cmds!=i) || (!equal && xfer_cmds<i)) ! 383: result=_not; ! 384: else ! 385: result=!_not; ! 386: (*ptrptr)++; ! 387: break; ! 388: case AR_TLEFT: ! 389: if(timeleft/60<(ulong)n) ! 390: result=_not; ! 391: else ! 392: result=!_not; ! 393: if(!result) { ! 394: noaccess_str=text[NoAccessTimeLeft]; ! 395: noaccess_val=n; } ! 396: break; ! 397: case AR_TUSED: ! 398: if((time(NULL)-logontime)/60<(long)n) ! 399: result=_not; ! 400: else ! 401: result=!_not; ! 402: if(!result) { ! 403: noaccess_str=text[NoAccessTimeUsed]; ! 404: noaccess_val=n; } ! 405: break; ! 406: case AR_TIME: ! 407: now=time(NULL); ! 408: localtime_r(&now,&tm); ! 409: if((tm.tm_hour*60)+tm.tm_min<(int)i) ! 410: result=_not; ! 411: else ! 412: result=!_not; ! 413: (*ptrptr)++; ! 414: if(!result) { ! 415: noaccess_str=text[NoAccessTime]; ! 416: noaccess_val=i; } ! 417: break; ! 418: case AR_PCR: /* post/call ratio (by percentage) */ ! 419: if(user->logons>user->posts ! 420: && (!user->posts || (100/((float)user->logons/user->posts))<(long)n)) ! 421: result=_not; ! 422: else ! 423: result=!_not; ! 424: if(!result) { ! 425: noaccess_str=text[NoAccessPCR]; ! 426: noaccess_val=n; } ! 427: break; ! 428: case AR_UDR: /* up/download byte ratio (by percentage) */ ! 429: l=user->dlb; ! 430: if(!l) l=1; ! 431: if(user->dlb>user->ulb ! 432: && (!user->ulb || (100/((float)l/user->ulb))<n)) ! 433: result=_not; ! 434: else ! 435: result=!_not; ! 436: if(!result) { ! 437: noaccess_str=text[NoAccessUDR]; ! 438: noaccess_val=n; } ! 439: break; ! 440: case AR_UDFR: /* up/download file ratio (in percentage) */ ! 441: i=user->dls; ! 442: if(!i) i=1; ! 443: if(user->dls>user->uls ! 444: && (!user->uls || (100/((float)i/user->uls))<n)) ! 445: result=_not; ! 446: else ! 447: result=!_not; ! 448: if(!result) { ! 449: noaccess_str=text[NoAccessUDFR]; ! 450: noaccess_val=n; } ! 451: break; ! 452: case AR_FLAG1: ! 453: if((!equal && !(user->flags1&FLAG(n))) ! 454: || (equal && user->flags1!=FLAG(n))) ! 455: result=_not; ! 456: else ! 457: result=!_not; ! 458: if(!result) { ! 459: noaccess_str=text[NoAccessFlag1]; ! 460: noaccess_val=n; } ! 461: break; ! 462: case AR_FLAG2: ! 463: if((!equal && !(user->flags2&FLAG(n))) ! 464: || (equal && user->flags2!=FLAG(n))) ! 465: result=_not; ! 466: else ! 467: result=!_not; ! 468: if(!result) { ! 469: noaccess_str=text[NoAccessFlag2]; ! 470: noaccess_val=n; } ! 471: break; ! 472: case AR_FLAG3: ! 473: if((!equal && !(user->flags3&FLAG(n))) ! 474: || (equal && user->flags3!=FLAG(n))) ! 475: result=_not; ! 476: else ! 477: result=!_not; ! 478: if(!result) { ! 479: noaccess_str=text[NoAccessFlag3]; ! 480: noaccess_val=n; } ! 481: break; ! 482: case AR_FLAG4: ! 483: if((!equal && !(user->flags4&FLAG(n))) ! 484: || (equal && user->flags4!=FLAG(n))) ! 485: result=_not; ! 486: else ! 487: result=!_not; ! 488: if(!result) { ! 489: noaccess_str=text[NoAccessFlag4]; ! 490: noaccess_val=n; } ! 491: break; ! 492: case AR_REST: ! 493: if((!equal && !(user->rest&FLAG(n))) ! 494: || (equal && user->rest!=FLAG(n))) ! 495: result=_not; ! 496: else ! 497: result=!_not; ! 498: if(!result) { ! 499: noaccess_str=text[NoAccessRest]; ! 500: noaccess_val=n; } ! 501: break; ! 502: case AR_EXEMPT: ! 503: if((!equal && !(user->exempt&FLAG(n))) ! 504: || (equal && user->exempt!=FLAG(n))) ! 505: result=_not; ! 506: else ! 507: result=!_not; ! 508: if(!result) { ! 509: noaccess_str=text[NoAccessExempt]; ! 510: noaccess_val=n; } ! 511: break; ! 512: case AR_SEX: ! 513: if(user->sex!=n) ! 514: result=_not; ! 515: else ! 516: result=!_not; ! 517: if(!result) { ! 518: noaccess_str=text[NoAccessSex]; ! 519: noaccess_val=n; } ! 520: break; ! 521: case AR_SHELL: ! 522: if(user->shell>=cfg.total_shells ! 523: || stricmp(cfg.shell[user->shell]->code,(char*)*ptrptr)) ! 524: result=_not; ! 525: else ! 526: result=!_not; ! 527: while(*(*ptrptr)) ! 528: (*ptrptr)++; ! 529: break; ! 530: case AR_PROT: ! 531: if(stricmp(user->modem,(char*)*ptrptr)) /* should this be changed to client.prot? */ ! 532: result=_not; ! 533: else ! 534: result=!_not; ! 535: while(*(*ptrptr)) ! 536: (*ptrptr)++; ! 537: break; ! 538: } ! 539: } ! 540: return(result); ! 541: } ! 542: ! 543: bool sbbs_t::chk_ar(uchar *ar, user_t* user) ! 544: { ! 545: uchar *p; ! 546: ! 547: if(ar==NULL) ! 548: return(true); ! 549: p=ar; ! 550: return(ar_exp(&p,user)); ! 551: } ! 552: ! 553: ! 554: /****************************************************************************/ ! 555: /* This function fills the usrsub, usrsubs, usrgrps, curgrp, and cursub */ ! 556: /* variables based on the security clearance of the current user (useron) */ ! 557: /****************************************************************************/ ! 558: void sbbs_t::getusrsubs() ! 559: { ! 560: uint i,j,k,l; ! 561: ! 562: for(j=0,i=0;i<cfg.total_grps;i++) { ! 563: if(!chk_ar(cfg.grp[i]->ar,&useron)) ! 564: continue; ! 565: for(k=0,l=0;l<cfg.total_subs;l++) { ! 566: if(cfg.sub[l]->grp!=i) continue; ! 567: if(!chk_ar(cfg.sub[l]->ar,&useron)) ! 568: continue; ! 569: usrsub[j][k++]=l; ! 570: } ! 571: usrsubs[j]=k; ! 572: if(!k) /* No subs accessible in group */ ! 573: continue; ! 574: usrgrp[j++]=i; ! 575: } ! 576: usrgrps=j; ! 577: if(usrgrps==0) ! 578: return; ! 579: while((curgrp>=usrgrps || !usrsubs[curgrp]) && curgrp) curgrp--; ! 580: while(cursub[curgrp]>=usrsubs[curgrp] && cursub[curgrp]) cursub[curgrp]--; ! 581: } ! 582: ! 583: /****************************************************************************/ ! 584: /* This function fills the usrdir, usrdirs, usrlibs, curlib, and curdir */ ! 585: /* variables based on the security clearance of the current user (useron) */ ! 586: /****************************************************************************/ ! 587: void sbbs_t::getusrdirs() ! 588: { ! 589: uint i,j,k,l; ! 590: ! 591: if(useron.rest&FLAG('T')) { ! 592: usrlibs=0; ! 593: return; ! 594: } ! 595: for(j=0,i=0;i<cfg.total_libs;i++) { ! 596: if(!chk_ar(cfg.lib[i]->ar,&useron)) ! 597: continue; ! 598: for(k=0,l=0;l<cfg.total_dirs;l++) { ! 599: if(cfg.dir[l]->lib!=i) continue; ! 600: if(!chk_ar(cfg.dir[l]->ar,&useron)) ! 601: continue; ! 602: usrdir[j][k++]=l; } ! 603: usrdirs[j]=k; ! 604: if(!k) /* No dirs accessible in lib */ ! 605: continue; ! 606: usrlib[j++]=i; ! 607: } ! 608: usrlibs=j; ! 609: if(usrlibs==0) ! 610: return; ! 611: while((curlib>=usrlibs || !usrdirs[curlib]) && curlib) curlib--; ! 612: while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--; ! 613: } ! 614: ! 615: uint sbbs_t::getusrgrp(uint subnum) ! 616: { ! 617: uint ugrp; ! 618: ! 619: if(subnum==INVALID_SUB) ! 620: return(0); ! 621: ! 622: if(usrgrps<=0) ! 623: return(0); ! 624: ! 625: for(ugrp=0;ugrp<usrgrps;ugrp++) ! 626: if(usrgrp[ugrp]==cfg.sub[subnum]->grp) ! 627: break; ! 628: ! 629: return(ugrp+1); ! 630: } ! 631: ! 632: uint sbbs_t::getusrsub(uint subnum) ! 633: { ! 634: uint usub; ! 635: uint ugrp; ! 636: ! 637: ugrp = getusrgrp(subnum); ! 638: if(ugrp<=0) ! 639: return(0); ! 640: ! 641: for(usub=0;usub<usrsubs[ugrp];usub++) ! 642: if(usrsub[ugrp][usub]==subnum) ! 643: break; ! 644: ! 645: return(usub+1); ! 646: } ! 647: ! 648: int sbbs_t::dir_op(uint dirnum) ! 649: { ! 650: return(SYSOP || (cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron))); ! 651: } ! 652: ! 653:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.