]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservprivs.c
Add jupe support
[irc/quakenet/newserv.git] / chanserv / chanservprivs.c
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
36 default:
37 return 0;
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 }
65
66 if (!priv || !cs_privcheck(priv,np)) {
67 if ((flags & CA_VOICEPRIV) &&
68 !(rcp && (CIsVoiceAll(rcp)) &&
69 !(cip->channel && (nickbanned(np, cip->channel) || IsInviteOnly(cip->channel)))) &&
70 !(rcup && (CUHasVoicePriv(rcup)))) {
71 if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname);
72 return NULL;
73 }
74
75 if ((flags & CA_NEEDKNOWN) && !rup) {
76 if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname);
77 return NULL;
78 }
79
80 if ((flags & CA_NEEDKNOWN) && (!(rcup=findreguseronchannel(rcp, rup)) ||
81 !CUKnown(rcup))) {
82 if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname);
83 return NULL;
84 }
85
86 if (((flags & CA_OPPRIV ) && !CUHasOpPriv(rcup)) ||
87 ((flags & CA_MASTERPRIV) && !CUHasMasterPriv(rcup)) ||
88 ((flags & CA_OWNERPRIV) && !CUIsOwner(rcup)) ||
89 ((flags & CA_TOPICPRIV ) && !CUHasTopicPriv(rcup))) {
90 if (!quiet) chanservstdmessage(np, QM_NOACCESSONCHAN, cip->name->content, cmdname);
91 return NULL;
92 }
93 }
94
95 if ((flags & CA_ONCHANREQ) && !(cip->channel)) {
96 if (!quiet) chanservstdmessage(np, QM_NOTONCHAN, cip->name->content);
97 return NULL;
98 }
99
100 if (cip->channel) {
101 lp=getnumerichandlefromchanhash(cip->channel->users, np->numeric);
102
103 if ((flags & CA_ONCHANREQ) && !lp) {
104 if (!quiet) chanservstdmessage(np, QM_NOTONCHAN, cip->name->content);
105 return NULL;
106 }
107
108 if ((flags & CA_OPPED) && !(*lp & CUMODE_OP)) {
109 if (!quiet) chanservstdmessage(np, QM_NOTOPPED, cip->name->content);
110 return NULL;
111 }
112
113 if ((flags & CA_DEOPPED) && (*lp & CUMODE_OP)) {
114 if (!quiet) chanservstdmessage(np, QM_ALREADYOPPED, cip->name->content);
115 return NULL;
116 }
117
118 if ((flags & CA_VOICED) && !(*lp & CUMODE_VOICE)) {
119 if (!quiet) chanservstdmessage(np, QM_NOTVOICED, cip->name->content);
120 return NULL;
121 }
122
123 if ((flags & CA_DEVOICED) && (*lp & CUMODE_VOICE)) {
124 if (!quiet) chanservstdmessage(np, QM_ALREADYVOICED, cip->name->content);
125 return NULL;
126 }
127
128 if ((flags & CA_OFFCHAN) && lp) {
129 if (!quiet) chanservstdmessage(np, QM_ALREADYONCHAN, cip->name->content);
130 return NULL;
131 }
132 }
133
134 return cip;
135 }
136