chk_ar.cpp 19.3 KB
Newer Older
1
2
3
4
/* chk_ar.cpp */

/* Synchronet ARS checking routine */

5
/* $Id: chk_ar.cpp,v 1.32 2020/03/19 18:50:51 rswindell Exp $ */
6
7
8
9
10

/****************************************************************************
 * @format.tab-size 4		(Plain Text/Source Code File Header)			*
 * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
 *																			*
11
 * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 *																			*
 * This program is free software; you can redistribute it and/or			*
 * modify it under the terms of the GNU General Public License				*
 * as published by the Free Software Foundation; either version 2			*
 * of the License, or (at your option) any later version.					*
 * See the GNU General Public License for more details: gpl.txt or			*
 * http://www.fsf.org/copyleft/gpl.html										*
 *																			*
 * Anonymous FTP access to the most recent released source is available at	*
 * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
 *																			*
 * Anonymous CVS access to the development source and modification history	*
 * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
 *     (just hit return, no password is necessary)							*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
 *																			*
 * For Synchronet coding style and modification guidelines, see				*
 * http://www.synchro.net/source.html										*
 *																			*
 * You are encouraged to submit any modifications (preferably in Unix diff	*
 * format) via e-mail to mods@synchro.net									*
 *																			*
 * Note: If this box doesn't appear square, then you need to fix your tabs.	*
 ****************************************************************************/

#include "sbbs.h"

rswindell's avatar
rswindell committed
40
bool sbbs_t::ar_exp(const uchar **ptrptr, user_t* user, client_t* client)
41
{
42
	bool	result,_not,_or,equal;
43
44
	uint	i,n,artype,age;
	ulong	l;
45
	struct tm tm;
rswindell's avatar
rswindell committed
46
	const char*	p;
47
48
49
50
51
52
53
54

	result = true;

	for(;(**ptrptr);(*ptrptr)++) {

		if((**ptrptr)==AR_ENDNEST)
			break;

55
		_not=_or=equal = false;
56
57

		if((**ptrptr)==AR_OR) {
58
			_or=true;
59
60
			(*ptrptr)++; 
		}
61
62
		
		if((**ptrptr)==AR_NOT) {
63
			_not=true;
64
65
			(*ptrptr)++; 
		}
66
67
68

		if((**ptrptr)==AR_EQUAL) {
			equal=true;
69
70
			(*ptrptr)++; 
		}
71

72
		if((result && _or) || (!result && !_or))
73
74
75
76
			break;

		if((**ptrptr)==AR_BEGNEST) {
			(*ptrptr)++;
rswindell's avatar
rswindell committed
77
			if(ar_exp(ptrptr,user,client))
78
				result=!_not;
79
			else
80
				result=_not;
81
82
83
84
			while((**ptrptr)!=AR_ENDNEST && (**ptrptr)) /* in case of early exit */
				(*ptrptr)++;
			if(!(**ptrptr))
				break;
85
86
			continue; 
		}
87
88
89
90

		artype=(**ptrptr);
		switch(artype) {
			case AR_ANSI:				/* No arguments */
rswindell's avatar
rswindell committed
91
			case AR_PETSCII:
92
93
94
			case AR_ASCII:
			case AR_UTF8:
			case AR_CP437:
95
96
97
98
99
			case AR_RIP:
			case AR_WIP:
			case AR_LOCAL:
			case AR_EXPERT:
			case AR_SYSOP:
100
101
			case AR_GUEST:
			case AR_QNODE:
102
103
104
			case AR_QUIET:
			case AR_OS2:
			case AR_DOS:
105
106
107
			case AR_WIN32:
			case AR_UNIX:
			case AR_LINUX:
108
109
110
			case AR_ACTIVE:
			case AR_INACTIVE:
			case AR_DELETED:
111
112
113
				break;
			default:
				(*ptrptr)++;
114
115
				break; 
		}
116
117
118
119
120
121

		n=(**ptrptr);
		i=(*(short *)*ptrptr);
		switch(artype) {
			case AR_LEVEL:
				if((equal && user->level!=n) || (!equal && user->level<n))
122
					result=_not;
123
				else
124
					result=!_not;
125
126
				if(!result) {
					noaccess_str=text[NoAccessLevel];
127
128
					noaccess_val=n; 
				}
129
130
131
132
				break;
			case AR_AGE:
				age=getage(&cfg,user->birth);
				if((equal && age!=n) || (!equal && age<n))
133
					result=_not;
134
				else
135
					result=!_not;
136
137
				if(!result) {
					noaccess_str=text[NoAccessAge];
138
139
					noaccess_val=n; 
				}
140
141
142
				break;
			case AR_BPS:
				if((equal && cur_rate!=i) || (!equal && cur_rate<i))
143
					result=_not;
144
				else
145
					result=!_not;
146
147
148
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessBPS];
149
150
					noaccess_val=i; 
				}
151
152
				break;
			case AR_ANSI:
153
				if(!term_supports(ANSI))
154
155
					result=_not;
				else result=!_not;
rswindell's avatar
rswindell committed
156
157
158
159
160
161
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=ANSI; 
				}
				break;
			case AR_PETSCII:
162
				if((term_supports()&CHARSET_FLAGS) != CHARSET_PETSCII)
rswindell's avatar
rswindell committed
163
164
165
166
167
168
					result=_not;
				else result=!_not;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=PETSCII; 
				}
169
				break;
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
			case AR_ASCII:
				if((term_supports()&CHARSET_FLAGS) != CHARSET_ASCII)
					result=_not;
				else result=!_not;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=NO_EXASCII; 
				}
				break;
			case AR_UTF8:
				if((term_supports()&CHARSET_FLAGS) != CHARSET_UTF8)
					result=_not;
				else result=!_not;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=UTF8; 
				}
				break;
			case AR_CP437:
				if((term_supports()&CHARSET_FLAGS) != CHARSET_CP437)
					result=_not;
				else result=!_not;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=0; 
				}
				break;
197
			case AR_RIP:
198
				if(!term_supports(RIP))
199
200
					result=_not;
				else result=!_not;
rswindell's avatar
rswindell committed
201
202
203
204
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=RIP; 
				}
205
206
				break;
			case AR_WIP:
207
				if(!term_supports(WIP))
208
209
					result=_not;
				else result=!_not;
rswindell's avatar
rswindell committed
210
211
212
213
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=WIP; 
				}
214
215
216
				break;
			case AR_OS2:
				#ifndef __OS2__
217
					result=_not;
218
				#else
219
					result=!_not;
220
221
				#endif
				break;
222
			case AR_DOS:	/* DOS program support */
deuce's avatar
deuce committed
223
				result=_not;
224
225
226
227
228
				if(startup->options&BBS_OPT_NO_DOS)
					break;
				#if defined(_WIN32) || (defined(__linux__) && defined(USE_DOSEMU)) || defined(__FreeBSD__)
					result=!_not;
				#endif
229
230
231
				break;
			case AR_WIN32:
				#ifndef _WIN32
232
					result=_not;
233
				#else
234
					result=!_not;
235
236
237
238
				#endif
				break;
			case AR_UNIX:
				#ifndef __unix__
239
					result=_not;
240
				#else
241
					result=!_not;
242
243
244
245
				#endif
				break;
			case AR_LINUX:
				#ifndef __linux__
246
					result=_not;
247
				#else
248
					result=!_not;
249
250
				#endif
				break;
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
			case AR_ACTIVE:
				if(user->misc&(DELETED|INACTIVE))
					result=_not;
				else result=!_not;
				break;
			case AR_INACTIVE:
				if(!(user->misc&INACTIVE))
					result=_not;
				else result=!_not;
				break;
			case AR_DELETED:
				if(!(user->misc&DELETED))
					result=_not;
				else result=!_not;
				break;
266
267
			case AR_EXPERT:
				if(!(user->misc&EXPERT))
268
269
					result=_not;
				else result=!_not;
270
271
272
				break;
			case AR_SYSOP:
				if(!SYSOP)
273
274
					result=_not;
				else result=!_not;
275
				break;
276
277
278
279
280
281
282
283
284
285
			case AR_GUEST:
				if(!(user->rest&FLAG('G')))
					result=_not;
				else result=!_not;
				break;
			case AR_QNODE:
				if(!(user->rest&FLAG('Q')))
					result=_not;
				else result=!_not;
				break;
286
287
			case AR_QUIET:
				if(thisnode.status!=NODE_QUIET)
288
289
					result=_not;
				else result=!_not;
290
291
292
				break;
			case AR_LOCAL:
				if(online!=ON_LOCAL)
293
294
					result=_not;
				else result=!_not;
295
296
297
				break;
			case AR_DAY:
				now=time(NULL);
298
299
300
				localtime_r(&now,&tm);
				if((equal && tm.tm_wday!=(int)n) 
					|| (!equal && tm.tm_wday<(int)n))
301
					result=_not;
302
				else
303
					result=!_not;
304
305
				if(!result) {
					noaccess_str=text[NoAccessDay];
306
307
					noaccess_val=n; 
				}
308
309
310
311
312
				break;
			case AR_CREDIT:
				l=(ulong)i*1024UL;
				if((equal && user->cdt+user->freecdt!=l)
					|| (!equal && user->cdt+user->freecdt<l))
313
					result=_not;
314
				else
315
					result=!_not;
316
317
318
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessCredit];
319
320
					noaccess_val=l; 
				}
321
322
323
				break;
			case AR_NODE:
				if((equal && cfg.node_num!=n) || (!equal && cfg.node_num<n))
324
					result=_not;
325
				else
326
					result=!_not;
327
328
				if(!result) {
					noaccess_str=text[NoAccessNode];
329
330
					noaccess_val=n; 
				}
331
332
333
				break;
			case AR_USER:
				if((equal && user->number!=i) || (!equal && user->number<i))
334
					result=_not;
335
				else
336
					result=!_not;
337
338
339
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessUser];
340
341
					noaccess_val=i; 
				}
342
343
344
345
346
347
348
				break;
			case AR_GROUP:
				if((equal
					&& (cursubnum>=cfg.total_subs
						|| cfg.sub[cursubnum]->grp!=i))
					|| (!equal && cursubnum<cfg.total_subs
						&& cfg.sub[cursubnum]->grp<i))
349
					result=_not;
350
				else
351
					result=!_not;
352
353
354
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessGroup];
355
356
					noaccess_val=i+1; 
				}
357
358
359
				break;
			case AR_SUB:
				if((equal && cursubnum!=i) || (!equal && cursubnum<i))
360
					result=_not;
361
				else
362
					result=!_not;
363
364
365
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessSub];
366
367
					noaccess_val=i+1; 
				}
368
369
370
				break;
			case AR_SUBCODE:
				if(cursubnum>=cfg.total_subs
rswindell's avatar
rswindell committed
371
					|| !findstr_in_string(cfg.sub[cursubnum]->code,(char*)*ptrptr))
372
					result=_not;
373
				else
374
					result=!_not;
375
376
377
378
379
380
381
382
383
384
385
				while(*(*ptrptr))
					(*ptrptr)++;
				if(!result)
					noaccess_str=text[NoAccessSub];
				break;
			case AR_LIB:
				if((equal
					&& (curdirnum>=cfg.total_dirs
						|| cfg.dir[curdirnum]->lib!=i))
					|| (!equal && curdirnum<cfg.total_dirs
						&& cfg.dir[curdirnum]->lib<i))
386
					result=_not;
387
				else
388
					result=!_not;
389
390
391
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessLib];
392
393
					noaccess_val=i+1; 
				}
394
395
396
				break;
			case AR_DIR:
				if((equal && curdirnum!=i) || (!equal && curdirnum<i))
397
					result=_not;
398
				else
399
					result=!_not;
400
401
402
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessDir];
403
404
					noaccess_val=i+1; 
				}
405
406
407
				break;
			case AR_DIRCODE:
				if(curdirnum>=cfg.total_dirs
rswindell's avatar
rswindell committed
408
					|| !findstr_in_string(cfg.dir[curdirnum]->code,(char *)*ptrptr))
409
					result=_not;
410
				else
411
					result=!_not;
412
413
414
415
416
417
418
419
				while(*(*ptrptr))
					(*ptrptr)++;
				if(!result)
					noaccess_str=text[NoAccessSub];
				break;
			case AR_EXPIRE:
				now=time(NULL);
				if(!user->expire || now+((long)i*24L*60L*60L)>user->expire)
420
					result=_not;
421
				else
422
					result=!_not;
423
424
425
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessExpire];
426
427
					noaccess_val=i; 
				}
428
429
				break;
			case AR_RANDOM:
430
				n=sbbs_random(i+1);
431
				if((equal && n!=i) || (!equal && n<i))
432
					result=_not;
433
				else
434
					result=!_not;
435
436
437
438
439
				(*ptrptr)++;
				break;
			case AR_LASTON:
				now=time(NULL);
				if((now-user->laston)/(24L*60L*60L)<(long)i)
440
					result=_not;
441
				else
442
					result=!_not;
443
444
445
446
				(*ptrptr)++;
				break;
			case AR_LOGONS:
				if((equal && user->logons!=i) || (!equal && user->logons<i))
447
					result=_not;
448
				else
449
					result=!_not;
450
451
452
453
				(*ptrptr)++;
				break;
			case AR_MAIN_CMDS:
				if((equal && main_cmds!=i) || (!equal && main_cmds<i))
454
					result=_not;
455
				else
456
					result=!_not;
457
458
459
460
				(*ptrptr)++;
				break;
			case AR_FILE_CMDS:
				if((equal && xfer_cmds!=i) || (!equal && xfer_cmds<i))
461
					result=_not;
462
				else
463
					result=!_not;
464
465
466
467
				(*ptrptr)++;
				break;
			case AR_TLEFT:
				if(timeleft/60<(ulong)n)
468
					result=_not;
469
				else
470
					result=!_not;
471
472
				if(!result) {
					noaccess_str=text[NoAccessTimeLeft];
473
474
					noaccess_val=n; 
				}
475
476
477
				break;
			case AR_TUSED:
				if((time(NULL)-logontime)/60<(long)n)
478
					result=_not;
479
				else
480
					result=!_not;
481
482
				if(!result) {
					noaccess_str=text[NoAccessTimeUsed];
483
484
					noaccess_val=n; 
				}
485
486
487
				break;
			case AR_TIME:
				now=time(NULL);
488
489
				localtime_r(&now,&tm);
				if((tm.tm_hour*60)+tm.tm_min<(int)i)
490
					result=_not;
491
				else
492
					result=!_not;
493
494
495
				(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessTime];
496
497
					noaccess_val=i; 
				}
498
				break;
499
			case AR_PCR:	/* post/call ratio (by percentage) */
500
				if(user->logons>user->posts
501
					&& (!user->posts || (100/((float)user->logons/user->posts))<(long)n))
502
					result=_not;
503
				else
504
					result=!_not;
505
506
				if(!result) {
					noaccess_str=text[NoAccessPCR];
507
508
					noaccess_val=n; 
				}
509
				break;
510
			case AR_UDR:	/* up/download byte ratio (by percentage) */
511
512
513
				l=user->dlb;
				if(!l) l=1;
				if(user->dlb>user->ulb
514
					&& (!user->ulb || (100/((float)l/user->ulb))<n))
515
					result=_not;
516
				else
517
					result=!_not;
518
519
				if(!result) {
					noaccess_str=text[NoAccessUDR];
520
521
					noaccess_val=n; 
				}
522
				break;
523
			case AR_UDFR:	/* up/download file ratio (in percentage) */
524
525
526
				i=user->dls;
				if(!i) i=1;
				if(user->dls>user->uls
527
					&& (!user->uls || (100/((float)i/user->uls))<n))
528
					result=_not;
529
				else
530
					result=!_not;
531
532
				if(!result) {
					noaccess_str=text[NoAccessUDFR];
533
534
					noaccess_val=n; 
				}
535
				break;
rswindell's avatar
rswindell committed
536
537
538
539
540
541
542
			case AR_ULS:
				if((equal && user->uls!=i) || (!equal && user->uls<i))
					result=_not;
				else
					result=!_not;
				(*ptrptr)++;
				break;
543
544
545
546
547
548
549
550
551
			case AR_ULK:
				if((equal && (user->ulb/1024)!=i) || (!equal && (user->ulb/1024)<i))
					result=_not;
				else
					result=!_not;
				(*ptrptr)++;
				break;
			case AR_ULM:
				if((equal && (user->ulb/(1024*1024))!=i) || (!equal && (user->ulb/(1024*1024))<i))
rswindell's avatar
rswindell committed
552
553
554
555
556
557
558
559
560
561
562
563
					result=_not;
				else
					result=!_not;
				(*ptrptr)++;
				break;
			case AR_DLS:
				if((equal && user->dls!=i) || (!equal && user->dls<i))
					result=_not;
				else
					result=!_not;
				(*ptrptr)++;
				break;
564
565
566
567
568
569
570
571
572
			case AR_DLK:
				if((equal && user->dlb/1024!=i) || (!equal && user->dlb/1024<i))
					result=_not;
				else
					result=!_not;
				(*ptrptr)++;
				break;
			case AR_DLM:
				if((equal && user->dlb/(1024*1024)!=i) || (!equal && user->dlb/(1024*1024)<i))
rswindell's avatar
rswindell committed
573
574
575
576
577
					result=_not;
				else
					result=!_not;
				(*ptrptr)++;
				break;
578
579
580
			case AR_FLAG1:
				if((!equal && !(user->flags1&FLAG(n)))
					|| (equal && user->flags1!=FLAG(n)))
581
					result=_not;
582
				else
583
					result=!_not;
584
585
				if(!result) {
					noaccess_str=text[NoAccessFlag1];
586
587
					noaccess_val=n; 
				}
588
589
590
591
				break;
			case AR_FLAG2:
				if((!equal && !(user->flags2&FLAG(n)))
					|| (equal && user->flags2!=FLAG(n)))
592
					result=_not;
593
				else
594
					result=!_not;
595
596
				if(!result) {
					noaccess_str=text[NoAccessFlag2];
597
598
					noaccess_val=n; 
				}
599
600
601
602
				break;
			case AR_FLAG3:
				if((!equal && !(user->flags3&FLAG(n)))
					|| (equal && user->flags3!=FLAG(n)))
603
					result=_not;
604
				else
605
					result=!_not;
606
607
				if(!result) {
					noaccess_str=text[NoAccessFlag3];
608
609
					noaccess_val=n; 
				}
610
611
612
613
				break;
			case AR_FLAG4:
				if((!equal && !(user->flags4&FLAG(n)))
					|| (equal && user->flags4!=FLAG(n)))
614
					result=_not;
615
				else
616
					result=!_not;
617
618
				if(!result) {
					noaccess_str=text[NoAccessFlag4];
619
620
					noaccess_val=n; 
				}
621
622
623
624
				break;
			case AR_REST:
				if((!equal && !(user->rest&FLAG(n)))
					|| (equal && user->rest!=FLAG(n)))
625
					result=_not;
626
				else
627
					result=!_not;
628
629
				if(!result) {
					noaccess_str=text[NoAccessRest];
630
631
					noaccess_val=n; 
				}
632
633
634
635
				break;
			case AR_EXEMPT:
				if((!equal && !(user->exempt&FLAG(n)))
					|| (equal && user->exempt!=FLAG(n)))
636
					result=_not;
637
				else
638
					result=!_not;
639
640
				if(!result) {
					noaccess_str=text[NoAccessExempt];
641
642
					noaccess_val=n; 
				}
643
644
645
				break;
			case AR_SEX:
				if(user->sex!=n)
646
					result=_not;
647
				else
648
					result=!_not;
649
650
				if(!result) {
					noaccess_str=text[NoAccessSex];
651
652
					noaccess_val=n; 
				}
653
654
655
				break; 
			case AR_SHELL:
				if(user->shell>=cfg.total_shells
rswindell's avatar
rswindell committed
656
					|| !findstr_in_string(cfg.shell[user->shell]->code,(char*)*ptrptr))
657
658
659
660
661
662
					result=_not;
				else
					result=!_not;
				while(*(*ptrptr))
					(*ptrptr)++;
				break;
663
			case AR_PROT:
rswindell's avatar
rswindell committed
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
				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
deuce's avatar
deuce committed
691
					p=user->ipaddr;
rswindell's avatar
rswindell committed
692
				if(!findstr_in_string(p,(char*)*ptrptr))
693
694
695
696
697
698
					result=_not;
				else
					result=!_not;
				while(*(*ptrptr))
					(*ptrptr)++;
				break;
rswindell's avatar
rswindell committed
699
700
701
702
703
704
705
706
707
708
709
710
711
			case AR_TERM:
				if(!findstr_in_string(terminal, (char*)*ptrptr))
					result=_not;
				else
					result=!_not;
				while(*(*ptrptr))
					(*ptrptr)++;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=0; 
				}
				break;
			case AR_COLS:
712
				if((equal && cols != (long)n) || (!equal && cols < (long)n))
rswindell's avatar
rswindell committed
713
714
715
716
717
718
719
720
721
					result=_not;
				else
					result=!_not;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=n; 
				}
				break;
			case AR_ROWS:
722
				if((equal && rows != (long)n) || (!equal && rows < (long)n))
rswindell's avatar
rswindell committed
723
724
725
726
727
728
729
730
					result=_not;
				else
					result=!_not;
				if(!result) {
					noaccess_str=text[NoAccessTerminal];
					noaccess_val=n; 
				}
				break;
731
732
		}
	}
733
734
735
	return(result);
}

rswindell's avatar
rswindell committed
736
bool sbbs_t::chk_ar(const uchar *ar, user_t* user, client_t* client)
737
{
738
	const uchar *p;
739
740
741
742

	if(ar==NULL)
		return(true);
	p=ar;
rswindell's avatar
rswindell committed
743
	return(ar_exp(&p,user,client));
744
745
746
747
748
749
750
751
752
753
754
755
}


/****************************************************************************/
/* This function fills the usrsub, usrsubs, usrgrps, curgrp, and cursub     */
/* variables based on the security clearance of the current user (useron)   */
/****************************************************************************/
void sbbs_t::getusrsubs()
{
    uint i,j,k,l;

	for(j=0,i=0;i<cfg.total_grps;i++) {
rswindell's avatar
rswindell committed
756
		if(!chk_ar(cfg.grp[i]->ar,&useron,&client))
757
758
759
			continue;
		for(k=0,l=0;l<cfg.total_subs;l++) {
			if(cfg.sub[l]->grp!=i) continue;
rswindell's avatar
rswindell committed
760
			if(!chk_ar(cfg.sub[l]->ar,&useron,&client))
761
				continue;
762
763
			usrsub[j][k++]=l; 
		}
764
765
766
		usrsubs[j]=k;
		if(!k)          /* No subs accessible in group */
			continue;
767
768
		usrgrp[j++]=i; 
	}
769
	usrgrps=j;
770
771
	if(usrgrps==0)
		return;
772
773
774
775
776
777
778
779
780
781
782
783
784
785
	while((curgrp>=usrgrps || !usrsubs[curgrp]) && curgrp) curgrp--;
	while(cursub[curgrp]>=usrsubs[curgrp] && cursub[curgrp]) cursub[curgrp]--;
}

/****************************************************************************/
/* This function fills the usrdir, usrdirs, usrlibs, curlib, and curdir     */
/* variables based on the security clearance of the current user (useron)   */
/****************************************************************************/
void sbbs_t::getusrdirs()
{
    uint i,j,k,l;

	if(useron.rest&FLAG('T')) {
		usrlibs=0;
786
787
		return; 
	}
788
	for(j=0,i=0;i<cfg.total_libs;i++) {
rswindell's avatar
rswindell committed
789
		if(!chk_ar(cfg.lib[i]->ar,&useron,&client))
790
791
792
			continue;
		for(k=0,l=0;l<cfg.total_dirs;l++) {
			if(cfg.dir[l]->lib!=i) continue;
rswindell's avatar
rswindell committed
793
			if(!chk_ar(cfg.dir[l]->ar,&useron,&client))
794
				continue;
795
796
			usrdir[j][k++]=l; 
		}
797
798
799
		usrdirs[j]=k;
		if(!k)          /* No dirs accessible in lib */
			continue;
800
801
		usrlib[j++]=i; 
	}
802
	usrlibs=j;
803
804
	if(usrlibs==0)
		return;
805
806
807
808
	while((curlib>=usrlibs || !usrdirs[curlib]) && curlib) curlib--;
	while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--;
}

809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
uint sbbs_t::getusrgrp(uint subnum)
{
	uint	ugrp;

	if(subnum==INVALID_SUB)
		return(0);

	if(usrgrps<=0)
		return(0);

	for(ugrp=0;ugrp<usrgrps;ugrp++)
		if(usrgrp[ugrp]==cfg.sub[subnum]->grp)
			break;

	return(ugrp+1);
}

uint sbbs_t::getusrsub(uint subnum)
{
	uint	usub;
	uint	ugrp;

	ugrp = getusrgrp(subnum);
	if(ugrp<=0)
		return(0);
834
	ugrp--;
835
836
837
838
839
840
841
	for(usub=0;usub<usrsubs[ugrp];usub++)
		if(usrsub[ugrp][usub]==subnum)
			break;

	return(usub+1);
}

842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
uint sbbs_t::getusrlib(uint dirnum)
{
	uint	ulib;

	if(dirnum == INVALID_DIR)
		return 0;

	if(usrlibs <= 0)
		return 0;

	for(ulib=0; ulib < usrlibs; ulib++)
		if(usrlib[ulib] == cfg.dir[dirnum]->lib)
			break;

	return ulib+1;
}

uint sbbs_t::getusrdir(uint dirnum)
{
	uint	udir;
	uint	ulib;

	ulib = getusrlib(dirnum);
	if(ulib <= 0)
		return 0;
	ulib--;
	for(udir=0; udir < usrdirs[ulib]; udir++)
		if(usrdir[ulib][udir] == dirnum)
			break;

	return udir+1;
}


876
877
int sbbs_t::dir_op(uint dirnum)
{
878
	return(SYSOP || (cfg.dir[dirnum]->op_ar!=NULL && cfg.dir[dirnum]->op_ar[0] && chk_ar(cfg.dir[dirnum]->op_ar,&useron,&client)));
879
880
881
}