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