|
|
1.1 root 1: /* chk_ar.cpp */
2:
3: /* Synchronet ARS checking routine */
4:
5: /* $Id: chk_ar.cpp,v 1.4 2000/11/16 13:48:42 rswindell Exp $ */
6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #include "sbbs.h"
39:
40: bool sbbs_t::ar_exp(uchar **ptrptr, user_t* user)
41: {
42: bool result,not,or,equal;
43: uint i,n,artype,age;
44: ulong l;
45: struct tm * tm;
46:
47: result = true;
48:
49: for(;(**ptrptr);(*ptrptr)++) {
50:
51: if((**ptrptr)==AR_ENDNEST)
52: break;
53:
54: not=or=equal = false;
55:
56: if((**ptrptr)==AR_OR) {
57: or=true;
58: (*ptrptr)++; }
59:
60: if((**ptrptr)==AR_NOT) {
61: not=true;
62: (*ptrptr)++; }
63:
64: if((**ptrptr)==AR_EQUAL) {
65: equal=true;
66: (*ptrptr)++; }
67:
68: if((result && or) || (!result && !or))
69: break;
70:
71: if((**ptrptr)==AR_BEGNEST) {
72: (*ptrptr)++;
73: if(ar_exp(ptrptr,user))
74: result=!not;
75: else
76: result=not;
77: while((**ptrptr)!=AR_ENDNEST && (**ptrptr)) /* in case of early exit */
78: (*ptrptr)++;
79: if(!(**ptrptr))
80: break;
81: continue; }
82:
83: artype=(**ptrptr);
84: switch(artype) {
85: case AR_ANSI: /* No arguments */
86: case AR_RIP:
87: case AR_WIP:
88: case AR_LOCAL:
89: case AR_EXPERT:
90: case AR_SYSOP:
91: case AR_QUIET:
92: case AR_OS2:
93: case AR_DOS:
94: break;
95: default:
96: (*ptrptr)++;
97: break; }
98:
99: n=(**ptrptr);
100: i=(*(short *)*ptrptr);
101: switch(artype) {
102: case AR_LEVEL:
103: if((equal && user->level!=n) || (!equal && user->level<n))
104: result=not;
105: else
106: result=!not;
107: if(!result) {
108: noaccess_str=text[NoAccessLevel];
109: noaccess_val=n; }
110: break;
111: case AR_AGE:
112: age=getage(&cfg,user->birth);
113: if((equal && age!=n) || (!equal && age<n))
114: result=not;
115: else
116: result=!not;
117: if(!result) {
118: noaccess_str=text[NoAccessAge];
119: noaccess_val=n; }
120: break;
121: case AR_BPS:
122: if((equal && cur_rate!=i) || (!equal && cur_rate<i))
123: result=not;
124: else
125: result=!not;
126: (*ptrptr)++;
127: if(!result) {
128: noaccess_str=text[NoAccessBPS];
129: noaccess_val=i; }
130: break;
131: case AR_ANSI:
132: if(!(user->misc&ANSI))
133: result=not;
134: else result=!not;
135: break;
136: case AR_RIP:
137: if(!(user->misc&RIP))
138: result=not;
139: else result=!not;
140: break;
141: case AR_WIP:
142: if(!(user->misc&WIP))
143: result=not;
144: else result=!not;
145: break;
146: case AR_OS2:
147: #ifndef __OS2__
148: result=not;
149: #else
150: result=!not;
151: #endif
152: break;
153: case AR_DOS:
154: #ifdef __FLAT__
155: result=not;
156: #else
157: result=!not;
158: #endif
159: break;
160: case AR_WIN32:
161: #ifndef _WIN32
162: result=not;
163: #else
164: result=!not;
165: #endif
166: break;
167: case AR_UNIX:
168: #ifndef __unix__
169: result=not;
170: #else
171: result=!not;
172: #endif
173: break;
174: case AR_LINUX:
175: #ifndef __linux__
176: result=not;
177: #else
178: result=!not;
179: #endif
180: break;
181: case AR_EXPERT:
182: if(!(user->misc&EXPERT))
183: result=not;
184: else result=!not;
185: break;
186: case AR_SYSOP:
187: if(!SYSOP)
188: result=not;
189: else result=!not;
190: break;
191: case AR_QUIET:
192: if(thisnode.status!=NODE_QUIET)
193: result=not;
194: else result=!not;
195: break;
196: case AR_LOCAL:
197: if(online!=ON_LOCAL)
198: result=not;
199: else result=!not;
200: break;
201: case AR_DAY:
202: now=time(NULL);
203: tm=localtime(&now);
204: if(tm==NULL || (equal && tm->tm_wday!=(int)n)
205: || (!equal && tm->tm_wday<(int)n))
206: result=not;
207: else
208: result=!not;
209: if(!result) {
210: noaccess_str=text[NoAccessDay];
211: noaccess_val=n; }
212: break;
213: case AR_CREDIT:
214: l=(ulong)i*1024UL;
215: if((equal && user->cdt+user->freecdt!=l)
216: || (!equal && user->cdt+user->freecdt<l))
217: result=not;
218: else
219: result=!not;
220: (*ptrptr)++;
221: if(!result) {
222: noaccess_str=text[NoAccessCredit];
223: noaccess_val=l; }
224: break;
225: case AR_NODE:
226: if((equal && cfg.node_num!=n) || (!equal && cfg.node_num<n))
227: result=not;
228: else
229: result=!not;
230: if(!result) {
231: noaccess_str=text[NoAccessNode];
232: noaccess_val=n; }
233: break;
234: case AR_USER:
235: if((equal && user->number!=i) || (!equal && user->number<i))
236: result=not;
237: else
238: result=!not;
239: (*ptrptr)++;
240: if(!result) {
241: noaccess_str=text[NoAccessUser];
242: noaccess_val=i; }
243: break;
244: case AR_GROUP:
245: if((equal
246: && (cursubnum>=cfg.total_subs
247: || cfg.sub[cursubnum]->grp!=i))
248: || (!equal && cursubnum<cfg.total_subs
249: && cfg.sub[cursubnum]->grp<i))
250: result=not;
251: else
252: result=!not;
253: (*ptrptr)++;
254: if(!result) {
255: noaccess_str=text[NoAccessGroup];
256: noaccess_val=i+1; }
257: break;
258: case AR_SUB:
259: if((equal && cursubnum!=i) || (!equal && cursubnum<i))
260: result=not;
261: else
262: result=!not;
263: (*ptrptr)++;
264: if(!result) {
265: noaccess_str=text[NoAccessSub];
266: noaccess_val=i+1; }
267: break;
268: case AR_SUBCODE:
269: if(cursubnum>=cfg.total_subs
270: || strcmp(cfg.sub[cursubnum]->code,(char*)*ptrptr))
271: result=not;
272: else
273: result=!not;
274: while(*(*ptrptr))
275: (*ptrptr)++;
276: if(!result)
277: noaccess_str=text[NoAccessSub];
278: break;
279: case AR_LIB:
280: if((equal
281: && (curdirnum>=cfg.total_dirs
282: || cfg.dir[curdirnum]->lib!=i))
283: || (!equal && curdirnum<cfg.total_dirs
284: && cfg.dir[curdirnum]->lib<i))
285: result=not;
286: else
287: result=!not;
288: (*ptrptr)++;
289: if(!result) {
290: noaccess_str=text[NoAccessLib];
291: noaccess_val=i+1; }
292: break;
293: case AR_DIR:
294: if((equal && curdirnum!=i) || (!equal && curdirnum<i))
295: result=not;
296: else
297: result=!not;
298: (*ptrptr)++;
299: if(!result) {
300: noaccess_str=text[NoAccessDir];
301: noaccess_val=i+1; }
302: break;
303: case AR_DIRCODE:
304: if(curdirnum>=cfg.total_dirs
305: || strcmp(cfg.dir[curdirnum]->code,(char *)*ptrptr))
306: result=not;
307: else
308: result=!not;
309: while(*(*ptrptr))
310: (*ptrptr)++;
311: if(!result)
312: noaccess_str=text[NoAccessSub];
313: break;
314: case AR_EXPIRE:
315: now=time(NULL);
316: if(!user->expire || now+((long)i*24L*60L*60L)>user->expire)
317: result=not;
318: else
319: result=!not;
320: (*ptrptr)++;
321: if(!result) {
322: noaccess_str=text[NoAccessExpire];
323: noaccess_val=i; }
324: break;
325: case AR_RANDOM:
326: n=sbbs_random(i+1);
327: if((equal && n!=i) || (!equal && n<i))
328: result=not;
329: else
330: result=!not;
331: (*ptrptr)++;
332: break;
333: case AR_LASTON:
334: now=time(NULL);
335: if((now-user->laston)/(24L*60L*60L)<(long)i)
336: result=not;
337: else
338: result=!not;
339: (*ptrptr)++;
340: break;
341: case AR_LOGONS:
342: if((equal && user->logons!=i) || (!equal && user->logons<i))
343: result=not;
344: else
345: result=!not;
346: (*ptrptr)++;
347: break;
348: case AR_MAIN_CMDS:
349: if((equal && main_cmds!=i) || (!equal && main_cmds<i))
350: result=not;
351: else
352: result=!not;
353: (*ptrptr)++;
354: break;
355: case AR_FILE_CMDS:
356: if((equal && xfer_cmds!=i) || (!equal && xfer_cmds<i))
357: result=not;
358: else
359: result=!not;
360: (*ptrptr)++;
361: break;
362: case AR_TLEFT:
363: if(timeleft/60<(ulong)n)
364: result=not;
365: else
366: result=!not;
367: if(!result) {
368: noaccess_str=text[NoAccessTimeLeft];
369: noaccess_val=n; }
370: break;
371: case AR_TUSED:
372: if((time(NULL)-logontime)/60<(long)n)
373: result=not;
374: else
375: result=!not;
376: if(!result) {
377: noaccess_str=text[NoAccessTimeUsed];
378: noaccess_val=n; }
379: break;
380: case AR_TIME:
381: now=time(NULL);
382: tm=gmtime(&now);
383: if(tm==NULL || (tm->tm_hour*60)+tm->tm_min<(int)i)
384: result=not;
385: else
386: result=!not;
387: (*ptrptr)++;
388: if(!result) {
389: noaccess_str=text[NoAccessTime];
390: noaccess_val=i; }
391: break;
392: case AR_PCR:
393: if(user->logons>user->posts
394: && (!user->posts || 100/(user->logons/user->posts)<(long)n))
395: result=not;
396: else
397: result=!not;
398: if(!result) {
399: noaccess_str=text[NoAccessPCR];
400: noaccess_val=n; }
401: break;
402: case AR_UDR: /* up/download byte ratio */
403: l=user->dlb;
404: if(!l) l=1;
405: if(user->dlb>user->ulb
406: && (!user->ulb || 100/(l/user->ulb)<n))
407: result=not;
408: else
409: result=!not;
410: if(!result) {
411: noaccess_str=text[NoAccessUDR];
412: noaccess_val=n; }
413: break;
414: case AR_UDFR: /* up/download file ratio */
415: i=user->dls;
416: if(!i) i=1;
417: if(user->dls>user->uls
418: && (!user->uls || 100/(i/user->uls)<n))
419: result=not;
420: else
421: result=!not;
422: if(!result) {
423: noaccess_str=text[NoAccessUDFR];
424: noaccess_val=n; }
425: break;
426: case AR_FLAG1:
427: if((!equal && !(user->flags1&FLAG(n)))
428: || (equal && user->flags1!=FLAG(n)))
429: result=not;
430: else
431: result=!not;
432: if(!result) {
433: noaccess_str=text[NoAccessFlag1];
434: noaccess_val=n; }
435: break;
436: case AR_FLAG2:
437: if((!equal && !(user->flags2&FLAG(n)))
438: || (equal && user->flags2!=FLAG(n)))
439: result=not;
440: else
441: result=!not;
442: if(!result) {
443: noaccess_str=text[NoAccessFlag2];
444: noaccess_val=n; }
445: break;
446: case AR_FLAG3:
447: if((!equal && !(user->flags3&FLAG(n)))
448: || (equal && user->flags3!=FLAG(n)))
449: result=not;
450: else
451: result=!not;
452: if(!result) {
453: noaccess_str=text[NoAccessFlag3];
454: noaccess_val=n; }
455: break;
456: case AR_FLAG4:
457: if((!equal && !(user->flags4&FLAG(n)))
458: || (equal && user->flags4!=FLAG(n)))
459: result=not;
460: else
461: result=!not;
462: if(!result) {
463: noaccess_str=text[NoAccessFlag4];
464: noaccess_val=n; }
465: break;
466: case AR_REST:
467: if((!equal && !(user->rest&FLAG(n)))
468: || (equal && user->rest!=FLAG(n)))
469: result=not;
470: else
471: result=!not;
472: if(!result) {
473: noaccess_str=text[NoAccessRest];
474: noaccess_val=n; }
475: break;
476: case AR_EXEMPT:
477: if((!equal && !(user->exempt&FLAG(n)))
478: || (equal && user->exempt!=FLAG(n)))
479: result=not;
480: else
481: result=!not;
482: if(!result) {
483: noaccess_str=text[NoAccessExempt];
484: noaccess_val=n; }
485: break;
486: case AR_SEX:
487: if(user->sex!=n)
488: result=not;
489: else
490: result=!not;
491: if(!result) {
492: noaccess_str=text[NoAccessSex];
493: noaccess_val=n; }
494: break; } }
495: return(result);
496: }
497:
498: bool sbbs_t::chk_ar(uchar *ar, user_t* user)
499: {
500: uchar *p;
501:
502: if(ar==NULL)
503: return(true);
504: p=ar;
505: return(ar_exp(&p,user));
506: }
507:
508:
509: /****************************************************************************/
510: /* This function fills the usrsub, usrsubs, usrgrps, curgrp, and cursub */
511: /* variables based on the security clearance of the current user (useron) */
512: /****************************************************************************/
513: void sbbs_t::getusrsubs()
514: {
515: uint i,j,k,l;
516:
517: for(j=0,i=0;i<cfg.total_grps;i++) {
518: if(!chk_ar(cfg.grp[i]->ar,&useron))
519: continue;
520: for(k=0,l=0;l<cfg.total_subs;l++) {
521: if(cfg.sub[l]->grp!=i) continue;
522: if(!chk_ar(cfg.sub[l]->ar,&useron))
523: continue;
524: usrsub[j][k++]=l;
525: }
526: usrsubs[j]=k;
527: if(!k) /* No subs accessible in group */
528: continue;
529: usrgrp[j++]=i;
530: }
531: usrgrps=j;
532: if(usrgrps==0)
533: return;
534: while((curgrp>=usrgrps || !usrsubs[curgrp]) && curgrp) curgrp--;
535: while(cursub[curgrp]>=usrsubs[curgrp] && cursub[curgrp]) cursub[curgrp]--;
536: }
537:
538: /****************************************************************************/
539: /* This function fills the usrdir, usrdirs, usrlibs, curlib, and curdir */
540: /* variables based on the security clearance of the current user (useron) */
541: /****************************************************************************/
542: void sbbs_t::getusrdirs()
543: {
544: uint i,j,k,l;
545:
546: if(useron.rest&FLAG('T')) {
547: usrlibs=0;
548: return;
549: }
550: for(j=0,i=0;i<cfg.total_libs;i++) {
551: if(!chk_ar(cfg.lib[i]->ar,&useron))
552: continue;
553: for(k=0,l=0;l<cfg.total_dirs;l++) {
554: if(cfg.dir[l]->lib!=i) continue;
555: if(!chk_ar(cfg.dir[l]->ar,&useron))
556: continue;
557: usrdir[j][k++]=l; }
558: usrdirs[j]=k;
559: if(!k) /* No dirs accessible in lib */
560: continue;
561: usrlib[j++]=i;
562: }
563: usrlibs=j;
564: if(usrlibs==0)
565: return;
566: while((curlib>=usrlibs || !usrdirs[curlib]) && curlib) curlib--;
567: while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--;
568: }
569:
570: int sbbs_t::dir_op(uint dirnum)
571: {
572: return(SYSOP || (cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron)));
573: }
574:
575:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.