--- sbbs/src/sbbs3/chk_ar.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/chk_ar.cpp 2018/04/24 16:43:15 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet ARS checking routine */ -/* $Id: chk_ar.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: chk_ar.cpp,v 1.1.1.2 2018/04/24 16:43:15 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2009 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -37,12 +37,13 @@ #include "sbbs.h" -bool sbbs_t::ar_exp(uchar **ptrptr, user_t* user) +bool sbbs_t::ar_exp(const uchar **ptrptr, user_t* user, client_t* client) { bool result,_not,_or,equal; uint i,n,artype,age; ulong l; struct tm tm; + const char* p; result = true; @@ -55,22 +56,25 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user if((**ptrptr)==AR_OR) { _or=true; - (*ptrptr)++; } + (*ptrptr)++; + } if((**ptrptr)==AR_NOT) { _not=true; - (*ptrptr)++; } + (*ptrptr)++; + } if((**ptrptr)==AR_EQUAL) { equal=true; - (*ptrptr)++; } + (*ptrptr)++; + } if((result && _or) || (!result && !_or)) break; if((**ptrptr)==AR_BEGNEST) { (*ptrptr)++; - if(ar_exp(ptrptr,user)) + if(ar_exp(ptrptr,user,client)) result=!_not; else result=_not; @@ -78,7 +82,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user (*ptrptr)++; if(!(**ptrptr)) break; - continue; } + continue; + } artype=(**ptrptr); switch(artype) { @@ -99,7 +104,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user break; default: (*ptrptr)++; - break; } + break; + } n=(**ptrptr); i=(*(short *)*ptrptr); @@ -111,7 +117,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessLevel]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_AGE: age=getage(&cfg,user->birth); @@ -121,7 +128,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessAge]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_BPS: if((equal && cur_rate!=i) || (!equal && cur_ratemisc&ANSI)) @@ -234,7 +243,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessDay]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_CREDIT: l=(ulong)i*1024UL; @@ -246,7 +256,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user (*ptrptr)++; if(!result) { noaccess_str=text[NoAccessCredit]; - noaccess_val=l; } + noaccess_val=l; + } break; case AR_NODE: if((equal && cfg.node_num!=n) || (!equal && cfg.node_numnumber!=i) || (!equal && user->number=cfg.total_subs - || stricmp(cfg.sub[cursubnum]->code,(char*)*ptrptr)) + || !findstr_in_string(cfg.sub[cursubnum]->code,(char*)*ptrptr)) result=_not; else result=!_not; @@ -314,7 +329,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user (*ptrptr)++; if(!result) { noaccess_str=text[NoAccessLib]; - noaccess_val=i+1; } + noaccess_val=i+1; + } break; case AR_DIR: if((equal && curdirnum!=i) || (!equal && curdirnum=cfg.total_dirs - || stricmp(cfg.dir[curdirnum]->code,(char *)*ptrptr)) + || !findstr_in_string(cfg.dir[curdirnum]->code,(char *)*ptrptr)) result=_not; else result=!_not; @@ -346,7 +363,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user (*ptrptr)++; if(!result) { noaccess_str=text[NoAccessExpire]; - noaccess_val=i; } + noaccess_val=i; + } break; case AR_RANDOM: n=sbbs_random(i+1); @@ -392,7 +410,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessTimeLeft]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_TUSED: if((time(NULL)-logontime)/60<(long)n) @@ -401,7 +420,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessTimeUsed]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_TIME: now=time(NULL); @@ -413,7 +433,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user (*ptrptr)++; if(!result) { noaccess_str=text[NoAccessTime]; - noaccess_val=i; } + noaccess_val=i; + } break; case AR_PCR: /* post/call ratio (by percentage) */ if(user->logons>user->posts @@ -423,7 +444,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessPCR]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_UDR: /* up/download byte ratio (by percentage) */ l=user->dlb; @@ -435,7 +457,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessUDR]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_UDFR: /* up/download file ratio (in percentage) */ i=user->dls; @@ -447,7 +470,50 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessUDFR]; - noaccess_val=n; } + noaccess_val=n; + } + break; + case AR_ULS: + if((equal && user->uls!=i) || (!equal && user->ulsulb/1024)!=i) || (!equal && (user->ulb/1024)ulb/(1024*1024))!=i) || (!equal && (user->ulb/(1024*1024))dls!=i) || (!equal && user->dlsdlb/1024!=i) || (!equal && user->dlb/1024dlb/(1024*1024)!=i) || (!equal && user->dlb/(1024*1024)flags1&FLAG(n))) @@ -457,7 +523,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessFlag1]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_FLAG2: if((!equal && !(user->flags2&FLAG(n))) @@ -467,7 +534,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessFlag2]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_FLAG3: if((!equal && !(user->flags3&FLAG(n))) @@ -477,7 +545,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessFlag3]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_FLAG4: if((!equal && !(user->flags4&FLAG(n))) @@ -487,7 +556,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessFlag4]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_REST: if((!equal && !(user->rest&FLAG(n))) @@ -497,7 +567,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessRest]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_EXEMPT: if((!equal && !(user->exempt&FLAG(n))) @@ -507,7 +578,8 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessExempt]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_SEX: if(user->sex!=n) @@ -516,11 +588,12 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user result=!_not; if(!result) { noaccess_str=text[NoAccessSex]; - noaccess_val=n; } + noaccess_val=n; + } break; case AR_SHELL: if(user->shell>=cfg.total_shells - || stricmp(cfg.shell[user->shell]->code,(char*)*ptrptr)) + || !findstr_in_string(cfg.shell[user->shell]->code,(char*)*ptrptr)) result=_not; else result=!_not; @@ -528,7 +601,35 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user (*ptrptr)++; break; case AR_PROT: - if(stricmp(user->modem,(char*)*ptrptr)) /* should this be changed to client.prot? */ + if(client!=NULL) + p=client->protocol; + else + p=user->modem; + if(!findstr_in_string(p,(char*)*ptrptr)) + result=_not; + else + result=!_not; + while(*(*ptrptr)) + (*ptrptr)++; + break; + case AR_HOST: + if(client!=NULL) + p=client->host; + else + p=user->comp; + if(!findstr_in_string(p,(char*)*ptrptr)) + result=_not; + else + result=!_not; + while(*(*ptrptr)) + (*ptrptr)++; + break; + case AR_IP: + if(client!=NULL) + p=client->addr; + else + p=user->note; + if(!findstr_in_string(p,(char*)*ptrptr)) result=_not; else result=!_not; @@ -540,14 +641,14 @@ bool sbbs_t::ar_exp(uchar **ptrptr, user return(result); } -bool sbbs_t::chk_ar(uchar *ar, user_t* user) +bool sbbs_t::chk_ar(const uchar *ar, user_t* user, client_t* client) { - uchar *p; + const uchar *p; if(ar==NULL) return(true); p=ar; - return(ar_exp(&p,user)); + return(ar_exp(&p,user,client)); } @@ -560,11 +661,11 @@ void sbbs_t::getusrsubs() uint i,j,k,l; for(j=0,i=0;iar,&useron)) + if(!chk_ar(cfg.grp[i]->ar,&useron,&client)) continue; for(k=0,l=0;lgrp!=i) continue; - if(!chk_ar(cfg.sub[l]->ar,&useron)) + if(!chk_ar(cfg.sub[l]->ar,&useron,&client)) continue; usrsub[j][k++]=l; } @@ -593,13 +694,14 @@ void sbbs_t::getusrdirs() return; } for(j=0,i=0;iar,&useron)) + if(!chk_ar(cfg.lib[i]->ar,&useron,&client)) continue; for(k=0,l=0;llib!=i) continue; - if(!chk_ar(cfg.dir[l]->ar,&useron)) + if(!chk_ar(cfg.dir[l]->ar,&useron,&client)) continue; - usrdir[j][k++]=l; } + usrdir[j][k++]=l; + } usrdirs[j]=k; if(!k) /* No dirs accessible in lib */ continue; @@ -647,7 +749,7 @@ uint sbbs_t::getusrsub(uint subnum) int sbbs_t::dir_op(uint dirnum) { - return(SYSOP || (cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron))); + return(SYSOP || (cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron,&client))); }