Added configuration option to enable support for obsolete pre-ADC/1.0 clients.
This commit is contained in:
parent
8bed952022
commit
e220357176
|
@ -127,6 +127,7 @@
|
||||||
#define DEF_SHOW_BANNER 1
|
#define DEF_SHOW_BANNER 1
|
||||||
#define DEF_SHOW_BANNER_SYS_INFO 1
|
#define DEF_SHOW_BANNER_SYS_INFO 1
|
||||||
#define DEF_REGISTERED_USERS_ONLY 0
|
#define DEF_REGISTERED_USERS_ONLY 0
|
||||||
|
#define DEF_OBSOLETE_CLIENTS 0
|
||||||
#define DEF_CHAT_ONLY 0
|
#define DEF_CHAT_ONLY 0
|
||||||
#define DEF_CHAT_IS_PRIVILEGED 0
|
#define DEF_CHAT_IS_PRIVILEGED 0
|
||||||
#define DEF_LOW_BANDWIDTH_MODE 0
|
#define DEF_LOW_BANDWIDTH_MODE 0
|
||||||
|
@ -174,6 +175,8 @@
|
||||||
#define DEF_MSG_USER_SLOTS_HIGH "User have too many upload slots."
|
#define DEF_MSG_USER_SLOTS_HIGH "User have too many upload slots."
|
||||||
#define DEF_MSG_USER_HUB_LIMIT_LOW "User is on too few hubs."
|
#define DEF_MSG_USER_HUB_LIMIT_LOW "User is on too few hubs."
|
||||||
#define DEF_MSG_USER_HUB_LIMIT_HIGH "User is on too many hubs."
|
#define DEF_MSG_USER_HUB_LIMIT_HIGH "User is on too many hubs."
|
||||||
|
#define DEF_MSG_PROTO_NO_COMMON_HASH "No common hash algorithm."
|
||||||
|
#define DEF_MSG_PROTO_OBSOLETE_ADC0 "Your client does not support ADC/1.0."
|
||||||
|
|
||||||
void config_defaults(struct hub_config* config)
|
void config_defaults(struct hub_config* config)
|
||||||
{
|
{
|
||||||
|
@ -195,11 +198,12 @@ void config_defaults(struct hub_config* config)
|
||||||
DEFAULT_INTEGER(max_send_buffer_soft, DEF_MAX_SEND_BUFFER_SOFT);
|
DEFAULT_INTEGER(max_send_buffer_soft, DEF_MAX_SEND_BUFFER_SOFT);
|
||||||
DEFAULT_BOOLEAN(show_banner, DEF_SHOW_BANNER);
|
DEFAULT_BOOLEAN(show_banner, DEF_SHOW_BANNER);
|
||||||
DEFAULT_BOOLEAN(show_banner_sys_info, DEF_SHOW_BANNER_SYS_INFO);
|
DEFAULT_BOOLEAN(show_banner_sys_info, DEF_SHOW_BANNER_SYS_INFO);
|
||||||
|
DEFAULT_BOOLEAN(obsolete_clients, DEF_OBSOLETE_CLIENTS);
|
||||||
DEFAULT_BOOLEAN(chat_only, DEF_CHAT_ONLY);
|
DEFAULT_BOOLEAN(chat_only, DEF_CHAT_ONLY);
|
||||||
DEFAULT_BOOLEAN(chat_is_privileged, DEF_CHAT_IS_PRIVILEGED);
|
DEFAULT_BOOLEAN(chat_is_privileged, DEF_CHAT_IS_PRIVILEGED);
|
||||||
DEFAULT_BOOLEAN(low_bandwidth_mode, DEF_LOW_BANDWIDTH_MODE);
|
DEFAULT_BOOLEAN(low_bandwidth_mode, DEF_LOW_BANDWIDTH_MODE);
|
||||||
DEFAULT_BOOLEAN(registered_users_only, DEF_REGISTERED_USERS_ONLY);
|
DEFAULT_BOOLEAN(registered_users_only, DEF_REGISTERED_USERS_ONLY);
|
||||||
|
|
||||||
/* Limits enforced on users */
|
/* Limits enforced on users */
|
||||||
DEFAULT_INTEGER(limit_max_hubs_user, DEF_LIMIT_MAX_HUBS_USER);
|
DEFAULT_INTEGER(limit_max_hubs_user, DEF_LIMIT_MAX_HUBS_USER);
|
||||||
DEFAULT_INTEGER(limit_max_hubs_reg, DEF_LIMIT_MAX_HUBS_REG);
|
DEFAULT_INTEGER(limit_max_hubs_reg, DEF_LIMIT_MAX_HUBS_REG);
|
||||||
|
@ -243,6 +247,8 @@ void config_defaults(struct hub_config* config)
|
||||||
DEFAULT_STRING (msg_user_slots_high, DEF_MSG_USER_SLOTS_HIGH);
|
DEFAULT_STRING (msg_user_slots_high, DEF_MSG_USER_SLOTS_HIGH);
|
||||||
DEFAULT_STRING (msg_user_hub_limit_low, DEF_MSG_USER_HUB_LIMIT_LOW);
|
DEFAULT_STRING (msg_user_hub_limit_low, DEF_MSG_USER_HUB_LIMIT_LOW);
|
||||||
DEFAULT_STRING (msg_user_hub_limit_high, DEF_MSG_USER_HUB_LIMIT_HIGH);
|
DEFAULT_STRING (msg_user_hub_limit_high, DEF_MSG_USER_HUB_LIMIT_HIGH);
|
||||||
|
DEFAULT_STRING (msg_proto_no_common_hash, DEF_MSG_PROTO_NO_COMMON_HASH);
|
||||||
|
DEFAULT_STRING (msg_proto_obsolete_adc0, DEF_MSG_PROTO_OBSOLETE_ADC0);
|
||||||
|
|
||||||
DEFAULT_INTEGER(tls_enable, DEF_TLS_ENABLE);
|
DEFAULT_INTEGER(tls_enable, DEF_TLS_ENABLE);
|
||||||
DEFAULT_INTEGER(tls_require, DEF_TLS_REQUIRE);
|
DEFAULT_INTEGER(tls_require, DEF_TLS_REQUIRE);
|
||||||
|
@ -271,6 +277,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||||
GET_INT (max_send_buffer_soft);
|
GET_INT (max_send_buffer_soft);
|
||||||
GET_BOOL(show_banner);
|
GET_BOOL(show_banner);
|
||||||
GET_BOOL(show_banner_sys_info);
|
GET_BOOL(show_banner_sys_info);
|
||||||
|
GET_BOOL(obsolete_clients);
|
||||||
GET_BOOL(chat_only);
|
GET_BOOL(chat_only);
|
||||||
GET_BOOL(chat_is_privileged);
|
GET_BOOL(chat_is_privileged);
|
||||||
GET_BOOL(low_bandwidth_mode);
|
GET_BOOL(low_bandwidth_mode);
|
||||||
|
@ -288,7 +295,7 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||||
GET_INT(limit_max_share);
|
GET_INT(limit_max_share);
|
||||||
GET_INT(limit_min_slots);
|
GET_INT(limit_min_slots);
|
||||||
GET_INT(limit_max_slots);
|
GET_INT(limit_max_slots);
|
||||||
|
|
||||||
/* Status/error strings */
|
/* Status/error strings */
|
||||||
GET_STR (msg_hub_full);
|
GET_STR (msg_hub_full);
|
||||||
GET_STR (msg_hub_disabled);
|
GET_STR (msg_hub_disabled);
|
||||||
|
@ -319,13 +326,16 @@ static int apply_config(struct hub_config* config, char* key, char* data, int li
|
||||||
GET_STR (msg_user_slots_high);
|
GET_STR (msg_user_slots_high);
|
||||||
GET_STR (msg_user_hub_limit_low);
|
GET_STR (msg_user_hub_limit_low);
|
||||||
GET_STR (msg_user_hub_limit_high);
|
GET_STR (msg_user_hub_limit_high);
|
||||||
|
GET_STR (msg_proto_no_common_hash);
|
||||||
|
GET_STR (msg_proto_obsolete_adc0);
|
||||||
|
|
||||||
|
/* TLS/SSL related */
|
||||||
GET_BOOL(tls_enable);
|
GET_BOOL(tls_enable);
|
||||||
GET_BOOL(tls_require);
|
GET_BOOL(tls_require);
|
||||||
GET_STR (tls_certificate);
|
GET_STR (tls_certificate);
|
||||||
GET_STR (tls_private_key);
|
GET_STR (tls_private_key);
|
||||||
|
|
||||||
/* Still here -- unknown directive */
|
/* Still here -- unknown directive */
|
||||||
LOG_ERROR("Unknown configuration directive: '%s'", key);
|
LOG_ERROR("Unknown configuration directive: '%s'", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -340,7 +350,7 @@ void free_config(struct hub_config* config)
|
||||||
hub_free(config->file_rules);
|
hub_free(config->file_rules);
|
||||||
hub_free(config->hub_name);
|
hub_free(config->hub_name);
|
||||||
hub_free(config->hub_description);
|
hub_free(config->hub_description);
|
||||||
|
|
||||||
hub_free(config->msg_hub_full);
|
hub_free(config->msg_hub_full);
|
||||||
hub_free(config->msg_hub_disabled);
|
hub_free(config->msg_hub_disabled);
|
||||||
hub_free(config->msg_hub_registered_users_only);
|
hub_free(config->msg_hub_registered_users_only);
|
||||||
|
@ -370,7 +380,9 @@ void free_config(struct hub_config* config)
|
||||||
hub_free(config->msg_user_slots_high);
|
hub_free(config->msg_user_slots_high);
|
||||||
hub_free(config->msg_user_hub_limit_low);
|
hub_free(config->msg_user_hub_limit_low);
|
||||||
hub_free(config->msg_user_hub_limit_high);
|
hub_free(config->msg_user_hub_limit_high);
|
||||||
|
hub_free(config->msg_proto_no_common_hash);
|
||||||
|
hub_free(config->msg_proto_obsolete_adc0);
|
||||||
|
|
||||||
hub_free(config->tls_certificate);
|
hub_free(config->tls_certificate);
|
||||||
hub_free(config->tls_private_key);
|
hub_free(config->tls_private_key);
|
||||||
|
|
||||||
|
@ -425,6 +437,7 @@ void dump_config(struct hub_config* config, int ignore_defaults)
|
||||||
DUMP_INT (max_send_buffer_soft, DEF_MAX_SEND_BUFFER_SOFT);
|
DUMP_INT (max_send_buffer_soft, DEF_MAX_SEND_BUFFER_SOFT);
|
||||||
DUMP_BOOL(show_banner, DEF_SHOW_BANNER);
|
DUMP_BOOL(show_banner, DEF_SHOW_BANNER);
|
||||||
DUMP_BOOL(show_banner_sys_info, DEF_SHOW_BANNER_SYS_INFO);
|
DUMP_BOOL(show_banner_sys_info, DEF_SHOW_BANNER_SYS_INFO);
|
||||||
|
DUMP_BOOL(obsolete_clients, DEF_OBSOLETE_CLIENTS);
|
||||||
DUMP_BOOL(chat_only, DEF_CHAT_ONLY);
|
DUMP_BOOL(chat_only, DEF_CHAT_ONLY);
|
||||||
DUMP_BOOL(chat_is_privileged, DEF_CHAT_IS_PRIVILEGED);
|
DUMP_BOOL(chat_is_privileged, DEF_CHAT_IS_PRIVILEGED);
|
||||||
DUMP_BOOL(low_bandwidth_mode, DEF_LOW_BANDWIDTH_MODE);
|
DUMP_BOOL(low_bandwidth_mode, DEF_LOW_BANDWIDTH_MODE);
|
||||||
|
@ -480,6 +493,8 @@ void dump_config(struct hub_config* config, int ignore_defaults)
|
||||||
DUMP_STR (msg_user_slots_high, DEF_MSG_USER_SLOTS_HIGH);
|
DUMP_STR (msg_user_slots_high, DEF_MSG_USER_SLOTS_HIGH);
|
||||||
DUMP_STR (msg_user_hub_limit_low, DEF_MSG_USER_HUB_LIMIT_LOW);
|
DUMP_STR (msg_user_hub_limit_low, DEF_MSG_USER_HUB_LIMIT_LOW);
|
||||||
DUMP_STR (msg_user_hub_limit_high, DEF_MSG_USER_HUB_LIMIT_HIGH);
|
DUMP_STR (msg_user_hub_limit_high, DEF_MSG_USER_HUB_LIMIT_HIGH);
|
||||||
|
DUMP_STR (msg_proto_no_common_hash, DEF_MSG_PROTO_NO_COMMON_HASH);
|
||||||
|
DUMP_STR (msg_proto_obsolete_adc0, DEF_MSG_PROTO_OBSOLETE_ADC0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct hub_config
|
||||||
int show_banner_sys_info; /**<<< "Show banner system information (default: 1). Has no effect unless show_banner is enabled." */
|
int show_banner_sys_info; /**<<< "Show banner system information (default: 1). Has no effect unless show_banner is enabled." */
|
||||||
int max_users; /**<<< "Maximum number of users allowed on the hub (default: 500)" */
|
int max_users; /**<<< "Maximum number of users allowed on the hub (default: 500)" */
|
||||||
int registered_users_only; /**<<< "Allow registered users only (default: 0)" */
|
int registered_users_only; /**<<< "Allow registered users only (default: 0)" */
|
||||||
|
int obsolete_clients; /**<<< "Support obsolete clients using a ADC protocol prior to 1.0 (default: off)" */
|
||||||
int chat_only; /**<<< "Allow chat only operation on hub (default: 0)" */
|
int chat_only; /**<<< "Allow chat only operation on hub (default: 0)" */
|
||||||
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* file_motd; /**<<< "File containing the 'message of the day' (default: '' - no motd)" */
|
char* file_motd; /**<<< "File containing the 'message of the day' (default: '' - no motd)" */
|
||||||
|
@ -89,6 +90,8 @@ struct hub_config
|
||||||
char* msg_user_slots_high; /**<<< "User have too many upload slots." */
|
char* msg_user_slots_high; /**<<< "User have too many upload slots." */
|
||||||
char* msg_user_hub_limit_low; /**<<< "User is on too few hubs." */
|
char* msg_user_hub_limit_low; /**<<< "User is on too few hubs." */
|
||||||
char* msg_user_hub_limit_high; /**<<< "User is on too many hubs." */
|
char* msg_user_hub_limit_high; /**<<< "User is on too many hubs." */
|
||||||
|
char* msg_proto_no_common_hash; /**<<< "No common hash algorithm." */
|
||||||
|
char* msg_proto_obsolete_adc0; /**<<< "Client is using an obsolete ADC protocol version." */
|
||||||
|
|
||||||
int tls_enable; /**<<< "Enable SSL/TLS support (default: 0)" */
|
int tls_enable; /**<<< "Enable SSL/TLS support (default: 0)" */
|
||||||
int tls_require; /**<<< "If SSL/TLS enabled, should it be required (default: 0) */
|
int tls_require; /**<<< "If SSL/TLS enabled, should it be required (default: 0) */
|
||||||
|
|
|
@ -137,17 +137,46 @@ int hub_handle_support(struct hub_info* hub, struct hub_user* u, struct adc_mess
|
||||||
if (u->state == state_protocol)
|
if (u->state == state_protocol)
|
||||||
{
|
{
|
||||||
if (index == 0) ok = 0; /* Need to support *SOMETHING*, at least BASE */
|
if (index == 0) ok = 0; /* Need to support *SOMETHING*, at least BASE */
|
||||||
|
if (!ok)
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
hub_send_handshake(hub, u);
|
|
||||||
net_con_set_timeout(u->connection, TIMEOUT_HANDSHAKE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* disconnect user. Do not send crap during initial handshake! */
|
/* disconnect user. Do not send crap during initial handshake! */
|
||||||
hub_disconnect_user(hub, u, quit_logon_error);
|
hub_disconnect_user(hub, u, quit_logon_error);
|
||||||
ret = -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user_flag_get(u, feature_base))
|
||||||
|
{
|
||||||
|
/* User supports ADC/1.0 and a hash we know */
|
||||||
|
if (user_flag_get(u, feature_tiger))
|
||||||
|
{
|
||||||
|
hub_send_handshake(hub, u);
|
||||||
|
net_con_set_timeout(u->connection, TIMEOUT_HANDSHAKE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// no common hash algorithm.
|
||||||
|
hub_send_status(hub, u, status_msg_proto_no_common_hash, status_level_fatal);
|
||||||
|
hub_disconnect_user(hub, u, quit_protocol_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (user_flag_get(u, feature_bas0))
|
||||||
|
{
|
||||||
|
if (hub->config->obsolete_clients)
|
||||||
|
{
|
||||||
|
hub_send_handshake(hub, u);
|
||||||
|
net_con_set_timeout(u->connection, TIMEOUT_HANDSHAKE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* disconnect user for using an obsolete client. */
|
||||||
|
hub_send_status(hub, u, status_msg_proto_obsolete_adc0, status_level_fatal);
|
||||||
|
hub_disconnect_user(hub, u, quit_protocol_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Not speaking a compatible protocol - just disconnect. */
|
||||||
|
hub_disconnect_user(hub, u, quit_logon_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -890,6 +919,8 @@ void hub_send_status(struct hub_info* hub, struct hub_user* user, enum status_me
|
||||||
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);
|
||||||
STATUS(43, msg_user_hub_limit_low, 0, 0);
|
STATUS(43, msg_user_hub_limit_low, 0, 0);
|
||||||
STATUS(43, msg_user_hub_limit_high, 0, 0);
|
STATUS(43, msg_user_hub_limit_high, 0, 0);
|
||||||
|
STATUS(47, msg_proto_no_common_hash, 0, -1);
|
||||||
|
STATUS(40, msg_proto_obsolete_adc0, 0, -1);
|
||||||
}
|
}
|
||||||
#undef STATUS
|
#undef STATUS
|
||||||
|
|
||||||
|
@ -958,6 +989,8 @@ const char* hub_get_status_message(struct hub_info* hub, enum status_message msg
|
||||||
STATUS(msg_user_slots_high);
|
STATUS(msg_user_slots_high);
|
||||||
STATUS(msg_user_hub_limit_low);
|
STATUS(msg_user_hub_limit_low);
|
||||||
STATUS(msg_user_hub_limit_high);
|
STATUS(msg_user_hub_limit_high);
|
||||||
|
STATUS(msg_proto_no_common_hash);
|
||||||
|
STATUS(msg_proto_obsolete_adc0);
|
||||||
}
|
}
|
||||||
#undef STATUS
|
#undef STATUS
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
|
@ -997,6 +1030,8 @@ const char* hub_get_status_message_log(struct hub_info* hub, enum status_message
|
||||||
STATUS(msg_user_slots_high);
|
STATUS(msg_user_slots_high);
|
||||||
STATUS(msg_user_hub_limit_low);
|
STATUS(msg_user_hub_limit_low);
|
||||||
STATUS(msg_user_hub_limit_high);
|
STATUS(msg_user_hub_limit_high);
|
||||||
|
STATUS(msg_proto_no_common_hash);
|
||||||
|
STATUS(msg_proto_obsolete_adc0);
|
||||||
}
|
}
|
||||||
#undef STATUS
|
#undef STATUS
|
||||||
return "unknown";
|
return "unknown";
|
||||||
|
|
|
@ -53,6 +53,10 @@ enum status_message
|
||||||
status_msg_user_hub_limit_low = -44, /* Use is on too few hubs. */
|
status_msg_user_hub_limit_low = -44, /* Use is on too few hubs. */
|
||||||
status_msg_user_hub_limit_high = -45, /* Use is on too many hubs. */
|
status_msg_user_hub_limit_high = -45, /* Use is on too many hubs. */
|
||||||
|
|
||||||
|
status_msg_proto_no_common_hash = -50, /* No common hash algorithms */
|
||||||
|
status_msg_proto_obsolete_adc0 = -51, /* Client is using an obsolete protocol version */
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -134,10 +134,9 @@ static int convert_support_fourcc(int fourcc)
|
||||||
{
|
{
|
||||||
switch (fourcc)
|
switch (fourcc)
|
||||||
{
|
{
|
||||||
case FOURCC('B','A','S','0'): /* Obsolete */
|
case FOURCC('B','A','S','0'):
|
||||||
#ifndef OLD_ADC_SUPPORT
|
return feature_bas0;
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
case FOURCC('B','A','S','E'):
|
case FOURCC('B','A','S','E'):
|
||||||
return feature_base;
|
return feature_base;
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ enum user_flags
|
||||||
feature_ping = 0x00000080, /** PING: Hub pinger information extension */
|
feature_ping = 0x00000080, /** PING: Hub pinger information extension */
|
||||||
feature_link = 0x00000100, /** LINK: Hub link (not supported) */
|
feature_link = 0x00000100, /** LINK: Hub link (not supported) */
|
||||||
feature_adcs = 0x00000200, /** ADCS: ADC over TLS/SSL */
|
feature_adcs = 0x00000200, /** ADCS: ADC over TLS/SSL */
|
||||||
|
feature_bas0 = 0x00000400, /** BAS0: Obsolete pre-ADC/1.0 protocol version */
|
||||||
flag_muted = 0x00800000, /** User is muted (cannot chat) */
|
flag_muted = 0x00800000, /** User is muted (cannot chat) */
|
||||||
flag_ignore = 0x01000000, /** Ignore further reads */
|
flag_ignore = 0x01000000, /** Ignore further reads */
|
||||||
flag_maxbuf = 0x02000000, /** Hit max buf read, ignore msg */
|
flag_maxbuf = 0x02000000, /** Hit max buf read, ignore msg */
|
||||||
|
|
Loading…
Reference in New Issue