]> jfr.im git - irc/quakenet/newserv.git/blob - control/control_policy.c
BUILD: add require-all build mode
[irc/quakenet/newserv.git] / control / control_policy.c
1 #include "control.h"
2 #include "control_db.h"
3 #include "control_policy.h"
4
5 /* command access */
6 int noperserv_policy_command_permitted(flag_t level, nick *user) {
7 no_autheduser *au;
8 if(level == __NO_ANYONE)
9 return 1;
10 if((level & __NO_OPERED) && !IsOper(user))
11 return 0;
12 if(level & __NO_AUTHED) {
13 if(!IsAccount(user))
14 return 0;
15 if(level & __NO_ACCOUNT) {
16 if(!(au = NOGetAuthedUser(user)))
17 return 0;
18 if((level & __NO_DEVELOPER) && !NOIsDeveloper(au)) {
19 return 0;
20 } else if((level & __NO_OPER) && !NOIsLeastOper(au)) {
21 return 0;
22 } else if((level & __NO_STAFF) && !NOIsLeastStaff(au)) {
23 return 0;
24 }
25 if ((level & __NO_SEC) && !NOIsLeastSec(au))
26 return 0;
27 if ((level & __NO_TRUST) && !NOIsLeastTrust(au))
28 return 0;
29 if ((level & __NO_RELAY) && !NOIsLeastRelay(au))
30 return 0;
31 }
32 }
33
34 return 1;
35 }
36
37 /* return userflags permitted for each level */
38 flag_t noperserv_policy_permitted_noticeflags(no_autheduser *target) {
39 flag_t result = NL_PEONIC_FLAGS;
40 if(NOIsDeveloper(target))
41 result |= NL_DEV_FLAGS;
42 if(NOIsLeastOper(target))
43 result |= NL_OPER_FLAGS;
44 if(NOIsLeastSec(target))
45 result |= NL_SEC_FLAGS;
46 if(NOIsLeastTrust(target))
47 result |= NL_TRUST_FLAGS;
48
49 return result;
50 }
51
52 /* @logic */
53 /* updates target's noticeflags according to their new userflags, unsetting unpermitted and setting new permitted flags */
54 void noperserv_policy_update_noticeflags(flag_t fwas, no_autheduser *target) {
55 flag_t newflags = NOGetNoticeLevel(target);
56
57 newflags &= noperserv_policy_permitted_noticeflags(target); /* unset flags we're not supposed to have */
58
59 /* and add flags we're allowed */
60 if(!(fwas & __NO_OPER) && NOIsLeastOper(target))
61 newflags |= NL_OPER_FLAGS;
62 if(!(fwas & __NO_SEC) && NOIsLeastSec(target))
63 newflags |= NL_SEC_FLAGS;
64 if(!(fwas & __NO_TRUST) && NOIsLeastTrust(target))
65 newflags |= NL_TRUST_FLAGS;
66 if(!(fwas & __NO_DEVELOPER) && NOIsDeveloper(target))
67 newflags |= NL_DEV_FLAGS;
68
69 target->noticelevel = newflags;
70 }
71
72 /* is au allowed to modified targets flags */
73 flag_t noperserv_policy_permitted_modifications(no_autheduser *au, no_autheduser *target) {
74 flag_t permitted = 0;
75
76 /* @policy */
77 if(NOIsLeastOper(au)) {
78 permitted |= NO_OPER_FLAGS;
79 if(target == au) /* let opers remove their own oper flag */
80 permitted |= __NO_OPER;
81 }
82 if(target == au) {
83 if(NOIsLeastSec(au))
84 permitted |= __NO_SEC;
85 if(NOIsLeastTrust(au))
86 permitted |= __NO_TRUST;
87 }
88
89 if(NOIsDeveloper(au))
90 permitted |= NO_DEV_FLAGS;
91
92 if((target != au) && NOIsLeastOper(target) && !NOIsDeveloper(au))
93 return 0;
94
95 return permitted;
96 }