@@ -142,6 +142,28 @@ void telnet_init (void) {
142142 telnet_data .state = E_TELNET_STE_DISABLED ;
143143}
144144
145+
146+ static int telnet_process_credential (char * credential , _i16 rxLen ) {
147+ telnet_data .rxWindex += rxLen ;
148+ if (telnet_data .rxWindex >= SERVERS_USER_PASS_LEN_MAX ) {
149+ telnet_data .rxWindex = SERVERS_USER_PASS_LEN_MAX ;
150+ }
151+
152+ uint8_t * p = telnet_data .rxBuffer + SERVERS_USER_PASS_LEN_MAX ;
153+ // if a '\r' is found, or the length exceeds the max username length
154+ if ((p = memchr (telnet_data .rxBuffer , '\r' , telnet_data .rxWindex )) || (telnet_data .rxWindex >= SERVERS_USER_PASS_LEN_MAX )) {
155+ uint8_t len = p - telnet_data .rxBuffer ;
156+
157+ telnet_data .rxWindex = 0 ;
158+ if ((len > 0 ) && (memcmp (credential , telnet_data .rxBuffer , MAX (len , strlen (credential ))) == 0 )) {
159+ return 1 ;
160+ }
161+ return -1 ;
162+ }
163+ return 0 ;
164+ }
165+
166+
145167void telnet_run (void ) {
146168 _i16 rxLen ;
147169 switch (telnet_data .state ) {
@@ -170,12 +192,14 @@ void telnet_run (void) {
170192 telnet_send_and_proceed ((void * )telnet_request_user , strlen (telnet_request_user ), E_TELNET_STE_SUB_GET_USER );
171193 break ;
172194 case E_TELNET_STE_SUB_GET_USER :
173- if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking (telnet_data .rxBuffer , TELNET_RX_BUFFER_SIZE , & rxLen )) {
174- // Skip /r/n
175- if (rxLen < 2 || memcmp (servers_user , (const char * )telnet_data .rxBuffer , MAX ((rxLen - 2 ), strlen (servers_user )))) {
176- telnet_data .credentialsValid = false;
195+ if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking (telnet_data .rxBuffer + telnet_data .rxWindex ,
196+ TELNET_RX_BUFFER_SIZE - telnet_data .rxWindex ,
197+ & rxLen )) {
198+ int result ;
199+ if ((result = telnet_process_credential (servers_user , rxLen ))) {
200+ telnet_data .credentialsValid = result > 0 ? true : false;
201+ telnet_data .substate .connected = E_TELNET_STE_SUB_REQ_PASSWORD ;
177202 }
178- telnet_data .substate .connected = E_TELNET_STE_SUB_REQ_PASSWORD ;
179203 }
180204 break ;
181205 case E_TELNET_STE_SUB_REQ_PASSWORD :
@@ -187,16 +211,17 @@ void telnet_run (void) {
187211 telnet_send_and_proceed ((void * )telnet_options_pass , sizeof (telnet_options_pass ), E_TELNET_STE_SUB_GET_PASSWORD );
188212 break ;
189213 case E_TELNET_STE_SUB_GET_PASSWORD :
190- if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking (telnet_data .rxBuffer , TELNET_RX_BUFFER_SIZE , & rxLen )) {
191- // skip /r/n
192- if (rxLen < 2 || memcmp (servers_pass , (const char * )telnet_data .rxBuffer , MAX ((rxLen - 2 ), strlen (servers_pass )))) {
193- telnet_data .credentialsValid = false;
194- }
195- if (telnet_data .credentialsValid ) {
196- telnet_data .substate .connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS ;
197- }
198- else {
199- telnet_data .substate .connected = E_TELNET_STE_SUB_INVALID_LOGGIN ;
214+ if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking (telnet_data .rxBuffer + telnet_data .rxWindex ,
215+ TELNET_RX_BUFFER_SIZE - telnet_data .rxWindex ,
216+ & rxLen )) {
217+ int result ;
218+ if ((result = telnet_process_credential (servers_pass , rxLen ))) {
219+ if ((telnet_data .credentialsValid = telnet_data .credentialsValid && (result > 0 ? true : false))) {
220+ telnet_data .substate .connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS ;
221+ }
222+ else {
223+ telnet_data .substate .connected = E_TELNET_STE_SUB_INVALID_LOGGIN ;
224+ }
200225 }
201226 }
202227 break ;
0 commit comments