ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_kline.c
Revision: 611
Committed: Thu May 18 11:43:38 2006 UTC (20 years, 4 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid-7.2/modules/m_kline.c
File size: 23811 byte(s)
Log Message:
- Fixed /dline nick for ipv6 servers

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 * m_kline.c: Bans a user.
4 *
5 * Copyright (C) 2002 by the past and present ircd coders, and others.
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 #include "stdinc.h"
26 #include "tools.h"
27 #include "channel.h"
28 #include "client.h"
29 #include "common.h"
30 #include "irc_string.h"
31 #include "sprintf_irc.h"
32 #include "ircd.h"
33 #include "hostmask.h"
34 #include "numeric.h"
35 #include "list.h"
36 #include "fdlist.h"
37 #include "s_bsd.h"
38 #include "s_conf.h"
39 #include "s_log.h"
40 #include "s_misc.h"
41 #include "send.h"
42 #include "hash.h"
43 #include "handlers.h"
44 #include "s_serv.h"
45 #include "msg.h"
46 #include "s_gline.h"
47 #include "parse.h"
48 #include "modules.h"
49 #include "tools.h"
50 #include "irc_getnameinfo.h"
51
52
53 static void me_kline(struct Client *, struct Client *, int, char **);
54 static void mo_kline(struct Client *, struct Client *, int, char **);
55 static void ms_kline(struct Client *, struct Client *, int, char **);
56 static void mo_dline(struct Client *, struct Client *, int, char **);
57 static void me_unkline(struct Client *, struct Client *, int, char **);
58 static void mo_unkline(struct Client *, struct Client *, int, char **);
59 static void ms_unkline(struct Client *, struct Client *, int, char **);
60 static void mo_undline(struct Client *, struct Client *, int, char **);
61
62 static int remove_tkline_match(const char *, const char *);
63 static int remove_tdline_match(const char *);
64
65 struct Message kline_msgtab = {
66 "KLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
67 {m_unregistered, m_not_oper, ms_kline, me_kline, mo_kline, m_ignore}
68 };
69
70 struct Message dline_msgtab = {
71 "DLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
72 {m_unregistered, m_not_oper, m_error, m_ignore, mo_dline, m_ignore}
73 };
74
75 struct Message unkline_msgtab = {
76 "UNKLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
77 {m_unregistered, m_not_oper, ms_unkline, me_unkline, mo_unkline, m_ignore}
78 };
79
80 struct Message undline_msgtab = {
81 "UNDLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
82 {m_unregistered, m_not_oper, m_error, m_ignore, mo_undline, m_ignore}
83 };
84
85 #ifndef STATIC_MODULES
86 void
87 _modinit(void)
88 {
89 mod_add_cmd(&kline_msgtab);
90 mod_add_cmd(&unkline_msgtab);
91 mod_add_cmd(&dline_msgtab);
92 mod_add_cmd(&undline_msgtab);
93 add_capability("KLN", CAP_KLN, 1);
94 add_capability("UNKLN", CAP_UNKLN, 1);
95 }
96
97 void
98 _moddeinit(void)
99 {
100 mod_del_cmd(&kline_msgtab);
101 mod_del_cmd(&unkline_msgtab);
102 mod_del_cmd(&dline_msgtab);
103 mod_del_cmd(&undline_msgtab);
104 delete_capability("UNKLN");
105 delete_capability("KLN");
106 }
107
108 const char *_version = "$Revision$";
109 #endif
110
111 /* Local function prototypes */
112 static int already_placed_kline(struct Client *, const char *, const char *, int);
113 static void apply_kline(struct Client *, struct ConfItem *, const char *, time_t);
114 static void apply_tkline(struct Client *, struct ConfItem *, int);
115
116 static char buffer[IRCD_BUFSIZE];
117
118 /* mo_kline()
119 *
120 * inputs - pointer to server
121 * - pointer to client
122 * - parameter count
123 * - parameter list
124 * output -
125 * side effects - k line is added
126 */
127 static void
128 mo_kline(struct Client *client_p, struct Client *source_p,
129 int parc, char **parv)
130 {
131 char *reason = NULL;
132 char *oper_reason;
133 char *user = NULL;
134 char *host = NULL;
135 const char *current_date;
136 char *target_server = NULL;
137 struct ConfItem *conf;
138 struct AccessItem *aconf;
139 time_t tkline_time = 0;
140 time_t cur_time;
141
142 if (!IsOperK(source_p))
143 {
144 sendto_one(source_p, form_str(ERR_NOPRIVS),
145 me.name, source_p->name, "kline");
146 return;
147 }
148
149 if (parse_aline("KLINE", source_p, parc, parv,
150 AWILD, &user, &host, &tkline_time, &target_server, &reason) < 0)
151 return;
152
153 if (target_server != NULL)
154 {
155 if (HasID(source_p))
156 {
157 sendto_server(NULL, source_p, NULL, CAP_KLN|CAP_TS6, NOCAPS, LL_ICLIENT,
158 ":%s KLINE %s %lu %s %s :%s",
159 source_p->id, target_server, (unsigned long)tkline_time,
160 user, host, reason);
161 sendto_server(NULL, source_p, NULL, CAP_KLN, CAP_TS6, LL_ICLIENT,
162 ":%s KLINE %s %lu %s %s :%s",
163 source_p->name, target_server, (unsigned long)tkline_time,
164 user, host, reason);
165 }
166 else
167 sendto_server(NULL, source_p, NULL, CAP_KLN, NOCAPS, LL_ICLIENT,
168 ":%s KLINE %s %lu %s %s :%s",
169 source_p->name, target_server, (unsigned long)tkline_time,
170 user, host, reason);
171
172 /* Allow ON to apply local kline as well if it matches */
173 if (!match(target_server, me.name))
174 return;
175 }
176 else
177 cluster_a_line(source_p, "KLINE", CAP_KLN, SHARED_KLINE,
178 "%d %s %s :%s", tkline_time, user, host, reason);
179
180 if (already_placed_kline(source_p, user, host, YES))
181 return;
182
183 /* Look for an oper reason */
184 if ((oper_reason = strchr(reason, '|')) != NULL)
185 *oper_reason++ = '\0';
186
187 cur_time = CurrentTime;
188 current_date = smalldate(cur_time);
189 conf = make_conf_item(KLINE_TYPE);
190 aconf = map_to_conf(conf);
191
192 DupString(aconf->host, host);
193 DupString(aconf->user, user);
194
195 if (tkline_time != 0)
196 {
197 ircsprintf(buffer, "Temporary K-line %d min. - %s (%s)",
198 (int)(tkline_time/60), reason, current_date);
199 DupString(aconf->reason, buffer);
200
201 if (oper_reason != NULL)
202 DupString(aconf->oper_reason, oper_reason);
203 apply_tkline(source_p, conf, tkline_time);
204 }
205 else
206 {
207 ircsprintf(buffer, "%s (%s)", reason, current_date);
208 DupString(aconf->reason, buffer);
209
210 if (oper_reason != NULL)
211 DupString(aconf->oper_reason, oper_reason);
212 apply_kline(source_p, conf, current_date, cur_time);
213 }
214 }
215
216 /* me_kline - handle remote kline. no propagation */
217 static void
218 me_kline(struct Client *client_p, struct Client *source_p,
219 int parc, char *parv[])
220 {
221 struct ConfItem *conf=NULL;
222 struct AccessItem *aconf=NULL;
223 int tkline_time;
224 const char* current_date;
225 time_t cur_time;
226 char *kuser, *khost, *kreason, *oper_reason;
227
228 if (parc != 6 || EmptyString(parv[5]))
229 return;
230
231 if (!match(parv[1], me.name))
232 return;
233
234 tkline_time = valid_tkline(parv[2], TK_SECONDS);
235 kuser = parv[3];
236 khost = parv[4];
237 kreason = parv[5];
238
239 if ((oper_reason = strchr(kreason, '|')) != NULL)
240 *oper_reason++ = '\0';
241
242 cur_time = CurrentTime;
243 current_date = smalldate(cur_time);
244
245 if (find_matching_name_conf(ULINE_TYPE, source_p->servptr->name,
246 source_p->username, source_p->host,
247 SHARED_KLINE))
248 {
249 if (!IsClient(source_p) ||
250 already_placed_kline(source_p, kuser, khost, YES))
251 return;
252
253 conf = make_conf_item(KLINE_TYPE);
254 aconf = map_to_conf(conf);
255 DupString(aconf->host, khost);
256 DupString(aconf->user, kuser);
257
258 if (tkline_time != 0)
259 {
260 ircsprintf(buffer, "Temporary K-line %d min. - %s (%s)",
261 (int)(tkline_time/60), kreason, current_date);
262 DupString(aconf->reason, buffer);
263
264 if (oper_reason != NULL)
265 DupString(aconf->oper_reason, oper_reason);
266 apply_tkline(source_p, conf, tkline_time);
267 }
268 else
269 {
270 ircsprintf(buffer, "%s (%s)", kreason, current_date);
271 DupString(aconf->reason, buffer);
272
273 if (oper_reason != NULL)
274 DupString(aconf->oper_reason, oper_reason);
275 apply_kline(source_p, conf, current_date, cur_time);
276 }
277 }
278 }
279
280 static void
281 ms_kline(struct Client *client_p, struct Client *source_p,
282 int parc, char *parv[])
283 {
284 if (parc != 6 || EmptyString(parv[5]))
285 return;
286
287 /* parv[0] parv[1] parv[2] parv[3] parv[4] parv[5] */
288 /* oper target_server tkline_time user host reason */
289 sendto_match_servs(source_p, parv[1], CAP_KLN,
290 "KLINE %s %s %s %s :%s",
291 parv[1], parv[2], parv[3], parv[4], parv[5]);
292
293 me_kline(client_p, source_p, parc, parv);
294 }
295
296 /* apply_kline()
297 *
298 * inputs -
299 * output - NONE
300 * side effects - kline as given, is added to the hashtable
301 * and conf file
302 */
303 static void
304 apply_kline(struct Client *source_p, struct ConfItem *conf,
305 const char *current_date, time_t cur_time)
306 {
307 struct AccessItem *aconf = map_to_conf(conf);
308
309 add_conf_by_address(CONF_KILL, aconf);
310 write_conf_line(source_p, conf, current_date, cur_time);
311 /* Now, activate kline against current online clients */
312 rehashed_klines = 1;
313 }
314
315 /* apply_tkline()
316 *
317 * inputs -
318 * output - NONE
319 * side effects - tkline as given is placed
320 */
321 static void
322 apply_tkline(struct Client *source_p, struct ConfItem *conf,
323 int tkline_time)
324 {
325 struct AccessItem *aconf;
326
327 aconf = (struct AccessItem *)map_to_conf(conf);
328 aconf->hold = CurrentTime + tkline_time;
329 add_temp_line(conf);
330 sendto_realops_flags(UMODE_ALL, L_ALL,
331 "%s added temporary %d min. K-Line for [%s@%s] [%s]",
332 get_oper_name(source_p), tkline_time/60,
333 aconf->user, aconf->host,
334 aconf->reason);
335 sendto_one(source_p, ":%s NOTICE %s :Added temporary %d min. K-Line [%s@%s]",
336 MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
337 source_p->name, tkline_time/60, aconf->user, aconf->host);
338 ilog(L_TRACE, "%s added temporary %d min. K-Line for [%s@%s] [%s]",
339 source_p->name, tkline_time/60,
340 aconf->user, aconf->host, aconf->reason);
341 log_oper_action(LOG_TEMP_KLINE_TYPE, source_p, "[%s@%s] [%s]\n",
342 aconf->user, aconf->host, aconf->reason);
343 rehashed_klines = 1;
344 }
345
346 /* apply_tdline()
347 *
348 * inputs -
349 * output - NONE
350 * side effects - tkline as given is placed
351 */
352 static void
353 apply_tdline(struct Client *source_p, struct ConfItem *conf,
354 const char *current_date, int tkline_time)
355 {
356 struct AccessItem *aconf;
357
358 aconf = map_to_conf(conf);
359 aconf->hold = CurrentTime + tkline_time;
360
361 add_temp_line(conf);
362 sendto_realops_flags(UMODE_ALL, L_ALL,
363 "%s added temporary %d min. D-Line for [%s] [%s]",
364 get_oper_name(source_p), tkline_time/60,
365 aconf->host, aconf->reason);
366
367 sendto_one(source_p, ":%s NOTICE %s :Added temporary %d min. D-Line [%s]",
368 MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
369 source_p->name, tkline_time/60, aconf->host);
370 ilog(L_TRACE, "%s added temporary %d min. D-Line for [%s] [%s]",
371 source_p->name, tkline_time/60, aconf->host, aconf->reason);
372 log_oper_action(LOG_TEMP_DLINE_TYPE, source_p, "[%s@%s] [%s]\n",
373 aconf->user, aconf->host, aconf->reason);
374 rehashed_klines = 1;
375 }
376
377 /* mo_dline()
378 *
379 * inputs - pointer to server
380 * - pointer to client
381 * - parameter count
382 * - parameter list
383 * output -
384 * side effects - D line is added
385 *
386 */
387 static void
388 mo_dline(struct Client *client_p, struct Client *source_p,
389 int parc, char *parv[])
390 {
391 char def_reason[] = "No reason";
392 char *dlhost, *oper_reason, *reason;
393 const char *creason;
394 const struct Client *target_p = NULL;
395 struct irc_ssaddr daddr;
396 struct ConfItem *conf=NULL;
397 struct AccessItem *aconf=NULL;
398 time_t tkline_time=0;
399 int bits, t;
400 const char *current_date = NULL;
401 time_t cur_time;
402 char hostip[HOSTIPLEN];
403
404 if (!IsOperK(source_p))
405 {
406 sendto_one(source_p, form_str(ERR_NOPRIVS),
407 me.name, source_p->name, "kline");
408 return;
409 }
410
411 if (parse_aline("DLINE", source_p, parc, parv, AWILD, &dlhost,
412 NULL, &tkline_time, NULL, &reason) < 0)
413 return;
414
415 if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST)
416 {
417 if ((target_p = find_chasing(client_p, source_p, dlhost, NULL)) == NULL)
418 return;
419
420 if (!MyConnect(target_p))
421 {
422 sendto_one(source_p,
423 ":%s NOTICE %s :Can't DLINE nick on another server",
424 me.name, source_p->name);
425 return;
426 }
427
428 if (IsExemptKline(target_p))
429 {
430 sendto_one(source_p,
431 ":%s NOTICE %s :%s is E-lined", me.name,
432 source_p->name, target_p->name);
433 return;
434 }
435
436 irc_getnameinfo((struct sockaddr *)&target_p->localClient->ip,
437 target_p->localClient->ip.ss_len, hostip,
438 sizeof(hostip), NULL, 0, NI_NUMERICHOST);
439
440 dlhost = hostip;
441 t = parse_netmask(dlhost, NULL, &bits);
442 assert(t == HM_IPV4 || t == HM_IPV6);
443 }
444
445 if (bits < 8)
446 {
447 sendto_one(source_p,
448 ":%s NOTICE %s :For safety, bitmasks less than 8 require conf access.",
449 me.name, source_p->name);
450 return;
451 }
452
453 #ifdef IPV6
454 if (t == HM_IPV6)
455 t = AF_INET6;
456 else
457 #endif
458 t = AF_INET;
459
460 parse_netmask(dlhost, &daddr, NULL);
461
462 if ((aconf = find_dline_conf(&daddr, t)) != NULL)
463 {
464 creason = aconf->reason ? aconf->reason : def_reason;
465 if (IsConfExemptKline(aconf))
466 sendto_one(source_p,
467 ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s",
468 me.name, source_p->name, dlhost, aconf->host, creason);
469 else
470 sendto_one(source_p,
471 ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
472 me.name, source_p->name, dlhost, aconf->host, creason);
473 return;
474 }
475
476 cur_time = CurrentTime;
477 current_date = smalldate(cur_time);
478
479 /* Look for an oper reason */
480 if ((oper_reason = strchr(reason, '|')) != NULL)
481 *oper_reason++ = '\0';
482
483 if (!valid_comment(source_p, reason, YES))
484 return;
485
486 conf = make_conf_item(DLINE_TYPE);
487 aconf = map_to_conf(conf);
488 DupString(aconf->host, dlhost);
489
490 if (tkline_time != 0)
491 {
492 ircsprintf(buffer, "Temporary D-line %d min. - %s (%s)",
493 (int)(tkline_time/60), reason, current_date);
494 DupString(aconf->reason, buffer);
495 if (oper_reason != NULL)
496 DupString(aconf->oper_reason, oper_reason);
497 apply_tdline(source_p, conf, current_date, tkline_time);
498 }
499 else
500 {
501 ircsprintf(buffer, "%s (%s)", reason, current_date);
502 DupString(aconf->reason, buffer);
503 if (oper_reason != NULL)
504 DupString(aconf->oper_reason, oper_reason);
505 add_conf_by_address(CONF_DLINE, aconf);
506 write_conf_line(source_p, conf, current_date, cur_time);
507 }
508
509 rehashed_klines = 1;
510 }
511
512 /* already_placed_kline()
513 * inputs - user to complain to, username & host to check for
514 * outputs - returns 1 on existing K-line, 0 if doesn't exist
515 * side effects - notifies source_p if the K-line already exists
516 */
517 /*
518 * Note: This currently works if the new K-line is a special case of an
519 * existing K-line, but not the other way round. To do that we would
520 * have to walk the hash and check every existing K-line. -A1kmm.
521 */
522 static int
523 already_placed_kline(struct Client *source_p, const char *luser, const char *lhost, int warn)
524 {
525 const char *reason;
526 struct irc_ssaddr iphost, *piphost;
527 struct AccessItem *aconf;
528 int t;
529
530 if ((t = parse_netmask(lhost, &iphost, &t)) != HM_HOST)
531 {
532 #ifdef IPV6
533 if (t == HM_IPV6)
534 t = AF_INET6;
535 else
536 #endif
537 t = AF_INET;
538 piphost = &iphost;
539 }
540 else
541 {
542 t = 0;
543 piphost = NULL;
544 }
545
546 if ((aconf = find_conf_by_address(lhost, piphost, CONF_KILL, t, luser, NULL)))
547 {
548 if (warn)
549 {
550 reason = aconf->reason ? aconf->reason : "No reason";
551 sendto_one(source_p,
552 ":%s NOTICE %s :[%s@%s] already K-Lined by [%s@%s] - %s",
553 me.name, source_p->name, luser, lhost, aconf->user,
554 aconf->host, reason);
555 }
556 return(1);
557 }
558
559 return(0);
560 }
561
562 /*
563 ** mo_unkline
564 ** Added Aug 31, 1997
565 ** common (Keith Fralick) fralick@gate.net
566 **
567 ** parv[0] = sender
568 ** parv[1] = address to remove
569 *
570 *
571 */
572 static void
573 mo_unkline(struct Client *client_p,struct Client *source_p,
574 int parc, char *parv[])
575 {
576 char *target_server = NULL;
577 char *user, *host;
578
579 if (!IsOperUnkline(source_p))
580 {
581 sendto_one(source_p, form_str(ERR_NOPRIVS),
582 me.name, source_p->name, "unkline");
583 return;
584 }
585
586 if (parc < 2 || EmptyString(parv[1]))
587 {
588 sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
589 me.name, source_p->name, "UNKLINE");
590 return;
591 }
592
593 if (parse_aline("UNKLINE", source_p, parc, parv, 0, &user,
594 &host, NULL, &target_server, NULL) < 0)
595 return;
596
597 if (target_server != NULL)
598 {
599 sendto_match_servs(source_p, target_server, CAP_UNKLN,
600 "UNKLINE %s %s %s",
601 target_server, user, host);
602
603 /* Allow ON to apply local unkline as well if it matches */
604 if (!match(target_server, me.name))
605 return;
606 }
607 else
608 cluster_a_line(source_p, "UNKLINE", CAP_UNKLN, SHARED_UNKLINE,
609 "%s %s", user, host);
610
611 if (remove_tkline_match(host, user))
612 {
613 sendto_one(source_p,
614 ":%s NOTICE %s :Un-klined [%s@%s] from temporary K-Lines",
615 me.name, source_p->name, user, host);
616 sendto_realops_flags(UMODE_ALL, L_ALL,
617 "%s has removed the temporary K-Line for: [%s@%s]",
618 get_oper_name(source_p), user, host);
619 ilog(L_NOTICE, "%s removed temporary K-Line for [%s@%s]",
620 source_p->name, user, host);
621 return;
622 }
623
624 if (remove_conf_line(KLINE_TYPE, source_p, user, host) > 0)
625 {
626 sendto_one(source_p, ":%s NOTICE %s :K-Line for [%s@%s] is removed",
627 me.name, source_p->name, user,host);
628 sendto_realops_flags(UMODE_ALL, L_ALL,
629 "%s has removed the K-Line for: [%s@%s]",
630 get_oper_name(source_p), user, host);
631 ilog(L_NOTICE, "%s removed K-Line for [%s@%s]",
632 source_p->name, user, host);
633 }
634 else
635 sendto_one(source_p, ":%s NOTICE %s :No K-Line for [%s@%s] found",
636 me.name, source_p->name, user, host);
637 }
638
639 /* me_unkline()
640 *
641 * inputs - server
642 * - client
643 * - parc
644 * - parv
645 * outputs - none
646 * side effects - if server is authorized, kline is removed
647 * does not propagate message
648 */
649 static void
650 me_unkline(struct Client *client_p, struct Client *source_p,
651 int parc, char *parv[])
652 {
653 const char *kuser, *khost;
654
655 if (parc != 4)
656 return;
657
658 kuser = parv[2];
659 khost = parv[3];
660
661 if (!IsClient(source_p) || !match(parv[1], me.name))
662 return;
663
664 if (find_matching_name_conf(ULINE_TYPE,
665 source_p->servptr->name,
666 source_p->username, source_p->host,
667 SHARED_UNKLINE))
668 {
669 if (remove_tkline_match(khost, kuser))
670 {
671 sendto_one(source_p,
672 ":%s NOTICE %s :Un-klined [%s@%s] from temporary K-Lines",
673 me.name, source_p->name, kuser, khost);
674 sendto_realops_flags(UMODE_ALL, L_ALL,
675 "%s has removed the temporary K-Line for: [%s@%s]",
676 get_oper_name(source_p), kuser, khost);
677 ilog(L_NOTICE, "%s removed temporary K-Line for [%s@%s]",
678 source_p->name, kuser, khost);
679 return;
680 }
681
682 if (remove_conf_line(KLINE_TYPE, source_p, kuser, khost) > 0)
683 {
684 sendto_one(source_p, ":%s NOTICE %s :K-Line for [%s@%s] is removed",
685 me.name, source_p->name, kuser, khost);
686 sendto_realops_flags(UMODE_ALL, L_ALL,
687 "%s has removed the K-Line for: [%s@%s]",
688 get_oper_name(source_p), kuser, khost);
689
690 ilog(L_NOTICE, "%s removed K-Line for [%s@%s]",
691 source_p->name, kuser, khost);
692 }
693 else
694 sendto_one(source_p, ":%s NOTICE %s :No K-Line for [%s@%s] found",
695 me.name, source_p->name, kuser, khost);
696 }
697 }
698
699 /* ms_unkline - propagates and handles a remote unkline message */
700 static void
701 ms_unkline(struct Client *client_p, struct Client *source_p,
702 int parc, char *parv[])
703 {
704 if (parc != 4)
705 return;
706
707 sendto_match_servs(source_p, parv[1], CAP_UNKLN,
708 "UNKLINE %s %s %s",
709 parv[1], parv[2], parv[3]);
710
711 me_unkline(client_p, source_p, parc, parv);
712 }
713
714 /* static int remove_tkline_match(const char *host, const char *user)
715 * Input: A hostname, a username to unkline.
716 * Output: returns YES on success, NO if no tkline removed.
717 * Side effects: Any matching tklines are removed.
718 */
719 static int
720 remove_tkline_match(const char *host, const char *user)
721 {
722 struct AccessItem *tk_c;
723 dlink_node *tk_n;
724 struct irc_ssaddr addr, caddr;
725 int nm_t, cnm_t, bits, cbits;
726 nm_t = parse_netmask(host, &addr, &bits);
727
728 DLINK_FOREACH(tk_n, temporary_klines.head)
729 {
730 tk_c = map_to_conf(tk_n->data);
731 cnm_t = parse_netmask(tk_c->host, &caddr, &cbits);
732 if (cnm_t != nm_t || irccmp(user, tk_c->user))
733 continue;
734 if ((nm_t==HM_HOST && !irccmp(tk_c->host, host)) ||
735 (nm_t==HM_IPV4 && bits==cbits && match_ipv4(&addr, &caddr, bits))
736 #ifdef IPV6
737 || (nm_t==HM_IPV6 && bits==cbits && match_ipv6(&addr, &caddr, bits))
738 #endif
739 )
740 {
741 dlinkDelete(tk_n, &temporary_klines);
742 delete_one_address_conf(tk_c->host, tk_c);
743 return(YES);
744 }
745 }
746
747 return(NO);
748 }
749
750 /* static int remove_tdline_match(const char *host, const char *user)
751 * Input: An ip to undline.
752 * Output: returns YES on success, NO if no tdline removed.
753 * Side effects: Any matching tdlines are removed.
754 */
755 static int
756 remove_tdline_match(const char *cidr)
757 {
758 struct AccessItem *td_conf;
759 dlink_node *td_node;
760 struct irc_ssaddr addr, caddr;
761 int nm_t, cnm_t, bits, cbits;
762 nm_t = parse_netmask(cidr, &addr, &bits);
763
764 DLINK_FOREACH(td_node, temporary_dlines.head)
765 {
766 td_conf = map_to_conf(td_node->data);
767 cnm_t = parse_netmask(td_conf->host, &caddr, &cbits);
768
769 if (cnm_t != nm_t)
770 continue;
771
772 if((nm_t==HM_HOST && !irccmp(td_conf->host, cidr)) ||
773 (nm_t==HM_IPV4 && bits==cbits && match_ipv4(&addr, &caddr, bits))
774 #ifdef IPV6
775 || (nm_t==HM_IPV6 && bits==cbits && match_ipv6(&addr, &caddr, bits))
776 #endif
777 )
778 {
779 dlinkDelete(td_node, &temporary_dlines);
780 delete_one_address_conf(td_conf->host, td_conf);
781 return(YES);
782 }
783 }
784
785 return(NO);
786 }
787
788 /*
789 ** m_undline
790 ** added May 28th 2000 by Toby Verrall <toot@melnet.co.uk>
791 ** based totally on m_unkline
792 ** added to hybrid-7 7/11/2000 --is
793 **
794 ** parv[0] = sender nick
795 ** parv[1] = dline to remove
796 */
797 static void
798 mo_undline(struct Client *client_p, struct Client *source_p,
799 int parc, char *parv[])
800 {
801 const char *cidr;
802
803 if (!IsOperUnkline(source_p))
804 {
805 sendto_one(source_p, form_str(ERR_NOPRIVS),
806 me.name, source_p->name, "undline");
807 return;
808 }
809
810 cidr = parv[1];
811
812 if (remove_tdline_match(cidr))
813 {
814 sendto_one(source_p,
815 ":%s NOTICE %s :Un-Dlined [%s] from temporary D-Lines",
816 me.name, source_p->name, cidr);
817 sendto_realops_flags(UMODE_ALL, L_ALL,
818 "%s has removed the temporary D-Line for: [%s]",
819 get_oper_name(source_p), cidr);
820 ilog(L_NOTICE, "%s removed temporary D-Line for [%s]", source_p->name, cidr);
821 return;
822 }
823
824 if (remove_conf_line(DLINE_TYPE, source_p, cidr, NULL) > 0)
825 {
826 sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
827 me.name, source_p->name, cidr);
828 sendto_realops_flags(UMODE_ALL, L_ALL,
829 "%s has removed the D-Line for: [%s]",
830 get_oper_name(source_p), cidr);
831 ilog(L_NOTICE, "%s removed D-Line for [%s]",
832 get_oper_name(source_p), cidr);
833 }
834 else
835 sendto_one(source_p, ":%s NOTICE %s :No D-Line for [%s] found",
836 me.name, source_p->name, cidr);
837 }

Properties

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