Annotation of sbbs/sbbs2/chk_ar.c, revision 1.1.1.1

1.1       root        1: #line 1 "CHK_AR.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: 
                      7: int ar_exp(char **ptrptr, user_t user)
                      8: {
                      9:        uint len,true=1,not,or,equal,artype=AR_LEVEL,n,i,age;
                     10:        ulong l;
                     11:        struct tm *gm;
                     12: 
                     13: for(;(**ptrptr);(*ptrptr)++) {
                     14: 
                     15:        if((**ptrptr)==AR_ENDNEST)
                     16:                break;
                     17: 
                     18:        not=or=equal=0;
                     19: 
                     20:        if((**ptrptr)==AR_OR) {
                     21:         or=1;
                     22:                (*ptrptr)++; }
                     23:        
                     24:        if((**ptrptr)==AR_NOT) {
                     25:                not=1;
                     26:                (*ptrptr)++; }
                     27: 
                     28:        if((**ptrptr)==AR_EQUAL) {
                     29:         equal=1;
                     30:         (*ptrptr)++; }
                     31: 
                     32:        if((true && or) || (!true && !or))
                     33:                break;
                     34: 
                     35:        if((**ptrptr)==AR_BEGNEST) {
                     36:                (*ptrptr)++;
                     37:                if(ar_exp(ptrptr,user))
                     38:                        true=!not;
                     39:                else
                     40:                        true=not;
                     41:                while((**ptrptr)!=AR_ENDNEST && (**ptrptr)) /* in case of early exit */
                     42:                        (*ptrptr)++;
                     43:                if(!(**ptrptr))
                     44:                        break;
                     45:                continue; }
                     46: 
                     47:        artype=(**ptrptr);
                     48:        switch(artype) {
                     49:                case AR_ANSI:                           /* No arguments */
                     50:                case AR_RIP:
                     51:                case AR_WIP:
                     52:                case AR_LOCAL:
                     53:                case AR_EXPERT:
                     54:                case AR_SYSOP:
                     55:                case AR_QUIET:
                     56:                case AR_OS2:
                     57:                case AR_DOS:
                     58:                        break;
                     59:                default:
                     60:                        (*ptrptr)++;
                     61:                        break; }
                     62: 
                     63:        n=(**ptrptr);
                     64:        i=(*(short *)*ptrptr);
                     65:        switch(artype) {
                     66:                case AR_LEVEL:
                     67:                        if((equal && user.level!=n) || (!equal && user.level<n))
                     68:                                true=not;
                     69:                        else
                     70:                                true=!not;
                     71:                        if(!true) {
                     72:                                noaccess_str=text[NoAccessLevel];
                     73:                                noaccess_val=n; }
                     74:                        break;
                     75:                case AR_AGE:
                     76:                        age=getage(user.birth);
                     77:                        if((equal && age!=n) || (!equal && age<n))
                     78:                                true=not;
                     79:                        else
                     80:                                true=!not;
                     81:                        if(!true) {
                     82:                                noaccess_str=text[NoAccessAge];
                     83:                 noaccess_val=n; }
                     84:                        break;
                     85:                case AR_BPS:
                     86:                        if((equal && cur_rate!=i) || (!equal && cur_rate<i))
                     87:                                true=not;
                     88:                        else
                     89:                                true=!not;
                     90:                        (*ptrptr)++;
                     91:                        if(!true) {
                     92:                                noaccess_str=text[NoAccessBPS];
                     93:                                noaccess_val=i; }
                     94:                        break;
                     95:                case AR_ANSI:
                     96:                        if(!(user.misc&ANSI))
                     97:                                true=not;
                     98:                        else true=!not;
                     99:                        break;
                    100:                case AR_RIP:
                    101:                        if(!(user.misc&RIP))
                    102:                                true=not;
                    103:                        else true=!not;
                    104:             break;
                    105:                case AR_WIP:
                    106:                        if(!(user.misc&WIP))
                    107:                                true=not;
                    108:                        else true=!not;
                    109:             break;
                    110:                case AR_OS2:
                    111:                        #ifndef __OS2__
                    112:                                true=not;
                    113:                        #else
                    114:                                true=!not;
                    115:                        #endif
                    116:                        break;
                    117:                case AR_DOS:
                    118:                        #ifdef __FLAT__
                    119:                                true=not;
                    120:                        #else
                    121:                                true=!not;
                    122:                        #endif
                    123:                        break;
                    124:                case AR_EXPERT:
                    125:                        if(!(user.misc&EXPERT))
                    126:                                true=not;
                    127:                        else true=!not;
                    128:             break;
                    129:                case AR_SYSOP:
                    130:                        if(!SYSOP)
                    131:                                true=not;
                    132:                        else true=!not;
                    133:             break;
                    134:                case AR_QUIET:
                    135:                        if(thisnode.status!=NODE_QUIET)
                    136:                                true=not;
                    137:                        else true=!not;
                    138:             break;
                    139:                case AR_LOCAL:
                    140:                        if(online!=ON_LOCAL)
                    141:                                true=not;
                    142:                        else true=!not;
                    143:             break;
                    144:                case AR_DAY:
                    145:                        now=time(NULL);
                    146:                        gm=localtime(&now);       /* Qnet call out based on time */
                    147:                        if((equal && gm->tm_wday!=n) || (!equal && gm->tm_wday<n))
                    148:                                true=not;
                    149:                        else
                    150:                                true=!not;
                    151:                        if(!true) {
                    152:                                noaccess_str=text[NoAccessDay];
                    153:                                noaccess_val=n; }
                    154:                        break;
                    155:                case AR_CREDIT:
                    156:                        l=(ulong)i*1024UL;
                    157:                        if((equal && user.cdt+user.freecdt!=l)
                    158:                                || (!equal && user.cdt+user.freecdt<l))
                    159:                                true=not;
                    160:                        else
                    161:                                true=!not;
                    162:                        (*ptrptr)++;
                    163:                        if(!true) {
                    164:                                noaccess_str=text[NoAccessCredit];
                    165:                                noaccess_val=l; }
                    166:                        break;
                    167:                case AR_NODE:
                    168:                        if((equal && node_num!=n) || (!equal && node_num<n))
                    169:                                true=not;
                    170:                        else
                    171:                                true=!not;
                    172:                        if(!true) {
                    173:                                noaccess_str=text[NoAccessNode];
                    174:                 noaccess_val=n; }
                    175:                        break;
                    176:                case AR_USER:
                    177:                        if((equal && user.number!=i) || (!equal && user.number<i))
                    178:                                true=not;
                    179:                        else
                    180:                                true=!not;
                    181:                        (*ptrptr)++;
                    182:                        if(!true) {
                    183:                                noaccess_str=text[NoAccessUser];
                    184:                                noaccess_val=i; }
                    185:                        break;
                    186:                case AR_GROUP:
                    187:                        if((equal
                    188:                                && (cursubnum<0 || cursubnum>=total_subs
                    189:                                        || sub[cursubnum]->grp!=i))
                    190:                                || (!equal && cursubnum>=0 && cursubnum<total_subs
                    191:                                        && sub[cursubnum]->grp<i))
                    192:                                true=not;
                    193:                        else
                    194:                                true=!not;
                    195:                        (*ptrptr)++;
                    196:                        if(!true) {
                    197:                                noaccess_str=text[NoAccessGroup];
                    198:                                noaccess_val=i+1; }
                    199:             break;
                    200:                case AR_SUB:
                    201:                        if((equal && cursubnum!=i) || (!equal && cursubnum<i))
                    202:                                true=not;
                    203:                        else
                    204:                                true=!not;
                    205:                        (*ptrptr)++;
                    206:                        if(!true) {
                    207:                                noaccess_str=text[NoAccessSub];
                    208:                                noaccess_val=i+1; }
                    209:             break;
                    210:                case AR_SUBCODE:
                    211:                        if(cursubnum<0 || cursubnum>=total_subs
                    212:                                || strcmp(sub[cursubnum]->code,*ptrptr))
                    213:                                true=not;
                    214:                        else
                    215:                                true=!not;
                    216:                        while(*(*ptrptr))
                    217:                                (*ptrptr)++;
                    218:                        if(!true)
                    219:                                noaccess_str=text[NoAccessSub];
                    220:                        break;
                    221:                case AR_LIB:
                    222:                        if((equal
                    223:                                && (curdirnum<0 || curdirnum>=total_dirs
                    224:                                        || dir[curdirnum]->lib!=i))
                    225:                                || (!equal && curdirnum>=0 && curdirnum<total_dirs
                    226:                                        && dir[curdirnum]->lib<i))
                    227:                                true=not;
                    228:                        else
                    229:                                true=!not;
                    230:                        (*ptrptr)++;
                    231:                        if(!true) {
                    232:                                noaccess_str=text[NoAccessLib];
                    233:                                noaccess_val=i+1; }
                    234:             break;
                    235:                case AR_DIR:
                    236:                        if((equal && curdirnum!=i) || (!equal && curdirnum<i))
                    237:                                true=not;
                    238:                        else
                    239:                                true=!not;
                    240:                        (*ptrptr)++;
                    241:                        if(!true) {
                    242:                                noaccess_str=text[NoAccessDir];
                    243:                                noaccess_val=i+1; }
                    244:             break;
                    245:                case AR_DIRCODE:
                    246:                        if(curdirnum<0 || curdirnum>=total_dirs
                    247:                                || strcmp(dir[curdirnum]->code,*ptrptr))
                    248:                                true=not;
                    249:                        else
                    250:                                true=!not;
                    251:                        while(*(*ptrptr))
                    252:                                (*ptrptr)++;
                    253:                        if(!true)
                    254:                                noaccess_str=text[NoAccessSub];
                    255:             break;
                    256:                case AR_EXPIRE:
                    257:                        now=time(NULL);
                    258:                        if(!user.expire || now+((long)i*24L*60L*60L)>user.expire)
                    259:                                true=not;
                    260:                        else
                    261:                                true=!not;
                    262:                        (*ptrptr)++;
                    263:                        if(!true) {
                    264:                                noaccess_str=text[NoAccessExpire];
                    265:                                noaccess_val=i; }
                    266:                        break;
                    267:                case AR_RANDOM:
                    268:                        n=random(i+1);
                    269:                        if((equal && n!=i) || (!equal && n<i))
                    270:                                true=not;
                    271:                        else
                    272:                                true=!not;
                    273:                        (*ptrptr)++;
                    274:                        break;
                    275:                case AR_LASTON:
                    276:                        now=time(NULL);
                    277:                        if((now-user.laston)/(24L*60L*60L)<i)
                    278:                                true=not;
                    279:                        else
                    280:                                true=!not;
                    281:                        (*ptrptr)++;
                    282:                        break;
                    283:                case AR_LOGONS:
                    284:                        if((equal && user.logons!=i) || (!equal && user.logons<i))
                    285:                                true=not;
                    286:                        else
                    287:                                true=!not;
                    288:                        (*ptrptr)++;
                    289:                        break;
                    290:                case AR_MAIN_CMDS:
                    291:                        if((equal && main_cmds!=i) || (!equal && main_cmds<i))
                    292:                                true=not;
                    293:                        else
                    294:                                true=!not;
                    295:                        (*ptrptr)++;
                    296:             break;
                    297:                case AR_FILE_CMDS:
                    298:                        if((equal && xfer_cmds!=i) || (!equal && xfer_cmds<i))
                    299:                                true=not;
                    300:                        else
                    301:                                true=!not;
                    302:                        (*ptrptr)++;
                    303:             break;
                    304:                case AR_TLEFT:
                    305:                        if(timeleft/60<n)
                    306:                                true=not;
                    307:                        else
                    308:                                true=!not;
                    309:                        if(!true) {
                    310:                                noaccess_str=text[NoAccessTimeLeft];
                    311:                 noaccess_val=n; }
                    312:                        break;
                    313:                case AR_TUSED:
                    314:                        if((time(NULL)-logontime)/60<n)
                    315:                                true=not;
                    316:                        else
                    317:                                true=!not;
                    318:                        if(!true) {
                    319:                                noaccess_str=text[NoAccessTimeUsed];
                    320:                 noaccess_val=n; }
                    321:                        break;
                    322:                case AR_TIME:
                    323:                        now=time(NULL);
                    324:                        unixtodos(now,&date,&curtime);
                    325:                        if((curtime.ti_hour*60)+curtime.ti_min<i)
                    326:                                true=not;
                    327:                        else
                    328:                                true=!not;
                    329:                        (*ptrptr)++;
                    330:                        if(!true) {
                    331:                                noaccess_str=text[NoAccessTime];
                    332:                                noaccess_val=i; }
                    333:                        break;
                    334:                case AR_PCR:
                    335:                        if(user.logons>user.posts
                    336:                                && (!user.posts || 100/(user.logons/user.posts)<n))
                    337:                                true=not;
                    338:                        else
                    339:                                true=!not;
                    340:                        if(!true) {
                    341:                                noaccess_str=text[NoAccessPCR];
                    342:                 noaccess_val=n; }
                    343:                        break;
                    344:                case AR_UDR:    /* up/download byte ratio */
                    345:                        l=user.dlb;
                    346:                        if(!l) l=1;
                    347:                        if(user.dlb>user.ulb
                    348:                                && (!user.ulb || 100/(l/user.ulb)<n))
                    349:                                true=not;
                    350:                        else
                    351:                                true=!not;
                    352:                        if(!true) {
                    353:                                noaccess_str=text[NoAccessUDR];
                    354:                 noaccess_val=n; }
                    355:                        break;
                    356:                case AR_UDFR:   /* up/download file ratio */
                    357:                        i=user.dls;
                    358:                        if(!i) i=1;
                    359:                        if(user.dls>user.uls
                    360:                                && (!user.uls || 100/(i/user.uls)<n))
                    361:                                true=not;
                    362:                        else
                    363:                                true=!not;
                    364:                        if(!true) {
                    365:                                noaccess_str=text[NoAccessUDFR];
                    366:                 noaccess_val=n; }
                    367:             break;
                    368:                case AR_FLAG1:
                    369:                        if((!equal && !(user.flags1&FLAG(n)))
                    370:                                || (equal && user.flags1!=FLAG(n)))
                    371:                                true=not;
                    372:                        else
                    373:                                true=!not;
                    374:                        if(!true) {
                    375:                                noaccess_str=text[NoAccessFlag1];
                    376:                 noaccess_val=n; }
                    377:                        break;
                    378:                case AR_FLAG2:
                    379:                        if((!equal && !(user.flags2&FLAG(n)))
                    380:                                || (equal && user.flags2!=FLAG(n)))
                    381:                                true=not;
                    382:                        else
                    383:                                true=!not;
                    384:                        if(!true) {
                    385:                                noaccess_str=text[NoAccessFlag2];
                    386:                 noaccess_val=n; }
                    387:             break;
                    388:                case AR_FLAG3:
                    389:                        if((!equal && !(user.flags3&FLAG(n)))
                    390:                                || (equal && user.flags3!=FLAG(n)))
                    391:                                true=not;
                    392:                        else
                    393:                                true=!not;
                    394:                        if(!true) {
                    395:                                noaccess_str=text[NoAccessFlag3];
                    396:                 noaccess_val=n; }
                    397:             break;
                    398:                case AR_FLAG4:
                    399:                        if((!equal && !(user.flags4&FLAG(n)))
                    400:                                || (equal && user.flags4!=FLAG(n)))
                    401:                                true=not;
                    402:                        else
                    403:                                true=!not;
                    404:                        if(!true) {
                    405:                                noaccess_str=text[NoAccessFlag4];
                    406:                 noaccess_val=n; }
                    407:             break;
                    408:                case AR_REST:
                    409:                        if((!equal && !(user.rest&FLAG(n)))
                    410:                                || (equal && user.rest!=FLAG(n)))
                    411:                                true=not;
                    412:                        else
                    413:                                true=!not;
                    414:                        if(!true) {
                    415:                                noaccess_str=text[NoAccessRest];
                    416:                 noaccess_val=n; }
                    417:             break;
                    418:                case AR_EXEMPT:
                    419:                        if((!equal && !(user.exempt&FLAG(n)))
                    420:                                || (equal && user.exempt!=FLAG(n)))
                    421:                                true=not;
                    422:                        else
                    423:                                true=!not;
                    424:                        if(!true) {
                    425:                                noaccess_str=text[NoAccessExempt];
                    426:                 noaccess_val=n; }
                    427:             break;
                    428:                case AR_SEX:
                    429:                        if(user.sex!=n)
                    430:                                true=not;
                    431:                        else
                    432:                                true=!not;
                    433:                        if(!true) {
                    434:                                noaccess_str=text[NoAccessSex];
                    435:                 noaccess_val=n; }
                    436:                        break; } }
                    437: return(true);
                    438: }
                    439: 
                    440: int chk_ar(char *str, user_t user)
                    441: {
                    442:        char *p;
                    443: 
                    444: if(str==NULL)
                    445:        return(1);
                    446: p=str;
                    447: return(ar_exp(&p,user));
                    448: }
                    449: 
                    450: 
                    451: /****************************************************************************/
                    452: /* This function fills the usrsub, usrsubs, usrgrps, curgrp, and cursub     */
                    453: /* variables based on the security clearance of the current user (useron)   */
                    454: /****************************************************************************/
                    455: void getusrsubs()
                    456: {
                    457:     uint i,j,k,l;
                    458: 
                    459: for(j=0,i=0;i<total_grps;i++) {
                    460:     if(!chk_ar(grp[i]->ar,useron))
                    461:         continue;
                    462:     for(k=0,l=0;l<total_subs;l++) {
                    463:         if(sub[l]->grp!=i) continue;
                    464:         if(!chk_ar(sub[l]->ar,useron))
                    465:             continue;
                    466:         usrsub[j][k++]=l; }
                    467:     usrsubs[j]=k;
                    468:     if(!k)          /* No subs accessible in group */
                    469:         continue;
                    470:     usrgrp[j++]=i; }
                    471: usrgrps=j;
                    472: while((curgrp>=usrgrps || !usrsubs[curgrp]) && curgrp) curgrp--;
                    473: while(cursub[curgrp]>=usrsubs[curgrp] && cursub[curgrp]) cursub[curgrp]--;
                    474: }
                    475: 
                    476: /****************************************************************************/
                    477: /* This function fills the usrdir, usrdirs, usrlibs, curlib, and curdir     */
                    478: /* variables based on the security clearance of the current user (useron)   */
                    479: /****************************************************************************/
                    480: void getusrdirs()
                    481: {
                    482:     uint i,j,k,l;
                    483: 
                    484: if(useron.rest&FLAG('T')) {
                    485:     usrlibs=0;
                    486:     return; }
                    487: for(j=0,i=0;i<total_libs;i++) {
                    488:     if(!chk_ar(lib[i]->ar,useron))
                    489:         continue;
                    490:     for(k=0,l=0;l<total_dirs;l++) {
                    491:         if(dir[l]->lib!=i) continue;
                    492:         if(!chk_ar(dir[l]->ar,useron))
                    493:             continue;
                    494:         usrdir[j][k++]=l; }
                    495:     usrdirs[j]=k;
                    496:     if(!k)          /* No dirs accessible in lib */
                    497:         continue;
                    498:     usrlib[j++]=i; }
                    499: usrlibs=j;
                    500: while((curlib>=usrlibs || !usrdirs[curlib]) && curlib) curlib--;
                    501: while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--;
                    502: }
                    503: 
                    504: int dir_op(uint dirnum)
                    505: {
                    506: return(SYSOP || (dir[dirnum]->op_ar[0] && chk_ar(dir[dirnum]->op_ar,useron)));
                    507: }
                    508: 
                    509: 

unix.superglobalmegacorp.com

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