|  | @@ -20,6 +20,7 @@
 | 
	
		
			
				|  |  |  /* Utils includes. */
 | 
	
		
			
				|  |  |  #include "FreeRTOS_CLI.h"
 | 
	
		
			
				|  |  |  #include "CLI_Commands.h"
 | 
	
		
			
				|  |  | +#include "cli.h"
 | 
	
		
			
				|  |  |  #include "telnet_server.h"
 | 
	
		
			
				|  |  |  #include "settings_api.h"
 | 
	
		
			
				|  |  |  #include "parameters.h"
 | 
	
	
		
			
				|  | @@ -157,7 +158,7 @@ typedef struct{
 | 
	
		
			
				|  |  |  	uint8_t state;
 | 
	
		
			
				|  |  |  	uint8_t code;
 | 
	
		
			
				|  |  |  	char buf[cmdMAX_INPUT_SIZE];
 | 
	
		
			
				|  |  | -	char bufptr;
 | 
	
		
			
				|  |  | +	uint_fast8_t bufptr;
 | 
	
		
			
				|  |  |  	char prev_cmd[cmdMAX_INPUT_SIZE];
 | 
	
		
			
				|  |  |  	unsigned char optdata[cmdMAX_INPUT_SIZE];
 | 
	
		
			
				|  |  |  	uint8_t optlen;
 | 
	
	
		
			
				|  | @@ -168,15 +169,11 @@ typedef struct{
 | 
	
		
			
				|  |  |  	uint8_t num_connect;
 | 
	
		
			
				|  |  |  	bool active_conn;
 | 
	
		
			
				|  |  |  	bool flag_telnet_ip_option;
 | 
	
		
			
				|  |  | -}telnetd_state_t;
 | 
	
		
			
				|  |  | +	cli_state_t *cli_state;
 | 
	
		
			
				|  |  | +} telnetd_state_t;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  );
 | 
	
		
			
				|  |  |  static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  );
 | 
	
		
			
				|  |  | -void SensorInfoTimerCallback(TimerHandle_t pxTimer);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -state_telnet_server_t telnetState = TELNET_AUTH;
 | 
	
		
			
				|  |  | -uint8_t id_change_pwd = 0;
 | 
	
		
			
				|  |  | -user_level_t telnet_code_auth = USER;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  telnetd_state_t auth_tlnt_srvr_param[NUMBER_TELNET_CONNECT];
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -216,149 +213,16 @@ extern SETTINGS_t sSettings;
 | 
	
		
			
				|  |  |  void
 | 
	
		
			
				|  |  |  telnetd_close(telnetd_state_t *s)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -  s->state = STATE_CLOSE;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -static void telnetd_input(telnetd_state_t *s)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -	portBASE_TYPE xReturned;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	switch(s->telnetState){
 | 
	
		
			
				|  |  | -		case TELNET_AUTH:
 | 
	
		
			
				|  |  | -		case TELNET_AUTH_PASSW:
 | 
	
		
			
				|  |  | -			if(FreeRTOS_CLIAuthProcess(pcOutputString, s)){
 | 
	
		
			
				|  |  | -				send( s->num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 | 
	
		
			
				|  |  | -				memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			else{
 | 
	
		
			
				|  |  | -				s->state = STATE_CLOSE;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		case TELNET_CMD:
 | 
	
		
			
				|  |  | -			/* The input string has been terminated.  Was the
 | 
	
		
			
				|  |  | -			input a quit command? */
 | 
	
		
			
				|  |  | -			if( strcmp( "quit", ( const char * ) s->buf ) == 0 )
 | 
	
		
			
				|  |  | -			{
 | 
	
		
			
				|  |  | -				s->state = STATE_CLOSE;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			else
 | 
	
		
			
				|  |  | -			{
 | 
	
		
			
				|  |  | -				/* The input string was not a quit command.
 | 
	
		
			
				|  |  | -				Pass the string to the command interpreter. */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				/* See if the command is empty, indicating that the last command is
 | 
	
		
			
				|  |  | -				to be executed again. */
 | 
	
		
			
				|  |  | -				if( s->bufptr == 0 )
 | 
	
		
			
				|  |  | -				{
 | 
	
		
			
				|  |  | -					if(s->flag_telnet_ip_option ){
 | 
	
		
			
				|  |  | -						s->flag_telnet_ip_option = false;
 | 
	
		
			
				|  |  | -						return;
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -					else{
 | 
	
		
			
				|  |  | -						strcpy( s->buf, s->prev_cmd );
 | 
	
		
			
				|  |  | -					}
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				/* Transmit a line separator, just to make the
 | 
	
		
			
				|  |  | -				output easier to read. */
 | 
	
		
			
				|  |  | -				lwip_send( s->num_connect, "\r\n", strlen( "\r\n" ), 0 );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				do
 | 
	
		
			
				|  |  | -				{
 | 
	
		
			
				|  |  | -					/* Ensure there is not a string lingering in
 | 
	
		
			
				|  |  | -					the output buffer. */
 | 
	
		
			
				|  |  | -					pcOutputString[ 0 ] = 0x00;
 | 
	
		
			
				|  |  | -					telnetState = s->telnetState;
 | 
	
		
			
				|  |  | -					xReturned = FreeRTOS_CLIProcessCommand( s->buf, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
 | 
	
		
			
				|  |  | -					s->telnetState = telnetState;
 | 
	
		
			
				|  |  | -					send( s->num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				} while( xReturned != pdFALSE );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				if( strcmp( "sensor info", ( const char * ) s->buf ) == 0 ){
 | 
	
		
			
				|  |  | -					strcpy( s->prev_cmd, s->buf );
 | 
	
		
			
				|  |  | -					memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
 | 
	
		
			
				|  |  | -					xTimerStart(s->RepeatSensorInfoTimer, 0);
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				else{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -					/* All the strings generated by the input
 | 
	
		
			
				|  |  | -					command have been sent.  Clear the input
 | 
	
		
			
				|  |  | -					string ready to receive the next command.
 | 
	
		
			
				|  |  | -					Remember the command that was just processed
 | 
	
		
			
				|  |  | -					first in case it is to be processed again. */
 | 
	
		
			
				|  |  | -					strcpy( s->prev_cmd, s->buf );
 | 
	
		
			
				|  |  | -					memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
 | 
	
		
			
				|  |  | -					if(s->telnetState != TELNET_CHANGE_PWD)
 | 
	
		
			
				|  |  | -						send( s->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		case TELNET_CHANGE_PWD:
 | 
	
		
			
				|  |  | -		case TELNET_CHANGE_PWD_ACK:
 | 
	
		
			
				|  |  | -			FreeRTOS_ChangePWDProcess(pcOutputString, s);
 | 
	
		
			
				|  |  | -			send( s->num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 | 
	
		
			
				|  |  | -			memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +	s->state = STATE_CLOSE;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/*-----------------------------------------------------------------------------------*/
 | 
	
		
			
				|  |  | -static void getchar(telnetd_state_t *s)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -	if(type_term == 1 && s->telnetState != TELNET_AUTH_PASSW){
 | 
	
		
			
				|  |  | -		if(s->buf[s->bufptr] != 0x03 && s->buf[s->bufptr] != 0x7f){
 | 
	
		
			
				|  |  | -			send( s->num_connect, &s->buf[s->bufptr], 1, 0 );
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	else if(s->telnetState == TELNET_AUTH_PASSW){
 | 
	
		
			
				|  |  | -		send( s->num_connect, " ", 1, 0 );
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  if(s->buf[s->bufptr] == ISO_nl ||
 | 
	
		
			
				|  |  | -	s->buf[s->bufptr] == 0) {
 | 
	
		
			
				|  |  | -	s->bufptr = 0;
 | 
	
		
			
				|  |  | -    return;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  if(s->buf[s->bufptr] == ISO_cr ||
 | 
	
		
			
				|  |  | -     s->bufptr == sizeof(s->buf) - 1) {
 | 
	
		
			
				|  |  | -    if(s->bufptr > 0) {
 | 
	
		
			
				|  |  | -      s->buf[s->bufptr] = 0;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    telnetd_input(s);
 | 
	
		
			
				|  |  | -    s->bufptr = 0;
 | 
	
		
			
				|  |  | -  } else if( s->buf[s->bufptr] == '\b' || s->buf[s->bufptr] == 0x7f)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		/* Backspace was pressed.  Erase the last
 | 
	
		
			
				|  |  | -		character in the string - if any. */
 | 
	
		
			
				|  |  | -	  	s->buf[s->bufptr] = '\0';
 | 
	
		
			
				|  |  | -		if( s->bufptr > 0 )
 | 
	
		
			
				|  |  | -		{
 | 
	
		
			
				|  |  | -			s->bufptr--;
 | 
	
		
			
				|  |  | -			s->buf[s->bufptr] = '\0';
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -  else if (s->buf[s->bufptr] == 0x03){
 | 
	
		
			
				|  |  | -	  xTimerStop(s->RepeatSensorInfoTimer, 0);
 | 
	
		
			
				|  |  | -	  s->flag_telnet_ip_option = true;
 | 
	
		
			
				|  |  | -	  if(s->telnetState != TELNET_CHANGE_PWD && s->telnetState != TELNET_CHANGE_PWD_ACK)
 | 
	
		
			
				|  |  | -	  	send( s->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  else {
 | 
	
		
			
				|  |  | -    ++s->bufptr;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -/*-----------------------------------------------------------------------------------*/
 | 
	
		
			
				|  |  |  static void sendopt(telnetd_state_t *s, u8_t code, u8_t option)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	unsigned char buf[3];
 | 
	
		
			
				|  |  |  	buf[0] = TELNET_IAC;
 | 
	
		
			
				|  |  |  	buf[1] = code;
 | 
	
		
			
				|  |  |  	buf[2] = option;
 | 
	
		
			
				|  |  | -    send( s->num_connect, buf, 3, 0 );
 | 
	
		
			
				|  |  | +	send( s->num_connect, buf, 3, 0 );
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void sendsubopt(telnetd_state_t *s, u8_t code, u8_t *option, u8_t len)
 | 
	
	
		
			
				|  | @@ -370,49 +234,48 @@ static void sendsubopt(telnetd_state_t *s, u8_t code, u8_t *option, u8_t len)
 | 
	
		
			
				|  |  |  	memcpy(&buf[3], option, len);
 | 
	
		
			
				|  |  |  	buf[len + 3] = TELNET_IAC;
 | 
	
		
			
				|  |  |  	buf[len + 4] = TELNET_SE;
 | 
	
		
			
				|  |  | -    send( s->num_connect, buf, (len + 5), 0 );
 | 
	
		
			
				|  |  | +		send( s->num_connect, buf, (len + 5), 0 );
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void parseopt(telnetd_state_t *ts, uint8_t code, uint8_t option)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +	switch (option) {
 | 
	
		
			
				|  |  | +		case TELOPT_ECHO:
 | 
	
		
			
				|  |  | +			if (code == TELNET_WONT) {
 | 
	
		
			
				|  |  | +				type_term = 0;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			else if (code == TELNET_WILL ){
 | 
	
		
			
				|  |  | +				type_term = 1;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case TELOPT_SUPPRESS_GO_AHEAD:
 | 
	
		
			
				|  |  | +		case TELOPT_LINEMODE:
 | 
	
		
			
				|  |  | +		case TELOPT_NAWS:
 | 
	
		
			
				|  |  | +		case TELOPT_DISPLAY_POS:
 | 
	
		
			
				|  |  | +		case TELOPT_NEW_ENV_OPTION:
 | 
	
		
			
				|  |  | +		case TELOPT_TERMINAL_SPEED:
 | 
	
		
			
				|  |  | +		case TELOPT_TERMINAL_TYPE:
 | 
	
		
			
				|  |  | +		case TELOPT_STATUS:
 | 
	
		
			
				|  |  | +		case TELOPT_TOGGLE_FLOW_CONTROL:
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  switch (option) {
 | 
	
		
			
				|  |  | -    case TELOPT_ECHO:
 | 
	
		
			
				|  |  | -    	if (code == TELNET_WONT) {
 | 
	
		
			
				|  |  | -    		type_term = 0;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -    	else if (code == TELNET_WILL ){
 | 
	
		
			
				|  |  | -    		type_term = 1;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | -    	break;
 | 
	
		
			
				|  |  | -    case TELOPT_SUPPRESS_GO_AHEAD:
 | 
	
		
			
				|  |  | -    case TELOPT_LINEMODE:
 | 
	
		
			
				|  |  | -    case TELOPT_NAWS:
 | 
	
		
			
				|  |  | -    case TELOPT_DISPLAY_POS:
 | 
	
		
			
				|  |  | -    case TELOPT_NEW_ENV_OPTION:
 | 
	
		
			
				|  |  | -    case TELOPT_TERMINAL_SPEED:
 | 
	
		
			
				|  |  | -    case TELOPT_TERMINAL_TYPE:
 | 
	
		
			
				|  |  | -    case TELOPT_STATUS:
 | 
	
		
			
				|  |  | -    case TELOPT_TOGGLE_FLOW_CONTROL:
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    case TELOPT_TIMING_MARK:
 | 
	
		
			
				|  |  | -    	xTimerStop(ts->RepeatSensorInfoTimer, 0);
 | 
	
		
			
				|  |  | -    	ts->flag_telnet_ip_option = true;
 | 
	
		
			
				|  |  | +		case TELOPT_TIMING_MARK:
 | 
	
		
			
				|  |  | +			xTimerStop(ts->RepeatSensorInfoTimer, 0);
 | 
	
		
			
				|  |  | +			ts->flag_telnet_ip_option = true;
 | 
	
		
			
				|  |  |  		sendopt(ts, TELNET_WILL, TELOPT_TIMING_MARK);
 | 
	
		
			
				|  |  |  		sendopt(ts, TELNET_MARK, 0);
 | 
	
		
			
				|  |  |  		if(ts->telnetState != TELNET_CHANGE_PWD && ts->telnetState != TELNET_CHANGE_PWD_ACK)
 | 
	
		
			
				|  |  |  			send( ts->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
 | 
	
		
			
				|  |  | -    	break;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    default:
 | 
	
		
			
				|  |  | -      if (code == TELNET_WILL || code == TELNET_WONT) {
 | 
	
		
			
				|  |  | -        sendopt(ts, TELNET_DONT, option);
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        sendopt(ts, TELNET_WONT, option);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		default:
 | 
	
		
			
				|  |  | +			if (code == TELNET_WILL || code == TELNET_WONT) {
 | 
	
		
			
				|  |  | +				sendopt(ts, TELNET_DONT, option);
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				sendopt(ts, TELNET_WONT, option);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void parseoptdat(telnetd_state_t *ts, int option, unsigned char *data, uint8_t len) {
 | 
	
	
		
			
				|  | @@ -421,19 +284,19 @@ static void parseoptdat(telnetd_state_t *ts, int option, unsigned char *data, ui
 | 
	
		
			
				|  |  |  	uint8_t subopt_val = 0;
 | 
	
		
			
				|  |  |  	uint8_t sub_opt_data[2] = {LINEMODE_MODE, LINEMODE_EDIT};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  switch (option) {
 | 
	
		
			
				|  |  | -    case TELOPT_NAWS:
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | +	switch (option) {
 | 
	
		
			
				|  |  | +		case TELOPT_NAWS:
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    case TELOPT_TERMINAL_SPEED:
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | +		case TELOPT_TERMINAL_SPEED:
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    case TELOPT_TERMINAL_TYPE:
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | -    case TELOPT_LINEMODE:
 | 
	
		
			
				|  |  | -    	subopt = data[0];
 | 
	
		
			
				|  |  | -    	switch (subopt) {
 | 
	
		
			
				|  |  | -		case LINEMODE_SLC:
 | 
	
		
			
				|  |  | +		case TELOPT_TERMINAL_TYPE:
 | 
	
		
			
				|  |  | +			break;
 | 
	
		
			
				|  |  | +		case TELOPT_LINEMODE:
 | 
	
		
			
				|  |  | +			subopt = data[0];
 | 
	
		
			
				|  |  | +			switch (subopt) {
 | 
	
		
			
				|  |  | +			case LINEMODE_SLC:
 | 
	
		
			
				|  |  |  			if(data[2] & LINEMODE_SLC_ACK){
 | 
	
		
			
				|  |  |  				return;
 | 
	
		
			
				|  |  |  			}
 | 
	
	
		
			
				|  | @@ -457,9 +320,9 @@ static void parseoptdat(telnetd_state_t *ts, int option, unsigned char *data, ui
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  			sendsubopt(ts, option, data, len);
 | 
	
		
			
				|  |  |  			break;
 | 
	
		
			
				|  |  | -    	}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  |  		break;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*-----------------------------------------------------------------------------------*/
 | 
	
	
		
			
				|  | @@ -467,31 +330,31 @@ static void newdata(telnetd_state_t *s)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	char c;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    c = s->buf[s->bufptr];
 | 
	
		
			
				|  |  | -    switch(s->state) {
 | 
	
		
			
				|  |  | -    case STATE_IAC:
 | 
	
		
			
				|  |  | -    	switch (c) {
 | 
	
		
			
				|  |  | -		  case TELNET_IAC:
 | 
	
		
			
				|  |  | -			s->state = STATE_NORMAL;
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | +	c = s->buf[s->bufptr];
 | 
	
		
			
				|  |  | +	switch(s->state) {
 | 
	
		
			
				|  |  | +	case STATE_IAC:
 | 
	
		
			
				|  |  | +		switch (c) {
 | 
	
		
			
				|  |  | +		case TELNET_IAC:
 | 
	
		
			
				|  |  | +		s->state = STATE_NORMAL;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		  case TELNET_WILL:
 | 
	
		
			
				|  |  | -		  case TELNET_WONT:
 | 
	
		
			
				|  |  | -		  case TELNET_DO:
 | 
	
		
			
				|  |  | -		  case TELNET_DONT:
 | 
	
		
			
				|  |  | -			s->code = c;
 | 
	
		
			
				|  |  | -			s->state = STATE_OPT;
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | +		case TELNET_WILL:
 | 
	
		
			
				|  |  | +		case TELNET_WONT:
 | 
	
		
			
				|  |  | +		case TELNET_DO:
 | 
	
		
			
				|  |  | +		case TELNET_DONT:
 | 
	
		
			
				|  |  | +		s->code = c;
 | 
	
		
			
				|  |  | +		s->state = STATE_OPT;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		  case TELNET_SB:
 | 
	
		
			
				|  |  | -			s->state = STATE_SB;
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | +		case TELNET_SB:
 | 
	
		
			
				|  |  | +		s->state = STATE_SB;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		  default:
 | 
	
		
			
				|  |  | -			s->state = STATE_NORMAL;
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | +		default:
 | 
	
		
			
				|  |  | +		s->state = STATE_NORMAL;
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  |  	case STATE_OPT:
 | 
	
		
			
				|  |  |  		parseopt(s, s->code, c);
 | 
	
		
			
				|  |  |  		s->state = STATE_NORMAL;
 | 
	
	
		
			
				|  | @@ -507,9 +370,9 @@ static void newdata(telnetd_state_t *s)
 | 
	
		
			
				|  |  |  		if (c == TELNET_SE && s->optdata[s->optlen-1] == TELNET_IAC) {
 | 
	
		
			
				|  |  |  			parseoptdat(s, s->code, s->optdata, (s->optlen-1));
 | 
	
		
			
				|  |  |  			s->state = STATE_NORMAL;
 | 
	
		
			
				|  |  | -		  //s->state = STATE_SE;
 | 
	
		
			
				|  |  | +			//s->state = STATE_SE;
 | 
	
		
			
				|  |  |  		} else if (s->optlen < sizeof(s->optdata)) {
 | 
	
		
			
				|  |  | -		  s->optdata[s->optlen++] = c;
 | 
	
		
			
				|  |  | +			s->optdata[s->optlen++] = c;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		break;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -517,14 +380,14 @@ static void newdata(telnetd_state_t *s)
 | 
	
		
			
				|  |  |  		if (c == TELNET_SE) parseoptdat(s, s->code, s->optdata, s->optlen);
 | 
	
		
			
				|  |  |  		s->state = STATE_NORMAL;
 | 
	
		
			
				|  |  |  		break;*/
 | 
	
		
			
				|  |  | -    case STATE_NORMAL:
 | 
	
		
			
				|  |  | -      if(c == TELNET_IAC) {
 | 
	
		
			
				|  |  | -    	  s->state = STATE_IAC;
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -    	  getchar(s);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +	case STATE_NORMAL:
 | 
	
		
			
				|  |  | +		if(c == TELNET_IAC) {
 | 
	
		
			
				|  |  | +			s->state = STATE_IAC;
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			cli_getchar(s, c);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		break;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -532,63 +395,63 @@ static void newdata(telnetd_state_t *s)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Stop server */
 | 
	
		
			
				|  |  |  static void stop_server(void) {
 | 
	
		
			
				|  |  | -    /* Clean up all of the sockets that are open */
 | 
	
		
			
				|  |  | -    for (int i = 0; i <= max_sd; ++i)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -       if (FD_ISSET(i, &master_set)) {
 | 
	
		
			
				|  |  | -          DBG printf("Close sock %d\n", i);
 | 
	
		
			
				|  |  | -          closesocket(i);
 | 
	
		
			
				|  |  | -          FD_CLR(i, &master_set);
 | 
	
		
			
				|  |  | -       }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    DBG printf("Portgw stopped\n");
 | 
	
		
			
				|  |  | +	/* Clean up all of the sockets that are open */
 | 
	
		
			
				|  |  | +	for (int i = 0; i <= max_sd; ++i)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		 if (FD_ISSET(i, &master_set)) {
 | 
	
		
			
				|  |  | +				DBG printf("Close sock %d\n", i);
 | 
	
		
			
				|  |  | +				closesocket(i);
 | 
	
		
			
				|  |  | +				FD_CLR(i, &master_set);
 | 
	
		
			
				|  |  | +		 }
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	DBG printf("Portgw stopped\n");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Start server */
 | 
	
		
			
				|  |  |  static bool start_server(uint16_t port)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    int res;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    lSocket = socket(PF_INET, SOCK_STREAM, 0);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (lSocket < 0) {
 | 
	
		
			
				|  |  | -      DBG printf("Socket create failed\r\n");
 | 
	
		
			
				|  |  | -      return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    res = fcntl(lSocket, F_SETFL, O_NONBLOCK);
 | 
	
		
			
				|  |  | -    if (res < 0) {
 | 
	
		
			
				|  |  | -        DBG printf("fcntl() failed");
 | 
	
		
			
				|  |  | -        closesocket(lSocket);
 | 
	
		
			
				|  |  | -        return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    memset(&sa, 0, sizeof(struct sockaddr_in));
 | 
	
		
			
				|  |  | -    sa.sin_family = AF_INET;
 | 
	
		
			
				|  |  | -    sa.sin_addr.s_addr = IPADDR_ANY;
 | 
	
		
			
				|  |  | -    sa.sin_port = htons(port);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (bind(lSocket, (struct sockaddr *)&sa, sizeof(sa)) == -1)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        DBG printf("Bind to port %d failed\n", port);
 | 
	
		
			
				|  |  | -        closesocket(lSocket);
 | 
	
		
			
				|  |  | -        return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    res = listen(lSocket, 20);
 | 
	
		
			
				|  |  | -    if (res < 0) {
 | 
	
		
			
				|  |  | -        DBG printf("Listen failed failed\r\n");
 | 
	
		
			
				|  |  | -        closesocket(lSocket);
 | 
	
		
			
				|  |  | -        return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    FD_ZERO(&master_set);
 | 
	
		
			
				|  |  | -    max_sd = lSocket;
 | 
	
		
			
				|  |  | -    FD_SET(lSocket, &master_set);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    DBG printf("Port %d opened\n", port);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return true;
 | 
	
		
			
				|  |  | +		int res;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		lSocket = socket(PF_INET, SOCK_STREAM, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (lSocket < 0) {
 | 
	
		
			
				|  |  | +			DBG printf("Socket create failed\r\n");
 | 
	
		
			
				|  |  | +			return false;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		res = fcntl(lSocket, F_SETFL, O_NONBLOCK);
 | 
	
		
			
				|  |  | +		if (res < 0) {
 | 
	
		
			
				|  |  | +				DBG printf("fcntl() failed");
 | 
	
		
			
				|  |  | +				closesocket(lSocket);
 | 
	
		
			
				|  |  | +				return false;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		memset(&sa, 0, sizeof(struct sockaddr_in));
 | 
	
		
			
				|  |  | +		sa.sin_family = AF_INET;
 | 
	
		
			
				|  |  | +		sa.sin_addr.s_addr = IPADDR_ANY;
 | 
	
		
			
				|  |  | +		sa.sin_port = htons(port);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (bind(lSocket, (struct sockaddr *)&sa, sizeof(sa)) == -1)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +				DBG printf("Bind to port %d failed\n", port);
 | 
	
		
			
				|  |  | +				closesocket(lSocket);
 | 
	
		
			
				|  |  | +				return false;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		res = listen(lSocket, 20);
 | 
	
		
			
				|  |  | +		if (res < 0) {
 | 
	
		
			
				|  |  | +				DBG printf("Listen failed failed\r\n");
 | 
	
		
			
				|  |  | +				closesocket(lSocket);
 | 
	
		
			
				|  |  | +				return false;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		FD_ZERO(&master_set);
 | 
	
		
			
				|  |  | +		max_sd = lSocket;
 | 
	
		
			
				|  |  | +		FD_SET(lSocket, &master_set);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		DBG printf("Port %d opened\n", port);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -598,30 +461,30 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 | 
	
		
			
				|  |  |  	struct sockaddr_in sLocalAddr;
 | 
	
		
			
				|  |  |  	struct sockaddr_in client_addr;
 | 
	
		
			
				|  |  |  	int new_sd;
 | 
	
		
			
				|  |  | -    int desc_ready, rc;
 | 
	
		
			
				|  |  | -    struct timeval timeout;
 | 
	
		
			
				|  |  | -    uint16_t port;
 | 
	
		
			
				|  |  | -    bool enabled;
 | 
	
		
			
				|  |  | -    bool firstrun = true;
 | 
	
		
			
				|  |  | +		int desc_ready, rc;
 | 
	
		
			
				|  |  | +		struct timeval timeout;
 | 
	
		
			
				|  |  | +		uint16_t port;
 | 
	
		
			
				|  |  | +		bool enabled;
 | 
	
		
			
				|  |  | +		bool firstrun = true;
 | 
	
		
			
				|  |  |  #ifdef HARDWARE_BT6709
 | 
	
		
			
				|  |  | -    struct sockaddr_in sa_temp;
 | 
	
		
			
				|  |  | -    socklen_t len;
 | 
	
		
			
				|  |  | +		struct sockaddr_in sa_temp;
 | 
	
		
			
				|  |  | +		socklen_t len;
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -    static int active_sd = -1;
 | 
	
		
			
				|  |  | -    static uint8_t cnt_conn = 0;
 | 
	
		
			
				|  |  | -    uint8_t cur_cnt = 0;
 | 
	
		
			
				|  |  | +		static int active_sd = -1;
 | 
	
		
			
				|  |  | +		static uint8_t cnt_conn = 0;
 | 
	
		
			
				|  |  | +		uint8_t cur_cnt = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    FD_ZERO(&master_set);
 | 
	
		
			
				|  |  | +		FD_ZERO(&master_set);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	timeout.tv_sec = 5;
 | 
	
		
			
				|  |  |  	timeout.tv_usec = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	( void ) pvParameters;
 | 
	
		
			
				|  |  |  	pcOutputString = FreeRTOS_CLIGetOutputBuffer();
 | 
	
		
			
				|  |  | -    enabled = sSettings.sTelnet.TelnetEnable;
 | 
	
		
			
				|  |  | -    port = ( uint16_t ) sSettings.sTelnet.port;
 | 
	
		
			
				|  |  | +		enabled = sSettings.sTelnet.TelnetEnable;
 | 
	
		
			
				|  |  | +		port = ( uint16_t ) sSettings.sTelnet.port;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    while (1) {
 | 
	
		
			
				|  |  | +		while (1) {
 | 
	
		
			
				|  |  |  		/* Check if network settings was changed */
 | 
	
		
			
				|  |  |  		if ((sSettings.sTelnet.port != port) ||
 | 
	
		
			
				|  |  |  				(sSettings.sTelnet.TelnetEnable != enabled) ||
 | 
	
	
		
			
				|  | @@ -765,20 +628,20 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 | 
	
		
			
				|  |  |  						}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #if TCP_DROP_PREV_CONNECTION
 | 
	
		
			
				|  |  | -                    /* Close previous active connection */
 | 
	
		
			
				|  |  | -                    if (active_sd != -1 && active_sd != new_sd) {
 | 
	
		
			
				|  |  | -                        DBG printf("  Close prev active connection %d\n", active_sd);
 | 
	
		
			
				|  |  | -                        close(active_sd);
 | 
	
		
			
				|  |  | -                        FD_CLR(active_sd, &master_set);
 | 
	
		
			
				|  |  | -                        if (active_sd == max_sd) {
 | 
	
		
			
				|  |  | -                            while (FD_ISSET(max_sd, &master_set) == false) {
 | 
	
		
			
				|  |  | -                                max_sd -= 1;
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    /* Mark new connection as active */
 | 
	
		
			
				|  |  | -                    active_sd = new_sd;
 | 
	
		
			
				|  |  | -                    DBG printf("  New active connection %d\n", active_sd);
 | 
	
		
			
				|  |  | +						/* Close previous active connection */
 | 
	
		
			
				|  |  | +						if (active_sd != -1 && active_sd != new_sd) {
 | 
	
		
			
				|  |  | +								DBG printf("	Close prev active connection %d\n", active_sd);
 | 
	
		
			
				|  |  | +								close(active_sd);
 | 
	
		
			
				|  |  | +								FD_CLR(active_sd, &master_set);
 | 
	
		
			
				|  |  | +								if (active_sd == max_sd) {
 | 
	
		
			
				|  |  | +										while (FD_ISSET(max_sd, &master_set) == false) {
 | 
	
		
			
				|  |  | +												max_sd -= 1;
 | 
	
		
			
				|  |  | +										}
 | 
	
		
			
				|  |  | +								}
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +						/* Mark new connection as active */
 | 
	
		
			
				|  |  | +						active_sd = new_sd;
 | 
	
		
			
				|  |  | +						DBG printf("	New active connection %d\n", active_sd);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  						/* Loop back up and accept another incoming   */
 | 
	
	
		
			
				|  | @@ -793,8 +656,8 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  					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;
 | 
	
		
			
				|  |  | +							//telnetState = auth_tlnt_srvr_param[cur_cnt].telnetState;
 | 
	
		
			
				|  |  | +							const user_level_t 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), "Администратор");
 | 
	
	
		
			
				|  | @@ -855,55 +718,21 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 | 
	
		
			
				|  |  |  						closesocket(i);
 | 
	
		
			
				|  |  |  						FD_CLR(i, &master_set);
 | 
	
		
			
				|  |  |  						if (i == max_sd) {
 | 
	
		
			
				|  |  | -						   while (FD_ISSET(max_sd, &master_set) == false) {
 | 
	
		
			
				|  |  | -							  max_sd -= 1;
 | 
	
		
			
				|  |  | -						   }
 | 
	
		
			
				|  |  | +							while (FD_ISSET(max_sd, &master_set) == false) {
 | 
	
		
			
				|  |  | +								max_sd -= 1;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  |  						}
 | 
	
		
			
				|  |  |  					}
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void telnet_server_init(void) {
 | 
	
		
			
				|  |  | -	for(uint8_t i = 0; i < NUMBER_TELNET_CONNECT; i++){
 | 
	
		
			
				|  |  | -		memset(auth_tlnt_srvr_param[i].buf, 0, cmdMAX_INPUT_SIZE);
 | 
	
		
			
				|  |  | -		memset(auth_tlnt_srvr_param[i].prev_cmd, 0, cmdMAX_INPUT_SIZE);
 | 
	
		
			
				|  |  | -		memset(auth_tlnt_srvr_param[i].optdata, 0, cmdMAX_INPUT_SIZE);
 | 
	
		
			
				|  |  | -		auth_tlnt_srvr_param[i].optlen = 0;
 | 
	
		
			
				|  |  | -		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;
 | 
	
		
			
				|  |  | -		auth_tlnt_srvr_param[i].flag_telnet_ip_option = false;
 | 
	
		
			
				|  |  | -		auth_tlnt_srvr_param[i].RepeatSensorInfoTimer = xTimerCreate("SensorInfoTmr", REPEAT_SENSOR_INFO_TIME, pdFALSE, ( void * ) i, SensorInfoTimerCallback);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	vRegisterCLICommands();
 | 
	
		
			
				|  |  |  	xTaskCreate(vBasicSocketsCommandInterpreterTask, ( char * ) "vBasicSocketsCommandInterpreterTask", 8*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void SensorInfoTimerCallback(TimerHandle_t pxTimer) {
 | 
	
		
			
				|  |  | -	portBASE_TYPE xReturned = pdTRUE;
 | 
	
		
			
				|  |  | -	uint8_t num_timer;
 | 
	
		
			
				|  |  | -	for(uint8_t i = 0; i < NUMBER_TELNET_CONNECT; i ++){
 | 
	
		
			
				|  |  | -		if(pxTimer == auth_tlnt_srvr_param[i].RepeatSensorInfoTimer){
 | 
	
		
			
				|  |  | -			num_timer = i;
 | 
	
		
			
				|  |  | -			break;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	do
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		/* Ensure there is not a string lingering in
 | 
	
		
			
				|  |  | -		the output buffer. */
 | 
	
		
			
				|  |  | -		pcOutputString[ 0 ] = 0x00;
 | 
	
		
			
				|  |  | -		xReturned = FreeRTOS_CLIProcessCommand( "sensor info", pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
 | 
	
		
			
				|  |  | -		send( auth_tlnt_srvr_param[num_timer].num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	} while( xReturned != pdFALSE );
 | 
	
		
			
				|  |  | -	xTimerStart(auth_tlnt_srvr_param[num_timer].RepeatSensorInfoTimer, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  )
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	portBASE_TYPE xReturn = pdTRUE;
 | 
	
	
		
			
				|  | @@ -938,39 +767,8 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_st
 | 
	
		
			
				|  |  |  		memset(password, 0, MAX_WEB_PASSWD_LEN);
 | 
	
		
			
				|  |  |  		len = strlen(s->buf);
 | 
	
		
			
				|  |  |  		strncpy(password, s->buf, len);
 | 
	
		
			
				|  |  | -		for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			GetUserLogin(user_id, WebLogin, &valueLen);
 | 
	
		
			
				|  |  | -			GetUserPassword(user_id, WebPassword, &valueLen);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			/* Check login and password */
 | 
	
		
			
				|  |  | -			if ((strncmp(WebLogin, s->login, MAX_WEB_LOGIN_LEN) == 0) &&
 | 
	
		
			
				|  |  | -				(strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -				/* Login and pass are valid */
 | 
	
		
			
				|  |  | -				s->telnet_code_auth = user_id;
 | 
	
		
			
				|  |  | -				s->login_err = 0;
 | 
	
		
			
				|  |  | -				strcpy( ( char * ) pcWriteBuffer, "\r\nАвторизация успешно пройдена\r\n>" );
 | 
	
		
			
				|  |  | -				s->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;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			else{
 | 
	
		
			
				|  |  | -				xReturn = pdFALSE;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +		user_id = cli_auth_user(s->login, password);
 | 
	
		
			
				|  |  | +		xReturn = user_id == MAX_USER_LEVELS ? pdFALSE : pdTRUE;
 | 
	
		
			
				|  |  |  		break;
 | 
	
		
			
				|  |  |  	default:
 | 
	
		
			
				|  |  |  		xReturn = pdFALSE;
 | 
	
	
		
			
				|  | @@ -995,63 +793,3 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_st
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return xReturn;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  )
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -	portBASE_TYPE xReturn = pdTRUE;
 | 
	
		
			
				|  |  | -	uint32_t len;
 | 
	
		
			
				|  |  | -	static char password[ MAX_WEB_PASSWD_LEN ] = { 0 };
 | 
	
		
			
				|  |  | -	char password2[ MAX_WEB_PASSWD_LEN ] = { 0 };
 | 
	
		
			
				|  |  | -	const int8_t * const pcNewPSWHeader = ( int8_t * ) "\r\nВведите повторно новый пароль:";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	len = strlen(s->buf);
 | 
	
		
			
				|  |  | -	if(s->telnetState == TELNET_CHANGE_PWD){
 | 
	
		
			
				|  |  | -		memset(password, 0, MAX_WEB_PASSWD_LEN);
 | 
	
		
			
				|  |  | -		if(len >= MAX_WEB_PASSWD_LEN){
 | 
	
		
			
				|  |  | -			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
 | 
	
		
			
				|  |  | -			s->telnetState = TELNET_CMD;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		else{
 | 
	
		
			
				|  |  | -			if(!control_string_en_digit(s->buf, len)){
 | 
	
		
			
				|  |  | -				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
 | 
	
		
			
				|  |  | -				s->telnetState = TELNET_CMD;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			else{
 | 
	
		
			
				|  |  | -				strncpy(password, s->buf, len);
 | 
	
		
			
				|  |  | -				strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcNewPSWHeader, strlen( ( char * ) pcNewPSWHeader ) );
 | 
	
		
			
				|  |  | -				s->telnetState = TELNET_CHANGE_PWD_ACK;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	else{
 | 
	
		
			
				|  |  | -		s->telnetState = TELNET_CHANGE_PWD;
 | 
	
		
			
				|  |  | -		memset(password2, 0, cmdMAX_INPUT_SIZE);
 | 
	
		
			
				|  |  | -		if(len >= MAX_WEB_LOGIN_LEN){
 | 
	
		
			
				|  |  | -			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
 | 
	
		
			
				|  |  | -			s->telnetState = TELNET_CMD;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		else{
 | 
	
		
			
				|  |  | -			strncpy(password2, s->buf, len);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -			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);
 | 
	
		
			
				|  |  | -				strcpy( ( char * ) pcWriteBuffer, "\r\nПароль успешно изменен\r\n>" );
 | 
	
		
			
				|  |  | -				s->telnetState = TELNET_CMD;
 | 
	
		
			
				|  |  | -				xReturn = pdTRUE;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -			else{
 | 
	
		
			
				|  |  | -				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
 | 
	
		
			
				|  |  | -				s->telnetState = TELNET_CMD;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return xReturn;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 |