]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/m_kline.c
Use "SID Exists" instead of "Server Exists" where appropriate.
[irc/rqf/shadowircd.git] / modules / m_kline.c
index 4101ec36ebc4693e7781507baebd74a669f349c2..48e5ac5a0f1bf02deec74ad0ee764d879f2753d1 100644 (file)
@@ -21,7 +21,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
  *
- *  $Id: m_kline.c 3225 2007-03-04 23:42:55Z jilles $
+ *  $Id: m_kline.c 3466 2007-05-19 23:36:51Z jilles $
  */
 
 #include "stdinc.h"
@@ -46,6 +46,7 @@
 #include "parse.h"
 #include "modules.h"
 #include "event.h"
+#include "reject.h"
 
 static int mo_kline(struct Client *, struct Client *, int, const char **);
 static int ms_kline(struct Client *, struct Client *, int, const char **);
@@ -65,7 +66,7 @@ struct Message unkline_msgtab = {
 };
 
 mapi_clist_av1 kline_clist[] = { &kline_msgtab, &unkline_msgtab, NULL };
-DECLARE_MODULE_AV1(kline, NULL, NULL, kline_clist, NULL, NULL, "$Revision: 3225 $");
+DECLARE_MODULE_AV1(kline, NULL, NULL, kline_clist, NULL, NULL, "$Revision: 3466 $");
 
 /* Local function prototypes */
 static int find_user_host(struct Client *source_p, const char *userhost, char *user, char *host);
@@ -83,9 +84,9 @@ static int already_placed_kline(struct Client *, const char *, const char *, int
 
 static void handle_remote_unkline(struct Client *source_p, 
                        const char *user, const char *host);
-static void remove_permkline_match(struct Client *, const char *, const char *);
+static void remove_permkline_match(struct Client *, struct ConfItem *);
 static int flush_write(struct Client *, FILE *, const char *, const char *);
-static int remove_temp_kline(const char *, const char *);
+static int remove_temp_kline(struct ConfItem *);
 
 /* mo_kline()
  *
@@ -280,7 +281,7 @@ handle_remote_kline(struct Client *source_p, int tkline_time,
        char *oper_reason;
 
        if(!find_shared_conf(source_p->username, source_p->host,
-                               source_p->user->server
+                               source_p->servptr->name
                                (tkline_time > 0) ? SHARED_TKLINE : SHARED_PKLINE))
                return;
 
@@ -353,6 +354,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
        char *host;
        char splat[] = "*";
        char *h = LOCAL_COPY(parv[1]);
+       struct ConfItem *aconf;
 
        if(!IsOperUnkline(source_p))
        {
@@ -411,7 +413,14 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
                cluster_generic(source_p, "UNKLINE", SHARED_UNKLINE, CAP_UNKLN,
                                "%s %s", user, host);
 
-       if(remove_temp_kline(user, host))
+       aconf = find_exact_conf_by_address(host, CONF_KILL, user);
+       if(aconf == NULL)
+       {
+               sendto_one_notice(source_p, ":No K-Line for %s@%s", user, host);
+               return 0;
+       }
+
+       if(remove_temp_kline(aconf))
        {
                sendto_one_notice(source_p, ":Un-klined [%s@%s] from temporary k-lines", user, host);
                sendto_realops_snomask(SNO_GENERAL, L_ALL,
@@ -422,7 +431,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
                return 0;
        }
 
-       remove_permkline_match(source_p, host, user);
+       remove_permkline_match(source_p, aconf);
 
        return 0;
 }
@@ -465,11 +474,20 @@ me_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
 static void
 handle_remote_unkline(struct Client *source_p, const char *user, const char *host)
 {
+       struct ConfItem *aconf;
+
        if(!find_shared_conf(source_p->username, source_p->host,
-                               source_p->user->server, SHARED_UNKLINE))
+                               source_p->servptr->name, SHARED_UNKLINE))
                return;
 
-       if(remove_temp_kline(user, host))
+       aconf = find_exact_conf_by_address(host, CONF_KILL, user);
+       if(aconf == NULL)
+       {
+               sendto_one_notice(source_p, ":No K-Line for %s@%s", user, host);
+               return;
+       }
+
+       if(remove_temp_kline(aconf))
        {
                sendto_one_notice(source_p,
                                ":Un-klined [%s@%s] from temporary k-lines",
@@ -484,7 +502,7 @@ handle_remote_unkline(struct Client *source_p, const char *user, const char *hos
                return;
        }
 
-       remove_permkline_match(source_p, host, user);
+       remove_permkline_match(source_p, aconf);
 }
 
 /* apply_kline()
@@ -614,6 +632,11 @@ valid_wild_card(struct Client *source_p, const char *luser, const char *lhost)
        const char *p;
        char tmpch;
        int nonwild = 0;
+       int bitlen;
+
+       /* user has no wildcards, always accept -- jilles */
+       if (!strchr(luser, '?') && !strchr(luser, '*'))
+               return 1;
 
        /* check there are enough non wildcard chars */
        p = luser;
@@ -628,12 +651,23 @@ valid_wild_card(struct Client *source_p, const char *luser, const char *lhost)
        }
 
        /* try host, as user didnt contain enough */
-       p = lhost;
-       while ((tmpch = *p++))
+       /* special case for cidr masks -- jilles */
+       if ((p = strrchr(lhost, '/')) != NULL && IsDigit(p[1]))
        {
-               if(!IsKWildChar(tmpch))
-                       if(++nonwild >= ConfigFileEntry.min_nonwildcard)
-                               return 1;
+               bitlen = atoi(p + 1);
+               /* much like non-cidr for ipv6, rather arbitrary for ipv4 */
+               if (bitlen > 0 && bitlen >= (strchr(lhost, ':') ? 4 * (ConfigFileEntry.min_nonwildcard - nonwild) : 6 - 2 * nonwild))
+                       return 1;
+       }
+       else
+       {
+               p = lhost;
+               while ((tmpch = *p++))
+               {
+                       if(!IsKWildChar(tmpch))
+                               if(++nonwild >= ConfigFileEntry.min_nonwildcard)
+                                       return 1;
+               }
        }
 
        sendto_one_notice(source_p,
@@ -723,7 +757,7 @@ already_placed_kline(struct Client *source_p, const char *luser, const char *lho
  * hunts for a permanent kline, and removes it.
  */
 static void
-remove_permkline_match(struct Client *source_p, const char *host, const char *user)
+remove_permkline_match(struct Client *source_p, struct ConfItem *aconf)
 {
        FILE *in, *out;
        int pairme = 0;
@@ -732,9 +766,13 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
        char matchbuf[BUFSIZE];
        char temppath[BUFSIZE];
        const char *filename;
+       const char *host, *user;
        mode_t oldumask;
        int matchlen;
 
+       host = aconf->host;
+       user = aconf->user;
+
        ircsnprintf(temppath, sizeof(temppath),
                 "%s.tmp", ConfigFileEntry.klinefile);
 
@@ -804,7 +842,7 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
        }
        else if(!pairme)
        {
-               sendto_one_notice(source_p, ":No K-Line for %s@%s",
+               sendto_one_notice(source_p, ":Cannot find K-Line for %s@%s in file",
                                  user, host);
 
                if(temppath != NULL)
@@ -818,7 +856,6 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
                sendto_one_notice(source_p, ":Couldn't rename temp file, aborted");
                return;
        }
-       rehash_bans(0);
 
        sendto_one_notice(source_p, ":K-Line for [%s@%s] is removed",
                          user, host);
@@ -829,6 +866,10 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
 
        ilog(L_KLINE, "UK %s %s %s",
                get_oper_name(source_p), user, host);
+
+       remove_reject_mask(aconf->user, aconf->host);
+       delete_one_address_conf(aconf->host, aconf);
+
        return;
 }
 
@@ -874,41 +915,22 @@ flush_write(struct Client *source_p, FILE * out, const char *buf, const char *te
  * side effects - tries to unkline anything that matches
  */
 static int
-remove_temp_kline(const char *user, const char *host)
+remove_temp_kline(struct ConfItem *aconf)
 {
-       struct ConfItem *aconf;
        dlink_node *ptr;
-       struct irc_sockaddr_storage addr, caddr;
-       int bits, cbits;
-       int mtype, ktype;
        int i;
 
-       mtype = parse_netmask(host, (struct sockaddr *)&addr, &bits);
-
        for (i = 0; i < LAST_TEMP_TYPE; i++)
        {
                DLINK_FOREACH(ptr, temp_klines[i].head)
                {
-                       aconf = ptr->data;
-
-                       ktype = parse_netmask(aconf->host, (struct sockaddr *)&caddr, &cbits);
-
-                       if(ktype != mtype || (user && irccmp(user, aconf->user)))
-                               continue;
-
-                       if(ktype == HM_HOST)
+                       if (aconf == ptr->data)
                        {
-                               if(irccmp(aconf->host, host))
-                                       continue;
+                               dlinkDestroy(ptr, &temp_klines[i]);
+                               remove_reject_mask(aconf->user, aconf->host);
+                               delete_one_address_conf(aconf->host, aconf);
+                               return YES;
                        }
-                       else if(bits != cbits || 
-                               !comp_with_mask_sock((struct sockaddr *)&addr,
-                                               (struct sockaddr *)&caddr, bits))
-                               continue;
-
-                       dlinkDestroy(ptr, &temp_klines[i]);
-                       delete_one_address_conf(aconf->host, aconf);
-                       return YES;
                }
        }