]>
Commit | Line | Data |
---|---|---|
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 | } |