if (memcmp(addr, dest, mask / 8) == 0)
{
int n = mask / 8;
- int m = ((-1) << (8 - (mask % 8)));
+ unsigned char m = (0xFF << (8 - (mask % 8)));
if (mask % 8 == 0 || (((unsigned char *) addr)[n] & m) == (((unsigned char *) dest)[n] & m))
{
return (1);
iaddr = &((struct sockaddr_in *)(void *)addr)->sin_addr;
idest = &((struct sockaddr_in *)(void *)dest)->sin_addr;
}
-#ifdef RB_IPV6
else
{
iaddr = &((struct sockaddr_in6 *)(void *)addr)->sin6_addr;
idest = &((struct sockaddr_in6 *)(void *)dest)->sin6_addr;
}
-#endif
return (comp_with_mask(iaddr, idest, mask));
}
if (cidrlen <= 0)
return 0;
-#ifdef RB_IPV6
if (strchr(mask, ':') && strchr(address, ':'))
{
if (cidrlen > 128)
ipptr = &((struct sockaddr_in6 *)&ipaddr)->sin6_addr;
maskptr = &((struct sockaddr_in6 *)&maskaddr)->sin6_addr;
}
- else
-#endif
- if (!strchr(mask, ':') && !strchr(address, ':'))
+ else if (!strchr(mask, ':') && !strchr(address, ':'))
{
if (cidrlen > 32)
return 0;
if (cidrlen <= 0)
return 0;
-#ifdef RB_IPV6
if (strchr(ip, ':') && strchr(ipmask, ':'))
{
if (cidrlen > 128)
ipptr = &((struct sockaddr_in6 *)&ipaddr)->sin6_addr;
maskptr = &((struct sockaddr_in6 *)&maskaddr)->sin6_addr;
}
- else
-#endif
- if (!strchr(ip, ':') && !strchr(ipmask, ':'))
+ else if (!strchr(ip, ':') && !strchr(ipmask, ':'))
{
if (cidrlen > 32)
return 0;
return (res);
}
+void matchset_for_client(struct Client *who, struct matchset *m)
+{
+ unsigned hostn = 0;
+ unsigned ipn = 0;
+
+ struct sockaddr_in ip4;
+
+ sprintf(m->host[hostn++], "%s!%s@%s", who->name, who->username, who->host);
+
+ if (!IsIPSpoof(who))
+ {
+ sprintf(m->ip[ipn++], "%s!%s@%s", who->name, who->username, who->sockhost);
+ }
+
+ if (who->localClient->mangledhost != NULL)
+ {
+ /* if host mangling mode enabled, also check their real host */
+ if (!strcmp(who->host, who->localClient->mangledhost))
+ {
+ sprintf(m->host[hostn++], "%s!%s@%s", who->name, who->username, who->orighost);
+ }
+ /* if host mangling mode not enabled and no other spoof,
+ * also check the mangled form of their host */
+ else if (!IsDynSpoof(who))
+ {
+ sprintf(m->host[hostn++], "%s!%s@%s", who->name, who->username, who->localClient->mangledhost);
+ }
+ }
+ if (!IsIPSpoof(who) && GET_SS_FAMILY(&who->localClient->ip) == AF_INET6 &&
+ rb_ipv4_from_ipv6((const struct sockaddr_in6 *)&who->localClient->ip, &ip4))
+ {
+ int n = sprintf(m->ip[ipn++], "%s!%s@", who->name, who->username);
+ rb_inet_ntop_sock((struct sockaddr *)&ip4,
+ m->ip[ipn] + n, sizeof m->ip[ipn] - n);
+ }
+
+ for (int i = hostn; i < ARRAY_SIZE(m->host); i++)
+ {
+ m->host[i][0] = '\0';
+ }
+ for (int i = ipn; i < ARRAY_SIZE(m->ip); i++)
+ {
+ m->ip[i][0] = '\0';
+ }
+}
+
+bool client_matches_mask(struct Client *who, const char *mask)
+{
+ static struct matchset ms;
+ matchset_for_client(who, &ms);
+ return matches_mask(&ms, mask);
+}
+
+bool matches_mask(const struct matchset *m, const char *mask)
+{
+ for (int i = 0; i < ARRAY_SIZE(m->host); i++)
+ {
+ if (m->host[i][0] == '\0')
+ break;
+ if (match(mask, m->host[i]))
+ return true;
+ }
+ for (int i = 0; i < ARRAY_SIZE(m->ip); i++)
+ {
+ if (m->ip[i][0] == '\0')
+ break;
+ if (match(mask, m->ip[i]))
+ return true;
+ if (match_cidr(mask, m->ip[i]))
+ return true;
+ }
+ return false;
+}
+
const unsigned char irctolower_tab[] = {
0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
* NOTE: RFC 1459 sez: anything but a ^G, comma, or space is allowed
* for channel names
*/
-const unsigned int CharAttrs[] = {
+unsigned int CharAttrs[] = {
/* 0 */ CNTRL_C,
/* 1 */ CNTRL_C | CHAN_C | NONEOS_C,
/* 2 */ CNTRL_C | CHAN_C | FCHAN_C | NONEOS_C,