]>
jfr.im git - solanum.git/blob - extensions/extb_hostmask.c
2 * Hostmask extban type: bans all users matching a given hostmask, used for stacked extbans
10 #include "ipv4_from_ipv6.h"
12 static int _modinit(void);
13 static void _moddeinit(void);
14 static int eb_hostmask(const char *data
, struct Client
*client_p
, struct Channel
*chptr
, long mode_type
);
16 DECLARE_MODULE_AV1(extb_hostmask
, _modinit
, _moddeinit
, NULL
, NULL
, NULL
, "$Revision: 1299 $");
21 extban_table
['m'] = eb_hostmask
;
28 extban_table
['m'] = NULL
;
32 eb_hostmask(const char *banstr
, struct Client
*client_p
, struct Channel
*chptr
, long mode_type
)
34 char src_host
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
35 char src_iphost
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
36 char src_althost
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
37 char src_ip4host
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
38 struct sockaddr_in ip4
;
39 char *s
= src_host
, *s2
= src_iphost
, *s3
= NULL
, *s4
= NULL
;
41 rb_sprintf(src_host
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->host
);
42 rb_sprintf(src_iphost
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->sockhost
);
44 /* handle hostmangling if necessary */
45 if (client_p
->localClient
->mangledhost
!= NULL
)
47 if (!strcmp(client_p
->host
, client_p
->localClient
->mangledhost
))
48 rb_sprintf(src_althost
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->orighost
);
49 else if (!IsDynSpoof(client_p
))
50 rb_sprintf(src_althost
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->localClient
->mangledhost
);
56 /* handle Teredo if necessary */
57 if (client_p
->localClient
->ip
.ss_family
== AF_INET6
&& ipv4_from_ipv6((const struct sockaddr_in6
*) &client_p
->localClient
->ip
, &ip4
))
59 rb_sprintf(src_ip4host
, "%s!%s@", client_p
->name
, client_p
->username
);
60 s4
= src_ip4host
+ strlen(src_ip4host
);
61 rb_inet_ntop_sock((struct sockaddr
*)&ip4
,
62 s4
, src_ip4host
+ sizeof src_ip4host
- s4
);
67 return match(banstr
, s
) || match(banstr
, s2
) || (s3
!= NULL
&& match(banstr
, s3
)) || (s4
!= NULL
&& match(banstr
, s4
)) ? EXTBAN_MATCH
: EXTBAN_NOMATCH
;