]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/hostmask.c
dlink -> rb_dlink
[irc/rqf/shadowircd.git] / src / hostmask.c
index 334be5856e56dd777a4422235d57ff4b1e0af1f4..9340d7e578cfd9afcf48f3e36e18d1edeb50d966 100644 (file)
@@ -5,7 +5,7 @@
  *  Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
  *  Copyright (C) 1996-2002 Hybrid Development Team
  *  Copyright (C) 2002-2005 ircd-ratbox development team
- *  Copyright (C) 2005-2006 charybdis development team
+ *  Copyright (C) 2005-2008 charybdis development team
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -432,6 +432,62 @@ find_dline(struct sockaddr *addr, int aftype)
        return find_conf_by_address(NULL, NULL, NULL, addr, CONF_DLINE | 1, aftype, NULL);
 }
 
+/* void find_exact_conf_by_address(const char*, int, const char *)
+ * Input: 
+ * Output: ConfItem if found
+ * Side-effects: None
+ */
+struct ConfItem *
+find_exact_conf_by_address(const char *address, int type, const char *username)
+{
+       int masktype, bits;
+       unsigned long hv;
+       struct AddressRec *arec;
+       struct irc_sockaddr_storage addr;
+
+       if(address == NULL)
+               address = "/NOMATCH!/";
+       arec = MyMalloc(sizeof(struct AddressRec));
+       masktype = parse_netmask(address, (struct sockaddr *)&addr, &bits);
+#ifdef IPV6
+       if(masktype == HM_IPV6)
+       {
+               /* We have to do this, since we do not re-hash for every bit -A1kmm. */
+               hv = hash_ipv6((struct sockaddr *)&addr, bits - bits % 16);
+       }
+       else
+#endif
+       if(masktype == HM_IPV4)
+       {
+               /* We have to do this, since we do not re-hash for every bit -A1kmm. */
+               hv = hash_ipv4((struct sockaddr *)&addr, bits - bits % 8);
+       }
+       else
+       {
+               hv = get_mask_hash(address);
+       }
+       for (arec = atable[hv]; arec; arec = arec->next)
+       {
+               if (arec->type == type &&
+                               arec->masktype == masktype &&
+                               (arec->username == NULL || username == NULL ? arec->username == username : !irccmp(arec->username, username)))
+               {
+                       if (masktype == HM_HOST)
+                       {
+                               if (!irccmp(arec->Mask.hostname, address))
+                                       return arec->aconf;
+                       }
+                       else
+                       {
+                               if (arec->Mask.ipa.bits == bits &&
+                                       comp_with_mask_sock((struct sockaddr *)&arec->Mask.ipa.addr, (struct sockaddr *)&addr, bits))
+                                       return arec->aconf;
+                       }
+               }
+       }
+       return NULL;
+}
+
 /* void add_conf_by_address(const char*, int, const char *,
  *         struct ConfItem *aconf)
  * Input: 
@@ -622,22 +678,20 @@ show_iline_prefix(struct Client *sptr, struct ConfItem *aconf, char *name)
        prefix_ptr = prefix_of_host;
        if(IsNoTilde(aconf))
                *prefix_ptr++ = '-';
-       if(IsLimitIp(aconf))
-               *prefix_ptr++ = '!';
        if(IsNeedIdentd(aconf))
                *prefix_ptr++ = '+';
-       if(IsPassIdentd(aconf))
-               *prefix_ptr++ = '$';
-       if(IsNoMatchIp(aconf))
-               *prefix_ptr++ = '%';
        if(IsConfDoSpoofIp(aconf))
                *prefix_ptr++ = '=';
-       if(MyOper(sptr) && IsConfExemptKline(aconf))
+       if(IsOper(sptr) && IsConfExemptFlood(aconf))
+               *prefix_ptr++ = '|';
+       if(IsOper(sptr) && IsConfExemptGline(aconf) && !IsConfExemptKline(aconf))
+               *prefix_ptr++ = '_';
+       if(IsOper(sptr) && IsConfExemptDNSBL(aconf) && !IsConfExemptKline(aconf))
+               *prefix_ptr++ = '$';
+       if(IsOper(sptr) && IsConfExemptKline(aconf))
                *prefix_ptr++ = '^';
-       if(MyOper(sptr) && IsConfExemptLimits(aconf))
+       if(IsOper(sptr) && IsConfExemptLimits(aconf))
                *prefix_ptr++ = '>';
-       if(MyOper(sptr) && IsConfIdlelined(aconf))
-               *prefix_ptr++ = '<';
        *prefix_ptr = '\0';
        strncpy(prefix_ptr, name, USERLEN);
        return (prefix_of_host);
@@ -663,7 +717,7 @@ report_auth(struct Client *client_p)
                        {
                                aconf = arec->aconf;
 
-                               if(!MyOper(client_p) && IsConfDoSpoofIp(aconf))
+                               if(!IsOper(client_p) && IsConfDoSpoofIp(aconf))
                                        continue;
 
                                get_printable_conf(aconf, &name, &host, &pass, &user, &port,