ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_dline.c
(Generate patch)

Comparing ircd-hybrid/trunk/modules/m_dline.c (file contents):
Revision 1644 by michael, Tue Nov 6 22:20:16 2012 UTC vs.
Revision 2857 by michael, Sat Jan 18 19:38:13 2014 UTC

# Line 1 | Line 1
1   /*
2 < *  ircd-hybrid: an advanced Internet Relay Chat Daemon(ircd).
3 < *  m_dline.c: Bans a user.
2 > *  ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3   *
4 < *  Copyright (C) 2002 by the past and present ircd coders, and others.
4 > *  Copyright (c) 1997-2014 ircd-hybrid development team
5   *
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
# Line 18 | Line 17
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 < *  $Id$
20 > */
21 >
22 > /*! \file m_dline.c
23 > * \brief Includes required functions for processing the DLINE/UNDLINE command.
24 > * \version $Id$
25   */
26  
27   #include "stdinc.h"
# Line 27 | Line 29
29   #include "channel.h"
30   #include "client.h"
31   #include "irc_string.h"
30 #include "sprintf_irc.h"
32   #include "conf.h"
33   #include "ircd.h"
34   #include "hostmask.h"
# Line 42 | Line 43
43   #include "parse.h"
44   #include "modules.h"
45   #include "conf_db.h"
46 + #include "memory.h"
47  
48  
49   /* apply_tdline()
# Line 56 | Line 58 | apply_dline(struct Client *source_p, str
58   {
59    if (tkline_time)
60    {
61 <    conf->hold = CurrentTime + tkline_time;
61 >    conf->until = CurrentTime + tkline_time;
62      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,
# Line 112 | Line 114 | remove_dline_match(const char *host)
114    else
115      piphost = NULL;
116  
117 <  if ((conf = find_conf_by_address(host, piphost, CONF_DLINE, aftype, NULL, NULL, 0)))
117 >  if ((conf = find_conf_by_address(host, piphost, CONF_DLINE | 1, aftype, NULL, NULL, 0)))
118    {
119      if (IsConfDatabase(conf))
120      {
# Line 134 | Line 136 | remove_dline_match(const char *host)
136   * side effects - D line is added
137   *
138   */
139 < static void
139 > static int
140   mo_dline(struct Client *client_p, struct Client *source_p,
141           int parc, char *parv[])
142   {
143 <  char def_reason[] = "<No reason specified>";
143 >  char def_reason[] = CONF_NOREASON;
144    char *dlhost = NULL, *reason = NULL;
145    char *target_server = NULL;
146    const char *creason;
# Line 154 | Line 156 | mo_dline(struct Client *client_p, struct
156  
157    if (!HasOFlag(source_p, OPER_FLAG_DLINE))
158    {
159 <    sendto_one(source_p, form_str(ERR_NOPRIVS),
160 <               me.name, source_p->name, "dline");
161 <    return;
159 >    sendto_one(source_p, form_str(ERR_NOPRIVS), me.name,
160 >               source_p->name, "dline");
161 >    return 0;
162    }
163  
164    if (parse_aline("DLINE", source_p,  parc, parv, AWILD, &dlhost,
165                    NULL, &tkline_time, &target_server, &reason) < 0)
166 <    return;
166 >    return 0;
167  
168    if (target_server != NULL)
169    {
170 <    if (HasID(source_p))
171 <    {
172 <      sendto_server(NULL, CAP_DLN|CAP_TS6, NOCAPS,
171 <                    ":%s DLINE %s %lu %s :%s",
172 <                    source_p->id, target_server, (unsigned long)tkline_time,
173 <                    dlhost, reason);
174 <      sendto_server(NULL, CAP_DLN, CAP_TS6,
175 <                    ":%s DLINE %s %lu %s :%s",
176 <                    source_p->name, target_server, (unsigned long)tkline_time,
177 <                    dlhost, reason);
178 <    }
179 <    else
180 <      sendto_server(NULL, CAP_DLN, NOCAPS,
181 <                    ":%s DLINE %s %lu %s :%s",
182 <                    source_p->name, target_server, (unsigned long)tkline_time,
183 <                    dlhost, reason);
170 >    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  
174      /* Allow ON to apply local kline as well if it matches */
175 <    if (!match(target_server, me.name))
176 <      return;
175 >    if (match(target_server, me.name))
176 >      return 0;
177    }
178    else
179      cluster_a_line(source_p, "DLINE", CAP_DLN, SHARED_DLINE,
# Line 192 | Line 181 | mo_dline(struct Client *client_p, struct
181  
182    if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST)
183    {
184 <    if ((target_p = find_chasing(client_p, source_p, dlhost, NULL)) == NULL)
185 <      return;
184 >    if ((target_p = find_chasing(source_p, dlhost, NULL)) == NULL)
185 >      return 0;
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;
192 >      return 0;
193      }
194  
195      if (IsExemptKline(target_p))
196      {
197 <      sendto_one(source_p,
198 <                 ":%s NOTICE %s :%s is E-lined", me.name,
199 <                 source_p->name, target_p->name);
211 <      return;
197 >      sendto_one(source_p, ":%s NOTICE %s :%s is E-lined",
198 >                 me.name, source_p->name, target_p->name);
199 >      return 0;
200      }
201  
202      getnameinfo((struct sockaddr *)&target_p->localClient->ip,
# Line 224 | Line 212 | mo_dline(struct Client *client_p, struct
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;
215 >    return 0;
216    }
217  
218   #ifdef IPV6
# Line 239 | Line 227 | mo_dline(struct Client *client_p, struct
227    if ((conf = find_dline_conf(&daddr, aftype)) != NULL)
228    {
229      creason = conf->reason ? conf->reason : def_reason;
230 +
231      if (IsConfExemptKline(conf))
232 <      sendto_one(source_p,
233 <                 ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s",
245 <                 me.name, source_p->name, dlhost, conf->host, creason);
232 >      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      else
235 <      sendto_one(source_p,
236 <                 ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
237 <                 me.name, source_p->name, dlhost, conf->host, creason);
250 <    return;
235 >      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 >    return 0;
238    }
239  
240    cur_time = CurrentTime;
241    current_date = smalldate(cur_time);
242  
243    if (!valid_comment(source_p, reason, 1))
244 <    return;
244 >    return 0;
245  
246    conf = conf_make(CONF_DLINE);
247 <  DupString(conf->host, dlhost);
247 >  conf->host = xstrdup(dlhost);
248  
249    if (tkline_time != 0)
250      snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)",
# Line 265 | Line 252 | mo_dline(struct Client *client_p, struct
252    else
253      snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date);
254  
255 <  DupString(conf->reason, buffer);
255 >  conf->reason = xstrdup(buffer);
256    apply_dline(source_p, conf, tkline_time);
257    rehashed_klines = 1;
258 +  return 0;
259   }
260  
261 < static void
261 > static int
262   ms_dline(struct Client *client_p, struct Client *source_p,
263           int parc, char *parv[])
264   {
265 <  char def_reason[] = "<No reason specified>";
265 >  char def_reason[] = CONF_NOREASON;
266    char *dlhost, *reason;
267    const char *creason;
268    const struct Client *target_p = NULL;
# Line 288 | Line 276 | ms_dline(struct Client *client_p, struct
276    char buffer[IRCD_BUFSIZE];
277  
278    if (parc != 5 || EmptyString(parv[4]))
279 <    return;
279 >    return 0;
280  
281    /* parv[0]  parv[1]        parv[2]      parv[3]  parv[4] */
282    /* oper     target_server  tkline_time  host     reason  */
# Line 296 | Line 284 | ms_dline(struct Client *client_p, struct
284                       "DLINE %s %s %s :%s",
285                       parv[1], parv[2], parv[3], parv[4]);
286  
287 <  if (!match(parv[1], me.name))
288 <    return;
287 >  if (match(parv[1], me.name))
288 >    return 0;
289  
290    tkline_time = valid_tkline(parv[2], TK_SECONDS);
291    dlhost = parv[3];
292    reason = parv[4];
293  
294 <  if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE, source_p->servptr->name,
294 >  if (HasFlag(source_p, FLAGS_SERVICE) ||
295 >      find_matching_name_conf(CONF_ULINE, source_p->servptr->name,
296                                source_p->username, source_p->host,
297                                SHARED_DLINE))
298    {
299      if (!IsClient(source_p))
300 <      return;
300 >      return 0;
301 >
302      if ((t = parse_netmask(dlhost, NULL, &bits)) == HM_HOST)
303      {
304 <      if ((target_p = find_chasing(client_p, source_p, dlhost, NULL)) == NULL)
305 <        return;
304 >      if ((target_p = find_chasing(source_p, dlhost, NULL)) == NULL)
305 >        return 0;
306  
307        if (!MyConnect(target_p))
308        {
309          sendto_one(source_p,
310                     ":%s NOTICE %s :Can't DLINE nick on another server",
311                     me.name, source_p->name);
312 <        return;
312 >        return 0;
313        }
314  
315        if (IsExemptKline(target_p))
# Line 327 | Line 317 | ms_dline(struct Client *client_p, struct
317          sendto_one(source_p,
318                     ":%s NOTICE %s :%s is E-lined", me.name,
319                     source_p->name, target_p->name);
320 <        return;
320 >        return 0;
321        }
322  
323        getnameinfo((struct sockaddr *)&target_p->localClient->ip,
# Line 343 | Line 333 | ms_dline(struct Client *client_p, struct
333        sendto_one(source_p,
334                   ":%s NOTICE %s :For safety, bitmasks less than 8 require conf access.",
335                   me.name, source_p->name);
336 <      return;
336 >      return 0;
337      }
338  
339   #ifdef IPV6
# Line 366 | Line 356 | ms_dline(struct Client *client_p, struct
356          sendto_one(source_p,
357                     ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
358                     me.name, source_p->name, dlhost, conf->host, creason);
359 <      return;
359 >      return 0;
360      }
361  
362      cur_time = CurrentTime;
363      current_date = smalldate(cur_time);
364  
365      if (!valid_comment(source_p, reason, 1))
366 <      return;
366 >      return 0;
367  
368      conf = conf_make(CONF_DLINE);
369 <    DupString(conf->host, dlhost);
369 >    conf->host = xstrdup(dlhost);
370  
371      if (tkline_time != 0)
372        snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)",
# Line 384 | Line 374 | ms_dline(struct Client *client_p, struct
374      else
375        snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date);
376  
377 <    DupString(conf->reason, buffer);
377 >    conf->reason = xstrdup(buffer);
378      apply_dline(source_p, conf, tkline_time);
379      rehashed_klines = 1;
380    }
381 +
382 +  return 0;
383   }
384  
385   /*
# Line 399 | Line 391 | ms_dline(struct Client *client_p, struct
391   **      parv[0] = sender nick
392   **      parv[1] = dline to remove
393   */
394 < static void
394 > static int
395   mo_undline(struct Client *client_p, struct Client *source_p,
396             int parc, char *parv[])
397   {
# Line 408 | Line 400 | mo_undline(struct Client *client_p, stru
400  
401    if (!HasOFlag(source_p, OPER_FLAG_UNDLINE))
402    {
403 <    sendto_one(source_p, form_str(ERR_NOPRIVS),
404 <               me.name, source_p->name, "undline");
405 <    return;
403 >    sendto_one(source_p, form_str(ERR_NOPRIVS), me.name,
404 >               source_p->name, "undline");
405 >    return 0;
406    }
407  
408    if (parc < 2 || EmptyString(parv[1]))
409    {
410      sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
411                 me.name, source_p->name, "UNDLINE");
412 <    return;
412 >    return 0;
413    }
414  
415    if (parse_aline("UNDLINE", source_p, parc, parv, 0, &user,
416                    &addr, NULL, &target_server, NULL) < 0)
417 <    return;
417 >    return 0;
418  
419    if (target_server != NULL)
420    {
# Line 430 | Line 422 | mo_undline(struct Client *client_p, stru
422                         "UNDLINE %s %s", target_server, addr);
423  
424      /* Allow ON to apply local unkline as well if it matches */
425 <    if (!match(target_server, me.name))
426 <      return;
425 >    if (match(target_server, me.name))
426 >      return 0;
427    }
428    else
429      cluster_a_line(source_p, "UNDLINE", CAP_UNDLN, SHARED_UNDLINE,
# Line 439 | Line 431 | mo_undline(struct Client *client_p, stru
431  
432    if (remove_dline_match(addr))
433    {
434 <    sendto_one(source_p,
443 <               ":%s NOTICE %s :D-Line for [%s] is removed",
434 >    sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
435                 me.name, source_p->name, addr);
436      sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
437                           "%s has removed the D-Line for: [%s]",
# Line 451 | Line 442 | mo_undline(struct Client *client_p, stru
442    else
443      sendto_one(source_p, ":%s NOTICE %s :No D-Line for [%s] found",
444                 me.name, source_p->name, addr);
445 +  return 0;
446   }
447  
448 < static void
449 < me_undline(struct Client *client_p, struct Client *source_p,
448 > static int
449 > ms_undline(struct Client *client_p, struct Client *source_p,
450             int parc, char *parv[])
451   {
452 <  const char *addr = NULL;
452 >  const char *addr = parv[1];
453  
454    if (parc != 3 || EmptyString(parv[2]))
455 <    return;
455 >    return 0;
456  
457 <  addr = parv[2];
457 >  sendto_match_servs(source_p, parv[1], CAP_UNDLN,
458 >                     "UNDLINE %s %s",
459 >                     parv[1], parv[2]);
460  
461 <  if (!IsClient(source_p) || !match(parv[1], me.name))
462 <    return;
461 >  if (!IsClient(source_p) || match(parv[1], me.name))
462 >    return 0;
463  
464 <  if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE,
465 <                                   source_p->servptr->name,
466 <                                   source_p->username, source_p->host,
467 <                                   SHARED_UNDLINE))
464 >  if (HasFlag(source_p, FLAGS_SERVICE) ||
465 >      find_matching_name_conf(CONF_ULINE, source_p->servptr->name,
466 >                              source_p->username, source_p->host,
467 >                              SHARED_UNDLINE))
468    {
469      if (remove_dline_match(addr))
470      {
471 <      sendto_one(source_p,
478 <                 ":%s NOTICE %s :D-Line for [%s] is removed",
471 >      sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
472                   me.name, source_p->name, addr);
473        sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
474                             "%s has removed the D-Line for: [%s]",
475                             get_oper_name(source_p), addr);
476 <      ilog(LOG_TYPE_DLINE, "%s removed temporary D-Line for [%s]",
476 >      ilog(LOG_TYPE_DLINE, "%s removed D-Line for [%s]",
477             get_oper_name(source_p), addr);
478      }
479      else
480        sendto_one(source_p, ":%s NOTICE %s :No D-Line for [%s] found",
481                   me.name, source_p->name, addr);
482    }
490 }
483  
484 < static void
493 < ms_undline(struct Client *client_p, struct Client *source_p,
494 <           int parc, char *parv[])
495 < {
496 <  if (parc != 3 || EmptyString(parv[2]))
497 <    return;
498 <
499 <  sendto_match_servs(source_p, parv[1], CAP_UNDLN,
500 <                     "UNDLINE %s %s %s",
501 <                     parv[1], parv[2]);
502 <
503 <  me_undline(client_p, source_p, parc, parv);
484 >  return 0;
485   }
486  
487 < static struct Message dline_msgtab = {
487 > static struct Message dline_msgtab =
488 > {
489    "DLINE", 0, 0, 2, MAXPARA, MFLG_SLOW, 0,
490 <   {m_unregistered, m_not_oper, ms_dline, m_ignore, mo_dline, m_ignore}
490 >  { m_unregistered, m_not_oper, ms_dline, m_ignore, mo_dline, m_ignore }
491   };
492  
493 < static struct Message undline_msgtab = {
493 > static struct Message undline_msgtab =
494 > {
495    "UNDLINE", 0, 0, 2, MAXPARA, MFLG_SLOW, 0,
496 <   {m_unregistered, m_not_oper, ms_undline, m_ignore, mo_undline, m_ignore}
496 >  { m_unregistered, m_not_oper, ms_undline, m_ignore, mo_undline, m_ignore }
497   };
498  
499   static void
# Line 531 | Line 514 | module_exit(void)
514    delete_capability("DLN");
515   }
516  
517 < struct module module_entry = {
517 > struct module module_entry =
518 > {
519    .node    = { NULL, NULL, NULL },
520    .name    = NULL,
521    .version = "$Revision$",

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)