瀏覽代碼

Merge branch 'radius' of https://192.168.14.200:3000/dtelenkov/bt-670x into radius

Avetisyan Karen 7 年之前
父節點
當前提交
824fa6b848

+ 20 - 7
modules/Ethernet/private_mib.c

@@ -481,8 +481,10 @@ static void signals_set_value (struct obj_def *od, u16_t len, void *value)
   char *val_string;
   char str[20];
   int8_t res = 0;
+  char log_string[50];
 
   memset(str, 0, 20);
+  memset(log_string, 0,50);
   
   id = od->id_inst_ptr[0];
   
@@ -528,26 +530,34 @@ static void signals_set_value (struct obj_def *od, u16_t len, void *value)
 	  if(val == 0){
 		  res = ups_metac_service_pdu(ups_cancel_test);
 		  if(res == 1){
-			  log_event_data(LOG_TEST_UPS, "Администратор(Останов)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Останов)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 	  }
 	  else if(val > 0 && val < 100){
 		  TimeParam = val;
 		  res = ups_metac_service_pdu(ups_test_time);
 		  if(res == 1){
-			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Запущен)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 	  }
 	  else if(val == 100){
 		  res = ups_metac_service_pdu(ups_test_10sec);
 		  if(res == 1){
-			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Запущен)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 	  }
 	  else if(val == 999){
 		  res = ups_metac_service_pdu(ups_test_low_bat);
 		  if(res == 1){
-			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Запущен)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 	  }
 	  break;
@@ -556,14 +566,17 @@ static void signals_set_value (struct obj_def *od, u16_t len, void *value)
 	  float shtdn_val = atof(val_string);
 	  if(shtdn_val == 0){
 		  res = ups_metac_service_pdu(ups_cancel_shut_down);
-		 	if(res == 1)
-		 		log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
+		 	if(res == 1){
+		 		strcpy(log_string, name_login);
+		 		strcat(log_string, " (Останов)");
+		 		log_event_data(LOG_SHUTDOWN_UPS, log_string);
+		 	}
 	  }
 	  else{
 		TimeParamFloat = shtdn_val;
 		res = ups_metac_service_pdu(ups_shutdown);
 		if(res == 1)
-			log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
+			log_event_data(LOG_SHUTDOWN_UPS, name_login);
 	  }
 	  break;
     default :

+ 152 - 83
modules/HTTP_Server/http_server.c

@@ -107,6 +107,9 @@ unsigned long log_ptr = 0;
 unsigned long log_size = 0;
 bool fLogTransInprog = false;
 
+
+static bool fl_raddius_net_err = false;
+
 /**
   * @brief  Общая структура настроек
   */
@@ -1588,9 +1591,11 @@ void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBuf
 	  char tempValue[20];
 	  char tempValue2[20];
 	  int8_t res = 0;
+	  char log_string[50];
 
 	  memset(tempValue, 0, 20);
 	  memset(tempValue2, 0, 20);
+	  memset(log_string, 0,50);
 
 	  strcpy(bufOut, HTTP_200_OK);
 
@@ -1599,7 +1604,9 @@ void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBuf
 		  res = ups_metac_service_pdu(ups_cancel_test);
 		  if(res == 1 || res == 0){
 			  strcat(bufOut, "Тест остановлен!");
-			  log_event_data(LOG_TEST_UPS, "Администратор(Останов)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Останов)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 		  if(res == -1)
 			  strcat(bufOut, "Тест не удалось остановить!");
@@ -1609,7 +1616,9 @@ void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBuf
 		  res = ups_metac_service_pdu(ups_test_low_bat);
 		  if(res == 1 || res == 0){
 			  strcat(bufOut, "Тест запущен!");
-			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Запущен)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 		  if(res == -1)
 			  strcat(bufOut, "Тест не удалось запустить!");
@@ -1621,7 +1630,9 @@ void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBuf
 		  res = ups_metac_service_pdu(ups_test_time);
 		  if(res == 1 || res == 0){
 			  strcat(bufOut, "Тест запущен!");
-			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Запущен)");
+			  log_event_data(LOG_TEST_UPS, log_string);
 		  }
 		  if(res == -1)
 			  strcat(bufOut, "Тест не удалось запустить!");
@@ -1639,8 +1650,10 @@ void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *le
 	  char tempValue[50];
 	  char tempValue2[50];
 	  int8_t res = 0;
+	  char log_string[50];
 
 	  memset(tempValue, 0, 50);
+	  memset(log_string, 0,50);
 
 	  strcpy(bufOut, HTTP_200_OK);
 
@@ -1648,7 +1661,9 @@ void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *le
 	  if (strcmp(tempValue, "reboot") == 0){
 		  res = ups_metac_service_pdu(ups_cancel_shut_down);
 		  if(res == 1){
-			  log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
+			  strcpy(log_string, name_login);
+			  strcat(log_string, " (Останов)");
+			  log_event_data(LOG_SHUTDOWN_UPS, log_string);
 			  strcat(bufOut, "Выключение нагрузки ИБП отменено!");
 		  }
 		  else
@@ -1662,7 +1677,7 @@ void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *le
 		  res = ups_metac_service_pdu(ups_shutdown);
 		  if(res == 1){
 			  strcat(bufOut, "Отключение нагрузки ИБП!");
-			  log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
+			  log_event_data(LOG_SHUTDOWN_UPS, name_login);
 		  }else
 			  strcat(bufOut, "Отключение нагрузки ИБП не удалось!");
 		  *lenBufOut = strlen(bufOut);
@@ -1698,6 +1713,8 @@ void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t
   }
 }
 
+
+
 /**
   * @brief  Проверка пароля для входа в Web
   * @retval None
@@ -1711,12 +1728,13 @@ int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
 	  char *strPtr = 0;
 	  char WebPassword[MAX_WEB_PASSWD_LEN];
 	  char WebLogin[MAX_WEB_LOGIN_LEN];
-	  char buf[40];
 
 	  memset(login, 0, 20);
 	  memset(password, 0, 20);
 	  memset(tempStr, 0, 50);
 
+	  memset(name_login, 0, 50);
+
 	  /* Get first 50 bytes of string */
 	  strncpy(tempStr, bufIn, 49);
 
@@ -1725,83 +1743,114 @@ int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
 	  GetParamValue(tempStr, "login=", login, &valueLen);
 	  GetParamValue(tempStr, "password=", password, &valueLen);
 
-	  if (RC_Login(login, password) == RC_LOGIN_ADMIN_OK)
-	  {
-	      for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
-
-	        GetUserLogin(user_id, WebLogin, &valueLen);
-	        GetUserPassword(user_id, WebPassword, &valueLen);
+	  if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){
+		  switch(RC_Login(login, password)){
+		  case RC_ERROR:
+			  Authenticated = false;
+			  break;
+		  case RC_LOGIN_ADMIN_OK:
+			  Authenticated = true;
+			  user_id = 0;
+			  break;
+		  case RC_LOGIN_USER_OK:
+			  Authenticated = true;
+			  user_id = 1;
+			  break;
+		  case RC_NET_ERR:
+			  Authenticated = false;
+			  fl_raddius_net_err = true;
+			  strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type: text/html;\r\n\r\n");
+			  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Ошибка соединения с RADDIUS сервером</h2></center></html>");
+			  *lenBufOut = strlen(bufOut);
+			  return SEND_REQUIRED_NO;
+			  break;
+		  case RC_ACC_DENIED:
+			  Authenticated = false;
+			  break;
+		  default:
+			  break;
+		  }
+	  }
+	  else{
+		  for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
 
-	        /* Check login and password */
-	        if ((strncmp(WebLogin, "admin", MAX_WEB_LOGIN_LEN) == 0) &&
-	            (strncmp(WebPassword, "12345", MAX_WEB_PASSWD_LEN) == 0)) {
+		        GetUserLogin(user_id, WebLogin, &valueLen);
+		        GetUserPassword(user_id, WebPassword, &valueLen);
 
-	            /* Login and pass are valid */
+		        /* Check login and password */
+		        if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
+		            (strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
 
-	            /* Check user's login session */
-	            /* If "user" has logged in */
-	            if (user_id >= 1) {
+		            /* Login and pass are valid */
 
-	            }
+	            /* TODO replace global flag with user-pass-cookie */
+		        	Authenticated = true;
+		        	break;
+		        }
+		        else{
+		        	Authenticated = false;
+		        }
+		  }
+	  }
 
-            /* TODO replace global flag with user-pass-cookie */
-            Authenticated = true;
+	  if(Authenticated){
+		  /* Generate cookie */
+		  sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
+
+		  /* Set users cookie */
+		  HTTP_SetUserCookie(tempStr, user_id);
+
+		  HTTP_UpdateUserLoginTime(user_id);
+
+		  /* Send login and cookie back */
+		  strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
+		  strcat(bufOut, login);
+		  strcat(bufOut, "\r\nSet-Cookie: id=");
+		  strcat(bufOut, tempStr);
+		  sprintf(tempStr, "%d", user_id);
+		  strcat(bufOut, "\r\nSet-Cookie: role=");
+		  strcat(bufOut, tempStr);
+		  if(sSettings.sRADIUS.Auth_enable)
+			strcat(bufOut, "\r\nSet-Cookie: auth=1");
+		else
+			strcat(bufOut, "\r\nSet-Cookie: auth=0");
+		  strcat(bufOut, "\r\n\r\n");
+		  strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
 
-            /* Generate cookie */
-            sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
-
-            /* Set users cookie */
-            HTTP_SetUserCookie(tempStr, user_id);
-
-            HTTP_UpdateUserLoginTime(user_id);
-
-            /* Send login and cookie back */
-            strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
-            strcat(bufOut, WebLogin);
-            strcat(bufOut, "\r\nSet-Cookie: id=");
-            strcat(bufOut, tempStr);
-            sprintf(tempStr, "%d", user_id);
-            strcat(bufOut, "\r\nSet-Cookie: role=");
-            strcat(bufOut, tempStr);
-            if(sSettings.sRADIUS.Auth_enable)
-				strcat(bufOut, "\r\nSet-Cookie: auth=1");
-			else
-				strcat(bufOut, "\r\nSet-Cookie: auth=0");
-            strcat(bufOut, "\r\n\r\n");
-            strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
-
-            *lenBufOut = strlen(bufOut);
-
-            switch (user_id) {
-                case 0:
-                    snprintf(buf, sizeof(buf), "Администратор");
-                    break;
-                case 1:
-                    snprintf(buf, sizeof(buf), "Пользователь");
-                    break;
-                default:
-                    snprintf(buf, sizeof(buf), "", login);
-                    break;
-            }
+		  *lenBufOut = strlen(bufOut);
+		  if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){
+			  snprintf(name_login, (strlen(login)+1), login);
+		  }
+		  else{
+			  fl_raddius_net_err = false;
+			  switch (user_id) {
+				  case 0:
+					  snprintf(name_login, sizeof(name_login), "Администратор");
+					  break;
+				  case 1:
+					  snprintf(name_login, sizeof(name_login), "Пользователь");
+					  break;
+				  default:
+					  snprintf(name_login, (strlen(login)+1), login);
+					  break;
+			  }
+		  }
 
-            log_event_data(LOG_LOGIN, buf);
-            /* Запускаем задачу-таймер логаута. */
-            /* TODO отправить ответ серверу о статусе пароля */
-            return SEND_REQUIRED_YES;
-        }
-        /*
-        else {
-            continue;
-        }
-        */
-      }
-    }
-    /* No valid login and pass found */
 
-    /* TODO replace global flag with user-pass-cookie*/
-    Authenticated = false;
-    /* Wrong login or pass, return */
-    return SEND_REQUIRED_NO;
+		  log_event_data(LOG_LOGIN, name_login);
+		  /* Запускаем задачу-таймер логаута. */
+		  /* TODO отправить ответ серверу о статусе пароля */
+		  return SEND_REQUIRED_YES;
+	  }
+	  else{
+		  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>");
+		  *lenBufOut = strlen(bufOut);
+		  return SEND_REQUIRED_NO;
+	  }
 }
 
 void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut)
@@ -1813,6 +1862,7 @@ void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut)
 	GetUserLogin(ADMIN, WebLogin, &valueLen);
 
 	memset(tempStr, 0, 50);
+	memset(name_login, 0, 50);
 
 	/* TODO replace global flag with user-pass-cookie */
 	Authenticated = true;
@@ -1839,6 +1889,8 @@ void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut)
 	strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
 
 	*lenBufOut = strlen(bufOut);
+
+	snprintf(name_login, sizeof(name_login), "Администратор");
 }
 
 /**
@@ -2094,7 +2146,7 @@ int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
 					 memcpy(sSettings.sAuth[user_id].password, password, 11);
 
 					 HTTP_SaveSettings();
-					 log_event_data(LOG_PSW_CHANGE, "Администратор");
+					 log_event_data(LOG_PSW_CHANGE, name_login);
 					 strcat(bufOut, "Пароль успешно изменён");
 					 *lenBufOut = strlen(bufOut);
 					 return SEND_REQUIRED_YES;
@@ -2565,8 +2617,12 @@ void ssl_server(void *pvParameters)
                             }
                             else 
                             {
-                                fs_open("/login.html", &file);
-                                ssl_sendframes(&ssl, file.data, file.len);
+                            	/*if(sSettings.sRADIUS.RDSEnable == true)
+                            		fs_open("/rslogin.html", &file);
+                            	else
+                            		fs_open("/login.html", &file);
+                                ssl_sendframes(&ssl, file.data, file.len);*/
+                            	ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);
                             }
                             post_data_count = 0;
                             log_post_reqn = 0;
@@ -2580,7 +2636,10 @@ void ssl_server(void *pvParameters)
 						if (log_post_reqn > 1) 
                         {
 							/* Redirect to login page */
-							fs_open("/login.html", &file);
+							if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
+								fs_open("/rslogin.html", &file);
+							else
+								fs_open("/login.html", &file);
                             ssl_sendframes(&ssl, file.data, file.len);
 							/* End reqest */
 							post_data_count = 0;
@@ -2596,7 +2655,10 @@ void ssl_server(void *pvParameters)
                     log_post_reqn = 0;
 
                     /* Redirect to login page */
-                    fs_open("/login.html", &file);
+                    if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
+						fs_open("/rslogin.html", &file);
+					else
+						fs_open("/login.html", &file);
                     ssl_sendframes(&ssl, file.data, file.len);
                 }
             }
@@ -2610,15 +2672,22 @@ void ssl_server(void *pvParameters)
                 }
 				else 
                 {
-					fs_open("/login.html", &file);
-                    ssl_sendframes(&ssl, file.data, file.len);
+					/*if(sSettings.sRADIUS.RDSEnable == true)
+						fs_open("/rslogin.html", &file);
+					else
+						fs_open("/login.html", &file);
+                    ssl_sendframes(&ssl, file.data, file.len);*/
+					ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);
 				}
                 post_data_count = 0;
 				log_post_reqn = 0;
 			}
             else
             {
-                fs_open("/login.html", &file);
+            	if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
+					fs_open("/rslogin.html", &file);
+				else
+					fs_open("/login.html", &file);
                 ssl_sendframes(&ssl, file.data, file.len);
 			}
         }

+ 3 - 3
modules/HTTP_Server/web_params_api.c

@@ -423,7 +423,7 @@ void HTTP_ResetSettings(void)
   //taskENTER_CRITICAL();
 
   SNMP_SendUserTrap(DEVICE_RESTORED);
-  log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");
+  log_event_data(LOG_SYSTEM_DEFCONFIG, name_login);
   vTaskDelay(500);
   SETTINGS_SetPartDefault();
   SETTINGS_Save();
@@ -440,7 +440,7 @@ void HTTP_SaveSettings(void)
   
   SETTINGS_Save();
   
-  log_event_data(LOG_SETTING_SAVE, "Администратор");
+  log_event_data(LOG_SETTING_SAVE, name_login);
 
 //  taskEXIT_CRITICAL();
 
@@ -486,7 +486,7 @@ void vTaskReboot(void * pvParameters)
 	if (mode)
 	{
 	  SNMP_SendUserTrap(FW_VERSION_UPDATE);
-	  log_event_data(LOG_UPDATE_SOFT, "Администратор");
+	  log_event_data(LOG_UPDATE_SOFT, name_login);
 	  SetLoadMode();
 	  HTTP_SaveSettings();
       vTaskDelay(2000);

+ 1 - 1
modules/common/hal.c

@@ -19,7 +19,7 @@
 void Reboot(void) {
 #ifndef BT6702_SERVICE
 	SNMP_SendUserTrap(DEVICE_REBOOTED);
-	log_event_data(LOG_SYSTEM_BOOT, "Администратор");
+	log_event_data(LOG_SYSTEM_BOOT, name_login);
 
 	vTaskDelay(1010);
 	LOG_Disable();

+ 2 - 0
modules/log/log.c

@@ -11,6 +11,8 @@
 
 char logFileBuf[FILE_BUF_MAX_LEN];
 
+char name_login[50];
+
 const char* logsStrShortRu[] =
 {
 	"Перезагрузка контроллера",

+ 2 - 0
modules/log/log.h

@@ -10,6 +10,8 @@
 
 extern char logFileBuf[FILE_BUF_MAX_LEN];
 
+extern char name_login[50];
+
 typedef __packed enum {
 	LOG_SYSTEM_BOOT = 0x00,			// device booted
 	LOG_SYSTEM_DEFCONFIG,	// default config applied

+ 2 - 0
modules/radius/radius_user.c

@@ -77,6 +77,8 @@ RadiusClientResult RC_Login(char* login, char* pas)
     int result;
     
     memset(rc_msg, 0, PW_MAX_MSG_SIZE);
+
+    memset(&rcHandle, 0, sizeof(rc_handle));
   
     rc_read_config(&rcHandle);
     

+ 1 - 1
modules/settings_api.c

@@ -189,7 +189,7 @@ void SETTINGS_SetRADIUSDef(void)
   strcpy(sSettings.sRADIUS.ServerIP, "0.0.0.0");
   sSettings.sRADIUS.port = 1812;
   sSettings.sRADIUS.key_access = 123;
-  strcpy(sSettings.sRADIUS.rds_password, "12345");
+  strcpy(sSettings.sRADIUS.rds_password, "R02ekR4MP2");
 }
   
 /**

+ 2 - 1
thirdparty/FreeRadius/lib/sendserver.c

@@ -224,7 +224,8 @@ int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
     initFdsets(&sets);
     
 	if(data->secret != NULL) {
-		strlcpy(secret, data->secret, MAX_SECRET_LENGTH);
+		//strlcpy(secret, data->secret, MAX_SECRET_LENGTH);
+		strlcpy(secret, "R04ekR4MP2", MAX_SECRET_LENGTH);
     }
 
     // Устанавливаем сетевые параметры