ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/modules/m_dline.c
Revision: 2810
Committed: Sun Jan 12 18:30:44 2014 UTC (10 years, 3 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid/trunk/modules/m_dline.c
File size: 14894 byte(s)
Log Message:
- m_dline.c, m_kline.c: fixed indentation, style cleanups, reformatting

File Contents

# User Rev Content
1 michael 1058 /*
2 michael 2810 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 michael 1058 *
4 michael 2810 * Copyright (c) 2002-2014 ircd-hybrid development team
5 michael 1058 *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19     * USA
20     */
21    
22 michael 2810 /*! \file m_dline.c
23     * \brief Includes required functions for processing the DLINE/UNDLINE command.
24     * \version $Id$
25     */
26    
27 michael 1058 #include "stdinc.h"
28     #include "list.h"
29     #include "channel.h"
30     #include "client.h"
31     #include "irc_string.h"
32 michael 1632 #include "conf.h"
33 michael 1058 #include "ircd.h"
34     #include "hostmask.h"
35     #include "numeric.h"
36     #include "fdlist.h"
37     #include "s_bsd.h"
38 michael 1309 #include "log.h"
39 michael 1058 #include "s_misc.h"
40     #include "send.h"
41     #include "hash.h"
42     #include "s_serv.h"
43     #include "parse.h"
44     #include "modules.h"
45 michael 1622 #include "conf_db.h"
46 michael 1666 #include "memory.h"
47 michael 1058
48    
49     /* apply_tdline()
50     *
51     * inputs -
52     * output - NONE
53     * side effects - tkline as given is placed
54     */
55     static void
56 michael 1632 apply_dline(struct Client *source_p, struct MaskItem *conf,
57 michael 1622 time_t tkline_time)
58 michael 1058 {
59 michael 1622 if (tkline_time)
60     {
61 michael 1649 conf->until = CurrentTime + tkline_time;
62 michael 1622 sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
63     "%s added temporary %d min. D-Line for [%s] [%s]",
64     get_oper_name(source_p), tkline_time/60,
65 michael 1632 conf->host, conf->reason);
66 michael 1622 sendto_one(source_p, ":%s NOTICE %s :Added temporary %d min. D-Line [%s]",
67     MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
68 michael 1632 source_p->name, tkline_time/60, conf->host);
69 michael 1622 ilog(LOG_TYPE_DLINE, "%s added temporary %d min. D-Line for [%s] [%s]",
70 michael 1632 get_oper_name(source_p), tkline_time/60, conf->host, conf->reason);
71 michael 1622 }
72     else
73     {
74     sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
75     "%s added D-Line for [%s] [%s]",
76 michael 1632 get_oper_name(source_p), conf->host, conf->reason);
77 michael 1622 sendto_one(source_p, ":%s NOTICE %s :Added D-Line [%s]",
78     MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
79 michael 1632 source_p->name, conf->host);
80 michael 1622 ilog(LOG_TYPE_DLINE, "%s added D-Line for [%s] [%s]",
81 michael 1632 get_oper_name(source_p), conf->host, conf->reason);
82 michael 1058
83 michael 1622 }
84    
85 michael 1632 SetConfDatabase(conf);
86     conf->setat = CurrentTime;
87     add_conf_by_address(CONF_DLINE, conf);
88 michael 1058 rehashed_klines = 1;
89     }
90    
91 michael 1298 /* static int remove_tdline_match(const char *host, const char *user)
92     * Input: An ip to undline.
93     * Output: returns YES on success, NO if no tdline removed.
94     * Side effects: Any matching tdlines are removed.
95     */
96     static int
97 michael 1622 remove_dline_match(const char *host)
98 michael 1298 {
99 michael 1369 struct irc_ssaddr iphost, *piphost;
100 michael 1632 struct MaskItem *conf;
101 michael 1644 int t = 0;
102     int aftype = 0;
103 michael 1298
104 michael 1369 if ((t = parse_netmask(host, &iphost, NULL)) != HM_HOST)
105 michael 1298 {
106     #ifdef IPV6
107 michael 1369 if (t == HM_IPV6)
108 michael 1644 aftype = AF_INET6;
109 michael 1369 else
110 michael 1298 #endif
111 michael 1644 aftype = AF_INET;
112 michael 1369 piphost = &iphost;
113     }
114     else
115     piphost = NULL;
116    
117 michael 1703 if ((conf = find_conf_by_address(host, piphost, CONF_DLINE | 1, aftype, NULL, NULL, 0)))
118 michael 1369 {
119 michael 1632 if (IsConfDatabase(conf))
120 michael 1298 {
121 michael 1632 delete_one_address_conf(host, conf);
122 michael 1298 return 1;
123     }
124     }
125    
126     return 0;
127     }
128    
129 michael 1058 /* mo_dline()
130     *
131     * inputs - pointer to server
132     * - pointer to client
133     * - parameter count
134     * - parameter list
135     * output -
136     * side effects - D line is added
137     *
138     */
139     static void
140     mo_dline(struct Client *client_p, struct Client *source_p,
141     int parc, char *parv[])
142     {
143 michael 1794 char def_reason[] = CONF_NOREASON;
144 michael 1622 char *dlhost = NULL, *reason = NULL;
145 michael 1301 char *target_server = NULL;
146 michael 1058 const char *creason;
147     const struct Client *target_p = NULL;
148     struct irc_ssaddr daddr;
149 michael 1632 struct MaskItem *conf=NULL;
150 michael 1058 time_t tkline_time=0;
151 michael 1644 int bits = 0, aftype = 0, t = 0;
152 michael 1058 const char *current_date = NULL;
153     time_t cur_time;
154 michael 1398 char hostip[HOSTIPLEN + 1];
155 michael 1230 char buffer[IRCD_BUFSIZE];
156 michael 1058
157 michael 1301 if (!HasOFlag(source_p, OPER_FLAG_DLINE))
158 michael 1058 {
159 michael 2810 sendto_one(source_p, form_str(ERR_NOPRIVS), me.name,
160     source_p->name, "dline");
161 michael 1058 return;
162     }
163    
164     if (parse_aline("DLINE", source_p, parc, parv, AWILD, &dlhost,
165 michael 1301 NULL, &tkline_time, &target_server, &reason) < 0)
166 michael 1058 return;
167    
168 michael 1301 if (target_server != NULL)
169     {
170 michael 2807 sendto_match_servs(source_p, target_server, CAP_DLN, "DLINE %s %lu %s :%s",
171     target_server, (unsigned long)tkline_time,
172     dlhost, reason);
173 michael 1301
174     /* Allow ON to apply local kline as well if it matches */
175 michael 1652 if (match(target_server, me.name))
176 michael 1301 return;
177     }
178     else
179     cluster_a_line(source_p, "DLINE", CAP_DLN, SHARED_DLINE,
180     "%d %s :%s", tkline_time, dlhost, reason);
181    
182 michael 1058 if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST)
183     {
184 michael 2475 if ((target_p = find_chasing(source_p, dlhost, NULL)) == NULL)
185 michael 1058 return;
186    
187     if (!MyConnect(target_p))
188     {
189     sendto_one(source_p,
190     ":%s NOTICE %s :Can't DLINE nick on another server",
191     me.name, source_p->name);
192     return;
193     }
194    
195     if (IsExemptKline(target_p))
196     {
197 michael 2810 sendto_one(source_p, ":%s NOTICE %s :%s is E-lined",
198     me.name, source_p->name, target_p->name);
199 michael 1058 return;
200     }
201    
202 michael 1123 getnameinfo((struct sockaddr *)&target_p->localClient->ip,
203     target_p->localClient->ip.ss_len, hostip,
204     sizeof(hostip), NULL, 0, NI_NUMERICHOST);
205 michael 1058 dlhost = hostip;
206     t = parse_netmask(dlhost, NULL, &bits);
207     assert(t == HM_IPV4 || t == HM_IPV6);
208     }
209    
210     if (bits < 8)
211     {
212     sendto_one(source_p,
213     ":%s NOTICE %s :For safety, bitmasks less than 8 require conf access.",
214     me.name, source_p->name);
215     return;
216     }
217    
218     #ifdef IPV6
219     if (t == HM_IPV6)
220 michael 1644 aftype = AF_INET6;
221 michael 1058 else
222     #endif
223 michael 1644 aftype = AF_INET;
224 michael 1058
225     parse_netmask(dlhost, &daddr, NULL);
226    
227 michael 1644 if ((conf = find_dline_conf(&daddr, aftype)) != NULL)
228 michael 1058 {
229 michael 1632 creason = conf->reason ? conf->reason : def_reason;
230 michael 2810
231 michael 1632 if (IsConfExemptKline(conf))
232 michael 2810 sendto_one(source_p, ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s",
233     me.name, source_p->name, dlhost, conf->host, creason);
234 michael 1058 else
235 michael 2810 sendto_one(source_p, ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
236     me.name, source_p->name, dlhost, conf->host, creason);
237 michael 1058 return;
238     }
239    
240     cur_time = CurrentTime;
241     current_date = smalldate(cur_time);
242    
243 michael 1243 if (!valid_comment(source_p, reason, 1))
244 michael 1058 return;
245    
246 michael 1632 conf = conf_make(CONF_DLINE);
247 michael 1646 conf->host = xstrdup(dlhost);
248 michael 1058
249     if (tkline_time != 0)
250 michael 1233 snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)",
251     (int)(tkline_time/60), reason, current_date);
252 michael 1058 else
253 michael 1233 snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date);
254 michael 1058
255 michael 1646 conf->reason = xstrdup(buffer);
256 michael 1632 apply_dline(source_p, conf, tkline_time);
257 michael 1058 rehashed_klines = 1;
258     }
259    
260 michael 1301 static void
261     ms_dline(struct Client *client_p, struct Client *source_p,
262     int parc, char *parv[])
263     {
264 michael 1794 char def_reason[] = CONF_NOREASON;
265 michael 1622 char *dlhost, *reason;
266 michael 1301 const char *creason;
267     const struct Client *target_p = NULL;
268     struct irc_ssaddr daddr;
269 michael 1632 struct MaskItem *conf=NULL;
270 michael 1301 time_t tkline_time=0;
271 michael 1644 int bits = 0, aftype = 0, t = 0;
272 michael 1301 const char *current_date = NULL;
273     time_t cur_time;
274 michael 1398 char hostip[HOSTIPLEN + 1];
275 michael 1301 char buffer[IRCD_BUFSIZE];
276    
277     if (parc != 5 || EmptyString(parv[4]))
278     return;
279    
280     /* parv[0] parv[1] parv[2] parv[3] parv[4] */
281     /* oper target_server tkline_time host reason */
282     sendto_match_servs(source_p, parv[1], CAP_DLN,
283     "DLINE %s %s %s :%s",
284     parv[1], parv[2], parv[3], parv[4]);
285    
286 michael 1652 if (match(parv[1], me.name))
287 michael 1301 return;
288    
289     tkline_time = valid_tkline(parv[2], TK_SECONDS);
290     dlhost = parv[3];
291     reason = parv[4];
292    
293 michael 2810 if (HasFlag(source_p, FLAGS_SERVICE) ||
294     find_matching_name_conf(CONF_ULINE, source_p->servptr->name,
295 michael 1301 source_p->username, source_p->host,
296     SHARED_DLINE))
297     {
298     if (!IsClient(source_p))
299     return;
300     if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST)
301     {
302 michael 2475 if ((target_p = find_chasing(source_p, dlhost, NULL)) == NULL)
303 michael 1301 return;
304    
305     if (!MyConnect(target_p))
306     {
307     sendto_one(source_p,
308     ":%s NOTICE %s :Can't DLINE nick on another server",
309     me.name, source_p->name);
310     return;
311     }
312    
313     if (IsExemptKline(target_p))
314     {
315     sendto_one(source_p,
316     ":%s NOTICE %s :%s is E-lined", me.name,
317     source_p->name, target_p->name);
318     return;
319     }
320    
321     getnameinfo((struct sockaddr *)&target_p->localClient->ip,
322     target_p->localClient->ip.ss_len, hostip,
323     sizeof(hostip), NULL, 0, NI_NUMERICHOST);
324     dlhost = hostip;
325     t = parse_netmask(dlhost, NULL, &bits);
326     assert(t == HM_IPV4 || t == HM_IPV6);
327     }
328    
329     if (bits < 8)
330     {
331     sendto_one(source_p,
332     ":%s NOTICE %s :For safety, bitmasks less than 8 require conf access.",
333     me.name, source_p->name);
334     return;
335     }
336    
337     #ifdef IPV6
338     if (t == HM_IPV6)
339 michael 1644 aftype= AF_INET6;
340 michael 1301 else
341     #endif
342 michael 1644 aftype = AF_INET;
343 michael 1301
344     parse_netmask(dlhost, &daddr, NULL);
345    
346 michael 1644 if ((conf = find_dline_conf(&daddr, aftype)) != NULL)
347 michael 1301 {
348 michael 1632 creason = conf->reason ? conf->reason : def_reason;
349     if (IsConfExemptKline(conf))
350 michael 1301 sendto_one(source_p,
351     ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s",
352 michael 1632 me.name, source_p->name, dlhost, conf->host, creason);
353 michael 1301 else
354     sendto_one(source_p,
355     ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
356 michael 1632 me.name, source_p->name, dlhost, conf->host, creason);
357 michael 1301 return;
358     }
359    
360     cur_time = CurrentTime;
361     current_date = smalldate(cur_time);
362    
363     if (!valid_comment(source_p, reason, 1))
364     return;
365    
366 michael 1632 conf = conf_make(CONF_DLINE);
367 michael 1646 conf->host = xstrdup(dlhost);
368 michael 1301
369     if (tkline_time != 0)
370     snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)",
371     (int)(tkline_time/60), reason, current_date);
372     else
373     snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date);
374    
375 michael 1646 conf->reason = xstrdup(buffer);
376 michael 1632 apply_dline(source_p, conf, tkline_time);
377 michael 1301 rehashed_klines = 1;
378     }
379     }
380    
381 michael 1058 /*
382     ** m_undline
383     ** added May 28th 2000 by Toby Verrall <toot@melnet.co.uk>
384     ** based totally on m_unkline
385     ** added to hybrid-7 7/11/2000 --is
386     **
387     ** parv[0] = sender nick
388     ** parv[1] = dline to remove
389     */
390     static void
391     mo_undline(struct Client *client_p, struct Client *source_p,
392     int parc, char *parv[])
393     {
394 michael 1301 char *addr = NULL, *user = NULL;
395     char *target_server = NULL;
396 michael 1058
397 michael 1301 if (!HasOFlag(source_p, OPER_FLAG_UNDLINE))
398 michael 1058 {
399 michael 2810 sendto_one(source_p, form_str(ERR_NOPRIVS), me.name,
400     source_p->name, "undline");
401 michael 1058 return;
402     }
403    
404 michael 1301 if (parc < 2 || EmptyString(parv[1]))
405     {
406 michael 1834 sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
407 michael 1301 me.name, source_p->name, "UNDLINE");
408     return;
409     }
410 michael 1058
411 michael 1301 if (parse_aline("UNDLINE", source_p, parc, parv, 0, &user,
412     &addr, NULL, &target_server, NULL) < 0)
413     return;
414    
415     if (target_server != NULL)
416     {
417     sendto_match_servs(source_p, target_server, CAP_UNDLN,
418     "UNDLINE %s %s", target_server, addr);
419    
420     /* Allow ON to apply local unkline as well if it matches */
421 michael 1652 if (match(target_server, me.name))
422 michael 1301 return;
423     }
424     else
425     cluster_a_line(source_p, "UNDLINE", CAP_UNDLN, SHARED_UNDLINE,
426     "%s", addr);
427    
428 michael 1622 if (remove_dline_match(addr))
429 michael 1058 {
430 michael 2810 sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
431 michael 1301 me.name, source_p->name, addr);
432 michael 1618 sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
433 michael 1622 "%s has removed the D-Line for: [%s]",
434 michael 1298 get_oper_name(source_p), addr);
435 michael 1247 ilog(LOG_TYPE_DLINE, "%s removed D-Line for [%s]",
436 michael 1298 get_oper_name(source_p), addr);
437 michael 1058 }
438     else
439     sendto_one(source_p, ":%s NOTICE %s :No D-Line for [%s] found",
440 michael 1298 me.name, source_p->name, addr);
441 michael 1058 }
442 michael 1230
443 michael 1301 static void
444     me_undline(struct Client *client_p, struct Client *source_p,
445     int parc, char *parv[])
446     {
447     const char *addr = NULL;
448    
449     if (parc != 3 || EmptyString(parv[2]))
450     return;
451    
452     addr = parv[2];
453    
454 michael 1652 if (!IsClient(source_p) || match(parv[1], me.name))
455 michael 1301 return;
456    
457 michael 2810 if (HasFlag(source_p, FLAGS_SERVICE) ||
458     find_matching_name_conf(CONF_ULINE, source_p->servptr->name,
459     source_p->username, source_p->host,
460     SHARED_UNDLINE))
461 michael 1301 {
462 michael 1622 if (remove_dline_match(addr))
463 michael 1301 {
464 michael 2810 sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
465 michael 1301 me.name, source_p->name, addr);
466 michael 1618 sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
467 michael 1622 "%s has removed the D-Line for: [%s]",
468 michael 1301 get_oper_name(source_p), addr);
469 michael 2340 ilog(LOG_TYPE_DLINE, "%s removed D-Line for [%s]",
470 michael 1301 get_oper_name(source_p), addr);
471     }
472     else
473     sendto_one(source_p, ":%s NOTICE %s :No D-Line for [%s] found",
474     me.name, source_p->name, addr);
475     }
476     }
477    
478     static void
479     ms_undline(struct Client *client_p, struct Client *source_p,
480     int parc, char *parv[])
481     {
482     if (parc != 3 || EmptyString(parv[2]))
483     return;
484    
485     sendto_match_servs(source_p, parv[1], CAP_UNDLN,
486 michael 1761 "UNDLINE %s %s",
487 michael 1301 parv[1], parv[2]);
488    
489     me_undline(client_p, source_p, parc, parv);
490     }
491    
492 michael 2810 static struct Message dline_msgtab =
493     {
494 michael 1230 "DLINE", 0, 0, 2, MAXPARA, MFLG_SLOW, 0,
495 michael 2810 { m_unregistered, m_not_oper, ms_dline, m_ignore, mo_dline, m_ignore }
496 michael 1230 };
497    
498 michael 2810 static struct Message undline_msgtab =
499     {
500 michael 1230 "UNDLINE", 0, 0, 2, MAXPARA, MFLG_SLOW, 0,
501 michael 2810 { m_unregistered, m_not_oper, ms_undline, m_ignore, mo_undline, m_ignore }
502 michael 1230 };
503    
504     static void
505     module_init(void)
506     {
507     mod_add_cmd(&dline_msgtab);
508     mod_add_cmd(&undline_msgtab);
509 michael 1301 add_capability("DLN", CAP_DLN, 1);
510     add_capability("UNDLN", CAP_UNDLN, 1);
511 michael 1230 }
512    
513     static void
514     module_exit(void)
515     {
516     mod_del_cmd(&dline_msgtab);
517     mod_del_cmd(&undline_msgtab);
518 michael 1301 delete_capability("UNDLN");
519     delete_capability("DLN");
520 michael 1230 }
521    
522 michael 2810 struct module module_entry =
523     {
524 michael 1230 .node = { NULL, NULL, NULL },
525     .name = NULL,
526     .version = "$Revision$",
527     .handle = NULL,
528     .modinit = module_init,
529     .modexit = module_exit,
530     .flags = 0
531     };

Properties

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