mirror of
https://github.com/matrix-construct/construct
synced 2024-11-29 10:12:39 +01:00
extban: implement helper functions for stackable extbans (part 1) (ref #74)
This commit is contained in:
parent
202d496644
commit
304bd0d095
3 changed files with 53 additions and 2 deletions
|
@ -88,5 +88,12 @@ The function is called whenever a (local) client needs to be checked against
|
||||||
a +bqeI entry of the given extban type, and whenever a local client tries to
|
a +bqeI entry of the given extban type, and whenever a local client tries to
|
||||||
add such an entry. (Clients are allowed to add bans matching themselves.)
|
add such an entry. (Clients are allowed to add bans matching themselves.)
|
||||||
|
|
||||||
--
|
There is a convenience function which allows extbans to be stacked:
|
||||||
$Id: extban.txt 1639 2006-06-04 23:26:47Z jilles $
|
extern int match_child(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
|
||||||
|
|
||||||
|
The arguments are as follows:
|
||||||
|
banstr: the text after the parent banstr (extb functions already get the mask this way)
|
||||||
|
client_p: the client to check; this is always a local client, which may be
|
||||||
|
on or off channel
|
||||||
|
chptr: the channel
|
||||||
|
mode_type: CHFL_BAN, CHFL_QUIET, CHFL_EXCEPTION or CHFL_INVEX
|
||||||
|
|
|
@ -266,6 +266,7 @@ extern struct Ban * del_id(struct Channel *chptr, const char *banid, rb_dlink_li
|
||||||
|
|
||||||
extern ExtbanFunc extban_table[256];
|
extern ExtbanFunc extban_table[256];
|
||||||
|
|
||||||
|
extern int match_child(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
|
||||||
extern int match_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
|
extern int match_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
|
||||||
extern int valid_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
|
extern int valid_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
|
||||||
const char * get_extban_string(void);
|
const char * get_extban_string(void);
|
||||||
|
|
43
src/extban.c
43
src/extban.c
|
@ -26,9 +26,52 @@
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "ipv4_from_ipv6.h"
|
||||||
|
|
||||||
ExtbanFunc extban_table[256] = { NULL };
|
ExtbanFunc extban_table[256] = { NULL };
|
||||||
|
|
||||||
|
int
|
||||||
|
match_child(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type)
|
||||||
|
{
|
||||||
|
char src_host[NICKLEN + USERLEN + HOSTLEN + 6];
|
||||||
|
char src_iphost[NICKLEN + USERLEN + HOSTLEN + 6];
|
||||||
|
char src_althost[NICKLEN + USERLEN + HOSTLEN + 6];
|
||||||
|
char src_ip4host[NICKLEN + USERLEN + HOSTLEN + 6];
|
||||||
|
struct sockaddr_in ip4;
|
||||||
|
char *s = src_host, *s2 = src_iphost, *s3 = NULL, *s4 = NULL;
|
||||||
|
|
||||||
|
if (*banstr == '$')
|
||||||
|
return match_extban(banstr, client_p, chptr, mode_type) ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
||||||
|
|
||||||
|
rb_sprintf(src_host, "%s!%s@%s", client_p->name, client_p->username, client_p->host);
|
||||||
|
rb_sprintf(src_iphost, "%s!%s@%s", client_p->name, client_p->username, client_p->sockhost);
|
||||||
|
|
||||||
|
/* handle hostmangling if necessary */
|
||||||
|
if (client_p->localClient->mangledhost != NULL)
|
||||||
|
{
|
||||||
|
if (!strcmp(client_p->host, client_p->localClient->mangledhost))
|
||||||
|
rb_sprintf(src_althost, "%s!%s@%s", client_p->name, client_p->username, client_p->orighost);
|
||||||
|
else if (!IsDynSpoof(client_p))
|
||||||
|
rb_sprintf(src_althost, "%s!%s@%s", client_p->name, client_p->username, client_p->localClient->mangledhost);
|
||||||
|
|
||||||
|
s3 = src_althost;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RB_IPV6
|
||||||
|
/* handle Teredo if necessary */
|
||||||
|
if (client_p->localClient->ip.ss_family == AF_INET6 && ipv4_from_ipv6((const struct sockaddr_in6 *) &client_p->localClient->ip, &ip4))
|
||||||
|
{
|
||||||
|
rb_sprintf(src_ip4host, "%s!%s@", client_p->name, client_p->username);
|
||||||
|
s4 = src_ip4host + strlen(src_ip4host);
|
||||||
|
rb_inet_ntop_sock((struct sockaddr *)&ip4,
|
||||||
|
s4, src_ip4host + sizeof src_ip4host - s4);
|
||||||
|
s4 = src_ip4host;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return match(banstr, s) || match(banstr, s2) || (s3 != NULL && match(banstr, s3)) || (s4 != NULL && match(banstr, s4)) ? EXTBAN_MATCH : EXTBAN_NOMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
match_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type)
|
match_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue