Ver Fonte

[telnet_server]1) add struct auth_tlnt_srvr_param
2)NUMBER_TELNET_CONNECT = 5

balbekova há 6 anos atrás
pai
commit
2bae7caf99
2 ficheiros alterados com 123 adições e 54 exclusões
  1. 110 54
      modules/Telnet_Server/telnet_server.c
  2. 13 0
      modules/Telnet_Server/telnet_server.h

+ 110 - 54
modules/Telnet_Server/telnet_server.c

@@ -37,8 +37,8 @@
 /* Set option to drop old connection if the new one is accepted */
 #define TCP_DROP_PREV_CONNECTION    0
 
-static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer  );
-static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer  );
+static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, uint8_t num_conn  );
+static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, uint8_t num_conn  );
 void SensorInfoTimerCallback(TimerHandle_t pxTimer);
 
 TimerHandle_t RepeatSensorInfoTimer;
@@ -47,6 +47,8 @@ state_telnet_server_t telnetState = TELNET_AUTH;
 uint8_t id_change_pwd = 0;
 user_level_t telnet_code_auth = USER;
 
+auth_telnet_server_t auth_tlnt_srvr_param[NUMBER_TELNET_CONNECT];
+
 static int32_t lClientFd;
 static int32_t lSocket;
 static int8_t *pcOutputString;
@@ -57,8 +59,6 @@ static struct sockaddr_in sa;
 
 #ifdef HARDWARE_BT6708
 extern bool white_list_check(uint32_t check_remote_addr);
-
-static bool flagWhiteListTelnet = false;
 #endif
 
 /**
@@ -135,6 +135,7 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 	int32_t lBytes, lAddrLen = sizeof( struct sockaddr_in );
 	struct sockaddr_in sLocalAddr;
 	struct sockaddr_in client_addr;
+	const int8_t * const pcWarningMessage = ( const int8_t * ) "Количество соединенений превышено. Данное соединение будет закрыто\r\n";
 #ifdef HARDWARE_BT6708
 	const int8_t * const pcWelcomeMessage = ( const int8_t * ) "BT6708 command server - connection accepted.\r\nlogin:";
 #else
@@ -156,6 +157,8 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
     socklen_t len;
 #endif
     static int active_sd = -1;
+    static uint8_t cnt_conn = 0;
+    uint8_t cur_cnt = 0;
 
     FD_ZERO(&master_set);
 
@@ -272,11 +275,34 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 						}
 #ifdef HARDWARE_BT6708
 						lwip_getpeername(new_sd, &sa_temp, &len);
-						flagWhiteListTelnet = white_list_check(sa_temp.sin_addr.s_addr);
 #endif
-						recv( new_sd, cInputString, 27, 0 );
-						telnetState = TELNET_AUTH;
-						send( new_sd, pcWelcomeMessage, strlen( ( const char * ) pcWelcomeMessage ), 0 );
+						//recv( new_sd, cInputString, 27, 0 );
+						recv( new_sd, cInputString, 1, 0 );
+						if(cnt_conn < NUMBER_TELNET_CONNECT){
+							for(uint8_t k = 0; k < NUMBER_TELNET_CONNECT; k ++){
+								if(auth_tlnt_srvr_param[k].active_conn == false){
+									auth_tlnt_srvr_param[k].active_conn = true;
+									auth_tlnt_srvr_param[k].num_connect = new_sd;
+									auth_tlnt_srvr_param[k].telnetState = TELNET_AUTH;
+#ifdef HARDWARE_BT6708
+									auth_tlnt_srvr_param[k].flagWhiteListTelnet = white_list_check(sa_temp.sin_addr.s_addr);
+#elif HARDWARE_BT6706
+									auth_tlnt_srvr_param[k].flagWhiteListTelnet = true;
+#endif
+									send( new_sd, pcWelcomeMessage, strlen( ( const char * ) pcWelcomeMessage ), 0 );
+									break;
+								}
+							}
+							cnt_conn ++;
+						}
+						else{
+							send( new_sd, pcWarningMessage, strlen( ( const char * ) pcWarningMessage ), 0 );
+							closesocket(new_sd);
+							FD_CLR(new_sd, &master_set);
+							while (FD_ISSET(max_sd, &master_set) == false) {
+								max_sd -= 1;
+							}
+						}
 
 						cInputIndex = 0;
 						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
@@ -308,6 +334,24 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 					DBG printf("  Descriptor %d is readable\n", i);
 					close_conn = false;
 
+					for(cur_cnt = 0; cur_cnt < NUMBER_TELNET_CONNECT; cur_cnt ++){
+						if(auth_tlnt_srvr_param[cur_cnt].num_connect == i){
+							telnetState = auth_tlnt_srvr_param[cur_cnt].telnetState;
+							telnet_code_auth = auth_tlnt_srvr_param[cur_cnt].telnet_code_auth;
+							switch (telnet_code_auth) {
+							  case ADMIN:
+								  snprintf(name_login_telnet, sizeof(name_login_telnet), "Администратор");
+								  break;
+							  case USER:
+								  snprintf(name_login_telnet, sizeof(name_login_telnet), "Пользователь");
+								  break;
+							  default:
+								  break;
+							}
+							break;
+						}
+					}
+
 					/* Receive data on this connection until the  */
 					/* recv fails with EWOULDBLOCK.  If any other */
 					/* failure occurs, we will close the          */
@@ -318,9 +362,9 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 						{
 							if( cInChar == '\n' )
 							{
-								switch(telnetState){
+								switch(auth_tlnt_srvr_param[cur_cnt].telnetState){
 								case TELNET_AUTH:
-									if(FreeRTOS_CLIAuthProcess(cInputString, pcOutputString)){
+									if(FreeRTOS_CLIAuthProcess(cInputString, pcOutputString, cur_cnt)){
 										send( i, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 										cInputIndex = 0;
 										memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
@@ -352,7 +396,7 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 
 										/* Transmit a line separator, just to make the
 										output easier to read. */
-										lwip_send( lClientFd, "\r\n", strlen( "\r\n" ), 0 );
+										lwip_send( i, "\r\n", strlen( "\r\n" ), 0 );
 
 										do
 										{
@@ -360,6 +404,7 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 											the output buffer. */
 											pcOutputString[ 0 ] = 0x00;
 											xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
+											auth_tlnt_srvr_param[cur_cnt].telnetState = telnetState;
 											send( i, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 
 										} while( xReturned != pdFALSE );
@@ -381,13 +426,13 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 											strcpy( ( char * ) cLastInputString, ( char * ) cInputString );
 											cInputIndex = 0;
 											memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-											if(telnetState != TELNET_CHANGE_PWD)
+											if(auth_tlnt_srvr_param[cur_cnt].telnetState != TELNET_CHANGE_PWD)
 												send( i, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
 										}
 									}
 									break;
 								case TELNET_CHANGE_PWD:
-									FreeRTOS_ChangePWDProcess(cInputString, pcOutputString);
+									FreeRTOS_ChangePWDProcess(cInputString, pcOutputString, cur_cnt);
 									send( i, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 									cInputIndex = 0;
 									memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
@@ -436,11 +481,11 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 										cInputString[2] = 6;
 										cInputString[3] = 255;
 										cInputString[4] = 242;
-										//if(telnetState != TELNET_CHANGE_PWD)
+										//if(telnetState[i] != TELNET_CHANGE_PWD)
 											//lwip_send( lClientFd, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
 										send( i, cInputString, strlen( ( const char * ) cInputString ), 0 );
 										memset( cInputString, 0x00, cmdMAX_INPUT_SIZE );
-										if(telnetState != TELNET_CHANGE_PWD)
+										if(auth_tlnt_srvr_param[cur_cnt].telnetState != TELNET_CHANGE_PWD)
 											send( i, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
 									}
 								}
@@ -470,6 +515,11 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 					/* based on the bits that are still turned on in */
 					/* the master set.                               */
 					if (close_conn) {
+						auth_tlnt_srvr_param[cur_cnt].num_connect = 0;
+						auth_tlnt_srvr_param[cur_cnt].active_conn = false;
+						auth_tlnt_srvr_param[cur_cnt].telnetState = TELNET_AUTH;
+						auth_tlnt_srvr_param[cur_cnt].telnet_code_auth = USER;
+						cnt_conn -= 1;
 						closesocket(i);
 						FD_CLR(i, &master_set);
 						if (i == max_sd) {
@@ -486,6 +536,12 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 }
 
 void telnet_server_init(void) {
+	for(uint8_t i = 0; i < NUMBER_TELNET_CONNECT; i++){
+		auth_tlnt_srvr_param[i].num_connect = 0;
+		auth_tlnt_srvr_param[i].active_conn = false;
+		auth_tlnt_srvr_param[i].telnetState = TELNET_AUTH;
+		auth_tlnt_srvr_param[i].telnet_code_auth = USER;
+	}
 	vRegisterCLICommands();
 	xTaskCreate(vBasicSocketsCommandInterpreterTask, ( char * ) "vBasicSocketsCommandInterpreterTask", 8*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
 	 RepeatSensorInfoTimer = xTimerCreate("SensorInfoTmr", REPEAT_SENSOR_INFO_TIME, pdFALSE, ( void * ) 0, SensorInfoTimerCallback);
@@ -506,38 +562,38 @@ void SensorInfoTimerCallback(TimerHandle_t pxTimer) {
 	xTimerStart(RepeatSensorInfoTimer, 0);
 }
 
-static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer  )
+static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, uint8_t num_conn  )
 {
 	portBASE_TYPE xReturn = pdTRUE;
 	uint32_t len;
 	uint8_t valueLen, user_id;
 	char WebPassword[MAX_WEB_PASSWD_LEN];
 	char WebLogin[MAX_WEB_LOGIN_LEN];
-	static uint8_t login_err = 0;
-	static uint8_t telnet_state_auth = 0;
-	static char login[ cmdMAX_INPUT_SIZE ] = { 0 };
-	char password[ cmdMAX_INPUT_SIZE ] = { 0 };
+	static uint8_t login_err[NUMBER_TELNET_CONNECT] = {0};
+	static uint8_t telnet_state_auth[NUMBER_TELNET_CONNECT] = {0};
+	static char login[NUMBER_TELNET_CONNECT][cmdMAX_INPUT_SIZE] = { 0 };
+	char password[cmdMAX_INPUT_SIZE] = { 0 };
 	const int8_t * const pcPSWHeader = ( int8_t * ) "\r\npassword:";
 	const int8_t * const pcLoginHeader = ( int8_t * ) "\r\nlogin:";
 
 	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
 
-	if(telnet_state_auth == 0){
-		telnet_state_auth = 1;
-		memset(login, 0, cmdMAX_INPUT_SIZE);
+	if(telnet_state_auth[num_conn] == 0){
+		telnet_state_auth[num_conn] = 1;
+		memset(&login[num_conn][0], 0, cmdMAX_INPUT_SIZE);
 		len = strlen((char *)pcCommandInput);
-		strncpy(login, (char *)pcCommandInput, len);
+		strncpy(&login[num_conn][0], (char *)pcCommandInput, len);
 		strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPSWHeader, strlen( ( char * ) pcPSWHeader ) );
 		xReturn = pdTRUE;
 	}
 	else{
 		memset(name_login_telnet, 0, 50);
-		telnet_state_auth = 0;
+		telnet_state_auth[num_conn] = 0;
 		memset(password, 0, cmdMAX_INPUT_SIZE);
 		len = strlen((char *)pcCommandInput);
 		strncpy(password, (char *)pcCommandInput, len);
 #ifdef HARDWARE_BT6708
-		if(!flagWhiteListTelnet){
+		if(!auth_tlnt_srvr_param[num_conn].flagWhiteListTelnet){
 			xReturn = pdFALSE;
 		}
 		else
@@ -549,14 +605,26 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInpu
 				GetUserPassword(user_id, WebPassword, &valueLen);
 
 				/* Check login and password */
-				if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
+				if ((strncmp(WebLogin, &login[num_conn][0], MAX_WEB_LOGIN_LEN) == 0) &&
 					(strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
 
 					/* Login and pass are valid */
-					telnet_code_auth = user_id;
-					login_err = 0;
+					auth_tlnt_srvr_param[num_conn].telnet_code_auth = user_id;
+					login_err[num_conn] = 0;
 					strcpy( ( char * ) pcWriteBuffer, "\r\nАвторизация успешно пройдена\r\n>" );
-					telnetState = TELNET_CMD;
+					auth_tlnt_srvr_param[num_conn].telnetState = TELNET_CMD;
+					switch (user_id) {
+					  case 0:
+						  snprintf(name_login_telnet, sizeof(name_login_telnet), "Администратор");
+						  break;
+					  case 1:
+						  snprintf(name_login_telnet, sizeof(name_login_telnet), "Пользователь");
+						  break;
+					  default:
+						  break;
+					}
+
+					log_event_data(LOG_LOGIN_TELNET, name_login_telnet);
 					xReturn = pdTRUE;
 					break;
 				}
@@ -566,10 +634,10 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInpu
 			}
 		}
 		if(xReturn == pdFALSE){
-			if(login_err < 4){
-				login_err ++;
+			if(login_err[num_conn] < 4){
+				login_err[num_conn] ++;
 #ifdef HARDWARE_BT6708
-				if(!flagWhiteListTelnet)
+				if(!auth_tlnt_srvr_param[num_conn].flagWhiteListTelnet)
 					strcpy( ( char * ) pcWriteBuffer, "\r\nДоступ запрешен! Ваш IP-адрес находится вне диапазона доверительных хостов\r\n" );
 				else
 #endif
@@ -578,29 +646,17 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( const int8_t * const pcCommandInpu
 				xReturn = pdTRUE;
 			}
 			else{
-				login_err = 0;
+				login_err[num_conn] = 0;
 				xReturn = pdFALSE;
 			}
 		}
-		switch (user_id) {
-			  case 0:
-				  snprintf(name_login_telnet, sizeof(name_login_telnet), "Администратор");
-				  break;
-			  case 1:
-				  snprintf(name_login_telnet, sizeof(name_login_telnet), "Пользователь");
-				  break;
-			  default:
-				  break;
-		  }
-
-			log_event_data(LOG_LOGIN_TELNET, name_login_telnet);
 	}
 
 
 	return xReturn;
 }
 
-static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer  )
+static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, uint8_t num_conn  )
 {
 	portBASE_TYPE xReturn = pdTRUE;
 	uint32_t len;
@@ -617,12 +673,12 @@ static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandIn
 		len = strlen((char *)pcCommandInput);
 		if(len >= MAX_WEB_LOGIN_LEN){
 			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-			telnetState = TELNET_CMD;
+			auth_tlnt_srvr_param[num_conn].telnetState = TELNET_CMD;
 		}
 		else{
 			if(!control_string_en_digit((char *)pcCommandInput, len)){
 				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-				telnetState = TELNET_CMD;
+				auth_tlnt_srvr_param[num_conn].telnetState = TELNET_CMD;
 			}
 			else{
 				strncpy(password, (char *)pcCommandInput, len);
@@ -636,7 +692,7 @@ static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandIn
 		len = strlen((char *)pcCommandInput);
 		if(len >= MAX_WEB_LOGIN_LEN){
 			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-			telnetState = TELNET_CMD;
+			auth_tlnt_srvr_param[num_conn].telnetState = TELNET_CMD;
 		}
 		else{
 			strncpy(password2, (char *)pcCommandInput, len);
@@ -644,15 +700,15 @@ static portBASE_TYPE FreeRTOS_ChangePWDProcess( const int8_t * const pcCommandIn
 			if (strncmp(password, password2, MAX_WEB_PASSWD_LEN) == 0) {
 				memcpy(sSettings.sAuth[id_change_pwd].password, password, 11);
 				telnet_act = true;
-				 HTTP_SaveSettings();
-				 log_event_data(LOG_PSW_CHANGE, name_login_telnet);
+				HTTP_SaveSettings();
+				log_event_data(LOG_PSW_CHANGE, name_login_telnet);
 				strcpy( ( char * ) pcWriteBuffer, "\r\nПароль успешно изменен\r\n>" );
-				telnetState = TELNET_CMD;
+				auth_tlnt_srvr_param[num_conn].telnetState = TELNET_CMD;
 				xReturn = pdTRUE;
 			}
 			else{
 				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-				telnetState = TELNET_CMD;
+				auth_tlnt_srvr_param[num_conn].telnetState = TELNET_CMD;
 			}
 		}
 	}

+ 13 - 0
modules/Telnet_Server/telnet_server.h

@@ -8,12 +8,25 @@
 #ifndef TELNET_SERVER_H_
 #define TELNET_SERVER_H_
 
+#include "settings_api.h"
+
+/*Number of connection*/
+#define NUMBER_TELNET_CONNECT		5
+
 typedef enum{
 	TELNET_AUTH = 0,
 	TELNET_CMD,
 	TELNET_CHANGE_PWD
 }state_telnet_server_t;
 
+typedef struct{
+	state_telnet_server_t telnetState;
+	user_level_t telnet_code_auth;
+	uint8_t num_connect;
+	bool active_conn;
+	bool flagWhiteListTelnet;
+}auth_telnet_server_t;
+
 
 void telnet_server_init(void);