balbekova пре 7 година
родитељ
комит
b109abd2b1
1 измењених фајлова са 126 додато и 218 уклоњено
  1. 126 218
      modules/HTTP_Server/http_server.c

+ 126 - 218
modules/HTTP_Server/http_server.c

@@ -1760,7 +1760,7 @@ int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *l
 			  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>");
+			  strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Ошибка соединения с RADIUS сервером</h2></center></html>");
 			  *lenBufOut = strlen(bufOut);
 			  return SEND_REQUIRED_NO;
 			  break;
@@ -2341,6 +2341,45 @@ static int my_set_session(ssl_context *ssl)
   return(0);
 }
 
+void ssl_server_read(void)
+{
+	int ret;
+
+    do
+    {
+        receivedBufLen = RECIVE_BUF_MAX_LEN - 1;
+        memset(receiveBuf, 0, RECIVE_BUF_MAX_LEN);
+
+        // Read decrypted application data
+        ret = ssl_read(&ssl, (unsigned char*)receiveBuf, receivedBufLen);
+
+        if(ret == POLARSSL_ERR_NET_WANT_READ || ret == POLARSSL_ERR_NET_WANT_WRITE)
+            continue;
+
+        if(ret <= 0)
+        {
+            switch(ret)
+            {
+            case POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY:
+                printf("\n\r connection was closed \n");
+            break;
+
+            case POLARSSL_ERR_NET_CONN_RESET:
+                printf("\n\r connection was reset by peer\n");
+            break;
+
+            default:
+                //printf("\n\r ssl_read returned %d\n", ret);
+            break;
+            }
+            break;
+        }
+        receivedBufLen = ret;
+        // Display the length of read data
+        //printf("\n\r Successfully read %d bytes from client \n\r",len);
+    }while(0);
+}
+
 /**
   * @brief  SSL Server task.
   * @param  pvParameters not used
@@ -2359,7 +2398,7 @@ void ssl_server(void *pvParameters)
     char name[MAX_WEB_COOKIE_LEN];
     char id[MAX_WEB_COOKIE_LEN];
     uint8_t nameLen = 0, idLen = 0;
-    uint32_t DataOffset;
+    char *DataOffset;
     struct fs_file file = {0, 0};
     uint32_t i;
     
@@ -2469,39 +2508,7 @@ void ssl_server(void *pvParameters)
 
         // 6. Read the HTTP Request 
         //printf("\n\r <= Read from client :");
-        do
-        {
-            receivedBufLen = RECIVE_BUF_MAX_LEN - 1;
-            memset(receiveBuf, 0, RECIVE_BUF_MAX_LEN);
-
-            // Read decrypted application data 
-            ret = ssl_read(&ssl, (unsigned char*)receiveBuf, receivedBufLen);
-
-            if(ret == POLARSSL_ERR_NET_WANT_READ || ret == POLARSSL_ERR_NET_WANT_WRITE)
-                continue;
-
-            if(ret <= 0)
-            {
-                switch(ret)
-                {
-                case POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY:
-                    printf("\n\r connection was closed \n");
-                break;
-
-                case POLARSSL_ERR_NET_CONN_RESET:
-                    printf("\n\r connection was reset by peer\n");
-                break;
-
-                default:
-                    //printf("\n\r ssl_read returned %d\n", ret);
-                break;
-                }
-                break;
-            }
-            receivedBufLen = ret;
-            // Display the length of read data 
-            //printf("\n\r Successfully read %d bytes from client \n\r",len);
-        }while(0);
+        ssl_server_read();
 
     // -------------------------------------------------------------------------
         
@@ -2532,7 +2539,6 @@ void ssl_server(void *pvParameters)
         // Id of currently logged-in user 
         uint8_t user_id;
         
-        if( DataFlag == 0 && DataFlag2 == 0) {
         // Level of currently logged-in user 
         seclevel = 0xFF;
         for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
@@ -2545,13 +2551,7 @@ void ssl_server(void *pvParameters)
             Authenticated = false;
             seclevel = 0xFF;
         }
-        }
-        if (DataFlag >= 1)
-            Authenticated = true;
-        else if(DataFlag2 >= 1)
-            Authenticated = true;
 
-       
         if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
         {
             HTTP_LOGIN(sendBuf, &sendBufLoadLen);
@@ -2579,38 +2579,38 @@ void ssl_server(void *pvParameters)
                 fs_open("/role.js", &file);
                 ssl_sendframes(&ssl, file.data, file.len);
             }
-            else if ((strncmp(receiveBuf, "POST /login.cgi", 15) == 0) || (log_post_reqn > 0))
+            else if (strncmp(receiveBuf, "POST /login.cgi", 15) == 0)
             {
-                uint32_t i, offset = 0, req_data_received = 0;
+                uint32_t req_data_received = 0;
+                char *offset;
+
+                offset = 0;
                 
                 post_data_count = Parse_Content_Length(receiveBuf, receivedBufLen);
 			  
                 if (post_data_count < MAX_POST_REQ_LEN) 
                 {
                     memset(post_req_data, 0, MAX_POST_REQ_LEN);
-					
-					for (i = 0; i < receivedBufLen; i++)
-					{
-						if (strncmp ((char*)(receiveBuf+i), "\r\n\r\n", 4) == 0)
-						{
-							offset = i+4;
-							break;
-						}
-					}
 
-					req_data_received = receivedBufLen - offset;
-					
+                    offset = (strstr(receiveBuf, "\r\n\r\n")) + 4;
+                    req_data_received = receivedBufLen - (offset - &receiveBuf[0]);
+
 					if (offset != 0) 
                     {
                         if (req_data_received < post_data_count) 
                         {
                             snprintf(post_req_data, req_data_received, "%s", receiveBuf);
                             post_data_count -= req_data_received;
+
+                            ssl_server_read();
+
+                            offset = receiveBuf;
                         }
-                        else 
+
+                        if(strlen(receiveBuf) != 0)
                         {
-                            strncat(post_req_data, (char *)(receiveBuf + offset), post_data_count);
-						
+
+                            strncat(post_req_data, offset, post_data_count);
                             if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES) 
                             {
                                 ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);
@@ -2625,26 +2625,29 @@ void ssl_server(void *pvParameters)
                             	ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);
                             }
                             post_data_count = 0;
-                            log_post_reqn = 0;
+                        }
+                        else{
+    						/* Redirect to login page */
+    						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;
                         }
 					}
 					/* request was fragmented before "\r\n\r\n" */
 					else 
                     {
-						log_post_reqn++;
-						/* wait max 2 requests */
-						if (log_post_reqn > 1) 
-                        {
-							/* Redirect to login page */
-							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;
-							log_post_reqn = 0;
-						}
+						/* Redirect to login page */
+						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;
 					}
                 }
                 else 
@@ -2652,7 +2655,6 @@ void ssl_server(void *pvParameters)
                     //printf("Too long POST request!\r\n");
                     /* Ignore request */
                     post_data_count = 0;
-                    log_post_reqn = 0;
 
                     /* Redirect to login page */
                     if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
@@ -2771,86 +2773,47 @@ void ssl_server(void *pvParameters)
                 {
                     DataOffset = 0;
 
+
                     // POST Packet received 
-                    if (DataFlag2 == 0)
-                    {
-                        BrowserFlag = 0;
-                        TotalReceived = 0;
-                        memset(sendBuf, 0, strlen(sendBuf));
 
-                        // parse packet for Content-length field 
-                        size = Parse_Content_Length(receiveBuf, receivedBufLen);
+					TotalReceived = 0;
+					TotalData = 0;
+					memset(sendBuf, 0, strlen(sendBuf));
 
-                        // parse packet for the octet-stream field 
-                        for (i = 0; i < receivedBufLen; i++)
-                        {
-                            if (strncmp ((char*)(receiveBuf+i), "managerIP", 8)==0)
-                            {
-                                DataOffset = i;
-                                break;
-                            }
-                        }     
-                        /* case of MSIE8 : we do not receive data in the POST packet*/
-                        if (DataOffset == 0)
-                        {
-                            DataFlag2++;
-                            BrowserFlag = 1;
-                            //pbuf_free(p);
-                            return;
-                        }
-                        // case of Mozilla Firefox v3.6 : we receive data in the POST packet
-                        else
-                        {
-                            //TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
-                            TotalReceived = receivedBufLen - DataOffset;
-                        }
-                    }
-                    if (((DataFlag2 ==1)&&(BrowserFlag==1)) || ((DataFlag2 ==0)&&(BrowserFlag==0)))
-                    {
-                        if ((DataFlag2 ==0)&&(BrowserFlag==0))
-                        {
-                            DataFlag2++;
-                        }
-                        else if ((DataFlag2 ==1)&&(BrowserFlag==1))
-                        {
-                        // parse packet for the octet-stream field */
-                            for (i = 0; i < receivedBufLen; i++)
-                            {
-                                if (strncmp ((char*)(receiveBuf+i), "managerIP", 8)==0)
-                                {
-                                    DataOffset = i;
-                                    break;
-                                }
-                            }
-                            TotalReceived += receivedBufLen;
-                            DataFlag2++;
-                        }
-                        TotalData = 0;
-                    }
-                    // DataFlag >1 => the packet is data only  
-                    else
-                    {
-                        TotalReceived +=receivedBufLen;
-                    }
+					// parse packet for Content-length field
+					size = Parse_Content_Length(receiveBuf, receivedBufLen);
+
+					DataOffset = strstr(receiveBuf, "managerIP");
+
+					/* case of MSIE8 : we do not receive data in the POST packet*/
+					if (DataOffset == 0)
+					{
+						ssl_server_read();
+						DataOffset = strstr(receiveBuf, "managerIP");
+					}
 
-                    ptr = (char*)(receiveBuf + DataOffset);
-                    receivedBufLen-= DataOffset;
+					TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
 
-                    // update Total data received counter 
-                    TotalData +=receivedBufLen;
+					TotalData += TotalReceived;
+
+					strncat(sendBuf,  DataOffset, TotalReceived);
+
+					for(i  = TotalData; i < size; i ++)
+					{
+						ssl_server_read();
+						strncat(sendBuf,  DataOffset, receivedBufLen);
+						TotalData += receivedBufLen;
+					}
 
                     // check if last data packet 
-                    if (TotalReceived == size)
+                    if (TotalData == size)
                     {
-                        //DBG printf("State: Received %d bytes\r\n", (int)TotalReceived);
+                       printf("State: Received %d bytes\r\n", (int)TotalData);
 
-                        strncat(sendBuf,  ptr, receivedBufLen);
+                        printf("receive %s /r/n", sendBuf);
                         strncat(sendBuf,  " ", 1);
-                        //ВBG printf("receive %s /r/n", sendBuf);
                         HTTP_SetSettings(sendBuf, strlen(sendBuf));
 
-                        DataFlag2=0;
-                        BrowserFlag = 0;
                         memset(sendBuf, 0, size);
 
                         strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
@@ -2860,16 +2823,6 @@ void ssl_server(void *pvParameters)
                         sendBufLoadLen = strlen(sendBuf);
                         ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);
                     }
-                    // not last data packet 
-                    else
-                    {
-                        // write data in flash 
-                        if(receivedBufLen)
-                        {
-                            strncat(sendBuf,  ptr, receivedBufLen);
-                            //memcpy(receiveBufTemp, ptr, receivedBufLen);
-                        }
-                    }
                 }  
             } 
             else if (strncmp(receiveBuf, "GET /info.cgi", 13) == 0) // +
@@ -2883,80 +2836,35 @@ void ssl_server(void *pvParameters)
             {
                 if (seclevel == 0) 
                 {
-                    DataOffset = 0;
+                	 DataOffset = 0;
 
-                    // POST Packet received 
-                    if (DataFlag == 0)
-                    {
-                        BrowserFlag = 0;
-                        TotalReceived = 0;
-                        memset(sendBuf, 0, strlen(sendBuf));
+					// POST Packet received
 
-                        // parse packet for Content-length field 
-                        size = Parse_Content_Length(receiveBuf, receivedBufLen);
+					TotalReceived = 0;
+					TotalData = 0;
+					memset(sendBuf, 0, strlen(sendBuf));
 
-                        // parse packet for the octet-stream field 
-                        for (i = 0; i < receivedBufLen; i++)
-                        {
-                            if (strncmp ((char*)(receiveBuf+i), "owner", 5)==0)
-                            {
-                                DataOffset = i;
-                                break;
-                            }
-                        }
-                        // case of MSIE8 : we do not receive data in the POST packet
-                        if (DataOffset == 0)
-                        {
-                            DataFlag++;
-                            BrowserFlag = 1;
-                            //pbuf_free(p);
-                            return;
-                        }
-                        // case of Mozilla Firefox v3.6 : we receive data in the POST packet*/
-                        else
-                        {
-                            //TotalReceived = receivedBufLen - (ContentLengthOffset + 4);
-                            TotalReceived = receivedBufLen - DataOffset;
-                        }
-                    }
-                    if (((DataFlag ==1)&&(BrowserFlag==1)) || ((DataFlag ==0)&&(BrowserFlag==0)))
-                    {
-                        if ((DataFlag ==0)&&(BrowserFlag==0))
-                        {
-                            DataFlag++;
-                        }
-                        else if ((DataFlag ==1)&&(BrowserFlag==1))
-                        {
-                            // parse packet for the octet-stream field */
-                            for (i = 0; i < receivedBufLen; i++)
-                            {
-                                if (strncmp ((char*)(receiveBuf+i), "owner", 5)==0)
-                                {
-                                    DataOffset = i;
-                                    break;
-                                }
-                            }
-                            TotalReceived += receivedBufLen;
-                            DataFlag++;
-                        }
-                        TotalData =0 ;
-                    }
-                    // DataFlag >1 => the packet is data only  
-                    else
-                    {
-                        TotalReceived +=receivedBufLen;
-                    }
-    
-                    ptr = (char*)(receiveBuf + DataOffset);
-                    receivedBufLen-= DataOffset;
+					// parse packet for Content-length field
+					size = Parse_Content_Length(receiveBuf, receivedBufLen);
+
+					DataOffset = strstr(receiveBuf, "owner");
+
+					/* case of MSIE8 : we do not receive data in the POST packet*/
+					if (DataOffset == 0)
+					{
+						ssl_server_read();
+						DataOffset = strstr(receiveBuf, "owner");
+					}
+
+					TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
+
+					TotalData += TotalReceived;
 
-                    // update Total data received counter 
-                    TotalData +=receivedBufLen;
+					strncat(sendBuf,  DataOffset, TotalReceived);
 
                     // check if last data packet 
                     if (TotalReceived == size)
                     {
-                        strncat(sendBuf,  ptr, receivedBufLen);
                         strncat(sendBuf,  " ", 1);
                         HTTP_SetInfo(sendBuf, strlen(sendBuf));
                         DataFlag = 0;