From e220357176f4411a34681db591e5cba9665e51a4 Mon Sep 17 00:00:00 2001 From: Jan Vidar Krey Date: Mon, 5 Apr 2010 12:45:35 +0200 Subject: [PATCH] Added configuration option to enable support for obsolete pre-ADC/1.0 clients. --- src/core/config.c | 25 ++++++++++++++++++----- src/core/config.h | 3 +++ src/core/hub.c | 51 +++++++++++++++++++++++++++++++++++++++-------- src/core/hub.h | 4 ++++ src/core/user.c | 7 +++---- src/core/user.h | 1 + 6 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/core/config.c b/src/core/config.c index 5580846..2a1979b 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -127,6 +127,7 @@ #define DEF_SHOW_BANNER 1 #define DEF_SHOW_BANNER_SYS_INFO 1 #define DEF_REGISTERED_USERS_ONLY 0 +#define DEF_OBSOLETE_CLIENTS 0 #define DEF_CHAT_ONLY 0 #define DEF_CHAT_IS_PRIVILEGED 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_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_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) { @@ -195,11 +198,12 @@ void config_defaults(struct hub_config* config) DEFAULT_INTEGER(max_send_buffer_soft, DEF_MAX_SEND_BUFFER_SOFT); DEFAULT_BOOLEAN(show_banner, DEF_SHOW_BANNER); 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_is_privileged, DEF_CHAT_IS_PRIVILEGED); DEFAULT_BOOLEAN(low_bandwidth_mode, DEF_LOW_BANDWIDTH_MODE); DEFAULT_BOOLEAN(registered_users_only, DEF_REGISTERED_USERS_ONLY); - + /* Limits enforced on users */ DEFAULT_INTEGER(limit_max_hubs_user, DEF_LIMIT_MAX_HUBS_USER); 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_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_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_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_BOOL(show_banner); GET_BOOL(show_banner_sys_info); + GET_BOOL(obsolete_clients); GET_BOOL(chat_only); GET_BOOL(chat_is_privileged); 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_min_slots); GET_INT(limit_max_slots); - + /* Status/error strings */ GET_STR (msg_hub_full); 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_hub_limit_low); 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_require); GET_STR (tls_certificate); GET_STR (tls_private_key); - /* Still here -- unknown directive */ + /* Still here -- unknown directive */ LOG_ERROR("Unknown configuration directive: '%s'", key); return -1; } @@ -340,7 +350,7 @@ void free_config(struct hub_config* config) hub_free(config->file_rules); hub_free(config->hub_name); hub_free(config->hub_description); - + hub_free(config->msg_hub_full); hub_free(config->msg_hub_disabled); 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_hub_limit_low); 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_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_BOOL(show_banner, DEF_SHOW_BANNER); 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_is_privileged, DEF_CHAT_IS_PRIVILEGED); 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_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_proto_no_common_hash, DEF_MSG_PROTO_NO_COMMON_HASH); + DUMP_STR (msg_proto_obsolete_adc0, DEF_MSG_PROTO_OBSOLETE_ADC0); } diff --git a/src/core/config.h b/src/core/config.h index d8eee16..061d8a0 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -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 max_users; /**<<< "Maximum number of users allowed on the hub (default: 500)" */ 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_is_privileged; /**<<< "Allow chat for operators and above only (default: 0) */ 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_hub_limit_low; /**<<< "User is on too few 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_require; /**<<< "If SSL/TLS enabled, should it be required (default: 0) */ diff --git a/src/core/hub.c b/src/core/hub.c index f40d744..5061ebe 100644 --- a/src/core/hub.c +++ b/src/core/hub.c @@ -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 (index == 0) ok = 0; /* Need to support *SOMETHING*, at least BASE */ - - if (ok) - { - hub_send_handshake(hub, u); - net_con_set_timeout(u->connection, TIMEOUT_HANDSHAKE); - } - else + if (!ok) { /* disconnect user. Do not send crap during initial handshake! */ 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_hub_limit_low, 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 @@ -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_hub_limit_low); STATUS(msg_user_hub_limit_high); + STATUS(msg_proto_no_common_hash); + STATUS(msg_proto_obsolete_adc0); } #undef STATUS 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_hub_limit_low); STATUS(msg_user_hub_limit_high); + STATUS(msg_proto_no_common_hash); + STATUS(msg_proto_obsolete_adc0); } #undef STATUS return "unknown"; diff --git a/src/core/hub.h b/src/core/hub.h index 3c8272f..f984fa0 100644 --- a/src/core/hub.h +++ b/src/core/hub.h @@ -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_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 */ + + }; diff --git a/src/core/user.c b/src/core/user.c index 3b44d19..4f57910 100644 --- a/src/core/user.c +++ b/src/core/user.c @@ -134,10 +134,9 @@ static int convert_support_fourcc(int fourcc) { switch (fourcc) { - case FOURCC('B','A','S','0'): /* Obsolete */ -#ifndef OLD_ADC_SUPPORT - return 0; -#endif + case FOURCC('B','A','S','0'): + return feature_bas0; + case FOURCC('B','A','S','E'): return feature_base; diff --git a/src/core/user.h b/src/core/user.h index 3d97670..74f3770 100644 --- a/src/core/user.h +++ b/src/core/user.h @@ -45,6 +45,7 @@ enum user_flags feature_ping = 0x00000080, /** PING: Hub pinger information extension */ feature_link = 0x00000100, /** LINK: Hub link (not supported) */ 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_ignore = 0x01000000, /** Ignore further reads */ flag_maxbuf = 0x02000000, /** Hit max buf read, ignore msg */