Adding support for redirecting clients to other hubs when they fail to login
for various reasons. Config variable is "redirect_addr".
This commit is contained in:
parent
b29f34af4a
commit
c70119870a
|
@ -155,6 +155,16 @@
|
||||||
]]></example>
|
]]></example>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
|
<option name="redirect_addr" type="string" default="">
|
||||||
|
<check regexp="(adc|adcs|dchub)://.*" />
|
||||||
|
<short>A common hub redirect address.</short>
|
||||||
|
<description><![CDATA[
|
||||||
|
This is the redirect address used when the hub wants to redirect a client for not fulfilling some requirements.
|
||||||
|
]]></description>
|
||||||
|
<since>0.3.2</since>
|
||||||
|
</option>
|
||||||
|
|
||||||
|
|
||||||
<option name="max_recv_buffer" type="int" default="4096" advanced="true" >
|
<option name="max_recv_buffer" type="int" default="4096" advanced="true" >
|
||||||
<check min="1024" max="1048576" />
|
<check min="1024" max="1048576" />
|
||||||
<short>Max read buffer before parse, per user</short>
|
<short>Max read buffer before parse, per user</short>
|
||||||
|
|
|
@ -16,6 +16,7 @@ void config_defaults(struct hub_config* config)
|
||||||
config->chat_is_privileged = 0;
|
config->chat_is_privileged = 0;
|
||||||
config->hub_name = hub_strdup("uhub");
|
config->hub_name = hub_strdup("uhub");
|
||||||
config->hub_description = hub_strdup("no description");
|
config->hub_description = hub_strdup("no description");
|
||||||
|
config->redirect_addr = hub_strdup("");
|
||||||
config->max_recv_buffer = 4096;
|
config->max_recv_buffer = 4096;
|
||||||
config->max_send_buffer = 131072;
|
config->max_send_buffer = 131072;
|
||||||
config->max_send_buffer_soft = 98304;
|
config->max_send_buffer_soft = 98304;
|
||||||
|
@ -231,6 +232,16 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp(key, "redirect_addr"))
|
||||||
|
{
|
||||||
|
if (!apply_string(key, data, &config->redirect_addr, (char*) ""))
|
||||||
|
{
|
||||||
|
LOG_ERROR("Configuration parse error on line %d", line_count);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(key, "max_recv_buffer"))
|
if (!strcmp(key, "max_recv_buffer"))
|
||||||
{
|
{
|
||||||
if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0))
|
if (!apply_integer(key, data, &config->max_recv_buffer, 0, 0))
|
||||||
|
@ -909,6 +920,8 @@ void free_config(struct hub_config* config)
|
||||||
|
|
||||||
hub_free(config->hub_description);
|
hub_free(config->hub_description);
|
||||||
|
|
||||||
|
hub_free(config->redirect_addr);
|
||||||
|
|
||||||
hub_free(config->tls_certificate);
|
hub_free(config->tls_certificate);
|
||||||
|
|
||||||
hub_free(config->tls_private_key);
|
hub_free(config->tls_private_key);
|
||||||
|
@ -1037,6 +1050,9 @@ void dump_config(struct hub_config* config, int ignore_defaults)
|
||||||
if (!ignore_defaults || strcmp(config->hub_description, "no description") != 0)
|
if (!ignore_defaults || strcmp(config->hub_description, "no description") != 0)
|
||||||
fprintf(stdout, "hub_description = \"%s\"\n", config->hub_description);
|
fprintf(stdout, "hub_description = \"%s\"\n", config->hub_description);
|
||||||
|
|
||||||
|
if (!ignore_defaults || strcmp(config->redirect_addr, "") != 0)
|
||||||
|
fprintf(stdout, "redirect_addr = \"%s\"\n", config->redirect_addr);
|
||||||
|
|
||||||
if (!ignore_defaults || config->max_recv_buffer != 4096)
|
if (!ignore_defaults || config->max_recv_buffer != 4096)
|
||||||
fprintf(stdout, "max_recv_buffer = %d\n", config->max_recv_buffer);
|
fprintf(stdout, "max_recv_buffer = %d\n", config->max_recv_buffer);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ struct hub_config
|
||||||
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
int chat_is_privileged; /*<<< Allow chat for operators and above only (default: 0) */
|
||||||
char* hub_name; /*<<< Name of hub (default: uhub) */
|
char* hub_name; /*<<< Name of hub (default: uhub) */
|
||||||
char* hub_description; /*<<< Short hub description, topic or subject. (default: no description) */
|
char* hub_description; /*<<< Short hub description, topic or subject. (default: no description) */
|
||||||
|
char* redirect_addr; /*<<< A common hub redirect address. (default: ) */
|
||||||
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
int max_recv_buffer; /*<<< Max read buffer before parse, per user (default: 4096) */
|
||||||
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
int max_send_buffer; /*<<< Max send buffer before disconnect, per user (default: 131072) */
|
||||||
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
int max_send_buffer_soft; /*<<< Max send buffer before message drops, per user (default: 98304) */
|
||||||
|
|
|
@ -942,13 +942,14 @@ void hub_send_status(struct hub_info* hub, struct hub_user* user, enum status_me
|
||||||
{
|
{
|
||||||
struct hub_config* cfg = hub->config;
|
struct hub_config* cfg = hub->config;
|
||||||
struct adc_message* cmd = adc_msg_construct(ADC_CMD_ISTA, 6);
|
struct adc_message* cmd = adc_msg_construct(ADC_CMD_ISTA, 6);
|
||||||
struct adc_message* qui = adc_msg_construct(ADC_CMD_IQUI, 256);
|
struct adc_message* qui = adc_msg_construct(ADC_CMD_IQUI, 512);
|
||||||
char code[4];
|
char code[4];
|
||||||
char buf[250];
|
char buf[250];
|
||||||
const char* text = 0;
|
const char* text = 0;
|
||||||
const char* flag = 0;
|
const char* flag = 0;
|
||||||
char* escaped_text = 0;
|
char* escaped_text = 0;
|
||||||
int reconnect_time = 0;
|
int reconnect_time = 0;
|
||||||
|
int redirect = 0;
|
||||||
|
|
||||||
if (!cmd || !qui)
|
if (!cmd || !qui)
|
||||||
{
|
{
|
||||||
|
@ -957,40 +958,40 @@ void hub_send_status(struct hub_info* hub, struct hub_user* user, enum status_me
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STATUS(CODE, MSG, FLAG, RCONTIME) case status_ ## MSG : set_status_code(level, CODE, code); text = cfg->MSG; flag = FLAG; reconnect_time = RCONTIME; break
|
#define STATUS(CODE, MSG, FLAG, RCONTIME, REDIRECT) case status_ ## MSG : set_status_code(level, CODE, code); text = cfg->MSG; flag = FLAG; reconnect_time = RCONTIME; redirect = REDIRECT; break
|
||||||
switch (msg)
|
switch (msg)
|
||||||
{
|
{
|
||||||
STATUS(11, msg_hub_full, 0, 600); /* FIXME: Proper timeout? */
|
STATUS(11, msg_hub_full, 0, 600, 1); /* FIXME: Proper timeout? */
|
||||||
STATUS(12, msg_hub_disabled, 0, -1);
|
STATUS(12, msg_hub_disabled, 0, -1, 1);
|
||||||
STATUS(26, msg_hub_registered_users_only, 0, 0);
|
STATUS(26, msg_hub_registered_users_only, 0, 0, 1);
|
||||||
STATUS(43, msg_inf_error_nick_missing, 0, 0);
|
STATUS(43, msg_inf_error_nick_missing, 0, 0, 0);
|
||||||
STATUS(43, msg_inf_error_nick_multiple, 0, 0);
|
STATUS(43, msg_inf_error_nick_multiple, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_invalid, 0, 0);
|
STATUS(21, msg_inf_error_nick_invalid, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_long, 0, 0);
|
STATUS(21, msg_inf_error_nick_long, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_short, 0, 0);
|
STATUS(21, msg_inf_error_nick_short, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_spaces, 0, 0);
|
STATUS(21, msg_inf_error_nick_spaces, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_bad_chars, 0, 0);
|
STATUS(21, msg_inf_error_nick_bad_chars, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_not_utf8, 0, 0);
|
STATUS(21, msg_inf_error_nick_not_utf8, 0, 0, 0);
|
||||||
STATUS(22, msg_inf_error_nick_taken, 0, 0);
|
STATUS(22, msg_inf_error_nick_taken, 0, 0, 0);
|
||||||
STATUS(21, msg_inf_error_nick_restricted, 0, 0);
|
STATUS(21, msg_inf_error_nick_restricted, 0, 0, 0);
|
||||||
STATUS(43, msg_inf_error_cid_invalid, "FBID", 0);
|
STATUS(43, msg_inf_error_cid_invalid, "FBID", 0, 0);
|
||||||
STATUS(43, msg_inf_error_cid_missing, "FMID", 0);
|
STATUS(43, msg_inf_error_cid_missing, "FMID", 0, 0);
|
||||||
STATUS(24, msg_inf_error_cid_taken, 0, 0);
|
STATUS(24, msg_inf_error_cid_taken, 0, 0, 0);
|
||||||
STATUS(43, msg_inf_error_pid_missing, "FMPD", 0);
|
STATUS(43, msg_inf_error_pid_missing, "FMPD", 0, 0);
|
||||||
STATUS(27, msg_inf_error_pid_invalid, "FBPD", 0);
|
STATUS(27, msg_inf_error_pid_invalid, "FBPD", 0, 0);
|
||||||
STATUS(31, msg_ban_permanently, 0, 0);
|
STATUS(31, msg_ban_permanently, 0, 0, 0);
|
||||||
STATUS(32, msg_ban_temporarily, "TL600", 600); /* FIXME: Proper timeout? */
|
STATUS(32, msg_ban_temporarily, "TL600", 600, 0); /* FIXME: Proper timeout? */
|
||||||
STATUS(23, msg_auth_invalid_password, 0, 0);
|
STATUS(23, msg_auth_invalid_password, 0, 0, 0);
|
||||||
STATUS(20, msg_auth_user_not_found, 0, 0);
|
STATUS(20, msg_auth_user_not_found, 0, 0, 0);
|
||||||
STATUS(30, msg_error_no_memory, 0, 0);
|
STATUS(30, msg_error_no_memory, 0, 0, 0);
|
||||||
STATUS(43, msg_user_share_size_low, "FB" ADC_INF_FLAG_SHARED_SIZE, 0);
|
STATUS(43, msg_user_share_size_low, "FB" ADC_INF_FLAG_SHARED_SIZE, 0, 1);
|
||||||
STATUS(43, msg_user_share_size_high, "FB" ADC_INF_FLAG_SHARED_SIZE, 0);
|
STATUS(43, msg_user_share_size_high, "FB" ADC_INF_FLAG_SHARED_SIZE, 0, 1);
|
||||||
STATUS(43, msg_user_slots_low, "FB" ADC_INF_FLAG_UPLOAD_SLOTS, 0);
|
STATUS(43, msg_user_slots_low, "FB" ADC_INF_FLAG_UPLOAD_SLOTS, 0, 1);
|
||||||
STATUS(43, msg_user_slots_high, "FB" ADC_INF_FLAG_UPLOAD_SLOTS, 0);
|
STATUS(43, msg_user_slots_high, "FB" ADC_INF_FLAG_UPLOAD_SLOTS, 0, 1);
|
||||||
STATUS(43, msg_user_hub_limit_low, 0, 0);
|
STATUS(43, msg_user_hub_limit_low, 0, 0, 1);
|
||||||
STATUS(43, msg_user_hub_limit_high, 0, 0);
|
STATUS(43, msg_user_hub_limit_high, 0, 0, 1);
|
||||||
STATUS(47, msg_proto_no_common_hash, 0, -1);
|
STATUS(47, msg_proto_no_common_hash, 0, -1, 1);
|
||||||
STATUS(40, msg_proto_obsolete_adc0, 0, -1);
|
STATUS(40, msg_proto_obsolete_adc0, 0, -1, 1);
|
||||||
}
|
}
|
||||||
#undef STATUS
|
#undef STATUS
|
||||||
|
|
||||||
|
@ -1016,6 +1017,12 @@ void hub_send_status(struct hub_info* hub, struct hub_user* user, enum status_me
|
||||||
snprintf(buf, 10, "TL%d", reconnect_time);
|
snprintf(buf, 10, "TL%d", reconnect_time);
|
||||||
adc_msg_add_argument(qui, buf);
|
adc_msg_add_argument(qui, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (redirect && *hub->config->redirect_addr)
|
||||||
|
{
|
||||||
|
snprintf(buf, 255, "RD%s", hub->config->redirect_addr);
|
||||||
|
adc_msg_add_argument(qui, buf);
|
||||||
|
}
|
||||||
route_to_user(hub, user, qui);
|
route_to_user(hub, user, qui);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue