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