]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/chanservprivs.c
CHANSERV: grep/rgrep now log and wall.
[irc/quakenet/newserv.git] / chanserv / chanservprivs.c
CommitLineData
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
9int 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
47chanindex *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