|
@@ -87,6 +87,7 @@ bool Authenticated = false;
|
|
|
uint8_t seclevel = 0xFF;
|
|
|
|
|
|
static volatile uint32_t DataFlag2=0;
|
|
|
+static volatile uint32_t DataFlag=0;
|
|
|
static volatile uint32_t size =0;
|
|
|
static uint32_t TotalReceived=0;
|
|
|
static volatile uint32_t TotalData=0;
|
|
@@ -187,7 +188,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
/* Id of currently logged-in user */
|
|
|
uint8_t user_id;
|
|
|
|
|
|
- if(DataFlag2 == 0){
|
|
|
+ if( DataFlag == 0 && DataFlag2 == 0 ){
|
|
|
/* Level of currently logged-in user */
|
|
|
seclevel = 0xFF;
|
|
|
for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
|
|
@@ -201,7 +202,9 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
seclevel = 0xFF;
|
|
|
}
|
|
|
}
|
|
|
- if(DataFlag2 >= 1)
|
|
|
+ if (DataFlag >= 1)
|
|
|
+ Authenticated = true;
|
|
|
+ else if(DataFlag2 >= 1)
|
|
|
Authenticated = true;
|
|
|
|
|
|
if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
|
|
@@ -592,6 +595,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
HTTP_SetSettings(sendBuf, strlen(&sendBuf));
|
|
|
|
|
|
DataFlag2=0;
|
|
|
+ BrowserFlag = 0;
|
|
|
memset(sendBuf, 0, size);
|
|
|
|
|
|
strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
|
|
@@ -638,22 +642,116 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
tcp_sent(pcb, http_sent);
|
|
|
}*/
|
|
|
}
|
|
|
- else if (strncmp(data, "POST /info.cgi", 14) == 0)
|
|
|
+ else if (strncmp(data, "POST /info.cgi", 14) == 0 || (DataFlag >= 1))
|
|
|
{
|
|
|
- //strncat(&receiveBuf, " ", 1);
|
|
|
- strncat(receiveBuf, " ", 1);
|
|
|
- HTTP_SetInfo(receiveBuf, receivedBufLen);
|
|
|
- memset(sendBuf, 0, SEND_BUF_MAX_LEN);
|
|
|
+ if (seclevel == 0) {
|
|
|
+ DataOffset = 0;
|
|
|
|
|
|
- strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
|
|
|
- strcat(sendBuf, "\r\n\r\n");
|
|
|
- strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
|
|
|
+ /* POST Packet received */
|
|
|
+ if (DataFlag == 0)
|
|
|
+ {
|
|
|
+ BrowserFlag = 0;
|
|
|
+ TotalReceived = 0;
|
|
|
+ memset(sendBuf, 0, strlen(sendBuf));
|
|
|
+
|
|
|
+ /* parse packet for Content-length field */
|
|
|
+ size = Parse_Content_Length(data, p->tot_len);
|
|
|
+
|
|
|
+ /* parse packet for the octet-stream field */
|
|
|
+ for (i = 0; i < receivedBufLen; i++)
|
|
|
+ {
|
|
|
+ if (strncmp ((char*)(data+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 ERR_OK;
|
|
|
+ }
|
|
|
+ /* 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*)(data+i), "owner", 5)==0)
|
|
|
+ {
|
|
|
+ DataOffset = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ TotalReceived += receivedBufLen;
|
|
|
+ DataFlag++;
|
|
|
+ }
|
|
|
+ TotalData =0 ;
|
|
|
+ }
|
|
|
+ /* DataFlag >1 => the packet is data only */
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TotalReceived +=receivedBufLen;
|
|
|
+ }
|
|
|
+
|
|
|
+ ptr = (char*)(data + DataOffset);
|
|
|
+ receivedBufLen-= DataOffset;
|
|
|
+
|
|
|
+ /* update Total data received counter */
|
|
|
+ TotalData +=receivedBufLen;
|
|
|
+
|
|
|
+ /* check if last data packet */
|
|
|
+ if (TotalReceived == size)
|
|
|
+ {
|
|
|
+
|
|
|
+ strncat(&sendBuf, ptr, receivedBufLen);
|
|
|
+ strncat(&sendBuf, " ", 1);
|
|
|
+ HTTP_SetInfo(sendBuf, strlen(&sendBuf));
|
|
|
+ DataFlag=0;
|
|
|
+ BrowserFlag = 0;
|
|
|
+ memset(sendBuf, 0, size);
|
|
|
+
|
|
|
+ strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
|
|
|
+ strcat(sendBuf, "\r\n\r\n");
|
|
|
+ strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
|
|
|
+
|
|
|
+ sendBufLoadLen = strlen(sendBuf);
|
|
|
+ hs->file = sendBuf;
|
|
|
+ hs->left = sendBufLoadLen;
|
|
|
+ send_data(pcb, hs);
|
|
|
+
|
|
|
+ /* Tell TCP that we wish be to informed of data that has been
|
|
|
+ successfully sent by a call to the http_sent() function. */
|
|
|
+ tcp_sent(pcb, http_sent);
|
|
|
+ }
|
|
|
+ /* not last data packet */
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* write data in flash */
|
|
|
+ if(receivedBufLen)
|
|
|
+ {
|
|
|
+
|
|
|
+ strncat(&sendBuf, ptr, receivedBufLen);
|
|
|
+ //memcpy(receiveBufTemp, ptr, receivedBufLen);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- sendBufLoadLen = strlen(sendBuf);
|
|
|
- hs->file = sendBuf;
|
|
|
- hs->left = sendBufLoadLen;
|
|
|
- send_data(pcb, hs);
|
|
|
- tcp_sent(pcb, http_sent);
|
|
|
}
|
|
|
else if (strncmp(data, "GET /history.cgi", 16) == 0)
|
|
|
{
|
|
@@ -698,7 +796,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
}
|
|
|
}
|
|
|
/* Тест АКБ ИБП */
|
|
|
- else if (strncmp(data, "POST /bat_test.cgi", 18) == 0)
|
|
|
+ else if (strncmp(data, "GET /bat_test.cgi", 18) == 0)
|
|
|
{
|
|
|
HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
|
|
|
|
|
@@ -708,7 +806,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
tcp_sent(pcb, http_sent);
|
|
|
}
|
|
|
/* Выключение ИБП */
|
|
|
- else if (strncmp(data, "POST /ups_power.cgi", 19) == 0)
|
|
|
+ else if (strncmp(data, "GET /ups_power.cgi", 19) == 0)
|
|
|
{
|
|
|
HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
|
|
|
|
|
@@ -757,7 +855,7 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
tcp_sent(pcb, http_sent);
|
|
|
}
|
|
|
/* Смена пароля пользователя */
|
|
|
- else if (strncmp(data, "POST /changepwd.cgi", 19) == 0)
|
|
|
+ else if (strncmp(data, "GET /changepwd.cgi", 19) == 0)
|
|
|
{
|
|
|
HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
|
|
|
|