|
@@ -86,7 +86,13 @@ bool Authenticated = false;
|
|
|
/* Level of currently logged-in user */
|
|
|
uint8_t seclevel = 0xFF;
|
|
|
|
|
|
-static uint32_t ContentLengthOffset =0;
|
|
|
+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;
|
|
|
+
|
|
|
+static uint32_t ContentLengthOffset =0, BrowserFlag=0;
|
|
|
|
|
|
static const char Content_Length[17] =
|
|
|
/* Content Length */
|
|
@@ -130,14 +136,16 @@ static void close_conn(struct tcp_pcb *pcb, struct http_state *hs)
|
|
|
*/
|
|
|
static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
|
|
|
{
|
|
|
- char *data;
|
|
|
+ char *data, *ptr;
|
|
|
struct http_state *hs;
|
|
|
char CookieBuf[50];
|
|
|
char *CookiePtr = NULL;
|
|
|
char name[MAX_WEB_COOKIE_LEN];
|
|
|
char id[MAX_WEB_COOKIE_LEN];
|
|
|
uint8_t nameLen = 0, idLen = 0;
|
|
|
+ uint32_t DataOffset;
|
|
|
struct fs_file file = {0, 0};
|
|
|
+ uint32_t i;
|
|
|
|
|
|
hs = arg;
|
|
|
|
|
@@ -180,6 +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( DataFlag == 0 && DataFlag2 == 0 ){
|
|
|
/* Level of currently logged-in user */
|
|
|
seclevel = 0xFF;
|
|
|
for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
|
|
@@ -192,6 +201,11 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
Authenticated = false;
|
|
|
seclevel = 0xFF;
|
|
|
}
|
|
|
+ }
|
|
|
+ if (DataFlag >= 1)
|
|
|
+ Authenticated = true;
|
|
|
+ else if(DataFlag2 >= 1)
|
|
|
+ Authenticated = true;
|
|
|
|
|
|
if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
|
|
|
{
|
|
@@ -478,9 +492,8 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
}
|
|
|
else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +
|
|
|
{
|
|
|
- SET_PAGE = SET_PAGE_PAGE2;
|
|
|
-
|
|
|
if (seclevel == 0) {
|
|
|
+ SET_PAGE = SET_PAGE_PAGE2;
|
|
|
if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)
|
|
|
{
|
|
|
hs->file = sendBuf;
|
|
@@ -498,22 +511,118 @@ static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t er
|
|
|
}*/
|
|
|
}
|
|
|
}
|
|
|
- else if (strncmp(data, "POST /settings.cgi", 18) == 0)
|
|
|
+ else if (strncmp(data, "POST /settings.cgi", 18) == 0 || (DataFlag2 >= 1))
|
|
|
{
|
|
|
- //strncat(&receiveBuf, " ", 1);
|
|
|
- strncat(receiveBuf, " ", 1);
|
|
|
- HTTP_SetSettings(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=/settings.html\"/></head></html>\r\n\r\n");
|
|
|
+ /* POST Packet received */
|
|
|
+ if (DataFlag2 == 0)
|
|
|
+ {
|
|
|
+ BrowserFlag = 0;
|
|
|
+ TotalReceived = 0;
|
|
|
+ memset(sendBuf, 0, strlen(sendBuf));
|
|
|
|
|
|
- sendBufLoadLen = strlen(sendBuf);
|
|
|
- hs->file = sendBuf;
|
|
|
- hs->left = sendBufLoadLen;
|
|
|
- send_data(pcb, hs);
|
|
|
- tcp_sent(pcb, http_sent);
|
|
|
+ /* 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), "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 ERR_OK;
|
|
|
+ }
|
|
|
+ /* 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*)(data+i), "managerIP", 8)==0)
|
|
|
+ {
|
|
|
+ DataOffset = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ TotalReceived += receivedBufLen;
|
|
|
+ DataFlag2++;
|
|
|
+ }
|
|
|
+ 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)
|
|
|
+ {
|
|
|
+ //DBG printf("State: Received %d bytes\r\n", (int)TotalReceived);
|
|
|
+
|
|
|
+ strncat(&sendBuf, ptr, receivedBufLen);
|
|
|
+ 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");
|
|
|
+ strcat(sendBuf, "\r\n\r\n");
|
|
|
+ strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/settings.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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
else if (strncmp(data, "GET /info.cgi", 13) == 0) // +
|
|
|
{
|
|
@@ -533,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)
|
|
|
{
|
|
@@ -593,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);
|
|
|
|
|
@@ -603,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);
|
|
|
|
|
@@ -652,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);
|
|
|
|
|
@@ -1257,7 +1460,7 @@ void HTTP_SetSettings(char *buf, uint16_t lenBuf)
|
|
|
}
|
|
|
memset(value, 0, len);
|
|
|
|
|
|
- GetParamValue(&buf[555], "auth=", value, &valueLen);
|
|
|
+ GetParamValue(buf, "swauth=", value, &valueLen);
|
|
|
SetAuthEnableStateStr(value);
|
|
|
|
|
|
if (strncmp(value, "on", 2) == 0){
|
|
@@ -1451,34 +1654,28 @@ void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *le
|
|
|
value = strstr(bufIn, "func");
|
|
|
valueLen = strpbrk(value, ":");
|
|
|
strncpy(tempValue, (valueLen+1), (strlen(valueLen)-2));
|
|
|
- if (strcmp(tempValue, "\"cancel\"") == 0){
|
|
|
+ if (strcmp(tempValue, "\"reboot\"") == 0){
|
|
|
res = ups_metac_service_pdu(ups_cancel_shut_down);
|
|
|
if(res == 1){
|
|
|
log_event_data(LOG_SHUTDOWN_UPS, "Администратор(Останов)");
|
|
|
- strcat(bufOut, "Выключение ИБП отменено!");
|
|
|
+ strcat(bufOut, "Выключение нагрузки ИБП отменено!");
|
|
|
}
|
|
|
else
|
|
|
- strcat(bufOut, "Выключение ИБП не удалось отменить!");
|
|
|
+ strcat(bufOut, "Выключение нагрузки ИБП не удалось отменить!");
|
|
|
*lenBufOut = strlen(bufOut);
|
|
|
}
|
|
|
else if (strncmp(tempValue, "\"off\"", 5) == 0){
|
|
|
value = strstr(tempValue, "after");
|
|
|
valueLen = strpbrk(value, ":");
|
|
|
- valueLenEnd = strpbrk(value, ",");
|
|
|
- memset(tempValue2, 0, 50);
|
|
|
- strncpy(tempValue2, (valueLen+2), (valueLenEnd - valueLen - 2));
|
|
|
- TimeParam = atoi(tempValue2);
|
|
|
- value = strstr(tempValue, "to");
|
|
|
- valueLen = strpbrk(value, ":");
|
|
|
memset(tempValue2, 0, 50);
|
|
|
strncpy(tempValue2, (valueLen+2), (strlen(valueLen) - 2));
|
|
|
- TimeParam2 = atoi(tempValue2);
|
|
|
- res = ups_metac_service_pdu(ups_shutdown_restore);
|
|
|
+ TimeParamFloat = atof(tempValue2);
|
|
|
+ res = ups_metac_service_pdu(ups_shutdown);
|
|
|
if(res == 1){
|
|
|
- strcat(bufOut, "Перезагрузка ИБП!");
|
|
|
+ strcat(bufOut, "Отключение нагрузки ИБП!");
|
|
|
log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
|
|
|
}else
|
|
|
- strcat(bufOut, "Отмена перезагрузки ИБП!");
|
|
|
+ strcat(bufOut, "Отключение нагрузки ИБП не удалось!");
|
|
|
*lenBufOut = strlen(bufOut);
|
|
|
}
|
|
|
}
|