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_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); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -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) */ | ||||
|  | ||||
| @ -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"; | ||||
|  | ||||
| @ -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 */ | ||||
| 	 | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -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; | ||||
| 
 | ||||
|  | ||||
| @ -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 */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user