]>
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 const char extb_desc
[] = "Hostmask ($m) extban type";
14 static int _modinit(void);
15 static void _moddeinit(void);
16 static int eb_hostmask(const char *data
, struct Client
*client_p
, struct Channel
*chptr
, long mode_type
);
18 DECLARE_MODULE_AV2(extb_hostmask
, _modinit
, _moddeinit
, NULL
, NULL
, NULL
, NULL
, NULL
, extb_desc
);
23 extban_table
['m'] = eb_hostmask
;
30 extban_table
['m'] = NULL
;
34 eb_hostmask(const char *banstr
, struct Client
*client_p
, struct Channel
*chptr
, long mode_type
)
36 char src_host
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
37 char src_iphost
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
38 char src_althost
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
39 char src_ip4host
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
40 struct sockaddr_in ip4
;
41 char *s
= src_host
, *s2
= src_iphost
, *s3
= NULL
, *s4
= NULL
;
43 sprintf(src_host
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->host
);
44 sprintf(src_iphost
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->sockhost
);
46 /* handle hostmangling if necessary */
47 if (client_p
->localClient
->mangledhost
!= NULL
)
49 if (!strcmp(client_p
->host
, client_p
->localClient
->mangledhost
))
50 sprintf(src_althost
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->orighost
);
51 else if (!IsDynSpoof(client_p
))
52 sprintf(src_althost
, "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->localClient
->mangledhost
);
58 /* handle Teredo if necessary */
59 if (GET_SS_FAMILY(&client_p
->localClient
->ip
) == AF_INET6
&& ipv4_from_ipv6((const struct sockaddr_in6
*) &client_p
->localClient
->ip
, &ip4
))
61 sprintf(src_ip4host
, "%s!%s@", client_p
->name
, client_p
->username
);
62 s4
= src_ip4host
+ strlen(src_ip4host
);
63 rb_inet_ntop_sock((struct sockaddr
*)&ip4
,
64 s4
, src_ip4host
+ sizeof src_ip4host
- s4
);
69 return match(banstr
, s
) || match(banstr
, s2
) || (s3
!= NULL
&& match(banstr
, s3
)) || (s4
!= NULL
&& match(banstr
, s4
)) ? EXTBAN_MATCH
: EXTBAN_NOMATCH
;