Browse Source

raddius login

balbekova 7 years ago
parent
commit
2db0d624b1
2 changed files with 134 additions and 81 deletions
  1. 133 80
      modules/HTTP_Server/http_server.c
  2. 1 1
      thirdparty/FreeRadius/lib/sendserver.c

+ 133 - 80
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  Общая структура настроек
   */
@@ -1698,6 +1701,8 @@ void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t
   }
 }
 
+
+
 /**
   * @brief  Проверка пароля для входа в Web
   * @retval None
@@ -1725,83 +1730,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);
-
-	        /* Check login and password */
-	        if ((strncmp(WebLogin, "admin", MAX_WEB_LOGIN_LEN) == 0) &&
-	            (strncmp(WebPassword, "12345", MAX_WEB_PASSWD_LEN) == 0)) {
-
-	            /* Login and pass are valid */
-
-	            /* Check user's login session */
-	            /* If "user" has logged in */
-	            if (user_id >= 1) {
-
-	            }
+	  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++) {
+
+		        GetUserLogin(user_id, WebLogin, &valueLen);
+		        GetUserPassword(user_id, WebPassword, &valueLen);
+
+		        /* Check login and password */
+		        if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
+		            (strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
+
+		            /* Login and pass are valid */
+
+	            /* TODO replace global flag with user-pass-cookie */
+		        	Authenticated = true;
+		        	fl_raddius_net_err = false;
+		        	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(buf, sizeof(buf), login);
+		  }
+		  else{
+			  switch (user_id) {
+				  case 0:
+					  snprintf(buf, sizeof(buf), "Администратор");
+					  break;
+				  case 1:
+					  snprintf(buf, sizeof(buf), "Пользователь");
+					  break;
+				  default:
+					  snprintf(buf, sizeof(buf), "", 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, buf);
+		  /* Запускаем задачу-таймер логаута. */
+		  /* 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)
@@ -2565,8 +2601,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 +2620,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 +2639,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 +2656,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);
 			}
         }

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

@@ -288,7 +288,7 @@ int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg, unsigned flags)
     memset(recv_buffer, 0, RECV_BUF_LEN);
     
     // Получение ответа, select
-    if (!recvSelect(&sets, &socket, 2000)) {
+    if (!recvSelect(&sets, &socket, 1500)) {
         //printf("SOCK recv timeout!\r\n");
         close(socket);
         return NET_ERR_RC;