]> jfr.im git - irc/quakenet/snircd-patchqueue.git/blob - addopkickcmd.patch
welcome.patch - add empty line at end of welcome.h
[irc/quakenet/snircd-patchqueue.git] / addopkickcmd.patch
1 add opkick command, similar to opmode command, but then for kicking
2 priv controlled by LOCAL_OPMODE and OPMODE
3 feature controlled by OPKICK (disabled by default), new p10 token OK
4 if implemented, it must not be enabled until ALL servers and services are upgraded
5 generates HACK(4) snomask notice for accountability with oper as source
6 probably needs some work (for one i simply copied the header from m_kick.c)
7
8 diff -r d7557937c1ab include/handlers.h
9 --- a/include/handlers.h Mon Jan 26 12:42:49 2009 +0100
10 +++ b/include/handlers.h Mon Jan 26 12:47:29 2009 +0100
11 @@ -167,6 +167,7 @@
12 extern int mo_kill(struct Client*, struct Client*, int, char*[]);
13 extern int mo_notice(struct Client*, struct Client*, int, char*[]);
14 extern int mo_oper(struct Client*, struct Client*, int, char*[]);
15 +extern int mo_opkick(struct Client*, struct Client*, int, char*[]);
16 extern int mo_opmode(struct Client*, struct Client*, int, char*[]);
17 extern int mo_ping(struct Client*, struct Client*, int, char*[]);
18 extern int mo_privmsg(struct Client*, struct Client*, int, char*[]);
19 @@ -216,6 +217,7 @@
20 extern int ms_nick(struct Client*, struct Client*, int, char*[]);
21 extern int ms_notice(struct Client*, struct Client*, int, char*[]);
22 extern int ms_oper(struct Client*, struct Client*, int, char*[]);
23 +extern int ms_opkick(struct Client*, struct Client*, int, char*[]);
24 extern int ms_opmode(struct Client*, struct Client*, int, char*[]);
25 extern int ms_part(struct Client*, struct Client*, int, char*[]);
26 extern int ms_ping(struct Client*, struct Client*, int, char*[]);
27 diff -r d7557937c1ab include/ircd_features.h
28 --- a/include/ircd_features.h Mon Jan 26 12:42:49 2009 +0100
29 +++ b/include/ircd_features.h Mon Jan 26 12:47:29 2009 +0100
30 @@ -105,6 +105,7 @@
31 /* features that affect all operators */
32 FEAT_EXTENDED_CHECKCMD,
33 FEAT_CONFIG_OPERCMDS,
34 + FEAT_OPKICK,
35 FEAT_SETHOST,
36 FEAT_SETHOST_USER,
37 FEAT_SETHOST_AUTO,
38 diff -r d7557937c1ab include/msg.h
39 --- a/include/msg.h Mon Jan 26 12:42:49 2009 +0100
40 +++ b/include/msg.h Mon Jan 26 12:47:29 2009 +0100
41 @@ -236,6 +236,10 @@
42 #define TOK_KICK "K"
43 #define CMD_KICK MSG_KICK, TOK_KICK
44
45 +#define MSG_OPKICK "OPKICK" /* OPKICK */
46 +#define TOK_OPKICK "OK"
47 +#define CMD_OPKICK MSG_OPKICK, TOK_OPKICK
48 +
49 #define MSG_USERHOST "USERHOST" /* USER -> USRH */
50 #define TOK_USERHOST "USERHOST"
51 #define CMD_USERHOST MSG_USERHOST, TOK_USERHOST
52 diff -r d7557937c1ab ircd/Makefile.in
53 --- a/ircd/Makefile.in Mon Jan 26 12:42:49 2009 +0100
54 +++ b/ircd/Makefile.in Mon Jan 26 12:47:29 2009 +0100
55 @@ -151,6 +151,7 @@
56 m_nick.c \
57 m_notice.c \
58 m_oper.c \
59 + m_opkick.c \
60 m_opmode.c \
61 m_part.c \
62 m_pass.c \
63 @@ -884,6 +885,14 @@
64 ../include/ircd_features.h ../include/s_conf.h ../include/client.h \
65 ../include/s_debug.h ../include/s_user.h ../include/s_misc.h \
66 ../include/send.h
67 +m_opkick.o: m_opkick.c ../config.h ../include/channel.h \
68 + ../include/ircd_defs.h ../include/res.h ../config.h ../include/client.h \
69 + ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
70 + ../include/ircd_handler.h ../include/capab.h ../include/hash.h \
71 + ../include/ircd.h ../include/struct.h ../include/ircd_log.h \
72 + ../include/ircd_reply.h ../include/ircd_string.h \
73 + ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
74 + ../include/numnicks.h ../include/send.h ../include/ircd_features.h
75 m_opmode.o: m_opmode.c ../config.h ../include/client.h \
76 ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
77 ../include/ircd_events.h ../config.h ../include/ircd_handler.h \
78 diff -r d7557937c1ab ircd/ircd_features.c
79 --- a/ircd/ircd_features.c Mon Jan 26 12:42:49 2009 +0100
80 +++ b/ircd/ircd_features.c Mon Jan 26 12:47:29 2009 +0100
81 @@ -359,6 +359,7 @@
82 /* features that affect all operators */
83 F_B(EXTENDED_CHECKCMD, 0, 0, 0),
84 F_B(CONFIG_OPERCMDS, 0, 0, 0),
85 + F_B(OPKICK, 0, 1, 0),
86 F_B(SETHOST, 0, 0, 0),
87 F_B(SETHOST_USER, 0, 0, 0),
88 F_B(SETHOST_AUTO, 0, 0, 0),
89 diff -r d7557937c1ab ircd/m_opkick.c
90 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
91 +++ b/ircd/m_opkick.c Mon Jan 26 12:47:29 2009 +0100
92 @@ -0,0 +1,231 @@
93 +/*
94 + * IRC - Internet Relay Chat, ircd/m_opkick.c
95 + * Copyright (C) 1990 Jarkko Oikarinen and
96 + * University of Oulu, Computing Center
97 + *
98 + * See file AUTHORS in IRC package for additional names of
99 + * the programmers.
100 + *
101 + * This program is free software; you can redistribute it and/or modify
102 + * it under the terms of the GNU General Public License as published by
103 + * the Free Software Foundation; either version 1, or (at your option)
104 + * any later version.
105 + *
106 + * This program is distributed in the hope that it will be useful,
107 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
108 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
109 + * GNU General Public License for more details.
110 + *
111 + * You should have received a copy of the GNU General Public License
112 + * along with this program; if not, write to the Free Software
113 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
114 + *
115 + */
116 +
117 +/*
118 + * m_functions execute protocol messages on this server:
119 + *
120 + * cptr is always NON-NULL, pointing to a *LOCAL* client
121 + * structure (with an open socket connected!). This
122 + * identifies the physical socket where the message
123 + * originated (or which caused the m_function to be
124 + * executed--some m_functions may call others...).
125 + *
126 + * sptr is the source of the message, defined by the
127 + * prefix part of the message if present. If not
128 + * or prefix not found, then sptr==cptr.
129 + *
130 + * (!IsServer(cptr)) => (cptr == sptr), because
131 + * prefixes are taken *only* from servers...
132 + *
133 + * (IsServer(cptr))
134 + * (sptr == cptr) => the message didn't
135 + * have the prefix.
136 + *
137 + * (sptr != cptr && IsServer(sptr) means
138 + * the prefix specified servername. (?)
139 + *
140 + * (sptr != cptr && !IsServer(sptr) means
141 + * that message originated from a remote
142 + * user (not local).
143 + *
144 + * combining
145 + *
146 + * (!IsServer(sptr)) means that, sptr can safely
147 + * taken as defining the target structure of the
148 + * message in this server.
149 + *
150 + * *Always* true (if 'parse' and others are working correct):
151 + *
152 + * 1) sptr->from == cptr (note: cptr->from == cptr)
153 + *
154 + * 2) MyConnect(sptr) <=> sptr == cptr (e.g. sptr
155 + * *cannot* be a local connection, unless it's
156 + * actually cptr!). [MyConnect(x) should probably
157 + * be defined as (x == x->from) --msa ]
158 + *
159 + * parc number of variable parameter strings (if zero,
160 + * parv is allowed to be NULL)
161 + *
162 + * parv a NULL terminated list of parameter pointers,
163 + *
164 + * parv[0], sender (prefix string), if not present
165 + * this points to an empty string.
166 + * parv[1]...parv[parc-1]
167 + * pointers to additional parameters
168 + * parv[parc] == NULL, *always*
169 + *
170 + * note: it is guaranteed that parv[0]..parv[parc-1] are all
171 + * non-NULL pointers.
172 + */
173 +#include "config.h"
174 +
175 +#include "channel.h"
176 +#include "client.h"
177 +#include "hash.h"
178 +#include "ircd.h"
179 +#include "ircd_log.h"
180 +#include "ircd_reply.h"
181 +#include "ircd_string.h"
182 +#include "msg.h"
183 +#include "numeric.h"
184 +#include "numnicks.h"
185 +#include "send.h"
186 +#include "ircd_features.h"
187 +
188 +/* #include <assert.h> -- Now using assert in ircd_log.h */
189 +
190 +/*
191 + * mo_opkick - oper message handler
192 + *
193 + * parv[0] = sender prefix
194 + * parv[1] = channel
195 + * parv[2] = client to kick
196 + * parv[parc-1] = kick comment
197 + */
198 +int mo_opkick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
199 +{
200 + struct Client *who;
201 + struct Channel *chptr;
202 + struct Membership *member = 0;
203 + struct Membership* member2;
204 + char *name, *comment;
205 +
206 + ClrFlag(sptr, FLAG_TS8);
207 +
208 + if (!feature_bool(FEAT_OPKICK))
209 + return send_reply(sptr, ERR_DISABLED, "OPKICK");
210 +
211 + if (parc < 3 || *parv[1] == '\0')
212 + return need_more_params(sptr, "OPKICK");
213 +
214 + name = parv[1];
215 +
216 + /* simple checks */
217 + if (!(chptr = get_channel(sptr, name, CGT_NO_CREATE)))
218 + return send_reply(sptr, ERR_NOSUCHCHANNEL, name);
219 +
220 + if (!HasPriv(sptr, IsLocalChannel(chptr->chname) ? PRIV_LOCAL_OPMODE : PRIV_OPMODE))
221 + return send_reply(sptr, ERR_NOPRIVILEGES);
222 +
223 + if (!(who = find_chasing(sptr, parv[2], 0, 1)))
224 + return 0; /* find_chasing sends the reply for us */
225 +
226 + /* Don't allow the channel service to be kicked */
227 + if (IsChannelService(who) && IsService(cli_user(who)->server))
228 + return send_reply(sptr, ERR_ISREALSERVICE, cli_name(who), chptr->chname);
229 +
230 + /* check if kicked user is actually on the channel */
231 + if (!(member = find_member_link(chptr, who)) || IsZombie(member))
232 + return send_reply(sptr, ERR_USERNOTINCHANNEL, cli_name(who), chptr->chname);
233 +
234 + /* We rely on ircd_snprintf to truncate the comment */
235 + comment = EmptyString(parv[parc - 1]) ? parv[2] : parv[parc - 1];
236 +
237 + /* propagate it */
238 + if (!IsLocalChannel(name))
239 + sendcmdto_serv_butone(sptr, CMD_OPKICK, cptr, "%H %C :%s", chptr, who, comment);
240 +
241 + /* If it's a delayed join, only send the KICK to the person doing
242 + * the kicking and the victim
243 + */
244 + if (IsDelayedJoin(member)) {
245 + if (MyUser(who))
246 + sendcmdto_one(feature_bool(FEAT_HIS_MODEWHO) ? &his : sptr, CMD_KICK, who, "%H %C :%s", chptr, who, comment);
247 + /* operator using OPKICK is on the channel */
248 + if ((member2 = find_member_link(chptr, sptr)) && !IsZombie(member2)) {
249 + sendcmdto_one(who, CMD_JOIN, sptr, "%H", chptr);
250 + sendcmdto_one(feature_bool(FEAT_HIS_MODEWHO) ? &his : sptr, CMD_KICK, sptr, "%H %C :%s", chptr, who, comment);
251 + }
252 + CheckDelayedJoins(chptr);
253 + } else
254 + sendcmdto_channel_butserv_butone(feature_bool(FEAT_HIS_MODEWHO) ? &his : sptr,
255 + CMD_KICK, chptr, NULL, 0, "%H %C :%s", chptr, who, comment);
256 +
257 + /* Send HACK notice and log it */
258 + sendto_opmask_butone(0, SNO_HACK4, "HACK(4): %C KICK %H %C %s", sptr, chptr, who, comment);
259 + log_write(LS_OPERMODE, L_INFO, LOG_NOSNOTICE, "%#C OPKICK %H %C %s", sptr, chptr, who, comment);
260 +
261 + make_zombie(member, who, cptr, sptr, chptr);
262 +
263 + return 0;
264 +}
265 +
266 +/*
267 + * ms_opkick - server message handler
268 + *
269 + * parv[0] = sender prefix
270 + * parv[1] = channel
271 + * parv[2] = client to kick
272 + * parv[parc-1] = kick comment
273 + */
274 +int ms_opkick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
275 +{
276 + struct Client *who;
277 + struct Channel *chptr;
278 + struct Membership *member = 0, *sptr_link = 0;
279 + char *name, *comment;
280 +
281 + ClrFlag(sptr, FLAG_TS8);
282 +
283 + if (parc < 3 || *parv[1] == '\0')
284 + return need_more_params(sptr, "OPKICK");
285 +
286 + name = parv[1];
287 + comment = parv[parc - 1];
288 +
289 + /* figure out who gets kicked from what */
290 + if (IsLocalChannel(name) ||
291 + !(chptr = get_channel(sptr, name, CGT_NO_CREATE)) ||
292 + !(who = findNUser(parv[2])))
293 + return 0;
294 +
295 + /* We go ahead and pass on the KICK for users not on the channel */
296 + if (!(member = find_member_link(chptr, who)) || IsZombie(member)) {
297 + if (member) {
298 + make_zombie(member, who, cptr, sptr, chptr);
299 + member=0;
300 + }
301 + }
302 +
303 + /* Propagate kick... */
304 + sendcmdto_serv_butone(sptr, CMD_OPKICK, cptr, "%H %C :%s", chptr, who, comment);
305 +
306 + if (member) { /* and tell the channel about it */
307 + if (IsDelayedJoin(member)) {
308 + if (MyUser(who))
309 + sendcmdto_one((IsServer(sptr) || feature_bool(FEAT_HIS_MODEWHO)) ? &his : sptr,
310 + CMD_KICK, who, "%H %C :%s", chptr, who, comment);
311 + } else {
312 + sendcmdto_channel_butserv_butone((IsServer(sptr) || feature_bool(FEAT_HIS_MODEWHO)) ? &his : sptr,
313 + CMD_KICK, chptr, NULL, 0, "%H %C :%s", chptr, who, comment);
314 + }
315 +
316 + /* Send HACK notice and log it */
317 + sendto_opmask_butone(0, SNO_HACK4, "HACK(4): %C KICK %H %C %s", sptr, chptr, who, comment);
318 + log_write(LS_OPERMODE, L_INFO, LOG_NOSNOTICE, "%#C OPKICK %H %C %s", sptr, chptr, who, comment);
319 +
320 + make_zombie(member, who, cptr, sptr, chptr);
321 + }
322 + return 0;
323 +}
324 diff -r d7557937c1ab ircd/parse.c
325 --- a/ircd/parse.c Mon Jan 26 12:42:49 2009 +0100
326 +++ b/ircd/parse.c Mon Jan 26 12:47:29 2009 +0100
327 @@ -656,6 +656,17 @@
328 0, MAXPARA, MFLG_SLOW, 0, NULL,
329 { m_unregistered, m_not_oper, m_check, m_check, m_ignore }
330 },
331 +
332 + /*
333 + * Add the command for OPKICK.
334 + */
335 + {
336 + MSG_OPKICK,
337 + TOK_OPKICK,
338 + 0, MAXPARA, MFLG_SLOW, 0, NULL,
339 + /* UNREG, CLIENT, SERVER, OPER, SERVICE */
340 + { m_unregistered, m_not_oper, ms_opkick, mo_opkick, m_ignore }
341 + },
342
343 /* This command is an alias for QUIT during the unregistered part of
344 * of the server. This is because someone jumping via a broken web