|
@@ -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;
|