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-8/modules/m_dline.c (file contents), Revision 1398 by michael, Sun May 6 10:57:06 2012 UTC vs.
ircd-hybrid/trunk/modules/m_dline.c (file contents), Revision 1832 by michael, Fri Apr 19 19:16:09 2013 UTC

# Line 27 | Line 27
27   #include "channel.h"
28   #include "client.h"
29   #include "irc_string.h"
30 < #include "sprintf_irc.h"
30 > #include "conf.h"
31   #include "ircd.h"
32   #include "hostmask.h"
33   #include "numeric.h"
34   #include "fdlist.h"
35   #include "s_bsd.h"
36 #include "conf.h"
36   #include "log.h"
37   #include "s_misc.h"
38   #include "send.h"
39   #include "hash.h"
40   #include "s_serv.h"
42 #include "s_gline.h"
41   #include "parse.h"
42   #include "modules.h"
43 + #include "conf_db.h"
44 + #include "memory.h"
45  
46  
47   /* apply_tdline()
# Line 51 | Line 51
51   * side effects - tkline as given is placed
52   */
53   static void
54 < apply_tdline(struct Client *source_p, struct ConfItem *conf,
55 <             const char *current_date, int tkline_time)
54 > apply_dline(struct Client *source_p, struct MaskItem *conf,
55 >            time_t tkline_time)
56   {
57 <  struct AccessItem *aconf;
57 >  if (tkline_time)
58 >  {
59 >    conf->until = CurrentTime + tkline_time;
60 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
61 >                         "%s added temporary %d min. D-Line for [%s] [%s]",
62 >                         get_oper_name(source_p), tkline_time/60,
63 >                         conf->host, conf->reason);
64 >    sendto_one(source_p, ":%s NOTICE %s :Added temporary %d min. D-Line [%s]",
65 >               MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
66 >               source_p->name, tkline_time/60, conf->host);
67 >    ilog(LOG_TYPE_DLINE, "%s added temporary %d min. D-Line for [%s] [%s]",
68 >         get_oper_name(source_p), tkline_time/60, conf->host, conf->reason);
69 >  }
70 >  else
71 >  {
72 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
73 >                         "%s added D-Line for [%s] [%s]",
74 >                         get_oper_name(source_p), conf->host, conf->reason);
75 >    sendto_one(source_p, ":%s NOTICE %s :Added D-Line [%s]",
76 >               MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
77 >               source_p->name, conf->host);
78 >    ilog(LOG_TYPE_DLINE, "%s added D-Line for [%s] [%s]",
79 >         get_oper_name(source_p), conf->host, conf->reason);
80  
81 <  aconf = map_to_conf(conf);
60 <  aconf->hold = CurrentTime + tkline_time;
61 <  SetConfTemporary(aconf);
62 <  add_conf_by_address(CONF_DLINE, aconf);
63 <
64 <
65 <  sendto_realops_flags(UMODE_ALL, L_ALL,
66 <                       "%s added temporary %d min. D-Line for [%s] [%s]",
67 <                       get_oper_name(source_p), tkline_time/60,
68 <                       aconf->host, aconf->reason);
69 <
70 <  sendto_one(source_p, ":%s NOTICE %s :Added temporary %d min. D-Line [%s]",
71 <             MyConnect(source_p) ? me.name : ID_or_name(&me, source_p->from),
72 <             source_p->name, tkline_time/60, aconf->host);
73 <  ilog(LOG_TYPE_DLINE, "%s added temporary %d min. D-Line for [%s] [%s]",
74 <       source_p->name, tkline_time/60, aconf->host, aconf->reason);
81 >  }
82  
83 +  SetConfDatabase(conf);
84 +  conf->setat = CurrentTime;
85 +  add_conf_by_address(CONF_DLINE, conf);
86    rehashed_klines = 1;
87   }
88  
# Line 82 | Line 92 | apply_tdline(struct Client *source_p, st
92   * Side effects: Any matching tdlines are removed.
93   */
94   static int
95 < remove_tdline_match(const char *host)
95 > remove_dline_match(const char *host)
96   {
97    struct irc_ssaddr iphost, *piphost;
98 <  struct AccessItem *aconf;
99 <  int t;
98 >  struct MaskItem *conf;
99 >  int t = 0;
100 >  int aftype = 0;
101  
102    if ((t = parse_netmask(host, &iphost, NULL)) != HM_HOST)
103    {
104   #ifdef IPV6
105      if (t == HM_IPV6)
106 <      t = AF_INET6;
106 >      aftype = AF_INET6;
107      else
108   #endif
109 <      t = AF_INET;
109 >      aftype = AF_INET;
110      piphost = &iphost;
111    }
112    else
102  {
103    t = 0;
113      piphost = NULL;
105  }
114  
115 <  if ((aconf = find_conf_by_address(host, piphost, CONF_DLINE, t, NULL, NULL, 0)))
115 >  if ((conf = find_conf_by_address(host, piphost, CONF_DLINE | 1, aftype, NULL, NULL, 0)))
116    {
117 <    if (IsConfTemporary(aconf))
117 >    if (IsConfDatabase(conf))
118      {
119 <      delete_one_address_conf(host, aconf);
119 >      delete_one_address_conf(host, conf);
120        return 1;
121      }
122    }
# Line 130 | Line 138 | static void
138   mo_dline(struct Client *client_p, struct Client *source_p,
139           int parc, char *parv[])
140   {
141 <  char def_reason[] = "<No reason specified>";
142 <  char *dlhost = NULL, *oper_reason = NULL, *reason = NULL;
141 >  char def_reason[] = CONF_NOREASON;
142 >  char *dlhost = NULL, *reason = NULL;
143    char *target_server = NULL;
144    const char *creason;
145    const struct Client *target_p = NULL;
146    struct irc_ssaddr daddr;
147 <  struct ConfItem *conf=NULL;
140 <  struct AccessItem *aconf=NULL;
147 >  struct MaskItem *conf=NULL;
148    time_t tkline_time=0;
149 <  int bits, t;
149 >  int bits = 0, aftype = 0, t = 0;
150    const char *current_date = NULL;
151    time_t cur_time;
152    char hostip[HOSTIPLEN + 1];
# Line 147 | Line 154 | mo_dline(struct Client *client_p, struct
154  
155    if (!HasOFlag(source_p, OPER_FLAG_DLINE))
156    {
157 <    sendto_one(source_p, form_str(ERR_NOPRIVS),
158 <               me.name, source_p->name, "kline");
157 >    sendto_one(source_p, ERR_NOPRIVS,
158 >               me.name, source_p->name, "dline");
159      return;
160    }
161  
# Line 160 | Line 167 | mo_dline(struct Client *client_p, struct
167    {
168      if (HasID(source_p))
169      {
170 <      sendto_server(NULL, NULL, CAP_DLN|CAP_TS6, NOCAPS,
170 >      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, NULL, CAP_DLN, CAP_TS6,
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, NULL, CAP_DLN, NOCAPS,
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);
184  
185      /* Allow ON to apply local kline as well if it matches */
186 <    if (!match(target_server, me.name))
186 >    if (match(target_server, me.name))
187        return;
188    }
189    else
# Line 222 | Line 229 | mo_dline(struct Client *client_p, struct
229  
230   #ifdef IPV6
231    if (t == HM_IPV6)
232 <    t = AF_INET6;
232 >    aftype = AF_INET6;
233    else
234   #endif
235 <    t = AF_INET;
235 >    aftype = AF_INET;
236  
237    parse_netmask(dlhost, &daddr, NULL);
238  
239 <  if ((aconf = find_dline_conf(&daddr, t)) != NULL)
239 >  if ((conf = find_dline_conf(&daddr, aftype)) != NULL)
240    {
241 <    creason = aconf->reason ? aconf->reason : def_reason;
242 <    if (IsConfExemptKline(aconf))
241 >    creason = conf->reason ? conf->reason : def_reason;
242 >    if (IsConfExemptKline(conf))
243        sendto_one(source_p,
244                   ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s",
245 <                 me.name, source_p->name, dlhost, aconf->host, creason);
245 >                 me.name, source_p->name, dlhost, conf->host, creason);
246      else
247        sendto_one(source_p,
248                   ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
249 <                 me.name, source_p->name, dlhost, aconf->host, creason);
249 >                 me.name, source_p->name, dlhost, conf->host, creason);
250      return;
251    }
252  
253    cur_time = CurrentTime;
254    current_date = smalldate(cur_time);
255  
249  /* Look for an oper reason */
250  if ((oper_reason = strchr(reason, '|')) != NULL)
251    *oper_reason++ = '\0';
252
256    if (!valid_comment(source_p, reason, 1))
257      return;
258  
259 <  conf = make_conf_item(DLINE_TYPE);
260 <  aconf = map_to_conf(conf);
258 <  DupString(aconf->host, dlhost);
259 >  conf = conf_make(CONF_DLINE);
260 >  conf->host = xstrdup(dlhost);
261  
262    if (tkline_time != 0)
261  {
263      snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)",
264               (int)(tkline_time/60), reason, current_date);
264    DupString(aconf->reason, buffer);
265    if (oper_reason != NULL)
266      DupString(aconf->oper_reason, oper_reason);
267    apply_tdline(source_p, conf, current_date, tkline_time);
268  }
265    else
270  {
266      snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date);
272    DupString(aconf->reason, buffer);
273    if (oper_reason != NULL)
274      DupString(aconf->oper_reason, oper_reason);
275    add_conf_by_address(CONF_DLINE, aconf);
276    write_conf_line(source_p, conf, current_date, cur_time);
277  }
267  
268 +  conf->reason = xstrdup(buffer);
269 +  apply_dline(source_p, conf, tkline_time);
270    rehashed_klines = 1;
271   }
272  
# Line 283 | Line 274 | static void
274   ms_dline(struct Client *client_p, struct Client *source_p,
275           int parc, char *parv[])
276   {
277 <  char def_reason[] = "<No reason specified>";
278 <  char *dlhost, *oper_reason, *reason;
277 >  char def_reason[] = CONF_NOREASON;
278 >  char *dlhost, *reason;
279    const char *creason;
280    const struct Client *target_p = NULL;
281    struct irc_ssaddr daddr;
282 <  struct ConfItem *conf=NULL;
292 <  struct AccessItem *aconf=NULL;
282 >  struct MaskItem *conf=NULL;
283    time_t tkline_time=0;
284 <  int bits, t;
284 >  int bits = 0, aftype = 0, t = 0;
285    const char *current_date = NULL;
286    time_t cur_time;
287    char hostip[HOSTIPLEN + 1];
# Line 306 | Line 296 | ms_dline(struct Client *client_p, struct
296                       "DLINE %s %s %s :%s",
297                       parv[1], parv[2], parv[3], parv[4]);
298  
299 <  if (!match(parv[1], me.name))
299 >  if (match(parv[1], me.name))
300      return;
301  
302    tkline_time = valid_tkline(parv[2], TK_SECONDS);
303    dlhost = parv[3];
304    reason = parv[4];
305  
306 <  if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(ULINE_TYPE, source_p->servptr->name,
306 >  if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE, source_p->servptr->name,
307                                source_p->username, source_p->host,
308                                SHARED_DLINE))
309    {
# Line 358 | Line 348 | ms_dline(struct Client *client_p, struct
348  
349   #ifdef IPV6
350      if (t == HM_IPV6)
351 <      t = AF_INET6;
351 >      aftype= AF_INET6;
352      else
353   #endif
354 <      t = AF_INET;
354 >      aftype = AF_INET;
355  
356      parse_netmask(dlhost, &daddr, NULL);
357  
358 <    if ((aconf = find_dline_conf(&daddr, t)) != NULL)
358 >    if ((conf = find_dline_conf(&daddr, aftype)) != NULL)
359      {
360 <      creason = aconf->reason ? aconf->reason : def_reason;
361 <      if (IsConfExemptKline(aconf))
360 >      creason = conf->reason ? conf->reason : def_reason;
361 >      if (IsConfExemptKline(conf))
362          sendto_one(source_p,
363                     ":%s NOTICE %s :[%s] is (E)d-lined by [%s] - %s",
364 <                   me.name, source_p->name, dlhost, aconf->host, creason);
364 >                   me.name, source_p->name, dlhost, conf->host, creason);
365        else
366          sendto_one(source_p,
367                     ":%s NOTICE %s :[%s] already D-lined by [%s] - %s",
368 <                   me.name, source_p->name, dlhost, aconf->host, creason);
368 >                   me.name, source_p->name, dlhost, conf->host, creason);
369        return;
370      }
371  
372      cur_time = CurrentTime;
373      current_date = smalldate(cur_time);
374  
385    /* Look for an oper reason */
386    if ((oper_reason = strchr(reason, '|')) != NULL)
387      *oper_reason++ = '\0';
388
375      if (!valid_comment(source_p, reason, 1))
376        return;
377  
378 <    conf = make_conf_item(DLINE_TYPE);
379 <    aconf = map_to_conf(conf);
394 <    DupString(aconf->host, dlhost);
378 >    conf = conf_make(CONF_DLINE);
379 >    conf->host = xstrdup(dlhost);
380  
381      if (tkline_time != 0)
397    {
382        snprintf(buffer, sizeof(buffer), "Temporary D-line %d min. - %s (%s)",
383                 (int)(tkline_time/60), reason, current_date);
400      DupString(aconf->reason, buffer);
401      if (oper_reason != NULL)
402        DupString(aconf->oper_reason, oper_reason);
403      apply_tdline(source_p, conf, current_date, tkline_time);
404    }
384      else
406    {
385        snprintf(buffer, sizeof(buffer), "%s (%s)", reason, current_date);
408      DupString(aconf->reason, buffer);
409      if (oper_reason != NULL)
410        DupString(aconf->oper_reason, oper_reason);
411      add_conf_by_address(CONF_DLINE, aconf);
412      write_conf_line(source_p, conf, current_date, cur_time);
413    }
386  
387 +    conf->reason = xstrdup(buffer);
388 +    apply_dline(source_p, conf, tkline_time);
389      rehashed_klines = 1;
390    }
391   }
# Line 434 | Line 408 | mo_undline(struct Client *client_p, stru
408  
409    if (!HasOFlag(source_p, OPER_FLAG_UNDLINE))
410    {
411 <    sendto_one(source_p, form_str(ERR_NOPRIVS),
411 >    sendto_one(source_p, ERR_NOPRIVS,
412                 me.name, source_p->name, "undline");
413      return;
414    }
415  
416    if (parc < 2 || EmptyString(parv[1]))
417    {
418 <    sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
418 >    sendto_one(source_p, ERR_NEEDMOREPARAMS,
419                 me.name, source_p->name, "UNDLINE");
420      return;
421    }
# Line 456 | Line 430 | mo_undline(struct Client *client_p, stru
430                         "UNDLINE %s %s", target_server, addr);
431  
432      /* Allow ON to apply local unkline as well if it matches */
433 <    if (!match(target_server, me.name))
433 >    if (match(target_server, me.name))
434        return;
435    }
436    else
437      cluster_a_line(source_p, "UNDLINE", CAP_UNDLN, SHARED_UNDLINE,
438                     "%s", addr);
439  
440 <  if (remove_tdline_match(addr))
440 >  if (remove_dline_match(addr))
441    {
442      sendto_one(source_p,
443 <               ":%s NOTICE %s :Un-Dlined [%s] from temporary D-Lines",
443 >               ":%s NOTICE %s :D-Line for [%s] is removed",
444                 me.name, source_p->name, addr);
445 <    sendto_realops_flags(UMODE_ALL, L_ALL,
446 <                         "%s has removed the temporary D-Line for: [%s]",
445 >    sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
446 >                         "%s has removed the D-Line for: [%s]",
447                           get_oper_name(source_p), addr);
474    ilog(LOG_TYPE_DLINE, "%s removed temporary D-Line for [%s]",
475         source_p->name, addr);
476    return;
477  }
478
479  if (remove_conf_line(DLINE_TYPE, source_p, addr, NULL) > 0)
480  {
481    sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
482               me.name, source_p->name, addr);
483    sendto_realops_flags(UMODE_ALL, L_ALL,
484                         "%s has removed the D-Line for: [%s]",
485                         get_oper_name(source_p), addr);
448      ilog(LOG_TYPE_DLINE, "%s removed D-Line for [%s]",
449           get_oper_name(source_p), addr);
450    }
# Line 502 | Line 464 | me_undline(struct Client *client_p, stru
464  
465    addr = parv[2];
466  
467 <  if (!IsClient(source_p) || !match(parv[1], me.name))
467 >  if (!IsClient(source_p) || match(parv[1], me.name))
468      return;
469  
470 <  if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(ULINE_TYPE,
470 >  if (HasFlag(source_p, FLAGS_SERVICE) || find_matching_name_conf(CONF_ULINE,
471                                     source_p->servptr->name,
472                                     source_p->username, source_p->host,
473                                     SHARED_UNDLINE))
474    {
475 <    if (remove_tdline_match(addr))
475 >    if (remove_dline_match(addr))
476      {
477        sendto_one(source_p,
478 <                 ":%s NOTICE %s :Un-Dlined [%s] from temporary D-Lines",
478 >                 ":%s NOTICE %s :D-Line for [%s] is removed",
479                   me.name, source_p->name, addr);
480 <      sendto_realops_flags(UMODE_ALL, L_ALL,
519 <                           "%s has removed the temporary D-Line for: [%s]",
520 <                           get_oper_name(source_p), addr);
521 <      ilog(LOG_TYPE_DLINE, "%s removed temporary D-Line for [%s]",
522 <           source_p->name, addr);
523 <      return;
524 <    }
525 <
526 <    if (remove_conf_line(DLINE_TYPE, source_p, addr, NULL) > 0)
527 <    {
528 <      sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed",
529 <                 me.name, source_p->name, addr);
530 <      sendto_realops_flags(UMODE_ALL, L_ALL,
480 >      sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE,
481                             "%s has removed the D-Line for: [%s]",
482                             get_oper_name(source_p), addr);
483 <      ilog(LOG_TYPE_DLINE, "%s removed D-Line for [%s]",
483 >      ilog(LOG_TYPE_DLINE, "%s removed temporary D-Line for [%s]",
484             get_oper_name(source_p), addr);
485      }
486      else
# Line 547 | Line 497 | ms_undline(struct Client *client_p, stru
497      return;
498  
499    sendto_match_servs(source_p, parv[1], CAP_UNDLN,
500 <                     "UNDLINE %s %s %s",
500 >                     "UNDLINE %s %s",
501                       parv[1], parv[2]);
502  
503    me_undline(client_p, source_p, parc, parv);

Diff Legend

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