]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservprivs.c
4 #include "../nick/nick.h"
5 #include "../lib/irc_string.h"
9 int cs_privcheck(int privnum
, nick
*np
) {
13 rup
=getreguserfromnick(np
);
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 case QPRIV_VIEWCHANSUSPENSION
:
25 return (rup
&& UHasHelperPriv(rup
));
27 case QPRIV_VIEWCOMMENTS
:
29 case QPRIV_CHANGECHANLEV
:
30 case QPRIV_CHANGECHANFLAGS
:
31 case QPRIV_CHANGECHANMODES
:
32 case QPRIV_CHANGEAUTOLIMIT
:
33 case QPRIV_CHANGEBANTIMER
:
34 case QPRIV_CHANGEUSERFLAGS
:
35 case QPRIV_VIEWSUSPENDEDBY
:
36 case QPRIV_VIEWWALLMESSAGE
: /* if you change VIEWWALLMESSAGE alter chanservwallmessage too */
37 case QPRIV_VIEWREALHOST
:
38 case QPRIV_RESETCHANSTAT
:
39 return (np
&& rup
&& IsOper(np
) && UHasOperPriv(rup
));
41 default: /* By default opers can override anything */
42 return (np
&& rup
&& IsOper(np
) && UHasOperPriv(rup
));
46 /* Generic access check function.
47 * Note that the chanindex is returned for success, this
48 * can be used to avoid duplicate hash lookups */
50 chanindex
*cs_checkaccess(nick
*np
, const char *chan
, unsigned int flags
,
51 chanindex
*cip
, const char *cmdname
, int priv
, int quiet
) {
52 reguser
*rup
=getreguserfromnick(np
);
54 regchanuser
*rcup
=NULL
;
57 if ((flags
& CA_AUTHED
) && !rup
)
60 if (!cip
&& !(cip
=findchanindex(chan
))) {
61 if (!quiet
) chanservstdmessage(np
, QM_UNKNOWNCHAN
, chan
);
65 if (!(rcp
=cip
->exts
[chanservext
])) {
66 if (!quiet
) chanservstdmessage(np
, QM_UNKNOWNCHAN
, cip
->name
->content
);
71 if (CIsSuspended(rcp
)) {
72 if (cs_privcheck(QPRIV_SUSPENDBYPASS
, np
)) {
73 if (!quiet
) chanservstdmessage(np
, QM_BYPASSINGSUSPEND
, cip
->name
->content
);
75 if (!quiet
) chanservstdmessage(np
, QM_UNKNOWNCHAN
, cip
->name
->content
);
81 rcup
=findreguseronchannel(rcp
, rup
);
83 if (!cs_privcheck(priv
,np
)) {
84 if ((flags
& CA_VOICEPRIV
) &&
85 !(rcp
&& CIsVoiceAll(rcp
) && !(rcup
&& CUIsQuiet(rcup
)) &&
86 !(cip
->channel
&& (nickbanned(np
, cip
->channel
, 1) || IsInviteOnly(cip
->channel
)))) &&
87 !(rcup
&& CUHasVoicePriv(rcup
))) {
88 if (!quiet
) chanservstdmessage(np
, QM_NOACCESSONCHAN
, cip
->name
->content
, cmdname
);
92 if ((flags
& CA_NEEDKNOWN
) && !rup
) {
93 if (!quiet
) chanservstdmessage(np
, QM_NOACCESSONCHAN
, cip
->name
->content
, cmdname
);
97 if ((flags
& CA_NEEDKNOWN
) && (!rcup
|| !CUKnown(rcup
))) {
98 if (!quiet
) chanservstdmessage(np
, QM_NOACCESSONCHAN
, cip
->name
->content
, cmdname
);
102 if (((flags
& CA_OPPRIV
) && !CUHasOpPriv(rcup
)) ||
103 ((flags
& CA_MASTERPRIV
) && !CUHasMasterPriv(rcup
)) ||
104 ((flags
& CA_OWNERPRIV
) && !CUIsOwner(rcup
)) ||
105 ((flags
& CA_TOPICPRIV
) && !CUHasTopicPriv(rcup
))) {
106 if (!quiet
) chanservstdmessage(np
, QM_NOACCESSONCHAN
, cip
->name
->content
, cmdname
);
111 if ((flags
& CA_ONCHANREQ
) && !(cip
->channel
)) {
112 if (!quiet
) chanservstdmessage(np
, QM_NOTONCHAN
, cip
->name
->content
);
117 lp
=getnumerichandlefromchanhash(cip
->channel
->users
, np
->numeric
);
119 if ((flags
& CA_ONCHANREQ
) && !lp
) {
120 if (!quiet
) chanservstdmessage(np
, QM_NOTONCHAN
, cip
->name
->content
);
124 if ((flags
& CA_OPPED
) && !(*lp
& CUMODE_OP
)) {
125 if (!quiet
) chanservstdmessage(np
, QM_NOTOPPED
, cip
->name
->content
);
129 if ((flags
& CA_DEOPPED
) && (*lp
& CUMODE_OP
)) {
130 if (!quiet
) chanservstdmessage(np
, QM_ALREADYOPPED
, cip
->name
->content
);
134 if ((flags
& CA_VOICED
) && !(*lp
& CUMODE_VOICE
)) {
135 if (!quiet
) chanservstdmessage(np
, QM_NOTVOICED
, cip
->name
->content
);
139 if ((flags
& CA_DEVOICED
) && (*lp
& CUMODE_VOICE
)) {
140 if (!quiet
) chanservstdmessage(np
, QM_ALREADYVOICED
, cip
->name
->content
);
144 if ((flags
& CA_OFFCHAN
) && lp
) {
145 if (!quiet
) chanservstdmessage(np
, QM_ALREADYONCHAN
, cip
->name
->content
);