1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-05 07:13:14 +02:00

Add deny link::reason (optional) and display it in oper warnings

and to the other side of the link.
This commit is contained in:
Bram Matthys
2023-03-20 09:17:52 +01:00
parent a1e7e9f882
commit a7c9ecb4e7
3 changed files with 26 additions and 10 deletions
+3 -2
View File
@@ -63,6 +63,7 @@ CMD_FUNC(cmd_connect)
int retval;
ConfigItem_link *aconf;
Client *server;
const char *str;
if (!IsServer(client) && MyConnect(client) && !ValidatePermissionsForPath("route:global",client,NULL,NULL,NULL) && parc > 3)
{ /* Only allow LocOps to make */
@@ -108,9 +109,9 @@ CMD_FUNC(cmd_connect)
return;
}
if (check_deny_link(aconf, 0))
if ((str = check_deny_link(aconf, 0)))
{
sendnotice(client, "*** Connect: Disallowed by connection rule");
sendnotice(client, "*** Connect: Disallowed by connection rule: %s", str);
return;
}
+3 -2
View File
@@ -234,6 +234,7 @@ RPC_CALL_FUNC(rpc_server_connect)
const char *server, *link_name;
Client *acptr;
ConfigItem_link *link;
const char *err;
OPTIONAL_PARAM_STRING("server", server);
if (server)
@@ -275,9 +276,9 @@ RPC_CALL_FUNC(rpc_server_connect)
return;
}
if (check_deny_link(link, 0))
if ((err = check_deny_link(link, 0)))
{
rpc_error(client, request, JSON_RPC_ERROR_DENIED, "Server linking is denied via a deny link { } block");
rpc_error_fmt(client, request, JSON_RPC_ERROR_DENIED, "Server linking is denied via a deny link { } block: %s", err);
return;
}
+20 -6
View File
@@ -43,6 +43,7 @@ struct ConfigItem_deny_link {
ConfigItem_mask *mask;
CRuleNode *rule; /**< parsed crule */
char *prettyrule; /**< human printable version */
char *reason; /**< Reason for the deny link */
};
/* Forward declarations */
@@ -179,9 +180,10 @@ void server_config_free(void)
for (d = conf_deny_link; d; d = d_next)
{
d_next = d->next;
safe_free(d->prettyrule);
unreal_delete_masks(d->mask);
crule_free(&d->rule);
safe_free(d->prettyrule);
safe_free(d->reason);
DelListItem(d, conf_deny_link);
safe_free(d);
}
@@ -325,6 +327,8 @@ int server_config_test_deny_link(ConfigFile *cf, ConfigEntry *ce, int type, int
cep->file->filename, cep->line_number);
errors++;
}
} else if (!strcmp(cep->name, "reason"))
{
}
else
{
@@ -391,6 +395,10 @@ int server_config_run_deny_link(ConfigFile *cf, ConfigEntry *ce, int type)
deny->rule = crule_parse(cep->value);
safe_strdup(deny->prettyrule, cep->value);
}
else if (!strcmp(cep->name, "reason"))
{
safe_strdup(deny->reason, cep->value);
}
else if (!strcmp(cep->name, "type")) {
if (!strcmp(cep->value, "all"))
deny->flag.type = CRULE_ALL;
@@ -399,6 +407,10 @@ int server_config_run_deny_link(ConfigFile *cf, ConfigEntry *ce, int type)
}
}
/* Set a default reason, if needed */
if (!deny->reason)
safe_strdup(deny->reason, "Denied");
AddListItem(deny, conf_deny_link);
return 1;
}
@@ -1050,6 +1062,7 @@ CMD_FUNC(cmd_server)
ConfigItem_link *aconf = NULL;
char *flags = NULL, *protocol = NULL, *inf = NULL, *num = NULL;
int incoming;
const char *err;
if (IsUser(client))
{
@@ -1167,12 +1180,13 @@ CMD_FUNC(cmd_server)
strlcpy(client->info, info[0] ? info : "server", sizeof(client->info));
}
if (check_deny_link(aconf, 0))
if ((err = check_deny_link(aconf, 0)))
{
unreal_log(ULOG_ERROR, "link", "LINK_DENIED_DENY_LINK_BLOCK", client,
"Server link $servername rejected by deny link { } block.",
log_data_string("servername", servername));
exit_client(client, NULL, "Disallowed by connection rule");
"Server link $servername rejected by deny link { } block: $reason",
log_data_string("servername", servername),
log_data_string("reason", err));
exit_client_fmt(client, NULL, "Disallowed by connection rule: %s", err);
return;
}
@@ -2198,7 +2212,7 @@ const char *_check_deny_link(ConfigItem_link *link, int auto_connect)
if (unreal_mask_match_string(link->servername, d->mask) &&
crule_eval(d->rule))
{
return "Denied"; // TODO: implement deny link::reason
return d->reason;
}
}
return NULL;