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

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

unix.superglobalmegacorp.com

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