|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.