Add check_one_kline, expose notify_banned_client

This commit is contained in:
Ed Kellett 2017-11-25 22:17:50 +00:00
parent c87c8e5bfe
commit 10df26d08f
No known key found for this signature in database
GPG key ID: CB9986DEF342FABC
2 changed files with 75 additions and 7 deletions

View file

@ -578,9 +578,16 @@ struct ListClient
#define SHOW_IP 1
#define MASK_IP 2
enum
{
D_LINED,
K_LINED
};
extern void check_banned_lines(void);
extern void check_klines_event(void *unused);
extern void check_klines(void);
extern void check_one_kline(struct ConfItem *kline);
extern void check_dlines(void);
extern void check_xlines(void);
extern void resv_nick_fnc(const char *mask, const char *reason, int temp_time);
@ -592,6 +599,7 @@ extern void init_client(void);
extern struct Client *make_client(struct Client *from);
extern void free_pre_client(struct Client *client);
extern void notify_banned_client(struct Client *, struct ConfItem *, int ban);
extern int exit_client(struct Client *, struct Client *, struct Client *, const char *);
extern void error_exit_client(struct Client *, int);

View file

@ -80,12 +80,6 @@ static uint32_t current_connid = 0;
rb_dictionary *nd_dict = NULL;
enum
{
D_LINED,
K_LINED
};
rb_dlink_list dead_list;
#ifdef DEBUG_EXITED_CLIENTS
static rb_dlink_list dead_remote_list;
@ -487,7 +481,7 @@ check_unknowns_list(rb_dlink_list * list)
}
}
static void
void
notify_banned_client(struct Client *client_p, struct ConfItem *aconf, int ban)
{
static const char conn_closed[] = "Connection closed";
@ -587,6 +581,72 @@ check_klines(void)
}
}
/* check_one_kline()
*
* inputs - pointer to kline to check
* outputs -
* side effects - all clients will be checked against given kline
*/
void
check_one_kline(struct ConfItem *kline)
{
struct Client *client_p;
rb_dlink_node *ptr;
rb_dlink_node *next_ptr;
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, lclient_list.head)
{
client_p = ptr->data;
if(IsMe(client_p) || !IsPerson(client_p))
continue;
if(!match(kline->user, client_p->username))
continue;
/* match one kline */
{
int matched = 0;
int masktype;
int bits;
struct rb_sockaddr_storage sockaddr;
masktype = parse_netmask(kline->host, (struct sockaddr *)&sockaddr, &bits);
switch (masktype) {
case HM_IPV4:
case HM_IPV6:
if(comp_with_mask_sock((struct sockaddr *)&client_p->localClient->ip,
(struct sockaddr *)&sockaddr, bits))
matched = 1;
case HM_HOST:
if (match(kline->host, client_p->orighost))
matched = 1;
}
if (!matched)
continue;
}
if(IsExemptKline(client_p))
{
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"KLINE over-ruled for %s, client is kline_exempt [%s@%s]",
get_client_name(client_p, HIDE_IP),
kline->user, kline->host);
continue;
}
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"KLINE active for %s",
get_client_name(client_p, HIDE_IP));
notify_banned_client(client_p, kline, K_LINED);
}
}
/* check_dlines()
*
* inputs -