Merge branch 'edk0-check-one-kline'

This commit is contained in:
Simon Arlott 2019-08-31 15:05:29 +01:00
commit c6e707ae76
No known key found for this signature in database
GPG key ID: 49BFFEEFD4C3ED53
11 changed files with 84 additions and 82 deletions

View file

@ -579,7 +579,6 @@ general {
resv_fnc = yes; resv_fnc = yes;
global_snotices = yes; global_snotices = yes;
dline_with_reason = yes; dline_with_reason = yes;
kline_delay = 0 seconds;
kline_with_reason = yes; kline_with_reason = yes;
kline_reason = "K-Lined"; kline_reason = "K-Lined";
identify_service = "NickServ@services.int"; identify_service = "NickServ@services.int";

View file

@ -1173,12 +1173,6 @@ general {
*/ */
dline_with_reason = yes; dline_with_reason = yes;
/* kline delay: delay the checking of klines until a specified time.
* Useful if large kline lists are applied often to prevent the
* server eating CPU.
*/
kline_delay = 0 seconds;
/* kline reason: show the user the reason why they are k/dlined /* kline reason: show the user the reason why they are k/dlined
* on exit. may give away who set k/dline when set via tcm. * on exit. may give away who set k/dline when set via tcm.
*/ */

View file

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

View file

@ -178,7 +178,6 @@ struct config_file_entry
int ts_warn_delta; int ts_warn_delta;
int dline_with_reason; int dline_with_reason;
int kline_with_reason; int kline_with_reason;
int kline_delay;
int warn_no_nline; int warn_no_nline;
int nick_delay; int nick_delay;
int non_redundant_klines; int non_redundant_klines;

View file

@ -80,12 +80,6 @@ static uint32_t current_connid = 0;
rb_dictionary *nd_dict = NULL; rb_dictionary *nd_dict = NULL;
enum
{
D_LINED,
K_LINED
};
rb_dlink_list dead_list; rb_dlink_list dead_list;
#ifdef DEBUG_EXITED_CLIENTS #ifdef DEBUG_EXITED_CLIENTS
static rb_dlink_list dead_remote_list; 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) notify_banned_client(struct Client *client_p, struct ConfItem *aconf, int ban)
{ {
static const char conn_closed[] = "Connection closed"; static const char conn_closed[] = "Connection closed";
@ -532,19 +526,6 @@ check_banned_lines(void)
check_xlines(); check_xlines();
} }
/* check_klines_event()
*
* inputs -
* outputs -
* side effects - check_klines() is called, kline_queued unset
*/
void
check_klines_event(void *unused)
{
kline_queued = false;
check_klines();
}
/* check_klines /* check_klines
* *
* inputs - * inputs -
@ -587,6 +568,74 @@ check_klines(void)
} }
} }
/* check_one_kline()
*
* This process needs to be kept in sync with find_kline() aka find_conf_by_address().
*
* 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() /* check_dlines()
* *
* inputs - * inputs -

View file

@ -198,6 +198,9 @@ get_mask_hash(const char *text)
/* struct ConfItem* find_conf_by_address(const char*, struct rb_sockaddr_storage*, /* struct ConfItem* find_conf_by_address(const char*, struct rb_sockaddr_storage*,
* int type, int fam, const char *username) * int type, int fam, const char *username)
*
* This process needs to be kept in sync with check_one_kline().
*
* Input: The hostname, the address, the type of mask to find, the address * Input: The hostname, the address, the type of mask to find, the address
* family, the username. * family, the username.
* Output: The matching value with the highest precedence. * Output: The matching value with the highest precedence.

View file

@ -1616,15 +1616,6 @@ conf_set_general_hide_error_messages(void *data)
conf_report_error("Invalid setting '%s' for general::hide_error_messages.", val); conf_report_error("Invalid setting '%s' for general::hide_error_messages.", val);
} }
static void
conf_set_general_kline_delay(void *data)
{
ConfigFileEntry.kline_delay = *(unsigned int *) data;
/* THIS MUST BE HERE to stop us being unable to check klines */
kline_queued = false;
}
static void static void
conf_set_general_stats_k_oper_only(void *data) conf_set_general_stats_k_oper_only(void *data)
{ {
@ -2732,7 +2723,6 @@ static struct ConfEntry conf_general_table[] =
{ "compression_level", CF_INT, conf_set_general_compression_level, 0, NULL }, { "compression_level", CF_INT, conf_set_general_compression_level, 0, NULL },
{ "havent_read_conf", CF_YESNO, conf_set_general_havent_read_conf, 0, NULL }, { "havent_read_conf", CF_YESNO, conf_set_general_havent_read_conf, 0, NULL },
{ "hide_error_messages",CF_STRING, conf_set_general_hide_error_messages,0, NULL }, { "hide_error_messages",CF_STRING, conf_set_general_hide_error_messages,0, NULL },
{ "kline_delay", CF_TIME, conf_set_general_kline_delay, 0, NULL },
{ "stats_k_oper_only", CF_STRING, conf_set_general_stats_k_oper_only, 0, NULL }, { "stats_k_oper_only", CF_STRING, conf_set_general_stats_k_oper_only, 0, NULL },
{ "stats_i_oper_only", CF_STRING, conf_set_general_stats_i_oper_only, 0, NULL }, { "stats_i_oper_only", CF_STRING, conf_set_general_stats_i_oper_only, 0, NULL },
{ "default_umodes", CF_QSTRING, conf_set_general_default_umodes, 0, NULL }, { "default_umodes", CF_QSTRING, conf_set_general_default_umodes, 0, NULL },

View file

@ -707,7 +707,6 @@ set_default_conf(void)
ConfigFileEntry.client_exit = true; ConfigFileEntry.client_exit = true;
ConfigFileEntry.dline_with_reason = true; ConfigFileEntry.dline_with_reason = true;
ConfigFileEntry.kline_with_reason = true; ConfigFileEntry.kline_with_reason = true;
ConfigFileEntry.kline_delay = 0;
ConfigFileEntry.warn_no_nline = true; ConfigFileEntry.warn_no_nline = true;
ConfigFileEntry.non_redundant_klines = true; ConfigFileEntry.non_redundant_klines = true;
ConfigFileEntry.stats_e_disabled = false; ConfigFileEntry.stats_e_disabled = false;

View file

@ -286,20 +286,7 @@ ms_ban(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
else else
{ {
add_conf_by_address(aconf->host, CONF_KILL, aconf->user, NULL, aconf); add_conf_by_address(aconf->host, CONF_KILL, aconf->user, NULL, aconf);
if(ConfigFileEntry.kline_delay || check_one_kline(aconf);
(IsServer(source_p) &&
!HasSentEob(source_p)))
{
if(kline_queued == 0)
{
rb_event_addonce("check_klines", check_klines_event, NULL,
ConfigFileEntry.kline_delay ?
ConfigFileEntry.kline_delay : 1);
kline_queued = 1;
}
}
else
check_klines();
} }
break; break;
case CONF_XLINE: case CONF_XLINE:

View file

@ -284,12 +284,6 @@ static struct InfoStruct info_table[] = {
&ConfigFileEntry.hide_spoof_ips, &ConfigFileEntry.hide_spoof_ips,
"Hide IPs of spoofed users" "Hide IPs of spoofed users"
}, },
{
"kline_delay",
OUTPUT_DECIMAL,
&ConfigFileEntry.kline_delay,
"Duration of time to delay kline checking"
},
{ {
"kline_reason", "kline_reason",
OUTPUT_STRING, OUTPUT_STRING,

View file

@ -85,6 +85,7 @@ static void remove_permkline_match(struct Client *, struct ConfItem *);
static bool remove_temp_kline(struct Client *, struct ConfItem *); static bool remove_temp_kline(struct Client *, struct ConfItem *);
static void remove_prop_kline(struct Client *, struct ConfItem *); static void remove_prop_kline(struct Client *, struct ConfItem *);
/* mo_kline() /* mo_kline()
* *
* parv[1] - temp time or user@host * parv[1] - temp time or user@host
@ -215,17 +216,7 @@ mo_kline(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
else else
apply_kline(source_p, aconf, reason, oper_reason); apply_kline(source_p, aconf, reason, oper_reason);
if(ConfigFileEntry.kline_delay) check_one_kline(aconf);
{
if(!kline_queued)
{
rb_event_addonce("check_klines", check_klines_event, NULL,
ConfigFileEntry.kline_delay);
kline_queued = true;
}
}
else
check_klines();
} }
/* ms_kline() /* ms_kline()
@ -325,17 +316,7 @@ handle_remote_kline(struct Client *source_p, int tkline_time,
else else
apply_kline(source_p, aconf, reason, oper_reason); apply_kline(source_p, aconf, reason, oper_reason);
if(ConfigFileEntry.kline_delay) check_one_kline(aconf);
{
if(!kline_queued)
{
rb_event_addonce("check_klines", check_klines_event, NULL,
ConfigFileEntry.kline_delay);
kline_queued = true;
}
}
else
check_klines();
} }
/* mo_unkline() /* mo_unkline()