ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_kline.c
Revision: 1029
Committed: Sun Nov 8 13:10:50 2009 UTC (16 years, 11 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid-7.3/modules/m_kline.c
File size: 23745 byte(s)
Error occurred while calculating annotation data.
Log Message:
- branch off trunk to create 7.3 branch

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

Properties

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