ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid-7.2/contrib/m_killhost.c
Revision: 593
Committed: Fri May 12 05:47:32 2006 UTC (20 years, 5 months ago) by michael
Content type: text/x-csrc
File size: 6706 byte(s)
Log Message:
- Backported RKLINE fix so the user and host portion of a banmask don't get
  cut off after 10 and 63 chars, respectively.
  A split_nuh() rewrite was required for this.
- Removed now unused xstrldup() function

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 * m_killhost.c: Kills a users with agree host.
4 *
5 * Copyright (C) 2002 by Ilya Shtift.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 * USA
21 *
22 * $Id$
23 *
24 */
25
26 #include "stdinc.h"
27 #include "handlers.h"
28 #include "client.h"
29 #include "common.h"
30 #include "hash.h"
31 #include "ircd.h"
32 #include "numeric.h"
33 #include "s_log.h"
34 #include "s_serv.h"
35 #include "s_conf.h"
36 #include "send.h"
37 #include "whowas.h"
38 #include "irc_string.h"
39 #include "sprintf_irc.h"
40 #include "msg.h"
41 #include "parse.h"
42 #include "channel_mode.h" /* needed only for split_nuh() */
43 #include "modules.h"
44
45 static void mo_killhost(struct Client *, struct Client *, int, char *[]);
46 static void kh_relay_kill(struct Client *, struct Client *, struct Client *,
47 const char *, const char *);
48
49 struct Message killhost_msgtab = {
50 "KILLHOST", 0, 0, 2, 0, MFLG_SLOW, 0,
51 { m_unregistered, m_ignore, m_ignore, m_ignore, mo_killhost, m_ignore }
52 };
53
54 #ifndef STATIC_MODULES
55 void
56 _modinit(void)
57 {
58 mod_add_cmd(&killhost_msgtab);
59 }
60
61 void
62 _moddeinit(void)
63 {
64 mod_del_cmd(&killhost_msgtab);
65 }
66
67 const char *_version = "$Revision$";
68 #endif
69
70 /* mo_killhost()
71 * Created May 5, 2003
72 * common (Ilya Shtift) ishtift@tagil.svrw.ru
73 *
74 * parv[0] = sender prefix
75 * parv[1] = host
76 * parv[2] = reason
77 */
78 static void
79 mo_killhost(struct Client *client_p, struct Client *source_p,
80 int parc, char *parv[])
81 {
82 dlink_node *ptr = NULL, *ptr_next = NULL;
83 struct Client *target_p = NULL;
84 const char *inpath = client_p->name;
85 char *nick = NULL;
86 char *user = NULL;
87 char *host = NULL;
88 char *reason = NULL;
89 char bufhost[IRCD_BUFSIZE];
90 char conf_nick[NICKLEN + 1];
91 char conf_user[USERLEN + 1];
92 char conf_host[HOSTLEN + 1];
93 char def_reason[] = "No reason";
94 unsigned int count = 0;
95 struct split_nuh_item nuh;
96
97 if (!(IsOperK(source_p) || IsOperGlobalKill(source_p)))
98 {
99 sendto_one(source_p, form_str(ERR_NOPRIVILEGES),
100 me.name, source_p->name);
101 return;
102 }
103
104 nuh.nuhmask = parv[1];
105 nuh.nickptr = conf_nick;
106 nuh.userptr = conf_user;
107 nuh.hostptr = conf_host;
108
109 nuh.nicksize = sizeof(conf_nick);
110 nuh.usersize = sizeof(conf_user);
111 nuh.hostsize = sizeof(conf_host);
112
113 split_nuh(&nuh);
114
115 if (!valid_wild_card(source_p, YES, 3, nick, user, host))
116 return;
117
118 if (!EmptyString(parv[2]))
119 {
120 reason = parv[2];
121 if (strlen(reason) > (size_t)KILLLEN)
122 reason[KILLLEN] = '\0';
123 }
124 else
125 reason = def_reason;
126
127 DLINK_FOREACH_SAFE(ptr, ptr_next, global_client_list.head)
128 {
129 target_p = ptr->data;
130
131 if (!IsClient(target_p) || (source_p == target_p))
132 continue;
133
134 if (!MyConnect(target_p) && !IsOperGlobalKill(source_p))
135 continue;
136
137 if (match(nick, target_p->name) &&
138 match(user, target_p->username) &&
139 match(host, target_p->host))
140 {
141 if (MyConnect(target_p))
142 sendto_one(target_p, ":%s!%s@%s KILL %s :%s",
143 source_p->name, source_p->username, source_p->host,
144 target_p->name, reason);
145
146 sendto_realops_flags(UMODE_ALL, L_ALL,
147 "Received KILL message for %s. From %s Path: %s (%s)",
148 target_p->name, source_p->name, me.name, reason);
149
150 ilog(L_INFO,"KILL From %s For %s Path %s (%s)",
151 source_p->name, target_p->name, me.name, reason);
152
153 if (!MyConnect(target_p))
154 {
155 kh_relay_kill(client_p, source_p, target_p, inpath, reason);
156 SetKilled(target_p);
157 }
158
159 if (!count++)
160 ircsprintf(bufhost, "Killed (%s (%s))", source_p->name, reason);
161
162 exit_client(target_p, source_p, bufhost);
163 }
164 }
165
166 if (count > 0)
167 sendto_wallops_flags(UMODE_OPERWALL, source_p, "OPERWALL - KILLHOST %s %s",
168 host, reason);
169
170 sendto_one(source_p,":%s NOTICE %s :%u clients killed",
171 me.name, source_p->name, count);
172 }
173
174 static void
175 kh_relay_kill(struct Client *one, struct Client *source_p, struct Client *target_p,
176 const char *inpath, const char *reason)
177 {
178 dlink_node *ptr;
179 struct Client *client_p;
180 int introduce_killed_client;
181 char *user;
182
183 /* LazyLinks:
184 * Check if each lazylink knows about target_p.
185 * If it does, send the kill, introducing source_p if required.
186 * If it doesn't either:
187 * a) don't send the kill (risk ghosts)
188 * b) introduce the client (and source_p, if required)
189 * [rather redundant]
190 *
191 * Use a) if IsServer(source_p), but if an oper kills someone,
192 * ensure we blow away any ghosts.
193 *
194 * -davidt
195 */
196
197 if(IsServer(source_p))
198 introduce_killed_client = 0;
199 else
200 introduce_killed_client = 1;
201
202 DLINK_FOREACH(ptr, serv_list.head)
203 {
204 client_p = ptr->data;
205
206 if (client_p == one)
207 continue;
208
209 if (!introduce_killed_client)
210 {
211 if (ServerInfo.hub && IsCapable(client_p, CAP_LL) )
212 {
213 if (((client_p->localClient->serverMask &
214 target_p->lazyLinkClientExists) == 0))
215 {
216 /* target isn't known to lazy leaf, skip it */
217 continue;
218 }
219 }
220 }
221 /* force introduction of killed client but check that
222 * its not on the server we're bursting too.. */
223 else if (strcmp(target_p->servptr->name,client_p->name))
224 client_burst_if_needed(client_p, target_p);
225
226 /* introduce source of kill */
227 client_burst_if_needed(client_p, source_p);
228
229 /* check the server supports TS6 */
230 if (IsCapable(client_p, CAP_TS6))
231 user = ID(target_p);
232 else
233 user = target_p->name;
234
235 if (MyClient(source_p))
236 {
237 sendto_one(client_p, ":%s KILL %s :%s!%s!%s!%s (%s)",
238 source_p->name, user,
239 me.name, source_p->host, source_p->username,
240 source_p->name, reason);
241 }
242 else
243 {
244 sendto_one(client_p, ":%s KILL %s :%s %s",
245 source_p->name, user,
246 inpath, reason);
247 }
248 }
249 }

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision