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