Annotation of sbbs/sbbs3/chk_ar.cpp, revision 1.1.1.1

1.1       root        1: /* chk_ar.cpp */
                      2: 
                      3: /* Synchronet ARS checking routine */
                      4: 
                      5: /* $Id: chk_ar.cpp,v 1.4 2000/11/16 13:48:42 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: #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_QUIET:
                     92:                        case AR_OS2:
                     93:                        case AR_DOS:
                     94:                                break;
                     95:                        default:
                     96:                                (*ptrptr)++;
                     97:                                break; }
                     98: 
                     99:                n=(**ptrptr);
                    100:                i=(*(short *)*ptrptr);
                    101:                switch(artype) {
                    102:                        case AR_LEVEL:
                    103:                                if((equal && user->level!=n) || (!equal && user->level<n))
                    104:                                        result=not;
                    105:                                else
                    106:                                        result=!not;
                    107:                                if(!result) {
                    108:                                        noaccess_str=text[NoAccessLevel];
                    109:                                        noaccess_val=n; }
                    110:                                break;
                    111:                        case AR_AGE:
                    112:                                age=getage(&cfg,user->birth);
                    113:                                if((equal && age!=n) || (!equal && age<n))
                    114:                                        result=not;
                    115:                                else
                    116:                                        result=!not;
                    117:                                if(!result) {
                    118:                                        noaccess_str=text[NoAccessAge];
                    119:                                        noaccess_val=n; }
                    120:                                break;
                    121:                        case AR_BPS:
                    122:                                if((equal && cur_rate!=i) || (!equal && cur_rate<i))
                    123:                                        result=not;
                    124:                                else
                    125:                                        result=!not;
                    126:                                (*ptrptr)++;
                    127:                                if(!result) {
                    128:                                        noaccess_str=text[NoAccessBPS];
                    129:                                        noaccess_val=i; }
                    130:                                break;
                    131:                        case AR_ANSI:
                    132:                                if(!(user->misc&ANSI))
                    133:                                        result=not;
                    134:                                else result=!not;
                    135:                                break;
                    136:                        case AR_RIP:
                    137:                                if(!(user->misc&RIP))
                    138:                                        result=not;
                    139:                                else result=!not;
                    140:                                break;
                    141:                        case AR_WIP:
                    142:                                if(!(user->misc&WIP))
                    143:                                        result=not;
                    144:                                else result=!not;
                    145:                                break;
                    146:                        case AR_OS2:
                    147:                                #ifndef __OS2__
                    148:                                        result=not;
                    149:                                #else
                    150:                                        result=!not;
                    151:                                #endif
                    152:                                break;
                    153:                        case AR_DOS:
                    154:                                #ifdef __FLAT__
                    155:                                        result=not;
                    156:                                #else
                    157:                                        result=!not;
                    158:                                #endif
                    159:                                break;
                    160:                        case AR_WIN32:
                    161:                                #ifndef _WIN32
                    162:                                        result=not;
                    163:                                #else
                    164:                                        result=!not;
                    165:                                #endif
                    166:                                break;
                    167:                        case AR_UNIX:
                    168:                                #ifndef __unix__
                    169:                                        result=not;
                    170:                                #else
                    171:                                        result=!not;
                    172:                                #endif
                    173:                                break;
                    174:                        case AR_LINUX:
                    175:                                #ifndef __linux__
                    176:                                        result=not;
                    177:                                #else
                    178:                                        result=!not;
                    179:                                #endif
                    180:                                break;
                    181:                        case AR_EXPERT:
                    182:                                if(!(user->misc&EXPERT))
                    183:                                        result=not;
                    184:                                else result=!not;
                    185:                                break;
                    186:                        case AR_SYSOP:
                    187:                                if(!SYSOP)
                    188:                                        result=not;
                    189:                                else result=!not;
                    190:                                break;
                    191:                        case AR_QUIET:
                    192:                                if(thisnode.status!=NODE_QUIET)
                    193:                                        result=not;
                    194:                                else result=!not;
                    195:                                break;
                    196:                        case AR_LOCAL:
                    197:                                if(online!=ON_LOCAL)
                    198:                                        result=not;
                    199:                                else result=!not;
                    200:                                break;
                    201:                        case AR_DAY:
                    202:                                now=time(NULL);
                    203:                                tm=localtime(&now);
                    204:                                if(tm==NULL || (equal && tm->tm_wday!=(int)n) 
                    205:                                        || (!equal && tm->tm_wday<(int)n))
                    206:                                        result=not;
                    207:                                else
                    208:                                        result=!not;
                    209:                                if(!result) {
                    210:                                        noaccess_str=text[NoAccessDay];
                    211:                                        noaccess_val=n; }
                    212:                                break;
                    213:                        case AR_CREDIT:
                    214:                                l=(ulong)i*1024UL;
                    215:                                if((equal && user->cdt+user->freecdt!=l)
                    216:                                        || (!equal && user->cdt+user->freecdt<l))
                    217:                                        result=not;
                    218:                                else
                    219:                                        result=!not;
                    220:                                (*ptrptr)++;
                    221:                                if(!result) {
                    222:                                        noaccess_str=text[NoAccessCredit];
                    223:                                        noaccess_val=l; }
                    224:                                break;
                    225:                        case AR_NODE:
                    226:                                if((equal && cfg.node_num!=n) || (!equal && cfg.node_num<n))
                    227:                                        result=not;
                    228:                                else
                    229:                                        result=!not;
                    230:                                if(!result) {
                    231:                                        noaccess_str=text[NoAccessNode];
                    232:                                        noaccess_val=n; }
                    233:                                break;
                    234:                        case AR_USER:
                    235:                                if((equal && user->number!=i) || (!equal && user->number<i))
                    236:                                        result=not;
                    237:                                else
                    238:                                        result=!not;
                    239:                                (*ptrptr)++;
                    240:                                if(!result) {
                    241:                                        noaccess_str=text[NoAccessUser];
                    242:                                        noaccess_val=i; }
                    243:                                break;
                    244:                        case AR_GROUP:
                    245:                                if((equal
                    246:                                        && (cursubnum>=cfg.total_subs
                    247:                                                || cfg.sub[cursubnum]->grp!=i))
                    248:                                        || (!equal && cursubnum<cfg.total_subs
                    249:                                                && cfg.sub[cursubnum]->grp<i))
                    250:                                        result=not;
                    251:                                else
                    252:                                        result=!not;
                    253:                                (*ptrptr)++;
                    254:                                if(!result) {
                    255:                                        noaccess_str=text[NoAccessGroup];
                    256:                                        noaccess_val=i+1; }
                    257:                                break;
                    258:                        case AR_SUB:
                    259:                                if((equal && cursubnum!=i) || (!equal && cursubnum<i))
                    260:                                        result=not;
                    261:                                else
                    262:                                        result=!not;
                    263:                                (*ptrptr)++;
                    264:                                if(!result) {
                    265:                                        noaccess_str=text[NoAccessSub];
                    266:                                        noaccess_val=i+1; }
                    267:                                break;
                    268:                        case AR_SUBCODE:
                    269:                                if(cursubnum>=cfg.total_subs
                    270:                                        || strcmp(cfg.sub[cursubnum]->code,(char*)*ptrptr))
                    271:                                        result=not;
                    272:                                else
                    273:                                        result=!not;
                    274:                                while(*(*ptrptr))
                    275:                                        (*ptrptr)++;
                    276:                                if(!result)
                    277:                                        noaccess_str=text[NoAccessSub];
                    278:                                break;
                    279:                        case AR_LIB:
                    280:                                if((equal
                    281:                                        && (curdirnum>=cfg.total_dirs
                    282:                                                || cfg.dir[curdirnum]->lib!=i))
                    283:                                        || (!equal && curdirnum<cfg.total_dirs
                    284:                                                && cfg.dir[curdirnum]->lib<i))
                    285:                                        result=not;
                    286:                                else
                    287:                                        result=!not;
                    288:                                (*ptrptr)++;
                    289:                                if(!result) {
                    290:                                        noaccess_str=text[NoAccessLib];
                    291:                                        noaccess_val=i+1; }
                    292:                                break;
                    293:                        case AR_DIR:
                    294:                                if((equal && curdirnum!=i) || (!equal && curdirnum<i))
                    295:                                        result=not;
                    296:                                else
                    297:                                        result=!not;
                    298:                                (*ptrptr)++;
                    299:                                if(!result) {
                    300:                                        noaccess_str=text[NoAccessDir];
                    301:                                        noaccess_val=i+1; }
                    302:                                break;
                    303:                        case AR_DIRCODE:
                    304:                                if(curdirnum>=cfg.total_dirs
                    305:                                        || strcmp(cfg.dir[curdirnum]->code,(char *)*ptrptr))
                    306:                                        result=not;
                    307:                                else
                    308:                                        result=!not;
                    309:                                while(*(*ptrptr))
                    310:                                        (*ptrptr)++;
                    311:                                if(!result)
                    312:                                        noaccess_str=text[NoAccessSub];
                    313:                                break;
                    314:                        case AR_EXPIRE:
                    315:                                now=time(NULL);
                    316:                                if(!user->expire || now+((long)i*24L*60L*60L)>user->expire)
                    317:                                        result=not;
                    318:                                else
                    319:                                        result=!not;
                    320:                                (*ptrptr)++;
                    321:                                if(!result) {
                    322:                                        noaccess_str=text[NoAccessExpire];
                    323:                                        noaccess_val=i; }
                    324:                                break;
                    325:                        case AR_RANDOM:
                    326:                                n=sbbs_random(i+1);
                    327:                                if((equal && n!=i) || (!equal && n<i))
                    328:                                        result=not;
                    329:                                else
                    330:                                        result=!not;
                    331:                                (*ptrptr)++;
                    332:                                break;
                    333:                        case AR_LASTON:
                    334:                                now=time(NULL);
                    335:                                if((now-user->laston)/(24L*60L*60L)<(long)i)
                    336:                                        result=not;
                    337:                                else
                    338:                                        result=!not;
                    339:                                (*ptrptr)++;
                    340:                                break;
                    341:                        case AR_LOGONS:
                    342:                                if((equal && user->logons!=i) || (!equal && user->logons<i))
                    343:                                        result=not;
                    344:                                else
                    345:                                        result=!not;
                    346:                                (*ptrptr)++;
                    347:                                break;
                    348:                        case AR_MAIN_CMDS:
                    349:                                if((equal && main_cmds!=i) || (!equal && main_cmds<i))
                    350:                                        result=not;
                    351:                                else
                    352:                                        result=!not;
                    353:                                (*ptrptr)++;
                    354:                                break;
                    355:                        case AR_FILE_CMDS:
                    356:                                if((equal && xfer_cmds!=i) || (!equal && xfer_cmds<i))
                    357:                                        result=not;
                    358:                                else
                    359:                                        result=!not;
                    360:                                (*ptrptr)++;
                    361:                                break;
                    362:                        case AR_TLEFT:
                    363:                                if(timeleft/60<(ulong)n)
                    364:                                        result=not;
                    365:                                else
                    366:                                        result=!not;
                    367:                                if(!result) {
                    368:                                        noaccess_str=text[NoAccessTimeLeft];
                    369:                                        noaccess_val=n; }
                    370:                                break;
                    371:                        case AR_TUSED:
                    372:                                if((time(NULL)-logontime)/60<(long)n)
                    373:                                        result=not;
                    374:                                else
                    375:                                        result=!not;
                    376:                                if(!result) {
                    377:                                        noaccess_str=text[NoAccessTimeUsed];
                    378:                                        noaccess_val=n; }
                    379:                                break;
                    380:                        case AR_TIME:
                    381:                                now=time(NULL);
                    382:                                tm=gmtime(&now);
                    383:                                if(tm==NULL || (tm->tm_hour*60)+tm->tm_min<(int)i)
                    384:                                        result=not;
                    385:                                else
                    386:                                        result=!not;
                    387:                                (*ptrptr)++;
                    388:                                if(!result) {
                    389:                                        noaccess_str=text[NoAccessTime];
                    390:                                        noaccess_val=i; }
                    391:                                break;
                    392:                        case AR_PCR:
                    393:                                if(user->logons>user->posts
                    394:                                        && (!user->posts || 100/(user->logons/user->posts)<(long)n))
                    395:                                        result=not;
                    396:                                else
                    397:                                        result=!not;
                    398:                                if(!result) {
                    399:                                        noaccess_str=text[NoAccessPCR];
                    400:                                        noaccess_val=n; }
                    401:                                break;
                    402:                        case AR_UDR:    /* up/download byte ratio */
                    403:                                l=user->dlb;
                    404:                                if(!l) l=1;
                    405:                                if(user->dlb>user->ulb
                    406:                                        && (!user->ulb || 100/(l/user->ulb)<n))
                    407:                                        result=not;
                    408:                                else
                    409:                                        result=!not;
                    410:                                if(!result) {
                    411:                                        noaccess_str=text[NoAccessUDR];
                    412:                                        noaccess_val=n; }
                    413:                                break;
                    414:                        case AR_UDFR:   /* up/download file ratio */
                    415:                                i=user->dls;
                    416:                                if(!i) i=1;
                    417:                                if(user->dls>user->uls
                    418:                                        && (!user->uls || 100/(i/user->uls)<n))
                    419:                                        result=not;
                    420:                                else
                    421:                                        result=!not;
                    422:                                if(!result) {
                    423:                                        noaccess_str=text[NoAccessUDFR];
                    424:                                        noaccess_val=n; }
                    425:                                break;
                    426:                        case AR_FLAG1:
                    427:                                if((!equal && !(user->flags1&FLAG(n)))
                    428:                                        || (equal && user->flags1!=FLAG(n)))
                    429:                                        result=not;
                    430:                                else
                    431:                                        result=!not;
                    432:                                if(!result) {
                    433:                                        noaccess_str=text[NoAccessFlag1];
                    434:                                        noaccess_val=n; }
                    435:                                break;
                    436:                        case AR_FLAG2:
                    437:                                if((!equal && !(user->flags2&FLAG(n)))
                    438:                                        || (equal && user->flags2!=FLAG(n)))
                    439:                                        result=not;
                    440:                                else
                    441:                                        result=!not;
                    442:                                if(!result) {
                    443:                                        noaccess_str=text[NoAccessFlag2];
                    444:                                        noaccess_val=n; }
                    445:                                break;
                    446:                        case AR_FLAG3:
                    447:                                if((!equal && !(user->flags3&FLAG(n)))
                    448:                                        || (equal && user->flags3!=FLAG(n)))
                    449:                                        result=not;
                    450:                                else
                    451:                                        result=!not;
                    452:                                if(!result) {
                    453:                                        noaccess_str=text[NoAccessFlag3];
                    454:                                        noaccess_val=n; }
                    455:                                break;
                    456:                        case AR_FLAG4:
                    457:                                if((!equal && !(user->flags4&FLAG(n)))
                    458:                                        || (equal && user->flags4!=FLAG(n)))
                    459:                                        result=not;
                    460:                                else
                    461:                                        result=!not;
                    462:                                if(!result) {
                    463:                                        noaccess_str=text[NoAccessFlag4];
                    464:                                        noaccess_val=n; }
                    465:                                break;
                    466:                        case AR_REST:
                    467:                                if((!equal && !(user->rest&FLAG(n)))
                    468:                                        || (equal && user->rest!=FLAG(n)))
                    469:                                        result=not;
                    470:                                else
                    471:                                        result=!not;
                    472:                                if(!result) {
                    473:                                        noaccess_str=text[NoAccessRest];
                    474:                                        noaccess_val=n; }
                    475:                                break;
                    476:                        case AR_EXEMPT:
                    477:                                if((!equal && !(user->exempt&FLAG(n)))
                    478:                                        || (equal && user->exempt!=FLAG(n)))
                    479:                                        result=not;
                    480:                                else
                    481:                                        result=!not;
                    482:                                if(!result) {
                    483:                                        noaccess_str=text[NoAccessExempt];
                    484:                                        noaccess_val=n; }
                    485:                                break;
                    486:                        case AR_SEX:
                    487:                                if(user->sex!=n)
                    488:                                        result=not;
                    489:                                else
                    490:                                        result=!not;
                    491:                                if(!result) {
                    492:                                        noaccess_str=text[NoAccessSex];
                    493:                                        noaccess_val=n; }
                    494:                                break; } }
                    495:        return(result);
                    496: }
                    497: 
                    498: bool sbbs_t::chk_ar(uchar *ar, user_t* user)
                    499: {
                    500:        uchar *p;
                    501: 
                    502:        if(ar==NULL)
                    503:                return(true);
                    504:        p=ar;
                    505:        return(ar_exp(&p,user));
                    506: }
                    507: 
                    508: 
                    509: /****************************************************************************/
                    510: /* This function fills the usrsub, usrsubs, usrgrps, curgrp, and cursub     */
                    511: /* variables based on the security clearance of the current user (useron)   */
                    512: /****************************************************************************/
                    513: void sbbs_t::getusrsubs()
                    514: {
                    515:     uint i,j,k,l;
                    516: 
                    517:        for(j=0,i=0;i<cfg.total_grps;i++) {
                    518:                if(!chk_ar(cfg.grp[i]->ar,&useron))
                    519:                        continue;
                    520:                for(k=0,l=0;l<cfg.total_subs;l++) {
                    521:                        if(cfg.sub[l]->grp!=i) continue;
                    522:                        if(!chk_ar(cfg.sub[l]->ar,&useron))
                    523:                                continue;
                    524:                        usrsub[j][k++]=l; 
                    525:                }
                    526:                usrsubs[j]=k;
                    527:                if(!k)          /* No subs accessible in group */
                    528:                        continue;
                    529:                usrgrp[j++]=i; 
                    530:        }
                    531:        usrgrps=j;
                    532:        if(usrgrps==0)
                    533:                return;
                    534:        while((curgrp>=usrgrps || !usrsubs[curgrp]) && curgrp) curgrp--;
                    535:        while(cursub[curgrp]>=usrsubs[curgrp] && cursub[curgrp]) cursub[curgrp]--;
                    536: }
                    537: 
                    538: /****************************************************************************/
                    539: /* This function fills the usrdir, usrdirs, usrlibs, curlib, and curdir     */
                    540: /* variables based on the security clearance of the current user (useron)   */
                    541: /****************************************************************************/
                    542: void sbbs_t::getusrdirs()
                    543: {
                    544:     uint i,j,k,l;
                    545: 
                    546:        if(useron.rest&FLAG('T')) {
                    547:                usrlibs=0;
                    548:                return; 
                    549:        }
                    550:        for(j=0,i=0;i<cfg.total_libs;i++) {
                    551:                if(!chk_ar(cfg.lib[i]->ar,&useron))
                    552:                        continue;
                    553:                for(k=0,l=0;l<cfg.total_dirs;l++) {
                    554:                        if(cfg.dir[l]->lib!=i) continue;
                    555:                        if(!chk_ar(cfg.dir[l]->ar,&useron))
                    556:                                continue;
                    557:                        usrdir[j][k++]=l; }
                    558:                usrdirs[j]=k;
                    559:                if(!k)          /* No dirs accessible in lib */
                    560:                        continue;
                    561:                usrlib[j++]=i; 
                    562:        }
                    563:        usrlibs=j;
                    564:        if(usrlibs==0)
                    565:                return;
                    566:        while((curlib>=usrlibs || !usrdirs[curlib]) && curlib) curlib--;
                    567:        while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--;
                    568: }
                    569: 
                    570: int sbbs_t::dir_op(uint dirnum)
                    571: {
                    572:        return(SYSOP || (cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron)));
                    573: }
                    574: 
                    575: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.