balbekova 7 жил өмнө
parent
commit
d170a378f0

+ 40 - 13
modules/HTTP_Server/http_server.c

@@ -45,6 +45,7 @@ static void HTTP_SetUserCookie(char *str, uint8_t user_id);
 static void HTTP_UpdateUserLoginTime(uint8_t user_id);
 static void HTTP_ForceUserLogout(uint8_t user_id);
 void LogoutTimerCallback(TimerHandle_t pxTimer);
+void LoginTimerCallback(TimerHandle_t pxTimer);
 int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);
 
 SET_PAGE_t SET_PAGE = SET_PAGE_IDLE;
@@ -71,17 +72,19 @@ uint32_t log_post_reqn;
 /* Max user active sessions count */
 #define WEB_USER_MAX_SESSION_COUNT  5
 
-typedef struct {
-    char cookie[MAX_WEB_COOKIE_LEN];
-    TimerHandle_t LogoutTimer;
-} auth_session_t;
-
 struct {
     //auth_session_t session[WEB_USER_MAX_SESSION_COUNT];
     char cookie[MAX_WEB_COOKIE_LEN];
     TimerHandle_t LogoutTimer;
 } users[MAX_WEB_USERS];
 
+TimerHandle_t RepeatLoginTimer;
+
+/* Repeat Login timeout, 1 minutes */
+#define REPEAT_LOGIN_TIME  configTICK_RATE_HZ*60*1
+
+uint8_t cnt_err_psw = 0;
+
 bool Authenticated = false;
 
 /* Level of currently logged-in user */
@@ -1713,7 +1716,11 @@ void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t
   }
 }
 
-
+void LoginTimerCallback(TimerHandle_t pxTimer) {
+	cnt_err_psw = 0;
+	DBG printf("cnt_err_psw %d", cnt_err_psw);
+	xTimerStop(RepeatLoginTimer, 0);
+}
 
 /**
   * @brief  Проверка пароля для входа в Web
@@ -1784,7 +1791,13 @@ int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
 		            /* Login and pass are valid */
 
 	            /* TODO replace global flag with user-pass-cookie */
-		        	Authenticated = true;
+		        	if(cnt_err_psw < 4){
+		        		cnt_err_psw = 0;
+		        		Authenticated = true;
+		        	}
+		        	else{
+		        		Authenticated = false;
+		        	}
 		        	break;
 		        }
 		        else{
@@ -1843,11 +1856,24 @@ int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
 		  return SEND_REQUIRED_YES;
 	  }
 	  else{
+		  if(cnt_err_psw <= 4)
+				cnt_err_psw ++;
+			DBG printf("cnt_err_psw %d", cnt_err_psw);
+			if(cnt_err_psw == 4)
+				xTimerStart(RepeatLoginTimer, 0);
 		  strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type: text/html;\r\n\r\n");
-		  if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
-			  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/rslogin.html\" /></head><center><h2>Не правильный логин или пароль</h2></center></html>");
-		  else
-			  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Не правильный логин или пароль</h2></center></html>");
+		  if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){
+			  if(cnt_err_psw < 4)
+				  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/rslogin.html\" /></head><center><h2>Не правильный логин или пароль</h2></center></html>");
+			  else
+				  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/rslogin.html\" /></head><center><h2>Вход заблокирован!</h2></center></head><center><h2>Повторите попытку через 15 минут</h2></center></html>");
+		  }
+		  else{
+			  if(cnt_err_psw < 4)
+				  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Не правильный логин или пароль</h2></center></html>");
+			  else
+				  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Вход заблокирован!</h2></center></head><center><h2>Повторите попытку через 15 минут</h2></center></html>");
+		  }
 		  *lenBufOut = strlen(bufOut);
 		  return SEND_REQUIRED_NO;
 	  }
@@ -2808,9 +2834,9 @@ void ssl_server(void *pvParameters)
                     // check if last data packet 
                     if (TotalData == size)
                     {
-                       printf("State: Received %d bytes\r\n", (int)TotalData);
+                       DBG printf("State: Received %d bytes\r\n", (int)TotalData);
 
-                        printf("receive %s /r/n", sendBuf);
+                       DBG printf("receive %s /r/n", sendBuf);
                         strncat(sendBuf,  " ", 1);
                         HTTP_SetSettings(sendBuf, strlen(sendBuf));
 
@@ -3326,4 +3352,5 @@ void HTTPS_Init()
         users[user_id].LogoutTimer =
              xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
     }
+    RepeatLoginTimer = xTimerCreate("LoginTmr", REPEAT_LOGIN_TIME, pdFALSE, ( void * ) 0, LoginTimerCallback);
 }