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