|
@@ -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;
|
|
|
}
|
|
|
}
|
|
|
}
|