ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/contrib/m_killhost.c
Revision: 30
Committed: Sun Oct 2 20:03:27 2005 UTC (18 years, 5 months ago) by adx
Content type: text/x-csrc
File size: 6617 byte(s)
Log Message:
- imported sources
- can be moved later according to the directory/branching scheme,
  but we need the svn up

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: m_killhost.c,v 1.22 2005/10/01 14:29:47 michael Exp $
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: 1.22 $";
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 buf_nuh[NICKLEN + USERLEN + HOSTLEN + 3];
91 char def_reason[] = "No reason specified";
92 unsigned int count = 0;
93
94 if (!(IsOperK(source_p) || IsOperGlobalKill(source_p)))
95 {
96 sendto_one(source_p, form_str(ERR_NOPRIVILEGES),
97 me.name, source_p->name);
98 return;
99 }
100
101 strlcpy(buf_nuh, parv[1], sizeof(buf_nuh));
102 split_nuh(buf_nuh, &nick, &user, &host);
103
104 if (!valid_wild_card(source_p, YES, 3, nick, user, host))
105 goto cleanup;
106
107 if (!EmptyString(parv[2]))
108 {
109 reason = parv[2];
110 if (strlen(reason) > (size_t)KILLLEN)
111 reason[KILLLEN] = '\0';
112 }
113 else
114 reason = def_reason;
115
116 DLINK_FOREACH_SAFE(ptr, ptr_next, global_client_list.head)
117 {
118 target_p = ptr->data;
119
120 if (!IsClient(target_p) || (source_p == target_p))
121 continue;
122
123 if (!MyConnect(target_p) && !IsOperGlobalKill(source_p))
124 continue;
125
126 if (match(nick, target_p->name) &&
127 match(user, target_p->username) &&
128 match(host, target_p->host))
129 {
130 if (MyConnect(target_p))
131 sendto_one(target_p, ":%s!%s@%s KILL %s :%s",
132 source_p->name, source_p->username, source_p->host,
133 target_p->name, reason);
134
135 sendto_realops_flags(UMODE_ALL, L_ALL,
136 "Received KILL message for %s. From %s Path: %s (%s)",
137 target_p->name, source_p->name, me.name, reason);
138
139 ilog(L_INFO,"KILL From %s For %s Path %s (%s)",
140 source_p->name, target_p->name, me.name, reason);
141
142 if (!MyConnect(target_p))
143 {
144 kh_relay_kill(client_p, source_p, target_p, inpath, reason);
145 SetKilled(target_p);
146 }
147
148 if (!count++)
149 ircsprintf(bufhost, "Killed (%s (%s))", source_p->name, reason);
150
151 exit_client(target_p, source_p, bufhost);
152 }
153 }
154
155 if (count > 0)
156 sendto_wallops_flags(UMODE_OPERWALL, source_p, "OPERWALL - KILLHOST %s %s",
157 host, reason);
158
159 sendto_one(source_p,":%s NOTICE %s :%u clients killed",
160 me.name, source_p->name, count);
161 cleanup:
162 MyFree(nick);
163 MyFree(user);
164 MyFree(host);
165 }
166
167 static void
168 kh_relay_kill(struct Client *one, struct Client *source_p, struct Client *target_p,
169 const char *inpath, const char *reason)
170 {
171 dlink_node *ptr;
172 struct Client *client_p;
173 int introduce_killed_client;
174 char *user;
175
176 /* LazyLinks:
177 * Check if each lazylink knows about target_p.
178 * If it does, send the kill, introducing source_p if required.
179 * If it doesn't either:
180 * a) don't send the kill (risk ghosts)
181 * b) introduce the client (and source_p, if required)
182 * [rather redundant]
183 *
184 * Use a) if IsServer(source_p), but if an oper kills someone,
185 * ensure we blow away any ghosts.
186 *
187 * -davidt
188 */
189
190 if(IsServer(source_p))
191 introduce_killed_client = 0;
192 else
193 introduce_killed_client = 1;
194
195 DLINK_FOREACH(ptr, serv_list.head)
196 {
197 client_p = ptr->data;
198
199 if (client_p == one)
200 continue;
201
202 if (!introduce_killed_client)
203 {
204 if (ServerInfo.hub && IsCapable(client_p, CAP_LL) )
205 {
206 if (((client_p->localClient->serverMask &
207 target_p->lazyLinkClientExists) == 0))
208 {
209 /* target isn't known to lazy leaf, skip it */
210 continue;
211 }
212 }
213 }
214 /* force introduction of killed client but check that
215 * its not on the server we're bursting too.. */
216 else if (strcmp(target_p->servptr->name,client_p->name))
217 client_burst_if_needed(client_p, target_p);
218
219 /* introduce source of kill */
220 client_burst_if_needed(client_p, source_p);
221
222 /* check the server supports TS6 */
223 if (IsCapable(client_p, CAP_TS6))
224 user = ID(target_p);
225 else
226 user = target_p->name;
227
228 if (MyClient(source_p))
229 {
230 sendto_one(client_p, ":%s KILL %s :%s!%s!%s!%s (%s)",
231 source_p->name, user,
232 me.name, source_p->host, source_p->username,
233 source_p->name, reason);
234 }
235 else
236 {
237 sendto_one(client_p, ":%s KILL %s :%s %s",
238 source_p->name, user,
239 inpath, reason);
240 }
241 }
242 }

Properties

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