]> jfr.im git - irc/quakenet/newserv.git/blob - noperserv/noperserv_policy.c
Began manual merge.
[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 }
31 }
32
33 return 1;
34 }
35
36 /* return userflags permitted for each level */
37 flag_t noperserv_policy_permitted_noticeflags(no_autheduser *target) {
38 flag_t result = NL_PEONIC_FLAGS;
39 if(NOIsDeveloper(target))
40 result |= NL_DEV_FLAGS;
41 if(NOIsLeastOper(target))
42 result |= NL_OPER_FLAGS;
43 if(NOIsLeastSec(target))
44 result |= NL_SEC_FLAGS;
45 if(NOIsLeastTrust(target))
46 result |= NL_TRUST_FLAGS;
47
48 return result;
49 }
50
51 /* @logic */
52 /* updates target's noticeflags according to their new userflags, unsetting unpermitted and setting new permitted flags */
53 void noperserv_policy_update_noticeflags(flag_t fwas, no_autheduser *target) {
54 flag_t newflags = NOGetNoticeLevel(target);
55
56 newflags &= noperserv_policy_permitted_noticeflags(target); /* unset flags we're not supposed to have */
57
58 /* and add flags we're allowed */
59 if(!(fwas & __NO_OPER) && NOIsLeastOper(target))
60 newflags |= NL_OPER_FLAGS;
61 if(!(fwas & __NO_SEC) && NOIsLeastSec(target))
62 newflags |= NL_SEC_FLAGS;
63 if(!(fwas & __NO_TRUST) && NOIsLeastTrust(target))
64 newflags |= NL_TRUST_FLAGS;
65 if(!(fwas & __NO_DEVELOPER) && NOIsDeveloper(target))
66 newflags |= NL_DEV_FLAGS;
67
68 target->noticelevel = newflags;
69 }
70
71 /* is au allowed to modified targets flags */
72 flag_t noperserv_policy_permitted_modifications(no_autheduser *au, no_autheduser *target) {
73 flag_t permitted = 0;
74
75 /* @policy */
76 if(NOIsLeastOper(au)) {
77 permitted |= NO_OPER_FLAGS;
78 if(target == au) /* let opers remove their own oper flag */
79 permitted |= __NO_OPER;
80 }
81 if(target == au) {
82 if(NOIsLeastSec(au))
83 permitted |= __NO_SEC;
84 if(NOIsLeastTrust(au))
85 permitted |= __NO_TRUST;
86 }
87
88 if(NOIsDeveloper(au))
89 permitted |= NO_DEV_FLAGS;
90
91 if((target != au) && NOIsLeastOper(target) && !NOIsDeveloper(au))
92 return 0;
93
94 return permitted;
95 }