]>
Commit | Line | Data |
---|---|---|
c86edd1d Q |
1 | /* chanservprivs.c */ |
2 | ||
3 | #include "chanserv.h" | |
4 | #include "../nick/nick.h" | |
5 | #include "../lib/irc_string.h" | |
6 | #include <string.h> | |
7 | #include <ctype.h> | |
8 | ||
9 | int cs_privcheck(int privnum, nick *np) { | |
10 | reguser *rup=NULL; | |
11 | ||
12 | if (np) | |
13 | rup=getreguserfromnick(np); | |
14 | ||
15 | switch(privnum) { | |
16 | case QPRIV_SUSPENDBYPASS: | |
17 | case QPRIV_VIEWCHANFLAGS: | |
18 | case QPRIV_VIEWFULLCHANLEV: | |
19 | case QPRIV_VIEWFULLWHOIS: | |
20 | case QPRIV_VIEWCHANMODES: | |
21 | case QPRIV_VIEWAUTOLIMIT: | |
22 | case QPRIV_VIEWBANTIMER: | |
23 | case QPRIV_VIEWUSERFLAGS: | |
e086f1b5 | 24 | case QPRIV_VIEWCHANSUSPENSION: |
c86edd1d Q |
25 | return (rup && UHasHelperPriv(rup)); |
26 | ||
27 | case QPRIV_VIEWCOMMENTS: | |
28 | case QPRIV_VIEWEMAIL: | |
29 | case QPRIV_CHANGECHANLEV: | |
30 | case QPRIV_CHANGECHANFLAGS: | |
31 | case QPRIV_CHANGECHANMODES: | |
32 | case QPRIV_CHANGEAUTOLIMIT: | |
33 | case QPRIV_CHANGEBANTIMER: | |
34 | case QPRIV_CHANGEUSERFLAGS: | |
e086f1b5 | 35 | case QPRIV_VIEWSUSPENDEDBY: |
c86edd1d Q |
36 | return (np && rup && IsOper(np) && UHasOperPriv(rup)); |
37 | ||
103521a1 | 38 | default: /* By default opers can override anything */ |
39 | return (np && rup && IsOper(np) && UHasOperPriv(rup)); | |
c86edd1d Q |
40 | } |
41 | } | |
42 | ||
43 | /* Generic access check function. | |
44 | * Note that the chanindex is returned for success, this | |
45 | * can be used to avoid duplicate hash lookups */ | |
46 | ||
47 | chanindex *cs_checkaccess(nick *np, const char *chan, unsigned int flags, | |
48 | chanindex *cip, const char *cmdname, int priv, int quiet) { | |
49 | reguser *rup=getreguserfromnick(np); | |
50 | regchan *rcp; | |
51 | regchanuser *rcup=NULL; | |
52 | unsigned long *lp; | |
53 | ||
54 | if ((flags & CA_AUTHED) && !rup) | |
55 | return NULL; | |
56 | ||
57 | if (!cip && !(cip=findchanindex(chan))) { | |
58 | if (!quiet) chanservstdmessage(np, QM_UNKNOWNCHAN, chan); | |
59 | return NULL; | |
60 | } | |
61 | ||
62 | if (!(rcp=cip->exts[chanservext]) || | |
63 | (CIsSuspended(rcp) && !cs_privcheck(QPRIV_SUSPENDBYPASS, np))) { | |
64 | if (!quiet) chanservstdmessage(np, QM_UNKNOWNCHAN, cip->name->content); | |
65 | return NULL; | |
66 | } | |
e70833ab | 67 | |
68 | if (rcp && rup) | |
69 | rcup=findreguseronchannel(rcp, rup); | |
c86edd1d | 70 | |
e4946b42 | 71 | if (!cs_privcheck(priv,np)) { |
c86edd1d Q |
72 | if ((flags & CA_VOICEPRIV) && |
73 | !(rcp && (CIsVoiceAll(rcp)) && | |
5cde8af0 | 74 | !(cip->channel && (nickbanned_visible(np, cip->channel) || IsInviteOnly(cip->channel)))) && |
c86edd1d Q |
75 | !(rcup && (CUHasVoicePriv(rcup)))) { |
76 | if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname); | |
77 | return NULL; | |
78 | } | |
79 | ||
80 | if ((flags & CA_NEEDKNOWN) && !rup) { | |
81 | if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname); | |
82 | return NULL; | |
83 | } | |
84 | ||
e70833ab | 85 | if ((flags & CA_NEEDKNOWN) && (!rcup || !CUKnown(rcup))) { |
c86edd1d Q |
86 | if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname); |
87 | return NULL; | |
88 | } | |
89 | ||
90 | if (((flags & CA_OPPRIV ) && !CUHasOpPriv(rcup)) || | |
91 | ((flags & CA_MASTERPRIV) && !CUHasMasterPriv(rcup)) || | |
92 | ((flags & CA_OWNERPRIV) && !CUIsOwner(rcup)) || | |
93 | ((flags & CA_TOPICPRIV ) && !CUHasTopicPriv(rcup))) { | |
94 | if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname); | |
95 | return NULL; | |
96 | } | |
97 | } | |
98 | ||
99 | if ((flags & CA_ONCHANREQ) && !(cip->channel)) { | |
100 | if (!quiet) chanservstdmessage(np, QM_NOTONCHAN, cip->name->content); | |
101 | return NULL; | |
102 | } | |
103 | ||
104 | if (cip->channel) { | |
105 | lp=getnumerichandlefromchanhash(cip->channel->users, np->numeric); | |
106 | ||
107 | if ((flags & CA_ONCHANREQ) && !lp) { | |
108 | if (!quiet) chanservstdmessage(np, QM_NOTONCHAN, cip->name->content); | |
109 | return NULL; | |
110 | } | |
111 | ||
112 | if ((flags & CA_OPPED) && !(*lp & CUMODE_OP)) { | |
113 | if (!quiet) chanservstdmessage(np, QM_NOTOPPED, cip->name->content); | |
114 | return NULL; | |
115 | } | |
116 | ||
117 | if ((flags & CA_DEOPPED) && (*lp & CUMODE_OP)) { | |
118 | if (!quiet) chanservstdmessage(np, QM_ALREADYOPPED, cip->name->content); | |
119 | return NULL; | |
120 | } | |
121 | ||
122 | if ((flags & CA_VOICED) && !(*lp & CUMODE_VOICE)) { | |
123 | if (!quiet) chanservstdmessage(np, QM_NOTVOICED, cip->name->content); | |
124 | return NULL; | |
125 | } | |
126 | ||
127 | if ((flags & CA_DEVOICED) && (*lp & CUMODE_VOICE)) { | |
128 | if (!quiet) chanservstdmessage(np, QM_ALREADYVOICED, cip->name->content); | |
129 | return NULL; | |
130 | } | |
131 | ||
132 | if ((flags & CA_OFFCHAN) && lp) { | |
133 | if (!quiet) chanservstdmessage(np, QM_ALREADYONCHAN, cip->name->content); | |
134 | return NULL; | |
135 | } | |
136 | } | |
137 | ||
138 | return cip; | |
139 | } | |
140 |