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