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